央行數字貨幣技術架構---HashGraph共識算法之虛擬投票

在上一篇博文中,我們大致講解了一下HashGraph共識算法的基本原理,在本節中,我們將講述虛擬投票過程,並且分析如果有作惡節點,HashGraph共識算法怎樣識別並處理。我們還會以上一篇博文件中的場景爲例來進行講解。
系統初始狀態如下圖所示:
在這裏插入圖片描述
此時華東、華西、華南、華北節點的HashGraph均只有各自的一個節點,且內容完全不一樣。假設開始時刻,隨機性塊定華西節點向華北節點發送Gossip消息。
華西節點首先檢查自己的HashGraph,發現其只有一個節點,即最新事件2代表的頂點,沒有與華北節點共同的頂點,因此華西節點可以確定,事件2是華北節點所不知道的,因此向華北節點發送Gossip消息如下所示:
在這裏插入圖片描述
華西節點向華北節點發送的消息如下所示:

[
	{
	    “eventId”: e2,
	    “timestamp”: t2,
	    "sender": 華西節點,
	    “txs”: [
	        {
	            “txId”: x2,
	            “vin”: [
	                {“acct”: 00000, “amt”: 2000}
	            ]
	            “vout”: [
	                {“acct”: w2, “amt”: 2000}
	            ]
	        }
	    ],
	    “hash": "e2_hash",
	    “selfParentHash”: “e0_hash”,
	    “otherParentHash”: “e0_hash”
	}
]

華北節點接收到這個消息之後,首先執行事件2中對應的UTXO交易,即向錢二發幣2000元,然後在自己的HashGraph上生成新的頂點5,其內容如下所示:

{
    “eventId”: e5,
    “timestamp”: t5,
    "inNode": 華西節點,
    "outNode": NULL,
    “txs”: [
        {
            “txId”: x2,
            “vin”: [
                {“acct”: 00000, “amt”: 2000}
            ]
            “vout”: [
                {“acct”: w2, “amt”: 2000}
            ]
        }
    ],
    “hash": "e5_hash",
    “selfParentHash”: “e4_hash”,
    “otherParentHash”: “e2_hash”
}

此時華北節點的HashGraph則變爲如下形式:
在這裏插入圖片描述
接下來華北節點需要給華西節點發送回執信息,此時華北節點遍歷自己保存的HashGraph,由事件5開始,其需要找到outNode等於華西節點的頂點,其發現頂點5不能滿足要求,同時inNode等於華西節點,因此事件5中的交易是華西節點所知道的,因此不需要保存。於是接着通過selfParentHash找到頂點4,發現同樣不能滿足要求,而此時已經達到端點,因此得到只有事件4中的交易是需要傳遞給華西節點的交易。其消息如下所示:

[
	{
	    “eventId”: e4,
	    “timestamp”: t4,
	    "inNode": 華北節點,
	    "outNode": NULL,
	    “txs”: [
	        {
	            “txId”: x4,
	            “vin”: [
	                {“acct”: 00000, “amt”: 4000}
	            ]
	            “vout”: [
	                {“acct”: w4, “amt”: 4000}
	            ]
	        }
	    ],
	    “hash": "e4_hash",
	    “selfParentHash”: “e0_hash”,
	    “otherParentHash”: “e0_hash”
	}
]

華西節點接收到這個節點之後,首先執行交易4,即向李四發幣4000元。接着其生成事件6:
在這裏插入圖片描述
其內容如下所示:

{
    “eventId”: e6,
    “timestamp”: t6,
    "inNode": 華北節點,
    "outNode": NULL,
    “txs”: [
        {
            “txId”: x4,
            “vin”: [
                {“acct”: 00000, “amt”: 4000}
            ]
            “vout”: [
                {“acct”: w4, “amt”: 4000}
            ]
        }
    ],
    “hash": "e6_hash",
    “selfParentHash”: “e2_hash”,
    “otherParentHash”: “e5_hash”
}

此時事件5也需要做出相應的改變:

{
    “eventId”: e5,
    “timestamp”: t5,
    "inNode": 華西節點,
    "outNode": 華西節點,
    “txs”: [
        {
            “txId”: x2,
            “vin”: [
                {“acct”: 00000, “amt”: 2000}
            ]
            “vout”: [
                {“acct”: w2, “amt”: 2000}
            ]
        }
    ],
    “hash": "e5_hash",
    “selfParentHash”: “e4_hash”,
    “otherParentHash”: “e2_hash”
}

此時華西節點的HashGraph結構如下所示:
在這裏插入圖片描述
接着華西節點確定向華東節點發送消息,其從HashGraph的最新事件6開始,向前遍歷,找到outNode爲華東節點或者到達最老節點爲止,當遇到事件6時,其outNode爲NULL,因此取出其內交易x4加入到交易棧中,然後找其父節點,這時遇到事件2,事件2的outNode也爲NULL,不滿足條件,將其中交易x2加入到交易棧中,繼續向前找,此時事件2的selfParentHash爲空事件,因此意味着已經結束,此時華西節點構造的消息如下所示:

[
	{
	    “eventId”: e2,
	    “timestamp”: t2,
	    "inNode": 華西節點,
	    "outNode": NULL,
	    “txs”: [
	        {
	            “txId”: x2,
	            “vin”: [
	                {“acct”: 00000, “amt”: 2000}
	            ]
	            “vout”: [
	                {“acct”: w2, “amt”: 2000}
	            ]
	        }
	    ],
	    “hash": "e2_hash",
	    “selfParentHash”: “e0_hash”,
	    “otherParentHash”: “e0_hash”
	},
	{
	    “eventId”: e6,
	    “timestamp”: t6,
	    "inNode": 華北節點,
	    "outNode": NULL,
	    “txs”: [
	        {
	            “txId”: x4,
	            “vin”: [
	                {“acct”: 00000, “amt”: 4000}
	            ]
	            “vout”: [
	                {“acct”: w4, “amt”: 4000}
	            ]
	        }
	    ],
	    “hash": "e6_hash",
	    “selfParentHash”: “e2_hash”,
	    “otherParentHash”: “e5_hash”
	}
]

華東節點接收到該消息後,首先執行交易隊列中的交易,先執行x2再執行x4,然後生成事件7,如下所示:
在這裏插入圖片描述
事件7的內容如下所示:

{
    “eventId”: e7,
    “timestamp”: t7,
    "inNode": 華西節點,
    "outNode": NULL,
    “txs”: [
        {
            “txId”: x2,
            “vin”: [
                {“acct”: 00000, “amt”: 2000}
            ]
            “vout”: [
                {“acct”: w2, “amt”: 2000}
            ]
        },
         {
            “txId”: x4,
            “vin”: [
                {“acct”: 00000, “amt”: 4000}
            ]
            “vout”: [
                {“acct”: w4, “amt”: 4000}
            ]
        },
    ],
    “hash": "e7_hash",
    “selfParentHash”: “e1_hash”,
    “otherParentHash”: “e6_hash”
}

同時需要更新事件6中內容,將輸出節點改爲華東節點:

{
    “eventId”: e6,
    “timestamp”: t6,
    "inNode": 華北節點,
    "outNode": 華東節點,
    “txs”: [
        {
            “txId”: x4,
            “vin”: [
                {“acct”: 00000, “amt”: 4000}
            ]
            “vout”: [
                {“acct”: w4, “amt”: 4000}
            ]
        }
    ],
    “hash": "e6_hash",
    “selfParentHash”: “e2_hash”,
    “otherParentHash”: “e5_hash”
}

在這一過程中我們看到,決策過程中需要事件6,而事件6是由華北節點決定的,可以視爲華北節點的投票,但是這一過程發生成華西節點中,與華北節點無關,因此我們稱這個過程爲虛擬投票。
另外,雖然HashGraph是一個有向無環圖(DAG),但是在Gossip消息形成過程中,其只需要處理selfParentHash組成的鏈即可,實際上是否區塊鏈類似的。但是在我們的迷你係統中,有四個節點,因此存在四條並行的鏈,這樣就可以提高系統並行處理能力。
在本篇博文中,我們講述了HashGraph共識算法中虛擬投票的概念,將上一篇博文中的過程映射到具體的代碼實現上。在下一篇博文中,我們首先完成整個消息同步過程,使系統達到新的統一狀態。然後我們將講述系統怎樣避免雙花問題,例如錢二同時向華西和華北兩個節點向趙一轉賬1500元和800元,在實際應用中只能一筆成功,但是在並行系統下,由於幾乎是同時收到這兩個請求,我們需要在共識協議中支持避免類似這種雙花的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章