前段時間,Poly Network 被盜事件的一個小插曲,一地址向黑客地址轉賬在 input data 中告知其 USDT 已被凍結,不要使用 USDT,黑客知曉后向該地址轉賬 13.37 ETH。
事后很多人便通過 input Data 在區塊鏈上“聊天”向黑客“索要”虛擬貨幣,那么我們經常在區塊鏈瀏覽器中看到的 input Data 到底是什么?知道創宇區塊鏈安全實驗室 為您解答。
在以太坊協議中,當交易(transaction)為合約創建時,input data 是賬戶初始化程序的 EVM 代碼;
而當交易(transaction)為消息調用時,input data 是合約函數調用數據。正常情況下簡單的消息調用如調用轉賬函數時需要填寫你要轉賬的地址 _to 和你要轉賬的數量 _amount,這些基本信息都包含在 input data 里面。我們通過一個調用合約的轉賬交易具體分析,來理解消息調用時 input data 的結構。
解析形式:
CME將于8月29日推出歐元定價的比特幣及以太坊期貨:金色財經報道,芝商所(CME)計劃進一步擴大其加密貨幣衍生品產品,將于8月29日推出歐元定價的比特幣及以太坊期貨,等待監管審查。
為了匹配以美元計價的對手,比特幣歐元和以太坊歐元期貨合約的規模將是每份合約5個比特幣和50個以太坊。這些新合約將根據CME CF比特幣-歐元參考利率和CME CF以太坊-歐元參考利率以現金結算,它們作為比特幣和以太坊以歐元計價的每日一次參考利率,這些新的期貨合約將在芝商所上市并受其規則約束。[2022/8/4 12:02:29]
原始形式:
我們將原始的 input data 分為三個部分進行分析:
0xa9059cbb:函數標識符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2: 第一個參數為 address 即你要轉賬的地址,并補位到 32 字節即 64 個 16 進制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000: 第二個參數為 value 即你要轉賬的數量,并補位到 32 字節即 64 個 16 進制字符
?通過對比分析我們可以發現 input data 的基本結構為函數標識符+參數
以太坊研發者:ETH2.0為運行節點創造了一個重要激勵機制:12月6日,以太坊研發者Philippe Castonguay發推稱,即使美國政府能夠關閉美國境內的每一個ETH節點,全球仍將有約8000個節點,這比幾個月前我們擁有的ETH節點總數還要多。此外,ETH2.0為人們運行節點創造了一個重要的激勵機制,這可能是過去幾個月網絡節點增加40%的原因。加入競爭的驗證者越多,網絡就會越強大,而這僅僅是個開始。[2020/12/6 14:10:57]
函數標識符
這里的函數標識符即為函數選擇器,根據官方文檔可知函數選擇器是某個函數簽名的 Keccak(SHA-3)哈希的前 4 字節(高位在左的大端序)。
我們可以通過代碼
bytess4(keccake256("transfer(adddress,uint256)"))或者在線工具獲取這種函數簽名。下圖可以看出加密結果的前四個字節 (a9059cbb) 跟 input data 中函數標識符一致。
這里之所以要將函數簽名截斷到四個字節是考慮到 Gas 成本問題。
在一筆交易中0字節需要支付 4 gas,而非0字節需要 68 gas 也就是 0 字節的 17 倍。在 SHA-3 加密中生成的 32 字節隨機字符串更傾向于多的非 0 字節,所以大概成本是32x68=2176 gas,而截斷成本大概為 4x68=272 gas,可見截斷到四個字節能夠節省約 8 倍的 gas 費。
6月6日 以太坊網絡交易費用高于比特幣網絡:Glassnode數據顯示,6月6日,以太坊網絡交易費用超過了比特幣網絡,二者分別為498美元和308美元。到目前為止,這樣的情況只發生了141天,占歷史總天數的8%。[2020/6/8]
而函數標識符的作用是指定調用哪一個函數,在同一個合約中兩個不同函數的 SHA-3 簽名的前 4 字節相同的概率是十分小的,所以截斷到四個字節實際不會影響函數調用。
參 數
在 evm 執行字節碼的約定中,靜態類型左補齊零至 64 長度,而動態類型則是右補齊零至 64 長度。歸納下常見的靜態類型:uint,bool,Address,bytes, 動態數組類型:bytes,string,address[],bytes32[].....我們通過 pyethereum的ABI編碼函數 來研究不同數據類型的編碼方式。靜態類型先導入 encode_abi 函數
import rlp ?from ethereum.abi import encode_abi
我們以函數 transfer(address,uint 256) 為例
> encode_abi(["address", "uint256"],[345d8e3a1f62ee6b1d483890976fd66168e390f2,1]).hex()000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f20000000000000000000000000000000000000000000000000000000000000001
動態 | CBC Casper白皮書公布旨在解決以太坊可擴展性問題:據newsbt消息,一個由四名加密研究人員組成的財團公布了一份關于CBC(Correct-By-Construction)Casper的白皮書,旨在通過股權證明(PoS)解決以太坊的可擴展性問題。雖然技術文檔還處于起步階段,但許多人認為這一發展是邁向上述項目精神的一個有希望的步驟,即創建一個可擴展、分散、高效的“世界計算機”。[2018/11/6]
對于小于 32 字節的定長數組會被自動填充到 32 字節:
> encode_abi(["int8"],[[1, 2, 3]).hex()// 自動填充 0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003
動態類型動態類型編碼要稍微復雜一些,需要先計算偏移量進行占位處理,我們通過一個簡單的例子來具體說明。
> encode_abi( ?["uint256[]", "uint256[]", "uint256[]"], ?[[0xa1, 0xa2, 0xa3], [0xb1, 0xb2, 0xb3], [0xc1, 0xc2, 0xc3]]).hex()// 參數 1 的偏移量:32*3=96 十六進制 0x600000000000000000000000000000000000000000000000000000000000000060// 參數2的偏移量=參數 1 偏移量+參數 1 數據部分長度=96+32*4=224 十六進制0xE000000000000000000000000000000000000000000000000000000000000000e0// 參數3的偏移量=參數 2 偏移量+參數 2 數據部分長度=224+32*4=352 十六進制0x1600000000000000000000000000000000000000000000000000000000000000160// 偏移量 0x60 位置開始傳入參數 1 的數據0000000000000000000000000000000000000000000000000000000000000003//元素個數00000000000000000000000000000000000000000000000000000000000000a1//第一個數組元素00000000000000000000000000000000000000000000000000000000000000a2//第二個數組元素00000000000000000000000000000000000000000000000000000000000000a3//第三個數組元素// 0xe0位置。參數 2 的數據000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b3//0x160 位置。參數 3 的數據000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c3
聲音 | V神回應指責:從未持有超過0.9%的以太坊:紐約大學經濟學家和加密評論家Nouriel Roubini在推特指責V神和Joseph Lubin是騙子,他說道:“他們偷走了以太坊供應量的75%,憑借虛假財富成為了即時的‘億萬富翁’。”V神對此回應稱:“我從來沒有持有超過0.9%的以太坊,我的凈資產也從來沒有接近10億美元。此外,我敢肯定,預挖礦不違反任何刑事法律。”[2018/10/11]
短地址攻擊經過前面的分析當靜態類型如 address 長度不足 32 字節時 EVM 會根據規則將長度補齊到 32 字節,如果當轉賬的地址以00結尾,如0x641988625108585185752230bde001b3ebd0fc00,轉賬時將地址后面的兩個零去掉,EVM 依然會認為 address_to是 32 位的,所以它會從_value的高位取 0 來補充,amount的位數會多兩位也就是會乘以256。攻擊過程如下:
將惡意轉賬地址最后一個字節的 0 去掉函數標識符:a9059cbb轉賬地址:000000000000000000000000641988625108585185752230bde001b3ebd0fc轉賬金額:00000000000000000000000000000000000000000000000000000000000000001由于 EVM 的補位規則,解析結果為:0xa9059cbb000000000000000000000000641988625108585185752230bde001b3ebd0fc0000000000000000000000000000000000000000000000000000000000000000100我們分解后發現,轉賬金額已經多了兩位也就是多了一個字節,即為原來轉賬的 256倍函數標識符:a9059cbb轉賬地址:000000000000000000000000641988625108585185752230bde001b3ebd0fc00轉賬金額:00000000000000000000000000000000000000000000000000000000000000100
如何在 input data 附著信息
在以太坊中直接進行轉賬交易的 input data 字段默認是沒有內容的,但是我們可以通過設置錢包實現文章開頭的“聊天功能”。我們以 MetaMask 錢包為例展示如何通過轉賬在 input data 字段附著一些額外的信息。
1、首先我們需要打開錢包高級選項的顯示十六進制數據開關
2、在轉賬時將你要附著的信息通過十六進制編碼后填入下方十六進制數據中,記得在開頭加上 0x 然后進行轉賬
3、轉賬成功后在 etherscan 中就能夠看到附著信息
總結
我們能夠通過交易中的 input data 將一些信息永久存儲在區塊鏈中,可以通過此項技術在食品藥品監管部門的產品防偽溯源、財稅部門的電子票據打假驗真、學術成果存證等方面實現應用落地。
在元宇宙概念火爆的當下,一些利用該概念進行違法犯罪的行為也悄然在社會上發生。近日央視記者揭露:許多打著元宇宙旗號的區塊鏈游戲,本質是網頁小游戲,需要用戶將人民幣先兌換為USDT泰達幣,再將泰達幣.
1900/1/1 0:00:00元宇宙醫療是最先爆發的行業或領域之一。未來元宇宙將改變當前醫院連接模式,同時也將徹底改變目前就醫邏輯以及醫患關系。可能在不遠的未來,人們觸及元宇宙醫療的獲得感,將比元宇宙娛樂來得更為真實與迫切.
1900/1/1 0:00:00作者:黃婉儀 近期,不少以數字藏品為主業的平臺企業開始加快步伐,進軍更廣義的元宇宙領域,iBox、芒境等相繼宣布推出元宇宙平臺.
1900/1/1 0:00:00你聽說過比特幣S2F模型嗎?如果還沒有的話那你應該補課了,這是一個與預測BTC價格有關的激動人心但也極富爭議的話題.
1900/1/1 0:00:00Snoop Dogg和VeeFriends合作推出基于新歌曲“Please Take a Step Back”的新NFT系列:金色財經報道.
1900/1/1 0:00:00可以預見,未來會有更多尋求年輕用戶市場的中國企業購買“猴子”。作者:潤升&念青,鏈捕手近日,相信不少人看到了以下這張截圖,央視網官方微博參與無聊猿“遇見你是我的猿”話題,并轉發鳳凰周刊官方“無聊.
1900/1/1 0:00:00