Skip to content

Commit

Permalink
update doc of env and intrinsics
Browse files Browse the repository at this point in the history
  • Loading branch information
vita-dounai committed Sep 22, 2020
1 parent 45dabcd commit 84a80b0
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 5 deletions.
49 changes: 49 additions & 0 deletions docs/in_depth/env_and_intrinsics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# 环境与内置函数

## 环境

您可以通过Liquid中的环境模块访问某些区块链执行环境信息(如合约的调用者地址)。通过如下形式可在合约方法中使用环境模块中的接口:

```rust
self.env().get_caller();
```

其中`self`是执行合约方法时当前合约对象的引用。在编译合约时,Liquid会自动为您的合约实现一个名为`env`的私有方法。`env`方法不接受任何参数,但会返回一个环境访问器对象, 您无需关心环境访问器的具体实现细节,只需要知道能且仅能通过环境访问器访问区块链执行环境信息。获得环境访问器后,您便可以在其上调用您所需要接口了。目前Liquid中提供了以下访问区块链执行环境信息的接口:

- `get_caller`

签名:`get_caller() -> Address`

功能:获取直接调用当前合约的调用者的地址。

- `emit`

签名:`emit<E>(event: E)`,其中`E`为事件类型,即您标注了`#[liquid(event)]`的结构体类型(可参考[事件](./event.html)

功能:触发一个事件,事件会以日志的形式记录在交易的回执中。

每次调用环境相关的的接口时,都需要消耗一个环境访问器对象,因此您不能通过如下方式复用环境访问器对象:

```rust
// 环境访问器对象无法复用,编译报错
let env_access = &self.env();
let caller = env_access.get_caller();
env_access.emit(some_event);
```

正确的方式每次调用环境相关的接口时都创建一个环境访问器对象,环境访问器极为轻量,因为您无需担心创建时的性能开销:

```rust
let caller = self.env().get_caller();
self.env().emit(some_event);
```

## 内置函数

Liquid提供了一些基本的内置函数。在合约编译时,Liquid会自动导入这些函数,因此您可以在合约中直接使用这些函数。内置函数包括:

- `require`

签名:`require<Q>(expr: bool, msg: Q)`,其中泛型参数Q需要实现`AsRef<str>`,常见的`str``String`等类型均可以作为`msg`参数的类型

功能:断言函数,用于判断某个值为布尔类型的表达式`expr`是否成立。若成立,合约继续向下执行;若不成立,则引发交易回滚,并向外抛出所指定的异常信息`msg`,异常信息会随着交易回执一并返回至用户。
10 changes: 5 additions & 5 deletions docs/in_depth/state.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,21 +185,21 @@ Liquid中所有可用容器的定义均位于`liquid_core::storage`模块中,

功能:移除序列容器的最后一个元素并将其返回。若序列容器为空,则返回`None`

- swap
- `swap`

签名:`swap(&mut self, a: u32, b: u32)`

功能:交换序列容器中第`a`个及第`b`个元素。若`a``b`越界,则引发panic。

- swap_remove
- `swap_remove`

签名:`swap_remove(&mut self, n: u32) -> Option<T>`

功能:从序列容器中移除第`n`个元素,并将最后一个元素移动至第`n`个元素所在的位置,随后返回被移除元素的引用。若`n`越界,则返回`None`;若第`n`个元素就是序列容器中的最后一个元素,则效果等同于`pop`接口。

- extend
- `extend`

签名:`extend<I>(&mut self, iter: I)`,其中`iter`为元素类型为`T``&T`的迭代器
签名:`extend<I>(&mut self, iter: I)`,其中`iter`为元素类型为`T``&T`的迭代器

功能:按顺序遍历迭代器,并将迭代器所访问的元素依次插入到序列容器的尾部。

Expand Down Expand Up @@ -286,7 +286,7 @@ for elem in elems.iter() {

- `extend`

签名:`extend<I>(&mut self, iter: I)`,其中`iter`为元素类型为`(K, V)``(&K, &V)`的迭代器
签名:`extend<I>(&mut self, iter: I)`,其中`iter`为元素类型为`(K, V)``(&K, &V)`的迭代器

功能:按顺序遍历迭代器,并将迭代器所访问的元素拆解为键、值并插入到映射容器中。

Expand Down
5 changes: 5 additions & 0 deletions docs/quick_start/prerequisite.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,8 @@ git checkout wasm
```

关于如何使用Node.js SDK提供的CLI命令行工具部署Liquid合约,我们将在下一节**基本开发流程**中进行介绍。


## 安装Binaryen

Binaryen项目中包含一系列有用的Wasm字节码分析及优化工具,其中有些工具(如`wasm-opt`等)对于构建Liquid合约极为重要。目前Binaryen进仅提供了编译安装的方式,请参考其[官方文档](https://github.com/WebAssembly/binaryen#building),根据您所使用的操作系统平台选择相应的编译安装方式。
1 change: 1 addition & 0 deletions index.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Liquid是一种专用于为区块链底层平台[FISCO BCOS](https://fisco-bcos-
docs/in_depth/method.md
docs/in_depth/event.md
docs/in_depth/types.md
docs/in_depth/env_and_intrinsics.md
docs/in_depth/compile_options.md
.. toctree::
Expand Down

0 comments on commit 84a80b0

Please sign in to comment.