From 8db7fd14a69b9b25f5c787df50bee13fabeb09db Mon Sep 17 00:00:00 2001 From: jmz <1125378902@qq.com> Date: Fri, 2 Jun 2023 17:22:50 +0800 Subject: [PATCH] optimize 4 --- docs/source/04.function.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/source/04.function.md b/docs/source/04.function.md index cbecacd..7f6a392 100644 --- a/docs/source/04.function.md +++ b/docs/source/04.function.md @@ -385,7 +385,7 @@ contract E is C { 一个内部函数可以被分配给一个内部函数类型的变量,无论定义在哪里,包括合约和库的私有、内部和 public 函数,以及自由函数。 -另一方面,外部函数类型只与 public 和外部合约函数兼容。库是不可以的,因为库使用 delegatecall,并且 他们的函数选择器有不同的 ABI 转换 。 接口中声明的函数没有定义,所以指向它们也没有意义。 +另一方面,外部函数类型只与 public 和外部合约函数兼容。 接口中声明的函数没有定义,所以指向它们也没有意义。 内部可见性函数访问可以在当前合约或派生的合约访问,不可以外部访问。 由于它们没有通过合约的 ABI 向外部公开,它们可以接受内部可见性类型的参数:比如映射或存储引用。 @@ -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 调用的原因. 当使用高级别的方式调用 预编译合约时 需要注意,因为因为根据上面的逻辑,编译器认为它们不存在,即使它们执行代码并返回数据。 @@ -769,7 +770,7 @@ contract C { 如果函数中存在以下语句,则被视为读取状态,编译器将抛出警告。 - 读取状态变量。 - - 这也意味着读取 `immutable` 变量也不是一个 `pure` 操作。 + - 这也意味着读取 `immutable` 变量也不是一个 `pure` 操作(immutable 和 contant 都是存储于字节码中, constant 的数据读取可以使用 pure, 按理immutable 的数据读取也应该可以使用pure才对. 个人感觉后期solidity团队应该会进行优化)。 - 访问 `address(this).balance` 或 `
.balance` - 访问 `block`,`tx`, `msg` 中任意成员 (除 `msg.sig` 和 `msg.data` 之外)。 - 调用任何未标记为 `pure` 的函数。 @@ -1188,7 +1189,7 @@ contract B {} 选择重载函数:通过将当前范围内的函数声明与函数调用中提供的参数相匹配,这样就可以选择重载函数。 -如果所有参数都可以隐式地转换为预期类型,则该函数作为重载候选项。如果一个匹配的都没有,解析失败。 +如果所有参数都可以隐式地转换为预期类型,则该函数作为重载候选项。如果一个匹配的都没有,解析失败(编译阶段的匹配行为,EVM 执行阶段不会存在匹配操作)。 ⚠️:返回参数不作为重载解析的依据。