1. 程式人生 > >eos原始碼賞析(二十二):EOS交易狀態何時才是不可逆的

eos原始碼賞析(二十二):EOS交易狀態何時才是不可逆的

作為本文的讀者,可能大部分都進行過eos代幣的轉賬操作。我們平時的交易過程中,能體驗到【立馬到賬】的感覺,這也是eos被越來越多的人認可的重要原因。然而在區塊鏈系統中一筆交易是否完成,有一個很重要的因素就是該筆交易在鏈上是否是可逆的。今天我們就來談談一筆交易在什麼情況下才是不可逆的。

在行文之前首先感謝大佬Raymond荊凱給予的幫助,同時建議瞭解下交易的基礎知識,荊凱大佬曾經寫了一篇文:

在文中提到有個pending的倒計時,同時幣乎的作者阿華區塊鏈寫過的幾篇文章,特別分析了一下當前區塊高度與不可逆區塊高度之間的關係,得到的結論是,大約不可逆區塊與當前區塊高度相差在334個區塊左右,換算成時間的話,大致是2.7分鐘左右。那麼這個pending倒計時是什麼,和區塊的不可逆之間有什麼關係呢。

我們都知道在eosio中使用了DPoS共識機制而非類比特幣的Pow共識機制。DPoS機制的基本邏輯是一筆交易打包在區塊之後,需要21個超級節點中的2/3以上的節點進行簽名確認,才認為是不可逆的。而節點生產區塊的

速度為0.5秒一個區塊,每個節點輪流出塊的過程中在6秒的時間內生產12個區塊。為什麼設定6秒生產12個區塊,BM在一些回答中提到:

6 seconds was chosen based upon the “maximum downtime” if a producer
goes off line. This matches Steem & BitShares where a single missed
block creates 6 seconds without any confirmation.

簡單的翻譯下:之所以選擇6秒鐘是和節點離線的最大時長有關的。

那麼我們來設想一筆交易執行節點A將交易資訊打包至區塊中,此時節點A已經確認,在執行完成之後還需要至少2/3以上的節點去確認。在eosio設計之初,節點確認只需要進行一輪即可,但在eos主網上線之前V神提出了不同的意見並給出了相關的建議,針對原有設計的安全性進行舉例分析,感興趣的同學可以關注下這個issue:

V神的質疑:
在這裡插入圖片描述

BM的回答:
在這裡插入圖片描述

注:本來標題想搞笑一點這樣寫的:震驚!V神和BM竟如此互懟。

最終,在eosio中,DPoS的節點確認修改為兩輪,而V神提到的這篇論文,筆者還在研讀,如有感興趣的也可以一起交流。

我們接著來看。當一筆交易完成打包之後,意味著當前節點以確認,還需要至少21個超級節點中的2/3以上確認,而加上需要兩輪確認,因此我們可以做出如下計算:
在這裡插入圖片描述

此處也基本可驗證上面荊凱和阿華提到的當前區塊高度和不可逆區塊高度之間的差值,最大為336。我們在查詢主網的資訊也可以看到類似的情況,兩者之間的差值為335:
在這裡插入圖片描述
而根據一個區塊生產的時間為0.5秒計算,從交易執行結束到變為不可逆狀態所需要的時間應為168s。當然由於網路的原因,這個不可逆狀態或多或少的會產生一些時間上的差異,那麼我們是否可以從程式碼中找到蛛絲馬跡來判斷何時是不可逆的麼。

在前面的文章我們分析出塊流程的時候有這個步驟:當前區塊高度小於最後一個不可逆區塊高度的時候,這個交易便是不可逆的了,來看:

1const auto& gpo = db.get<global_property_object>();
2         if( gpo.proposed_schedule_block_num.valid() && // if there is a proposed schedule that was proposed in a block ...
3             ( *gpo.proposed_schedule_block_num <= pending->_pending_block_state->dpos_irreversible_blocknum ) && // ... that has now become irreversible ...
4             pending->_pending_block_state->pending_schedule.producers.size() == 0 && // ... and there is room for a new pending schedule ...
5             !was_pending_promoted // ... and not just because it was promoted to active at the start of this block, then:
6         )

程式碼中也對區塊的幾種狀態給出瞭解釋即:當前節點生產區塊的高度小於最後一個不可逆區塊的高度時便為不可逆的。

本文從各位大佬已經積累的經驗出發,從程式碼及平時測試的經驗來分析DPoS機制中一筆交易最後是如何實現不可逆的過程。當然理解可能 也有偏差,還請各位多多指教。
如果你覺得我的文章對你有一定的幫助,請點選文章末尾的喜歡該作者。

如果你對eos開發感興趣,歡迎關注本公眾號,一起學習eos開發。

這裡寫圖片描述
微信公眾號
有任何疑問或者指教請新增本人個人微信,當然有對eos開發感興趣或者金庸粉的也可以新增一起交流,備註eos開發或金庸。
這裡寫圖片描述

個人微訊號