Solidity中的address(0)是什么意思?

68
有人能解释一下Solidity中的address(0)是什么吗?我在文档中找到了以下内容,但它对我来说并不太清楚:
如果目标账户是零帐户(地址为0的帐户),交易将创建一个新的合约。如前所述,该合约的地址不是零地址,而是从发送者及其发送的交易数量(“nonce”)派生的地址。这种合约创建事务的有效负载被视为EVM字节码并执行。此执行的输出永久存储为合约的代码。这意味着为了创建一个合约,您不会发送实际的合约代码,而是发送返回该代码的代码。
来源:http://solidity.readthedocs.io/en/develop/introduction-to-smart-contracts.html?highlight=address(0)#index-8
4个回答

49

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

每个以太坊交易,无论是两个外部账户之间的转账,还是执行合同代码的请求,或者是请求部署新合同,都以相同的方式进行编码。原始交易对象将类似于以下内容:

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

如果to不是'0x0',则该请求将导致向地址转移以太币(如果value非零),并执行data字段编码的函数。请记住,地址可以是合同或外部帐户。

to地址是零地址时,将通过执行data中的代码创建新的合约(这就是所谓的“返回代码的代码”)。新创建的合约的地址在技术上事先已知,因为它基于发送者的地址和当前nonce。在挖掘后,该地址成为合约的官方地址。

想要了解Ethereum交易的详细信息,请查看此博客文章

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


15
address(0)也是您发送“烧毁”代币的地址。您可以在OpenZeppelin的BurnableToken.sol合约中看到这一点。 - cipherz
你认为对 address(0) 进行任意调用会导致合约部署吗?address(0).call(data) - k06a
使用Solidity代码语句address(0)是不同的。我没有尝试过,但我认为这样做不会起作用(这种方式似乎很奇怪)。如果我想在Solidity中使用字节码部署合约,我将使用汇编语言。 - Adam Kipnis
1
to 字段的所有内容都是错误的。这个答案需要进行大量修订。 - C S

12
实际上,合约创建交易的“to”字段并不设置为零地址(即0x00...000)。这是一个容易犯的错误(我也犯过),因为在许多资源中都是这样描述的。
你引用的来自Solidity文档的段落已经更新,声明如下:
“如果目标帐户未设置(交易没有收件人或收件人设置为null),则交易将创建一个新合约。如已经提到的那样,该合约的地址不是零地址,而是从发送方及其发送的交易数(“nonce”)派生的地址。”
所以你可以看到他们在某个时候意识到应该为空的收件人字段。实际上,我已经查看了序列化的创建交易,并找到了0x80而不是RLP-ed零地址。
事实上,0x80是一个空字节数组的RLP编码,这就是黄皮书中所述的一个合约创建的收件人为空字节序列的原因。

就像我之前所说的那样,这是一个常见的困惑点。在这方面,这个GitHub PR回滚了一个错误的“修复”测试,令人感到有趣。它有以下评论:

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

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


0
这只是一个简单的零地址(0x0000000000000000000000000000000000000000)。 零地址在以太坊生态系统中是硬编码的,它不是一个外部拥有的账户(EOA)。 从这个意义上说,它没有相关的私钥供外部所有者使用。因此,如果你向那里发送任何余额,没有人可以使用它。这就是为什么address(0)在燃烧等方面被程序化使用的原因。
你可以在https://medium.com/@ajaotosinserah/mastering-addresses-in-ethereum-5411ba6c3b0f了解更多关于地址的信息。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

0
地址零(0)代表零地址或空地址。它是一个地址值,表示没有有效的以太坊地址,并且被用作Solidity中地址的初始/默认值。 它的样子是这样的:0x0000000000000000000000000000000000000000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接