• (转)以太坊(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

  • 相关阅读:
    内存分配机制
    typedef struct 和struct的区别
    imshow
    #include<string.h>和#include<string>
    Internal Errors
    TStopWatch 基本知识
    string 新常量 Empty
    System 这四个单元多用用(近期)
    对象释放三种方法对比:Free --> FreeAndNil() --> DisposeOf()
    程序性能优化的3个级别
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/8547874.html
Copyright © 2020-2023  润新知