原创文章,转载请注明:转载自Keegan小钢并标明原文链接:http://keeganlee.me/post/blockchain/20180224微信订阅号:keeganlee_me写于2018-02-24
专栏地址:https://xiaozhuanlan.com/fullstack
最近区块链异常火爆,而且就只是在这一两个月内的事情,无疑,今年应该会成为区块链爆发元年,相应地,对区块链技术人员的需求将会大幅度增加,为了让大家早日入门区块链开发领域,以取得先发优势,从而在这场区块链革命浪潮中立于不败之地,因此,我决定提前编写系列文章,跟大家聊聊区块链技术。
相信不少人都听到说区块链是分布式账本、分布式数据库、去中心化的等等,有了一些大概的认知,但也只是一些碎片化的认知,还无法形成体系,所以也还不能理解区块链的本质。下面,我将从微观到宏观简单讲解区块链,力求让大伙更容易理解区块链的真正本质。
那么,从微观上理解区块链,就要从理解区块链最底层的数据结构开始。区块链(Blockchain),简单来说就是按时间顺序将数据区块通过哈希指针的方式连接起来的一个链表。哈希指针是区块链里最常用的数据结构,其实就是一串数据的哈希值,我们知道,一串数据的哈希值就是这串数据的指纹/摘要,因此就可以用这个哈希值来指向这串数据,如下图:
区块链里的每一个区块都有对应本区块的哈希指针,而除了创世区块(即第一个区块)之外,其他每个区块都存储了前一个区块的哈希指针,从而形成如下所示的一个链条,即区块链:
这样的数据结构可以保证数据无法篡改,因为一旦篡改了任何区块的数据,对应的哈希指针就会出错,因此一旦有恶意篡改就能校验到。数据的无法篡改也是区块链本质上最核心的一个特性。
接着,再来看看区块链的基本单元——区块(block),以比特币为例,每个区块的数据结构大致如下:
其中,Tx0 ~ Tx3 表示每一笔交易数据,Hash0 则是 Tx0 这笔交易数据的哈希指针,Hash01 则是 Hash0 + Hash1 的哈希指针,这样层层叠加上去,得到最后的Root Hash。从图中也可以看出,从Hash0 到 Root Hash 是一个三层的二叉树,由于这颗树的所有节点都是 Hash 值,所以也称为 Hash Tree,但更专业的名称叫Merkle Tree。不过 Merkle Tree 不一定是二叉树,也可以是多叉树。Merkle Tree 的叶子节点(即Hash0 ~ Hash3)是数据块的 Hash 值,而非叶子节点的 value 则是根据下面的叶子节点的 Hash 值串联起来后再计算 Hash 得出的。通过 Merkle Tree 结构,底层的每一笔交易也都无法篡改,一旦篡改,Root Hash 就会不一致。
另外,该结构也简化了支付校验,比如,我们要校验 Tx3 这笔交易的有效性,那只要校验从 Tx3 到 Root Hash 的分支 Hash 值即可,如下图所示,计算 Tx3 的 Hash值得到 Hash3,再结合 Hash2,计算出 Hash23,再拼上 Hash01 计算出 Merkle Root,只要计算出来的 Merkle Root 和实际存储的 Root Hash 一致,则表明该该笔交易是有效的。Root Hash 会保存在区块头里,区块头里一般会保存有以下信息:
Block Hash:当前区块的 Hash 值
Prev Block:上一个区块的 Hash 值
Next Block:下一个区块的 Hash 值,如果下一个区块还未确定,则为空
Merkle Root:即上面所说的 Merkle Tree 的 Root Hash
Height:区块高度,即在区块链中,当前区块是第几个区块
Time:区块的时间
Tx Count:区块的交易数
Size:区块大小
Difficulty:区块难度
Nonce:随机数
这是比特币的一个区块:https://btc.com/0000000000000000005b8d4d2508c14f6ea5cbbb3f1104566612dfb29d281b7a。比特币的每一笔交易,可以有多个输入和多个输出。比如说,我们要做一笔转账,从 A 转 3.3 个 BTC 到 B,假设 A 的钱包地址上原本有 10 个 BTC。那这笔转账,会有一个输入,即 A 的地址有 10 个 BTC,交易完成后变成两个输出,一个是 B 的地址增加 3.3 个 BTC,一个是 A 的地址变成 6.7 个 BTC。这样子,每一个地址的所有交易其实都是可以追溯的,每一个比特币的转账记录也是可以追溯的。
不过,以太坊的区块结构则复杂得多,每个区块并非只有一颗 Merkle Tree,而是有三颗 Merkle Tree,除了交易树,还有状态树和收据树。另外,使用的 Merkle Tree 也是复杂得多,叫 Merkle Patricia Tree。详细结构就不展开了,感兴趣的读者自行去搜索了解即可。
简而言之,从微观上来说,区块链就是一种哈希链条,其核心本质特征是不可篡改且可追踪溯源。
如果只是从微观上理解区块链,那就像井底之蛙,是看不到区块链即将改变世界的未来的。毕竟,从微观上来看的话,要实现不可篡改且可追踪溯源的特性,并不一定需要使用区块链技术。所以,还要看懂区块链宏观上的本质,才能预见到区块链真实的未来。
当然,宏观上来说,区块链的本质是什么,不同人会有不同观点,不少人认为其本质特征是去中心化的,另一帮人认为其本质就是分布式数据库/分布式公共账本,而在我看来,其核心本质就是一种自信任的新一代互联网基础协议。下面我将逐步剖析我的观点。
首先,宏观上的区块链就是一种基础协议,而不是指代具体的技术。作为一种基础协议,有几个基本特征是必备的,那就是分布式存储、P2P 网络和共识机制,当然,还有微观层面的不可篡改且可追踪溯源,如果不具备这几个特征,哪怕只缺了一个,都不能称为区块链。
先来聊聊第一个基本特征——分布式存储。前面我们已经了解到,区块链最底层的数据结构就是一种哈希链条,是用来存储数据的,当然,采用哪种具体的数据库来存储区块链数据则是由各区块链的开发团队自己决定的,比如,比特币和以太坊就选择了 LevelDB。分布式存储,就是说,区块链数据的存储是分布式的,也因此很多人将区块链称为分布式数据库,但区块链的分布式存储与传统的分步式存储有所不同。传统的分布式存储是将数据分散存储到多个服务器上,每个存储服务器上的数据只是全量数据的一部分。但区块链的分布式存储,每个数据节点存储的都是全量数据。不过,区块链的节点可分为全节点和轻节点,全节点存储了整条区块链的所有数据,包括所有区块头和所有交易数据,而轻节点则只存储了整条链的所有区块头。那如果要在轻节点查询某笔交易的有效性,就需要转去全节点查询了,那节点之间如何通信呢?这就涉及到第二个基本特征——P2P 网络。另外,既然是分布式存储,那就还要解决数据一致性的问题,就这涉及到第三个基本特征——共识机制。
P2P 网络,即对等网络,也称点对点网络或端对端网络,是区块链系统中不同节点之间通信的方式,也是一种分布式的网络结构。通过 P2P 网络,不同节点之间可以直接交互,而且彼此连接的每个节点都处于对等的地位。每个节点既充当服务器,为其他节点提供服务,同时也享用其他节点提供的服务。那么,既然每个节点的地位都是对等的,那不同节点之间出现分歧时,要如何达成一致共识呢?这也是共识机制所解决的问题。
共识机制是区块链的一个核心特征,是保证区块链系统在分布式架构下的一致性方案。要理解共识机制,我们先来了解下交易写入区块链的简要过程。首先,当你在某个节点发起一笔交易时,比如从地址 A 转 0.1 个 BTC 到地址 B,该节点接收到交易信息后就对其进行校验,如果地址 A 上的未消费 BTC 的余额大于 0.1 个则可认为该笔交易是合法的,那就会将这笔交易信息放入本节点的 pending 池(待写入区块的交易池),并将这笔交易信息广播给其他已建立连接的节点,其他节点接收到交易信息后也做同样的校验并广播,当其中某个节点获得记账权时则可将它当前的区块(包含上面那笔交易)写入本节点存储的区块链中并将这个区块广播出去,其他大部分节点校验了此区块为有效,也同样写入它们自己存储的区块链中,这样,你的这笔交易就算真正写入到区块链中了。那如果你同时向 B 和 C 地址分别转 0.1 个 BTC,但你的地址 A 的未消费 BTC 余额只有 0.1 个的情况下,假设有些节点可能只接收到转给 B 的交易,而有些节点则只接收到转到 C 的交易,这些节点分别校验通过并写入了它们的 pending 池,但最终只有其中一笔交易能被写入区块链,取决于哪个节点先获得记账权并被其他大部分节点所接受,而另一笔交易就算已经被那些将其写入了 pending 池的节点所接受,其他节点再次校验后也不会通过。所以,一笔交易是否合法,以及一个新增区块是否有效,不是由某一个节点说了算,而是需要经过多数节点的最终一致共识。
根据区块链的这几个基本特征,明显可以看出,区块链的确是分布式的:分布式存储、分布式网络、分布式共识。分布式的确是一个重要的特征,但分布式只是一种手段,而不是目的。区块链之所以能被称为革命性的技术,是因为它改变了传统的信任机制。传统的信任机制是怎样的呢?其实就是有一个中间机构为信任背书,比如银行、淘宝、滴滴等,我们通过信任这些中间机构和其他人进行交易。而区块链则没有中间机构这一层了,用户之间直接点对点交易,区块链的数据结构、分布式存储特性和共识机制结合在一起,保证了数据是可靠且不可篡改的,从而实现了一个不需要中间机构的自信任系统。也由于没有了中间机构,所以也可以说区块链是去中心化的,但这里更准确的说法可能是去中介化。但去中介化和分布式一样,只是手段,而不是目的,核心目的还是构建一个自信任系统。
那自信任系统相比有中间机构的信任机制有什么好处呢?我们就举个跨境支付的栗子就明白了。传统的交易支付都要经过银行体系,要经过开户行、对手行、清算组织、境外银行等多个机构和非常繁冗的处理流程。而且,整个过程中每一个机构都有自己的账务系统,彼此之间需要建立代理关系,每笔交易都需要在本银行记账,与交易对手进行清算和对账等,导致整个过程花费时间较长、使用成本较高。而有了区块链,交易双方就可以实现点对点支付,而无需这么多中间机构,从而简化流程、提高效率。
最后,总结一下,我分别从微观和宏观两个层面简单聊了下区块链,微观上,其实就是区块链最底层的数据结构,本质就是一种不可篡改且可追踪溯源的哈希链条;宏观上,区块链还具备了另外三个基本特征:分布式存储、P2P 网络和共识机制,从这几个基本特征可以看出,区块链是分布式的,但分布式只是手段,而不是目的,区块链的核心目的是构建一个自信任系统,相比依赖中间机构的信任机制,可以简化流程、提高效率,这才是区块链之所以能被称为革命性技术的本质原因。
智能合约为区块链带来了什么?区块链是否必须有数字代币?公有链、联盟链、私有链本质上有什么区别?
扫描以下二维码即可关注订阅号。