diff --git a/docs/solidity-101/02_ValueTypes/readme.md b/docs/solidity-101/02_ValueTypes/readme.md index 79830557..21f87e82 100755 --- a/docs/solidity-101/02_ValueTypes/readme.md +++ b/docs/solidity-101/02_ValueTypes/readme.md @@ -106,7 +106,7 @@ address payable public _address1 = payable(_address); // payable address,可 uint256 public balance = _address1.balance; // balance of address ``` -### 4. 定长字节数组 +### 4. 字节数组 字节数组分为定长和不定长两种: diff --git a/docs/solidity-101/07_Mapping/readme.md b/docs/solidity-101/07_Mapping/readme.md index 3e700cb9..648214d3 100755 --- a/docs/solidity-101/07_Mapping/readme.md +++ b/docs/solidity-101/07_Mapping/readme.md @@ -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`。 @@ -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`为例) diff --git a/docs/solidity-101/09_Constant/readme.md b/docs/solidity-101/09_Constant/readme.md index ed179d2e..f084704a 100755 --- a/docs/solidity-101/09_Constant/readme.md +++ b/docs/solidity-101/09_Constant/readme.md @@ -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"; @@ -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里初始化,之后不能改变