ubuntu20.04 + Gethの導入手順

ubuntu 20.04にEtherum実行環境をインストールする。Virtual Boxへの導入手順はこちらを参照されたし。
https://qiita.com/kanazwk/items/5af85437ec556e23ef40


今回の参考サイトはこちら。
https://book.ethereum-jp.net/

以下にユーザ名"kana"で実行したログをもとにまとめた。

#Gethのインストール
以下のコマンドを実行し、Gethをインストールする。

**Geth**：Go-Ethereum。Ethereumのクライアントソフトウェア。

**PPA**：Personal Package Archive。デフォルトの公式リポジトリに含まれない個人アーカイブのこと。`add-apt-repository -y `でEthereum配布元のリポジトリを指定し、ローカルのパッケージリストに追加する。

```
$ sudo add-apt-repository -y ppa:ethereum/ethereum
[sudo] kana のパスワード:
ヒット:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
取得:2 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 DEP-11 Metadata [263 kB]
ｶ荳ｼ倖5 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]
ｶ荳ｼ倖6 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal InRelease [17.5 kB]
取得:7 http://jp.archive.ubuntu.com/ubuntu focal-updates/universe amd64 DEP-11 Metadata [205 kB]
取得:8 http://jp.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 DEP-11 Metadata [2,468 B]
取得:9 http://jp.archive.ubuntu.com/ubuntu focal-backports/universe amd64 DEP-11 Metadata [1,768 B]
取得:10 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [24.2 kB]
取得:11 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [56.5 kB]
取得:12 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main i386 Packages [500 B]
取得:13 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 Packages [3,072 B]
取得:14 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main Translation-en [880 B]
898 kB を 3秒 で取得しました (348 kB/s)
パッケージリストを読み込んでいます... 完了
$
```

ローカルのパッケージリストを更新することで、インストール可能なものとしてGethが認識される。

```
$ sudo apt-get update
ヒット:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
ｰ・牴蜑・ http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease
ｰ・牴蜑・ http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease
ヒット:4 http://security.ubuntu.com/ubuntu focal-security InRelease
ヒット:5 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal InRelease
パッケージリストを読み込んでいます... 完了
$
```

Gethのインストール。結構長いこと時間がかかる。数分程度。

```
$ sudo apt-get install ethereum
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfprint-2-tod1
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  abigen bootnode clef evm geth puppeth rlpdump
以下のパッケージが新たにインストールされます:
  abigen bootnode clef ethereum evm geth puppeth rlpdump
アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。
36.0 MB のアーカイブを取得する必要があります。
この操作後に追加で 127 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 abigen amd64 1.9.25+build24398+focal [5,451 kB]
取得:2 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 bootnode amd64 1.9.25+build24398+focal [5,285 kB]
取得:3 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal/main amd64 clef amd64 1.9.25+build24398+focal [8,024 kB]
46% [3 clef 7,598 kB/8,024 kB 95%]                                             225 kB/s 1分 18秒
:
thereum (1.9.25+build24398+focal) を展開しています...
rlpdump (1.9.25+build24398+focal) を設定しています ...
puppeth (1.9.25+build24398+focal) を設定しています ...
clef (1.9.25+build24398+focal) を設定しています ...
bootnode (1.9.25+build24398+focal) を設定しています ...
geth (1.9.25+build24398+focal) を設定しています ...
evm (1.9.25+build24398+focal) を設定しています ...
abigen (1.9.25+build24398+focal) を設定しています ...
ethereum (1.9.25+build24398+focal) を設定しています ...
$
```

gethコマンドを実行してみて、インストールされたことを確認する。

```
$ geth --help
```

# パッケージの最新化
インストールしたGethパッケージを最新化する。`apt-get update`でローカルのパッケージリストを最新化し、`apt-get upgrade`でパッケージを更新する。特に更新はなかった。

```
$ sudo apt-get update
ヒット:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
ヒット:2 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease
ヒット:3 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease
ヒット:4 http://ppa.launchpad.net/ethereum/ethereum/ubuntu focal InRelease
取得:5 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]
取得:6 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [24.3 kB]
取得:7 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [56.6 kB]
190 kB を 2秒 で取得しました (81.1 kB/s)
パッケージリストを読み込んでいます... 完了
$
```

```
$ sudo apt-get upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libfprint-2-tod1
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
$
```

# Genesisファイルを作成する
ブロックチェーンネットワーク上の最初のBlockであるGenesisブロックの情報を記述したGenesisファイルを作成する。

```
$ pwd
/home/kana
$ mkdir ./eth_private_net
$ ls -ld ./eth_private_net/
drwxrwxr-x 2 kana kana 4096 12月 27 18:39 ./eth_private_net/
$ cd eth_private_net/
$ touch myGenesis.json
```

myGenesis.jsonファイルには下記を記述する。

```myGenesis.json
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

# Genesisブロックの初期化
作成したGenesisファイルの内容で、ブロックチェーン情報を初期化する。

```
$ geth --datadir /home/kana/eth_private_net init /home/kana/eth_private_net/myGenesis.json
INFO [12-27|18:46:13.842] Maximum peer count                       ETH=50 LES=0 total=50
INFO [12-27|18:46:13.842] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [12-27|18:46:13.844] Set global gas cap                       cap=25000000
INFO [12-27|18:46:13.844] Allocated cache and file handles         database=/home/kana/eth_private_net/geth/chaindata cache=16.00MiB handles=16
INFO [12-27|18:46:13.855] Writing custom genesis block
INFO [12-27|18:46:13.855] Persisted trie from memory database      nodes=0 size=0.00B time="13.035 μs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [12-27|18:46:13.856] Successfully wrote genesis state         database=chaindata hash="7b2e8b …7e0432"
INFO [12-27|18:46:13.856] Allocated cache and file handles         database=/home/kana/eth_private_net/geth/lightchaindata cache=16.00MiB handles=16
INFO [12-27|18:46:13.864] Writing custom genesis block
INFO [12-27|18:46:13.865] Persisted trie from memory database      nodes=0 size=0.00B time="6.663μs"  gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [12-27|18:46:13.866] Successfully wrote genesis state         database=lightchaindata hash="7b2e8b…7e0432"
```

`--datadir`で指定したディレクトリ配下にデータが格納される。下記のようなディレクトリ構成が自動生成された。

```
$ ls -lR eth_private_net/
eth_private_net/:
合計 12
drwx------ 4 kana kana 4096 12月 27 18:46 geth
drwx------ 2 kana kana 4096 12月 27 18:46 keystore
-rw-rw-r-- 1 kana kana  411 12月 27 18:41 myGenesis.json

eth_private_net/geth:
合計 12
-rw-r--r-- 1 kana kana    0 12月 27 18:46 LOCK
drwxr-xr-x 2 kana kana 4096 12月 27 18:46 chaindata
drwxr-xr-x 2 kana kana 4096 12月 27 18:46 lightchaindata
-rw------- 1 kana kana   64 12月 27 18:46 nodekey

eth_private_net/geth/chaindata:
合計 16
-rw-r--r-- 1 kana kana 1245 12月 27 18:46 000001.log
-rw-r--r-- 1 kana kana   16 12月 27 18:46 CURRENT
-rw-r--r-- 1 kana kana    0 12月 27 18:46 LOCK
-rw-r--r-- 1 kana kana  435 12月 27 18:46 LOG
-rw-r--r-- 1 kana kana   54 12月 27 18:46 MANIFEST-000000

eth_private_net/geth/lightchaindata:
合計 16
-rw-r--r-- 1 kana kana 1245 12月 27 18:46 000001.log
-rw-r--r-- 1 kana kana   16 12月 27 18:46 CURRENT
-rw-r--r-- 1 kana kana    0 12月 27 18:46 LOCK
-rw-r--r-- 1 kana kana  435 12月 27 18:46 LOG
-rw-r--r-- 1 kana kana   54 12月 27 18:46 MANIFEST-000000

eth_private_net/keystore:
合計 0
$
```

# Gethの起動
gethを起動する。
`--networkid "15"`は、同じnetworkidで起動しているノード(peer)が探しに来るという代物。デフォルトで走査に行くが、今回`--nodiscover`を指定しているのでその処理は行われない。`console`でトランザクション処理を操作できるコンソールを起動することが出来る。バックグラウンドで起動しておいて、後でコンソールを起動することもできる。

```
$ geth --networkid "15" --nodiscover --datadir "/home/kana/eth_private_net" console 2>> /home/kana/eth_private_net/geth_err.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.25-stable-e7872729/linux-amd64/go1.15.6
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
 datadir: /home/kana/eth_private_net
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d
>
```

# Genesisブロックの表示
Genesisブロックの内容を表示する。作成した`myGenesis.json`の内容を読み込んでいることを確認する。

```
> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0x7b2e8be699df0d329cc74a99271ff7720e2875cd2c4dd0b419ec60d1fe7e0432",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3333333333333333333333333333333333333333",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
>
```

# まとめ
導入はここまで。次回はアカウント作成とマイニングをしてみる。