1.比特币新的结点A启动后,会从种子结点取到附近的结点信息,并且建立tcp连接
2.A联接上B后,A向B发送VERSION信息
3.B返回VERSION消息和B的时间戳
4.A保存B结点与A结点的时间戳的差值
同样A与C D E F结点连接并保存时间戳的差值,由小到大排序,在这些差值的组合中得到一个中位数,区块链程序中取得就是A结点当前的时间戳+中位数。
VERSION消息包括以下字段:
PROTOCOL_VERSION 本地区块链服务协议版本
nLocalNodeServices 本地服务
nTime 本地时间戳
addrYou 对方结点IP
addrMe 本地结点IP
nonce 本地结点nonce
strSubVersion 本地结点子版本
nNodeStartingHeight 本地结点开始高度
fRelayTxes 是否中转交易
每个结点本地维护了容量为200的数组vTimeOffsets,每个元素的值=连接结点的时间戳-当前结点时间戳,已经从小到大排好序.
AddTimeData方法往vTimeOffsets增加一个元素.
A与B获取本地的时间戳都是调用GetAdjustedTime方法,取本地时间戳+vTimeOffsets里中位数值.