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裏中位數值.