区块链学习(5)比特币网络
比特币采用了P2P(peer-to-peer)网络架构。P2P是指位于同一网络中的每台计算机都彼此对等,不存在任何“特殊”节点。P2P网络中不存在中心化的服务,计算机网络中的课程已经讲过了P2P,不过为了更好了解的P2P,先看下中心化的网络结构。
从图中可以看出中心化的结构节点直接的通讯通过一个中心化的服务器来传输。日常生活中这种中心化的结构还是比较常见的,像银行转账,银行就是这个中心话的节点。羡慕再看看P2P。
可以看出P2P的网络中每个节点之间可以相互通信,没有中心化的节点。一个结点可以是服务端,也可以是客户端。不过比特币网络没这么简单
比特币P2P网络中的各个节点相互对等,但是根据所提供的功能不同,各节点可能具有不同的分工。每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合。同时具有这四种功能的结点就是全节点。 一个全节点包含完整的区块链,因此可以独立的验证的所有交易。
通过不同功能的组合,比特币网络上运行着不同功能的节点。挖矿节点,独立矿工,spv节点等。
随着比特币的使用热潮,SPV节点逐渐变成比特币节点(尤其是比特币钱包)所采用的最常见的形式。spv节点不需要存储完整区块链,SPV节点只需下载区块头,而不用下载包含在每个区块中的交易信息。接下来看看spv的原理。简单来讲,就是比特币网络里的节点在打包一个区块的时候,会对区块里所有的交易进行验证,并且,一个交易还会得到6至7次的确认来确保交易最后的完成。正是如此,在使用简单支付验证时,只要判断出一个交易在主链上的某个区块里出现过,则可以证明该交易之前已被验证过。不过,SPV节点对特定数据的请求可能无意中透露了钱包里的地址信息。因此在比特币中的Bloom过滤器,用以解决SPV节点的隐私风险问题。
bloom算法类似一个hash set,1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数
2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。但算法判断key在集合中时,有一定的概率key其实不在集合中,因为这些位上的1有可能是前几个key的。
上图就是关键字A进行Bloom算法的过程,这是一个16位,3个哈希函数的Bloom过滤器。Bloom过滤器数组里的每一个数的初始值为零。关键词被加到Bloom过滤器中之前,会依次通过每一个哈希函数运算一次。该输入经第一个哈希函数运算后得到了一个在1和16之间的数,它在该数组(编号依次为1至N)中所对应的位被置为1,从而把哈希函数的输出记录下来。接着再进行下一个哈希函数的运算,把另外一位置为1;以此类推。当全部3个哈希函数都运算过之后,一共有3个位的值从0变成了1,这个关键词也被“记录”在了Bloom过滤器里。