ASCH區塊鏈防資料篡改的情景演示

meilong_whpu發表於2018-01-31

背景:部署三個節點(A/B/C)的區塊鏈,對節點A上的資料庫直接進行修改,將使用者Ⅰ的balance和u_balance由1000增加修改成2000,另外兩個節點(B、C)上面的資料保持不變,仍然是1000。

資料篡改之後的現象:使用者Ⅰ登陸節點A的系統,檢視餘額為2000;而登陸節點(B/C)的系統,檢視餘額為1000。

交易操作:使用者Ⅰ登陸節點A的系統,然後發起向使用者Ⅱ轉賬1500的操作,轉賬交易成功,該筆交易進入節點A的待確認交易資料列表中,同時進行廣播。此時,

交易資料的廣播:節點(B/C)在收到交易資料的廣播訊息之後,對交易進行重新執行,發現使用者Ⅰ的餘額不足,故不接受該筆交易資料,無法進入待確認交易資料列表中。

建立新區塊E之前的資料情況:在節點A上,使用者Ⅰ的餘額變為500(忽略手續費),使用者Ⅱ的餘額未變化;能查到此條待確認交易資料。在節點(B/C)上,使用者Ⅰ和Ⅱ的餘額未變化;待確認交易資料列表中無此條交易資料。

建立新區塊E並上鏈:節點A上的受託人建立一個新區塊E,該區塊E包括了此條交易資料,並將此區塊E在本地進行上鍊,同時廣播給其他節點(B/C),其他節點收到該區塊E之後,由於對該區塊E中包含的交易資料在其他節點(B/C)上無法執行通過,故其他節點將忽略此區塊E。至此,節點A的區塊鏈高度要大於節點B/C的區塊鏈高度。

建立新區塊E之後的資料情況:在節點A上,使用者Ⅱ的餘額增加了1500,已經沒有此條待確認交易資料。在節點(B/C)上,使用者Ⅰ和Ⅱ的餘額未變化;待確認交易資料列表中無此條交易資料。

繼續建立新區塊X/Y/Z:由於每個節點建立區塊的間隔時間為10秒,建立下一個區塊的節點可能是節點A或者節點B/C(B或C建立新區塊的邏輯一樣)。按以下情況來假設分析:

1、若是節點A上的受託人繼續獲得了建立區塊的權利,先將建立區塊的新高度及ID等提議資訊廣播給其他節點B/C,節點B/C收到提議之後,發現該提議的區塊高度不等於本地區塊鏈的最後一個區塊的高度+1,則不回覆投票資訊給節點A;節點A由於獲得的贊成票數不足三分之二,則無法建立新的區塊。

但是,此時節點B/C發現收到的區塊高度已經大於了本地區塊鏈的高度了,為了防止區塊鏈落後,則發起同步區塊鏈的操作,隨機的從某個節點進行同步。假設選擇了節點C,由於區塊高度一樣則無需同步;假設選擇了節點A,則將區塊E同步到節點B中,但是在同步過程中該區塊的交易資料無法執行通過,則直接結束同步,無任何實質性的同步資料。

2、假設節點B上的受託人建立下一個區塊X,由於節點B在建立新區塊時得到了節點C的共識(即達到了三分之二),故成功建立新區塊X並上鏈,同時節點C也將新區塊X上鍊。而節點A在收到新區塊X之後,發現區塊X的前一個區塊ID等於節點A本地鏈中最後一個區塊(區塊E)的前一個區塊ID,並且區塊X的高度等於本地區塊E的高度,但是區塊X與區塊E的ID不同,從而判斷存在分叉(相同的高度和前區塊而不同的ID),節點A將忽略區塊X。

3、假設節點C上的受託人繼續建立下一個區塊Y,此時邏輯跟節點B建立區塊X一樣,節點B與節點C達成共識,同時將區塊Y上鍊,而節點A收到區塊Y之後,發現區塊Y的前區塊ID不等於本地鏈的最後一個區塊E的ID,但是本地鏈最後一個區塊E的高度+1等於區塊Y的高度,說明存在分叉(高度正確但是不同的前區塊),節點A將忽略區塊Y。

4、假設接下來由節點A上的受託人建立下一個區塊Z,經過第2、3步其他節點建立區塊之後,此時節點A上的區塊鏈高度與其他兩個節點的區塊鏈高度達成了一致,在建立新區塊的過程中通過提議的個數能達到三分之二,則在節點A中能將區塊Z上鍊,但是在同步區塊Z到其他節點時,由於區塊Z的前區塊ID不等於其他節點最後一個區塊的ID,則也會認為是分叉,被忽略。

5、假設接下來由節點B上的受託人建立新的區塊W,與節點B建立新區塊X時一樣,在節點C上能達成共識並上鏈,節點A收到區塊W之後,發現區塊W的高度已經大於了本地區塊E的高度+1,則從其他節點(B或C)執行區塊同步。

在同步過程中,將以前的區塊E刪除並將區塊E包含的交易資料進行回滾操作。

建立至少三個新區塊之後的資料情況:使用者Ⅰ登陸節點A的系統,檢視餘額為2000,使用者Ⅱ的餘額被還原;而登陸節點(B/C)的系統,檢視使用者Ⅰ的餘額為1000,使用者Ⅱ的餘額未變化。即使用者資料恢復成了資料篡改之後的情況,所有與篡改相關的交易均被回滾。

相關文章