GenesisファイルとGethの起動コマンド
どうも、ぺろりんです。
前回予告した通り、今回は前回出てきた用語の深堀りをやりたいと思います。
テーマは「Genesisファイル」と「Gethの起動コマンド」。
前回はそれぞれおまじないと思って言われるがままやってみたわけですが、この辺はちゃんと知っとくべきかと思い調べてみました。
Genesisファイル
Genesisファイルとは?
そのチェーンの最初のブロックであるGenesisブロック(ブロック番号「0」)の情報を記述したファイルのことのようです。
これは0番目の「ブロック」そのものというよりも、ブロックの「構成ファイル」なのかな?(だとすると、前回の記述は語弊がある)
デフォルトのGenesisブロックというのも用意されているようですが、これだと採掘難度が高くて、テストで遊ぶには面倒みたいです。
Genesisファイルのパラメータ内容
設定値の内容について調べてみると日本語では詳しいのは見つからず、参考に挙げた英語のサイトが一番詳しかったです。
個人的な勉強の意味でも、参考にした英語サイトにあった内容をほぼそのまま日本語訳しておきます。
誤訳のご指摘などありましたらメールフォームからお問い合わせいただけると助かります。
【mixhash】
256bitのハッシュで、ナンス(nonce)と組み合わせることで、このブロック上で十分な量の計算がされたことを証明する(Proof-of-Work)。
ナンスとミックスハッシュの組み合わせは、イエローペーパーの式(44)を満たさないといけない。
これにより、そのブロックが本当に暗号論的に採掘されていて、この意味で妥当なものと検証できる。
【nonce】
64bitのハッシュで、ミックスハッシュと組み合わせることで、このブロック上で十分な量の計算がされたことを証明する(Proof-of-Work)。
ナンスとミックスハッシュの組み合わせは、イエローペーパーの式(44)を満たさないといけない。
これにより、そのブロックが本当に暗号論的に採掘されていて、この意味で妥当なものと検証できる。
このトークンの値を決定するにあたって特定領の計算がなされたことについて、合理的な疑いを残さない程度に証明するようなプルーフ・オブ・ワークという暗号学的に安全なマイニングがナンスである。
【difficulty】
このブロックでナンスを見つけるまでに適用される難易度に相当するスカラー値[注1]。
これは1つ前のブロックの難易度とタイムスタンプから計算されるマイニングターゲットを定義する。
難易度を高くすると、マイナーは妥当なブロックを見つけるために、統計的により多くの計算をしないといけなくなる。
この値は、対象の範囲でブロック生成の頻度を保つようなあるブロックチェーンにおけるブロック生成時間を制御するために使われる。
妥当なブロックの発見はブロックチェーンのトランザクション実行に要求されるため、テストネットワーク上ではテストの待ち時間を避けるため低い値に保つ。
【alloc】
初めから中身の入ったウォレットのリストを定義するのを許可する。
これは「イーサの事前売り出し(プリセール)」期を扱うためのイーサ特有の機能。
ローカルのイーサはすぐに採掘できるので、このオプションは使わない。
【coinbase】
このブロックで成功したマイニングから集められた(イーサでの)全ての報酬が送られる160bitのアドレス。
これらはマイニング報酬自体と返金を実行するコントラクトのトランザクションとの合計。
仕様書では「beneficiary(受取人)」と名付けられていて、オンラインの文書だと「etherbase(イーサベース)」だったりする。
新しいブロックが生成されるときマイナーの設定によって設定される値なので、Genesisブロックでの値は何でも良い。
【timestamp】
このブロックの最初の時点での、Unixのtime()関数の妥当な出力に等しいスカラー値[注1]。
この機構はブロック間時間の意味で恒常性を強制する。
最後の2ブロック間の時間間隔が小さくなると難易度は大きくなり、従って次の妥当なブロックを見つけるためにはよりたくさんの計算が要求される。
もしこの時間間隔が大きくなりすぎると、難易度と次のブロックまでの時間は減らされる。
またタイムスタンプで、そのチェーン内にあるブロックの順序を確かめられる。
【parentHash】
ナンスとミックスハッシュを含む、すべての親ブロックヘッダーのKeccak[注2]による256bitのハッシュ。
その親ブロックへのポインタ[注3]であり、したがって複数のブロックからなるチェーンを実質的に作っている。
Genesisブロックの場合のみ、これは「0」。
【extraData】
自由に選べる値。
ただし、ethernity[注4]のスマートさを保つために最長32byteのスペース。
【gasLimit】
1ブロックあたりに消費するGasに対する現在のチェーン幅制限に当たるスカラー値[注1]。
テスト中、この閾値によって制限されるのを避けるため、今の場合は大きい値が設定されている。(このブログと同じ値)
注意として、この値を大きくしたからと言って、我々のコントラクトでGas消費に注意しなくて良いわけではない。
個人的な理解と疑問のメモ
上記の訳とさらに調べてみた内容から、現状の理解と疑問をメモしておきます。
まだよくわかってないので、触りながらおいおい疑問を解消していきたいところ。
・mixhash、nonce→マイニング結果の成否判定に使う値として設定する。この2つはイエローペーパーの式(44)の関係を満たすものが正当な組み合わせ。ナンスを設定しておいて、設定したナンスに対してイエローペーパーの式(44)を満たすミックスハッシュを総当たりで探すのがマイニングということかな。今回、本に書いてたGenesis.jsonの中身にあったミックスハッシュの値は自明な値ってことかな…?
・difficulty→採掘難易度。この値がナンスの値に条件を付ける。難易度を上げると、正しいミックスハッシュを見つけるのが難しいナンスが設定されるということかな。
・alloc→ウォレットの初期値設定ということか。
・coinbase→マイニング報酬が送られるアドレス。Genesis.jsonで設定したcoinbaseのアドレスにすべての報酬が送られるのか…?それとも各ブロックごとに、ブロックを生成したノード(マイナー)のアカウントアドレスが設定されるんだろうか?前者だとすると、マイナーすべての報酬をまとめたアドレスからマイナーが報酬をもらうの…?それともこのアドレスは複数設定できるのだろうか?まだよく理解できない。。
・timestamp→ブロックに設定された生成時刻…ってことでいいのかな?
・parentHash→親ブロック情報をハッシュ値にしたもの。以前書いた内容で、(狭義の)ブロックチェーンはハッシュ値でブロックをつなげたものというのがありましたが、ブロック同士をつなげるためのハッシュ値がこの「親ハッシュ」という値のことみたいですね。実際には親ブロックすべてではなく、親ブロックのヘッダ情報のハッシュ値を、親ブロックの情報として持っているということかな。
・extraData→その他の関連情報、という感じですがいまいち用途がわからない。。ネットニュースで「Extradata」という言葉は出てきていますが。。
・gasLimit→これはたぶん、以前書いた内容と同じと思ってよさそうです。
現状の私の理解はこんな感じですね。
まだ理解できていない箇所が結構ありますが、これは今後肉付けしていきたいところ。
(参考)
・What does each genesis.json parameter mean?(StackExchange)
・プライベート・ネットに接続する(Ethereum入門)
・etherを採掘する(Ethereum入門)
・Ethereumはどのように動いているのか(The Coffee Times)
・イーサリアム(Ethereum)サーバ構築編(都会暮らしを楽に生きる)
・Ethash(ethereum/wiki)
・Ethereumを使って独自トークンを作ってみる(1)(FRONT)
Gethの起動コマンド
前回使ったGeth起動「呪文」の内容を見ておこうかと思います。
前回唱えた呪文は、こんな内容。
とりあえずオプションの意味をメモしておきます。
・--networkid→ネットワーク識別子。「0」~「3」は予約済みのため使えない。
・--nodiscover→自分のノードを、他のノードから検出できないようにするオプション。
・--maxpeers→自分のノードに接続できるノード数。「0」だと他のノードと接続しない。
・--datadir →データディレクトリの指定。指定なしだとデフォルトのディレクトリが使用される。
・console→対話型JavaScriptコンソールを起動。
・2>>→エラー出力のリダイレクト。(Linuxコマンドでの出力先指定)
まとめ
今回は、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」からはちょっと寄り道して、「Genesisファイル」と「Gethの起動コマンド」について深めてみました。
パラメータの内容を調べて、結果と自分なりの理解や疑問をメモしました。
内容は上記参照のこと。
パラメータ内容は何となくわかってきたので、疑問点はいったんおいておいて次は教科書をすすめたいと思います。
では今回はこのへんで。
[注1] スカラー値…向きなどの情報を持たないただの数のこと。これに対してベクトル値だと、複数の数を組み合わせることで向きの情報も持たせることができる。
[注2] Keccak…ハッシュ関数(ハッシュ生成アルゴリズム)の1つ。SHA-3。
(参考)
・次世代ハッシュ関数 SHA-3 アルゴリズム(JPCERTCC)
・SHA-3(Wikipedia)
[注3] ポインタ…wikiによると「あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)もの」。データそのものではなく、データの位置情報。
(参考)
・ポインタ (プログラミング)(Wikipedia)
[注4] ethernity…これのこと…?
前回予告した通り、今回は前回出てきた用語の深堀りをやりたいと思います。
テーマは「Genesisファイル」と「Gethの起動コマンド」。
前回はそれぞれおまじないと思って言われるがままやってみたわけですが、この辺はちゃんと知っとくべきかと思い調べてみました。
Genesisファイル
Genesisファイルとは?
そのチェーンの最初のブロックであるGenesisブロック(ブロック番号「0」)の情報を記述したファイルのことのようです。
これは0番目の「ブロック」そのものというよりも、ブロックの「構成ファイル」なのかな?(だとすると、前回の記述は語弊がある)
デフォルトのGenesisブロックというのも用意されているようですが、これだと採掘難度が高くて、テストで遊ぶには面倒みたいです。
Genesisファイルのパラメータ内容
設定値の内容について調べてみると日本語では詳しいのは見つからず、参考に挙げた英語のサイトが一番詳しかったです。
個人的な勉強の意味でも、参考にした英語サイトにあった内容をほぼそのまま日本語訳しておきます。
誤訳のご指摘などありましたらメールフォームからお問い合わせいただけると助かります。
【mixhash】
256bitのハッシュで、ナンス(nonce)と組み合わせることで、このブロック上で十分な量の計算がされたことを証明する(Proof-of-Work)。
ナンスとミックスハッシュの組み合わせは、イエローペーパーの式(44)を満たさないといけない。
これにより、そのブロックが本当に暗号論的に採掘されていて、この意味で妥当なものと検証できる。
【nonce】
64bitのハッシュで、ミックスハッシュと組み合わせることで、このブロック上で十分な量の計算がされたことを証明する(Proof-of-Work)。
ナンスとミックスハッシュの組み合わせは、イエローペーパーの式(44)を満たさないといけない。
これにより、そのブロックが本当に暗号論的に採掘されていて、この意味で妥当なものと検証できる。
このトークンの値を決定するにあたって特定領の計算がなされたことについて、合理的な疑いを残さない程度に証明するようなプルーフ・オブ・ワークという暗号学的に安全なマイニングがナンスである。
【difficulty】
このブロックでナンスを見つけるまでに適用される難易度に相当するスカラー値[注1]。
これは1つ前のブロックの難易度とタイムスタンプから計算されるマイニングターゲットを定義する。
難易度を高くすると、マイナーは妥当なブロックを見つけるために、統計的により多くの計算をしないといけなくなる。
この値は、対象の範囲でブロック生成の頻度を保つようなあるブロックチェーンにおけるブロック生成時間を制御するために使われる。
妥当なブロックの発見はブロックチェーンのトランザクション実行に要求されるため、テストネットワーク上ではテストの待ち時間を避けるため低い値に保つ。
【alloc】
初めから中身の入ったウォレットのリストを定義するのを許可する。
これは「イーサの事前売り出し(プリセール)」期を扱うためのイーサ特有の機能。
ローカルのイーサはすぐに採掘できるので、このオプションは使わない。
【coinbase】
このブロックで成功したマイニングから集められた(イーサでの)全ての報酬が送られる160bitのアドレス。
これらはマイニング報酬自体と返金を実行するコントラクトのトランザクションとの合計。
仕様書では「beneficiary(受取人)」と名付けられていて、オンラインの文書だと「etherbase(イーサベース)」だったりする。
新しいブロックが生成されるときマイナーの設定によって設定される値なので、Genesisブロックでの値は何でも良い。
【timestamp】
このブロックの最初の時点での、Unixのtime()関数の妥当な出力に等しいスカラー値[注1]。
この機構はブロック間時間の意味で恒常性を強制する。
最後の2ブロック間の時間間隔が小さくなると難易度は大きくなり、従って次の妥当なブロックを見つけるためにはよりたくさんの計算が要求される。
もしこの時間間隔が大きくなりすぎると、難易度と次のブロックまでの時間は減らされる。
またタイムスタンプで、そのチェーン内にあるブロックの順序を確かめられる。
【parentHash】
ナンスとミックスハッシュを含む、すべての親ブロックヘッダーのKeccak[注2]による256bitのハッシュ。
その親ブロックへのポインタ[注3]であり、したがって複数のブロックからなるチェーンを実質的に作っている。
Genesisブロックの場合のみ、これは「0」。
【extraData】
自由に選べる値。
ただし、ethernity[注4]のスマートさを保つために最長32byteのスペース。
【gasLimit】
1ブロックあたりに消費するGasに対する現在のチェーン幅制限に当たるスカラー値[注1]。
テスト中、この閾値によって制限されるのを避けるため、今の場合は大きい値が設定されている。(このブログと同じ値)
注意として、この値を大きくしたからと言って、我々のコントラクトでGas消費に注意しなくて良いわけではない。
個人的な理解と疑問のメモ
上記の訳とさらに調べてみた内容から、現状の理解と疑問をメモしておきます。
まだよくわかってないので、触りながらおいおい疑問を解消していきたいところ。
・mixhash、nonce→マイニング結果の成否判定に使う値として設定する。この2つはイエローペーパーの式(44)の関係を満たすものが正当な組み合わせ。ナンスを設定しておいて、設定したナンスに対してイエローペーパーの式(44)を満たすミックスハッシュを総当たりで探すのがマイニングということかな。今回、本に書いてたGenesis.jsonの中身にあったミックスハッシュの値は自明な値ってことかな…?
・difficulty→採掘難易度。この値がナンスの値に条件を付ける。難易度を上げると、正しいミックスハッシュを見つけるのが難しいナンスが設定されるということかな。
・alloc→ウォレットの初期値設定ということか。
・coinbase→マイニング報酬が送られるアドレス。Genesis.jsonで設定したcoinbaseのアドレスにすべての報酬が送られるのか…?それとも各ブロックごとに、ブロックを生成したノード(マイナー)のアカウントアドレスが設定されるんだろうか?前者だとすると、マイナーすべての報酬をまとめたアドレスからマイナーが報酬をもらうの…?それともこのアドレスは複数設定できるのだろうか?まだよく理解できない。。
・timestamp→ブロックに設定された生成時刻…ってことでいいのかな?
・parentHash→親ブロック情報をハッシュ値にしたもの。以前書いた内容で、(狭義の)ブロックチェーンはハッシュ値でブロックをつなげたものというのがありましたが、ブロック同士をつなげるためのハッシュ値がこの「親ハッシュ」という値のことみたいですね。実際には親ブロックすべてではなく、親ブロックのヘッダ情報のハッシュ値を、親ブロックの情報として持っているということかな。
・extraData→その他の関連情報、という感じですがいまいち用途がわからない。。ネットニュースで「Extradata」という言葉は出てきていますが。。
・gasLimit→これはたぶん、以前書いた内容と同じと思ってよさそうです。
現状の私の理解はこんな感じですね。
まだ理解できていない箇所が結構ありますが、これは今後肉付けしていきたいところ。
(参考)
・What does each genesis.json parameter mean?(StackExchange)
・プライベート・ネットに接続する(Ethereum入門)
・etherを採掘する(Ethereum入門)
・Ethereumはどのように動いているのか(The Coffee Times)
・イーサリアム(Ethereum)サーバ構築編(都会暮らしを楽に生きる)
・Ethash(ethereum/wiki)
・Ethereumを使って独自トークンを作ってみる(1)(FRONT)
Gethの起動コマンド
前回使ったGeth起動「呪文」の内容を見ておこうかと思います。
前回唱えた呪文は、こんな内容。
vm01@ubuntu:~$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /home/vm01/data_testnet console 2>> /home/vm01/data_testnet/geth.log
とりあえずオプションの意味をメモしておきます。
・--networkid→ネットワーク識別子。「0」~「3」は予約済みのため使えない。
・--nodiscover→自分のノードを、他のノードから検出できないようにするオプション。
・--maxpeers→自分のノードに接続できるノード数。「0」だと他のノードと接続しない。
・--datadir →データディレクトリの指定。指定なしだとデフォルトのディレクトリが使用される。
・console→対話型JavaScriptコンソールを起動。
・2>>→エラー出力のリダイレクト。(Linuxコマンドでの出力先指定)
まとめ
今回は、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」からはちょっと寄り道して、「Genesisファイル」と「Gethの起動コマンド」について深めてみました。
パラメータの内容を調べて、結果と自分なりの理解や疑問をメモしました。
内容は上記参照のこと。
パラメータ内容は何となくわかってきたので、疑問点はいったんおいておいて次は教科書をすすめたいと思います。
では今回はこのへんで。
[注1] スカラー値…向きなどの情報を持たないただの数のこと。これに対してベクトル値だと、複数の数を組み合わせることで向きの情報も持たせることができる。
[注2] Keccak…ハッシュ関数(ハッシュ生成アルゴリズム)の1つ。SHA-3。
(参考)
・次世代ハッシュ関数 SHA-3 アルゴリズム(JPCERTCC)
・SHA-3(Wikipedia)
[注3] ポインタ…wikiによると「あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)もの」。データそのものではなく、データの位置情報。
(参考)
・ポインタ (プログラミング)(Wikipedia)
[注4] ethernity…これのこと…?