Skip to content
Open
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
11 changes: 6 additions & 5 deletions docs/source/04.function.md
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ contract E is C {

一个内部函数可以被分配给一个内部函数类型的变量,无论定义在哪里,包括合约和库的私有、内部和 public 函数,以及自由函数。

另一方面,外部函数类型只与 public 和外部合约函数兼容。库是不可以的,因为库使用 delegatecall,并且 他们的函数选择器有不同的 ABI 转换 。 接口中声明的函数没有定义,所以指向它们也没有意义。
另一方面,外部函数类型只与 public 和外部合约函数兼容。 接口中声明的函数没有定义,所以指向它们也没有意义。

内部可见性函数访问可以在当前合约或派生的合约访问,不可以外部访问。 由于它们没有通过合约的 ABI 向外部公开,它们可以接受内部可见性类型的参数:比如映射或存储引用。

Expand Down Expand Up @@ -550,9 +550,10 @@ payable 修饰符要用于修饰 info 函数,否则, value 选项将不可

#### extcodesize 操作码来检查要调用的合约是否确实存在

由于 EVM 认为可以调用不存在的合约的调用,因此在 Solidity 语言层面里会使用 extcodesize 操作码来检查要调用的合约是否确实存在(包含代码),如果不存在该合约,则抛出异常。如果返回数据在调用后被解码,则跳过这个检查,因此 ABI 解码器将捕捉到不存在的合约的情况。
由于 EVM 认为可以调用不存在的合约的调用,因此在 Solidity 语言层面里会使用 extcodesize 操作码来检查要调用的合约是否确实存在(包含代码),如果不存在该合约,则抛出异常。

请注意,这个检查在 **低级 call** 时不被执行,这些调用是对地址而不是合约实例进行操作。
请注意,这个检查在 **低级 call || interface call** 时不被执行,这些调用是对地址而不是合约实例进行操作。
请注意, **合约地址在constructor之前,该地址的code是没有字节码的**. 当在constructor内进行this.xxx()的调用时,因为需要进行extcodesize检查,而此时该合约地址没有code, 所以会抛出异常.这也就是为什么constructor 内不能进行this 调用的原因.

当使用高级别的方式调用 预编译合约时 需要注意,因为因为根据上面的逻辑,编译器认为它们不存在,即使它们执行代码并返回数据。

Expand Down Expand Up @@ -769,7 +770,7 @@ contract C {
如果函数中存在以下语句,则被视为读取状态,编译器将抛出警告。

- 读取状态变量。
- 这也意味着读取 `immutable` 变量也不是一个 `pure` 操作。
- 这也意味着读取 `immutable` 变量也不是一个 `pure` 操作(immutable 和 contant 都是存储于字节码中, constant 的数据读取可以使用 pure, 按理immutable 的数据读取也应该可以使用pure才对. 个人感觉后期solidity团队应该会进行优化)
- 访问 `address(this).balance` 或 `<address>.balance`
- 访问 `block`,`tx`, `msg` 中任意成员 (除 `msg.sig` 和 `msg.data` 之外)。
- 调用任何未标记为 `pure` 的函数。
Expand Down Expand Up @@ -1188,7 +1189,7 @@ contract B {}

选择重载函数:通过将当前范围内的函数声明与函数调用中提供的参数相匹配,这样就可以选择重载函数。

如果所有参数都可以隐式地转换为预期类型,则该函数作为重载候选项。如果一个匹配的都没有,解析失败。
如果所有参数都可以隐式地转换为预期类型,则该函数作为重载候选项。如果一个匹配的都没有,解析失败(编译阶段的匹配行为,EVM 执行阶段不会存在匹配操作)

⚠️:返回参数不作为重载解析的依据。

Expand Down