ブロックチェーンの話(10):イーサリアムのイベントとログ

ブロックチェーンの話(10):イーサリアムのイベントとログ

Ethereum のイベントとログは特にわかりにくい概念です。この記事は、それらを整理するのに役立ちます。

まず、Ethereum のイベントとログは基本的に同じ概念です。これは、Solidity と web3.js ではイベント、Ethereum Yellow Paper ではログと呼ばれています。これは次のように理解できます: Ethereum はログを通じてイベント機能を実装します。スマート コントラクト コードは、LOG オペコードを介してブロックチェーンにログを書き込みます。

ログの内容はブロックチェーンのどこに保存されますか?

ログの内容はトランザクションの領収書の一部です。 Receipts のその他のコンテンツを含むログ コンテンツ全体は、ブロックのヘッダーに格納される ReceiptsRoot を生成します。完全なデータはオフチェーンで保存されます。

イベントとログには主に 3 つの用途があります。

  1. ユーザー クライアント (web3.js) がスマート コントラクトの戻り値を読み取るのを支援します。

  2. スマート コントラクトはユーザー クライアント (web3.js) に非同期的に通知します。

  3. スマートコントラクト用のストレージ(Storage よりもはるかに安価)

一つずつ説明しましょう:

1. ユーザー クライアント (web3.js) がスマート コントラクトの戻り値を読み取れるようにします。

次のスマート コントラクトを想定します。

契約例契約 {
  // いくつかの状態変数...
  関数 foo(int256 _value) は (int256) を返します {
    // 状態を操作する...
    _value を返します。
  }
}

web3.js のメッセージ呼び出し関数を使用してスマート コントラクトの呼び出しをシミュレートできます。

 var returnValue = exampleContract.foo.call(2);
console.log(戻り値) // 2

しかし、実際の環境では、スマート コントラクトを呼び出すためにトランザクションを送信する必要があります。現時点ではスマートコントラクトの戻り値を取得することはできません。トランザクションは現在送信中であるため、パッケージ化されて実行されるまでにはしばらく時間がかかります。このときの呼び出しの戻り値は、トランザクションの txid または tx ハッシュ値のみです。

 var returnValue = exampleContract.foo.sendTransaction(2, {from: web3.eth.coinbase});
console.log(returnValue) // トランザクションハッシュ

ここでイベントが関係してきます:

 //以下はSolidityスマートコントラクトコードcontract ExampleContract {
  イベント ReturnValue(アドレスインデックス _from、int256 _value);
関数 foo(int256 _value) は (int256) を返します {
    戻り値(msg.sender、_value);
    _value を返します。
  }
}
//以下は web3.js ユーザー クライアント コードです var exampleEvent = exampleContract.ReturnValue({_from: web3.eth.coinbase});
 exampleEvent.watch(function(err, result) {
  もし(エラー){
    コンソール.log(エラー)
    戻る;
  }
  console.log(結果.引数._値)
  // result.args._from が web3.eth.coinbase であることを確認します
  // UIにresult.args._valueを表示し、
      // exampleEvent.stopWatching()
})
exampleContract.foo.sendTransaction(2, {from: web3.eth.coinbase})
トランザクションがパッケージ化されると、web3.js 内のコールバックが呼び出され、web3.js はトランザクション内のスマート コントラクト呼び出しの戻り値を取得できます。
トランザクションがパッケージ化され、web3 のコールバックが呼び出される理由については、別の質問です。簡単に説明すると次のようになります。 web3 は Ethereum 内のノードに接続されます。ノードは、トランザクションがブロックに入ったことを知ると、接続された Web3 に関連情報を通知します。

2. スマート コントラクトはユーザー クライアント (web3.js) に非同期的に通知します。

上記の例は、スマート コントラクトがユーザー クライアントに通知する典型的な例ですが、同様の方法で実装できる非同期呼び出しは他にもたくさんあり、これにより、スマート コントラクトがユーザー クライアントを非同期に呼び出す機能が実現されます。
注: スマート コントラクトは通常、Solidity で記述され、Ethereum ノード (EVM) 上で実行されます。
注: ユーザー クライアントは通常、web3.js で記述され、Web サーバー上で実行されます。 web3.js は Ethereum ノードに接続されています。

3. スマートコントラクト用のストレージ(Storage よりもはるかに安価):

スマート コントラクト アカウントのストレージと比較すると、ログの形式で一部の情報を保存する方がはるかに安価です。ストレージのおおよその価格は、ストレージ 32 バイト (256 ビット) あたり 20,000 GAS です。ログは 1 バイトあたり約 8 ガスを使用します。

例を見てみましょう:

 //Solidity スマート コントラクト コード、ユーザー入金関数コントラクト CryptoExchange をシミュレート {
  イベント Deposit(uint256 インデックス _market、アドレス インデックス _sender、uint256 _amount、uint256 _time);
関数deposit(uint256 _amount, uint256 _market)は(int256)を返します{
    // 入金、ユーザーの残高の更新などを実行します
    デポジット(_market, msg.sender, _amount, now);
}
//世帯がスマート コントラクトを呼び出して一定額のお金を預ける場合、スマート コントラクトはユーザー クライアントに積極的に通知して対応する情報を更新する必要があります。
//以下はweb3.jsコードです:
 var depositEvent = cryptoExContract.Deposit({_sender: userAddress});
depositEvent.watch(function(err, result) {
  もし(エラー){
    コンソール.log(エラー)
    戻る;
  }
  // result.args の詳細を UI に追加します
})
 //fromBlockパラメータを追加して、関心のあるブロック範囲を指定します
var depositEventAll = cryptoExContract.Deposit({_sender: userAddress}, {fromBlock: 0, toBlock: 'latest'});
depositEventAll.watch(関数(err, 結果) {
  もし(エラー){
    コンソール.log(エラー)
    戻る;
  }
  // result.args の詳細を UI に追加します
  // 再度通知を受けたくない場合は、以下を呼び出します:
  //depositEventAll.stopWatching();
})

//注: indexed キーワードは、クエリの効率を向上させるために、ログがこのフィールドによってインデックス付けされることを示します。

上記の内容は、オンライン情報と個人的な理解に基づいて著者がまとめたものです。転載する場合は出典「ブロックチェーンについて語る」を明記してください。イーサリアムの詳細については、「ブロックチェーンについて語る」の他の記事やビデオを読んでください。また、「ブロックチェーンについて語る」のWeChatパブリックアカウントをフォローしてください:ttblockchain

<<:  通貨専門家:フェドコインはドル危機を解決する最後の手段

>>:  ビットコインの潮が引いたとき、裸で泳ぐのは誰か:業界関係者は規制により価値が消えることはないと言う

推薦する

Filecoin マイニングに参加するには、知っておくべき 8 つのこと

Filecoin が 2017 年に 1 位の 1CO になって以来、分散型ブロックチェーン分散ス...

ギャラクシーリサーチディレクター:米国の暗号通貨市場と規制環境の将来動向

私はGalaxy Digitalのチームと公開市場と暗号通貨の交差点について議論しましたが、興味深い...

HNAはブロックチェーン研究を加速し、従業員向け共有サービスから顧客向けまで複数のアプリケーションを実装

2015年以降、世界のトップ商業銀行や投資銀行の多くがブロックチェーンを導入する意向を表明しています...

徹底丨ETHマイナーの収入が大幅に増加?暗号通貨市場 6 月のデータ分析

ラリー・セルマックまとめオンチェーン取引量、スポットおよびデリバティブ取引量、ウェブサイトのトラフィ...

凍結されたコインとカードの波が再び来ています。個人の仮想資産を保護するにはどうすればいいですか?

昨日、大きなVのマークが付いたWeiboユーザーが「出所不明の低価格OTC商品を受け取らないでくださ...

VeryHashの創設者コン・メン氏:ビットコインは金に取って代わり、よりコンセンサスのある金融資産になる可能性が高い

クラウド コンピューティングのパワーは、過去 2 年間、業界で話題となってきました。世界初のコンピュ...

アイスランドでビットコインマイニングが急成長している理由

アイスランドの南西端には、レイキャネス半島と呼ばれる不毛の火山半島があります。ここにはケプラヴィーク...

米国保健情報技術国家調整官室がブロックチェーン保健情報技術チャレンジの優勝者を発表

クレイジーコメント:米国の国家医療情報技術調整官室(ONC)は最近、ブロックチェーン医療情報技術チャ...

ホット ストレージとコールド ストレージ: 最適な暗号化ストレージ ソリューションを選択するにはどうすればよいでしょうか?

CoinDeskアナリスト、ロージー・パーパーセキュリティや利便性のいずれの理由であっても、適切な...

ロシアの党首がビットコインの合法化を提案、すでに200万人の国民がビットコインウォレットを保有していると主張

ロシアのメディア報道によると、ロシアの小さな政党がビットコインによる寄付を受け付けている。ロシア大統...

Ravencoin (RVN) が Wabi.com に追加され、まもなく Binance に上場される予定

暗号通貨プロジェクト「Ravencoin」は、2018年4月3日に最初のホワイトペーパーを公開しまし...

ヴィタリック・ブテリン:ブロックチェーン開発において不変性は無価値である

Money 20/20 は金融分野における最高レベルのイベントと考えられています。クロスボーダー決済...

SECのゲンスラー委員長:暗号通貨は詐欺や乱用が横行しており、国家安全保障を脅かしている

米証券取引委員会のゲイリー・ゲンスラー委員長は8月4日、米国の国家安全保障を守るためには暗号通貨とデ...

イージーマイナー週間収益動向(1)

これまで、EasyMiner は毎月 1 日にバージョンを更新することを選択してきました。 1年間の...