【EOS42章經】第22章: 交易廣播至出塊節點
可能是最靠譜不忽悠的區塊鏈資訊平臺
交易簽名後,如何經過出塊節點確認,最終進入到區塊之中?
接著上一章,我們今天來聊一聊交易傳送到出塊節點的過程,以及出塊節點的驗證。
對於EOS中交易確認、打包、成為不可逆區塊這一過程,我所瞭解的可能並不足夠深入。
限於學識所限,對這部分的理解可能存在諸多不當之處,還請多多指教。
另外,最近這幾篇關於交易上鍊的過程,可能多少會技術性偏強一些,還請各位讀者見諒。
作者: 荊凱( EOS42中文 社群 負責人)
簽名後的交易傳送至節點

上一章我們提到過,一筆交易指令,首先會通過 錢包 進行簽名。簽名後的交易資料,會通過網路傳送到所連線的節點伺服器。
這裡所說的節點,是指的執行著nodeos程式的節點,無論是全節點,還是出塊節點,均需要執行該程式,會用於處理跟EOS網路相關的諸多事情,比如,確認交易,出塊,同步區塊等等。你可以將其簡單理解為EOS網路中的伺服器。
舉個例子,Alice發起的一筆交易轉賬給Bob。Alice先通過錢包對這筆交易進行了簽名,然後,簽名後的資料,可以向一個自己建立的節點(比如,上圖中的Node1)推送簽名後的交易資料,也可以直接將資料傳送給出塊節點(BlockProducer BP1)。
這裡,我們假設是非出塊的節點 Node1 接收到了這筆轉賬的交易資料。Node1 會驗證交易資料,如無問題,則轉發到通過P2P形式所關聯的節點之中,可以理解為將交易廣播至EOS網路之中。
非出塊節點 Node1 對交易進行驗證
接著上面的例子,Node1會對交易進行校驗,主要分為兩個部分:
-
檢驗交易的許可權,是否滿足對應的許可權要求
-
檢驗交易的簽名,是否有效
我們來看一下。
在這一步,會檢查交易之中所宣告的許可權,是否滿足action的最低許可權要求。從交易的簽名資料之中,獲取到action發起者所擁有的public key。
從1.5版本開始,EOSIO軟體採用了 多執行緒的方式,從交易簽名中恢復公鑰,這帶來的影響是節點同步區塊的速度會加快,不過,由於生產區塊的過程仍然是單執行緒的,並未降低CPU的時間。
對於EOS系統合約級別的指令,如修改賬號許可權的授權、連結授權等指令,它的執行許可權permission是固定的,需要檢測簽名的keys是否具備相應的permission,所用到的是: check_updateauth_authorization.
對於其他的指令進行許可權檢測時,會取出來對應的許可權資料,並進行比較,如果滿足了最低許可權的要求,則交易指令的許可權檢測就通過了。
Node1這個非出塊節點,會啟動名為chain_plugin的外掛服務。在傳送交易時候,這裡用到的,是該外掛服務的push_transaction 操作,通過非同步的方式,將該筆交易傳播至網路;而接收到該筆交易的出塊節點,則會進一步進行交易驗證,並在自己的出塊時間內,打包至區塊之中,然後廣播出去。
出塊節點對接收到的交易進行打包
為了方便理解,我們省略掉了啟動節點、同步區塊的過程,直接假設出塊節點BP1正在構建新的區塊,此時,接收到了 Alice 發給Bob 的這一筆交易。
在產生一個新的區塊時候,新區塊的狀態,會初始化為未完成狀態(pending)。然後,開始將接收到的交易進行打包入塊的操作。
這一操作,主要是由 Chain_controller 這一核心控制器的push_transaction 功能來完成的。根據註釋的解釋,該方法是新交易上鍊的起始點,會校驗交易的許可權,並決定是立即執行,還是延期執行(delay it).最後,會將交易的 receipt 也插入到未完成狀態(pending)的區塊中去。
初始化區塊完成後,就對接收到的交易進行驗證。校驗的部分,我們在上一節已經說過了。此處不再重複。
執行Action
驗證許可權無誤之後,出塊節點會執行交易之中所包含的指令(Action), 即,從Alice的賬戶轉到Bob 到賬戶10 個EOS 這一筆指令。
這一指令執行完成之後,會將回執資訊(CPU的使用情況、NET的使用情況)寫入到交易之中,並打包到正在產生的區塊裡。
BP1這個出塊節點,會持續接收傳入的交易,並打包至區塊之中。在區塊生成後,會進行掃尾工作:
-
刪除無效區塊
-
更新出塊節點許可權等
除此之外,出塊節點還會將所建立的區塊廣播出去,供其他的出塊節點進行確認,這一過程,我們後續單獨去介紹了。順便說一下,在EOS網路中,每個區塊的時間為0.5s,每個當選的出塊節點會連續產出12個區塊,然後切換到下個出塊節點。
到這裡,我們大致瞭解了交易的廣播、區塊的生產和打包的過程。
其他問題
仍有多個相關的問題,有待共同探討:
-
從非出塊節點 Node1 廣播交易至出塊節點BP1, 是如何進行的?
-
非出塊節點Node1,會執行所接收到的交易麼?是否會寫入交易回執到交易之中?
-
出塊節點BP1,在接收到了交易之後,是如何執行對應的Action的?
-
出塊節點執行完成的交易,會如何廣播至網路中,告知該交易已經完成了?
-
如果所接收到的交易存在異常,出塊節點會如何處理?
….
交易建立到成為不可逆區塊一部分, 這一過程對筆者而言,是理解起來相對困難的一部分。雖然閱讀了部分原始碼,也參考了許多作者的解讀,但是,不得不說此篇文章很可能會存在許多理解不當之處,一定請讀者多多指正。
寫下此文的目的,是為了儘可能幫助非技術的讀者也能夠對EOS交易全流程有所理解,此文拋磚引玉,期待更多人蔘與進來,豐富EOS生態之中的解讀文章,讓EOS的一些知識,儘可能不再侷限於黑盒子之中,而是讓普通人也能夠看得到。
參考資料
在寫這部分內容時,參考了多篇文章,僅此致謝各位技術作者,由於你們的辛勤努力,讓更多的人瞭解EOS的底層原理。
-
Itleaks的文章: EOS原始碼分析 3.EOS許可權模型機制分析
https://blog.csdn.net/ITleaks/article/details/80422288
-
[EOS原始碼分析]10.EOS區塊同步及生產
https://blog.csdn.net/ITleaks/article/details/80591159
-
幣乎作者OldCat的文章, eos原始碼賞析(二十):EOS智慧合約之push_transaction的天龍八“步”
https://bihu.com/article/1380289
部落格園作者 劉文彬 解讀EOS外掛的多篇文章:
-
EOS行為核心:解析外掛chain_plugin
https://www.cnblogs.com/Evsward/p/chainPlugin.html
-
EOS生產區塊:解析外掛producer_plugin
https://www.cnblogs.com/Evsward/p/producerPlugin.html
-
Controller: EOS區塊鏈 核心控制器
https://www.cnblogs.com/Evsward/p/controller.html
EOS Live的開發者Jerry的文章:
-
原創 | EOS原始碼解析 使用多執行緒從簽名生成對應公鑰
https://eos.live/detail/18643
-
原創| 原始碼解析 producer_plugin 之區塊的生產流程
https://eos.live/detail/15375
EOSCity的Chestor Kuo的文章:
-
EOSIO 節點出塊流程
https://eoscity.io/article/20181228/article1_20181228.html
EOS42章經,和你一起了解EOS的方方面面。
EOS42 開創去 中心化 的未來
EOS42的賬號為: eos42freedom。
請為EOS42投票,支援我們繼續不停開拓去中心化解決方案的未來。