EOS智能合约开发(一)

一、 智能合约功能

EOSIO智能合约是在区块链上注册并在EOSIO节点上执行的软件,实现了“合约”的功能,合约行动请求帐目存储在区块链中。智能合约定义了接口(操作,参数,数据结构)和实现接口的代码。代码被编译成规范的字节码格式,使节点可以检索和执行。区块链存储合约的交易(例如,合法转移,游戏移动)。每份智能合约都必须附有一份李嘉图合约,其中定义了具有法律约束力的条款和条件。

二、 通讯模式

2.1 运行机制

EOSIO智能合约由一组操作和类型定义组成。操作定义指定并实现合约的行为,类型定义指定所需的内容和结构。 操作主要在基于消息的通信体系结构中运行:客户端通过向nodeos发送(推送)消息来调用操作。可以使用cleos命令完成。它也可以使用EOSIO发送方法(例如,eosio :: action :: send)来完成。 nodeos将操作请求分派给实现合约的WASM代码,该代码运行完之后继续处理下一个操作。
EOSIO智能合约可以彼此通信,例如,让另一个合约执行与当前交易的完成相关的某些操作,或者触发当前交易范围之外的未来交易。
EOSIO支持两种基本通信模型,内联和延迟。在当前交易中执行的操作是内联操作的示例,而触发的将来交易是延迟操作的示例。
合约之间的沟通应视为异步发生,异步通信模型可能导致垃圾邮件,资源限制算法将解析垃圾邮件。

2.2 内联通信

内联通信采用请求其他操作的形式,需要作为调用操作的一部分执行。其使用和原始交易的相同作用域和权限进行操作,并保证使用当前交易执行,即调用交易中的嵌套交易。 如果交易的任何部分失败,则内联操作将与交易的其余部分一起展开。无论成功与否,调用内联操作都不会在交易范围之外生成任何通知。

2.3 延迟通信

延迟通信在采用发送到对等交易的动作通知的形式。 根据生产者的判断,延迟的操作最多可以安排在稍后的时间运行,无法保证将执行延期操作。从始发交易的角度来看,即创建延迟交易的交易,它只能确定创建请求是否成功提交或者是否失败(如果失败,它将立即失败)。 延期交易具有发送合约的权限,交易可以取消延期交易。

2.4 交易和动作

动作表示单个操作,而交易是一个或多个动作的集合。 合约和帐户以行动的形式进行沟通。 如果要将操作作为一个整体执行,则可以单独发送操作,也可以以组合形式发送操作。
交易中可以有一个动作也可以有多个 ,当有多个操作时,其中一个操作失败,则这个交易失败。

2.5 交易确认

交易完成后,将生成交易收据,此收据采用散列形式。 接收交易散列并不意味着交易已被确认,它只意味着节点接受它而没有错误,这也意味着其他生产者很可能会接受它。通过确认,在交易历史记录中可以看到包含它的块编号的交易。

2.6 动作处理程序和动作的apply上下文

智能合约提供动作处理程序来执行所请求操作的工作。每次动作运行时,通过在合约实现中运行apply方法“应用”操作,EOSIO会创建一个新的动作“应用”上下文,动作在该上下文中运行。 下图说明了apply上下文动作的关键元素:

EOSIO网络中的每个节点都会获得每个合约中的每个动作的副本并运行。一些节点正在执行合约的实际工作,而其他节点正在处理以证明交易块的有效性。因此,重要的是合约能够确定“他们是谁”,或者基本上,他们在哪个环境下运行。在动作上下文中提供上下文标识信息,如上图中 的receiver, code, action。 receiver是当前正在处理该操作的帐户。code 是授权合约的帐户。 action是当前正在运行的操作的ID。
动作在交易中运作;如果交易失败,则必须回滚所有操作的结果。动作上下文的关键部分是当前交易数据,这包含交易头、交易中所有原始操作的有序向量、交易中上下文自由操作的向量,由code定义的可修复的上下文无关数据集(作为blob的向量提供)实现合约,以及blob向量的完整索引。
在处理动作之前,EOSIO会为动作设置一个干净的工作内存。操作的工作内存仅对该操作可用,即使对于同一交易中的操作也是如此。在执行另一个操作时可能已设置的变量在另一个操作的上下文中不可用。在动作之间传递状态的唯一方法是将其持久化并从EOSIO数据库中检索它。动作可能有许多影响, 其中包括:更改状态在EOSIO持久存储中保持不变;通知当前交易的收件人;将内联操作请求发送给新接收方;生成新的(延期)交易;取消现有的延期交易。

2.7 交易限制

每个交易必须在30ms或更短时间内执行。 如果交易包含多个操作,并且这些操作的总和大于30毫秒,则整个交易将失败。 在没有对其操作进行并发性要求的情况下,可以通过在单独的交易中包含CPU消费动作来规避这种情况。

三、文件结构

3.1 创建框架

$ eosiocpp -n ${
   contract}

以上将在./$ {conttract}目录中创建一个带有两个文件:

${contract}.hpp ${contract}.cpp

3.2 apply处理程序

每个智能合约都必须提供应用操作处理程序。 apply动作处理程序是一个侦听所有传入操作并执行所需行为的函数。 为了响应特定操作,code识别和响应特定操作请求。 apply使用receiver、code、action输入参数作为过滤器,来映射到实现特定操作的所需功能。 apply函数可以使用以下方法过滤code参数:

if (code == N(${
   contract_name}) {
   //对特定动作的处理
}

在给定code之后,可以使用如下方法过滤action参数:

if (action == N(${action_name}) {
    //your handler to respond to a particular action
}

3.3 EOSIO_ABI 宏

EOSIO_ABI宏封装了apply函数的基本动作:

#define EOSIO_ABI( TYPE, MEMBERS ) \
extern "C" {
    \
   void apply( uint64_t receiver, uint64_t code, uint64_t action ) {
    \
      auto self = receiver; \
      if( code == self ) {
    \
         TYPE thiscontract( self ); \
         switch( action ) {
    \
            EOSIO_API( TYPE, MEMBERS ) \
         } \
         /* does not allow destructor of thiscontract to run: eosio_exit(0); */ \
      } 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、玩过EOS的都知道,EOS本身更新迭代非常之快,所以有些知识点可能与最新版有所出入,希望小伙伴理解!此文档适用于EOS-v1.0.5以上版本和v1.1.x版本,目前的v1.2.x可能会有极少部分出入,比如eosiocpp工具看更新说明再不用安装的状态下就能使用,目前还未测试。有兴趣的小伙伴可以留言交流。 2、当前文档目录结构介绍: #思考研究问题 1、如何保证EOS中发布的智能合约不被随意篡改? #玩转EOS智能合约代码 #玩转客户端cleos 1、先玩转与智能合约相关的操作 #使用eosiocpp工具编译智能合约生成abi文件和wast文件 #编译合约(无法通过) #安装build/programs下工具 #重新编译合约 #部署合约到账户 #购买RAM #测试调用部署的合约 #更新\升级已经部署过的智能合约(相对空的合约) #更新添加新的函数接口(action)合约 #有关require_auth的合约测试 2、玩转智能合约与数据库相关操作 #参考资料 #持久化API (Multi-Index) 1、一般来讲,对数据库的操作无外乎增删改查 2、表结构示例详解 3、Multi_index定义,建立数据表 4、实例化multi_index 5、操作数据,增删改查 #玩转table表 1、Table表producers 2、Table表global 3、Table表voters 4、Table表rammarket (获取RAM实时价格) 5、Table表refunds (查看账户退款信息) 6、Table表namebids (罗列参与竞拍的账户信息) 3、启动nodeos节点出现脏数据 4、查看账户抵押资产,抵押token,赎回token #查看账户余额(可用余额) #查看SYS货币信息,eosio.token是经营货币的合约 #查看公钥对应账户 #查看子账户(控制账户) #查看账户信息 #查看账户抵押信息 #钱不够那就转账,随便耍 #get transaction无结果了解一下 #卖出RAM(卖给系统账户eosio.ram),字节bytes #抵押token获取CPU和net资源 #赎回抵押token,默认三天后到账,执行后可查看账户状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值