EOSIO源码分析 - CDT合约编译过程

智能合约代码举例

在这里插入图片描述
纵观整体代码有如下特点

  1. 符合C++代码语法,包含相应的头文件,命名空间
  2. 公有继承合约基类 contract
  3. 在语法中出现了新的标签代码如:[eosio::contract], [eosio::action]等
  4. 代码尾部出现新的宏EOSIO_DISPATCH

合约编译工具

  • 工具名称:eosio-cpp
  • 命令行:eosio-cpp -o hello.wasm hello.cpp –abigen
  • 编译结果:生成hello.wasm和hello.abi文件

合约编译过程

命令行的解析过程,不做过多解释,在编译过程中使用ClangTool完成代码的分析与合约信息提取,Clang-7完成合约文件的编译过程,将cpp文件编译成wasm文件

ClangTool提取信息过程
  1. 函数入口
    在这里插入图片描述
    其中run函数最重要,前面准备好相关参数后,调用run进行代码分析
    在这里记住三个重要的初始化操作,后面做分析使用
    在这里插入图片描述
    这三句话,相当于注册了代码分析结果的适配器,进入代码信息筛选使用
  2. 通过run的调用,最终调用代码分析类Parser
    在这里插入图片描述
    在parser类中,完成了代码的分析,分析语法格式是否正确,标签是否合法,从而确定在合约类中,我们怎么知道这个函数是个action, 就是通过[eosio::action]指定的,代码具体路径如下
    在这里插入图片描述
    分析函数,类名过程中同步解析标签
    在这里插入图片描述
    分析对标签名称,将标签名称转换成枚举类型kind
    代码文件AttrParsedAttrKinds.inc
    如果以后我们要增加或者修改标签,一定要改动这里
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    上面的代码清晰的展示了标签的分析处理过程,最终依据标签创建了EOSIO相关的标标签类
    EosioActionAttr:标记合约执行的的Action
    EosioContractAttr:标记这个类是合约文件
    同时我们也可以看到EOSIO对clang编译器进行了定制,让它能编译合约
ABI结构的生成

在完成代码分析之后,生成相应的结构信息,接下来使用分析的结果,翻译出对应的abi文件。

  1. ABI重要结构
    在这里插入图片描述
    这个文件定义了abi相关的field,struct,action等重要结构
    在这里插入图片描述
    Abi结构操作相关,如删除,添加action等
  2. ABI结构信息提取过程
    在abi提取过程中,会有一系列相关的 MatchFinder 来做代码特征匹配,在工具刚开始的初始化中,注册了三个匹配器,在在信息翻译中,会进行信息回调
    在这里插入图片描述
    回调处理代码如下
    在这里插入图片描述
    在这里插入图片描述
    最后把结构abi,转换成json格式,保存成abi文件
合约代码编译过程

调用编译的代码如下
在这里插入图片描述
使用编译出来的clang-7子程序,编译cpp合约代码,生成对应的wasm文件,这个文件供eosio工程进行合约调用

总结

  • EOSIO合约是使用C++编写的,所以编写时语法要符合C++的规范
  • EOSIO合约编写时使用的库是经过裁剪的,特别是boost库,系统类,文件类,线程类是无法使用的
  • EOSIO合约的编译实际上是使用clang来进行的,最终目的是把C++代码编译成wasm格式的字节码程序,供WASM虚拟机执行使用