所谓区块链,就是字面意思,由区块组成的一个链条。在计算机领域,链表是最为基本的数据结构之一。区块链就是对链表数据结构的扩展和应用。每一个区块中都维护着自己的数据结构,而每个区块又都指向它的下一个区块。
区块链的基本结构
区块链采用点对点网络(P2P,可不是网贷,网贷是坑人的,P2P网络却很实用),该网络中所有节点都是对等的,没有主次之分。这是区块链分布式和去中心化的基础之一。
区块链采用数字加密算法,将上链的所有数据进行加密处理,并且保证链上数据的不可篡改。同时,区块链采用Paxos一致性协议,在网络上传播数据时保证各个节点之间数据的一致性。
首先,所谓的不可篡改是指在区块链中网络节点达到一定规模之后,区块链中已经形成的数据是很难被修改的,而并不是100%不能篡改,只是代价极高。
区块链的不可篡改就要深入了解区块的结构。
区块的结构
从上图可以看出,区块是由区块头和区块主体两部分组成。这里先解释下哈希(hash)值,这是计算机领域最为重要和 著名的算法之一,通过哈希算法,可以给某数据计算出世界上唯一的编码,这个编码就是哈希值。
区块主体中是一颗默克尔树,就是要将树上的节点(树的最下层称为叶子节点,区块链中叶子节点就是交易;其它节点都是为了计算默克尔树根而形成的冗余节点,没有实际的数据)的哈希值两两哈希后形成新的节点,重复哈希直到只存在一个哈希值为止。这个最终的哈希值就是默克尔树根。由于哈希值是全局唯一的,可以相见,如果一个交易(树的叶子节点)发生变化,就要修改一整条哈希路径,直到修改掉默克尔树根为止。
关注下区块头,里面有一项叫做“前一区块的哈希值”。这个值就是对前面的区块进行哈希得到的全局唯一值。如果之前的区块被修改了,那么它对应的哈希值就会变化,它的后继区块中“前一区块的哈希值”也会变化,导致后续区块的哈希值变化……通过的链的传导,就需要将被修改区块之后的所有区块都做出相应的修改。
上面已经说过,区块链采用P2P网络,所有节点都是对等的。如果修改了本地区块链,还需要传播到所有节点,而一致性协议规定了半数以上的结果才能被支持。这又大大增加了篡改的代价。
通过以上几点,篡改交易会导致默克尔树根变化,从而导致区块变化;而区块变化会导致后继节点的“前一区块的哈希值”变化,从而导致整个链的变化;要将篡改后的区块链同步到所有对等网络节点,由于一致性协议的限制,几乎没有可能。
Paxos一致性协议设计中,得到半数以上支持的提议将被确定为最终协议。这是区块链一致性的基础。所以,你只需要具备区块链的对等网络中50%以上的节点(实际情况中并不是每个节点都有计算能力,准确来说应该是50%以上的算力),就能够将自己篡改之后的区块链发布到整个系统当中去。
由于区块链上所有的信息都是透明的,即使有人具有了50%以上的算力,相信其也不会去篡改区块链。这将会导致区块链公信力的下降,从而导致整个应用和信用体系的崩塌。尤其是在比特币这种靠信仰支撑的应用中,篡改将导致所有人的出逃。
以上介绍了区块链中的防篡改措施。比特币中,还应用到了非对称加密算法,防止单笔交易被篡改。
非对称加密有一对密钥,分为公钥和私钥,两者是一对一的关系。公钥顾名思义是可以公开的密钥,私钥必须自身严格保存,一旦暴露就相当于银行卡密码被人知道一样的可怕后果。
用户发起的每笔交易都需要自身的私钥做签名,每个参与记账的节点都可以验证交易是否正确并通过用户的公钥验签信息是否被篡改过。这就完成了比特币防篡改的第一步--单笔交易防篡改。