EOSIO源码分析 - CDT合约编译过程
智能合约代码举例
纵观整体代码有如下特点
- 符合C++代码语法,包含相应的头文件,命名空间
- 公有继承合约基类 contract
- 在语法中出现了新的标签代码如:[eosio::contract], [eosio::action]等
- 代码尾部出现新的宏EOSIO_DISPATCH
合约编译工具
- 工具名称:eosio-cpp
- 命令行:eosio-cpp -o hello.wasm hello.cpp –abigen
- 编译结果:生成hello.wasm和hello.abi文件
合约编译过程
命令行的解析过程,不做过多解释,在编译过程中使用ClangTool完成代码的分析与合约信息提取,Clang-7完成合约文件的编译过程,将cpp文件编译成wasm文件
ClangTool提取信息过程
- 函数入口
其中run函数最重要,前面准备好相关参数后,调用run进行代码分析
在这里记住三个重要的初始化操作,后面做分析使用
这三句话,相当于注册了代码分析结果的适配器,进入代码信息筛选使用 - 通过run的调用,最终调用代码分析类Parser
在parser类中,完成了代码的分析,分析语法格式是否正确,标签是否合法,从而确定在合约类中,我们怎么知道这个函数是个action, 就是通过[eosio::action]指定的,代码具体路径如下
分析函数,类名过程中同步解析标签
分析对标签名称,将标签名称转换成枚举类型kind
代码文件AttrParsedAttrKinds.inc
如果以后我们要增加或者修改标签,一定要改动这里
上面的代码清晰的展示了标签的分析处理过程,最终依据标签创建了EOSIO相关的标标签类
EosioActionAttr:标记合约执行的的Action
EosioContractAttr:标记这个类是合约文件
同时我们也可以看到EOSIO对clang编译器进行了定制,让它能编译合约
ABI结构的生成
在完成代码分析之后,生成相应的结构信息,接下来使用分析的结果,翻译出对应的abi文件。
- ABI重要结构
这个文件定义了abi相关的field,struct,action等重要结构
Abi结构操作相关,如删除,添加action等 - ABI结构信息提取过程
在abi提取过程中,会有一系列相关的 MatchFinder 来做代码特征匹配,在工具刚开始的初始化中,注册了三个匹配器,在在信息翻译中,会进行信息回调
回调处理代码如下
最后把结构abi,转换成json格式,保存成abi文件
合约代码编译过程
调用编译的代码如下
使用编译出来的clang-7子程序,编译cpp合约代码,生成对应的wasm文件,这个文件供eosio工程进行合约调用
总结
- EOSIO合约是使用C++编写的,所以编写时语法要符合C++的规范
- EOSIO合约编写时使用的库是经过裁剪的,特别是boost库,系统类,文件类,线程类是无法使用的
- EOSIO合约的编译实际上是使用clang来进行的,最终目的是把C++代码编译成wasm格式的字节码程序,供WASM虚拟机执行使用