【実施例2】
【0031】
本システムはPoWを強化したものでありPoWと同じ技術を用いている。PoSブロックチェーンはピアツーピアネットワークとして構成される。ネットワーク全体は固定トポロジー(fixed topology)無しに緩やかに結合している。あるノードがネットワークに参加するためにはすでに参加しているノードを一つは知っている必要がある。各ノードは無作為に選ばれたいくつかのノードと繋がっている。メッセージはゴシッププロトコル(gossip protocol)によってブロードキャストされる。各ノードはブロックチェーンの全情報のコピーを保持している。本プロトコルではどのノードもジョブを登録し解を受け取ることができる。これはクライアントの観点からみると大変単純でありアルゴリズム1に示される。あるジョブが実行されその結果として支払いが為されるためには少なくとも4ブロックタイムを要する。下記は最速のシナリオでジョブがどのように処理されるかを示す。
【0032】
アルゴリズム1 ジョブ実行をリクエストする。
入力:ジョブ実行リクエスト q
出力:探索によって得られた最も良い解 s
1: q をブロックチェーンに登録する。
2: 解 s が得られるまで待つ。
3: s を返す。
【0033】
あるブロックタイムをブロックタイム0とし、それに続くブロックタイムをブロックタイム1、ブロックタイム2、ブロックタイム3、ブロックタイム4とする。この時、各ブロックタイムにおいて以下のことが為される。
ブロックタイム0においてあるジョブがクライアントによりブロードキャストされる。
ブロックタイム1においてこのジョブの有効性が調べられる。このジョブの料金がクライアントのアカウントから取り出され取り置かれる。このジョブがブロックタイム2で実行されるべく選ばれる。
ブロックタイム2においてこのジョブが実行される。
ブロックタイム3において各ノードはこのジョブについて発見した解のハッシュ値をブロードキャストする。ハッシュ値はブロックチェーンに登録される。
ブロックタイム4においてこのジョブの最良の近似解を発見したノードに料金が支払われる。
ジョブの実行と支払いは全てマイナーにより処理される。マイナーはジョブをパイプラインの方法で処理する。アルゴリズム2はマイナーの観点からジョブがどのように処理されるかを示す。
【0034】
アルゴリズム2 マイニング。
1: 新たなブロックが(他のノードによって)追加されるまで待つ。
2: 以降新たなブロックが追加されたチェーンについて処理を行う。
3: while true do
4: // 次のブロック時間に実行されるジョブに関する処理。
5: 未実行の有効なジョブのリストを作成する。
6: 次のブロック時間に実行されるジョブを選択する。
7: クライアントの口座からこれらのジョブの実行料金を引き落とす。
8: 追加しようとするブロックにこれらのジョブを追加する。
9: // このブロック時間に実行されているジョブに関する処理。
10: 新しいトランザクションを検証し,追加しようとするブロックに追加する。
11: // 2ブロック時間前(上記のブロック時間の前)に実行されたジョブに関する処理。
12: ブロックチェーンに登録された情報(マイナーのIDと解の評価値)を参照し,2ブロック時間前に見つけた解が最も良い解であったか調べる。もしそうであれば,見つけた解をブロックチェーンに追加する。
13: // 3ブロック時間前に実行されたジョブに関する処理
14: ブロックチェーンに登録された解が真正か調べ,そうであれば支払いの手続きを行う。
15: repeat
16: 追加しようとしているブロックにある完了してないジョブのうち一つを選んで,新しいミニブロックを受信する(もしくは規定数のゼロビットで始まるナンスを見つける)まで実行する。
17: (規定数のゼロビットで始まるナンスを見つけた場合には)ハッシュ値をブロックチェーンに登録する。
18: (新しいミニブロックを受信した場合には) アルゴリズム3によりチェーンを検証する。
19: if 新しいミニブロックが有効で,それに対応するチェーンがより長い場合 then
20: 以降そのミニブロックに対応するチェーンに対して処理を行う。
21: 変更後のチェーンに含まれないトランザクションを新規に受信したトランザクションのリストに移動する。
22: end if
23: until 新しいブロックが追加されるまで
24: end while
【0035】
2つのスレッドが並列して走っており、その一つはアルゴリズム2である。もう一つのスレッドでは新しく受信されたアイテムはアイテムリストの最後尾に付加される。ブロックチェーンにアイテムを登録するためには、アイテムはネットワークにブロードキャストされなければならない。マイナーに受信されたアイテムはアイテムリストの末尾に付加される。アルゴリズム2が始まると、マイナーはまず作業するチェーンを選ぶ。(2行目)。有効なチェーンが複数存在し得る。それらは、みな同じブロックから始まっている。ある特定のブロックの並び、あるいはチェーンは、末尾のブロックにより特定される。マイナーは最初に受信されたブロックに伴われたチェーンについて作業を始める。
5行目でクライアントの口座の残高がチェックされる。
8行目で、全てのマイナーが同一のジョブセットで作業するようにするために、どのジョブセットにするかについての合意形成と、ゼロビットの数についての合意形成が作業開始前に為されなければならない。
16行目で、サーチャーが段落0019で説明した実行環境で実行される。サーチャーの一例としてアルゴリズム4でランダムサーチャールゴリズムが示される。段落0014で説明したようにこのサーチャーは内部的に対応するエバリュエーターを呼び出す。エバリュエーターは呼び出される都度自動的にエバリュエーションの結果とナンスを生み出し、そのハッシュ値が要求された数のゼロビットで始まるかどうかをチェックする。もしそうであれば新しいミニブロックがブロードキャストされサーチャーの実行が終了する。サーチャーの実行は新しいミニブロックが他のマイニングノードによって付加された時も終了する。新しいブロックが付加された時そのブロックの最後のミニブロックも付加されることに留意されたい。
18行目で、ミニブロックを伴うチェーンが検証される。このプロセスはアルゴリズム3に示されている。このアルゴリズムは段落0018と段落0020で説明されている通りに作動する。ノードが以前検証したチェーンに含まれていたブロックあるいはミニブロックと厳密に同一のブロックあるいはミニブロックは検証する必要は無い。
21行目ではオーファンブロックに含まれていたアイテムは新たに受信したアイテムのリストに移動する。オーファンブロックとは以前はマイナーが作業していたチェーンの一部であったものが、今はもはやマイナーが別のチェーンで作業しているためチェーンの一部ではなくなっているブロックである。
【0036】
アルゴリズム3 チェーンの検証。
入力:ミニブロック b
出力:b に対応するチェーンを検証し,検証に成功したか否かを返す。
1: for b に対応するチェーンの全てのブロック k を古いものから順に
2: if もし k の検証に前に成功しているなら
3: continue
4: end if
5: k 内のトランザクションを調べ,もし無効なものがあれば false を返す。
6: if k が古いなら then
7: 段落0020で述べた,緩い基準で検証を行い,失敗すれば false を返す。
8: else
9: for kと次のブロックの間の全てのミニブロック m について do
10: if もし m の検証に前に成功しているなら
11: continue
12: end if
13: エバリュエーターを実行し,ナンスと評価値が対応するか調べる。対応しなければ false を返す。
14: end for
15: end if
16: end for
17: true を返す。
【0037】
アルゴリズム4 ランダムサーチ。
入力:追加しようとしているブロックのハッシュ値 h, ノードID id, エバリュエーター ev
出力:探索で見つかった最も良い解
1: bests := null, beste = null
2: repeat
3: 解候補 s をランダムに生成する。
4: e := ev(s, hash(h, id))
5: if e が beste より良い then
6: beste := e, bests := s
7: end if
8: h := hash(h, id, s, e)
9: if h が規定の数のゼロビットで始まる then
10: ミニブロックをブロードキャストする。
11: break
12: end if
13: until 新しいミニブロックを受信するまで
14: [bests, beste] を返す。
【0038】
ユーザーの視点からPoSブロックチェーンがどのように役立つのかを説明する。解決してほしい最適化問題を有するクライアントを想定する。当該クライアントはその問題のためのエバリュエーターとサーチャーを実装しその解の料金を決定する。次いで当該クライアントはエバリュエーターとサーチャーと料金を組み合わせてジョブを作成しこれを登録する(アルゴリズム1)。料金はジョブが登録されたら当該クライアントのアカウントから自動的に引き出される。このジョブに想定される計算量はその料金に比例する。マイナーはこの問題の良い解を見つけるべくブロックチェーンで作業する。発見された解はブロックチェーンに登録される。クライアントは料金と引き換えに最良の近似解を得る。出願人はチェーンに新しいブロックを付加しようと試みているマイナーが常に多数存在していると想定している。今まさに最長チェーンのブロックタイムが開始したとする。チェーンは作業すべき多数のジョブを提供する。マイナーはその中から一つのジョブを選ぶ。もし登録されたジョブが存在しない場合は、PoWに戻りブロックのハッシュ値を要求された数のゼロビットで始まるようにするナンスを発見するための空のジョブが挿入される。マイナーはジョブからサーチャーとエバリュエーターを抽出しサーチャーを実行する。サーチャーの実行においてサーチャーはエバリュエーターを何回も呼びだし多数の解候補を作出して評価する。マイナーは良い解の候補を発見したらこれを後に利用するため保持しておく。マイナーは解候補を評価する都度有効なナンスを作りこのナンスを含むミニブロックのハッシュ値を計算する。もしハッシュ値が要求された数のゼロビットで始まっていればマイナーはこの発見されたナンスを含むミニブロック及び直前のブロックをブロードキャストする。新しいミニブロックを付加することに成功したマイナーはPoWと同じように報酬を受け取る。マイナーは、新しいミニブロックが付加されたことに気づいたら、以降このミニブロックを含むチェーンに対し新しいミニブロックを付加するための作業を始める。これは、ミニフォークを避けるためである。ブロックタイムは全てのミニブロックが付加されるまで続く。ブロックタイムが終了した後マイナーは彼が発見した中の最良の解をブロックチェーンに登録する。ジョブの最良の近似解を見つけたノードがその料金を得る。
【0039】
あるクライアントとマイナーが不正にコインを得るために共謀したとする。このマイナーが新しいブロックを付加するためには要求された数のゼロビットで始まるハッシュ値を与える有効なナンスを発見する必要がある。これは本質的にランダムな解候補を取り上げそのハッシュ値を計算することである。問題と解はここでは問題ではない。それゆえクライアントとマイナーに共謀のメリットはない。他方クライアントはジョブを登録する前にそのジョブの計算をし、その解を共謀相手のマイナーに教えることができる。しかし結果としての報酬はそのクライアントが共謀相手に支払うことになるのでメリットはない。クライアントが共謀相手にコインを送ればよいので、これは暗号通貨の通常のトランザクションである。
【0040】
コインの流れとインセンティブの概要は以下のとおりである。ジョブの最良の近似解を発見することのインセンティブとしては、各クライアントはジョブを登録するときに料金を支払う。この料金は登録時に自動的に引き抜かれジョブが完遂されるまでシステムが保持している。登録されたジョブはマイナーによって実行される。ジョブの実行後、システムは各ジョブについてどのマイナーが最良の近似解を発見したかを知る。システムは最良の近似解を発見したマイナーのアカウントに料金を支払う。
新しいミニブロックを付加することに対するインセンティブは以下のとおりである。システムは各ミニブロックのハッシュ値先頭部のゼロビットの数をジョブの料金に応じて決定する(段落0018)。ブロックタイムが始まったら各マイナーは作業するミニブロックを選び対応するサーチャーを実行する。サーチャーの実行において多数のナンスが生成される。ナンスが生成される都度マイナーはそのナンスを含むミニブロックのハッシュ値が要求された数のゼロビットで始まるかをチェックする。要求された数のゼロビットで始まるハッシュ値を与えるナンスを得たマイナーは新しいミニブロックの付加に成功し報酬を受け取る。この報酬の額は要求されたゼロビットの数に応じて決められる(段落0018)。