diff --git a/CraigC.md b/CraigC.md index 9e34fc97..117e5807 100644 --- a/CraigC.md +++ b/CraigC.md @@ -85,4 +85,10 @@ timezone: Asia/Shanghai ### 2024.10.14 [WTF Academy Solidity 102 24 Note](content/CraigC/24.md) +### 2024.10.15 +[WTF Academy Solidity 102 25 Note](content/CraigC/25.md) + +### 2024.10.16 +[WTF Academy Solidity 102 26 Note](content/CraigC/26.md) + diff --git a/content/CraigC/25.md b/content/CraigC/25.md new file mode 100644 index 00000000..42bc235d --- /dev/null +++ b/content/CraigC/25.md @@ -0,0 +1,28 @@ +## 102-25 CREATE2 + +### CREATE2 +CREATE2 操作码使我们在智能合约部署在以太坊网络之前就能预测合约的地址。Uniswap创建Pair合约用的就是CREATE2而不是CREATE。 + +#### CREATE如何计算地址 +智能合约可以由其他合约和普通账户利用CREATE操作码创建。 在这两种情况下,新合约的地址都以相同的方式计算:创建者的地址(通常为部署的钱包地址或者合约地址)和nonce的哈希 +创建者地址不会变,但nonce可能会随时间而改变,因此用CREATE创建的合约地址不好预测。 + +#### CREATE2如何计算地址 +CREATE2的目的是为了让合约地址独立于未来的事件。不管未来区块链上发生了什么,你都可以把合约部署在事先计算好的地址上。用CREATE2创建的合约地址由4个部分决定: +- 0xFF:一个常数,避免和CREATE冲突 +- CreatorAddress: 调用 CREATE2 的当前合约(创建合约)地址。 +- salt(盐):一个创建者指定的bytes32类型的值,它的主要目的是用来影响新创建的合约的地址。 +- initcode: 新合约的初始字节码(合约的Creation Code和构造函数的参数)。 + +使用CREATE2创建合约地址举例如下: +```solidity +新地址 = hash("0xFF",创建者地址, salt, initcode) +``` +CREATE2确保,如果创建者使用CREATE2和提供的salt部署给定的合约initcode,它将存储在新地址中。 + +#### 如何使用CREATE2 +CREATE2的用法和之前讲的CREATE类似,同样是new一个合约,并传入新合约构造函数所需的参数,只不过要多传一个salt参数: +```solidity +Contract x = new Contract{salt: _salt, value: _value}(params) +``` +其中:Contract是要创建的合约名,x是合约对象(地址),_salt是指定的盐;如果构造函数是payable,可以创建时转入_value数量的ETH,params是新合约构造函数的参数。 \ No newline at end of file diff --git a/content/CraigC/26.md b/content/CraigC/26.md new file mode 100644 index 00000000..fed2a131 --- /dev/null +++ b/content/CraigC/26.md @@ -0,0 +1,15 @@ +## 102-26 删除合约 + +### selfdestruct +selfdestruct命令可以用来删除智能合约,并将该合约剩余ETH转到指定地址。selfdestruct是为了应对合约出错的极端情况而设计的。它最早被命名为suicide(自杀),但是这个词太敏感。为了保护抑郁的程序员,改名为selfdestruct; + +然而,在以太坊坎昆(Cancun)升级中,EIP-6780被纳入升级以实现对Verkle Tree更好的支持。EIP-6780减少了SELFDESTRUCT操作码的功能。根据提案描述,当前SELFDESTRUCT仅会被用来将合约中的ETH转移到指定地址,而原先的删除功能只有在合约创建-自毁这两个操作处在同一笔交易时才能生效。所以目前来说: +- 已经部署的合约无法被SELFDESTRUCT了。 +- 如果要使用原先的SELFDESTRUCT功能,必须在同一笔交易中创建并SELFDESTRUCT。 + +### 如何使用selfdestruct +很简单: +```solidity +selfdestruct(_addr); +``` +其中_addr是接收合约中剩余ETH的地址。_addr 地址不需要有receive()或fallback()也能接收ETH。 \ No newline at end of file