比特币开发指南 - P2P点对点网络
P2P
网络
比特币网络使用简单的方法来执行对等节点的发现和节点间的通信。以下章节适用于全节点和
SPV
客户端,不同的是
SPV
通过布鲁姆过滤器
(
Bloom filters
)
执行块的发现。
比特币的核心部分维护一个在启动时可以连接的对等节点列表。当一个完整的节点第一次启动时,它必须被自举
(
bootstrapped
)
到网络。这个过程如今在比特币的核心部分通过一个短名单上的
DNS
种子自动执行。选项
-dnsseed
可以被用来定义这种行为,默认的设置是
1
。
DNS
请求返回一个可连接的
IP
地址列表。比特币客户端从那里可以连接到整个比特币网络。
自举的另外一种方法是
使用
参数
-seednode=<ip>
。通过这个参数,用户可以预先定义连接到哪个服务器,并在建立对等节点列表之后断开连接。另外一个方法是
在
启动比特币核心
时
配置
-connect=<ip>
参数来选择连接到哪些对等节点
(未被配置的
IP
将不会被连接)
。
添加对等节点的最后一种方法是通过
参数
-addnode=<ip>
添加一个单独的节点到对等节点列表
中
。
自举过程完成后,节点向其对等节点发送一个包含其自身
IP
地址的
addr
消息
。其对等的每个节点向
它们
自己的对等节点转发这个信息,以便
进一步
扩大连接池。
通过
getpeerinfo
命令
可以查看
某个
节点所连接的对等节点
及相关的数据
。
节点通过发送
version
消息
连接到一个对等节点。
消息
version
包含了节点的版本信息、块信息和距离远程节点的时间。一旦这个
消息被
对等节点收到,它必须回复一个
verack
。如果它愿意建立对等关系,它
将
发送自己的
version
消息
。
一旦建立
对等
关系,节点可以向远程节点发送
getaddr
和
addr
消息
来获得
其它
的对等节点信息。为了维持与对等节点的连接,节点默认情况下每
30
分钟内会给对等节点至少发送一次信息。如果超过
90
分钟没有收到回复,节点会认为连接已经断开。
在与对等节点建立连接
后
,双方
互发
包含最新块哈希值的
getblocks
消息
。如果某个节点坚信其拥有最新的块信息或者有更长的链,它将发送一个
inv
消息
,其中包含
至多
500
个最新块的哈希值,以此来表明它的链更长。收到的节点使用
getdata
来请求块的详细信息,而远程的节点通过命令
block
来发送这些信息。在
500
个块的信息被处理完之后,节点可以通过
getblocks
请求更多的块信息。这些块在被接收节点认证之后得到确认。
新块的确认也可通过矿工
挖
到
并发布
的块来发现。其扩散过程和上述类似。通过之前的连接,新块以
inv
消
息发布出去,
而
接收节点
可以
通过
getdata
请求这些块
的详细信息
。
和对等节点的交易通过
inv
消
息来实现。如果收到了
getdata
信息,那么交易通过发送
tx
实现。对等节点收到有效的交易的信息后会通过类似的方式将其扩散。如果交易的信息在一段时间内没有被放进块中,那么交易将被从内存池中清除,而原节点将重新发送交易信息。
对于所有的广播,那些行为
不端
的节点(占用带宽和通过发布错误信息来浪费计算资源)将收到惩罚。如果一个节点惩罚分数超过门限值
-banscore=<n>
,它将被禁止
加入网络
若干秒。这个时间由
参数
-bantime=<n>
定义,默认值是
86400
秒,即
24
小时。
警告
为了应对
可能出现的
bug
和攻击,比特币开发者提供了
比特币警告服务
RSS
。比特币用户通过命令
getinfo
可以查看针对其特定客户端版本的错误信息。
这些信息通过
a
llert
消息尽可能多
扩散出去给每一个连接的对等节点。
错误信息
采用
特定的
ECDSA
私有密钥签名,只被极少数的开发者控制。
补充
资源:
如果你想了解
各种
消息的
详细
结构和所有的消息类别,
可以
参考比特币
Wiki
上的
协议说明
。
专访 Mable Jiang:复盘 Multicoin 投资方法论与 DeFi 洞察
原文标题:《对话 Mable:复盘 Multicoin Capital 的投资方法论与 DeFi 观察 | 链捕手》受访者:Mable Jiang,Multicoin Capital 执行董事撰文:王...
信标链、PoS、分片……接触以太坊 2.0 得先理解这些术语
原文标题:《以太坊 2.0 术语库》整理:ETH 中文网Attestation 证明证明是指验证者所发起的投票,由验证者的签名聚合而成,用以证明区块的有效性,投票通过验证者的余额进行加权。Attest...
手把手教你搭建 IPFS 私有网络
在联盟链的场景下,IPFS 作为去中心化存储的首选方案,本文将介绍如何使用 go-ipfs 搭建一个私有网络并进行简单使用。...