前言
當你在區塊鏈瀏覽器上查詢交易時,是否只是查看概覽和內部交易?那么事件日志呢?是否在不起眼的角落被你忽略了。
交易事件日志對于用戶以及開發者來說實際上都是至關重要的。通過觸發事件不僅能將鏈上智能合約的交易通知給外界,還能讓智能合約開發者對合約進行測試、保證合約安全。
接下來就幫助大家詳細理解下關于以太坊的事件日志以及關于它所延伸出來的一些基礎知識。
事件
2.1什么是事件?
事件,是能方便地調用以太坊虛擬機日志功能的接口。
而Solidity事件就是EVM的日志功能之上的抽象。應用程序可以通過以太坊客戶端的RPC接口訂閱和監聽這些事件,允許我們打印在區塊鏈上的信息。
所以通過Solidity事件,我們可以做到:
測試智能合約中的特定變量
索引變量以重建存儲狀態
監聽事件用于改變前端狀態
創建子圖以更快地讀取數據
2.2聲明和觸發事件
我們以官方ERC20合約代碼為例,在IERC20.sol文件中通過event關鍵字進行聲明。
我們可以把事件看作是一個特殊類型,上面的代碼中我們創建了一個名為Transfer的事件,在該事件中有兩種參數類型:有索引(indexed)和無索引。其中from和to參數是有索引的,而value參數是沒有索引的。
在ERC20.sol的_transfer函數中通過emit關鍵字觸發相應事件。
Peter Schiff被支持比特幣的兒子指出“對貨幣的理解有缺陷”:比特幣反對人士、黃金愛好者Peter Schiff近期在推特上表示,“Max Keiser(華爾街金融分析師、比特幣支持者)說,我反對比特幣是因為我是一個法幣迷。在比特幣的奇異世界里,黃金是新的法幣。顯然,Max Keiser不理解法定貨幣的概念,也不理解它與合法貨幣或實際貨幣的區別。這解釋了他為何對比特幣如此癡迷。”
Peter Schiff 18歲的兒子、比特幣支持者Spencer Schiff對此回復道:“你對金錢的理解是有缺陷的。你認為貨幣是否堅挺的關鍵決定因素是是否擁有“內在價值”,這是一個荒謬的概念。健康貨幣與法定貨幣的區別在于前者出現在自由市場上,而不是通過強制性的國家法令。”Keiser還點贊了Spencer的推特,稱“未來屬于比特幣愛好者。”(Bitcoin.com)[2020/12/31 16:11:22]
日志
3.1什么是日志?
在以太坊中,日志是用來存儲事件。當事件被調用時,會觸發參數存儲到交易的日志中。其不能被智能合約訪問,但是可以提供關于交易和區塊中發送的信息。
我們隨意點開一條交易(0x477ed7208127bea597142622d52df46d3e4967835bd3609995581eb5aaeeec3e),查看其日志Logs。
通過日志我們可以將日志分為四個部分:
聲音 | 比特幣咨詢公司創始人:懷疑比特幣的人不理解儲蓄:比特幣咨詢公司Bitcoin Advisory創始人Pierre Rochard今日發推稱,通貨膨脹的法定貨幣抑制儲蓄,他們鼓勵將現金快速轉換成投資或消費。這或許有助于解釋為什么許多對比特幣持懷疑態度的人不理解儲蓄,他們只理解投資和消費。[2020/1/7]
1、Address:地址。即發出事件的合約地址或者賬戶的地址。
2、Name:名字。即觸發的事件名及其參數。
3、Topics:主題。即事件中有索引(indexed)的參數。
4、Data:數據。即事件中沒有索引的參數。
3.2日志記錄中的主題
上面我們有說到主題(Topics),接下來我們詳細說下主題。
每個日志記錄都包含「主題(topics)」和「數據(data)」。主題是32字節,用于描述事件中發生的事情。不同的操作碼(LOG0LOG1LOG2LOG3LOG4)用以描述需要包含在日志記錄中的主題數。
EVM中有5個操作碼用于觸發事件日志并創建日志記錄,分別是LOG0,LOG1,LOG2,LOG3以及LOG4,它們用于描述智能合約中的事件,例如代幣的轉移、所有權的變更等。LOG1即包含了一個主題,而單個日志記錄中最多可以包含的主題就是LOG4的四個主題。
Topics0通常為發生事件名稱的簽名,Topics1為第一個索引參數的值,Topics2為第二個索引參數的值。
該主題中Topics0的值為0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef,其事件為上一行Name的內容。
聲音 | Anthony Pompliano:人們需要時間去熟悉并理解比特幣的重要性:針對監管者往往支持區塊鏈、禁止加密貨幣的做法,Morgan Creek Digital聯合創始人Anthony Pompliano認為,比特幣這個游戲規則改變者需要的只是時間,“我認為每個人都進入這個行業,他們通常通過比特幣來實現。他們聽說了它,開始觀察,然后就有了進化。他們去檢查企業區塊鏈、代幣化證券、DeFi,但幾乎每個人都會回到比特幣。現在,這段旅程可能需要6個月、12個月或者18個月,但我認為對比特幣來說最好的事情是時間。人們需要時間來熟悉它,開始使用它,理解它為什么至關重要。我認為這將發生在政府層面、私人層面和機構層面。所以這只是人們更熟悉它所需要的時間。”[2019/12/9]
而我們對事件Transfer(address,address,uint256)進行keccak256加密后得到的結果和Name的值一樣,說明Name的值的確為事件名稱的簽名。當然,有一個例外是沒有事件簽名的,那就是觸發「匿名事件」時。
Topics1就是第一個索引參數的值,即form地址的值。Topics2就是第二個索引參數的值,即to地址的值。從內部調用分析也能看到的確是這樣。
主題只能包含32個字節的數據,所以像可能超過32個字節的內容如數組、字符串等的內容不能用作主題,如果要嘗試包含大于32個字節的數據,則該主題必須進過hash計算,所以超過32個字節后最好當做數據包含在日志記錄中。
聲音 | 陳偉星:有了區塊鏈后Token是避不開的 必須理解它:陳偉星剛剛在微博表示,有了區塊鏈技術,我們要面對一些現實:1.必須得發展行業,這是未來30年讓中國成為全球金融大國的核心機會;2.Token是避不開的,必須理解它;3.全球化交易是避不開的,必須接受它;4.未來加密數字經濟的愿景是很好的,這很可能是人類的希望。
我們也要面對一些現實的困境就是:如何分別騙局?如何打擊騙子?現在全球的監管治理方向主要有:1.辨別是否涉嫌證券發行與交易,納入證券法體系;2.辨別是否存在欺詐;3.辨別是否存在操縱市場;4.辨別是否存在貪污挪用公共資金。社會的進步都不是溫柔鄉來的,與人性之惡的斗爭,需要用智慧和創造。[2019/6/6]
3.3日志記錄中的數據
日志記錄除了主題,還有一部分內容就是數據,數據就是事件的非索引參數的ABI編碼或者hash值,我們可以使用Dec或Hex查看數據data的值。
數據和主題都有各自的優劣:
主題是可以搜索到的,數據不能搜索到。
數據比主題所需要的gas少。
由于主題是帶有索引的參數,所以我們可以直接在日志中進行搜索,而數據是ABI編碼或hash值,所以不能直接搜索。
根據黃皮書我們可以找到日志的相關gas成本,日志的基礎費用是375gas,每個主題也是375gas,而數據字節的成本是8gas。
動態 | 韓國吉爾醫療中心醫院將創建一個基于區塊鏈的健康數據管理解決方案:據cointelegraph報道,區塊鏈驅動的醫療數據市場Longenesis和生物技術公司insilicon Medicine已與韓國吉爾醫療中心醫院(hospital Gil medical Center)達成協議,將創建一個基于區塊鏈的健康數據管理解決方案。作為合作的一部分,雙方打算開發一個基于Bitfury的Exonum區塊鏈框架的區塊鏈驅動平臺,以提高數據收集的效率,促進醫學研究進程,并確保患者同意的透明管理。[2019/4/24]
我們可以通過黃皮書知道日志的gas費用非常便宜,一個ERC20代幣轉賬事件的成本最多只花費1756gas,而標準以太幣的轉賬需要花費21000gas。當然了,前面說的只是日志記錄操作自身的成本,智能合約開發中不能單純值計算日志記錄操作的成本,但在開發中,我們可以僅在狀態變量中保存智能合約所需要使用的數據,其他的就用事件來處理,這樣能省下很多的gas費用。
觸發事件
接下來以一個實例進行說明觸發事件,下面的代碼實現了符合ERC20標準的代幣合約所使用的轉賬事件。
由于上面不是一個「匿名事件」,所以第一個主題將包含事件的簽名。
然后我們看一下該事件的參數,其中from和_to地址都是有索引的,value值是沒有索引的。所以_from和_to地址會被當成主題,而_value值會被當成數據。
在3.3節中我們說到過主題能被搜索,而數據不能,所以我們能在日志中搜索from地址和_to地址值的相關轉賬日志,卻不能夠搜索到轉賬金額為_value值的轉賬日志。由于該事件具有3個主題,所以該日志記錄操作將使用LOG3操作碼。
那如果我們想要找到數據的內容呢?這里就需要知道操作碼在EVM中的參數。LOG3雖然包含3個主題,在EVM中卻有5個參數。
如果要讀取數據的內容,通過以下的方式就可以從內存中讀取事件數據了。
釣魚
5.1事件在釣魚中的使用
前面介紹了那么多日志事件,那這些是如何和釣魚聯系到一起的呢?攻擊者一般會通過日志事件偽裝成交易所或者名人等給受害者轉幣,受害者看到是交易所或者名人轉來的代幣則放松警惕,此時攻擊者會引導受害者到有釣魚代幣的池子中,受害者看到該代幣交易價值極高,會立刻授權進行交易,而此時就陷入了攻擊者設置的圈套,攻擊者會讓受害者授權從而盜取走受害者錢包中的錢。
下圖就是之前發生的一起釣魚事件,攻擊者偽裝成幣安熱錢包給其他人轉釣魚代幣。
我們可以在BSC瀏覽器上通過標簽找到官方地址。
通過查詢,發現BinanceHotWallet6地址正是0x8894e0a0c962cb723c1976a4421c95949be2d4e3。
由于瀏覽器記錄是根據事件來的,所以說topics1的值即sender的值就是0x8894e0a0c962cb723c1976a4421c95949be2d4e3。
5.2復現
下面是BEP20的偽代碼,以BNBChain主網為例進行復現,攻擊者創建一個名為「PhishingToken」的釣魚代幣。。
如下圖所示,新增Binance參數其值為0x8894E0a0c962CB723c1976a4421c95949bE2D4E3。
然后,我們要修改如下圖紅色標記代碼,將emit觸發事件中的sender地址修改為Binance。
部署好合約后調用transfer函數將釣魚代幣轉發給受害者。
查看交易信息,發現這里的from地址并不是攻擊者的地址0x95E2Ea34dEB5C0954B91a47f459770D20568A15B,而是Binance:HotWallet6的地址0x8894E0a0c962CB723c1976a4421c95949bE2D4E3。
查看Logs日志,Topics1記錄的sender地址同樣也是BinanceHotWallet6地址,而Topics2記錄的recipient就是受害者的地址了。
總結
細節決定成敗,不要認為事件日志是微不足道的滄海一粟。在區塊鏈世界越是細節的地方越容易被黑客攻擊利用,往往需要更加謹慎小心。同時需要注意的是,我們也不能因為日志所展示出來的內容掉入騙子設計好的騙局中。再次提醒大家,不要隨意點擊陌生鏈接,更不要隨意授權他人。當我們更加深入理解事件日志的時候,才能更好的防止自己上當受騙。
參考文獻
Solidity中文文檔
Solidity中的事件和日志
UnderstandingeventlogsontheEthereumblockchain
以太坊黃皮書(2022-08-22)
TRONDAOVentures致力于培養精英初創企業,通過全面投資和戰略優化賦能企業發展。TRONDAO生態系統基金長期致力于實現去中心化.
1900/1/1 0:00:002022年回顧 2022年的區塊鏈行業可以說是日新月異,變化多端的一年。在這一年中,以太坊從POW轉向POS進入2.0時代,Layer2和新公鏈的逐步成長給市場帶來了新鮮血液,而Terra、三箭.
1900/1/1 0:00:00據官方消息,MagicSquare已成為2022波場黑客松大賽第三季合作伙伴。與此同時,MagicSquare首席執行官AndreyNayman將擔任本季評委.
1900/1/1 0:00:00國內 招聘公司:網易 職位 大客戶經理-星球項目部杭州市資深測試開發工程師-星球項目部杭州市區塊鏈市場研究-星球項目部杭州市資深區塊鏈開發工程師-杭州市市場品牌運營(區塊鏈方向)杭州市區塊鏈產品.
1900/1/1 0:00:00區塊鏈瀏覽器TRONSCAN最新數據顯示,截至10月17日,波場TRON賬戶總數達到116,081,883,正式突破1.16億.
1900/1/1 0:00:00據HuobiGlobal官方消息,格林納達常駐世界貿易組織代表、特命全權大使、波場TRON創始人孫宇晨先生閣下,受邀擔任由全球領袖人才領銜的HuobiGlobal顧問委員會首批顧問.
1900/1/1 0:00:00