前言:如何针对一个系统快速建立架构层面的理解,在《区块链技术指南》一书中关于“架构”的定义有很好的阐述,即“架构有两个层面的涵义。一个是静态层面的,主要是勾画系统边界、结构、组成的组件以及系统之间的关联关系;另一方面是动态层面,主要是规范组件的行为以及组件之间的交互协议”。本文试图从这两个方面比对及分析比特币和以太坊架构之间差异性、以太坊相对比特币演进及优势所在。
一、比特币区块链架构及要素
下图所示即为比特币的区块链架构构成,分为前端和节点后台两个部分:
这其中有几个关键要素:
1、钱包
钱包直接面向比特币的用户,用来保存用户的私钥数据库,同时管理用户余额和提供基本的支付、转账交易功能。从部署场景上还可以进一步划分:互联网钱包、移动钱包、桌面钱包、和纸钱包,这四种钱包依次具有易用性递减和安全等级不断递增的特点。
因为需要支持比特币交易,所以钱包具有一个基本的属性:需要验证用户相关的支付交易,根据易用性可以采用SPV方式(即简单支付验证,本文中不展开说明)、第三方平台或可信任的服务器端验证。
在技术上,钱包可以看做是对比特币API、节点后台一些功能调用以及交易流程处理封装的应用实现。
2.HTTP/JSON RPC API
这是比特币提供共的外部接口,通过该接口可以控制比特币节点,而提供对应功能的是节点后台的HTTP/JSON RPC服务器。该接口对于使用不同语言开发访问比特币节点功能的应用提供了便利。
3.区块链管理、交易验证、邻接节点管理及共识
这几个要素之间有很强的关联性。首先,新的比特币节点初始启动时需要发现邻接节点,并与至少一个节点建立连接。连接建立后,如果是初始的比特币全节点要启动区块链管理下载并验证整条区块链,节点可以并行从多个邻接节点同时下载不同区间的区块链。在比特币网络中,当持续每10分钟有新的区块产生时,节点会去验证及接收新的区块,并延伸该节点所拥有的区块链,而这一过程中涉及到了共识。共识管理在广义上则包括:挖矿、区块验证和交易验证规则,挖矿的概念较容易理解:不断对区块报头进行哈希处理,每次尝试改变一个随机数,直到符合一定的条件才产生一个合格区块。这里需要重点理解的是区块验证和交易验证。
(1)区块验证
区块验证的基本流程如下图所示
除了上述的基本验证以外,还有一个重要的的概念是重组区块链,这种情况通常发生在一个节点发现网络中存在一条不属于当前区块链的更长的区块链时,需要断开现有的区块并对区块链进行重组,该部分后面结合内存池管理及回滚讲解。
(2)交易验证
交易验证的条件检查很复杂,详细可参见《区块链技术指南》一书中P68页2.区块验证中所列举的条件明细,这其中有一条是比特币设计的精髓:需要依靠脚本来验证交易的合法性,即每一个将要花掉的比特币必须有相应的来源。在实现上,交易的输入和输出都有脚本和数值组成,并通过比特币的脚本引擎在一个简单的堆栈式计算平台上执行。但也正是因为堆栈式的脚本语言限制了比特币的扩展性,而以太坊在此基础之上引入了“图灵完备”,极大扩展了功能应用(这一点的比对会在后续的部分讲到)。
这里存在两个脚本:解锁脚本和锁定脚本
用于解锁UTXO(用私钥去匹配锁定脚本)的脚本称为解锁脚本(Signature script),这也叫交易输入;
交易输出则是指向一个锁定脚本(PubKey script),这个脚本表达了:谁的签名能匹配这个输出地址,钱就支付给谁。
如最常见类型的比特币交易脚本(支付到公钥哈希:P2PKH(Pay-to-Public-Key-Hash))组合:
基本交易验证流程如下所示:
1)解锁脚本运行过程,即入栈操作
2)锁定脚本运行过程,即出栈操作
4.内存池管理、重组区块及数据库
在比特币网络中,一个验证过的交易在被放置到一个挖到的区块之前,首先是放置在节点内存中的一个交易池中,并且需要按照一定的优先级次序从交易池中进行选取。优先级可按照1)交易中的输入对应的UTXO的“链龄”
链龄是指在链上记录该交易的区块为起点计算后续加入的区块的深度计量
2)交易额的大小来划分
而链龄越大或者交易额越大的交易则优先级较高。
优先级计算采用以下方式
priority=Sum(value of input*input age)/transaction size
另外,一些比特币节还会维持一个“孤儿”交易池,即如果一个交易的输入相对应的UTXO暂时不能在链上被找到(有可能是因为延迟而未被更新导致),即缺失“父”交易,这些交易会被暂时放置到“孤儿”交易池中,等到“父”交易到来后再重新移到内存池中,可参见上面区块验证的流程处理。
上述处理涉及区块链重组及数据库访问,这里简单举例说明:
存在A、B区块,部分节点先接收到A区块并在此基础延伸链;部分节点先接收到B区块,之后的链条发生分叉,如果B区块的链条变长,对于有A区块的网络节点会断开A区块,进而连接B区块重组区块链。其中断开区块、重组区块涉及UTXO更新,被断开的区块中交易回退到交易内存池,同时“回滚”记录用来回滚断开区块中的交易。
除了区块基础数据存储以外,比特币还引入了数据库便于交易操作及校验,对应数据存储及各功能访问之间的关系如下:
5.比特币节点与P2P网络管理
比特币的节点按照功能划分可分为三种
(1)全功能节点,即带有钱包、RPC服务端、挖矿以及节点校验区块和交易、邻节点间消息传递功能的节点。
(2)基础全节点,这种节点相对全功能节点进行简化,仅做区块和交易的交易和消息中转。
(3)SPV节点,该节点主要负责对可信任的节点的区块和交易做校验。该节点有两个特殊属性:
1)在于邻接节点的连接中设置过滤器,被称之为Bloom过滤器,并只接收包含在钱包里的公钥地址的交易。
这里引出了两个问题:
符合什么规则的节点可以作为spv节点,譬如可被信任或授权的?
所包含钱包里的公钥地址由哪里获取?
2)执行两个验证
基本过程如下所示
比特币的节点及网络构成具有“去中心化”特点,即节点之间的发现即连接完全自主化,这主要基于P2P网络管理具有的基本功能实现
(1)发现邻接节点
(2)连接并管理与邻接节点的socket连接
(3)节点间交换不同P2P消息
(4)禁止异常行为的邻接节点连接,防止Dos攻击
而这些功能需要基于一个基础点:一个新的节点出现后是如何发现一个邻接节点并与之连接?
这里有两种方法:
1)使用“DNS种子”查询DNS,DNS种子即提供比特币节点地址的DNS服务器
2)直接将一个已知邻节点作为种子节点,通过他发现更多的邻节点,因为邻节点之间会相互转发新节点的地址,并将已知地址发送给新节点。
一个新的比特币节点的缺省配置是主动连接8个邻节点,同时允许最多125个邻节点发起连接请求;另一方面,节点会去自动维护与已连接节点之间的连接确保整个网络运行的有效性。因此,比特币的网络节点可以自由加入或离开,真正做到了动态调节和自维护。
6.规则管理
比特币节点必须遵循一定的规则来保证其行为同其它节点的一致性,这包括:
(1)共识规则
即所有节点都必须遵守的规则
(2)个性化规则
即共识以外的规则,典型例子如一个节点可以拒绝保存、中转大于200KB对的交易。这里有一个原则:个性化规则基于共识规则,之间不能产生冲突。
附参考文章: