From 4ab1b9bf9dc45f4df860a03dc0863ca6f1018c5e Mon Sep 17 00:00:00 2001 From: Alan Xu Date: Tue, 5 Nov 2024 12:35:52 +0800 Subject: [PATCH 1/2] docs(30): update public (#835) update public --- 30_TryCatch/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/30_TryCatch/readme.md b/30_TryCatch/readme.md index ccbc2a65b..5ef5880d2 100644 --- a/30_TryCatch/readme.md +++ b/30_TryCatch/readme.md @@ -23,7 +23,7 @@ tags: ## `try-catch` -在`Solidity`中,`try-catch`只能被用于`external`函数或创建合约时`constructor`(被视为`external`函数)的调用。基本语法如下: +在`Solidity`中,`try-catch`只能被用于`external`函数或`public`函数或创建合约时`constructor`(被视为`external`函数)的调用。基本语法如下: ```solidity try externalContract.f() { From 5909cb9b942428e9a3673808d648f7de528eee68 Mon Sep 17 00:00:00 2001 From: Alan Xu Date: Wed, 6 Nov 2024 00:31:09 +0800 Subject: [PATCH 2/2] docs(s08): fix markdown warnings (#836) * docs(s08): fix markdown warnings fix markdown warnings * docs(s08): fix s08 fix s08 --- S08_ContractCheck/readme.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/S08_ContractCheck/readme.md b/S08_ContractCheck/readme.md index 93aba60e3..8bf21cab7 100644 --- a/S08_ContractCheck/readme.md +++ b/S08_ContractCheck/readme.md @@ -25,21 +25,21 @@ tags: 很多 freemint 的项目为了限制科学家(程序员)会用到 `isContract()` 方法,希望将调用者 `msg.sender` 限制为外部账户(EOA),而非合约。这个函数利用 `extcodesize` 获取该地址所存储的 `bytecode` 长度(runtime),若大于0,则判断为合约,否则就是EOA(用户)。 ```solidity - // 利用 extcodesize 检查是否为合约 - function isContract(address account) public view returns (bool) { - // extcodesize > 0 的地址一定是合约地址 - // 但是合约在构造函数时候 extcodesize 为0 - uint size; - assembly { - size := extcodesize(account) - } - return size > 0; +// 利用 extcodesize 检查是否为合约 +function isContract(address account) public view returns (bool) { + // extcodesize > 0 的地址一定是合约地址 + // 但是合约在构造函数时候 extcodesize 为0 + uint size; + assembly { + size := extcodesize(account) } + return size > 0; +} ``` 这里有一个漏洞,就是在合约在被创建的时候,`runtime bytecode` 还没有被存储到地址上,因此 `bytecode` 长度为0。也就是说,如果我们将逻辑写在合约的构造函数 `constructor` 中的话,就可以绕过 `isContract()` 检查。 -![](./img/S08-1.png) +![image1](./img/S08-1.png) ## 漏洞例子 @@ -109,9 +109,9 @@ contract NotContract { ## 预防办法 -你可以使用 `(tx.origin == msg.sender)` 来检测调用者是否为合约。如果调用者为 EOA,那么`tx.origin`和`msg.sender`相等;如果它们俩不相等,调用者为合约。 +你可以使用 `(tx.origin == msg.sender)` 来检测调用者是否为合约。如果调用者为 EOA,那么`tx.origin`和`msg.sender`相等;如果它们俩不相等,调用者为合约。在[eip-3074](https://eips.ethereum.org/EIPS/eip-3074)中,这样检查合约的方式,会失效。 -``` +```solidity function realContract(address account) public view returns (bool) { return (tx.origin == msg.sender); } @@ -119,4 +119,4 @@ function realContract(address account) public view returns (bool) { ## 总结 -这一讲,我们介绍了合约长度检查可以被绕过的漏洞,并介绍预防的方法。如果一个地址的 `extcodesize > 0`,则该地址一定为合约;但如果 `extcodesize = 0`,该地址既可能为 `EOA`,也可能为正在创建状态的合约。 \ No newline at end of file +这一讲,我们介绍了合约长度检查可以被绕过的漏洞,并介绍预防的方法。如果一个地址的 `extcodesize > 0`,则该地址一定为合约;但如果 `extcodesize = 0`,该地址既可能为 `EOA`,也可能为正在创建状态的合约。