👓

GethのプライベートネットワークにMetamaskを接続して送金してみる

2022/07/24に公開

https://zenn.dev/hid3/articles/5533d50b1d3de8
を参考に、docker-composeでGethを実行し、マイニングができるようになったところから書いていきます。

docker-compose.yml

# docker-compose.yml
version: "3"
services:
  app1:
    image: ethereum/client-go
    container_name: private_net1
    entrypoint: /bin/sh
    tty: true
    volumes:
      - ./private_net:/geth
    ports:
      - 8545:8545

portを指定する必要があります。
Gethの実行時のオプションでhttpリクエストを受け取れるようにした時のデフォルトポートが8545なので今回は8545を指定します。

Geth実行時のオプション

Geth実行のコマンドは以下。

geth --networkid "22" --nodiscover --datadir /geth --http --http.addr "0.0.0.0" console 2>> /geth/error.log

必要なのは--http, --http.addr "0.0.0.0"
--httpはMetamaskがネットワークに接続するのにhttpを使うので、httpリクエストを受け取れるように。
--http.addr "0.0.0.0"は今回はDockerコンテナ内でGethを実行しているので必要。

オプションはこちらを参照。
https://geth.ethereum.org/docs/interface/command-line-options

Metamaskにネットワークを追加


新しいRPC URLとしてhttp://localhost:8545を指定。
Geth実行のコマンドでhttpのポートを指定していないので8545となっている。

チェーンIDは22
今回はジェネシスブロックのchainIdを22としていたので。
各自のチェーンIDを指定してください。

Metamaskにアカウントをインポート

Gethにアカウントがない場合は作成をしてください。

今回はこのような状態になっています。

> eth.accounts
["0xdcfc0837e489ead966ecdb00abce38d72267c474", "0xac5a53981b38eb63134dfee19934742542ef5874", "0xc846940796b9e4a9bf5604baa6fbceb2741d24ea"]
> eth.coinbase
"0xdcfc0837e489ead966ecdb00abce38d72267c474"

アカウントを3つ作っていて、1番目のアカウントがコインベースアカウント(マイニング報酬を受け取るアカウント)になっています。

"0xdcfc0837e489ead966ecdb00abce38d72267c474"のアカウント(コインベースアカウント)をMetamaskにインポートしてみます。

Metamaskの右上アイコンメニューからアカウントをインポートを指定。

JSONファイルはGeth実行時のdatadirに指定したディレクトリにkeystoreというディレクトリがあり、その中にアカウントごとにJSONファイルがあるので対象アカウントのJSONファイルをアップロードします。
アカウントとJSONファイルの対応がわからないときは、JSONファイルのaddressにアドレスが書いてあるのでそれで確認できます。

(自分のPCだと何故かインポート処理に結構時間がかかりMetamaskが固まってインポートに失敗したりしました。何回か試したらインポートできてました。)

インポートに成功し、所持しているETHが反映されています。

> eth.getBalance(eth.accounts[0])
462999999999829437900

送金

"0xdcfc0837e489ead966ecdb00abce38d72267c474"から
"0xc846940796b9e4a9bf5604baa6fbceb2741d24ea"へ3ETH送金してみます。

Metamaskで送金。
アドレスを指定。


Gethでマイニングを実行していなければ実行します。

しばらくすれば送金されているのが確認できます。

(3ETH送金したけどマイニング報酬をもらっているので3ETH減ったわけではない)

受け取った方は

> eth.getBalance(eth.accounts[2])
3000000000000000000

Discussion