日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩!

發布時間:2025/3/21 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
80%開發者都不知道的以太坊騷操作:「事件」和「日志」還可以這么玩!
2018年05月02日 00:00:00閱讀數:366


作者 | 蔡一??志頂科技技術總監



4月6日,Daniel Larimer發布了一篇文章《EOSIO Dawn 3.0 Now Available》(譯:EOSIO Dawn 3.0來啦),在章節「Simplified Contract Development」(譯:更簡單的合約開發)中,舉了個「Hello,World」的智能合約的例子來說明合約開發的簡單。?


https://gist.githubusercontent.com/bytemaster/

58d45d13dbf8732c8d467b6415a44df9/raw/ba460c2aff29c7f60ecdef7dc082a0190b5af418/

hello.cpp


然而值得注意的是,示例的合約就執行了一條語句:print( "Hello, ", user);

那么問題來了:在智能合約中print的內容會出現在哪里呢


我沒實際運行過這段代碼,但我知道,print的內容只會出現在每個區塊鏈節點的日志文件或終端(Console)上。 實際上,傳統的print日志打印對智能合約的開發和跟蹤不存在任何意義。


那么,以太坊怎么解決這個問題的呢?以太坊引入了事件(Events)和日志(Logs)。?


這里說的「事件」和「日志」這兩個術語可能會引起混淆,本質上來說,智能合約通過「事件」來產生「日志」本文會介紹以太坊的「事件」和「日志」系統常用的3種場景,供以太坊開發者參考



事件和日志的用途


「事件」和「日志」對于以太坊是非常重要的,因為它們使智能合約與用戶界面之間的通信變得容易。在傳統的Web開發中,一個服務器響應會提供回調給前端。在以太坊中,當一個交易被打包,智能合約能發送事件以及寫日志到區塊鏈上以便前端處理。有三種情況需要使用事件和日志。


1. 智能合約給用戶界面返回值

我們還是以EOS的例子來看,鑒于Solidity拼接字符串比較麻煩,我就直接返回一個字符串。

?

如果你用Web3.JS來調用HelloWorld這個智能合約的函數「hi()」,你可能會認為是這樣:



那么,這句調用的result會是「hello, World」呢? 其實不是,不管函數返回什么值,Web3.JS都會返回一個Transaction Hash(交易哈希)。


那要怎么做呢?現在就輪到事件上場了。


修改后的智能合約代碼如下:

?

而Web3.JS則需要這樣寫:

?


當交易被打包時,回調函數將被觸發, 前端將獲得智能合約函數的返回值。


2. 異步數據通知

使用返回值返回給用戶界面其實很少用到。大部分時間,我們是使用事件給用戶界面發送數據。當智能合約想把某些數據通知用戶界面時,可以發送事件,用戶界面對這些時間進行監聽,就可以進行不同的操作。


3. 相對便宜的數據存儲

還有這一種使用方式是把日志作為數據存儲。在EVM規范和黃皮書中說明,事件將產生日志,而日志是會被存儲都區塊鏈的。日志存儲的Gas費用要比合約的存儲便宜很多(日志每個字節花費8個Gas,而合約存儲是每32個字節20,000個Gas)。因此,當你有存證等應用的時候,可以考慮使用日志來存儲,而不是在合約中使用Mapping來存儲。



日志的存儲結構


上面說了時間和日志的三種用法,最后我們來看看日志的大致結構。


?

你可以通過「remix」查看日志的接口。Topic指向特定的事件,但值是16進制的,這是個什么呢?其實這是事件的簽名。圖中的288d740d3b11a36c8526119855345e3ba2aee438370d264289ea6dfb76294fd0其實是sha3(Hi(string))的執行結果。下面的「event」和「args」是「remix」從區塊鏈的「收據(Receipt)數據的Logs項中解碼出來的。?


實際數據為:?


那是怎么解碼的呢?


前文中提到過,Topics實際上是事件的「sha3」簽名,示例合約中只有一個事件,可以直接對應,如果合約中有多個事件,需要通過ABI找出對應的event,逐一簽名,最后與Topics中的簽名進行對應即可找到對應的事件。


事件的名稱找到了,對應的參數就相對簡單,示例合約的ABI如下:



可以看到,type為event的事件,「輸入」(inputs)只有一個,那就是「say」,類型是「string」。


我們使用eth-abi工具(https://github.com/ethereum/eth-abi)可以進行解碼。(eth-abi是一個用Python編寫的Ethereum ABI工具)。命令如下:?



在web3.js 1.0-beta版本中,可以直接通過以下函數進行日志解碼:





結束語


「事件」(Events)是以太坊中很有意思的設計,對智能合約運行時與外部交互,特別是DApp的設計具有重要意義。大家在開發DApp和智能合約時可以根據實際情況靈活應用以上所介紹的3種方式,進行與前端的交互和日志的調試。也歡迎大家發掘更多的應用場景。



作者簡介:蔡一,區塊鏈技術專家,長期研究并實踐區塊鏈技術與應用,精通以太坊智能合約開發。現為志頂科技技術總監,負責公司核心產品TokenPOS通證寶設計與研發。

總結

以上是生活随笔為你收集整理的80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。