簡単なEtherのwalletを作る(2)

前節で「simple-ether-wallet」のダッシュボード部分の実装を行ってきました。本節では「Send」ビューを追加しアカウント間でのEtherの送金を可能にしていきます。

※前節に続きここで説明するアプリケーションのソースコードはGitHub上に公開しています。

URLルーティング

まず、DashboardとSendの2つのビューそれぞれにURLをマッピングし、リクエストされたURLに応じてどのビューを表示するかをコントロールするURLルーティングの仕組みを導入します。MeteorではURLルーティングに「iron:router」パッケージを利用するのが最も一般的のため、ここでもそれに倣います。コンソール上でプロジェクトRootに移動し下記のコマンドを実行することでパッケージがインストールされます。

$ meteor add iron:router

iron:routerを用いたURLルーティングは、Layoutテンプレートと呼ばれるサイト全体で共通のテンプレートの中にInclusionsタグの一種{{> yield}}を埋め込み、iron:routerが自動的にリクエストURLにマッピングされたテンプレート(Routeテンプレート)を{{> yield}}部分に埋め込み表示する動作をします。

URLルーティングの設定

Layoutテンプレートの指定やURLへのテンプレートのマッピングはRouterオブジェクトの属性を設定することで行います。そこで下記のコードを記述したroute.jsclient/lib以下に作成します。ここでは以下の動作を記述しています。

  • LayoutテンプレートとしてwalletLayoutを指定。

  • URLが'/'の場合は'/dashboard'にリダイレクトさせる。(例えば、http://localhost:3000 のリクエストが来た場合、http://localhost:3000/dashboard にリダイレクトさせる。)

  • URLが'/dashboard'の場合はRouteテンプレートとしてdashboardテンプレートを割り当てる。

  • URLが'/send'の場合はRouteテンプレートとしてsendテンプレートを割り当てる。

client/lib/route.js

Layoutテンプレートの追加

Layoutテンプレートとして指定したwalletLayoutテンプレートとそのヘルパー関数を追加します。iron:routerはLayoutテンプレートを自動的にhtmlファイルの<body>タグ内に展開するように動作するため、このwalletLayoutテンプレートでは<body>タグの内部に記述されるべきコードのみを記述します。また元々<body>タグとその内部を記述していたmain.htmlからは当該箇所を削除します。

client/templates/wallet_layout.html

client/templates/wallet_layout.js

client/main.html

以上までの手順で、ナビゲーションバーとURLとテンプレートのマッピング機能が追加されました。次にURLにマッピングされた各ビューのテンプレートを追加していきます。

DashboardとSendビューの追加

Dashboardビュー

Dashboardビュー用のテンプレートを追加していきます。Dashboardビューでは「簡単なEtherのWalletを作る(1)」の節で追加していったものと同じ

  • Account Balance

  • Node Status

  • Block Status

の3つのコンポーネントで構成することにします。そのためDashbordビューのテンプレートとしてこれらのコンポーネントのテンプレートを呼び出すように下記のコードを追加することで、Dashboardビューの表示が可能になります。

client/templates/views/dashboard.html

dashboardビューはこれで完成です。

Sendビュー

次に、Sendビューのテンプレートとして下記のコードを追加します。以降の節でSendビューの機能を追加していきますが、ここではその土台として下記のように「Account Balance」のコンポーネントのみ追加しています。

client/templates/views/send.html

以上までで、以下のイメージのようにナビゲーションバーからそれぞれのビューに遷移が可能になります。

【Dashboardビューでの表示】

【Sendビューでの表示】

View this Commit On GitHub (Tag:"Step006")

送金機能の追加

Sendビューに「Send Ether」コンポーネントを追加しEtherを送金する機能を実装していきます。下図のように送金元アドレスと送金先アドレス、および送金するEtherの額を入力し「Submit」ボタンを押下することで送金を確認するモーダルウィンドウが表示され、そこで「Yes」を押下するとEthereumのノードにトランザクションが送信される動きをします。

【Submitボタンを押下するとモーダルの確認画面が表示される】

送金情報入力画面と確認画面の表示

まずは送金情報を入力する画面と送金の確認を行う画面までを作成していきます。また送金の確認画面では送金に必要なFeeの表示も行います。

Sendビューのテンプレートに既存のaccountBalanceComponentのInclusionsタグの後にsendEtherComponentのInclusionsタグを追加します。

client/templates/views/send.html

そして追加したsendEtherComponentテンプレートのコードを下記のように追加します。

client/templates/components/send_ether_component.html

送金情報をSession変数で管理するために、初期化のコードをinitSessionVars関数内に追記します。

client/lib/modules/init_session_vars.js

送金入力画面及び確認画面のヘルパと送金入力画面のイベント処理のコードを追加します。

client/templates/components/send_ether_component.js

トランザクションの送信

ここまでで、

  • 送金情報の入力

  • 必要なFeeの計算

  • 確認画面の表示

といったEtherの送金の準備に必要な機能が追加されました。次に確認画面で「Yes」ボタンを押下することで、入力内容のトランザクションをEthereumネットワーク上に送信する機能を追加します。

トランザクションの送信は送金確認画面のテンプレートにイベントリスナーを追加することで実現します。以下のコードをsend_ether_component.jsの末尾に追加します。送金画面で「Yes」をクリックした際に、トランザクション送信のための非同期関数web3.eth.sendTransactionを呼び出す処理を行っています。またそのコールバック関数内でエラーが無ければトランザクションの送信が成功した旨、エラーがあれば失敗した旨をダイアログボックスに表示することを行っています。

client/templates/components/send_ether_component.js

これで、Etherの送金が可能になりました。実際に今回追加した機能で送金を行ってみましょう。送金を行い暫くすると送金に基づいてアカウントのEtherの残高が変化するはずです。

ここでアカウントの残高は送金(トランザクション送信)と同時に変化するのではなく採掘者がそのトランザクションをブロックに入れ採掘したタイミングで変化することに注意してください。

View this Commit On GitHub (Tag:"Step007")

Last updated

Was this helpful?