前言
前段時間,PolyNetwork被盜事件的一個小插曲,一地址向黑客地址轉賬在inputdata中告知其USDT已被凍結,不要使用USDT,黑客知曉后向該地址轉賬13.37ETH。
事后很多人便通過inputData在區塊鏈上“聊天”向黑客“索要”虛擬貨幣,那么我們經常在區塊鏈瀏覽器中看到的inputData到底是什么?知道創宇區塊鏈安全實驗室為您解答。
Inputdata
在以太坊協議中,當交易為合約創建時,inputdata是賬戶初始化程序的EVM代碼;
而當交易為消息調用時,inputdata是合約函數調用數據。
正常情況下簡單的消息調用如調用轉賬函數時需要填寫你要轉賬的地址_to和你要轉賬的數量_amount,這些基本信息都包含在inputdata里面。
我們通過一個調用合約的轉賬交易具體分析,來理解消息調用時inputdata的結構。
解析形式:
原始形式:
Tenet Protocol已推出由LayerZero提供支持的原生橋以及TENET作為OFT:金色財經報道,LayerZero Labs發布推文稱,多元化的權益證明鏈Tenet Protocol已推出由LayerZero提供支持的原生橋以及作為Omnichain Fungible Token (OFT) 的TENET。原生TENET現在可以在以太坊、Arbitrum、Optimism、Polygon、Avalanche、BNB和Tenet之間無縫傳輸。[2023/8/11 16:19:34]
我們將原始的inputdata分為三個部分進行分析:
0xa9059cbb:函數標識符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2:第一個參數為address即你要轉賬的地址,并補位到32字節即64個16進制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000:第二個參數為value即你要轉賬的數量,并補位到32字節即64個16進制字符
通過對比分析我們可以發現inputdata的基本結構為函數標識符+參數。
函數標識符
這里的函數標識符即為函數選擇器,根據官方文檔可知函數選擇器是某個函數簽名的Keccak哈希的前4字節。
Meta Platforms:預計將裁員1萬人左右:金色財經報道,Meta Platforms:預計將裁員1萬人左右,并暫停約5000個職位的招聘。預計將在4月下旬宣布技術小組的裁員計劃,將進一步削減招聘團隊的規模,預計將于5月底宣布商業團隊的裁員計劃,致力于優化工程師比例。[2023/3/14 13:03:58]
我們可以通過代碼bytess4(keccake256("transfer(adddress,uint256)"))或者在線工具獲取這種函數簽名。
下圖可以看出加密結果的前四個字節(a9059cbb)跟inputdata中函數標識符一致。
這里之所以要將函數簽名截斷到四個字節是考慮到Gas成本問題。
在一筆交易中0字節需要支付4gas,而非0字節需要68gas也就是0字節的17倍。
在SHA-3加密中生成的32字節隨機字符串更傾向于多的非0字節,所以大概成本是32x68=2176gas,而截斷成本大概為4x68=272gas,可見截斷到四個字節能夠節省約8倍的gas費。
而函數標識符的作用是指定調用哪一個函數,在同一個合約中兩個不同函數的SHA-3簽名的前4字節相同的概率是十分小的,所以截斷到四個字節實際不會影響函數調用。
參數
在evm執行字節碼的約定中,靜態類型左補齊零至64長度,而動態類型則是右補齊零至64長度。
安全公司:以太坊鏈上的Nostr代幣疑似非官方創建,存在安全風險:金色財經報道,安全公司Fairyproof發布風險提示,以太坊鏈上的Nostr代幣疑似非官方創建。Nostr 代幣地址0xA2be922174605BAd450775C76CEb632369480336。Nostr 的部署者(0xC013Ef7bE164aAcD503A3FEe686f9aBE7988425c)疑似一個連續代幣部署。(0xC013Ef7bE164aAcD503A3FEe686f9aBE7988425c) 的資金來源是0xad2Dc2a4f3287783b220DbDcC7AfB7F6EB0704b8。0xad2Dc2a4f3287783b220DbDcC7AfB7F6EB0704b8 曾經在3天前部署了 Damus 代幣,并向eth上其他地址空投, 然后過了一段時間后, Damus撤走流動性, 疑似跑路。 在7天前部署的Ω (Ω) 代幣也采用類似手法已經跑路。在之前追蹤跟這些代幣部署者關聯地址, 都是采用類似手法進行疑似欺詐行為。
Nostr的合約代碼也存在一些安全隱患, 合約管理員可以阻止用戶在指定 uniswap 交易對上賣出代幣。也可以將用戶加入黑名單,還可以隨意銷毀其他用戶代幣。[2023/2/6 11:49:48]
歸納下常見的靜態類型:uint,bool,Address,bytes,動態數組類型:bytes,string,address,bytes32.....
我們通過pyethereum的ABI編碼函數來研究不同數據類型的編碼方式。
靜態類型
觀點:隨著CBDC越來越受歡迎,監管問題“仍具有挑戰性”:金色財經報道,德國科技公司Giesecke+Devrient(G+D)的首席傳播者Lars Hupel表示,隨著CBDC在全球范圍內越來越受歡迎,監管問題“仍然具有挑戰性”。[2022/12/23 22:03:39]
先導入encode_abi函數
importrlpfromethereum.abiimportencode_abi
我們以函數transfer(address,uint256)為例
>encode_abi(,
).hex()
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2
0000000000000000000000000000000000000000000000000000000000000001
對于小于32字節的定長數組會被自動填充到32字節:
>encode_abi("],).hex()
//自動填充0
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000003
巴克萊金融科技中心Rise舉行CBDC黑客馬拉松:金色財經報道,巴克萊銀行的金融科技中心Rise舉行了為期兩天的CBDC黑客馬拉松比賽,9個團隊嘗試了6項關鍵挑戰。歐洲中央銀行(ECB)和英格蘭銀行(BoE)有專門的工作小組探索其中的機會和風險,并起草和公布了一些設計選擇。
黑客馬拉松要求參與者連接到巴克萊銀行的中央銀行、支付接口供應商(PIPs)、商業銀行和其他生態系統服務的模擬。這個模擬是基于英格蘭銀行(BoE)為英國零售CBDC提供的平臺模型。這些團隊代表了一系列的參與者,包括IBM、勞埃德銀行集團、萬事達卡、Industria、REGnosys、Rethink Ledgers、UST、SDK.finance和巴克萊銀行(巴克萊銀行沒有資格獲得名額)。
這些團隊利用各種技術將他們的解決方案變為現實,如Corda、Ethereum、Java、數字資產建模語言(DAML)和其他技術。(finextra)[2022/10/1 18:36:37]
動態類型
動態類型編碼要稍微復雜一些,需要先計算偏移量進行占位處理,我們通過一個簡單的例子來具體說明。
>encode_abi(","uint256","uint256"],
,,]
).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的數據
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000b1
00000000000000000000000000000000000000000000000000000000000000b2
00000000000000000000000000000000000000000000000000000000000000b3
//0x160位置。參數3的數據
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000c1
00000000000000000000000000000000000000000000000000000000000000c2
00000000000000000000000000000000000000000000000000000000000000c3
短地址攻擊
經過前面的分析當靜態類型如address長度不足32字節時EVM會根據規則將長度補齊到32字節,如果當轉賬的地址以00結尾,如0x641988625108585185752230bde001b3ebd0fc00,轉賬時將地址后面的兩個零去掉,EVM依然會認為address_to是32位的,所以它會從_value的高位取0來補充,amount的位數會多兩位也就是會乘以256。
攻擊過程如下:
將惡意轉賬地址最后一個字節的0去掉
函數標識符:a9059cbb
轉賬地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc
轉賬金額:
00000000000000000000000000000000000000000000000000000000000000001
由于EVM的補位規則,解析結果為:0xa9059cbb000000000000000000000000641988625108585185752230bde001b3ebd0fc0000000000000000000000000000000000000000000000000000000000000000100
我們分解后發現,轉賬金額已經多了兩位也就是多了一個字節,即為原來轉賬的256倍
函數標識符:a9059cbb
轉賬地址:
000000000000000000000000641988625108585185752230bde001b3ebd0fc00
轉賬金額:
00000000000000000000000000000000000000000000000000000000000000100
如何在inputdata附著信息
在以太坊中直接進行轉賬交易的inputdata字段默認是沒有內容的,但是我們可以通過設置錢包實現文章開頭的“聊天功能”。
我們以MetaMask錢包為例展示如何通過轉賬在inputdata字段附著一些額外的信息。
1、首先我們需要打開錢包高級選項的顯示十六進制數據開關
2、在轉賬時將你要附著的信息通過十六進制編碼后填入下方十六進制數據中,記得在開頭加上0x然后進行轉賬
3、轉賬成功后在etherscan中就能夠看到附著信息
總結
我們能夠通過交易中的inputdata將一些信息永久存儲在區塊鏈中,可以通過此項技術在食品藥品監管部門的產品防偽溯源、財稅部門的電子票據打假驗真、學術成果存證等方面實現應用落地。
當去中心化金融的成功提醒我們區塊鏈治理的早期,其挑戰也是如此。以太坊上的高額費用正在將DeFi用戶推向L2提供的解決方案,這對去中心化治理產生了相應的影響,在去中心化治理中,進行鏈上投票的成本高.
1900/1/1 0:00:001.EVMorWASM?隨著Ethereum的普及,我們在談論智能合約時,往往默認都是利用Solidity語言開發,基于EVM的智能合約.
1900/1/1 0:00:00Polkadot生態研究院出品,必屬精品 背景 自Kusama插槽拍賣第二輪正式開啟以來,可謂是精彩紛呈,超過16個項目參與到了第6次平行鏈拍賣中,而在昨日,經過焦灼的競賽后.
1900/1/1 0:00:00回顧2021年,我們根據市場整體的行情走向,基本上可以分為三個階段,而每個階段,也恰好有自己對應的主導敘事:5月份之前:這個階段市場敘事依舊以“比特幣機構化”為主.
1900/1/1 0:00:00Polkadot生態研究院出品,必屬精品波卡一周觀察,是我們針對波卡整個生態在上一周所發生的事情的一個梳理,同時也會以白話的形式分享一些我們對這些事件的觀察.
1900/1/1 0:00:00Subspace收購Canyon合力構建新的零層協議,為Web3生態提供永久、可擴展、去中心化的新式存儲底層.
1900/1/1 0:00:00