您現在的位置是:首頁 > 動作武俠首頁動作武俠

以太坊中的Events和Logs

簡介js的message call功能模擬呼叫智慧合約:var returnValue = exampleContract

events是什麼意思

以太坊中的Events和Logs

以太坊中的事件(Events)和日誌(Logs)是個特別讓人困惑的概念,本文幫大家梳理。

首先,以太坊中的Events和Logs基本上算是同一個概念。Solidity和web3。js中稱為Events,以太坊黃皮書中稱為Logs。你可以理解為:以太坊透過Logs實現Events(事件)功能。智慧合約程式碼透過LOG opcode將日誌寫入區塊鏈中。

日誌內容位於區塊鏈的什麼地方?

日誌內容是交易收據(Transaction Receipts)的一部分,整個日誌內容,包括Receipts的其它內容會生成一個ReceiptsRoot儲存在區塊的頭部。而完整資料則是鏈下儲存。

事件和日誌的主要用途有三種:

幫助使用者客戶端(web3。js)讀取智慧合約的返回值;

智慧合約非同步通知使用者客戶端(web3。js);

用於智慧合約的儲存(比Storage便宜得多); 下面我們逐個解釋:

1。幫助使用者客戶端(web3。js)讀取智慧合約的返回值:

假設下面的智慧合約:

contract ExampleContract { // some state variables 。。。 function foo(int256 _value) returns (int256) { // manipulate state 。。。 return _value; } } 我們可以透過web3。js的message call功能模擬呼叫智慧合約:

var returnValue = exampleContract。foo。call(2); console。log(returnValue) // 2 但是在真實的環境中我們需要傳送交易(Transaction)來呼叫某個智慧合約。這時我們將無法獲得智慧合約的返回值。因為該交易當前只是被髮送,離被打包、執行還有一段時間。此時呼叫的返回值只是該交易的txid或稱為tx hash值。

var returnValue = exampleContract。foo。sendTransaction(2, {from: web3。eth。coinbase}); console。log(returnValue) // transaction hash 這時事件(Events)就登場了:

//以下是solidity智慧合約程式碼 contract ExampleContract { event ReturnValue(address indexed _from, int256 _value); function foo(int256 _value) returns (int256) { ReturnValue(msg。sender, _value); return _value; } }

//以下是web3。js使用者客戶端程式碼 var exampleEvent = exampleContract。ReturnValue({_from: web3。eth。coinbase}); exampleEvent。watch(function(err, result) { if (err) { console。log(err) return; } console。log(result。args。_value) // check that result。args。_from is web3。eth。coinbase then // display result。args。_value in the UI and call // exampleEvent。stopWatching() }) exampleContract。foo。sendTransaction(2, {from: web3。eth。coinbase}) 當交易被打包時,web3。js中的callback就會被呼叫,這時web3。js就可以得到交易中的智慧合約呼叫的返回值了。

至於為什麼交易打包,web3中的callback就被呼叫那是另一個問題了,簡單解釋如下。web3會和以太坊某個節點相連,當該節點得知某個交易進block後,會通知相連的web3相關資訊。

2。智慧合約非同步通知使用者客戶端(web3。js):

上面例子是智慧合約通知使用者客戶端的典型例子,但還有更多的非同步呼叫可以透過類似的方式實現,從而實現了智慧合約非同步呼叫使用者客戶端的能力。

注:智慧合約通常用solidity編寫,執行在以太坊節點上(EVM)。 注:使用者客戶端通常用web3。js編寫,執行在web伺服器上,web3。js跟某個以太坊節點相連。

3。用於智慧合約的儲存(比Storage便宜得多):

相比智慧合約賬戶的Storage,用日誌的方式儲存一些資訊會便宜很多。Storage中大致的價格是:每32位元組(256位)儲存需要消耗20,000氣(Gas)。而日誌大致是每位元組8氣(Gas)。

下面看一個例子:

//solidity智慧合約程式碼,模擬使用者存款功能 contract CryptoExchange { event Deposit(uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time); function deposit(uint256 _amount, uint256 _market) returns (int256) { // perform deposit, update user’s balance, etc Deposit(_market, msg。sender, _amount, now); }

//當某戶呼叫智慧合約存了某筆款後, 智慧合約需要主動通知使用者客戶端更新相應資訊。 //以下是web3。js程式碼: var depositEvent = cryptoExContract。Deposit({_sender: userAddress}); depositEvent。watch(function(err, result) { if (err) { console。log(err) return; } // append details of result。args to UI }) //透過增加fromBlock引數指定關注的區塊範圍 var depositEventAll = cryptoExContract。Deposit({_sender: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); depositEventAll。watch(function(err, result) { if (err) { console。log(err) return; } // append details of result。args to UI //如果不想再被通知可以呼叫: //depositEventAll。stopWatching(); }) //注:indexed關鍵字表示按該欄位索引日誌,以提高查詢效率。

以太坊中的Events和Logs

okex以太坊今日行情

Top