Solidity 中的地址(0)是什么

问题描述 投票:0回答:4

谁能给我解释一下 Solidity 中的

address(0)
是什么?我在文档中找到了以下内容,但对我来说并没有真正意义:

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

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

ethereum solidity ether
4个回答
49
投票

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

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”时。


12
投票

合约创建交易的“to”字段设置为零地址(意思是

0x00...000
)实际上并不正确。这是一个很容易犯的错误(我也犯过),因为许多资源中都是这样描述的。

您从 Solidity 文档中引用的段落已更新以说明这一点:

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

所以你可以看到他们在某个时候意识到收件人字段应该为空。我实际上查看了序列化的创建交易,发现那里有

0x80
,而不是 RLP-ed 零地址。

事实上,

0x80
空字节数组的RLP编码,这就是黄皮书所说的合约创建的接收者:

地址哈希 $T_t$ 略有不同:它要么是 20 字节 地址哈希,或者在合约创建交易的情况下 (因此形式上等于 ∅),它是 RLP 空字节序列并且 因此是 $B_0$

的成员

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

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

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


0
投票

Address-zero(0) 表示零地址或空地址。它是一个地址值,表示不存在有效的以太坊地址,并用作 Solidity 中地址的初始/默认值。 看起来像这样:

0x0000000000000000000000000000000000000000


0
投票

它只是零地址(0x0000000000000000000000000000000000000000)。 零地址在以太坊生态系统中是硬编码的,它不是 EOA(外部拥有账户)。 从这个意义上说,它没有可供外部所有者使用的相关私钥。因此,如果您将任何余额发送到那里,没有人可以使用它。这就是为什么

address(0)
以编程方式用于刻录等。

您可以了解有关地址的更多信息https://medium.com/@ajaotosinserah/mastering-addresses-in-ethereum-5411ba6c3b0f

© www.soinside.com 2019 - 2024. All rights reserved.