新發布的區塊,交易在網絡上是如何傳播的?
比特幣工作在應用層(application layer:Bitcoin block chain),它的底層是一個網絡層(network layer:P2P overlay network)。
工作流程
所有節點都是平等的,沒有super node,master node。要加入網絡,至少有一個種子節點 seed node,與seed node聯系,它會告訴你它所知道的網絡中的其他節點,節點之間通過TCP通訊,有助於穿透防火牆。離開網絡不需要其他操作,不用通知其他節點,直接退出程序即可。其他節點沒有你的消息,一段時間之后就會把你刪掉。
設計原則
simple,robust but not efficient。每個節點維護一個鄰居節點的集合,消息傳播在網絡中采取floading的方式。節點第一次聽到某個消息時,把它傳播給所有鄰居節點,同時記錄下該消息已經收到過,當下次再收到時就不會轉發給鄰居節點。鄰居節點的選取是隨機的,沒有考慮底層的拓撲結構,例如一個在加利福尼亞的節點,他選取的鄰居節點可能在阿根廷,這樣的好處是增強robust,犧牲了efficient,你向身邊的人轉賬和你向遠處某地的人轉賬速度差不多。
比特幣系統中每個節點要維護一個等待上鏈的交易的集合,該集合中的交易都是等待要寫入區塊鏈的。第一次聽到某個交易時,把交易寫入該集合,並轉發交易給鄰居節點,以后再收到該交易不再轉發,避免交易在網絡上無線傳輸下去。轉發前提是交易是合法的,比如合法的簽名,以前沒有被花過。
可能會出現risk condition,就是出現兩個有沖突的交易,幾乎同時被廣播到網絡上,比如交易1)A-->B,交易2)A-->C(假設兩個交易花的是同一個幣),那么每個節點根據在網絡中的位置不同,有的可能先收到1)交易,有的可能先收到2)交易,並加入到集合中,之后再收到另外一個交易時,就認為是非法的,不予理會。
如果集合中的交易或者與其沖突的交易被寫到區塊鏈中,那么該交易就會從集合中刪掉。比如新發布的區塊里面包含交易1),那么該交易就會從集合中刪掉;如果新發布的區塊包含交易2),交易1)同樣被刪掉,因為此時該交易是非法交易。
新發布的區塊在網絡上的傳播與節點類似,每個節點除了檢查區塊的內容合法性之外,還要檢查是否是在最長合法鏈上。
越大的區塊傳播速度越慢,比特幣協議限制區塊大小最大為1M。因為比特幣網絡采用的這種傳播方式非常消耗帶寬,帶寬是瓶頸,按照1M的區塊大小來算,一個新發布的區塊可能需要幾十秒才能傳播到網絡上的絕大多數節點。
比特幣網絡的傳播屬於best effort。一個交易發布到比特幣網絡上,不一定所有節點都收到,而且不同節點收到交易順序也不一樣,網絡傳播存在延遲,也不是所有節點都按照比特幣協議規定去轉發,比如不轉發合法交易,或轉發非法交易。