Ethereum のイベントとログは特にわかりにくい概念です。この記事は、それらを整理するのに役立ちます。 まず、Ethereum のイベントとログは基本的に同じ概念です。これは、Solidity と web3.js ではイベント、Ethereum Yellow Paper ではログと呼ばれています。これは次のように理解できます: Ethereum はログを通じてイベント機能を実装します。スマート コントラクト コードは、LOG オペコードを介してブロックチェーンにログを書き込みます。 ログの内容はブロックチェーンのどこに保存されますか? ログの内容はトランザクションの領収書の一部です。 Receipts のその他のコンテンツを含むログ コンテンツ全体は、ブロックのヘッダーに格納される ReceiptsRoot を生成します。完全なデータはオフチェーンで保存されます。 イベントとログには主に 3 つの用途があります。
一つずつ説明しましょう: 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 |
<<: 通貨専門家:フェドコインはドル危機を解決する最後の手段
>>: ビットコインの潮が引いたとき、裸で泳ぐのは誰か:業界関係者は規制により価値が消えることはないと言う
Stephen D Palley 氏はワシントン DC で開業している弁護士で、ブロックチェーンやス...
まずは前回の【アドバンスミニクラス】の内容を振り返ってみましょう。前回の記事では、Filecoin ...
クレイジーな解説:ナスダックは典型的な伝統的な金融機関として、ブロックチェーンの分野で大きな進歩を遂...
数日前、Xiaolu はマイニング マシンの回収期間と主流のマイニング マシンの性能比較について皆さ...
ロシア中央銀行は本日、デジタルルーブル導入の可能性に関する報告書を発表した。報道によると、銀行はこの...
Amazon クラウド ソリューション アーキテクトの中国東部マネージャーである Wu Pengch...
デジタル通貨マイニング業界は、参加者数が比較的少ない業界であるため、これまであまり注目されてきません...
世界中でますます多くの金融機関がビットコインのブロックチェーン技術に興味を持つようになるにつれ、一部...
市場全体が活況を呈し、新規投資家が多数参入しているが、数ある通貨の中からいかに質の高い通貨を選択する...
Bitmainの支配権をめぐる戦いの続編があります。 5月27日、北京ビットメインテクノロジー株式会...
リップル社のCEO、ブラッド・ガーリングハウス氏と共同創業者のクリス・ラーセン氏は、米証券取引委員会...
Bianewsは、米上院エネルギー・新エネルギー委員会が現地時間8月21日にブロックチェーンや類似...
分散型台帳技術(ブロックチェーン)は世界中の金融機関から認知され続けていますが、その基盤となるアプリ...
ICO(Initial Coin Offerings)は、暗号通貨プロジェクトに投資する非常に人気の...
最近、イーサリアムコア開発者会議で、開発者はイーサリアムロンドンアップグレードに EIP-1559 ...