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%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比特币与企业级区块链的区别
- 下一篇: 迪拜与IBM合作推出基于区块链的商业注册