区块链核心算法与技术原理
区块链挖矿原理
提起比特币和区块链,很多人都觉得如数家珍,实则知其然,不知所以然。
比特币是区块链的第一个实际应用,区块链是比特币的技术支持;
如果初次接触比特币,当你想和别人交流的时候,面对的第一个概念可能就是挖矿。
1、ICO(Initial Coin Offering,首次币发行)
ICO(Initial Coin Offering,首次币发行)源自股票市场的首次公开发行(IPO)概念,是区块链项目首次发行代币,募集比特币、以太坊等通用数字货币的行为。
首先,我们来思考一下:为什么每个区块链系统都要发行自己的数字货币?也就是前段时间的ICO发币热。
这里面就涉及到区块链的根本作用,这个作用就是:实现社会价值在区块链上的自由流通(类比互联网的根本作用:实现信息的自由流通)。
比如我可以针对汽车开发一个汽车链,针对房子开发一个房子链,针对母猪开发一个母猪链等等。如果一个组织或个人的能量足够大,也可以发布一个面向全行业的链,那汽车、房子、母猪……想在各自的链上自由流转,从A的名下流转到B的名下,或者从C的名下流转到D的名下,一定需要个度量的尺度。
这个尺度就是靠支出相应的数字货币来完成的。换句话说,每条链发布的数字货币,充当的是该链上价值流通的一般等价物。
做个现实的类比:也就是我们生活中用于交易的人民币、美元、泰铢、英镑等中央货币,在我们购物时充当的作用。
每条链可以类比成一个国家,每个国家是不是都有自己的货币系统?
这样一想,大概就清楚每条链发行数字货币的目的就是促使链上的资产顺利流通了。
就数字货币而言,对于想做事的人,它充当的是价值流通的一般等价物;对于敛财的人,就是个圈钱的工具
2、数字货币的发行模式
在区块链上,数字货币的发布模式是怎样的呢?
区块链发布链上的数字货币有两种主要形式。一种是,以国内的NEO为例,NEO的发行模式是:在系统创建的时候,一次性的在创世区块里,写入1亿个NEO。借助ICO,用户可以直接用人民币认购持有。这种模式比较类似于央行发行人民币。
另一种就是类似于淘金,就是比特币这样的,通过挖矿节点,不断消耗自身的算力,来换取比特币。
由于比特币系统是完全开源的,在这套开源的代码里,包含了挖矿的功能,只要一个人懂代码,就可以把这套代码进行编译部署,加入到比特币网络里面去,把挖矿功能开启,那你的宿主机开始挖矿了。
在比特币系统,通过自身的算法可以动态调整全网节点的挖矿难度,保证每过大约10分钟,比特币网络中,就会有一个节点挖矿成功;一旦有人挖矿成功,比特币系统就会奖励此人一定数量的比特币,这个数量也是通过算法控制的。
具体说来:从2009年开始,头四年挖矿奖励是50个比特币,在接下来的每四年,每个挖矿成功的人会得到25个比特币的奖励,每过四年衰减一半;也就是下一个四年挖矿成功奖励12.5个,再下一个四年奖励6.25个,以此类推。大约到2140年的时候,区块链发行完毕,大约2100万个比特币,这就是比特币的总量,所以不会无限增加下去。
通过上面的阐述,大家应该明白挖矿和比特币的关系了。这个关系就是:挖矿,是比特币系统发行自身数字货币,也就是比特币的必经之路。
3、挖矿原理
挖矿是比特币系统中一个形象化的表述。它背后真正的名称是POW算法,也就是工作量证明算法。
工作量证明,是从经济学中来的。1993年,由两个经济学家提出来的一种策略,就是防止对服务滥用或者资源滥用,而采取的一种有效阻断的经济策略。
作量证明(Proof Of Work,简称POW),简单理解就是一份证明,用来确认你做过一定量的工作。监测工作的整个过程通常是极为低效的,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。比如现实生活中的毕业证、驾驶证等等,也是通过检验结果的方式(通过相关的考试)所取得的证明。
比特币通过POW的共识机制来决定记账权,通俗来讲,谁证明了自己工作量最大,谁负责记账。
工作量的大小是通过计算符合某一个标准的比特币区块头的哈希散列值来体现的。下面会有详细介绍。
试图争夺记账权的节点称为挖矿节点,挖矿过程就是求出一个能够填充本区块头的随机值,让区块头的哈希散列值符合某一标准。
挖矿的技术演进:CPU挖矿 –> GPU挖矿 –> FPGA挖矿 –> ASIC挖矿 –> 大规模集群挖矿
3.1、工作量证明函数
比特币系统中使用的工作量证明函是 SHA256 ,由于hash算法是一个不可以逆的算法,没法通过具体的hash值,倒推出原文(输入值)。这样每个节点只能采用穷举的方法,也就是从1开始,2 3 4 5…不断的往后试。在这个过程就开始考验各个节点的CPU计算速度了,算的快的,很快就能得到Nonce值,然后他就把这个Nonce值放在结构体里,通过P2P网络广播出去。每个系统节点收到后,发现这个Nonce值是合法的,能满足要求,就认为挖矿成功。对于那些算到半截的节点,发现有人已经算出来了,就放弃本次穷举了,然后开始通过穷举的办法,去寻找下一个区块头的Nonce值。
因此,挖矿,就是计算机通过穷举的办法,不断去找Nonce值、算Hash值的过程。谁先找到,谁就挖成功了。
SHA是安全散列算法(Secure Hash Algorithm)的缩写,是一个密码散列函数家族。这一组函数是由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST) 发布的,主要适用于数字签名标准。SHA256就是这个函数家族中的一个,是输出值为256位的哈希算法。到目前为止,还没有出现对SHA256算法的有效攻击。
3.2、区块
比特币的区块由区块头及该区块所包含的交易列表组成。
区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间缀(当前时间)、4字节的当前难度值、4字节的随机数组成。
区块包含的交易列表则附加在区块头后面,其中的第一笔交易是coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。
拥有80字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。
因此,为了使区块头能体现区块所包含的所有交易,在区块的构造过程中,需要将该区块要包含的交易列表,通过Merkle Tree算法生成Merkle Root Hash,并以此作为交易列表的摘要存到区块头中。
3.3、难度值
难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。
这个公式可以总结为如下形式:
新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )
工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:
目标值 = 最大目标值 / 难度值
其中最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值
3.4、工作量证明的过程
我们可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下:
(1) 生成Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表
(2) 通过Merkle Tree算法生成Merkle Root Hash。把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据(Block Header)作为工作量证明的输入。
(3) 不停的变更区块头中的随机数即nonce的数值,并对每次变更后的的区块头做双重SHA256运算,即SHA256(SHA256(Block_Header)),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成
区块链核心算法
回首2008年,由次贷危机引发的金融危机蔓延全球,2008年11月份,一篇名为《Bitcoin:A peer-to-peer electronic cash system》(中文版、英文版)的论文横空出世,当时只是在一小戳圈子里被讨论,大概没几个人知道论文的意义。时间的年轮很快转入新的一年,比特币第一版本代码发布,2009年1月4日,创世块被挖出来,5天之后,第二个块产生,比特币网络正式启动,一个自称“中本聪”的人悄悄在互联网应用这片汪洋大海吹起一片涟漪,时至今日,这片涟漪已形成滔滔大浪,比特币市值已高达万亿元人民币。
当年能读懂大神论文的人,大多惊讶于这套系统的简洁和完美,甚至有人断言此物一出,开天辟地。如今近乎10年过去,当年看起来近乎完美的系统理念,在各个方面都有长足探索和发展。接下来我将写一系列文章,回顾区块链核心技术演进之路。包括算法演进,挖矿演进,共识机制演进,代币演进,隐私的演进,以及容量和速率的演进等。题目比较大,抛砖引玉,望读者指正和补充。
1、算法演进
关于“算法”一词,目前国内用户使用的比较模糊,有时指共识机制,比如POW算法,POS算法;有时指具体的Hash算法,比如SHA256,SCRYPT。应该说这是由于早期从外文资料翻译过来概念模糊导致的错误,后来人云亦云。共识机制(以前一般叫Proof,现在经常使用Consensus)和算法(Algorithm)在英文资料里语义清晰,不能混为一谈,两者都是区块链技术体系里的重要支柱。
因此,当我们说“X币使用Y算法”的时候,其实具体指的是采用何种Hash算法,而且隐含的前提条件是这个币使用POW证明方式。只有在POW下讨论选取何种算法才有意义,算法的各种复杂设计才能体现其用处。为什么呢,中本聪在设计比特币的时候其实有很多地方用到Hash函数,比如计算区块ID,计算交易ID,构造代币地址等。我们说的算法具体是指用何种Hash函数计算区块ID,所谓算法创新也就是在这个地方下功夫。此外其他任何用到Hash函数的地方,对计算难度没有要求,而且应该选用可以快速运算的算法,尤其在计算交易ID时候,不然影响区块链同步速度。因此如果选用POS方式,计算区块ID也应该使用容易运算的算法。
2、Hash函数
如上所言,我们经常说的POW算法本质是一个Hash函数。Hash函数是一个无比神奇的东西,说他替中本聪打下了半壁江山一点不为过,学习比特币应该从学习Hash函数入手,理解了Hash函数再去学比特币原理将事半功倍,不然将处处感觉混沌,难以开窍。而中本聪也将Hash函数的所有特性使用得淋漓尽致:
已经有很多Hash函数被设计出来并广泛应用,不过Hash函数一般安全寿命都不长,被认为安全的算法往往没能使用多久就被成功攻击,新的更安全的算法相继被设计出来,而每一个被公认为安全可靠的算法都有及其严格的审计过程。在币圈中我们经常说某某币发明了某种算法,其实主要都是使用那些被认证过的安全算法,或是单独使用,或是排列组合使用。
3、SHA256
SHA (Secure Hash Algorithm,安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数,经历了SHA-0,SHA-1,SHA-2,SHA-3系列发展。NSA于2007年正式宣布在全球范围内征集新新一代(SHA-3)算法设计,2012年公布评选结果, Keccak算法最终获胜成为唯一官方标准SHA-3算法,但还有四种算法同时进入了第三轮评选,分别是:BLAKE, GrøSTL, JH和SKEIN,这些算法其实也非常安全,而且经受审查,被各种竞争币频繁使用。
比特币采用SHA256算法,该算法属于SHA-2系列,在中本聪发明比特币时(2008)被公认为最安全最先进的算法之一。除了生成地址中有一个环节使用了REPID-160算法,比特币系统中但凡有需要做Hash运算的地方都是用SHA256。随着比特币被更多人了解,大家开始好奇中本聪为何选择了SHA256,同时对SHA256的安全性发表各种意见,SHA256妥妥经受了质疑,到目前为止,没有公开的证据表明SHA256有漏洞,SHA256依然牢牢抗住保卫比特币安全的大旗。
当然大家心里都明白,没有永远安全的算法,SHA256被替代是早晚的事,中本聪自己也说明了算法升级的必要和过程。
4、SCRYPT
后来随着显卡挖矿以及矿池的出现,社区开始担心矿池会导致算力集中,违背中本聪“一CPU一票”的最初设计理念。
在那段时间,中心化的焦虑非常严重,讨论很激烈,比特币一次又一次“被死亡”,直到现在,针对矿池是否违背去中心化原则的争论仍在继续。
无论如何,有人将矛头指向SHA256,认为是算法太容易导致矿机和矿池出现,并试图寻找更难的算法。
恰逢其时,使用SCRYPT算法的莱特币(Litecoin)横空出世。据说SCRYPT是由一位著名的黑客开发,由于没有得到诸如SHA系列的严格的安全审查和全面论证,一直没被广泛推广使用。与SHA256算法相比,SCRYPT占用的内存更多,计算时间更长,并行计算异常困难,对硬件要求很高。很显然,SCRYPT算法具有更强的抵御矿机性,莱特币还将区块时间改为2.5分钟,在那个山寨币还凤毛麟角年代,莱特币依靠这两点创新大获成功,长期稳坐山寨币第一宝座位置。
后来有人在SCRYPT的基础上稍作修改形成Scrypt –N算法,改进思路都一样,都是追求更大的内存消耗和计算时间,以有效阻止ASIC专用矿机。
很快,莱特币的成功催生了各种各样的算法创新,2012至2014年间,算法创新一直都是社区讨论的热门话题,每一个使用创新算法的币种出现,都能刮起一阵波澜。
5、串联算法
重新排列组合是人类一贯以来最常用的创新发明方法。很快,有人不满足于使用单一Hash函数,2013年7月,夸克币(Quark)发布,首创使用多轮Hash算法,看似高大上,其实很简单,就是对输入数据运算了9次hash函数,前一轮运算结果作为后一轮运算的输入。这9轮Hash共使用6种加密算法,分别为BLAKE, BMW, GROESTL, JH, KECCAK和SKEIN,这些都是公认的安全Hash算法,并且早已存在现成的实现代码。
这种多轮Hash一出现就给人造成直观上很安全很强大的感觉,追捧者无数。现今价格依然坚挺的达世币(DASH,前身是暗黑币,Darkcoin,)接过下一棒,率先使用11种加密算法(BLAKE, BMW, GROESTL, JH, KECCAK, SKEIN, LUFFA, CUBEHASH, SHAVITE, SIMD, ECHO),美其名曰X11,紧接着X13,X15这一系列就有人开发出来了。
S系列算法实际是一种串联思路,只要其中一种算法被破解,整个算法就被破解了,好比一根链条,环环相扣,只要其中一环断裂,整个链条就一分为二。
6、并联算法
有人串联,就有人并联,Heavycoin(HVC)率先做了尝试。HVC如今在国内名不见经传,当时还是名噪一时,首次实现链上游戏,作者是俄罗斯人,后来不幸英年早逝,在币圈引起一阵惋惜。
HVC算法细节:
1)对输入数据首先运行一次HEFTY1(一种Hash算法)运算,得到结果d1
2)以d1为输入,依次进行SHA256、KECCAK512、GROESTL512、BLAKE512运算,分别获得输出d2,d3,d4和d5
3)分别提取d2-d5前64位,混淆后形成最终的256位Hash结果,作为区块ID。
之所以首先进行一轮HEFTY1 哈希,是因为HEFTY1 运算起来极其困难,其抵御矿机性能远超于SCRYPT。但与SCRYPT一样,安全性没有得到某个官方机构论证,于是加入后面的四种安全性已经得到公认的算法增强安全。
对比串联和并联的方法,Quark、X11,X13等虽使用了多种HASH函数,但这些算法都是简单的将多种HASH函数串联在一起,仔细思考,其实没有提高整体的抗碰撞性,其安全性更是因木桶效应而由其中安全最弱的算法支撑,其中任何一种Hash函数遭遇碰撞性攻击,都会危及货币系统的安全性。
HVC从以上每种算法提取64位,经过融合成为最后的结果,实际上是将四种算法并联在一起,其中一种算法被破解只会危及其中64位,四种算法同时被破解才会危及货币系统的安全性。
比特币只使用了一种Hash算法,假如未来某日SHA256被证明不再安全时,虽然可以更改算法,但考虑到如今“硬分叉猛于虎”的局面,届时引发动荡不可避免,但如果使用并联算法,就可以争取平静的硬分叉过渡时间。
7、PRIMECOIN
正当一部分人在算法探索之路上进行的如火如荼之时,另一部分人的声音也非常刺耳,那就是指责POW浪费能源(彼时POS机制已经实现)。POW党虽极力维护,但也承认耗费能源这一事实。这一指责打开了另一条探索之路,即如果能找到一种算法,既能维护区块链安全,这些Hash运算又能在其他方面产生价值,那简直更完美。
在这条探索之路上最让人振奋人心的成果来自于Sunny King(这大神之前已经开发了Peercoin,点点币)发明的素数币(Primecoin)。素数币算法的核心理念是:在做Hash运算的同时寻找大素数。素数如今已被广泛应用于各个领域,但人类对他的认识还是有限。素数在数轴上不但稀有(相对于偶数而言),而且分布不规律,在数轴上寻找素数只能盲目搜索探测,这正是POW的特征。 POW还有另一个要求是容易验证,这方面人类经过几百年探索已经获得一些成果。素数币使用两种方法测试,首先进行费马测试(Fermat Test),通过则再进行欧拉-拉格朗日-立夫习兹测试(Euler-Lagrange-Lifchitz Test),还通过测试则被视为是素数。需要指出的是,这种方法并不能保证通过测试的数百分百是素数,不过这并不影响系统运行,即便测试结果错误,只要每个节点都认为是素数就行。
素数币其实找的是素数链-坎氏链,存在三个特定类型的坎氏素数链:第一类坎氏链,第二类坎氏链和双坎氏链。
举第一类来说明,规则是:素数链中每个数都是前一个数的两倍减一,比如:
1531,3061,6121,12241,24481
数列的下一个数48961(24481*2-1)不是素数,因而这个坎氏链的长度是5,素数币的目标就是探索更长的坎氏链(以上三类都可以)。
那么现在最重要的问题来了,如何用坎氏链来验证一个区块是否合格呢?素数币实现的细节是这样的:
1)计算中本聪区块头Hash,hashBlockHeader = SHA256(BlockHeader)
2)通过变换获得坎氏链的第一个数:originNum = hashBlockHeader * Multiplier
获取originNum之后就可以测试并计算素数链长度的整数部分,小数部分的计算与坎氏链最后一个非素数的跨度相关。
每个区块的乘积因子Multiplier各不相同,计算过程和hashBlockHeader相关,素数币为此对区块头进行修改,专门增加一个字段(bnPrimeChainMultiplier)来存放这个乘积因子。但是以上第一步计算hashBlockHeader时输入数据并不包含这个乘积因子,这也是为啥特别指出中本聪区块头。
由于素数在数轴上分布不均匀,且根据目前掌握的知识来看,数越大,素数越稀有,寻找难度并不是线性递增,耗时也就不可预估,但是区块链要求稳定出块。正因为这点,素数币算法没有得到热捧,但这种探索并非没有意义,利用POW工作量的“幻想”并没有停止,探索还在继续。
8、ETHASH
以太坊(Ethereum)一开始就打算使用POS方式,但由于POS设计存在一些问题,开发团队决定在以太坊1.0阶段使用POW方式,预计在Serenity阶段转入POS。 以太坊POW算法叫Ethash,虽只是一个过渡算法,但开发团队一点也不含糊,一如既往发扬其“简单问题复杂化,繁琐细节秀智商”的设计风格。Ethash 是最新版本的 Dagger-Hashimoto改良算法,是Hashimoto算法结合Dagger算法产成的一个新变种。Ethash设计时就明确两大目标:
1)抵御矿机性能(ASIC-resistance),团队希望CPU也能参与挖矿获得收益。
2)轻客户端可快速验证(Light client verifiability)。
基于以上两个目标,开发团队最后倒腾出来的Ethash挖矿时基本与CPU性能无关,却和内存大小和内存带宽成正相关。不过在实现上还是借鉴了SHA3的设计思路,但是使用的”SHA3_256” ,”SHA3_512”与标准实现很不同。
Ethash基本流程是这样的:
1)对于每一个块,首先计算一个种子(seed),该种子只和当前块的信息有关;
2)然后根据种子生成一个32M的随机数据集(Cache);
3)紧接着根据Cache生成一个1GB大小的数据集合(DAG),DAG可以理解为一个完整的搜索空间,挖矿的过程就是从DAG中随机选择元素(类似于比特币挖矿中查找合适Nonce)再进行哈希运算。可以从Cache快速计算DAG指定位置的元素,进而哈希验证。
4)此外还要求对Cache和DAG进行周期性更新,每1000个块更新一次,并且规定DAG的大小随着时间推移线性增长,从1G开始,每年大约增长7G左右。
9、EQUIHASH
最近,在国内发展势头最猛的莫过于Zcash,该币种最大的特点是使用零知识证明实现隐私交易。距离发布还有几天,但从社区讨论来看,各方矿工都已在磨刀霍霍。Zcash对于算法的选择非常慎重,在先后考量了SHA256D,SCRYPT,CUCKOO HASH以及LYRA2等算法后,最终选择Equihash。
Equihash算法由Alex Biryukov 和 Dmitry Khovratovich联合发明,其理论依据是一个著名的计算法科学及密码学问题——广义生日悖论问题。Equihash是一个内存(ARM)依赖型算法,机器算力大小主要取决于拥有多少内存,根据两位发明者的论文描述,该算法执行至少需要700M内存,1.8 GHz CPU计算30秒,经Zcash项目优化后,目前每个挖矿线程需要1G内存,因此Zcash官方认为该算法在短时间内很难出现矿机(ASIC)。此外,Zcash官方还相信该算法比较公平,他们认为很难有人或者机构能够对算法偷偷进行优化,因为广义生日悖论是一个已经被广泛研究的问题。此外,Equihash算法非常容易验证,这对于未来在受限设备上实现Zcash轻客户端非常重要。
Zcash官方团队选择Equihash完全出于抵御矿机性能的需求,他们在官方博客中也承认并不敢确保Equihash一定是安全的,并表示如果发现Equihash存在问题,或者发现更优算法,Zcash会改变POW算法。
总结
随着比特币、莱特币矿机相继出现,大家已经认识到没有不能开发矿机的算法,想通过改进算法来彻底阻止矿机和矿池的出现是不可能的。
另外,从近几年的发展来看,矿池也没有之前想的那么可怕,甚至已经有人论证了矿池并没有破坏去中心化。
但除了安全性,POW往往伴随分发代币功能,从这个角度来说,CPU算法更具公平性,用户门槛更低,这也是算法创新的驱动,从Ethash以及Equihash设计来看,目前的算法创新仍然是以追求内存高消耗为主。以此同时,社区在共识机制的探索之路上也取得很多成果。
纵观当前区块链核心技术发展全局,算法创新热潮已经有所消退,但也未停止,于比特币,于区块链,于算法探索而言,都还在路上。
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2024-08-08 16:05:41
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: 区块链核心算法与技术原理 (米扑博客)