Skip to content

Commit d9d133d

Browse files
atenjinlizhaoyang
andauthored
update Ask (#53)
* update Ask * updateAsk * updateask Co-authored-by: lizhaoyang <lizhaoyang@patract.io>
1 parent 4703b70 commit d9d133d

16 files changed

+240
-240
lines changed

src/ask/ask-cli.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
# Ask-cli
22

3-
当前只提供了简单的 cli 来编译合约。 Ask! 提供了 ask 命令来编译 ask 合约:
3+
当前只提供了简单的cli来编译合约。 Ask! 提供了`ask`命令来编译Ask合约。
44

55
```sh
66
npx ask path/to/as-file
77
```
88

9-
注意 ask 命令需要使用 yarn 或者 npx 来执行以防止 遇到 AssemblyScript 的依赖重复错误。
9+
**注意** 您需要使用`yarn`或者`npx`的方式来执行`ask`命令,以防止出现AssemblyScript的依赖重复错误。
10+

src/ask/ask-vs-ink.md

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1-
# ask! vs ink!
1+
# Ask!和ink!的特性比较
22

3-
下面简单地列出了 ink! 和 ask! 特性比较:
3+
下表简单列举了ink! 和Ask! 的特性比较。
44

5-
Here is a brief comparison of features between ink! and ask!:
6-
7-
| | ink! | ask! |
8-
| :--------------------------- | :-------------------------- | :------------------------------------ |
9-
| Language | Rust | AssemblyScript |
10-
| Overflow Protection | Enabled by default | None |
11-
| Constructor Functions | Multiple | Multiple |
12-
| Tooling | Anything that supports Rust | Anything that supports AssemblyScript |
13-
| Versioning | Semantic | Semantic |
14-
| Has Metadata? | Yes | Yes |
15-
| Multi-File Project | Planned | Yes |
16-
| Storage Entries | Variable | Variable |
17-
| Supported Types | Docs | Docs |
18-
| Has Interfaces? | Yes (Rust Traits) | Yes |
19-
| Has Inheritance? | No | Yes |
20-
| Support unit test? | Yes | No |
21-
| Support cross-contract calls | Preliminary | Handy |
5+
| | ink! | Ask! |
6+
| :----------------- | :-------------------------- | :------------------------------------ |
7+
| 底层语言 | Rust | AssemblyScript |
8+
| 溢出保护 | Enabled by default | None |
9+
| 构造函数 | Multiple | Multiple |
10+
| 可用工具链 | Anything that supports Rust | Anything that supports AssemblyScript |
11+
| 版本管理 | Semantic | Semantic |
12+
| 是否有metadata | Yes | Yes |
13+
| 是否支持多文件项目 | Planned | Yes |
14+
| 存储模式 | Variable | Variable |
15+
| 是否有interface | Yes (Rust Traits) | Yes |
16+
| 是否支持继承 | No | Yes |
17+
| 是否支持单元测试 | Yes | No |
18+
| 是否支持跨合约调用 | Preliminary | Handy |

src/ask/basics.md

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
# 基础
22

3-
Ask! 提供了 `ask-lang` 包,它包含了合约常用存储类型的实现,智能合约底层原语的封装等。
3+
Ask! 提供了`ask-lang`包,它包括合约常用存储类型的实现、智能合约底层原语的封装等。
44

5-
## 存储 Storage
5+
## 存储
66

77
### 内置存储类型
88

9-
Ask! 为 AS 的基本类型和标准库集合提供了支持 Scale 编码和存储的版本,
10-
包括 bool/i{8, 16, 32, 64, 128}/u{8, 16, 32, 64, 128}/string(String)/Array/Set/Map,
11-
对应于 Bool/Int{8, 16, 32, 64, 128}/u{8, 16, 32, 64, 128}/ScaleString/ScaleArray/ScaleSet/ScaleMap。
9+
Ask! 为[AssemblyScript](https://www.assemblyscript.org/) 的基本类型和标准库集合提供了支持Scale编码和存储的版本,包括`bool`/`i{8, 16, 32, 64, 128}`/`u{8, 16, 32, 64, 128}`/`string(String)`/`Array`/`Set`/`Map`,对应于 `Bool`/`Int{8, 16, 32, 64, 128}`/`u{8, 16, 32, 64, 128}`/`ScaleString`/`ScaleArray`/`ScaleSet`/`ScaleMap`。当在合约代码相关位置使用了上述提到的基本类型(但不包括`Array``Set``Map`等容器类型),Ask!会在编译期自动转换为对应的Scale类型(即自动装箱/拆箱)。
1210

13-
当在合约代码相关位置使用了上述提到的基本类型(但不包括 Array/Set/Map 等容器类型),Ask!会在编译期自动转换为对应的 Scale 类型(即自动装箱/拆箱)。
14-
15-
可以通过`ask-lang`导入:
11+
您可以通过`ask-lang`导入`Bool`
1612

1713
```ts
1814
import { Bool } from 'ask-lang';
1915
```
2016

2117
### 定义存储类型
2218

23-
Ask! 提供 `@storage` 来装饰类为存储类型:
19+
Ask!提供 `@storage` 来装饰类为存储类型,存储类型里的字段需要支持[Scale编码](https://github.com/paritytech/parity-scale-codec)
2420

2521
```ts
2622
@storage
@@ -32,11 +28,9 @@ class Storage {
3228
}
3329
```
3430

35-
存储类型里的字段需要支持[`Scale`编码](https://github.com/paritytech/parity-scale-codec)
36-
3731
### 初始化存储类型
3832

39-
我们可以在合约初始化构造函数里初始化存储值,合约类必须至少提供一个`@constructor`修饰的初始化函数。下面是一个示例:
33+
我们可以在合约初始化构造函数里初始化存储值,合约类必须至少提供一个`@constructor`修饰的初始化函数。示例如下。
4034

4135
```ts
4236
@contract
@@ -54,23 +48,21 @@ class MyContract {
5448
}
5549
```
5650

57-
注意: 默认构造函数/`@constructor`必须是 public 的,否则会出现编译错误。 合约函数的参数和返回值必须是基本类型或者实现Codec编码的类型。
51+
**注意** 默认构造函数`@constructor`必须是public的,否则会出现编译错误的提示。 合约函数的参数和返回值必须是基本类型或者实现Codec编码的类型。
5852

5953
### 读取存储值
6054

61-
从之前的代码里可以看出来,Ask! 的存储和合约是可以分开声明的,我们也建议用户分开声明。合约类里声明的函数是真正对外的合约 API,而存储只是实现细节。
55+
Ask!的存储和合约是可以分开声明的,也建议您分开声明。合约类里声明的函数是真正对外的合约API,而存储只是实现细节。
6256

6357
### 修改存储值
6458

65-
Ask! 为`@message`方法提供了`mutates`属性,默认为`true`。当设置为`false`时,该方法会在运行时拒绝修改存储值。
66-
67-
<!-- TODO -->
59+
Ask!为`@message`方法提供了`mutates`属性,默认为`true`。当设置为`false`时,该方法会在运行时拒绝修改存储值。
6860

6961
### Events
7062

71-
智能合约可以定义在合约执行期间可以发出的事件,第三方工具可以使用发出事件来查询有关合约执行和状态的信息。Event 的字段必须实现`Codec`接口,它们会作为 event data 被收集起来,而 `@topic` 装饰的字段还会作为事件的索引。
63+
智能合约可以定义在合约执行期间可以发出的事件,第三方工具可以使用发出事件来查询有关合约执行和状态的信息。Event的字段必须实现`Codec`接口,它们会作为event data被收集起来,而 `@topic` 装饰的字段还会作为事件的索引。
7264

73-
### Example
65+
#### 使用示例
7466

7567
```ts
7668
@event
@@ -96,7 +88,7 @@ class Transfer {
9688

9789
Ask! 提供一些类,它们的方法提供了链提供的能力的API:
9890

99-
- Crypto,提供了加密相关的 API
100-
- Gas,提供了 Gas 相关的 API
101-
- AccountId 提供了账户相关的 API
102-
- Msg 提供了 消息相关的 API
91+
- Crypto:提供了加密相关的API。
92+
- Gas:提供了Gas相关的API。
93+
- AccountId :提供了账户相关的API。
94+
- Msg 提供了 消息相关的API。

src/ask/decorators.md

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
11
# Ask! 装饰器
22

3-
Ask! 提供了一组装饰器来实现智能合约,通过传递参数对象来配置装饰器的行为。目前装饰器注意分为两层:类装饰器和字段装饰器,字段装饰器必须正确匹配相应的类装饰器。
3+
Ask! 提供了一组装饰器来实现智能合约,通过传递参数对象来配置装饰器的行为。装饰器主要分为两层,类装饰器和字段装饰器,字段装饰器必须正确匹配相应的类装饰器。当使用的装饰器不加参数时,可以省略小括号
44

5-
当使用的装饰器不加参数时,可以省略小括号`()`
6-
7-
> 注意:以下的装饰器设计仅适用于当前版本,许多特性还未稳定,可能会在未来变动。
5+
**注意** 以下的装饰器设计仅适用于当前版本,许多特性还未稳定,可能在未来有所变动。
86

97
## @contract
108

119
类装饰器
1210

13-
装饰的类会自动成为智能合约一个实例。其子字段支持 `@constructor``@message` 装饰器装饰。
14-
15-
一个 `AS` 文件 只能定义一个`@contract` 类。
11+
装饰的类会自动成为智能合约一个实例。其子字段支持 `@constructor``@message` 装饰器装饰。一个`AS`文件 只能定义一个`@contract` 类。
1612

1713
## @constructor
1814

1915
字段装饰器
2016

21-
该装饰器用于 `@contract` 的非静态 `public` 方法,该方法不允许返回值即返回类型为 `void`。装饰的方法作为该合约的一个初始化构造方法。一个合约至少需要定义一个`@constructor`方法。
17+
该装饰器用于`@contract` 的非静态public方法,该方法不允许返回值即返回类型为`void`。装饰的方法作为该合约的一个初始化构造方法。一个合约至少需要定义一个`@constructor`方法。
2218

2319
`@constructor`方法是在合约实例化时可执行的。合约可以定义多个构造方法,允许合约的用户以多种不同的方式实例化合约。
2420

2521
合约构造方法的配置总是为 `payable = true``mutates = true`
2622

27-
Example:
23+
示例如下。
2824

2925
```ts
3026
@contract
@@ -46,12 +42,11 @@ class Flipper {
4642

4743
## @doc
4844

49-
`@doc` 用于为`metadata.json`生成的信息提供文档。它可以为`@contract`/`@event`/`@message`/`@constructor`声明添加文档注释
45+
`@doc` 用于为`metadata.json`生成的信息提供文档。它可以为`@contract`/`@event`/`@message`/`@constructor`声明添加文档注释
5046

51-
Example:
47+
示例如下。
5248

5349
```ts
54-
5550
@contract
5651
@doc(desc = "MyToken conract that implement erc20 contract")
5752
class MyToken {
@@ -63,16 +58,16 @@ class MyToken {
6358

6459
字段装饰器
6560

66-
该装饰器用于 `@contract` 的 非静态 `public` 方法。装饰的方法作为合约的消息 API 供用户调用该合约。一个合约至少需要定义一个`@constructor`方法或者继承了其他合约。
61+
该装饰器用于 `@contract`的非静态public方法。装饰的方法作为合约的消息API供用户调用该合约。一个合约至少需要定义一个`@constructor`方法或者继承了其他合约。
6762

68-
`@message`方法是在合约执行的被调用的。合约可以定义多个消息方法。消息方法的返回值会返回给用户,因此需要实现`Codec`接口。如果你需要返回一些集合类型,那么需要使用 ask! 提供的一些实现 `Codec` 接口的集合类型。
63+
`@message`方法是在合约执行的被调用的。合约可以定义多个消息方法。消息方法的返回值会返回给用户,因此需要实现`Codec`接口。如果您需要返回一些集合类型,那么需要使用Ask! 提供的一些实现 `Codec` 接口的集合类型。
6964

7065
合约消息方法默认配置为`payable = false``mutates = true`,当配置为`true`时,合约会在运行时做相应的检查。
7166

72-
- `payable` 表明方法可以接受 value
73-
- `mutates` 表明方法是否能够改变存储变量的值
67+
- `payable` 表示方法可以接受value。
68+
- `mutates` 表示方法是否能够改变存储变量的值。
7469

75-
Example:
70+
示例如下。
7671

7772
```ts
7873
@contract
@@ -112,23 +107,21 @@ class Flipper {
112107

113108
类装饰器
114109

115-
详见[Event](./basics.md#Events)
110+
详情请参见[Event](./basics.md#Events)
116111

117112
## @topic
118113

119114
字段装饰器
120115

121-
`@topic` 装饰的属性字段,会额外生成一个主题索引。每个事件的索引是有数量限制的(默认最大为 4 个)。
116+
`@topic` 装饰的属性字段,会额外生成一个主题索引。每个事件的索引是有数量限制的(默认最大为4个)。
122117

123118
## @dynamic
124119

125120
类装饰器
126121

127-
`@dynamic` 装饰器用来装饰一个合约的 APIs,这个合约已经存在于链上。通过在`@dynamic`类里声明链上的合约接口,ask 会自动生成相应的跨合约调用代码。
128-
129-
Example:
122+
`@dynamic` 装饰器用来装饰一个合约的APIs,这个合约已经存在于链上。通过在`@dynamic`类里声明链上的合约接口,Ask会自动生成相应的跨合约调用代码。
130123

131-
假设下面的合约 A 已经存在链上:
124+
假设下面的合约A已经存在链上。
132125

133126
```ts
134127
@contract
@@ -145,7 +138,7 @@ class Libadd {
145138
}
146139
```
147140

148-
我们在合约 B 里面想调用该合约,那么我们可以声明一个`@dynamic`类来描述其接口
141+
如果想在合约B里面想调用该合约,您可以声明一个`@dynamic`类来描述其接口
149142

150143
```ts
151144
@dynamic
@@ -172,6 +165,6 @@ class LibaddCaller {
172165
}
173166
```
174167

175-
这里的 outAddress 是合约 Libadd 的实例地址
168+
这里的`outAddress`是合约Libadd的实例地址
176169

177-
该功能也可以调用其他智能合约语言编写的合约,比如 ink!,只要遵循兼容的 metadata.json 规范
170+
该功能也可以调用其他智能合约语言编写的合约,例如ink!,只要遵循兼容的metadata.json规范

src/ask/design.md

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,24 @@
22

33
## Ask! 设计总览
44

5-
AssemblyScript 使用 asc 编译器将 AssemblyScript 文件编译为 WebAssembly 字节码。 但是无法直接生成符合 `pallet-contract` ABI 的 wasm 字节码和`metadata.json`元信息文件,因此需要编写 AS transform 介入编译器编译流程,在合适的位置生成 ABI 相关的代码并导出,在类型信息确定之后生成 `metadata.json`
5+
AssemblyScript使用asc编译器将AssemblyScript文件编译为WebAssembly字节码,但是无法直接生成符合 `pallet-contract` ABI的 Wasm字节码和`metadata.json`元信息文件,因此您需要编写AS transform介入编译器编译流程,在合适的位置生成ABI相关的代码并导出,在类型信息确定之后生成 `metadata.json`
66

77
## 设计思路
88

9-
Ask! 提供了 `ask-transform`在以下描述中简称为 `transform`)和 `ask-lang` 两个库。
10-
此外,我们在后续将提供一个名为 `ask-cli` 的构建工具(类似于 ink!的`cargo-contract`),用于帮助建立和管理用 Ask!编写的 Wasm 智能合约
9+
Ask! 提供了 `ask-transform`简称 `transform`)和 `ask-lang` 两个库。
10+
此外,我们在后续将提供一个名为 `ask-cli` 的构建工具,这个工具类似于ink!的`cargo-contract`,用于帮助建立和管理用Ask编写的Wasm智能合约
1111

1212
Ask! 的功能按照如下实现:
1313

14-
- `ask-lang`的主要功能是为编写智能合约提供高层 API,包括`pallet-contract`原语高层封装/scale 编码/KV 存储抽象/常用的基本类型/通用的 interfaces。用户可以通过装饰器来自动派生这些基本类的组合。
15-
- `ask-transform`的主要功能是根据 Ask! 代码里使用的装饰器,生成符合`pallet-contract` 规范的代码和`metadata.json`元信息文件文件。这个部分需要完成以下任务:
16-
17-
- 解析合约接口和参数,并生成元数据文件
18-
- 解析自定义合约装饰器,生成相应的逻辑代码
19-
- 根据存储的定义按照一定流程读/写合约存储
14+
- `ask-lang`的主要功能是为编写智能合约提供高层API,包括`pallet-contract`原语高层封装、Scale 编码、K/V存储抽象、常用的基本类型和通用的 interfaces。您可以通过装饰器来自动派生这些基本类的组合。
15+
- `ask-transform`的主要功能根据Ask! 代码里使用的装饰器,生成符合`pallet-contract` 规范的代码和`metadata.json`元信息文件,这个部分实现以下功能:
16+
- 解析合约接口和参数,并生成元数据文件。
17+
- 解析自定义合约装饰器,生成相应的逻辑代码。
18+
- 根据存储的定义按照一定流程读/写合约存储。
2019

2120
<!-- TODO: 未实现 -->
22-
<!-- - `ask-cli`的主要功能是在 cli 中管理 Ask!项目,其中包括以下功能:
21+
<!-- - `ask-cli`的主要功能是在cli中管理Ask!项目,其中包括以下功能:
2322
24-
- 创建 ask!合约模板。
25-
- 使用额外的工具如 wasm-opt 来优化 wasm 代码
26-
- 检查所生成的 Wasm 代码的合法性-->
23+
- 创建Ask!合约模板。
24+
- 使用额外的工具例如wasm-opt来优化Wasm代码。
25+
- 检查所生成的Wasm代码的合法性-->

0 commit comments

Comments
 (0)