任何人都可以向我解释address(0)
在Solidity中的含义吗?我在文档中找到了以下内容,但它对我来说并不合理:
如果目标帐户是零帐户(地址为0的帐户),则该事务会创建新合同。如前所述,该合同的地址不是零地址,而是从发送方及其发送的交易数量(“nonce”)得出的地址。这种合同创建事务的有效负载被认为是EVM字节码并被执行。此执行的输出将永久存储为合同代码。这意味着,为了创建合同,您不会发送合同的实际代码,而是实际返回该代码的代码。
答案 0 :(得分:20)
在以太坊交易中,零账户只是一个特殊情况,用于表示正在部署新合同。字面意思是“0x0”设置为原始事务中的to
字段。
每个以太坊交易,无论是两个外部账户之间的转移,执行合同代码的请求,还是部署新合同的请求,都以相同的方式进行编码。原始事务对象看起来像这样:
transaction = {
nonce: '0x0',
gasLimit: '0x6acfc0', // 7000000
gasPrice: '0x4a817c800', // 20000000000
to: '0x0',
value: '0x0',
data: '0xfffff'
};
如果将to
设置为“0x0”以外的其他值,则此请求将导致将ether转移到该地址(如果value
非零),并执行{中编码的函数{1}}字段。请记住,地址可以是合同或外部帐户。
当data
地址为零地址时,将通过执行to
中的代码创建新合同(这是“返回代码的代码”)。新创建的合同的地址在技术上是预先知道的,因为它基于发件人的地址和它的当前现时。该地址成为采矿后合同的正式地址。
有关以太坊交易的详细介绍,请查看此blog post。
注意:还有实际的Solidity代码语句data
,它是address(0)
类型变量的初始值。但是,您发布的文档特别指的是事务中的address
帐户地址设置为“0x0”。
答案 1 :(得分:0)
合约创建交易的“to”字段设置为零地址(意思是0x00...000
)实际上并不是真的。这是一个很容易犯的错误(我也犯过),因为它在许多资源中都是这样描述的。
您从 Solidity 文档中引用的段落已更新以说明这一点:
<块引用>如果目标账户没有设置(交易没有 收件人或收件人设置为空),交易创建一个 新合同。如前所述,该合约的地址是 不是零地址,而是来自发件人的地址及其 发送的交易数量(“nonce”)。
所以你可以看到他们在某个时候意识到收件人字段应该是空的。我实际上查看了序列化的创建交易,并在那里发现了 0x80
而不是 RLP 编码的零地址。
实际上,0x80
是一个空字节数组的 RLP 编码,这就是 Yellow Paper 声明的是合约创建的接收者:
地址散列 $T_t$ 略有不同:它要么是一个 20 字节的 地址哈希,或者,如果是合约创建交易 (因此形式上等于 ∅),它是 RLP 空字节序列和 因此 $B_0$
的成员正如我所说,这是混淆的常见来源。在这种情况下,这个 GitHub PR 回滚错误的“固定”测试很有趣。它有评论:
<块引用>0 的 RLP 编码是空字节数组的编码,所以 0x80 是正确的。
0x00 是长度为 1 的字节数组的编码,其中包含一个字节 0,而不是 整数 0 的编码。