簡単なEtherのwalletを作る(3)
前節では「simple-ether-wallet」に送金を行う機能を追加しました。walletの画面上で送金を行うとネットワーク上に送金のトランザクションが送信され、それを採掘者が採掘することでアカウントの残高が変化しました。
ブロックチェーンを用いた送金では、あるトランザクションが組み込まれたブロックが採掘されることでそのトランザクションが「1回の承認(confirmation)を得た」と考えます。そしてそのブロックの後ろに続くブロックが採掘されればその数に応じて承認の数が増えて、そのトランザクションの信頼が高まります。Ethereumではおおよそ12回の承認を得ることでほぼ間違いなく信頼ができると言われています。
この節では下図の赤枠のようにwalletが送信したトランザクションの履歴とそれらのトランザクションが何回承認(confirmation)されたかを表示する機能を追加します。

※前節に続きここで説明するアプリケーションのソースコードはGitHub上に公開しています。
Transactionsコレクションを定義
トランザクションの履歴を保管し管理するためにMeteorのCollectionオブジェクトを利用します。MeteorのCollectionオブジェクトはサーバサイドやブラウザのローカルストレージ上にデータを格納し永続的にデータを保持することも可能ですが、ここでは簡単のためにブラウザ上のメモリ上のみに履歴を保存することにします。(そのため、ブラウザのタブを閉じれば履歴はクリアされます。)トランザクション履歴のCollectionオブジェクトとしてTransactionsを定義するコードをclient/lib/init.js内に追加します。
client/lib/init.js
アプリが正しく動作していれば、このコードを追加したあと、ブラウザコンソール上で下記のようにコレクション内の全てのドキュメント(レコード)を取り出すコマンドTransactions.find().fetch();を実行してみると[]のように空の配列が返されるはずです。(Transactionsオブジェクトは定義したものの、まだデータは何も入れていないため空の配列が返されます。)
ブラウザコンソール上
トランザクション情報を登録
Transactionsコレクションが定義されたので、Etherの送金を実行した際にそのトランザクション情報をTransactionsコレクションに登録するようにします。
トランザクションの送信を行うweb3.eth.sendTransaction関数のコールバック関数内でalert("Ether Transfer Succeeded");としていた部分の代わりに次のようなTransactionsコレクションへのドキュメント追加を行う処理を追加し下記のようにします。
client/templates/components/send_ether_component.js
また、上記で追加した部分に現在のUNIX時刻を求める新しい関数を利用しているのでその定義を下記のように追記します。
client/lib/modules/time_utils.js
以上の修正を行った上で、アプリ上で送金の操作を行い、ブラウザコンソール上で再度、Transactions.find().fetch();コマンドを実行してみてください。送金を行った情報がドキュメントとして保存されたのが見て取れるはずです。
トランザクション情報を表示
次にTransactionsコレクションの情報を画面上に表示する機能をつけ加えていきます。SendビューにlatestTransactionComponentテンプレートを付け加え、このテンプレート内でTransactionsコレクションを表示する機能を実装していきます。
まずは、下記のようにSendビューのテンプレートにInclusionsタグ{{> latestTransactionComponent}}を追加します。
client/templates/views/send.html
新しく、client/templates/components/以下にlatest_transaction_component.htmlとlatest_transaction_component.jsのテンプレートとそのヘルパのファイルを下記のように追加します。ここでTransactionsコレクションに何も登録されていない場合は「No Transactions To Show」と表示し、一つ以上トランザクションが登録されていればTransactionsコレクションからfindメソッドを用いて
トランザクションの発生日時
送金元アドレス
送金先アドレス
送金額
を取り出し表示することを行っています。また現時点では承認回数をゼロで固定に表示しています。(後程、リアルタイムに承認回数を表示する機能を実装していきます。)
client/templates/components/latest_transaction_component.html
client/templates/components/latest_transaction_component.js
以上のコードを追加した後、画面から送金操作を行うとSendビューの下部に実際に送金した情報がリスト上に表示されるでしょう。
View this Commit On GitHub (Tag:"Step008")
承認状態の監視と表示
最後に、ウォレットで送金したトランザクションの承認状態を監視しそれを表示する機能を付け加えてきましょう。この機能は大まかに以下の方法で実現していきます。
Transactionsコレクションの登録状況を常時ウォッチする機能を追加
コレクションにトランザクションが新しく追加されたら、そのトランザクションの承認状態の監視を開始。
コレクションからトランザクションが削除されたら、そのトランザクションの承認状態の監視を停止。
Ehtereumネットワーク上で新しいブロックが採掘されるたびに監視対象のトランザクションの承認状態をチェックする。承認状態の監視は、当該トランザクションが採掘されたブロックの後ろに12個のブロックが追加されるまで行い、その後は監視を停止する。
まずはwalletアプリ起動時にTransactionsコレクションの登録状況の監視を開始するためのメソッドを呼び出すように、client/lib/init.jsの末尾に下記のコードを追加します。
client/lib/init.js
また、上記で追加したobserveTransactions()メソッドを下記のように実装します。
client/lib/modules/observe_transactions.js
次に、上記コード内で呼ばれているcheckTransactionConfirmations()メソッドを実装します。処理の内容はソースコード内のコメントを参照してください。
client/lib/modules/check_transaction_confs.js
また、最後に承認回数を画面に表示するために、transactionItemテンプレートヘルパの承認回数の取得部分をTransactionsコレクションと最新のブロックナンバーの差から表示するように、以下のように修正します。
client/templates/components/latest_transaction_component.js
Last updated
Was this helpful?