比特币区块链中的秘密

 比特币以其去中心化、开放、安全等特点,正在受到越来越多的人们的支持,在区块链中,隐藏了很多有趣的秘密,现在就让我们来挖掘一下其中有趣的故事。

比特币的基本单位

比特币区块链可以支持一个比特币分割到小数点后8位,也就是说比特币最小单位是0.00000001BTC,这个最小的单位就被称为1中本聪(简称聪),这也是比特币的基本单位,不会有比1聪更小的分割了。为什么叫中本聪呢?因为比特币的创始人化名中本聪,为了纪念他的这个划时代的发明,就用他的名字当单位了。很多物理量也都是用的科学家的名字,比如伏特(V)、安培(A)、欧姆(Ω),不过他们都是在死后才变成单位的。不知道中本聪这哥们在还活着的时候就变成单位,是一种什么样的体验。

常用的单位还有这些:

  • 1比特币(Bitcoins,BTC)= 1BTC
  • 1比特分(Bitcent,cBTC)= 0.01BTC
  • 1毫比特(Milli-Bitcoins,mBTC)= 0.001BTC
  • 1微比特(Micro-Bitcoins,μBTC或uBTC)=0.000001BTC
  • 1聪(satoshi)= 0.00000001BTC

天价手续费

比特币区块链之所以有那么多矿工去挖矿,是因为可以获得高额的收益。这些收益来自于两部分:

  • 每个区块固定的造币奖励,每4.5年减半,最开始是50BTC,现在是12.5BTC
  • 每个交易中的交易费

目前平均每个区块包含0.23BTC的交易费,当全部的2100w个比特币都诞生后,新的区块奖励将完全由交易费提供。

让我们找一个交易来看看。

 

 

每一笔交易都由“输入”和“输出”两部分组成,上图中左边就是输入,右边是输出。每一个输入必须是之前某一笔交易的输出,并且一个输出只能成为之后一笔交易的输入,也就是说一个输入只能使用一次,这也就避免了把比特币花费两次。现在问题来了,输入的比特币地址1CpyFnx7LBjbedMQ2XkFz1tTh76EoSCVcr中有0.3714BTC,并且只能花一次,我要是不想一次花完怎么办呢?很简单,你只要在输出中,把剩下的比特币再转给自己控制的地址就好了。这笔交易中,主人想转给1EioxyXFQSsuguxq9rYcjUN6zZN7Y1Dj7U地址0.14843BTC,并把剩下的0.2214857BTC转回给自己。把输入交易中多余的比特币转回给自己,这种做法就叫找零

不知道大家发现了没有,左边输入0.3714BTC,右边的输出总和却只有0.3699157BTC,之间差了0.0014843BTC,这个差额就是交易费。矿工如果打包了这个交易,就可以得到这0.0014843BTC的交易费。通过支付交易费的方式,可以使自己的交易得到较高的优先级,毕竟矿工都是逐利的,现在交易费只占矿工收益的很小一部分,即使不支付交易费,也会有矿工处理交易,只是优先级低,处理得慢一些,要多等一会儿。

高潮来了,有一位土豪想转账0.0001BTC,并支付了291.2409BTC的交易费,价值超过600w人民币!

这个轰动事件发生在比特币区块高度#409008(2016-04-26 14:15:22),打包交易的矿池很开心的接受了这从天而降的馅饼,并且没!有!退!还!凭本事收的钱,干嘛要还。

 

 

 

 

类似的事件还发生在比特币区块高度#254642,有人不小心支付了200BTC的交易费,只是那一次矿池ASICMiner很慷慨的退还了这200BTC,点个赞。

 

 

 

 

这些天价交易费大多数是在构建交易时不小心忘记了找零,或者自己编写的构建交易的程序出现bug造成的,交易一旦签名并广播出去,就很难再撤销了,可不是每一个矿池都如此慷慨肯退还多余的手续费哦。让我们为支付了将近300BTC交易费的1CpyFnx7LBjbedMQ2XkFz1tTh76EoSCVcr默哀五秒钟。

 

1844亿比特币

众所周知,比特币的数量上限是2100w个,怎么会有1844亿呢?

原来在早期的比特币代码中,存在一个漏洞。让我们看看当时的程序是怎么检查一个交易中关于金额是否有效的:

  1. 每一个输出项的金额>=0
  2. 输出项的金额之和<=输入项的金额之和

比特币可以精确到小数点后8位,于是记录金额的数据类型是INT64,单位是聪。于是黑客很机智的想到了一个通过溢出来使自己获得超多比特币的办法。具体发生了什么呢?

黑客构建了一个特殊的交易,它的输出是两笔金额都9223372036854276000(0x7ffffffffff85ee0)聪的交易。当执行前面所说的检查时,这两笔输出都满足第一项金额>=0的要求。当检查第二项时,问题来了。9223372036854276000+9223372036854276000的结果超出了INT64的表示范围,变成了-1000000聪,也就是-0.01BTC,输入项一定是正数,显然满足了第二条要求。就这样,这个明显不合理的金额,堂而皇之的进入了区块链。

好在比特币社区迅速行动起来,在5个小时内修复了漏洞,发布了0.3.10版本,并且废弃了这个区块。现在这个区块已经不存在于区块链中了,不过我还是找到了当时社区讨论的帖子和这个区块的内容。可以看到out中有两个92233720368.54277039BTC的输出。

{     "hash" : "0000000000790ab3f22ec756ad43b6ab569abf0bddeb97c67a6f7b1470a7ec1c",     "ver" : 1,     "prev_block" : "0000000000606865e679308edf079991764d88e8122ca9250aef5386962b6e84",     "mrkl_root" : "618eba14419e13c8d08d38c346da7cd1c7c66fd8831421056ae56d8d80b6ec5e",     "time" : 1281891957,     "bits" : 469794830,     "nonce" : 28192719,     "n_tx" : 2,     "tx" : [         {             "hash" : "012cd8f8910355da9dd214627a31acfeb61ac66e13560255bfd87d3e9c50e1ca",             "ver" : 1,             "vin_sz" : 1,             "vout_sz" : 1,             "lock_time" : 0,             "in" : [                 {                     "prev_out" : {                         "hash" : "0000000000000000000000000000000000000000000000000000000000000000",                         "n" : 4294967295                     },                     "coinbase" : "040e80001c028f00"                 }             ],             "out" : [                 {                     "value" : 50.51000000,                     "scriptPubKey" : "0x4F4BA55D1580F8C3A8A2C78E8B7963837C7EA2BD8654B9D96C51994E6FCF6E65E1CF9A844B044EEA125F26C26DBB1B207E4C3F2A098989DA9BA5BA455E830F7504 OP_CHECKSIG"                 }             ]         },         {             "hash" : "1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9",             "ver" : 1,             "vin_sz" : 1,             "vout_sz" : 2,             "lock_time" : 0,             "in" : [                 {                     "prev_out" : {                         "hash" : "237fe8348fc77ace11049931058abb034c99698c7fe99b1cc022b1365a705d39",                         "n" : 0                     },                     "scriptSig" : "0xA87C02384E1F184B79C6ACF070BEA45D5B6A4739DBFF776A5D8CE11B23532DD05A20029387F6E4E77360692BB624EEC1664A21A42AA8FC16AEB9BD807A4698D0CA8CDB0021024530 0x965D33950A28B84C9C19AB64BAE9410875C537F0EB29D1D21A60DA7BAD2706FBADA7DF5E84F645063715B7D0472ABB9EBFDE5CE7D9A74C7F207929EDAE975D6B04"                 }             ],             "out" : [                 {                     "value" : 92233720368.54277039,                     "scriptPubKey" : "OP_DUP OP_HASH160 0xB7A73EB128D7EA3D388DB12418302A1CBAD5E890 OP_EQUALVERIFY OP_CHECKSIG"                 },                 {                     "value" : 92233720368.54277039,                     "scriptPubKey" : "OP_DUP OP_HASH160 0x151275508C66F89DEC2C5F43B6F9CBE0B5C4722C OP_EQUALVERIFY OP_CHECKSIG"                 }             ]         }     ],     "mrkl_tree" : [         "012cd8f8910355da9dd214627a31acfeb61ac66e13560255bfd87d3e9c50e1ca",         "1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9",         "618eba14419e13c8d08d38c346da7cd1c7c66fd8831421056ae56d8d80b6ec5e"     ] }

感兴趣的小伙伴可以到这里查看论坛的讨论:Strange block 74638

 

包含交易最多的区块

一个区块最多能包含多少交易呢?

比特币目前一个区块最大1MB,一个交易平均大小在0.5KB左右,也就是说一个区块大约可以包含1M/0.5KB=2000笔交易。可是还真有人做到了,在1MB的区块内塞进了12239个交易。这件事发生在比特币区块高度#367853(2015-08-01 01:06:41),在前后的几天里,陆续有几十个类似的包含超多交易的区块被挖出。

 

 

 

 

难道有大神发明了什么牛逼的新技术,解决了比特币区块链的容量问题?

仔细查看一下区块中的交易,我们就会发现,区块中有大量的垃圾交易,就像这样,输入输出都是0BTC。这其实是一次针对比特币区块链的DOS攻击,企图使节点不堪重负而崩溃,好在矿池们及时达成一致,不再打包和处理这种垃圾交易,很快就解决了问题。

 

 

 

 

1844亿比特币事件一样正是黑客们的一次次攻击,让比特币系统变得越来越健壮。

 

最土豪的钱包地址

比特币的区块链完全公开,我们可以很容易的通过扫描整个区块链的方式来找到余额最多的钱包地址。现在,让我们有请土豪出场,他就是1JCe8z4jJVNXSjohjM4i9Hh813dLCNx2Sy。到目前为止,这个钱包中拥有124,178.00672854BTC,大约价值4亿美元或者27亿人民币。可惜这位土豪非常低调,目前是谁拥有这些比特币还不得而知,也许是某个交易平台吧。

 

 

下面是土豪排行榜:

  1. 1JCe8z4jJVNXSjohjM4i9Hh813dLCNx2Sy(124,178 BTC)
  2. 3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r(114,470 BTC)
  3. 1FeexV6bAHb8ybZjqQMjJrcCrHGW9sb6uF(79,957 BTC)
  4. 3Nxwenay9Z8Lc9JBiywExpnEFiLp6Afp8v(77,844 BTC)
  5. 3Kzh9qAqVWQhEsfQz7zEQL1EuSx5tyNLNS(71,158 BTC)
  6. 1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx(69,370 BTC)
  7. 1A7znRYE24Z6K8MCAKXLmEvuS5ixzvUrjH(66,559 BTC)
  8. 1PnMfRF2enSZnR6JSexxBHuQnxG8Vo5FVK(66,452 BTC)
  9. 1AhTjUMztCihiTyA4K6E3QEpobjWLwKhkR(66,379 BTC)
  10. 1DiHDQMPFu4p84rkLn6Majj2LCZZZRQUaa(66,236 BTC)

土豪,我们做朋友好吗?

参考资料:

  • 在线区块链浏览器Bitcoin Block Explorer,非常简单易用,你可以使用它查看比特币区块链中的信息。
  • richardkiss/pycoin一个python编写的用于解析区块链数据的库。

比特币区块链中的秘密

扫一扫手机访问

比特币区块链中的秘密

发表评论