eos智能合约基础知识

1. 智能合约以action和访问共享内存数据库的形式互相通信;俩种通信模式:Inline.被保证在当前的transaction或unwind中执行;结果无论成功或失败,都不会通知任何操作;Inline操作与original transaction具有相同的范围和权限。Deferred. Defer将被BP节点安排在之后执行,有可能会通知通信的结果或者超时。Deferred可以带着调用者的授权延伸到不同的scopes。

2. Action表示单个操作,而transaction是一个或多个action的集合。Action是合约和账户之间进行通信的方式。Action可以单独执行,或者组合组合起来作为一个整体执行;包含多个action的transaction, 这些action要么全部成功要么全部失败

3. Action名字约束

Action的类型是 base32被编码为64-bit整数. 这意味着它的字符集长度是12,并且只能包含a-z,1-5,和'.'。 如果长度超过12个,他会自动截取前12个符合规则的字符作为action的名字;

Transaction 确认 

收到一个transaction并不意味着这个transaction已经被确认,它仅仅说明这个transaction被一个BP节点接受并且没有错误,当然也意味着很有可能这个transaction被其他bp接受了。

当一个transaction被包含在一个block当中的时候,它才是可以被确认执行的。

4. 

eosiocpp也可以创建3个合约文件,它们仅仅包含了合约的框架。

$ eosiocpp -n ${contract}

上面的命令会在./${project}目录下创建一个空的项目,它包含3个文件

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

hpp

${contract}.hpp 这是合约的头文件,可以包含一些变量,常量和函数的声明。

cpp

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
}

hpp

${contract}.hpp 这是合约的头文件,可以包含一些变量,常量和函数的声明。

cpp

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"

在这个例子里,我们可以看到两个函数,initapply。它们会打印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
}

wast

任何合约程序想要部署到EOSIO的区块链网络中都必须编译成WASM格式。这是EOS的支持唯一个的格式。

一旦你的CPP文件写好了,有就可以用eosiocpp把它编译成WASM (.wast)文件了

$ eosiocpp -o ${contract}.wast ${contract}.cpp

abi

ABI( Application Binary Interface)文件是一个JSON格式的描述文件,说明了如何在他们的JSON和二进制之间转化用户的action。ABI文件也同时说明了如何转换数据库的状态。一旦你用了ABI描述了你的合约,开发人员就和用户就可以和你的合约通过JSON进行交互。

ABI可以通过.hpp文件用eosiocpp生成。

$ eosiocpp -g ${contract}.abi ${contract}.hpp

Print C++ API 支持

  • a null terminated char array (string)
  • integer (128-bit unsigned, 64-bit unsigned, 32-bit unsigned, signed, unsigned)
  • base32 string encoded as 64-bit unsigned integer
  • struct that has print() method

5.

 

posted @ 2018-08-30 10:15  清风拂山岗li  阅读(1227)  评论(0编辑  收藏  举报