比特币原理-节点与通信
本节主要阐述比特币节点接入比特币网络的过程和节点间通信的过程。
一、比特币节点连接建立
比特币节点接入比特币网络的步骤如下,以新节点接入为例,旧节点维护与建立连接的方法与下面步骤雷同:
1.寻找比特币网络中的有效节点
2.与发现的有效比特币节点进行初始“握手”,建立连接
3.新节点建立更多的连接,使节点在网络中被更多节点接收,保证连接更稳定
4.交换“区块清单”(注:该步骤仅在全节点上会执行,且从与节点建立连接就开始进行)
二、简易支付验证节点
由前文可知,运行全节点需要消耗非常多的存储空间,并不是所有设备都有条件成为全节点。简单支付验证(SPV)即是为了再不存储完整区块链的情况下进行工作。
SPV节点只需要下载区块头,大小约只有全节点的1/1000。
全节点交易验证方式
全节点沿着区块链按时间倒叙一直追溯到创世区块,建立一个完整的UTXO数据库,通过查询UTXO是否未被支付来验证交易的有效性。
SPV节点交易验证方式
SPV节点通过向其他节点请求某笔交易的Merkle路径(Merkle树我们会在后续章节详细解释),如果路径正确无误,并且该交易之上已有6个或以上区块被确认,则证明该交易不是双重支付。
SPV节点通信
SPV节点使用getheaders消息替代getblocks消息,收到请求的节点将用一条headers消息发送2000个区块头给请求节点,不断循环直到区块头同步完毕。
注:SPV的通信会产生一个隐私风险,由于SPV节点总是通过广播选择性的验证交易,用户的比特币地址与钱包很容易能被关联起来,所以在使用SPV节点需要使用Bloom过滤器。Bloom过滤器作用就是每次要求发送验证信息的节点发送一批交易的信息,而不是某一个交易,再由SPV节点自己来筛选需要的信息,这样就保证了验证的具体交易无法被追踪。
Bloom过滤器的详细解释参考以下URL:https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki
三、交易池
交易池(transcation pool):比特币网络节点用于存放已被网络知道,但还未记入区块链的交易,存储在本地内存中。
孤立交易池(orphan pool):如果一个交易的输入与当前节点未知的交易关联(就是没有发现父交易)会被暂时存入孤立交易池。当节点收到该交易的关联交易(父交易),该交易会被移入交易池中。孤立交易池存储在本地内存中
UXTO池(UTXO pool):存放区块链中所有未支付交易输出的集合,可能存储在本地内存,也可能作为数据库表存储在存储设备中
交易池与孤立交易池包含的是未确认的交易,而UTXO池包含的是已确认的交易。
感动 | 同情 | 无聊 | 愤怒 | 搞笑 | 难过 | 高兴 | 路过 |
相关文章
-
没有相关内容