ブロックチェーン技術ブログ

ブロックチェーンと英語、数学に関するブログ

Ethereumウォレット < MetaMask >

Ethereumウォレット

Ethereumウォレットは、Ethereumアカウントを管理するためのアプリです.
このアプリを使用することで、アカウントの残高の取得やトランザクションの送信をおこなうことが可能になります.

単一のウォレットで、複数のアカウントを管理することもできます.
また、ウォレットを使用することで、dappsに接続することもできます.

ウォレットには、いくつかのタイプがあります.

  • ハードウェアウォレット
    ユーザの秘密鍵をハードウェアデバイスで管理する.
    安全性が非常に高い.

  • モバイルアプリ
    スマートフォンのアプリ形式のウォレット.
    ex) MyEtherWallet

  • ブラウザ
    ウォレット機能を搭載したブラウザ.
    ex) Brave Browser

  • ブラウザ・エクステンション (プラグイン)
    ブラウザにインストールして、ブラウザ経由で、Ethereumブロックチェーンと対話する.
    ex) MetaMask

MetaMask

ブラウザ・エクステンションとして利用可能なウォレットです.

MetaMaskは、接続するEthereumネットワークを選択することができます.
Ganacheのようなテスト用のブロックチェーンに接続することもできます.
デフォルトでは、メインネットに接続されています.

ブラウザにMetaMaskがインストールされている場合、以下のオブジェクトから、Ethereumプロバイダーにアクセスできます.

window.ethereum

MetaMaskと接続する

以下のメソッドで、Ethereumのアカウント情報の取得をリクエストします.
ethereum.request({ method: 'eth_requestAccounts' });

このメソッドが実行すると、Ethereumアカウントを選択するポップアップが表示されます.

ブラウザコンソールから、上記のメソッドを呼び出した例
返り値は、選択したアカウントのアドレスの配列

> await ethereum.request({ method: 'eth_requestAccounts' });
['0xd12ee6b1663f0eb7194402c902fe69b3c8c0179a']

コントラクトと対話する

デプロイしたコントラクトにトランザクションを送るには、以下の点に気をつける必要があります.

  • 接続しているネットワークが正しいこと
    コントラクトをデプロイしたネットワークと同じネットワークに接続している必要があります.

  • コントラクトアカウントのアドレスが正しいこと
    トランザクションを送りたいコントラクトのアドレスを正しく指定する必要があります.

  • コントラクトABIが正しいこと
    コントラクトABIは、スマートコントラクタのインタフェースをエンコードしたものです.
    ethres, web3jsといったEthereumのライブラリにコントラクトのABIを与えることで、そのコントラクトが提供しているメソッドの情報を与えることができます.

トランザクションを送る

request メソッド呼び出し時に、引数の methodeth_sendTransaction を指定することで、トランザクションを送信できます.

今回は、Ganacheを利用して、シンプルな送金を試してみます.

事前にいくつか準備をしておきます.

Ganacheを起動して、アカウントを用意しておきます.

MetaMaskのネットワークに、Ganacheを追加しておきます

先頭のアカウント(0x0658..2) をMetaMaskにインポートしておきます.

Ganacheで、先頭のアカウント(0x0658...2)から、2番目のアカウント(0x538...1) に 1 ETH 送金してみましょう.

ブラウザのコンソールで、トランザクションのパラメータを定義します.
※ここでは、必要最低限のパラメータのみ定義します.

> const params = {
    to: '0x538434931f9fe66431Ebf1De29B67CfF36323DC1',
    from: '0x0658e418b08dCe59e42d7c5127421560B6081c22',
    value: '0x92342a2',
}
パラメータ名 説明
to 送金先のアカウントのアドレス.
コントラクト作成の場合は、不要.
from トランザクションを開始するアカウントのアドレス.
MetaMaskに接続しているアカウントと一致してる必要がある.
value ETHを送金する場合は、送金するETHを指定する.(単位: wei)
16進数でエンコードする必要がある.

※ 他には、Gas PriceやGas Limit等を指定することができます.

コンソールから、先ほどのパラメータを引数に、トランザクションを送信してみます.

> await ethereum.request({
  method: 'eth_sendTransaction',
  params: [params]
});

確認のダイアログが表示されるので、Confirmをクリックします.

コンソールに、トランザクションのハッシュが出力されます.

> await ethereum.request({
  method: 'eth_sendTransaction',
  params: [params]
});
0xc91a894985e5df6e212337ff3dd2f4fba56e27eae70388ca85ab89eb2ae77f8a'

Ganacheからもトランザクションが完了したことを確認できます.