比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads
首頁 > XMR > Info

以太坊:以太坊 Input Data 解析_DATX

Author:

Time:1900/1/1 0:00:00

前段時間,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 的結構。

解析形式:

以太坊開發者:將預留出更多時間來穩定代碼和確保安全過渡:金色財經消息,ETH2.0核心開發者@dapplion 更新 Gnosis 信標鏈合并信息,其表示,在與 Nethermind 核心開發者討論之后決定預留出更多時間來穩定代碼和確保安全過渡。9 月 15 日之后,我們將就合并時間進行電話會議。另外,Gnosis Chain 目前有 Nethermind 和 OpenEthereum 兩個客戶端,合并后僅保留 Nethermind。[2022/9/2 13:03:46]

原始形式:

我們將原始的 input data 分為三個部分進行分析:

0xa9059cbb:函數標識符

000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2: 第一個參數為 address 即你要轉賬的地址,并補位到 32 字節即 64 個 16 進制字符

0000000000000000000000000000000000000000000054b7d8ed70650b290000: 第二個參數為 value 即你要轉賬的數量,并補位到 32 字節即 64 個 16 進制字符

?通過對比分析我們可以發現 input data 的基本結構為函數標識符+參數

以太坊L2網絡總鎖倉量為45.5億美元:金色財經報道,L2BEAT數據顯示,截至5月31日,以太坊Layer2上總鎖倉量為45.5億美元。其中鎖倉量最高的為擴容方案Arbitrum,約24.7億美元,占比54.33%。其次是dYdX,鎖倉量9.56億美元,占比20.98%。Optimism占據第三,鎖倉量4.78億美元,占比10.5%。[2022/5/31 3:51:51]

函數標識符

這里的函數標識符即為函數選擇器,根據官方文檔可知函數選擇器是某個函數簽名的 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 費。

基于以太坊的在線市場Zora已部署至以太坊主網并發布0號代幣:1月1日,基于以太坊的在線市場Zora官方宣布已部署至以太坊主網,并發布了第0個代幣為Ours Truly。[2021/1/1 16:13:09]

而函數標識符的作用是指定調用哪一個函數,在同一個合約中兩個不同函數的 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

以太坊生態新協議 Alexandria 目前已完成延展網絡和 SSZ 構建 正在設計營銷機制:開發人員 Piper Merriam 撰文公布以太坊生態新協議 Alexandria 的開發進展,目前該協議還在開發當中。Alexandria 的目標是提供一個新的點對點網絡,以揭示以太坊的區塊鏈歷史情況。該網絡的首個迭代版本將能存儲區塊頭鏈(header chain)以及進行區塊高度的索引映射。目前,Alexandria 已完成延展網絡(Overlay Network)和簡單序列化編碼規范(SSZ)的構建,Alexandria 網絡建立在 Discovery V5 DHT (用于將鍵映射到值的分布式系統)上,并將使用 Merkle 證明和簡單序列化編碼規范(SSZ)。Alexandria 的營銷機制還在設計中,該機制將使網絡中的節點能夠找到具有所需內容的其他節點。另外,Piper Merriam 表示,若該協議能夠成功開發,將為以太坊社區帶來兩個好處,分別為:1. 以太坊客戶端將一個備用數據源來檢索這些數據,從而最大程度地減少節點對硬盤的需求;2. Alexandria 網絡的按需性質可為輕客戶端奠定基礎。[2020/11/17 21:04:10]

對于小于 32 字節的定長數組會被自動填充到 32 字節:

> encode_abi(["int8"],[[1, 2, 3]).hex()// 自動填充 0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003

聲音 | 以太坊Partiy產品經理:“以太坊 2.0”或Serenity階段不太可能在今年或明年發生:以太坊客戶端 Partiy 產品發布經理 Afri Schoedan 認為,對于以太坊區塊鏈從工作量認證過渡到權益認證,由于難度炸彈問題無法得到有效解決,“以太坊 2.0”或君士坦丁堡之后的“寧靜”(Serenity)階段不太可能在今年或明年發生。Afri Schoedan 已經提出了將以太坊難度炸彈無限延期的以太坊改進提案(EIP)。[2019/2/15]

動態類型動態類型編碼要稍微復雜一些,需要先計算偏移量進行占位處理,我們通過一個簡單的例子來具體說明。

> 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

短地址攻擊經過前面的分析當靜態類型如 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 將一些信息永久存儲在區塊鏈中,可以通過此項技術在食品藥品監管部門的產品防偽溯源、財稅部門的電子票據打假驗真、學術成果存證等方面實現應用落地。

Tags:以太坊DATDATAATA以太坊價格美元實時DATXDatamineDatabits

XMR
MEV:MEV 的未來:探討 MEV 在不同加密經濟系統中的最終狀態_區塊鏈專業畢業后到底做什么

原文標題:《MEV 的未來:MEV 在不同加密經濟系統中的長期最終狀態》撰文:fbifemboy 編譯:Skypiea 在過去的一年中.

1900/1/1 0:00:00
比特幣:漫畫 | 什么是比特幣?比特幣挖礦是怎么挖的?_NFT

比特幣(Bitcoin)的概念最初由中本聰在2008年11月1日提出,并于2009年1月3日正式誕生。根據中本聰的思路設計發布的開源軟件以及建構其上的P2P網絡.

1900/1/1 0:00:00
POS:為什么說EOS的DPoS不容易造成分裂式分叉?_AND

在區塊鏈世界中,分叉是我們常常聽到的一個詞,比特幣和以太坊都經歷了一定次數的分叉。但是,并不是所有的幣都會分叉,有的幣就幾乎不會分叉.例如,DPoS 就具有不容易分叉的特點.

1900/1/1 0:00:00
DID:一文讀懂去中心化身份 DID 在 Web3 世界里的重要性_WEB

撰文:7 O’Clock Capital從人類學的角度來說,身份被文化所塑造,最基礎的身份可以是性別.

1900/1/1 0:00:00
比特幣:算力暴漲 明年比特幣減半或提前 難度調整機制失靈了嗎?_BTC

自今年 7 月份以來,比特幣的全網算力增長了 80% 以上。根據 Blockchain.com 的數據,9 月 18 日比特幣全網算力超過了 102.8EH/S,而在今年的 7 月 1 日,這一.

1900/1/1 0:00:00
NFT:加密技術和電子競技如何促進彼此的發展_Web AI

當加密貨幣交易所FTX于2021年6月宣布與領先的電子競技俱樂部Team SoloMid (TSM)達成10年2.1億美元的贊助和冠名權協議時.

1900/1/1 0:00:00
ads