本系列内容包含:基本概念及原理、密码学、共识算法、钱包及节点原理、挖矿原理及实现。
挖矿
构成区块头的因素都产生以后,矿工会在Nonce中随机填入一个值,比如下图中Nonce=14202,接着对区块头进行哈希运算,会产生一个哈希值,这个哈希值会和区块头中的难度值进行比较。
当计算哈希比难度值大的时候,系统就会判定不符合要求,此时需要返回继续增加Nonce值,重新计算哈希值,以此不断重复循环计算,直到计算哈希小于难度值,才会进行下一步,这就是挖出了矿。
挖出矿之后,系统会将Nonce值固定到区块头中,并将交易广播到全网。
其实这里有一个问题是,既然第一个Nonce值不行的话,那为什么所有的矿工一般都是通过字征法,也就是一个一个数字相加的方式去运算呢?
有的人会认为,既然Nonce值是随机的,那为什么填入的时候不能随机填入呢,比如说1不行,就填100;100不行,就填500;500不行,就填2000……这样概率是不是应该更大一些?
其实并不会,因为哈希运算的时候,即使Nonce值只改变了一个数字,但是其哈希计算结果的区别却非常大。
也就是说,随机碰撞去试Nonce值的计算哈希概率并不会比顺序尝试的概率大,并且还会增加矿机设计的难度。
所以,现在挖矿一般都是通过给定计算范围的方式去计算Nonce值。
比如上图中,14202不行,那就14203……一直到12405,这时区块哈希小于难度值,这时也就是挖出了矿,找到了可用区块,最后将结果广播给全网。
需要说明的是,矿工挖出符合难度要求的区块之后,会将这个区块广播给网络中的其他节点,其他节点会验证新收到的区块是否符合难度要求。并且会将区块中包含的所有交易重新验证一遍,包括交易是否合法,交易输入和签名是否合法等。
如果验证没有问题,就会将这个区块添加到自己本地节点的账簿中,也就是填到链上,此时一笔交易完成。
数字钱包
钱包最重要的是私钥,因为有私钥就可以得到交易地址,并且可以通过链上去查询到与交易地址相关的所有记录以及余额。
如果私钥丢失或者被盗了,那这个钱包就再也找不回来了。
一个钱包中也可以有多个私钥,这取决于选用钱包的不同。
我们分析一些不同种类的钱包
不确定性钱包,这种钱包中的每个私钥之间没有关联性。备份钱包的时候,需要对每个私钥进行备份。
由于私钥是由很长的一串无序十六进制字符串构成的,只备份一个就很容易出错,如果再备份很多个,其这个工作量是巨大的,并且人工备份的过程中出错的概率也会上升,一旦备份丢失或者人工记录错误,这个钱包就无法找回。
不确定性钱包由于其管理难度的原因,往往容量是有限的,即私钥和地址的产生是有限的。
确定性钱包,这种钱包中所有的私钥是由一个主私钥按照一定规则衍生得出。备份钱包的时候,只需要把主私钥备份下来,并且把衍生规则记录下来。
这种钱包可以很顺利的通过主私钥种子,拿回钱包中包含的所有私钥和地址。其中每一个私钥是一个根,每个私钥管理下一个,当一个私钥泄露的话,只要知道规则,相连的一串私钥都会泄露,这也导致确定性钱包存在一定的不安全性。
钱包备份的时候,不是十六进制字符串的形式,而是采用12个或者24个助记词(单词或汉字)的形式,展现给使用者,使用者只需要备份这些助记词就可以了。当在一个新的钱包中重新导入备份的助记词,就可以找回之前使用的钱包。
由于确定性钱包这种确定性的关系,所以可以衍生出无数的私钥,所以钱包中的地址也是无数多个的。
分层确定性钱包,这种所有私钥由一个主私钥按照一定规则衍生得出,但是会分裂成很多子私钥,子私钥分裂成孙私钥,以此类推会产生无限多私钥。这样即使某一个子私钥泄露了,也不会影响其他子私钥的安全。
这种钱包是现在实际应用最多的,可以用一个主私钥管理整个钱包,然后不同的子私钥管理不同的数字货币。即使某一个链上的资产泄露了,也不会影响其他钱包的资产。