谁能给我解释一下 Solidity 中的
address(0)
是什么?我在文档中找到了以下内容,但对我来说并没有真正意义:
如果目标账户是零账户(地址为0的账户),则交易创建一个新合约。如前所述,该合约的地址不是零地址,而是从发送方及其发送的交易数量(“随机数”)派生的地址。这种合约创建交易的有效负载被视为 EVM 字节码并被执行。此执行的输出将作为合约代码永久存储。这意味着为了创建合约,您不需要发送合约的实际代码,而是发送返回该代码的代码。
在以太坊交易中,零账户只是一种特殊情况,用于指示正在部署新合约。它实际上是设置为原始交易中的
to
字段的“0x0”。
每笔以太坊交易,无论是两个外部账户之间的转账、执行合约代码的请求,还是部署新合约的请求,都以相同的方式编码。原始交易对象看起来像这样:
transaction = {
nonce: '0x0',
gasLimit: '0x6acfc0', // 7000000
gasPrice: '0x4a817c800', // 20000000000
to: '0x0',
value: '0x0',
data: '0xfffff'
};
如果
to
设置为“0x0”以外的其他值,则此请求将导致将以太币传输到该地址(如果value
非零),并执行data
字段中编码的函数。请记住,该地址可以是合约,也可以是外部账户。
当
to
地址为零地址时,将通过执行data
中的代码创建一个新合约(这就是“返回代码的代码”的含义)。新创建的合约的地址在技术上是预先已知的,因为它基于发送者的地址和当前的随机数。该地址挖矿后成为合约的正式地址。
要详细了解以太坊交易,请查看这篇博客文章。
注意:还有实际的 Solidity 代码语句
address(0)
,它是 address
类型的变量的初始值。然而,您发布的文档具体指的是交易中的 to
帐户地址设置为“0x0”时。
合约创建交易的“to”字段设置为零地址(意思是
0x00...000
)实际上并不正确。这是一个很容易犯的错误(我也犯过),因为许多资源中都是这样描述的。
您从 Solidity 文档中引用的段落已更新以说明这一点:
如果未设置目标账户(交易没有 接收者或接收者设置为空),交易创建一个 新合同。如前所述,该合约的地址是 不是零地址,而是从发送者及其地址派生的地址 发送的交易数量(“随机数”)。
所以你可以看到他们在某个时候意识到收件人字段应该为空。我实际上查看了序列化的创建交易,发现那里有
0x80
,而不是 RLP-ed 零地址。
事实上,
0x80
是空字节数组的RLP编码,这就是黄皮书所说的合约创建的接收者:
地址哈希 $T_t$ 略有不同:它要么是 20 字节 地址哈希,或者在合约创建交易的情况下 (因此形式上等于 ∅),它是 RLP 空字节序列并且 因此是 $B_0$
的成员
正如我所说,这是造成混乱的常见原因。在这种情况下,这个 GitHub PR 回滚一个错误的“固定”测试很有趣。它有评论:
RLP编码0是空字节数组的编码,所以0x80是正确的。
0x00 是长度为 1 的字节数组的编码,其中包含一个字节 0,而不是 整数 0 的编码。
Address-zero(0) 表示零地址或空地址。它是一个地址值,表示不存在有效的以太坊地址,并用作 Solidity 中地址的初始/默认值。 看起来像这样:
0x0000000000000000000000000000000000000000
。
它只是零地址(0x0000000000000000000000000000000000000000)。 零地址在以太坊生态系统中是硬编码的,它不是 EOA(外部拥有账户)。 从这个意义上说,它没有可供外部所有者使用的相关私钥。因此,如果您将任何余额发送到那里,没有人可以使用它。这就是为什么
address(0)
以编程方式用于刻录等。
您可以了解有关地址的更多信息https://medium.com/@ajaotosinserah/mastering-addresses-in-ethereum-5411ba6c3b0f