1. 智能合约以action和访问共享内存数据库的形式互相通讯;俩种通讯模式:Inline.被保证在当前的transaction或unwind中执行;结果不管成功或失败,都不会通知任何操做;Inline操做与original transaction具备相同的范围和权限。Deferred. Defer将被BP节点安排在以后执行,有可能会通知通讯的结果或者超时。Deferred能够带着调用者的受权延伸到不一样的scopes。数据库
2. Action表示单个操做,而transaction是一个或多个action的集合。Action是合约和帐户之间进行通讯的方式。Action能够单独执行,或者组合组合起来做为一个总体执行;包含多个action的transaction, 这些action要么所有成功要么所有失败markdown
3. Action名字约束网络
Action的类型是 base32被编码为64-bit整数. 这意味着它的字符集长度是12,而且只能包含a-z,1-5,和'.'。 若是长度超过12个,他会自动截取前12个符合规则的字符做为action的名字;app
Transaction 确认 框架
收到一个transaction并不意味着这个transaction已经被确认,它仅仅说明这个transaction被一个BP节点接受而且没有错误,固然也意味着颇有可能这个transaction被其余bp接受了。函数
当一个transaction被包含在一个block当中的时候,它才是能够被确认执行的。区块链
4. ui
eosiocpp也能够建立3个合约文件,它们仅仅包含了合约的框架。this
$ eosiocpp -n ${contract}
上面的命令会在./${project}
目录下建立一个空的项目,它包含3个文件编码
${contract}.abi ${contract}.hpp ${contract}.cpp
${contract}.hpp
这是合约的头文件,能够包含一些变量,常量和函数的声明。
The ${contract}.cpp
这是合约的源码文件,包含合约的具体实现。
5.void init() { eosio::print( "Init World!\n" ); // Replace with actual code } init
仅当合约第一次被部署的时候执行。 在这个函数里能够初始化变量,
void apply( uint64_t code, uint64_t action ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" ); }
apply
是一个中转函数, 他监听全部传入的action,而且根据action调用合约相应的函数。apply
函数须要两个参数, code
和 action
。
code filter
这个参数是为了对action作出回应,好比下面的apply
函数,你能够构造一个通用响应去忽略code
。
if (code == N(${contract_name}) { // your handler to respond to particular action }
action filter
为了响应每个action,好比构造好比下面的apply
函数。一般和code filter一块儿使用
if (action == N(${action_name}) { //your handler to respond to a particular action }
${contract}.hpp
这是合约的头文件,能够包含一些变量,常量和函数的声明。
The ${contract}.cpp
这是合约的源码文件,包含合约的具体实现。
若是你用eosiocpp
生成了一个 .cpp
, 那它的内容大概相似以下:
#include <${contract}.hpp> extern "C" { /** * This method is called once when the contract is published or updated. */ void init() { eosio::print( "Init World!\n" ); // Replace with actual code } /// The apply method implements the dispatch of actions to this contract void apply( uint64_t code, uint64_t action ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" ); } } // extern "C"
在这个例子里,咱们能够看到两个函数,init
和apply
。它们会打印log而且不作任何检查。任何人均可以在任什么时候刻执行BP容许的全部action。在不须要任何签名的状况下,合约将被计入带宽消耗。(Absent any required signatures, the contract will be billed for the bandwidth consumed.)
init
init
仅当合约第一次被部署的时候执行。 在这个函数里能够初始化变量, 好比,在currency合约中整体的token的供应量。
apply
apply
是一个中转函数, 他监听全部传入的action,而且根据action调用合约相应的函数。apply
函数须要两个参数, code
和 action
。
code filter
这个参数是为了对action作出回应,好比下面的apply
函数,你能够构造一个通用响应去忽略code
。 (In order to respond to a particular action, structure the apply
function as follows. You may also construct a response to general actions by omitting the code filter.)
if (code == N(${contract_name}) { // your handler to respond to particular action }
固然你也能够为每一个action构造各自的一个响应。
action filter
为了响应每个action,好比构造好比下面的apply
函数。一般和code filter一块儿使用
if (action == N(${action_name}) { //your handler to respond to a particular action }
任何合约程序想要部署到EOSIO的区块链网络中都必须编译成WASM格式。这是EOS的支持惟一个的格式。
一旦你的CPP文件写好了,有就能够用eosiocpp
把它编译成WASM (.wast)文件了
$ eosiocpp -o ${contract}.wast ${contract}.cpp
ABI( Application Binary Interface)文件是一个JSON格式的描述文件,说明了如何在他们的JSON和二进制之间转化用户的action。ABI文件也同时说明了如何转换数据库的状态。一旦你用了ABI描述了你的合约,开发人员就和用户就能够和你的合约经过JSON进行交互。
ABI能够经过.hpp
文件用eosiocpp
生成。
$ eosiocpp -g ${contract}.abi ${contract}.hpp
Print C++ API 支持
5.