可能你也注意到了,在跟智能合約交互時,你的事務會自動包含inputdata。在MyCrypto錢包界面,這些數據有個簡單的標簽:“Data”——它是做什么的呢?
這篇文章就是從技術上解釋事務輸入數據是怎么一回事,它實質是什么,又是怎么工作的。
-MyCrypto錢包的高級事務設定-
什么是InputData?
我們先來看看這筆token轉賬交易。某個人發送了0ETH到?0xd26114cd6ee289accf82350c8d8487fedb8a0c07,而且Etherscan網站呈現了這是一筆意圖發送0.19OMGtoken到這個地址的事務。那么,EVM究竟是怎么知道,這個人想要轉賬某個數額的token到另一地址的呢?
你再仔細看Etherscan,就能看到這筆事務帶著inputdata。inputdata是發送者為這筆事務附加的額外數據,既可以是普通的文本,也可以是數字。但在這筆交易中,發送者使用這部分數據來“告訴”合約,讓合約運行特定的函數。智能合約本身是由一系列函數組成的。舉例而言,一個ERC-20token合約使用比如“transfer”來把token從A賬戶轉移到B賬戶,使用“balancerOf”函數來獲得某個地址的余額,等等。在我們研究的這筆交易中,你可以看到它調用了?transfer(address_to,uint256_value)?函數。
比特幣全網未確認交易數量為37078筆:金色財經報道,BTC.com數據顯示,目前比特幣全網未確認交易數量為37078筆,全網算力為345.76 EH/s,24小時交易速率為3.72交易/s,目前全網難度為47.89T,預測下次難度下調0.69%至47.56 T,距離調整還剩11天12小時。[2023/4/9 13:52:32]
這筆事務的輸入數據為0xa9059cbb0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa26152000000000000000000000000000000000000000000000000002a34892d36d6c74。你可以把這一長串的?十六進制?數據分解一下。開頭的0x表示這是一個十六進制數值,緊接著的8個字節是函數標識符,再然后就全部是以32字節為一組的函數參數。所以第一組是?0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa261520?而第二組是?000000000000000000000000000000000000000000000000002a34892d36d6c74。
-InputData分解-
比特小鹿即將通過SPAC在納斯達克上市,估值約為11.8億美元:3月28日消息,美國證券交易委員會 (SEC) 已批準比特小鹿 Bitdeer 和特殊目的收購公司 Blue Safari 的擬議業務合并。此次業務合并對 Bitdeer 的估值約為 11.8 億美元。業務合并完成后,合并后的公司 BTG 將成為納斯達克上市公司,股票代碼為 BTDR。
Blue Safari 公司董事會建議其股東在 2023 年 3 月 27 日的明確代理聲明中描述的擬議業務組合和相關提案方面投贊成票,參加 Blue Safari 公司的特別股東大會(EGM)。EGM 將于 2023 年 4 月 11 日美國東部時間上午 9:00 舉行,以批準包括業務組合在內的其他事項。[2023/3/28 13:30:27]
如果你在Etherscan上查看這些數據,你會看到它以下文這個形式呈現
十六進制是啥?
十六進制是一種計數系統,就像十進制和二進制一樣;十六進制使用數字0到9和字母A到F,來對應表示十進制的0到15。下面這種圖展現的就是這樣的對應關系。十六進制常常用來更直觀地表示大數字。
-十進制數字與對應的十六進制字符-
單個十六進制字符所能表示的最大數值是15,長度是4個比特。多個十六進制字符相連時,你要把每個字符的二進制表示前后拼接在一起,才能得到其十進制數值。舉個例子,0x5C,可以寫成0101(=5)和1100(=C),前后拼接就是01011100,這就是二進制形式的92,所以十六進制數0x5C的數值就是92。
知情人士:Alameda曾在2018年XRP的交易中損失超過三分之二的資產:金色財經報道,在FTX倒閉之前,人們認為Alameda Research是業內頂級的量化交易公司和做市商之一。然而,這種看法在很大程度上可能只是表面現象,最近的一份報告詳細說明Alameda早在 2018年就遭遇了財務困境。知情人士表示,2018年春季,Alameda因押注XRP而遭受重創,損失了Alameda超過三分之二的資產。知情人士解釋說,因此SBF開始再次征集貸款,并承諾20%的回報率。《華爾街日報》看到的一份文件顯示,SBF的律師解釋了Alameda如何在向貸方進行的一次特定推銷中成為頂級做市商,但律師沒有透露任何財務信息。
此外,報告詳細說明,當SBF創辦Alameda時,這家貿易公司通過套利賺取了數百萬美元。作為套利者,SBF聲稱機會來自日本和韓國等國家,因為比特幣在這些地區交易溢價。由于在韓國存在所謂的“泡菜溢價”,SBF表示BTC有時會高出30%,在日本則高出10%。有大量報道強調Alameda通過加密貨幣套利賺取了數百萬美元,但《華爾街日報》最近于 2022 年 12 月 31 日發表的一篇報道詳細說明了Alameda的交易并不總是有利可圖。[2023/1/3 22:21:17]
大多數編程語言都使用前綴0x作為絕對標識符,將十六進制數與其他的計數類型區別開來。這個前綴本身沒有任何意義,只是為了清晰。我們這篇文章也會采取一樣的做法,十六進制數都用0x開頭。
加密研究員:以太坊在合并后將成為通縮型資產:7月22日消息,IntoTheBlock研究主管Lucas Outumuro發推文稱,以太坊在合并(The Merge)后將成為通縮型資產,根據2022年歷史數據預測,以太坊的凈發行量可能在-0.5%到-4.5%之間,具體取決于網絡費用。[2022/7/22 2:31:09]
講完這些,我們繼續。如果你還是沒能理解十六進制,也不用擔心——對于理解inputdata來說不是必需的。
InputData與智能合約
InputData的首要用途就是與智能合約交互。大部分智能合約都使用?合約ABI規范,使得Etherscan這樣的網站能自動解碼inputdata并顯示事務所調用的具體操作。在我們上面那個例子中,這是一筆有關代幣合約的事務,而且代幣合約遵循ERC-20標準。這也就意味著,我們都知曉所有可能調用的函數,以及它們的?簽名。舉例,用于ERC-20合約的transfer函數的完整簽名總是?transfer(address,uint256),意味著這個函數需要兩個參數,所傳入的第一個參數會被解讀為一個地址,第二個參數會被解讀為一個未簽名的256位的數字。
Solidity語言有多種參數類型。如果你有興趣學習Solidity語言和智能合約,你可以在Solidity文檔頁面了解更多。
昆山市財政局開展數字人民幣工資發放試點工作:金色財經報道,近日,昆山市財政局的200余名在職人員收到了單位發放的首筆數字人民幣工資,昆山市財政局成為全市首個以數字人民幣開展部分工資發放的機關事業單位,昆山市數字人民幣應用范圍進一步拓展至財政業務領域。下一步,昆山市財政局將繼續擴大試點范圍,積極嘗試在市級所有預算單位在編職工的部分工資統發中發放數字人民幣,穩步推進數字人民幣在財政業務領域的應用推廣,助力拓寬數字人民幣應用場景。(移動支付網)[2022/7/6 1:54:52]
函數簽名
如你所見,transfer函數的簽名是?transfer(address,uint256),這個對所有ERC-20合約都是一樣的。如果某個合約給轉賬函數安排不一樣的參數類型,比如一個地址和一個uint128,這個合約就不是“ERC-20兼容”的。
要獲得一個函數的簽名的十六進制形式,我們先要獲得這個函數的SHA-3哈希值的前面4個字節。而要想知道一個數據的Keccak-256哈希值,你可以使用JavaSceript語言的web3庫,或者求助于這樣的在線工具。在這個工具頁面填入?transfer(address,uint256),它會顯示?0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b?作為結果。取前8個字符,就是?a9059cbb,恰好跟上述事務的MethodID一致。
另一個例子:ERC-20標準合約的approve函數的函數簽名是?approve(address,uint256),其SHA-3哈希值是?0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba,首8個字符是?095ea7b3,因此,調用許可函數的inputdata開頭就會是0x095ea7b3。這筆發往DAItoken合約的事務就是如此。
地址和數量
每一個參數的長度都是32字節,或者說64個十六進制字符。但以太坊地址只有40個字節長。為了解決這個問題,地址參數要用0來填充。在十六進制里面,0x0000123和0x123是一樣的,因此?0x0000000000000000000000004bbeeb066ed09b7aed07bf39eee0460dfa261520等同于?0x4bbeeb066ed09b7aed07bf39eee0460dfa261520,而且?0x00000000000000000000000000000000000000000000000002a34892d36d6c74?也就等于?0x2a34892d36d6c74。那為什么我們要填充這些0呢?
就像我們上面說到的,Solidity合約可以接受的最大數值是2256?-1,剛好是32字節。使用固定的長度可以讓EVM和其他應用在解碼數據時候更輕松,因為你可以假設每一個參數的長度都是一樣的。
那數組和字符串呢?
如上所述,在inputdata中使用數組和字符串,情形會有些許不同。因為數組本質是多個東西組成的一個列表。舉個例子,1、2、3三個數所組成的列表在大多數編程語言中都可以寫為。要在事務中發送這種數據,列表中的每一個對象都要作為32字節一組的數據發送,列在inputdata的結尾。指明數組長度的指針就作為參數。
假定我們有一個叫做?calledmyFunction?的函數,接收一個地址和數字的數組作為參數,即?myFunction(address,uint256)。該函數的函數簽名是0x4b294170。地址這一項,我們照上面所說的操作。因為我們的數組包含3個對象,數組的長度用十六進制表示為0x3。然后每個對象都要占據恰好32自己的空間,且數組要放在所有其它參數之后,所以數組會從3232=64字節之后開始。
-例子:input數據要按照32字節一組來切分-
因為字符串的長度是任意的,它們要按32字節一組來切分,處理方式跟數組相同。
像Etherscan這樣的網站是如何解碼inputdata的?
哈希函數是單向函數,所以如果你只有函數簽名的哈希值,是不可能會恢復出函數簽名的。合約的所有者可以將合約的ABI作為JSON文件上傳,就像這個例子,這可以用來拿到函數簽名的哈希值。
即使合約的所有者不上傳合約的ABI,也能夠解碼input數據。因為,ERC-20合約函數的簽名都是一樣的,因此Etherscan只需使用一個預定義的合約ABI即可服務大部分合約。舉個例子,ERC20合約的轉賬函數的合約ABI如下文所示:
如果輸入數據里的簽名與任意一個預定義的函數相匹配,Etherscan都能解碼inputdata。
inputdata的大小有沒有什么限制?
既有,也沒有。以太坊協議沒有為inputdata的長度設固定的上限,但inputdata也消耗gas。單個區塊可用的Gas數量是有上限的,在本文撰寫時是800萬。每一個0字節都要消耗4gas,而非零的字節要消耗68gas。一筆標準的ETH轉賬事務要消耗21000單位gas,所以,如果不考慮調用合約的交易,當前inputdata的最大長度是2MB,或者全部用非零字節的話,就是0.12MB。因為inputdata不會只有零,也不會一個0也沒有,所以實際的大小會在兩者之間。
如果你想看實時的區塊Gas上限,可以看ETHStats.net。
-特定區塊的Gas上限-
只需將鼠標停留在“GasLimit”部分的某個區塊上,就可以看到其Gas上限。
更多信息
合約ABI規范
ERC-20Token標準
以太坊虛擬機
參考
以太坊黃皮書
Solidity文檔
原文鏈接:
https://blog.mycrypto.com/why-do-we-need-transaction-data-/
作者:?MaartenZuidhoorn
翻譯:?阿劍
Tags:DATDATAATAPUTBig Data ProtocolPDATAmatador-tokenintelligencefogcomputerchain
尊敬的用戶: WBF即將在小目標專區上線TESLAMOON/USDT交易對,具體上線時間為:充值時間:2021年5月13日17:00交易時間:2021年5月13日17:00提幣時間:2021年5.
1900/1/1 0:00:00大家好,我是你們的朋友浩然論幣HR12818,浩然論幣公眾號同步專注數字貨幣行情分析,爭取為廣大幣友傳遞最有價值的幣市信息,歡迎廣大幣友的關注與點贊.
1900/1/1 0:00:00這篇文章從頭開始,把所有關于數字貨幣市場的條件做了幾條歸納,希望能給想進入市場的小白們一些幫助。如果你剛剛開始關注加密貨幣,想知道是否要投資,以下是你在購買之前需要知道的10件事.
1900/1/1 0:00:00幾個月前,Doge在整個鎮子中獨領風騷,而現在則要拿著放大鏡才能找到他。新的資金可以帶來新的流動性。Doge曾希望這種流動性能將街道上的臟東西清理干凈。 但他弄錯了。 且大錯特錯.
1900/1/1 0:00:00尊敬的LBank藍貝殼用戶:因故,原定2021年5月13日16:00(UTC8)上線的BAFE,將延遲上線,具體上線時間將以公告形式另行通知,給您帶來的不便敬請諒解.
1900/1/1 0:00:00尊敬的XT用戶: 因近期市場行情上漲,上線熱門項目較多,平臺流量激增。為更好的服務用戶,確保用戶資金安全,XT將對錢包進行升級維護,預計完成時間為兩周.
1900/1/1 0:00:00