Skip to content

Commit

Permalink
update doc of architecture
Browse files Browse the repository at this point in the history
  • Loading branch information
vita-dounai committed Sep 13, 2020
1 parent 585cbcc commit 29be4c0
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions docs/in_depth/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,23 +67,23 @@ Liquid及周边开发工具的整体架构如下图所示:

其中各模块功能如下:

- ***cargo-liquid***:方便开发者进行合约开发及构建的命令行工具。开发者在本机安装后`cargo-liquid`能够以`cargo`自定义扩展命令的形式为开发提供服务
- ***cargo-liquid***:方便开发者进行合约开发及构建的命令行工具。开发者在本机安装后cargo-liquid能够以cargo自定义扩展命令的形式为开发提供服务

- 当开发者执行`cargo liquid new ...`命令时,`cargo-liquid``new`模块会以[HelloWorld合约](../quick_start/introduction.md)合约为模板创建合约项目,并自动配置编译选项及外部依赖、实现ABI生成器,开发者可以基于该模板进一步开发属于自己的智能合约。
- 当开发者执行`cargo liquid new ...`命令时,cargo-liquid的new模块会以[HelloWorld合约](../quick_start/introduction.md)合约为模板创建合约项目,并自动配置编译选项及外部依赖、实现ABI生成器,开发者可以基于该模板进一步开发属于自己的智能合约。

- 当开发者执行`cargo liquid build ...`命令时,`cargo-liquid``build`模块会收集编译元信息(如目标类型等),并调用`rustc`进行跨平台编译,将Liquid合约编译为Wasm格式字节码,随后使用`wasm-opt`等工具对生成的字节码进行效率及体积上的优化,最后调用ABI生成器为开发者的合约生成JSON格式的ABI。
- 当开发者执行`cargo liquid build ...`命令时,cargo-liquid的build模块会收集编译元信息(如目标类型等),并调用rustc进行跨平台编译,将Liquid合约编译为Wasm格式字节码,随后使用wasm-opt等工具对生成的字节码进行效率及体积上的优化,最后调用ABI生成器为开发者的合约生成JSON格式的ABI。

- ***Liquid***:嵌入式领域特定语言Liquid的实现,其内部是一组[](https://doc.rust-lang.org/reference/macros.html)(Macro)及区块链底层API的集合,以包的形式提供给开发者使用,其内部主要有下列三个子模块:
- ***Liquid***:嵌入式领域特定语言Liquid的实现,其内部是一组宏及区块链底层API的集合,以包的形式提供给开发者使用,其内部主要有下列三个子模块:

- **Lang**:开发者在合约开发过程中所使用到的`contract`(用于以`mod`语法声明智能合约)、`InOut`(用于以`struct`语法定义自定义方法参数类型)等宏均由`macro`模块定义并导出。当构建开发者的合约时,`rustc`会对这些的宏进行匹配及展开。在宏的展开过程中,`IR`模块会解析开发者的代码并重新生成抽象语法树(AST),以对部分Rust语法进行重新诠释。随后,`code-gen`模块会依据`IR`模块生成的AST生成调用`Core`模块的Rust代码,这些代码对开发者并不可见。
- **Lang**:开发者在合约开发过程中所使用到的`contract`属性宏(用于以`mod`语法声明智能合约)、`InOut`派生宏(用于以struct语法定义自定义方法参数类型)等宏均由`macro`模块定义并导出。当构建开发者的合约时,rustc会对这些的宏进行匹配及展开。在宏的展开过程中,`IR`模块会解析开发者的代码并重新生成抽象语法树(AST),以对部分Rust语法进行重新诠释。随后,`code-gen`模块会依据`IR`模块生成的AST生成调用`Core`模块的Rust代码,这些代码对开发者并不可见。

- **Core**:包含了开发者能够使用的智能合约功能的实现。以自底向下的视角来看:
- `engine`:智能合约的执行引擎。对于上层,`engine`模块提供了一系列基础API,包括用于读取链上存储的`get_storage`接口、用于写入链上存储的`set_storage`接口、用于获取当前区块时间戳的`now`接口等。对于这些接口,`engine`有两种不同的实现:
- `off-chain`中的实现用于在本机执行智能合约的单元测试时使用,其内部模拟了区块链特性(K-V存储、事件记录器等)并提供了测试专用的接口,用于开发者在正式部署合约前测试合约逻辑是否正确;
- `on-chain`中的实现用于智能合约真正在区块链中执行时使用,其实现相对较为简单,因为具体实现是由区块链底层平台完成,`on-chain`中只需要声明这些接口并进行适配即可。接口的规范(名称、参数类型、返回值类型等)由区块链底层平台给出,对于FISCO BCOS,这个规范称为BCOS环境接口规范(BCOS Environment Interface,BEI)。关于BEI的具体内容可参考附录。
- off-chain模式:用于在本机执行智能合约的单元测试时使用,其内部模拟了区块链特性(K-V存储、事件记录器等)并提供了测试专用的接口,用于开发者在正式部署合约前测试合约逻辑是否正确;
- on-chain模式:用于智能合约真正在区块链中执行时使用,其实现相对较为简单,因为具体实现是由区块链底层平台完成,`on-chain`中只需要声明这些接口并进行适配即可。接口的规范(名称、参数类型、返回值类型等)由区块链底层平台给出,对于FISCO BCOS,这个规范称为BCOS环境接口规范(BCOS Environment Interface,BEI)。关于BEI的具体内容可参考附录。

- `types`:提供了区块链场景下基本数据类型的定义,如地址(Address)、字符串(String)等。`types`模块与`engine`模块一同构成了智能合约的执行环境,即`env`模块。

- `storage`:基于`env`模块提供接口,对链上状态的访问方式进行了进一步的抽象。智能合约需要通过`storage`模块提供的容器类型读写链上状态。若要访问单个链上状态,则可以使用常规容器`Value`;若要以下标的形式序列式的访问链上状态,则可以使用向量容器`Vec`;若要以键值对的形式访问链上状态,则可以使用映射容器`Mapping`;若需要在`Mapping`的基础上按键对链上状态进行迭代访问,则可以使用可迭代映射容器`IterableMapping`
- `storage`:基于`env`模块提供接口,对链上状态的访问方式进行了进一步的抽象。智能合约需要通过`storage`模块提供的容器类型读写链上状态。若要访问单个链上状态,则可以使用常规容器Value;若要以下标的形式序列式的访问链上状态,则可以使用向量容器Vec;若要以键值对的形式访问链上状态,则可以使用映射容器Mapping;若需要在Mapping的基础上按键对链上状态进行迭代访问,则可以使用可迭代映射容器IterableMapping

- *Utils*:涵盖了其他基础功能。主要包括:用于实现合约方法参数及返回值编解码的`abi-codec`、用于生成ABI生成器代码的`abi-gen`及用于内存分配的`alloc`其中,`alloc`模块用于为合约注册为全局内存分配器,合约内所有的内存分配操作(动态数组、字符串等)都会通过`alloc`模块进行。
- **Utils**:涵盖了其他基础功能。主要包括:用于实现合约方法参数及返回值编解码的`abi-codec`、用于生成ABI生成器代码的`abi-gen`及用于内存分配的`alloc`其中,`alloc`模块用于为合约注册为全局内存分配器,合约内所有的内存分配操作(动态数组、字符串等)都会通过`alloc`模块进行。

0 comments on commit 29be4c0

Please sign in to comment.