【问题标题】:What is address(0) in SoliditySolidity 中的地址(0)是什么
【发布时间】:2018-06-21 12:42:39
【问题描述】:

谁能向我解释一下 address(0) 在 Solidity 中是什么?我在文档中找到了以下内容,但这对我来说真的没有意义:

如果目标账户是零账户(地址为0的账户),则交易创建一个新合约。如前所述,该合约的地址不是零地址,而是从发送者及其发送的交易数量(“nonce”)派生的地址。这种合约创建交易的有效负载被视为 EVM 字节码并被执行。此执行的输出作为合约代码永久存储。这意味着,为了创建合约,您无需发送合约的实际代码,而是发送返回该代码的实际代码。

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

【问题讨论】:

    标签: ethereum solidity ether


    【解决方案1】:

    在以太坊交易中,零账户只是一种特殊情况,用于指示正​​在部署新合约。在原始事务中,它实际上是设置为 to 字段的“0x0”。

    每个以太坊交易,无论是两个外部账户之间的转账、执行合约代码的请求,还是部署新合约的请求,都以相同的方式进行编码。原始交易对象看起来像这样:

    transaction = {
      nonce: '0x0', 
      gasLimit: '0x6acfc0', // 7000000
      gasPrice: '0x4a817c800', // 20000000000
      to: '0x0',
      value: '0x0',
      data: '0xfffff'
    };
    

    如果to 设置为“0x0”以外的值,此请求将导致将以太币传输到该地址(如果value 非零),并执行编码在data 字段中的函数。请记住,地址可以是合约或外部帐户。

    to地址是零地址时,将通过执行data中的代码创建一个新的合约(这就是“返回代码的代码”的意思)。新创建的合约的地址在技术上是事先知道的,因为它基于发送者的地址并且是当前的随机数。该地址在挖矿后成为合约的官方地址。

    如需深入了解以太坊交易,请查看blog post

    注意:还有实际的 Solidity 代码语句 address(0),它是 address 类型变量的初始值。但是,您发布的文档专门指的是当交易中的to 帐户地址设置为“0x0”时。

    【讨论】:

    • address(0) 也是您发送“已销毁”令牌的地址。你可以在 openzeppelin 的 BurnableToken.sol 合约中看到这一点。
    • 你认为对address(0)进行任意调用会导致合约部署吗? address(0).call(data)
    • 使用 Solidity 代码语句 address(0) 是不同的。我还没有尝试过,但是不,我认为这行不通(以这种方式尝试似乎很奇怪)。如果我想使用字节码在 Solidity 中部署合约,我会使用程序集。
    【解决方案2】:

    合约创建交易的“to”字段设置为零地址(意思是0x00...000)实际上并不正确。这是一个容易犯的错误(我也犯过),因为许多资源中都这样描述。

    您从 Solidity 文档中引用的段落已更新为:

    如果没有设置目标账户(交易没有 收件人或收件人设置为空),交易创建一个 新合同。如前所述,该合约的地址是 不是零地址,而是从发送者及其 发送的交易数量(“nonce”)。

    因此,您可以看到他们在某些时候意识到收件人字段应该为空。我实际上查看了序列化的创建事务,并在那里找到了0x80,而不是 RLP-ed 零地址。

    事实上,0x80 空字节数组的 RLP 编码,也就是 Yellow Paper 声明的合约创建的接收者:

    地址哈希 $T_t$ 略有不同:它要么是 20 字节 地址哈希,或者,如果是合约创建交易 (因此形式上等于∅),它是 RLP 空字节序列和 因此 $B_0$ 的成员

    正如我所说,这是一个常见的混淆来源。在这种情况下,这个GitHub PR 回滚错误的“固定”测试很有趣。它有评论:

    0的RLP编码是空字节数组的编码,所以0x80是正确的。

    0x00 是长度为 1 的字节数组的编码,其中包含一个字节 0,而不是 整数0的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多