IOTA:【入門】Qubicの要点をまとめてみた。


 公式によって出されたQubic: Quorum-based Computationsはさっくり読むには長すぎる。本記事を読んでから原記事を読むと理解が早くなるように体系的に要点を並べてみた。

Qubicの狙い

 余剰計算力の共有経済を実現する、スケーラブル可能な分散型非中央集権プロトコルの提供。

Qubic プロトコルとは

 IOTAの分散型台帳Tangleの上で、簡単に言えば、スマートコントラクトなるものを実現するためのプロトコル。仮想通貨ではない。

新用語のリスト

用語 意味 解釈
Qubic スマートコントラクトが書かれたプログラムそのもの。
Abra 3進数用のプログラミング言語。Qubicを書くのに使われる。
Oracle Qubicの実行環境。Tangleの外。 マイナー*
Oracle Machine Oracleが動いているマシーン。 コンピューター。JINN?
Qノード Oracleを備えたIOTAフルノード
Assembly Oracleのグループ。同一Assembly内の全てのOracleは同一Qubicを実行する。 マイニングプール*
Quorum Assemblyの実行結果の多数決で決まるコンセンサス。
Epoch Assemblyの周期。 任期
Quant Qubicコードの複雑性。計算処理数。

* ざっくりした例えなので今はこう思っておけばいい程度に留めて欲しい。

新用語の解説

QubicとAbra

 QubicというのはQubicプロトコル上における、スマートコントラクトなどが書かれたプログラム・ソフトウェアを指す。また、それらは3進数プロセッサー用に設計される中間言語「Abra」で書かれる。Qubicはイベント駆動型のため、複数のQubicでアウトプットのバケツリレーをして連鎖的にアプリケーションを動かすようなこともできる。

OracleとAssembly

 Oracleというのはマイナー、そしてAssemblyというのはマイニングプールとまず考える。Oracleを走らせるIOTAフルノードのことを特にQノードと呼ぶ。
 OracleというのはQubicの実行環境。Oracleが複数集まってAssemblyが構成される。
 Assemblyのポイントとしては

  1. 誰でも参加できる公開Assemblyと、許可したOracleしか参加できない私用Assembly。の2つがある。
  2. Assemblyは1つでも2つでも複数のOracleからでも構築可能。

 Assemblyごとに実行されるプログラム(=Qubic)は異なり、期間(=Epoch)内に得られたAssembly内の全実行結果で多数決を取り、一定数以上によるコンセンサス(=Quorum)が得られた結果がAssemblyの最終アウトプットとなる。
 言い換えると、同一Assembly内のOracleたちは同じQubicを同時に実行し、Epoch最後の多数決でreturnされる最終結果を決める。
 Qubic所有者がどこのAssemblyにプログラムを実行してもらうかを決める。手数料・信頼度などが判断材料となる。

 Assemblyごとに見ると違うことをやっているが、全体としてみると全てTangleの上で起こっている。

 最初の例え、Oracleはマイナー、Assemblyはマイニングプールというのは厳密には正しくないことが理解できただろうか。

Epoch(周期)

 Assemblyごとに、Epoch(周期)という秒を単位とする期間でそのライフサイクルを区切ることができる。開始時間と以下の実行段階の終了時間に挟まれた期間のことである。

  1. Resource Test Phase(PoR段階):Assemblyに参加するOracleがリソース量をAssembly所有者に証明する(PoR=Proof of Resource)。リソース量はPoW、PoS、帯域幅など、Assembly所有者が設定できる。

  2. Processing Phase(実行段階):PoR段階を通ったOracleが、Assemblyに任せられたQubicを実際に実行する段階。

Resource Test Phase - PoR段階

 好みのリソース量測定方法で、Assemblyに申請してきた不特定多数のOracleの適性を測る。その成績は投票力と手数料の取り分を計算するのに使われる。
 提出された全員のリソース量から個別の貢献度(=Weighning Factor)を計算して、それに比例する分(=Stake)の投票力手数料がEpoch終了後に与えられる。

Processing Phase - 実行段階

 実際にQubicを走らせる期間。Classroom Attack(カンニング攻撃)(=先に処理を終わらせた他のOracleのアウトプットをカンニングすること。)を防ぐために個々のOracleは2つに分けてアウトプットを提出する。

  1. Commit Transactionsalt(=乱数)hash(result)hash(result+salt)署名を提出する。
  2. Reveal Transactionresultの実数値を提出する。

 2/3のOracleがCommit Transactionを発行し、同じhash(result)が得られれば、Reveal Transaction発行を要求する。その実数値とsaltのハッシュがCommit Transactionのhash(result+salt)に一致したOracleに報酬が支払われる。最後にスナップショットを取ってEpochが終了する。終了後は以前のEpochの情報を引き継いでPoR段階から再スタートする。

Quantと手数料・報酬

 QuantというのはQubicコードの実行に含まれる処理数のことだ。Ethereumもコードの複雑性に比例して手数料が高くなるように、Qubicも大きな計算や処理を含んでいるほどQuantが高くなり、その手数料は高くなる。
 また、Oracle所有者目線での報酬の話をすると、PoR段階で提出したWeighing Factorが大きいほど報酬の取り分は大きくなる。同じ仕事量だからといって、Assemblyの皆が同じ報酬を貰えるわけではない。

報酬 = w*q

 ※ w: Weighing Factor、q: Qubicのquant とする。

 この条件下での経済人による合理的な行動選択の結果、以下のような均衡が生まれる。

  1. 強力なOracleマシーンが小さな複数のOracleに化けることの無効化。
  2. Assembly内は同じくらいのリソース量を持つOracleが集まる。

 (1)について。もし報酬が皆同じだと、他より10倍強力なデバイスで報酬1つもらうより、そのデバイスでOracleを10個走らせて報酬10個もらう方が得になってしまう。すると支配力=デバイスのパワーの構図ができてしまう。
 (2)について。強力なデバイスはすぐにQubicの処理を終わらせるが、Epochの終了まで報酬を受け取るのを待たなければならず、時給換算すると損をする。一番得するためには、自分の処理が終わるとほぼ同時くらいにEpochが終了して、なるべくEpoch終了までの待機時間を短くすることが求められる。つまり、参加者が皆同じくらいのスペック(=PoR段階で提出するリソース量)を持つAssemblyに参加することが合理的な選択となる。よってAssembly内の計算力の一極集中による中央集権化が防がれる。

 このような設計によって計算力の共有経済が実現される。小さなデバイス(スマホなど)でも使っていない時間には軽いQubicを走らせて小遣い稼ぎをしたり、大きなサーバーセンターなどは大きなQubicを走らせ、相応な対価を稼ぐこともできる。

色々なエッジケース

  1. Epochの途中で問題が発生した場合、Adjustment Transactionの発行によってQubicやStakeの修正が可能。発行の是非は投票によって決議される。
  2. 私用Assemblyの場合はPoR段階を飛ばしていきなり実行段階に移れる。PoR段階はあくまで不特定多数のOracleで分散的なQuorum Computingを実現したいときのみ。
  3. Tangleのタイムスタンプについては「Description of the problem and proposed algorithms」の論文で詳しく言及。
  4. Abraでは無限ループを禁止している。つまり、Epoch内ではチューリーング不完全。長くなる処理はEpochを跨ぐように設計する。

参考文献

Qubic: Quorum-based Computationshttps://qubic.iota.org/

最後に

 今回発表されたQubicもまだコンセプト段階のため、これから具体的になっていくにつれてこの記事が役に立たなくなっていくはずだ。そういう意味も含めて、追記や編集を重ねていく前提で記事を読んでいただければ幸いだ。