最近,欧意交易所app官方下载一位小伙伴向我咨询问题,说他发现了一个诡异的现象。 这究竟是怎么回事儿呢? 查看区块链后,发现还是蛮有趣的,且听我慢慢道来。 神秘而富有的地址用在线的区块链浏览器查看下这个地址,我勒个去,居然有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一旦进入这样的地址,就永远不能再转出。黑洞,是一个只进不出的天体,即使光都不能逃脱,黑洞地址的行为与黑洞很像,因而得名。 现在明白为什么这个全零地址没有任何转出交易了么? 因为这个地址根本没人知道私钥。 (责任编辑:) |