背景
- fukumame55さんの以下の記事を参考にさせて頂き、EthereumのプライベートチェーンをPoAで構成した
- ブロック生成間隔を1秒にしたところ、トランザクションが含まれないブロックが大量に作られてしまう
- やはりfukumame55さんが同様の問題に対応するべく、トランザクションがある場合にだけブロックを生成するJSを紹介されていた(すごい)
- 色々調べていたら、そもそもgethのPoA(clique)は生成間隔を0秒にすると、トランザクションがある場合にだけブロックを生成することがわかったため、これについて注意点とともに記す
手順
gethのPoA(clique)のソースコードを見ると、「0-periodのチェーンの場合は空のブロックを作るの拒否する」との記述がある。
したがってこれにならい、ブロック生成間隔を0にすればトランザクションがある場合にだけブロック生成が行われるようになる。
直接genesis用のjsonファイルを触る場合は、以下のように記述すれば良い
"clique": {
"period": 0,
"epoch": 30000
}
- puppethを使ってjsonを作る場合はこんな感じで入力しておけばOK
Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authority
> 2
How many seconds should blocks take? (default = 15)
> 0
これで作ったチェーンはGanacheのAUTOMININGのようにトランザクションがある場合にだけブロック生成を行うようになる。
注意点
このチェーン上にtruffleでスマートコントラクトをtruffle migrate
でデプロイすると、
Running migration: 1_initial_migration.js
Replacing Migrations...
... 0xe4b8bb5955711eaa4735e4c36d362079417d93fba61d7cfa425befa77cb8c735
という状態になって動かなくなることがある。検索してみると同様の症状が起きている人はいたが、gethを最新版にアップデートすれば直るといったおそらくまた違う問題についての記述しか見つからず、かなりハマった。
結局、↑の状態でgethのコンソール上で無駄にトランザクションを発行したら動いた。例えば、
eth.sendTransaction({'from':eth.coinbase, 'to':"0xcde196243a25c239b81b7aa6147b83e395ebe46e", 'value':web3.toWei(1, 'ether')})
で適当にethを送金してみるのが早い。一時的にトランザクションが空になったためブロックが生成されず、デプロイが進まない状態なのだろうか?
環境
- Geth/v1.8.20
- Truffle v4.1.15