(转)以太坊(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的一半。
继续翻看地址,可以发现有矿池发起的付款交易,比如这几个交易:
- SparkPool:0x1920b021d6e3d637bbc72df4ea4f40032409fffb1dfa2de2e74cf009ffb08c06
- Ethermine:0x6d3aade929a4bdadeb63db821e207d4a412999d4e1e0a54f09b2228f6a41e1d3
- Nanopool:0x2c36ed4c8c8f43b538d3686812180f65f8d38f4846207371767ba5ce78f56947
即使在矿池挖矿已经成为主流的今天,依然有小白忘记给矿池提供正确的收款地址,竹篮打水一场空,好在这种情况涉及的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超过上限而执行失败:
- 0x96a8fa2c57989accee439c9cfab12408685e365c092f56868051d6236f1a4120
- 0x7c7c9c369057554d7bec65847a2dd8fb1d1629e274cec4a20af8d1ee7d1ab186
一个智能合约因为非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一旦进入这样的地址,就永远不能再转出。黑洞,是一个只进不出的天体,即使光都不能逃脱,黑洞地址的行为与黑洞很像,因而得名。
现在明白为什么这个全零地址没有任何转出交易了么?
因为这个地址根本没人知道私钥。