當你在區塊鏈瀏覽器上查詢交易時,是否只是查看概覽和內部交易?那么事件日志呢?是否在不起眼的角落被你忽略了。
交易事件日志對于用戶以及開發者來說實際上都是至關重要的。通過觸發事件不僅能將鏈上智能合約的交易通知給外界,還能讓智能合約開發者對合約進行測試、保證合約安全。
接下來就幫助大家詳細理解下關于以太坊的事件日志以及關于它所延伸出來的一些基礎知識。
一、 什么是事件
事件是能方便地調用以太坊虛擬機日志功能的接口。
而 Solidity 事件就是 EVM 的日志功能之上的抽象。應用程序可以通過以太坊客戶端的 RPC 接口訂閱和監聽這些事件,允許我們打印在區塊鏈上的信息。
所以通過 Solidity 事件,我們可以做到:
測試智能合約中的特定變量
索引變量以重建存儲狀態
監聽事件用于改變前端狀態
創建子圖以更快地讀取數據
二、聲明和觸發事件
我們以官方 ERC20 合約代碼為例,在 IERC20.sol 文件中通過 event 關鍵字進行聲明。
我們可以把事件看作是一個特殊類型,上面的代碼中我們創建了一個名為 Transfer 的事件,在該事件中有兩種參數類型:有索引 (indexed) 和無索引。其中 from 和 to 參數是有索引的,而 value 參數是沒有索引的。
在 ERC20.sol 的 _transfer 函數中通過 emit 關鍵字觸發相應事件(之前的版本里并不需要使用 emit)。
前SEC主席:Gary Gensle觀點明顯偏離了對政府職能的理解:金色財經報道,前SEC主席Jay Clayton表示,美國現任SEC主席Gary Gensle觀點明顯偏離了對政府職能的理解。除非政府確信自己會獲勝,否則政府不應采取法律行動。Gemini交易所聯合創始人Cameron Winklevoss同意這一觀點,他稱Gensler的行為完全濫用權力。[2023/6/30 22:10:15]
一、什么是日志
在以太坊中,日志是用來存儲事件。當事件被調用時,會觸發參數存儲到交易的日志中。其不能被智能合約訪問,但是可以提供關于交易和區塊中發送的信息。
我們隨意點開一條交易 (0x477ed7208127bea597142622d52df46d3e4967835bd3609995581eb5aaeeec3e),查看其日志 Logs。
通過日志我們可以將日志分為四個部分:
1、Address: 地址。即發出事件的合約地址或者賬戶的地址。
2、Name: 名字。即觸發的事件名及其參數。
3、Topics: 主題。即事件中有索引 (indexed) 的參數。
4、Data: 數據。即事件中沒有索引的參數。
二、日志記錄中的主題
上面我們有說到主題 (Topics),接下來我們詳細說下主題。
每個日志記錄都包含「主題 (topics)」和「數據 (data)」。主題是 32 字節(256 位),用于描述事件中發生的事情。不同的操作碼 (LOG0 LOG1 LOG2 LOG3 LOG4) 用以描述需要包含在日志記錄中的主題數。
Lido DAO提議變更治理系統,引入面向質押者和LDO持有者的雙重治理解決方案:6月18日消息,Lido DAO提議變更Lido治理系統,以“減少其代幣持有者的現有治理范圍”。雖然Lido DAO目前部署在以太坊上,但LDO持有者對其他鏈上的流動質押協議擁有治理權力,包括Polygon和Solana。
在該DAO當前的多鏈治理系統下,LDO持有者有與其他鏈相關的激勵,“不一定與以太坊網絡參與者的激勵相一致,”Lido的智能合約開發者Sam Kozin在一篇博客文章中寫道。
為了解決這個問題,Lido團隊提出了一個雙重治理解決方案,提議引入“一種針對質押者和LDO持有者之間不當激勵的爭議和解決機制”。(Blockworks)[2022/6/18 4:36:02]
EVM 中有 5 個操作碼用于觸發事件日志并創建日志記錄,分別是 LOG0,LOG1,LOG2,LOG3 以及 LOG4,它們用于描述智能合約中的事件,例如代幣的轉移、所有權的變更等。LOG1 即包含了一個主題,而單個日志記錄中最多可以包含的主題就是 LOG4 的四個主題。
Topics0 通常為發生事件名稱的簽名(keccak256 的哈希值),包括其參數的類型(address,uint256 等),Topics1 為第一個索引參數的值,Topics2 為第二個索引參數的值。
該主題中 Topics0 的值為 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef,其事件為上一行 Name 的內容。
加密社區回應查理·芒格抨擊加密貨幣:在他這個年齡無法理解新技術并不奇怪:12月3日消息,億萬富翁投資者查理·芒格 (Charlie Munger) 周五在Sohn Hearts and Minds會議上發表講話,強調了他對加密貨幣的普遍厭惡及其在市場上造成的淘金熱。他永遠不會參與這個市場,并希望加密貨幣沒有被發明。他表示贊同中國的加密禁令,認為這做出了正確的決定。
加密社區的許多人隨后對芒格對比特幣的最新評論做出了反應,許多人指出,在他這個年齡無法理解像比特幣這樣的新技術并不奇怪。Synthetix創始人Kain Warwick還強調,盡管芒格愿意通過賣好東西賺錢,但伯克希爾哈撒韋公司是可口可樂的最大股東,可口可樂被認為是“許多健康問題的重要貢獻者”。加密和區塊鏈播客系列The Crypto Corner的項目總監Jamil Hasan指出,芒格不投資加密不應該讓這個行業感到困擾:“如果查理芒格不購買加密,我沒關系。我敢肯定,查理也買了一些我不需要的東西。”(Cointelegraph)[2021/12/3 12:49:39]
而我們對事件 Transfer(address,address,uint256) 進行 keccak256 加密后得到的結果和 Name 的值一樣,說明 Name 的值的確為事件名稱的簽名。當然,有一個例外是沒有事件簽名的,那就是觸發「匿名事件」時。
Topics1 就是第一個索引參數的值,即 form 地址的值。Topics2 就是第二個索引參數的值,即 to 地址的值。從內部調用分析也能看到的確是這樣。
主題只能包含 32 個字節的數據,所以像可能超過 32 個字節的內容如數組、字符串等的內容不能用作主題,如果要嘗試包含大于 32 個字節的數據,則該主題必須進過 hash 計算,所以超過 32 個字節后最好當做數據包含在日志記錄中。
V神:NFT需要經歷多個寒冬才能理解它的長期價值:金色現場報道,10月26日消息,由萬向區塊鏈實驗室主辦的第七屆區塊鏈全球峰會在上海舉行,以太坊創始人、萬向區塊鏈實驗室首席科學家Vitalik Buterin分享稱,DeFi和NFT發展的都非常不錯,但他認為當前存在一個現象,人們很努力以至于使得DeFi很復雜,比如收益耕作使得智能合約出現合約風險,風險可能會大于收益。他認為最有用協議還是最簡單的那種。他還認為,NFT非常具有價值,他給了創作者一個全新的商業模式,但他提醒公眾,人們不應該假設說NFT按當前的形式在經濟上是具有可持續性的,NFT需要經歷多個寒冬。“我們看到這個領域的項目在6個月到1年里表現很不錯,但1-2年時間里卻會變得無名,我覺的必須要耐心等待,必須理解長期可持續的NFT會是怎么樣的。[2021/10/26 20:58:19]
三、日志記錄中的數據
日志記錄除了主題,還有一部分內容就是數據,數據就是事件的非索引參數的 ABI 編碼或者 hash 值,我們可以使用 Dec 或 Hex 查看數據 data 的值。
數據和主題都有各自的優劣:
主題是可以搜索到的,數據不能搜索到。
數據比主題所需要的 gas 少。
由于主題是帶有索引的參數,所以我們可以直接在日志中進行搜索,而數據是 ABI 編碼或 hash 值,所以不能直接搜索。
根據黃皮書我們可以找到日志的相關 gas 成本,日志的基礎費用是 375 gas,每個主題也是 375 gas,而數據字節的成本是 8 gas。
我們可以通過黃皮書知道日志的 gas 費用非常便宜,一個 ERC20 代幣轉賬事件的成本最多只花費 1756 gas(日志基礎的 375 gas,轉賬事件 3 個主題的 375 * 3 =1125 gas,數據字節最大的 32 字節為 8 * 32 = 256 gas),而標準以太幣的轉賬需要花費 21000 gas。當然了,前面說的只是日志記錄操作自身的成本,智能合約開發中不能單純值計算日志記錄操作的成本,但在開發中,我們可以僅在狀態變量中保存智能合約所需要使用的數據,其他的就用事件來處理,這樣能省下很多的 gas 費用。
聲音 | 趙余:“彩虹表攻擊”可以簡單理解為“字典攻擊”:EOS LaoMao 的趙余在《寧話區塊鏈》之全球EOS節點答疑的節目中稱 “前兩天發生的’彩虹表攻擊’,是由于有些開發者通過設計的自定義助記詞功能不完善。既沒有過濾空字符串,也沒有強制用戶設置足夠長的助記詞。導致黑客可以通過簡單的窮舉,就能拿到部分賬戶的私鑰。EOS 彩虹表攻擊始末:EOS 官方庫 eosjs-ecc(https://github.com/EOSIO/eosjs-ecc) 提供了一個自定義助記詞生成密鑰的接口。有些開發者使用這個接口,做了一個用戶可以自定義助記詞的密鑰生成工具。但是由于產品設計問題,具體問題是下面兩個:1. 沒有過濾空字符串;2. 沒有強制要求用戶自己填寫的助記詞的長度必須達到足夠安全的長度(比如 12 個獨立的單詞作為助記詞,就可以認為安全性很高了)。導致部分用戶,使用了簡單的字母或單詞作為助記詞生成了自己的私鑰。比如 a, b, c, hello, world 等等。這就導致黑客可以輕而易舉地“窮舉”常見的單詞,字母,以及單詞組合,進而拿到用戶私鑰,最終轉移用戶資產。這個“窮舉”的方法,一般也被稱為“彩虹表”攻擊。對于使用自定義助記詞功能生成私鑰的用戶,建議自查助記詞長度,確保助記詞長度不少于 12 個單詞。”[2018/7/17]
接下來以一個實例進行說明觸發事件,下面的代碼實現了符合 ERC20 標準的代幣合約所使用的轉賬事件。
由于上面不是一個「匿名事件」,所以第一個主題將包含事件的簽名(簽名時只需要參數的類型)。
然后我們看一下該事件的參數,其中 from 和 _to 地址都是有索引的,value 值是沒有索引的。所以 _from 和 _to 地址會被當成主題,而 _value 值會被當成數據。
在 3.3 節中我們說到過主題能被搜索,而數據不能,所以我們能在日志中搜索 from 地址和 _to 地址值的相關轉賬日志,卻不能夠搜索到轉賬金額為 _value 值的轉賬日志。由于該事件具有 3 個主題(事件的簽名,from,_to),所以該日志記錄操作將使用 LOG3 操作碼。
那如果我們想要找到數據的內容呢?這里就需要知道操作碼在 EVM 中的參數。LOG3 雖然包含 3 個主題,在 EVM 中卻有 5 個參數。
如果要讀取數據的內容,通過以下的方式就可以從內存中讀取事件數據了。
一、事件在釣魚中的使用
前面介紹了那么多日志事件,那這些是如何和釣魚聯系到一起的呢?攻擊者一般會通過日志事件偽裝成交易所或者名人等給受害者轉幣(該幣無實際交易價值,是釣魚代幣),受害者看到是交易所或者名人轉來的代幣則放松警惕,此時攻擊者會引導受害者到有釣魚代幣的池子中,受害者看到該代幣交易價值極高,會立刻授權進行交易,而此時就陷入了攻擊者設置的圈套,攻擊者會讓受害者授權從而盜取走受害者錢包中的錢。
下圖就是之前發生的一起釣魚事件,攻擊者偽裝成幣安熱錢包給其他人轉釣魚代幣。
我們可以在 BSC 瀏覽器上通過標簽找到官方地址。
通過查詢,發現 Binance Hot Wallet 6 地址正是 0x8894e0a0c962cb723c1976a4421c95949be2d4e3
由于瀏覽器記錄是根據事件來的,所以說 topics1 的值即 sender 的值就是 0x8894e0a0c962cb723c1976a4421c95949be2d4e3
二、復現
下下面是 BEP20 的偽代碼,以 BNB Chain 主網為例進行復現,攻擊者創建一個名為「Phishing Token」的釣魚代幣。
如下圖所示,新增 Binance 參數其值為 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3
然后,我們要修改如下圖紅色標記代碼,將 emit 觸發事件中的 sender 地址修改為 Binance。
部署好合約(https://bscscan.com/address/0x7c08aa19b8da2c14591506d7d3c385fc702e0630)后調用 transfer 函數將釣魚代幣轉發給受害者。
查看交易信息,發現這里的 from 地址并不是攻擊者的地址 0x95E2Ea34dEB5C0954B91a47f459770D20568A15B,而是 Binance: Hot Wallet 6 的地址 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3
查看 Logs 日志,Topics1 記錄的 sender 地址同樣也是 Binance Hot Wallet 6 地址,而 Topics2 記錄的 recipient 就是受害者的地址了。
細節決定成敗,不要認為事件日志是微不足道的滄海一粟。在區塊鏈世界越是細節的地方越容易被黑客攻擊利用,往往需要更加謹慎小心。同時需要注意的是,我們也不能因為日志所展示出來的內容掉入騙子設計好的騙局中。再次提醒大家,不要隨意點擊陌生鏈接,更不要隨意授權他人。當我們更加深入理解事件日志的時候,才能更好的防止自己上當受騙。
知道創宇區塊鏈安全實驗室
企業專欄
閱讀更多
金色早8點
金色財經 Willis
Zixi
鏈茶館
道說區塊鏈
Dorahacks
PANews
老雅痞
Web3筆記
TalentDAO
區塊律動BlockBeats
撰寫:DAOtopia 真實收益和 DEX 交易的敘事最近吸引了大量的關注。許多協議和分叉在鏈上涌現($MVX、$OPX...),但我們如何辨別哪一個最創新,哪一個最有潛力? 在這個系列中,我們.
1900/1/1 0:00:00文/William M. Peaster,Bankless貢獻者;譯/金色財經xiaozou在過去幾年里, DeFi的活動中心一直是以太坊,同時還擴展到了以太坊虛擬機(EVM)鏈.
1900/1/1 0:00:00原文:《Having a safe CEX: proof of solvency and beyond》編譯:雙花 (@doublespending)特別感謝 Balaji Srinivasan.
1900/1/1 0:00:00來源:twitter @CurveFinance LLAMMA將逐步清算借款人的頭寸,而不是一次性清算.
1900/1/1 0:00:00來源:老雅痞 導讀 本月 Gritti 宣布完成170萬美元的種子資金,這筆資金將增強 Gritti 在 Web2 和 Web3 之間創建一致且有效的轉換渠道的能力.
1900/1/1 0:00:00這幾天我又在網上看到了更多關于FTX早期融資及發展過程中的細節。這些細節不僅涉及到FTX自身的運營,還涉及到很多業內頂級資本的操作。看完真是讓人不禁唏噓.
1900/1/1 0:00:00