源代码解读 [EOS 源码分析] 32 - eosio.system 合约 native.hpp 头文件分析

Admin · 2019年12月21日 · 25 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

接上篇,继续分析native.hpp头文件。

block_header

native.hpp接下来定义了区块头(block_header)结构体:

img

是之前在eos主项目中介绍的block_header的简略版本,各字段的含义如下:

  • timestamp:时间戳;

  • producer:区块生产者;

  • confirmed:当前区块生产者需要确认的最新区块数量;

  • previous:区块链上前一个区块的ID;

  • transaction_mroot:交易的默克尔树根哈希;

  • action_mroot:Action的默克尔树根哈希;

  • schedule_version:区块生产者计划的版本;

  • new_producers:下一轮区块生产者。

abi_hash

abi_hash是一张Multi-index表,记录部署在EOS区块链上的合约的ABI的哈希值,定义如下:

img

两个字段ownerhash,分别表示合约被部署的账号名合约ABI的哈希值

通过属性[[eosio::table("abihash")]]指定了表名为abihash,这张表只有一个scope,使用cleos get table查询示例如下:

img

要注意和code hash的区别,使用cleos set contract命令部署EOS智能合约时,会调用setcodesetabi这两个Action分别设置WASM代码的哈希值ABI的哈希值

使用cleos get code命令可以查询合约的code hash:

img

可以看到,对于部署在本地的coincoininfo合约,其code hash值为:

34d92b7c99e7711b1461f3001655e5e4676ef6055a90fc108531f3759de76e40

abi hash值为:

5183dd79b980c458cda67f5a66794b373acb52e8c28b65a1683f1995d883104d

native合约类

native类继承自eosio::contract,是一个EOS智能合约类,同时是system_contract类的父类。

img

native.hpp中声明了一些Action,其代码是从eosio.bios.hpp部分移植过来的,eosio.system.cpp中实现了部分Action。

本质上讲,EOS智能合约中定义的Action实际上应该称为Action Handler,即Action接收器或Action处理器;

用户发送的请求才是Action,用户把Action发送给EOS智能合约,合约把Action分发给对应的Action Handler,后者内部定义了业务逻辑代码来处理用户请求,类似于传统的C/S架构。

native合约类声明的Action包括:

using newaccount_action = eosio::action_wrapper<"newaccount"_n, &native::newaccount>;
using updateauth_action = eosio::action_wrapper<"updateauth"_n, &native::updateauth>;
using deleteauth_action = eosio::action_wrapper<"deleteauth"_n, &native::deleteauth>;
using linkauth_action = eosio::action_wrapper<"linkauth"_n, &native::linkauth>;
using unlinkauth_action = eosio::action_wrapper<"unlinkauth"_n, &native::unlinkauth>;
using canceldelay_action = eosio::action_wrapper<"canceldelay"_n, &native::canceldelay>;
using setcode_action = eosio::action_wrapper<"setcode"_n, &native::setcode>;
using setabi_action = eosio::action_wrapper<"setabi"_n, &native::setabi>;

区别于合约层(contract level),这些Action都是核心层(core level)的,用户能直接使用的Action有如下几个:

1、newaccount(创建新账户)

[[eosio::action]]
void newaccount( const name&       creator,
                 const name&       name,
                 ignore<authority> owner,
                 ignore<authority> active);

对应cleos命令:

cleos system newaccount [OPTIONS] creator name OwnerKey [ActiveKey]

2、updateauth(更新权限)

[[eosio::action]]
void updateauth( ignore<name>      account,
                 ignore<name>      permission,
                 ignore<name>      parent,
                 ignore<authority> auth ) {}

对应cleos命令:

cleos set account permission [OPTIONS] account permission [authority] [parent]

3、canceldelay(取消一个延期交易)

[[eosio::action]]
void canceldelay( ignore<permission_level> canceling_auth, ignore<checksum256> trx_id ) {}

对应cleos命令:

cleos system canceldelay [OPTIONS] canceling_account canceling_permission trx_id

下一篇文章介绍native的子类 system_contract。

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 17:50
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册