【EOS42章經】第21章: 交易發起的那一刻,發生了什麼: 談談交易的簽名
可能是最靠譜不忽悠的區塊鏈資訊平臺
在 EOS 上發起交易之後,發生了什麼?交易如何打包至區塊,又上鍊的?
這個過程雖然短暫,卻經過了多道流程。今天開始,我們來聊一聊EOS交易上鍊到最終成為不可逆這一過程。
限於學識所限,對這部分的理解可能存在諸多不當之處,還請多多指教。

transaction 概述
前面部分我們瞭解過一筆交易的結構。回顧一下:
交易分為兩部分:交易頭結構(transaction head),和交易中的actions的資訊。

交易之中所包含的Action:

那麼,在發起交易的時候發生了什麼呢?
對EOS的使用者來說,主要有如下2個部分:
-
使用錢包服務,為構建好的交易資訊簽名
-
將簽名之後的交易資訊傳送至EOS網路中
那麼, 具體是傳送到何處?
錢包服務,不論是使用cleos,還是使用的手機錢包或者Scatter,都會連線到一個運行了nodeos服務的節點。比如,以MeetOne錢包為例:

可以看到列出了多個節點。
簽名後的交易,會發送至對應的節點,藉助於節點,同步至EOS網路之中,進行後續的交易驗證,打包入塊,區塊廣播等流程。
今天,我們主要了解這兩個部分:
-
交易簽名(sign transaction)
-
傳送交易(push transaction)
交易簽名
交易簽名的過程,是在幕後發生的,不論你使用的是cleos的命令列工具,還是使用Scatter錢包或者手機錢包,簽名只是一瞬間的事情,輸入密碼,點選確認即可完成。
我們可能會好奇,在幕後發生了什麼?
假設我們發起這樣一筆交易:
從賬號`alice`為賬號`bob`轉出 `20 EOS`的代幣
會進行兩個過程:
-
對交易內容進行摘要處理
-
對摘要處理後的資訊簽名
摘要(digest)
首先,會對交易內容進行摘要(digest),可以理解為將交易內容進行雜湊運算,所用到的演算法的是SHA-256 。
在這一步,會將如下三者進行hash處理:
-
chain_id, 即交易所在的區塊鏈所對應的chain id,這是考慮了之後的跨鏈等情況
-
當前的交易
-
可能存在的上下文無關資料(context free data)
順便說一句,context free data是為了跨鏈的情形所準備的預留的資料結構,當前的資料之中都不包含這部分內容。
對應的程式碼,可以參見 transaction.cpp
的檔案中,sig_digest的方法:
digest_type transaction::sig_digest( const chain_id_type& chain_id, const vector<bytes>& cfd )const { digest_type::encoder enc; fc::raw::pack( enc, chain_id ); fc::raw::pack( enc, *this ); if( cfd.size() ) { fc::raw::pack( enc, digest_type::hash(cfd) ); } else { fc::raw::pack( enc, digest_type() ); } return enc.result(); }
進行摘要計算後的資料,用16進製表示,大致長這個樣子:
9d8815193d76ee236ef08e8b9fb675e6def3af8d8209d7665540ab9e17944e19
簽名
其次,會對這一摘要資料,呼叫相應許可權所對應的 私鑰 ,進行簽名。

EOS使用者,會用到ECDSA演算法(Elliptic Curve Digital Signature Algorithm ,橢圓曲線數字簽名演算法)來對交易進行簽名。
而ECDSA演算法也分為幾種,對EOS而言,常用的是secp256k1曲線的演算法,這也是比特幣在簽名時候所用到的。
感興趣的話,可以參考:
https://en.bitcoin.it/wiki/Secp256k1
簽名的格式為:
SIG_K1_K92jkGfvm2UQKtCzxTSVHnMkHQXe2hwtfQdRALjZ2cDSFFGX7DcaAWALbV9pbk5bPnQLDqReEew2qD4uVgmXQYpuEUBJR9

通過EOS瀏覽器,你可以在任 何一 筆交易之中,見到該簽名信息。
而後續在出塊時候,出塊節點會根據交易之中的這一簽名資訊,計算出來對應的公鑰,對交易進行核驗。
至此,我們拆解了簽名背後的兩個步驟。
下面,就是將簽名之後的資訊傳送到EOS網路之中了。
篇幅所限,後續部分,我們明天接著聊。EOS42章經系列中間暫停了一段時間,今天開始,恢復更新,還多謝各位朋友的關注。
EOS42 開創 去中心化 的未來
EOS42的賬號為: eos42freedom。
請為EOS42投票,支援我們繼續不停開拓去中心化解決方案的未來。