本帖仅做科普向,不推荐任何人参与挖矿/区块链交易等行为
OK,上篇提到了Hashcash这种难度-证明类型的算法,那我们现在就来看看这套类型的算法是怎样在BTC中运行的吧
1. 交易包的结构
在正式开始之前 ,我说一点题外话 我们先来了解一下BTC想要干啥吧,BTC的白皮书叫做: 《Bitcoin: A Peer-to-Peer Electronic Cash System》,翻译一下就是《比特币:一种点对点的电子现金系统》,这个系统本身只干一件事: 记账。对,没错,就只是记账,只记录,A向B转账1块钱,然后B账户上就真的多了一块钱,A账户上就真的少了一块钱,很简单的一个功能,没有备注,没有交易银行,也没有支付方和收款方别名。所以这种账单类型的数据,天生就很适合做一种格式化的填充,比如这样:

但是,请注意,此系统为分布式去中心化系统,所以在整个系统中,上述很多地方会被替换掉,首先就是收款方和付款方,因为这里并非中心化的记账系统,身份识别是一道难题,主要有两点:
- 整个网络的身份验证必须保持唯一,不许两个人验证后持有同一个账户(不然用户A持有账户A,用户B也能证明账户A属于他)
- 密码不可暴露,不可能像传统银行那样,你只要输入的密码对得上,那这个账户就是你的(如果真这样做的话,那么处理你交易的节点有可能就想: 反正我有你的密码和账户名,偷偷给你账户往我账上转100块你也不知道)
所以这就引入了第一个密码学算法: 非对称加密算法(简单类比就是虎符),用户秘密保存私钥,验证的时候使用私钥对某些字符串进行签名/加密,别人可以通过公钥进行解密(可以类比为,虎符的两半,有一半由用户秘密持有,另一半可以复制无数份发送给验证者,在验证时候,只需给用户一张纸,用户用自己的那一半虎符盖个章,别人再拿另一半盖个章一比对就知道是否对得上了)
所以这里我们采用公钥类型的数据来作为账户的表示方法,为了增加复杂性,BTC中不会直接用公钥来表示账户(因为只采用单一算法的话还是很容易被逆向出来私钥),而是采用公钥经过摘要算法得到的数据经过Base58编码后得到的字符串作为账户表示(地址)
所以上图我们可以替换为下面的:

注意,此图并非BTC交易中的真实结构,真实结构会在终篇,UTXO交易模型中详细说明
2. merkel Tree
好的,现在我们继续,有了交易包之后,接下来等待的就是交易打包环节了。为了提高处理效率,整个系统采用批量处理交易的方式进行记账: 一次性打包N个交易,成为不可篡改的“区块”
还记得上篇帖子刚提到的摘要算法吗,为了提升验证效率(当然也可能是为了吸引手机,非专业设备玩家入场),我们完全可以做如下操作: 把交易数据计算一次摘要值,然后按照摘要值大小排个队,让他们两两结合再次计算摘要,计算的摘要再次两两结合.....直到只剩一个摘要值,如下图(摘要值7的计算流程,这里只是举例,实际交易数量不会这么少)

这个数据结构就是大名鼎鼎的merkel Tree,你可能没听过,但是你应该用过,git最核心的算法就是依托于merkel Tree进行实现的,这样做有几个好处:
- 最终验证结果收敛为1,提升了信息密度
- 如果有交易被篡改,很容易根据merkel root和其他信息验证出来
3. 区块链结构
现在我们有了一整块交易的摘要root(区块体),接下来我们来看看区块头怎么设计
既然都叫做区块链了,大家熟悉链表的都知道,链里面必不可少的就是指针了,那么区块链的主要工作方式前文也已经隐约有提及,就是不断打包制造新的区块,所以这个指针肯定是指向前一个区块了,所以我们大概就有了一个雏形:

现在我们再思考一点问题,如果BTC就这样,那是不是意味着,所有节点都可以在同时宣布自己打包了xxxx的区块,然后把自己打包的结果加在本地最新的一个节点的结尾?结果可能就像这样: (尽管你可以通过加锁,或者其他方式排除掉干扰,但你始终面临一个问题: 节点分布在全球各地,不可能同时就收到最新的节点,那就会导致这样的结果)

所以,为了等待全球节点同步,BTC中引入了难度NONCE和Difficulty Adjustment机制,全球节点采用同一套算法(Difficulty Adjustment),严格将出块时间控制在十分钟(大概逻辑就是,如果出块太快了,则难度加大4倍以内,出块太慢了难度则减少为原来的1/4)
于是,完整的区块头就大概长这样(省略了很多信息,保留核心信息如下):

还记得我们开头提到的Hashcash吗,这里的证明机制很有意思: 将整个区块头(包含NONCE这个值代表随机数) 进行计算,最终算出满足当前的Difficulty(难度全网统一)的值即视为打包成功(满足当前DIFF值的意思,算出来的摘要值,最前面有DIFF个0),此时打包成功的节点获得奖励(BTC),其他信息是节点无法调整的,只有NONCE值是可以调整的,所以这套算法形象地被人称作挖矿: 你永远不知道下一个nonce是否会达到diff的要求,就和矿工不知道这一镐子下去,地下会不会挖出金子一样
下期预告,BTC的 UTXO交易模型
困了大家,明天见
?层层递增?