EOS 学习笔记 智能合约(一)
Contents
contract
其实说简单了就是在给定一系列的输入,会产生可预期的输出行为的一种协议。比如游戏里的移动,商业协议里面的财产转移等等。
EOS smart contract 简介
- EOS的
contract
在区块链上注册,在EOSIO 的nodes
是执行。 - EOS smart contract 定义了一系列接口:actions, parameters, 数据,以及实现该接口的代码。
- contract code 会被编译成标准化字节,所以nodes可以执行。
- blockchain会储存contract产生的transactions,例如 游戏移动,资产转移。
- 每一个contract必须要有一个Ricardian Contract 来定义binding terms and context(使用规范)
编写EOS Smart Contract 需求
- C/C++ 经验:EOSIO 大量使用WASM(web-assembly),当前clang/llvm算是最方便讲程序编译成WASM的工具。
- Linux/Mac OS 开发经验
通信模型
- EOS 的智能合约包含了一系列的
actions
定义跟类型定义- action 定义跟实现了contract的支持的行为
- 类型 定义了该合约需要的内容跟数据结构
- action 主要在message-based 通信结构里运作
- client 调用action,将消息发送到nodeos,nodeos将消息分解成实现了该合约的WASM代码,再继续执行action
- 合约之间可以互相调用,一个合约可以调用另一个合约的action
- 智能合约的两种通信模型
- inline 在当前transaction处理的操作成为inline
- deferred 激活一个新的transaction
- 合约之间的通信应该是异步的
- 资源限制算法会负责管理异步通信可能产生的垃圾
Inline Communication
Inline action 采用的形式是,要求其它actions是作为其本身一部分。可以当成nested transactions。 如果任何一个action 失败,那么会放弃执行剩余的actions,调用trasaction里面的inline action 不会对外界产生任何通知,无论成败与否。
Deferred Communication
Defferred communication 相当于将action 传给一个peer transaction,deferred action 会被安排在之后的transaction执行,根据producer‘s 排序。 而且deferred action 并不被保证一定会被执行。
- 起源transaction, 只能用来判断request 有没有被成功提交,不能判断有没有被成功执行。
- 一个transaction 是具有cancel一个deferred transaction 能力。
Transaction 跟action 的区别
- action 只是代表单个操作,transaction 是一系列action的集合(多个操作).
- contract,account 的交流通信 是基于action的。
- action 可以被单独发送,也可以 复和模式 被一起执行。
Transaction with one action
{
"expiration": "2018-04-01T15:20:44",
"region": 0,
"ref_block_num": 42580,
"ref_block_prefix": 3987474256,
"net_usage_words": 21,
"kcpu_usage": 1000,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "eosio.token",
"name": "issue",
"authorization": [{
"actor": "eosio",
"permission": "active"
}
],
"data": "00000000007015d640420f000000000004454f5300000000046d656d6f"
}
],
"signatures": [
""
],
"context_free_data": []
}
Transaction with multiple actions
{
"expiration": "...",
"region": 0,
"ref_block_num": ...,
"ref_block_prefix": ...,
"net_usage_words": ..,
"kcpu_usage": ..,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "...",
"name": "...",
"authorization": [{
"actor": "...",
"permission": "..."
}
],
"data": "..."
}, {
"account": "...",
"name": "...",
"authorization": [{
"actor": "...",
"permission": "..."
}
],
"data": "..."
}
],
"signatures": [
""
],
"context_free_data": []
}
Context-Free Actions (独立actions)
- Action Name 限制:action的类型通常是base32 加密的 int64。2
- Transaction 确认:交易一旦确认,会有receipt产生(倒是跟以太坊一样),收到transaction hash 不代表transaction 已经被确认,只代表节点成功收到交易。 确认一个交易被执行,需要在交易历史记录里查询该交易的区块包含该交易。 所有的action必须在transaction里面被执行,一旦transaction fails,那么里面的所有actions都应该被roll back。
- 在处理一个action 之前,eosio会给该action分配一个clean的工作内存。这里面会储存该action所需要的变量。每个action的working memory 都只能该action 访问。actions之间唯一pass 状态的方法是存储到db再从db里获取。
- action的副作用:
- 改变EOSIO DB的state状态
- 通知当前transaction的接收者
- 给receiver发送inline action
- 产生心得deferred transactions
- 取消现有的deferred transactions
Transaction 不足之处
每一个transaction必须在30ms之内倍执行。如果一个transaction有多个action,并且执行这些action耗时超过30ms,那么整个transaction就会fail。 在没有并发需求的情况下,可以将action分别写到几个不同的transaction里。
Author lekai
LastMod 2018-07-31