什么是Solidity中的地址(0)

piz*_*r0b 27 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

Ada*_*nis 20

在以太坊交易中,零账户只是用于表示正在部署新合同的特殊情况.字面意思是'0x0'设置为to原始事务中的字段.

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

transaction = {
  nonce: '0x0', 
  gasLimit: '0x6acfc0', // 7000000
  gasPrice: '0x4a817c800', // 20000000000
  to: '0x0',
  value: '0x0',
  data: '0xfffff'
};
Run Code Online (Sandbox Code Playgroud)

如果to设置为"0x0"以外的其他值,则此请求将导致将ether传输到该地址(如果value为非零),并执行该data字段中编码的函数.请记住,地址可以是合同或外部帐户.

to地址是零地址时,将通过执行代码创建新的合同data(这是"返回代码的代码"的含义).新创建的合同的地址在技术上是预先知道的,因为它基于发件人的地址和它的当前现时.该地址成为采矿后合同的官方地址.

有关以太坊交易的详细介绍,请查看此博客文章.

注意:还有实际的Solidity代码语句address(0),它是类型变量的初始值address.但是,您发布的文档特别指的是当to事务中的帐户地址设置为"0x0"时.

  • ```address(0)```也是你'发送'令牌的地址.你可以在openzeppelin的BurnableToken.sol合约中看到这个. (2认同)

C S*_*C S 12

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

\n

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

\n
\n

如果未设置目标帐户(交易没有\n收件人或收件人设置为空),\n交易将创建\n新合约。如前所述,该合约的地址不是零地址,而是从发送方及其发送的交易数量(\xe2\x80\x9cnonce\xe2\x80\x9d)派生的地址。

\n
\n

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

\n

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

\n
\n

地址哈希 $T_t$ 略有不同:它要么是 20 字节\n地址哈希,要么是合约创建交易\n(因此形式上等于 \xe2\x88\x85),它是RLP 空字节序列以及 $B_0$ 的成员

\n
\n

正如我所说,这是造成混乱的常见原因。从这个意义上来说,这个GitHub PR回滚了一个错误的“固定”测试是很有趣的。它有评论:

\n
\n

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

\n

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

\n
\n