Solidity

时间:2018-01-12 04:47:12

标签: ethereum solidity ether

任何人都可以向我解释address(0)在Solidity中的含义吗?我在文档中找到了以下内容,但它对我来说并不合理:

  

如果目标帐户是零帐户(地址为0的帐户),则该事务会创建新合同。如前所述,该合同的地址不是零地址,而是从发送方及其发送的交易数量(“nonce”)得出的地址。这种合同创建事务的有效负载被认为是EVM字节码并被执行。此执行的输出将永久存储为合同代码。这意味着,为了创建合同,您不会发送合同的实际代码,而是实际返回该代码的代码。

http://solidity.readthedocs.io/en/develop/introduction-to-smart-contracts.html?highlight=address(0)#index-8

2 个答案:

答案 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 的编码。