通过本章的学习,可帮助你对比特币网络、网络中的节点分类、节点如何同步区块、轻量级客户端如何验证交易的有效性以及Bloom过滤器的原理,建立系统的认识。
阅读时长:15分钟左右。
第1节 比特币网络
比特币采用的是基于国际互联网的P2P网络架构。P2P是指接入到同一网络中的各个节点之间彼此对等,共同提供服务,不存在任何中央化的服务。比特币系统是一个点对点的数字现金系统。每个节点在对外提供服务的同时也使用网络中其他节点所提供的服务。P2P网络也因此具有可靠性、去中心化,以及开放性。
比特币网络是指各个节点按照比特币P2P协议运行。当然扩展的比特币网络除了P2P协议之外,还有其他协议,比如Stratum协议、矿池挖矿协议以及其他连接比特币系统相关组件的协议。
Stratum协议:是当前主流的矿机与矿池之间的通讯协议。非独立矿工在挖矿时,可连接至矿池服务器,此时矿工不直接接入比特币网络,而是与矿池服务器之前通过Stratum协议通讯,由矿池服务器通过比特币P2P协议连接到比特币网络。
第2节 比特币网络中的节点
尽管加入比特币网络的各个节点完全对等,但是根据各个节点的目的不同,各个节点所包含的功能可能不同。一个完整的比特币节点(即全节点)包含4个功能:路由、完整区块链数据库、矿工、钱包服务。
各个功能简要介绍如下:
路由:所有的比特币节点都具有路由功能。具备路由功能的节点可以传播验证交易并转发区块信息,维持与对等节点的连接。
完整区块链数据库:存储区块链的完整数据,可以独立的验证所有交易而不需要依赖于其他节点。
矿工:具备矿工功能的节点,可以通过解决工作量算法证明难题,竞争创建新区块的资格并获取比特币奖励和交易手续费。
钱包:管理用户私钥,支持比特币交易和查询功能。
以上4个功能都包含的节点,称为比特币全节点,比如比特币核心客户端。根据目的的不同,有的节点只包含部分功能,常见的节点类型如下:
完整区块链节点:只包含完整区块链数据库和路由功能。这类节点通常用于搭建基于比特币系统的应用服务,如交易所等。
独立矿工节点:包含矿工、完整区块链和路由功能。这类节点用于独立的矿工挖矿,独立矿工节点不需要借助于矿池服务器的任务分配和校验,因为具有完整的区块链数据备份,可独立的挖矿建立新区块。
轻量级(SPV)钱包节点:包含钱包和路由功能。轻量级钱包没有完整的区块链数据库,无法独立的完成交易验证,需要借由外部参照。
挖矿节点:包含矿工功能,挖矿节点不直接接入比特币网络,其先通过Stratum协议与矿池服务器通讯,由矿池服务器接入到比特币网络。
通过上面的介绍,我们对比特币网络以及网络中的节点类型和分类有了大致的了解,下面主要讲述实现过程,可帮助你了解其背后的运行机制。
第3节 新的节点如何接入比特币网路
比特币网络中虽然没有特殊的节点,但是新的节点在启动时,为了接入比特币网络,参与比特币系统的协作,需要连接到已知正运行的节点,由正运行的节点将新节点的信息广播到其他节点,从而接入网络。所以,新节点接入到比特币网络的关键在于需维护对等节点列表,以帮助其广播交易、区块等信息。
节点可通过以下方式获取对等节点列表:
第1种方式:由于节点可以不断的加入和离开,所以本地维护的节点列表最好是长期稳定运行的,这样的节点称为“种子节点”,在比特币核心客户端,提供了获取种子节点的方法,客户端可以设置自动获取。当然,新节点不一定需要与种子节点建立连接,但是可以通过种子节点快速的发现网络中的其他节点。这个是包含在节点间建立通讯时相互传递的信息中的。
第2种方式:新节点可以设置至少一个其他节点的IP地址,通过该IP地址的节点引荐并连接到某个节点。
第3种方式:新节点只指定固定节点的IP地址,此时节点只能连接到这些固定的IP地址对应的节点,不会自动发现并维护与对等节点之间的连接。
节点再次启动时,不会与获取到的所有节点地址都尝试建立连接,它默认会与上次连接成功的节点建立连接,如果上次连接成功的节点没有应答,节点可以使用种子节点进行重启动,以获取新的节点列表。
第4节 全节点如何同步区块
全节点,即拥有全部交易信息的比特币完整区块链的节点。全节点可以独立完成交易信息的验证、可以通过比特币网络获取包含交易信息的新区块更新,并在验证无误后将此更新合并至本地的区块链拷贝当中。
截止2018年8月末,比特币区块链大小已超过190G,完全同步下来需要一个月左右的时间。
一个全节点连接到对等节点之后,第一件事就是构建完整的区块链。同步过程如下:
1.新节点发送本地的版本信息,其中包含本地的区块高度(即区块数量);同时对等节点会将自身的版本信息返回给新节点。
2.当对等节点识别出新节点的顶端区块高度小于自身的顶端区块高度时,对等节点会将一批可供分享的500个区块的区块哈希值广播出去。
3.新节点通过发送消息请求获取区块信息,当从对等节点读取区块来同步区块链时,会将该区块信息同步完成后,才会发送下一次区块同步请求,以防止压垮网络。每一个区块在被接收后,就会被添加到本地的区块链中,这一过程可详见后续第7章的介绍。
第5节 简易支付(SPV)如何验证交易
普通用户使用比特币完成支付、转账完成交易,通常在智能手机等终端完成,但受限于终端的空间和效率,需要在没有完整区块链的情况下运行,于是简易支付验证(SPV)客户端应运而生。
SPV节点只需要下载区块头,而不需要下载每个区块中的交易信息。完整区块链通过扫描区块链,可建立完整的UTXO(未花费交易输出)数据库,每一笔交易都可以从UTXO中完成校验。而SPV节点,由于自身不存储交易信息,其验证时需要借助于对等节点返回的信息来验证交易。
用户A在商家B消费支付,商家B是验证支付有效(SPV验证)的过程如下:
1.商家B只关心支付到自己比特币的地址是否完成交易,可以通过设置Bloom过滤器,限制只接收包含自己比特币地址的交易。(关于Bloom过滤器的原理,后文会详细介绍)
2.一旦比特币网络中的其他节点检测到某个交易符合SPV节点设置的Bloom过滤器的条件时,其他节点便会发送所检测到区块的消息,该消息中含有区块头和包含目标交易的Merkle路径。关于Merkle路径,可以理解为,在每个区块中的所有交易,都通过两两哈希、层层递归,最终形成只含有一个Merkle根节点的树形结构,所以只要知道了区块头、以及在树形结构中的Merkle路径,即可找到叶子节点中的对应交易。
3.验证交易是否存在。SPV节点通过比对目标地址中该交易的哈希值、与对等节点返回的Merkle路径中该交易的哈希值是否相等,若相等,则说明交易存在。但是交易存在,不代表有效,也有可能存在双重支付的问题,即同一笔来源的比特币支付2次,所以还需进行是否双重支付验证。
4.验证是否为双重支付。由于SPV节点本身会保存完整的区块头,在对等节点返回该交易对应的区块之后,SPV节点通过查看这笔交易所在区块之后的区块个数,一旦大于等于6时,说明这笔交易被众多节点达成共识,被篡改的可能行很低。
至此,简易支付验证完成。
所以,简易支付验证,最关键的地方在于向对等的全节点获取包含该交易的区块头和Merkle路径,从而验证交易。但是,如果SPV节点请求查询交易信息时,直接将目标地址提供给全节点的话,很容易将目标地址和所归属的钱包用户相结合,从而暴露了用户隐私。所以,在SPV节点查询交易信息时,不会直接将目标地址发送至对等节点,而是将该目标地址对应的Bloom过滤器发送至对等节点,对等节点再将交易中的输出值代入到过滤器中验证,若验证能匹配上,则将匹配出的交易对应区块的区块头以及Merkle树返回给请求节点。
第6节 Bloom过滤器原理说明
Bloom过滤器的实现是由一个可变长度的数组N(即包含N位二进制数组成的数组)和数量可变的M个哈希函数组成,其原理是将每个关键词依次经过多个哈希函数计算后,将每个哈希函数计算的结果对应到二机制数组中,将数组中对应位置的值置为1。
SPV节点建立Bloom过滤器的过程:
1.首先SPV节点会初始化一个没有关键词的空白Bloom过滤器;
2.接下来SPV节点会建立一个包含钱包所有地址的地址列表,并创建每个地址对应的关键词,即能匹配到对应地址的搜索模式。通常,这个能匹配的关键词是一个向公钥付款的哈希脚本,即对应交易输出锁定脚本中的公钥哈希值;
3.SPV节点将关键词添加到Bloom过滤器中。
第7节 总结
通过本章的学习,相信你对比特币网络、网络中的节点分类、全节点如何同步区块、轻量级客户端如何验证交易的有效性以及Bloom过滤器的原理,有了系统的认识。
如果对文中的表述有疑义或者存在表述有误的地方,欢迎在留言区讨论交流,一起精通比特币。
领取专属 10元无门槛券
私享最新 技术干货