工作证明(Proof Of Work,简称POW),顾名思义,即工作量的证明。通常来说只能从结果证明,因为监测工作过程通常是繁琐与低效的。 比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值。要得到合理的Block Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的Block Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到Block Hash。 工作证明机制看似很神秘,其实在社会中的应用非常广泛。例如,毕业证、学位证等证书,就是工作证明,拥有证书即表明你在过去投入了学习与工作。生活大部分事情都是通过结果来判断的。 挖矿
挖矿为整个系统的运转提供原动力,是比特币的发动机,没有挖矿就没有比特币。挖矿有三个重要功能: 发行新的货币(总量达到之前) Block Hash算法 字段名 含义 大小(字节) 下面采用高度为125552的block数据为例,演示block hash的计算过程: <?php $header_hex = "01000000" . // version // previous block hash "81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" . // merkle root hash of transactions in this block "e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" . // Time "c7f5d74d" . // Bits (Difficulty) "f2b9441a" . // Nonce "42a14695"; $header_bin = pack("H*", $header_hex); // hex to bin $h = hash('sha256', hash('sha256', $header_bin, true), true); // double sha256 echo bin2hex($h), "\n"; 该计算过程简单明了:首先将数个字段合并成一块数据,然后对这块数据进行双SHA256运算。 产量调节 提示:复制和保存代码功能在FF下无效。
但由于实际算力总是不断变化的(目前一直是快速上升的),所以需根据最近2016个块的耗费时间来调整难度值,维持每10分钟一个block的频率. 提示:复制和保存代码功能在FF下无效。
Version,版本号,很少变动,一般用于软件全网升级时做标识 hashPrevBlock,前向Block Hash值,该字段强制多个Block之间形成链接 形成分支博弈,使得算力总是在主分支上角逐 新block诞生过程 节点监听全网交易,通过验证的交易进入节点的内存池(Tx Mem Pool),并更新交易数据的Merkle Hash值 主链分叉 不同高度的分支,总是接受最高(即最长)的那条分支
分支博弈 都是理性的,追求收益最大化 一旦出现有少量的节点联合,那么其他节点必然会效仿,否则他们收益为零的风险会更大。于是,分支迅速合并汇集,所有节点都会选择算力更强的分支,只有这样才能保持收益风险最小。最终,只会存在一个这样的分支,就是主干分支(Best/Main Chain)。 对于不诚实节点来说,结局是无奈的:能且只能加入主干挖矿。不加入即意味被抛弃,零收益;加入就是老实干活,按占比分成。 Hash Dance Hash Dance起名源于Google Dance. 算力攻击的概率 p = 诚实节点挖出block概率 攻击者在攻击时已经偷偷的计算了k个块,那么这k个块概率符合泊松分布(下图左侧部分),若k<=z,那么追赶上后续z-k个块的概率为(q/p)z-k,即: 展开为如下形式: 计算该过程的C语言代码如下: 提示:复制和保存代码功能在FF下无效。
我们选取几个值,结果如下: 可以看到,由于block的链式形式,随着块数的上升,攻击者赢得的概率呈指数下降。这是很多应用等待六个甚至六个以上确认的原因,一旦超过N个确认,攻击者得逞的可能微乎其微,概率值快速趋近零。 当攻击者的算力超过50%时,便可以控制Block Chain,俗称51%攻击。 算力攻击的危害 偷盗他人的币。消费某个地址的币时,需要对应的ECDSA私钥签名,而私钥是无法破解的。 过程是这样的:假设现在block高度为100,攻击者给商户发了一个交易10BTC,记作交易A,通常这笔交易会被收录进高度101的block中,当商户在101块中看到这笔交易后,就把货物给了攻击者。此时,攻击者便开始构造另一个高度为101的block,但用交易B替换了交易A,交易B中的输入是同一笔,使得发给商户的那笔钱发给他自己。同时,攻击者需要努力计算block,使得他的分支能够赶上主分支,并合并(Merge)被大家接受,一旦接受,便成功地完成了一次Double Spending。 攻击难度呈指数上升,所以成功的Double Spending通常是一个极小概率事件。 算力巨头 挖矿是一项专业劳动,最后必然会交给最专业的人或团队,因为这样才能实现资源配置最优,效率最高。普通投资人通过购买算力巨头的股票:1. 完成投资;2. 分享算力红利。看似中心化的背后其实依然是分散的: 矿业公司的背后是无数分散的投资人 后记 Posted by kevin@bitfund.pe Aug 3rd, 2013 |