📖

Chapter2: EthereumとSolidityインストール | Solidity Programming Essentialsを読む

2022/08/02に公開
1

イーサリアムの知識を整理するために2022年6月発売のSolidity Programming Essentials 2nd Editionを読み進める試みです。この記事ではChapter2「EthereumとSolidityインストール」を読み進めます。

Solidity Programming Essentials: A guide to building smart contracts and tokens using the widely used Solidity language, 2nd Edition (English Edition)

読書ログは以下のスクラップで逐次更新していきます。
https://zenn.dev/mah/scraps/ea8c79961ae8c8


Chapter2ではローカルでの開発に必要なツール群を導入していく。ローカルでの開発にあたってイーサリアムネットワーク区分の理解は重要だと思われるのでメモしておく。

イーサリアムネットワーク

イーサリアムは分散型アプリケーションの作成とデプロイのためのオープンソースプラットフォームである。

イーサリアムでは多数のコンピュータ(ノード)すべてが相互接続され、分散型台帳にデータを保存している。これはネットワーク上の各ノードが台帳のコピーを利用できることを意味し、開発者は要件とユースケースに基づいて適切なネットワークを選択する必要がある。

メインネットワーク

メインネットワークは誰でも利用できるグローバルでパブリックなネットワークである。アカウントを使ってアクセスでき、誰でも自分のスマートコントラクトをデプロイできる。メインネットワークを利用するとガス代というコストが発生する。

ハードフォーク[1]によりメインネットワークが変化すると、コードネームも変化する。2022年8月2日現在ではGray Glacierが最新。本書執筆時点ではLondonが最新(現在の最新から3個前のアップデート)と書いてあるので、執筆にはかなり時間がかかっていたのだと思われる。

テストネットワーク

テストネットを利用するとコントラクトのデプロイや使用には一切費用がかからないので、開発時はテストネットを利用することになる。テストネットにはいくつか種類がある。

Ropsten

ブロック生成にProof of Workコンセンサス方式を採用した最初のテストネットワークの一つ。Gethで--testnetオプションを使用することで利用できる。最もポピュラーなテストネット。

Rinkeby

コンセンサス方式としてProof of Authority(PoA)を採用している。

Kovan

parityクライアントからのみアクセスできるテストネット。

Goerli

PoAベースのテストネット。

プライベートネットワーク

個人や組織が独自にホストしているネットワーク。外部からのデータ閲覧はできない。

コンソーシアムネットワーク

プライベートネットワークと似ているが、複数の組織によって運営され、データは関連組織外から閲覧できない。

Gethのインストール

$ brew tap ethereum/ethereum
$ brew install ethereum
$ geth version
Geth
Version: 1.10.21-stable
Architecture: arm64
Go Version: go1.18.4
Operating System: darwin
GOPATH=/Users/mah_lab/dev
GOROOT=go

プライベートネットワークの作成

ジェネシスブロックを表現する以下のJSONを元にネットワークを作成する。

{
  "config": {
    "chainId": 9999,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "muirGlacierBlock": 0,
    "berlinBlock": 0,
    "londonBlock": 0,
    "arrowGlacierBlock": 0,
    "grayGlacierBlock": 0,
    "ethash": {}
  },
  "nonce": "0x0",
  "timestamp": "0x62272fde",
  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x47b760",
  "difficulty": "0x80000",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "alloc": {},
  "number": "0x0",
  "gasUsed": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "baseFeePerGas": null
}

以下コマンドでgenesis.jsonを利用してネットワークを初期化する。

$ geth init --datadir=./ genesis.json

次に以下コマンドでgethノードを開始する。

$ geth --datadir=./ --networkid 9999 --identity "ritesh --http  -http.api="admin,debug,txpool,miner,eth,net,web3,personal"" --snapshot=false

ネットワークにアクセスするためにはgeth attachを利用する。まだアカウントも作られていないので、コンソールから作成してみる。更にノードでマイニングを行う際の報酬をそのアカウントに紐付け、マイニング後に報酬が加算されていることを確認する。

$ geth attach ./geth.ipc

# アカウントを作成する
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x3c917c48a080f49b8d0ba5f55f4d56eebb389a5f"

# マイナーとしてアカウントを設定する
> miner.setEtherbase("0x3c917c48a080f49b8d0ba5f55f4d56eebb389a5f")
true

# 設定されたかどうかを確認する
> eth.coinbase
"0x3c917c48a080f49b8d0ba5f55f4d56eebb389a5f"

# マイニングをスタートする
> miner.start()
null

# ネットワークログを見るとマイニングが行われている様子が見られる

# マイニングをストップする
> miner.stop()
null

# 掘れたブロック数を確認する
> eth.blockNumber
24

# 報酬を確認する
> eth.getBalance(eth.coinbase)
48000000000000000000

Ganacheの導入

gethは正規のイーサリアムネットワークを構築してくれるのですが、ローカルでの検証時にはわざわざマイニングせずにトランザクション生成時点で台帳に書き込んでくれた方がラクだよね、ということがあります。

そんなニーズに応えたのがganacheです。gethはGoで書かれていますが、ganacheはnode.js上で稼働します。なので事前にnode.jsのセットアップが必要です。

$ npm install -g ganache
$ ganache -p 9090
ganache v7.4.0 (@ganache/cli: 0.5.0, @ganache/core: 0.5.0)
Starting RPC server

Available Accounts
==================
(0) 0x60b676e395c8519A56f87783bEa0d8d1459dab25 (1000 ETH)
(1) 0x3180AB4Db526647e207481EbfC82cC02Ad3c70cE (1000 ETH)
(2) 0x1E7E17bA2DFdC10d29a4C45cc0A0f188a5869Bc7 (1000 ETH)
(3) 0x71a14CEBD025481bDc0DEcDFbFBF178BCE1b2c2f (1000 ETH)
(4) 0x8a17923F8940a812522052000E6B2481E8d2CeD6 (1000 ETH)
(5) 0x81b938d2E1B201F8BE1223723213267b62B3DB40 (1000 ETH)
(6) 0x6f38C18cabA94c54a7B6b96F8e9676B428A013F2 (1000 ETH)
(7) 0xc9a41409C53af400675353334a9B91F85D6D08B0 (1000 ETH)
(8) 0x6b79f2d9341777A985504bf3d27f03C90C7f6Fa7 (1000 ETH)
(9) 0x7Cd82cdee5Ef9143e51872Aef914Dde21e07f3ca (1000 ETH)

ganachedでネットワークを起動するの自動的に10アカウント作成されます。先ほどのgeth attachを利用してネットワークに接続し、アカウントにアクセスできるかどうかを試してみます。

$ geth attach http://127.0.0.1:9090
> eth.accounts
["0x60b676e395c8519a56f87783bea0d8d1459dab25", "0x3180ab4db526647e207481ebfc82cc02ad3c70ce", "0x1e7e17ba2dfdc10d29a4c45cc0a0f188a5869bc7", "0x71a14cebd025481bdc0decdfbfbf178bce1b2c2f", "0x8a17923f8940a812522052000e6b2481e8d2ced6", "0x81b938d2e1b201f8be1223723213267b62b3db40", "0x6f38c18caba94c54a7b6b96f8e9676b428a013f2", "0xc9a41409c53af400675353334a9b91f85d6d08b0", "0x6b79f2d9341777a985504bf3d27f03c90c7f6fa7", "0x7cd82cdee5ef9143e51872aef914dde21e07f3ca"]

このようにganacheはCLIから扱うこともできますが、公式サイトからElectron版(GUI)をダウンロードすることもできます。こちらの方が扱いやすいと思います。

脚注
  1. ブロックチェーンの仕様変更方法の一つで、後方互換性のないアップデートのこと ↩︎

Discussion