しゅーと (@shutingrz)
しゅーと (@shutingrz)
Security researcher
Apr 29, 2019 3 min read

自作仮想通貨入門(7) - コンセンサスの設定

※この章では src/chainparams.cpp を変更します。

ジェネシスブロックに続いて、今回はコンセンサスも決めていきます。 実はここはデフォルトのままでも問題ないのですが、一応軽く説明します。


コンセンサスについて

chainparams.cpp には Mainnet, Testnet, Regtest それぞれでconsensusというコンセンサスに関わる変数が存在します。
コンセンサスには色々な設定項目がありますが、この章では実際の仮想通貨の運営で重要な設定項目のみ説明をします。
※コンセンサスには非常に沢山の設設定項目があり、1から説明するとそれだけで長文になってしまうのでここでは省きました。

採掘難易度/Difficulty を見直す間隔(nPowTargetTimespan)/

単位は秒。

長いとマイニングが安定しますが、一度確定すると実際のハッシュレートにそぐわない難易度で続き、難易度が高くなるとブロックが生成されにくくなる時間が増え、難易度が下がるとブロックが生成されやすくなるためPoWの弱点を悪用した攻撃の影響を受けやすくなります。 短いと実際のハッシュレートがリアルタイムで反映されるようになりますが、ハッシュレートが一時的に上昇すると難易度もすぐに上昇し、マイニングが不安定になります。

bitcoinは2週間、Litecoinは3.5日、Monacoinは1.1日です。 ハッシュレートが高い仮想通貨のほうが長くする傾向にあるようです。

ブロック生成間隔(nPowTargetSpacing)

単位は秒。

長いと確定したブロックが不変になりやすく安定する一方、ブロックが生成されにくくなりトランザクションの流通が阻害されます。 短いとトランザクションの流通が盛んになる一方、ブロックの生成が容易になります。 これによりnPowTargetTimespanとハッシュレート、ノードの規模との兼ね合いでBlock Withholding AttackなどPoWの弱点を悪用した攻撃の影響を受けやすくなります。 Block Withholding Attack はモナコインが受けた攻撃ですね。

新ルールのアクティベートの閾値計測期間(nMinerConfirmationWindow)

単位はブロック数。

BIP9で定められた、ソフトフォークのアクティベーション方法に関する変数です。 ソフトフォークによって新しいルールに対応したシグナルをどのブロック数計測するかをここで定めます。

新ルールのアクティベートを行うための計測期間あたりの対応率(nRuleChangeActivationThreshold)

単位はブロック数。 新しいルールが、上記のnMinerConfirmationWindowのうちどれくらいのブロック数で対応していればそのルールが有効になるかを示す変数。 bitcoinはnMinerConfirmationWindowの95%にあたるブロック数が設定されており、Litecoinは75%になっています。


ソースコードの変更作業

本当に流通を考えない限り、ここは特に変えなくても問題ありません。
ただし、実験用途で利用するなら自分だけしかノードがいないので、円滑な実験のためにTestnet/Regtestはうんと数を小さくしておいたほうがいいです。
私はTestnet/Regtestのコンセンサスを以下にしました。

  • nPowTargetTimespan: 5 * 30
  • nPowTargetSpacing: 30
  • nMinerConfirmationWindow: 10
  • nRuleChangeActivationThreshold: 7

コンセンサスの設定は以上です。
次の章では仮想通貨の華である、ウォレットアドレスのプレフィックスを設定します。