源代码解读 [EOS 源码分析] 25 - wasm_interface & EOS 持久化数据目录结构

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

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

img

上一篇文章介绍了eosiolib库和chain库、fc库的关系,其中eosiolib库是eosio.cdt项目的开发库,用于EOS智能合约的编写,之前写的【EOS智能合约探秘】对这个库有详细介绍。

wasm_interface

eosiolib库中包含的都是C++头文件(.h或.hpp格式),很多头文件中定义的函数最终都会调用到internal_use_do_not_use命名空间下的添加了eosio_wasm_import属性的函数,比如:

img

这些函数是在eos主项目中实现的,具体是wasm_interface.cpp(位于eos/libraries/chain/wasm_interface.cpp)。

wasm_interface是C++代码和WebAssembly代码的连接接口,在wasm_interface.hpp头文件中主要声明了以下几个重要的类:

img

  • apply_context:wasm_interface的应用上下文;

  • wasm_runtime_interface:WASM运行时接口;

  • controller:控制器。

EOS持久化数据目录结构

EOS系统架构可以使用软件架构中的MVC(Model-View-Controller,模型-视图-控制器)模式进行类比。

EOS系统没有视图层,模型层是存放于.local/share/eosio/nodeos/data目录下的持久化数据,EOS区块链的持久化数据按存储内容分为两类:

  • 区块数据:保存区块数据,数据存放在data目录下的blocks目录下;

  • 状态数据库(StateDB):保存Multi-index数据表,数据存放在data目录下的state目录下。

EOS持久化数据目录(data目录)的文件结构如下:

img

存放区块数据的blocks目录下有如下文件:

├── blocks
│   ├── blocks.index
│   ├── blocks.log
│   └── reversible
│       └── shared_memory.bin
  • blocks.log:区块存储文件,保存EOS区块链生成的所有不可逆区块;

  • blocks.index:区块索引文件,可以帮助快速查找blocks.log中的区块;

  • reversible:可逆区块目录,保存刚打包的待确权区块,目前EOS区块变为不可逆状态大约需要3分钟。

reversible目录下的shared_memory.bin文件是内存映射文件,以chainbase数据库的方式存储可逆区块数据;

类似的还有state目录下的shared_memory.bin文件,它是以chainbase数据库的方式存储Multi-index数据表的数据。

因此EOS持久化数据按照存储方式分类可以分为:

  • blocks.log日志文件:存储不可逆区块;

  • shared_memory内存映射文件:存储可逆区块和Multi-index数据表数据,基于chainbase数据库。

在data目录下还可以发现blocks-2019-03-05T05:54:27.054这种带时间戳的blocks目录,且它们目录下的文件结构也和blocks目录相同,这些目录是数据恢复时生成的,比如启动nodeos时使用参数--hard-replay-blockchain修复数据。

EOS系统的控制器层一方面接收用户(智能合约)的操作行为,一方面修改模型层的数据状态,起到承上启下的作用;

控制器层代码实现封装在eos/libraries/chain目录下的controller类中,包括头文件eos/libraries/chain/include/eosio/chain/controller.hpp和源文件eos/libraries/chain/controller.cpp,具体实现细节放到下一篇文章中介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

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