接下去大概描述一下智能合约和虚拟机之间的关系以及编译执行过程。
智能合约 概要:
智能合约不仅可以实现转账,也可以描述游戏规则,合约作为注册在EOS区块链的应用程序并运行在EOS的节点上。智能合约定义了相关的接口,这些接口中包含action, 数据结构和相关的参数。智能合约实现这些接口,被编译成wasm 后缀的二进制文件,并执行。
对于区块链而言,最终存储的是智能合约的交易。
智能合约由 action 和类型定义组成:
Action:定义和实现了智能合约的行为和功能。
类型定义:定义了合约需要的内容和数据结构。
客户端发送消息触发action的执行,而智能合约的最终存储形式是transaction,一个transaction 可以包含多个action,至少包含一个action.
一个智能合约的定义例子:
#define EOSIO_API( TYPE, MEMBERS ) \
BOOST_PP_SEQ_FOR_EACH( EOSIO_API_CALL, TYPE, MEMBERS )
展开所包含的宏:
#define EOSIO_API_CALL( r, OP, elem ) \
case ::eosio::string_to_name( BOOST_PP_STRINGIZE(elem) ): \
eosio::execute_action( &thiscontract, &OP::elem ); \
break;
从而完成从合约调用到底层路由调用的实现。
合约的编译过程和虚拟机:
智能的合约编译过程如下:
- 利用clang 以 wasm32 为目标,生成中间文件bc
- 利用LLVM-Link 链接上一个步骤生成bc 文件 和标准库 bc 文件生成link.bc 文件
- 利用LLVM的llc 生成 s 汇编文件 assembly.s
- 应用eosio-s2wasm 工具将 s 文件转化为wast 文件
- 应用eosio-wast2wasm 工具将 wast 文件转化为最终的wast 文件
为何不采用clang 而采用wasm, 笔者认为可能是出于考虑到wasm代表今后的趋势,未来对wasm 支持的解释容器较多,方便多种虚拟机的接入。
WASM虚拟机:
WASM虚拟机主要位于libraries 下的wasm-jit 下面。
- libraries/chain: 主要是定义虚拟机相关接口
- libraries/wasm-jit: 主要是智能合约的实现
另外在contracts 目录下,有ABI的辅助代码。
wasm-jit 虚拟机的source code在:~/eos/libraries/wasm-jit/Source下,
主要folder:Emscripten, IR,Runtime, Programs,WASM, WAST
- IR: IR是高级语言到机器语言的第一步,后面WAST的解析,WASM的序列化处理,- ---Runtime处理的依据。
- Emscripten:用于将高级语言转换为LLVM的字节码的工具
- Runtime执行引擎: 包括了执行字节码(机器码),外部调用,将字节码翻译为 IR,生成机器码等等功能模块
- WASM: WASM 的 LICENSE
- WAST: Parse解析的功能模块
其他: - Logging: 日志管理
- Platforms: 不同平台对应