2.2 比特币的产生原理——Hash
玩赚比特币
2.2.1 什么是Hash
所谓Hash,是计算机算法领域内的一个概念,一般翻译做“散列”,也有直接音译为“哈希”的。它就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值)。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来确定唯一的输入值。简单地说,Hash就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。如图2.2所示。
2.2.2 Hash算法的特点
Hash算法在从一个长字符串转换成固定长度的字符串的过程中(即计算Hash值的过程),其转换不可逆,即不太可能从Hash码猜出原字符串。从某种角度来说,计算Hash有时类似一种校验的过程。该特点如图2.3所示。
2.2.3 Hash算法在比特币产生中的应用
1.“挖矿”
MD5和SHA-1可以说是目前应用最广泛的Hash算法,而它们都是以MD4为基础设计的。在产生比特币时,采用的算法是SHA-256,这种算法采用了256位进行运算,为你想保护的信息,找到一串数字,附加上去后,使用某种公认的Hash算法,比如对于比特币来说就是SHA-256,算出一个Hash值。如果Hash值某一长度确定数字打头,如连续的00000……、11111……等(具体多少个决定了难度),那么就成功了。平时所说的“挖矿”,就是每个机器在重复着对原始交易信息附加一段数字,试图使其前面出现连续目标数量个“0”或“1”的游戏。这个游戏本身就是个NP问题,除了暴利搜索似乎没什么好办法,“挖矿”的艰辛也就在于此。
然而,对于这个Hash值的检验,只要进行一次Hash计算就可以了,这就保证了比特币产生时需要耗费很多时间(类似于发掘金矿),而进行交易时却无需为了校验花费很长时间。
而比特币的整个账单序列是一环套一环的。每个人在完整的全局账单上签上新的一笔的时候,都需要利用前面信息生成后面的。这个账单序列被称为chain of blocks(块链),如图2.4所示。每个block里面包含有若干条经过确认并加以难以伪造的hash签名的交易记录。每个block都和全局表上的上一个block有关联。每条账单都会通过P2P网络最终被转发给制造新block的节点上。
2.工作量证明
对于现阶段来说,计算Hash需要前13位为0,此意味着如果通过枚举法生成block的话,平均枚举次数为1613次,如图2.5所示。使用机器的算力资源(如CPU和GPU等)生成block被称为“挖金矿”。
3.奖励机制
这种计算会耗费大量的时间,同时除了暴力运算之外基本上没有什么好办法,制造出新块的几率好象买彩票中大奖,那为什么还有那么多人去执行程序计算出新块呢?答案是,每个制造出新块的人,都有权利构造一条账单声明老天给了我50BTC(比特币的单位),该奖励信息(即证明该块属于挖掘到它的人的信息)已经被包含在这个block里面。这个规则是被所有BTC用户共同承认的。
把制造block等同于挖金矿,只是一个形象上的比喻。实际上,没有人可以把金子挖出来囤积。每个新block必须包含全局表上的上一个block的Hash值,而BTC网络自我调节难度,让每10分钟大约产生一个新block。如果你10分钟内没制造出新的block,差不多就是说你前面10分钟活白干了。从最新版的block继续演算。
所以更恰当的比喻是买彩票。每10分钟开一次的彩票。你不停地花钱买,10分钟开中了就是你的,开不中的都作废,然后进行下一轮。
每个想挖矿赚BTC的人,在不停计算自己的block的同时,都在不停的从BTC网络上监听信息。如果有人发布了新的合法的block,那么如果他想让自己的计算有效,就必须以这个别人已经发布的合法block为基础,再次算块链中的下一个块。所以他需要将别人发布的合法block合并到本地的全局表里。同时取消掉当前的计算(因为当前这次计算是基于之前的块链计算的,现在已经无效了),然后以新得到别人发布的合法的block作为基础,重新开始计算。因为根据比特币协议的规定,block是成为链的,也就是说一旦有人发布了新的block,它之后的人的block就必须在它的基础上进行运算。如果有新发布的交易单,也记录下来。不断的把最新的block的Hash值、新收到的交易单,自己获得50BTC的那条奖励单合并在一起,计算SHA-256,看看结果是否满足条件。一旦满足,就把这个新的block广播出去。当足够的人认可它,以它为基础计算后面的block后,他也就获得了那50BTC。
4.注意事项
需要注意的有下面两点:
(1) 生产block的速度:比特币的协议里规定了生产block的难度固定在平均2016个每两个星期,也就是大约10分钟生产一个。这个速度是不受计算机的运算速度影响的,随着计算机运算速度的提高,产生block的难度(即前文提到的计算Hash值的前面连续0的个数)也会不断加大,因此CPU速度每18个月速度加倍的摩尔定律,并不会加快生产block的速度。
(2) 生产block的奖励数量:比特币每生产一个block奖励50BTC,每四年减半,2013年开始奖励25BTC,2017年开始奖励12.5BTC,依次类推。
综合上面两个因素,比特币货币发行速度并不由网络节点中任何单个节点所控制。其协议使得货币的存量是事先已知的,并且最高存量只有2100万个BTC(目前每周增加约5万个BTC)
为了匹配BTC的经济规模。所有的比特币客户端都被设置成每210000个block,生产新block的人被认可凭空获得的BTC数量比之前的少一半(如果这个时候他还在包内写上自己获得50BTC,其他人不会确认他的这个block)。这会让BTC的总量增速变缓。新的block产生的速度是由难度来调节的。这个难度会由P2P网络根据最近生产block的速度自动调节。所以即使日后计算能力增加,也能保证大约10分钟一个的速度。