Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1016 note #503

Merged
merged 3 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
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
6 changes: 6 additions & 0 deletions CraigC.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

<!-- Content_END -->
28 changes: 28 additions & 0 deletions content/CraigC/25.md
Original file line number Diff line number Diff line change
@@ -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是新合约构造函数的参数。
15 changes: 15 additions & 0 deletions content/CraigC/26.md
Original file line number Diff line number Diff line change
@@ -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。
Loading