(转)以太坊(Ethereum)全零地址(0x000000...)揭秘

最近,一位小伙伴向我咨询问题,说他发现了一个诡异的现象。
以太坊的区块链中居然有全是0的地址:0x0000000000000000000000000000000000000000

这究竟是怎么回事儿呢?

查看区块链后,发现还是蛮有趣的,且听我慢慢道来。

 

神秘而富有的地址

用在线的区块链浏览器查看下这个地址,我勒个去,居然有7228个ETH,价值500多w刀呢。

这究竟是何方土豪?这些ETH又从何而来呢?

 

创世区块

之前的文章《以太坊(Ethereum)创世揭秘》中曾经提到过,ETH最主要的来源并不是挖矿,而是当年众筹时发行的。

即使在以太坊正式发布近三年后的今天,创世区块中发行的7200w个ETH依然占到73.4%。

那么,这个全零地址中的ETH,是不是来自创世区块中发行的ETH呢?

创世区块中发行的ETH的分配情况,可以在这里找到:genesis_block.json,这个全零的地址并不在其中。

然而,解析下创世区块,可以发现,挖出创世区块的miner,居然是这个全零的地址。

{ difficulty: '17179869184',
  extraData: '0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa',
  gasLimit: 5000,
  gasUsed: 0,
  hash: '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3',
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
  miner: '0x0000000000000000000000000000000000000000',
  mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
  nonce: '0x0000000000000042',
  number: 0,
  parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
  receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
  sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
  size: 540,
  stateRoot: '0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544',
  timestamp: 0,
  totalDifficulty: '17179869184',
  transactions: [],
  transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
  uncles: [] }

创世区块不是被挖出来的,它是被人为创建出来,并作为整条区块链的起点。

既然不是被挖出来的,使用全零的地址作为占位符也是合理的。

创世区块因为不是挖矿所得,无人为此消耗算力,自然也不会有任何区块奖励。

转了一圈,这个全零地址中的ETH和创世区块并无关系。

 

挖矿

除了创世区块中发行的ETH,新的ETH只有一种产生途径,那就是挖矿。

为了更加精确的计算,以下单位均使用ETH的最小单位Wei,关于单位问题,可以参看这里《以太币(Ether)的单位》。

搜索下miner为这个全零地址的区块,还真不少呢。

这个全零地址共挖出主链区块94个:

  • 高度:区块奖励
  • 5305 : 5000000000000000000wei
  • 5662 : 5000000000000000000wei
  • 5748 : 5000000000000000000wei
  • 6011 : 5000000000000000000wei
  • 6133 : 5000000000000000000wei
  • 6320 : 5000000000000000000wei
  • 6398 : 5156250000000000000wei
  • 6424 : 5000000000000000000wei
  • 6505 : 5000000000000000000wei
  • 6515 : 5000000000000000000wei
  • 6801 : 5000000000000000000wei
  • 6818 : 5000000000000000000wei
  • 6822 : 5000000000000000000wei
  • 6845 : 5000000000000000000wei
  • 6884 : 5000000000000000000wei
  • 6935 : 5000000000000000000wei
  • 6937 : 5000000000000000000wei
  • 6968 : 5000000000000000000wei
  • 6973 : 5000000000000000000wei
  • 6985 : 5000000000000000000wei
  • 6994 : 5000000000000000000wei
  • 7022 : 5000000000000000000wei
  • 7129 : 5000000000000000000wei
  • 7158 : 5000000000000000000wei
  • 7252 : 5000000000000000000wei
  • 7363 : 5000000000000000000wei
  • 7485 : 5000000000000000000wei
  • 7997 : 5000000000000000000wei
  • 8506 : 5000000000000000000wei
  • 8579 : 5000000000000000000wei
  • 8618 : 5156250000000000000wei
  • 8636 : 5000000000000000000wei
  • 8648 : 5000000000000000000wei
  • 8671 : 5000000000000000000wei
  • 8701 : 5000000000000000000wei
  • 8737 : 5000000000000000000wei
  • 8847 : 5000000000000000000wei
  • 8877 : 5000000000000000000wei
  • 8976 : 5000000000000000000wei
  • 8993 : 5000000000000000000wei
  • 11326 : 5000000000000000000wei
  • 32279 : 5000000000000000000wei
  • 92431 : 5002296693408107000wei
  • 95794 : 5000000000000000000wei
  • 97008 : 5000000000000000000wei
  • 115884 : 5001180709294772000wei
  • 308822 : 5001050000000000000wei
  • 957325 : 5001050000000000000wei
  • 959897 : 5009870000000000000wei
  • 960905 : 5000000000000000000wei
  • 961043 : 5156250000000000000wei
  • 964974 : 5001050000000000000wei
  • 971321 : 5003298350000000000wei
  • 971327 : 5006300000000000000wei
  • 971361 : 5000000000000000000wei
  • 971605 : 5000000000000000000wei
  • 971711 : 5004064900000000000wei
  • 971749 : 5006500640000000000wei
  • 971828 : 5156250000000000000wei
  • 972108 : 5012613796000000000wei
  • 972218 : 5003150000000000000wei
  • 972396 : 5000000000000000000wei
  • 972406 : 5002520000000000000wei
  • 972513 : 5001050000000000000wei
  • 972547 : 5002100000000000000wei
  • 972791 : 5001844336000000000wei
  • 972820 : 5000000000000000000wei
  • 972830 : 5000000000000000000wei
  • 973090 : 5117344644000000000wei
  • 973251 : 5012370584000000000wei
  • 973259 : 5000000000000000000wei
  • 973487 : 5156250000000000000wei
  • 973507 : 5012982424000000000wei
  • 977370 : 5156250000000000000wei
  • 977372 : 5002202650000000000wei
  • 977869 : 5039743172000000000wei
  • 977896 : 5000000000000000000wei
  • 978104 : 5001062863636350882wei
  • 978282 : 5003570000000000000wei
  • 978398 : 5002100000000000000wei
  • 978537 : 5001050000000000000wei
  • 978936 : 5000000000000000000wei
  • 981784 : 5001050000000000000wei
  • 982548 : 5001050000000000000wei
  • 986786 : 5158350000000000000wei
  • 991669 : 5000000000000000000wei
  • 1002999 : 5001050000000000000wei
  • 1008538 : 5009870000000000000wei
  • 1036182 : 5003150000000000000wei
  • 1038477 : 5002520000000000000wei
  • 1039916 : 5001050000000000000wei
  • 1043336 : 5002100000000000000wei
  • 1045804 : 5015757500000000000wei
  • 1045864 : 5003788950000000000wei

其中区块奖励由三部分组成:固定奖励、包含叔块奖励、手续费。

 

这个全零地址共挖出叔块2个:

  • 叔块Hash:叔块奖励
  • 0xe1cdea3312b9d5bbc12a75885716a1791ab4afa1e8936718e40241875cb54307 : 3750000000000000000wei
  • 0x1b86df4a92f90d2ebf850cabbb2890c1a6e6a321d878cbaead7f7fd1eda18866 : 3750000000000000000wei

通过挖矿,这个全零地址共获得ETH的总数为:478889602212339229882wei。

 

为什么会有人使用全零地址挖矿?

仔细观察我们会发现,这个全零地址挖出的最后一个区块的高度为1045864。

这个区块被挖出的时间大约是北京时间2016年2月23日10:31:46。

这个时间距今已经两年多了,当时距以太坊正式发布仅仅半年多,以太坊仅为少数人所知。

再来观察下区块1045864的难度值:13,869,188,715,132,大约14T。

这个难度下,即使只有一张1060显卡,平均也仅需要8天即可发现一个区块,如果是一台矿机的话,这个时间将会缩短到数小时到1天。

在此之前挖出的区块,由于难度值更低,需要的时间更短。

全零地址最早挖出的一个区块是5305,难度值仅有199,485,740,316,不到0.2T,还是1060显卡为例,仅需要不到3小时即可发现一个区块。

那时候,区块是如此容易挖掘,几乎任何一台有独立显卡的中端PC,都可以挖到区块。

于是,很多人本着试试看的心态,使用自家的普通PC尝试挖掘,几乎0成本。

这群人中,有相当一部分是仅会复制粘贴的小白,悲催的事儿来了,他们忘记设置收款地址。有些专业矿工在调试机器稳定性时,也会出于方便,没有对挖矿软件进行配置。

部分钱包软件在solo挖矿时,如果不设置收款地址,就会默认使用全零地址挖矿,比如 ethereum/cpp-ethereum 就是这样。

这也就解释了,为什么会有如此多的区块是全零地址挖到的。

后来,区块挖掘越来越难,ETH也变得越来越有价值,仅靠普通PC已经不太可能挖到区块了。这时还在挖矿的人,多半是投资者或者极客,他们或有技术支持人员,或自己就是技术人员,自然不会犯这种低级错误。再后来,挖矿难度进一步提升,矿池成为主流。矿池由更加专业的团队运营,忘了填收款地址这种事儿,根本不可能发生在矿池身上。

这也就解释了,为什么全零地址在最近两年中,再也没挖到区块。

 

交易

对以太坊来说,挖矿是在创世区块后,产生ETH的唯一方式。

但是,对一个钱包地址来说,它获得ETH的方式还可以是交易。交易虽然不能创造更多ETH,但是却可以增加/减少一个钱包地址的余额,本质上是ETH的流动。

让我们来看看,和这个全零地址相关的交易有哪些。

扫描整个区块链,到目前为止,共有757个交易和这个全零地址关联。

为了不让这篇文章变得太长,我只挑一些有代表性的交易,毕竟700多笔交易粘贴过来,实在不方便阅读。

令人惊奇的是,这个地址只是输入交易,从来不输出任何交易,这是什么原因呢?这个我们等下再来讨论。

先来看两个土豪交易:

在这个交易中,0x3F98e477a361F777DA14611a7e419A75Fd238b6b 转账2000ETH。

在这个交易中,0xF5437e158090B2a2d68f82b54a5864B95dD6DBea 转账1000ETH。

这两个大户加在一起,就几乎占到了全零地址中ETH的一半。

继续翻看地址,可以发现有矿池发起的付款交易,比如这几个交易:

即使在矿池挖矿已经成为主流的今天,依然有小白忘记给矿池提供正确的收款地址,竹篮打水一场空,好在这种情况涉及的ETH非常少,损失不大。

矿池也很遵守规则,没有把这些收益据为己有,而是忠实的转入这个全零的地址,还是应该点个赞的。

通过在757个交易,全零地址共获得了4568520302798110070662wei。

挖矿加上交易获得的ETH加在一起是多少呢?

478889602212339229882(挖矿)+4568520302798110070662(交易)

= 5047409905010449300544wei

大约是5047.41ETH,好像和之前查到的7000多个ETH差距很大啊。

这是怎么回事儿呢?

别着急,下面我们就来看看什么叫“人在家中坐,币从天上来”。

 

两种账户

以太坊平台中的账户分为两类:

  • 外部拥有的账户(EOA)
  • 合约账户

平时我们转账交易用的多是EOA,在一些在线区块链浏览器中,这两种账户会有不同的标记。

这是EOA:

 

这是合约账户:

发现区别了吗?EOA显示为“Ethereum Account”,合约账户显示为“Ethereum Contract”。至于二者的区别和联系,我们有时间再讲。

 

内部交易

通常我们的转账都是发生在两个EOA之间的,A把ETH转给B。

如果出现了智能合约C在执行的过程中向EOA转账了ETH,这种情况就称为内部交易。

为什么叫内部交易呢?

因为这种转账其实是智能合约执行的结果,并不是真实存在的交易,也不能直接通过查询交易的方式找到,非要亲自执行下智能合约,才能知道结果。

与这个全零地址相关的内部交易共有370个。

其中两个智能合约因为Gas超过上限而执行失败:

一个智能合约因为非Gas不足的原因执行失败:

最终有效的只有367个。

我们来看一个涉及内部交易的例子:

0x9e14d0adbce4a52f79df0b29bed6d47b966bd27a76cccbcc538021ed79f591e4

可以看到,这个交易是EOA (0x2504a2f15Bd951291b2445F1660e5132A990402E) 对智能合约 (0x122De6B3635191aE7801235331bcAEC325eCB5B0) 的调用。

表面上和这个全零地址没有任何关系,但是智能合约执行过程中,内部会向这个全零地址转账0.001ETH。

367个有效的内部交易,共计向全零地址转入了2180953783303118115604wei。

 

现在我们来汇总一下:

挖矿+交易+内部交易

=478889602212339229882+4568520302798110070662+2180953783303118115604

=7228363688313567416148wei

=7228.363688313567416148ETH

赶紧到前面的截图里看一下,嗯,结果一样。

看来这个全零地址的“巨额财产来源不明罪”可以洗清了。

 

黑洞地址

让我们先来回顾一下,一个以太坊账户是怎么创建的。

首先成一个私钥,使用这个私钥导出公钥,公钥经过Hash变成账户地址,或者叫钱包地址。

这个过程可以用非常简短的一段小脚本完成:

(PS:如果你没有计算机相关的基础知识,完全不必担心,忽略这段代码就好,下面所有的内容都是人类语言)

#!/usr/bin/python3

# pip install ecdsa
# pip install pysha3

from ecdsa import SigningKey, SECP256k1
import sha3

keccak = sha3.keccak_256()

priv = SigningKey.generate(curve=SECP256k1)
pub = priv.get_verifying_key().to_string()

keccak.update(pub)
address = keccak.hexdigest()[24:]

print("Private key:", priv.to_string().hex())
print("Public key: ", pub.hex())
print("Address:     0x" + address)

 

以太坊中,接收交易时,只需要提供这个Hash后的钱包地址即可,而发起交易时,必须要使用私钥签名。这也就决定了,想花费一个账户里的钱,你必须拥有私钥。

如上图所示,私钥可以导出公钥,公钥可以hash成钱包地址,也就是绿色的部分,这些计算是很容易完成的。

但是,这两个过程都是不可逆的,或者说是极难逆向计算的,也就是图中的红色部分。

以目前人类的技术,只能使用穷举法求解,不断的在一个极度巨大的空间中搜索,几乎是不可能完成的任务。

因此,如果只知道公钥或者钱包地址,是几乎不可能得到私钥的,没有私钥,这个地址上的ETH就永远不能转账,也就被锁在了这个地址上。

私钥丢失或者无法确定私钥的地址,就被称为黑洞地址,因为ETH一旦进入这样的地址,就永远不能再转出。黑洞,是一个只进不出的天体,即使光都不能逃脱,黑洞地址的行为与黑洞很像,因而得名。

现在明白为什么这个全零地址没有任何转出交易了么?

因为这个地址根本没人知道私钥。

转自:https://zhuanlan.zhihu.com/p/34363341

posted @ 2018-03-12 10:29  人艰不拆_zmc  阅读(4524)  评论(0编辑  收藏  举报