情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Nxtのホワイトペーパーの翻訳 #1

Nxtのホワイトペーパーの一部を翻訳しました。
http://wiki.nxtcrypto.org/wiki/Whitepaper:Nxt

ブロック
他の暗号通貨と同様に、Nxtの取引は連結された一連のブロック、すなわち、ブロックチェーンの中に格納され、これがNxtの取引の元帳となる。この元帳が発生した取引の永続的な記録となり、また、発生した取引の順序を決定する。ブロックチェーンはNxtネットワークのノードが保持し、ノードにおいて(口座の秘密鍵を与えることによって)解錠された口座はブロックを生成することができる。ただし、その口座は受け取った取引の中で少なくとも1つが1440以上の確証度(cofirmation)を得ていなければならない。この基準を満たしている口座を活動的な口座(active account)と言う。
Nxtにおいては、ブロックは最大でも255個までの取引しか格納できない。また、192バイトの頭部(header)を有し、ブロックを識別するための情報を含んでいる。ブロックの大きさは最大で32キロバイトとなる。ブロックは次のような情報を含んでいる。
・ブロックのバージョン。ブロックの高さ。ブロックの識別子。
・ブロックの時刻印。これは起源ブロックからの秒数で表される。
・ブロックを生成した口座の識別子及び公開鍵。
・親ブロックの識別子と要約値。ブロックに格納されている取引の数。
・ブロックに格納されている取引の額面の合計。
・ブロックに格納されている取引のデータ。取引の識別子を含む。
・ブロックのペイロードの長さ。ブロックのペイロードの要約値。
・ブロックの生成署名(generation signature)。
・ブロック全体の署名。
・ブロックの基底目標値(base target value)及び累積難易度(cumulative difficulty)。

ブロックの生成(forging)
どの口座がブロックを生成する資格を有するか、どの口座がブロックを生成する権利を獲得するか、そして、衝突が発生した場合にどのブロックが正当なものとして選ばれるかを決定するために次の3つの値が重要である。
・基底目標値
・目標値
・累積難易度

基底目標値
ブロックを生成する権利を獲得するために、活動的な口座は所与の基底目標値より小さい要約値を生成しようとする(訳注:基底目標値ではなく、目標値の間違いであると思われる。活動的な口座は所与の目標値より小さい要約値を生成しようとする)。この基底目標値はブロック毎に異なり、親ブロックの基底目標値にそのブロックを生成するのに要した時間を掛けたものである(訳注:ここではこのように書かれているが、実際はブロックを生成するのに要した時間ではなく、ブロックを生成するのに要した時間を仕様上のブロック生成間隔と比べた割合であると思われる。たとえば、Nxtのブロック生成間隔は60秒だが、実際のブロックを生成するのに要した時間が45秒であった場合、割合は0.75となる)。

目標値
目標値は口座の現在の実効的な残高(effective balance)に基づいて次のように計算される。

T = Tb * S * Be

Tが目標値である。
Tbは基底目標値である。
Sは親ブロックが生成されてから経過した秒数である。
Beは口座の実効的な残高である。

この計算式から分かるように、目標値は親ブロックの時刻印の時刻から1秒毎に大きくなる。最大の目標値は1.53722867 x 10^17であり、最小の目標値は親ブロックの基底目標値の半分である。
この目標値と基底目標値は特定の高さのブロックを生成しようとする全ての口座で同じものである。口座毎に決まる唯一の値は口座の実効的な残高である(訳注:前の文と後の文が矛盾しているように思われるが、後の文が正しいと思われる)。

累積難易度
累積難易度は基底目標値から次のように計算される。

Dcb = Dpb + 2^64 / Tb

Dcbが現在のブロックの累積難易度である。
Dpbは親ブロックの累積難易度である。
Tbは現在のブロックの基底目標値である。

生成アルゴリズム
ブロックには生成署名という情報が含まれている。ブロック生成に参加するために、活動的な口座は自身の公開鍵で親ブロックの生成署名を署名する(訳注:公開鍵ではなく、秘密鍵ではないだろうか)。作成された64バイトの署名からSHA256により要約値を計算する。この要約値の先頭8バイトを口座の当たりくじ(hit)とする(訳注:当たりくじと呼ばれているにもかかわらず、この時点ではまだ「当たり」かどうかは確定していない)。
当たりくじの値は現在の目標値と比較され、当たりくじの値の方が目標値より小さい場合には、親ブロックの次のブロックを生成することができる。目標値の項で書いたように、目標値は親ブロックの時刻印の時刻から1秒毎に大きくなる。ネットワークに活動的な口座がほんの少ししかない場合であっても、時間が経過すれば目標値は非常に大きくなるので、最終的には何れかの口座がブロックを生成できるようになる。このことから分かるのは、任意の口座の当たりくじの値と目標値を比較すれば、その口座がブロックを生成できるようになるまでに要する時間を推定できるということである。
これは重要な点である。どのノードでもあらゆる活動的な口座の実効的な残高を調べることができ、全ての口座の当たりくじの値を計算することもできる。これはどのノードでもまあまあの精度でどの口座が次にブロックを生成する権利を獲得するか予測できるということを意味する。そのため、次にブロックを生成する権利を獲得する口座に残高を移動する攻撃を仕掛けることができる。これを移し替え攻撃(shuffling attack)と言う。そのため、Nxtでは残高がブロック生成に貢献できるようになるためには1440ブロックそのままで待たなければならないようになっている(これが口座の実効的な残高である)。興味深いことに、次のブロックの基底目標値を十分な精度で予測することはできない。そのため、次のブロックをどの口座が生成するか決定する近決定論的な過程はより将来のブロックに関して予測しようとすればするほど確率論的になる。Nxtのブロック生成のこの特徴が透過的なブロック生成アルゴリズム(transparent forging algorithm)の開発と実装の基礎を形成するのに役立つ。このアルゴリズムはまだ完全に実装されておらず、Nxtネットワークにおいてこのアルゴリズムが与えるであろう影響は大きいため、これに関しては別の文書において概説されることになるだろう。
Nxtのブロック生成に係る数学的あるいは確率的な詳細な分析に関してはmthclsのThe math of Nxt forgingという論文を参照してほしい。
活動的な口座がブロックを生成する権利を獲得した場合には、新しいブロックに最大で255個のまだブロックに格納されていない取引を格納し、ブロックの頭部に必要な全ての情報を格納する。このブロックはブロックチェーンを構成するブロックの候補としてネットワークに送信される。
ペイロードの値や生成口座やブロックの全ての署名はネットワークでブロックを受け取った全てのノードが検証する。同じ高さの複数のブロックが生成された場合には、ノードは最も高い累積難易度を有するブロックを正当なブロックとして選択する。ブロックのデータはピアの間で共有されるため、分岐が検出されたら累積難易度が低い方が取り除かれる。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-暗号通貨