Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

improve the docs which make me confused #237

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/solidity-101/02_ValueTypes/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ address payable public _address1 = payable(_address); // payable address,可
uint256 public balance = _address1.balance; // balance of address
```

### 4. 定长字节数组
### 4. 字节数组

字节数组分为定长和不定长两种:

Expand Down
6 changes: 3 additions & 3 deletions docs/solidity-101/07_Mapping/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ mapping(address => address) public swapPair; // 币对的映射,地址到地
mapping(Student => uint) public testVar;
```

- **规则2**:映射的存储位置必须是`storage`,因此可以用于合约的状态变量,函数中的`storage`变量和library函数的参数(见[例子](https://github.com/ethereum/solidity/issues/4635))。不能用于`public`函数的参数或返回结果中,因为`mapping`记录的是一种关系 (key - value pair)。
- **规则2**:映射的存储位置必须是`storage`,因此可以用于合约的状态变量,函数中的`storage`变量和library函数的参数(见[例子](https://github.com/ethereum/solidity/issues/4635))。不能用于`public`函数的参数或返回结果中,因为`mapping`记录的是一种关系 (key - value pair),而不是具体的值

- **规则3**:如果映射声明为`public`,那么Solidity会自动给你创建一个`getter`函数,可以通过`Key`来查询对应的`Value`。

Expand All @@ -61,11 +61,11 @@ mapping(address => address) public swapPair; // 币对的映射,地址到地

## 映射的原理

- **原理1**: 映射不储存任何键(`Key`)的资讯,也没有length的资讯。
- **原理1**: 映射不储存任何键(`Key`)的资讯,也没有length的资讯。映射的设计是为了高效地查找值,而不是遍历键。

- **原理2**: 映射使用`keccak256(abi.encodePacked(key, slot))`当成offset存取value,其中`slot`是映射变量定义所在的插槽位置。

- **原理3**: 因为Ethereum会定义所有未使用的空间为0,所以未赋值(`Value`)的键(`Key`)初始值都是各个type的默认值,如uint的默认值是0。
- **原理3**: 因为Ethereum会定义所有未使用的空间为0,所以未赋值(`Value`)的键(`Key`)初始值都是各个type的默认值,如uint的默认值是0,bool的默认值是false

## 在Remix上验证 (以 `Mapping.sol`为例)

Expand Down
13 changes: 9 additions & 4 deletions docs/solidity-101/09_Constant/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,13 @@ tags:

### constant

`constant`变量必须在声明的时候初始化,之后再也不能改变。尝试改变的话,编译不通过。
- 定义: `constant`变量用在编译时就已知值的变量,这些变量的值在合约部署后不能更改。
- 使用场景:适用于那些在合约生命周期内始终不变的值,比如数学常数、固定的地址或字符串。
- 初始化:`constant`变量必须在声明的时候初始化,因为他们的值在编译时就确定了。
- 存储位置:`constant`变量的值直接嵌入到合约的字节码中。

``` solidity
// constant变量必须在声明的时候初始化,之后不能改变
// constant变量必须在声明的时候初始化,之后不能改变,尝试改变的话,编译不通过。
uint256 constant CONSTANT_NUM = 10;
string constant CONSTANT_STRING = "0xAA";
bytes constant CONSTANT_BYTES = "WTF";
Expand All @@ -40,8 +43,10 @@ address constant CONSTANT_ADDRESS = 0x0000000000000000000000000000000000000000;

### immutable

`immutable`变量可以在声明时或构造函数中初始化,因此更加灵活。在`Solidity v8.0.21`以后,`immutable`变量不需要显式初始化。反之,则需要显式初始化。
若`immutable`变量既在声明时初始化,又在constructor中初始化,会使用constructor初始化的值。
- 定义:`immutable`变量用于定义在合约部署时确定的变量。这些变量的值在合约部署后不能更改,但可以在构造函数中进行初始化。
- 使用场景:适用于那些在合约部署时才能确定的值,比如依赖于部署参数的配置。
- 初始化:`immutable`变量可以在声明时或构造函数中初始化,因此更加灵活。在`Solidity v8.0.21`以后,`immutable`变量不需要显式初始化。反之,则需要显式初始化。若`immutable`变量既在声明时初始化,又在constructor中初始化,会使用constructor初始化的值。
- 存储位置:`immutable`变量的值存储在合约的存储中,但在合约生命周期内不可更改。

``` solidity
// immutable变量可以在constructor里初始化,之后不能改变
Expand Down