日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

刺猬文│以太坊交易信息解析方法

發(fā)布時間:2024/1/8 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 刺猬文│以太坊交易信息解析方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(圖片出自網(wǎng)絡,版權歸原作者所有)


上一篇刺猬文中,提到了合約進行編碼后的abi碼問題。之后有朋友問我,abi碼是干啥的?這個問題問的我無從回答——大家只要在百度上搜索一下,就有一大把一大把的現(xiàn)成答案啊。


這個朋友又問了我一句?這個abi編過的碼,要如何解析呢?


這個問題真是把我問住了。我想了半天,最后只能給他說,你還是去百度吧。


后來我也在百度上搜了一下,發(fā)現(xiàn)百度搜到的都是如何編碼,很少有如何對交易的payload字段進行解碼的方法,而且絕大多數(shù)都是講完了編碼原理以后,帶一句:“解碼就是編碼的逆過程,只要逆向一下就可以了”。


我暈,難道是我的智商有問題,沒辦法理解如此簡單的實現(xiàn)到底如何實現(xiàn)的么?


還是說,他們語焉不詳?shù)脑?#xff0c;是他們也沒搞清楚?


亦或者文章都是你抄我,我抄你,第一個人這么說了,后面的人也就全這么說了呢?


這幾天添加擴展字段,對于這個問題剛好有點心得,于是寫出來和大家分享一下。


要對這個abi碼進行解碼,方法大致有2種:


第一種處理方法:直接使用JS函數(shù)來進行解碼:


在以太坊中,對于使用控制臺調(diào)用指定合約函數(shù)的,會使用JS來進行編碼。例如我們在控制臺中調(diào)用一個合約的test方法:


以太坊調(diào)用js編碼后的結果將是類似于:


msg="{\"jsonrpc\":\"2.0\",\"id\":20,\"method\":\"eth_sendTransaction\",\"params\":[{\"data\":\"0xf9fbd554000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046861686100000000000000000000000000000000000000000000000000000000\",\"from\":\"0xdc107ca137adfc975b1edb5ec96f51627c4bbda7\",\"to\":\"0x274863146a4471528f895a57ee1a128cfc705c0b\"}]}"


這樣的格式。其中data后面的編碼,就是以太坊調(diào)用js中的函數(shù)來實現(xiàn)的。


這個js文件在go-ethereum\internal\jsre\deps\web3.js。而編碼函數(shù)是:



相應的解碼函數(shù):



從這些代碼中可以看出:JS既具有編碼功能,又具有解碼功能,完全可以實現(xiàn)編解碼功能。例如我們在Jsre.go文件中的Evaluate函數(shù)中添加如下代碼,就可以解碼數(shù)據(jù)了:



這段代碼,我們就可以將一串編過碼的數(shù)據(jù)“0x657468657265756d000000000000000000000000000000000000000000000000”,解碼成“ethereum”了,并且調(diào)用Get函數(shù)可以得到這個解過碼的數(shù)據(jù)。


但是在go語言下調(diào)用JS代碼個人覺得比較麻煩,需要修改jrse中的代碼。


第二種處理方法:使用以太坊的go代碼直接進行解碼:


在以太坊代碼中有個包叫做abi的,它的目錄是go-ethereum\accounts\abi。這個包

專門用來進行abi的相關處理。其中在abi.go文件中有一個函數(shù) func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) 和 func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error)是專門用來進行編碼和解碼的。只要你先將相應的abi結構傳入進去,就可以對于編碼后的格式進行解碼了。


聽到這里肯定很多人覺得這多簡單啊,我調(diào)用unpack函數(shù)來解碼不就好了么?

真的是這么簡單么?


我們來看一下unpack的代碼:


1:首先它判斷你傳入的數(shù)據(jù)長度是否合理,也就是數(shù)據(jù)長度是否能被32整除。


2:其次它判斷你所需要解碼的方法名是否存在,這個判斷需要先調(diào)用JSON函數(shù),將abi的json格式導入進來,從這個json格式中去查找是否存在你所需要解碼的函數(shù)。


3:判斷這個方法的輸出參數(shù)數(shù)量是否大于1。




等等,好像不大對啊,我們是要對用戶的調(diào)用函數(shù)和傳入的參數(shù)所編碼來進行解碼的,干嘛判斷這個方法的輸出參數(shù)呢?


大家看看代碼就知道了:對于方法來說,是判斷輸出參數(shù)的;對于事件來說,是判斷輸入?yún)?shù)的。




那么對于方法來說怎么才能進行解碼呢?


我的做法是:重新對這個函數(shù)的實現(xiàn)方法進行了修改。




上面的代碼就是我添加的代碼,使用這個代碼可以對于函數(shù)的輸入?yún)?shù)進行解碼。



這個代碼目前已經(jīng)在播客鏈中使用了的。


如果這種嘗試對你有所啟發(fā),歡迎你留言告訴我。



轉(zhuǎn)載于:https://blog.51cto.com/fxh7622/2285559

總結

以上是生活随笔為你收集整理的刺猬文│以太坊交易信息解析方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。