刺猬文│以太坊交易信息解析方法
(圖片出自網絡,版權歸原作者所有)
上一篇刺猬文中,提到了合約進行編碼后的abi碼問題。之后有朋友問我,abi碼是干啥的?這個問題問的我無從回答——大家只要在百度上搜索一下,就有一大把一大把的現成答案啊。
這個朋友又問了我一句?這個abi編過的碼,要如何解析呢?
這個問題真是把我問住了。我想了半天,最后只能給他說,你還是去百度吧。
后來我也在百度上搜了一下,發現百度搜到的都是如何編碼,很少有如何對交易的payload字段進行解碼的方法,而且絕大多數都是講完了編碼原理以后,帶一句:“解碼就是編碼的逆過程,只要逆向一下就可以了”。
我暈,難道是我的智商有問題,沒辦法理解如此簡單的實現到底如何實現的么?
還是說,他們語焉不詳的原因,是他們也沒搞清楚?
亦或者文章都是你抄我,我抄你,第一個人這么說了,后面的人也就全這么說了呢?
這幾天添加擴展字段,對于這個問題剛好有點心得,于是寫出來和大家分享一下。
要對這個abi碼進行解碼,方法大致有2種:
第一種處理方法:直接使用JS函數來進行解碼:
在以太坊中,對于使用控制臺調用指定合約函數的,會使用JS來進行編碼。例如我們在控制臺中調用一個合約的test方法:
以太坊調用js編碼后的結果將是類似于:
msg="{\"jsonrpc\":\"2.0\",\"id\":20,\"method\":\"eth_sendTransaction\",\"params\":[{\"data\":\"0xf9fbd554000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046861686100000000000000000000000000000000000000000000000000000000\",\"from\":\"0xdc107ca137adfc975b1edb5ec96f51627c4bbda7\",\"to\":\"0x274863146a4471528f895a57ee1a128cfc705c0b\"}]}"
這樣的格式。其中data后面的編碼,就是以太坊調用js中的函數來實現的。
這個js文件在go-ethereum\internal\jsre\deps\web3.js。而編碼函數是:
相應的解碼函數:
從這些代碼中可以看出:JS既具有編碼功能,又具有解碼功能,完全可以實現編解碼功能。例如我們在Jsre.go文件中的Evaluate函數中添加如下代碼,就可以解碼數據了:
這段代碼,我們就可以將一串編過碼的數據“0x657468657265756d000000000000000000000000000000000000000000000000”,解碼成“ethereum”了,并且調用Get函數可以得到這個解過碼的數據。
但是在go語言下調用JS代碼個人覺得比較麻煩,需要修改jrse中的代碼。
第二種處理方法:使用以太坊的go代碼直接進行解碼:
在以太坊代碼中有個包叫做abi的,它的目錄是go-ethereum\accounts\abi。這個包
專門用來進行abi的相關處理。其中在abi.go文件中有一個函數 func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) 和 func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error)是專門用來進行編碼和解碼的。只要你先將相應的abi結構傳入進去,就可以對于編碼后的格式進行解碼了。
聽到這里肯定很多人覺得這多簡單啊,我調用unpack函數來解碼不就好了么?
真的是這么簡單么?
我們來看一下unpack的代碼:
1:首先它判斷你傳入的數據長度是否合理,也就是數據長度是否能被32整除。
2:其次它判斷你所需要解碼的方法名是否存在,這個判斷需要先調用JSON函數,將abi的json格式導入進來,從這個json格式中去查找是否存在你所需要解碼的函數。
3:判斷這個方法的輸出參數數量是否大于1。
等等,好像不大對啊,我們是要對用戶的調用函數和傳入的參數所編碼來進行解碼的,干嘛判斷這個方法的輸出參數呢?
大家看看代碼就知道了:對于方法來說,是判斷輸出參數的;對于事件來說,是判斷輸入參數的。
那么對于方法來說怎么才能進行解碼呢?
我的做法是:重新對這個函數的實現方法進行了修改。
上面的代碼就是我添加的代碼,使用這個代碼可以對于函數的輸入參數進行解碼。
這個代碼目前已經在播客鏈中使用了的。
如果這種嘗試對你有所啟發,歡迎你留言告訴我。
轉載于:https://blog.51cto.com/fxh7622/2285559
總結
以上是生活随笔為你收集整理的刺猬文│以太坊交易信息解析方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4、Hangfire在AspNetCor
- 下一篇: Pycharm中的红色小闪电含义