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

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

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

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

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

## OracleとAssembly
　**Oracle**というのはマイナー、そして**Assembly**というのはマイニングプールとまず考える。Oracleを走らせるIOTAフルノードのことを特に**Qノード**と呼ぶ。
　OracleというのはQubicの実行環境。Oracleが複数集まってAssemblyが構成される。
　Assemblyのポイントとしては
> 1. 誰でも参加できる**公開Assembly**と、許可したOracleしか参加できない**私用Assembly**。の２つがある。
> 2. Assemblyは１つでも２つでも複数のOracleからでも構築可能。

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

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

![qubic-Page-1.png](https://qiita-image-store.s3.amazonaws.com/0/187795/db57746e-4067-090d-9d79-b23ac1fdf13b.png)

　最初の例え、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は２つに分けてアウトプットを提出する。
> 1. **Commit Transaction**：`salt(＝乱数)`、`hash(result)`、`hash(result+salt)`、`署名`を提出する。
> 2. **Reveal Transaction**：`result`の実数値を提出する。

　**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の皆が同じ報酬を貰えるわけではない。


```math
報酬 = w*q
```
　※ **w**: Weighing Factor、**q**: Qubicのquant　とする。

　この条件下での経済人による合理的な行動選択の結果、以下のような均衡が生まれる。
> 1. 強力なOracleマシーンが小さな複数のOracleに化けることの無効化。
> 2. Assembly内は同じくらいのリソース量を持つOracleが集まる。

　（1）について。もし報酬が皆同じだと、他より10倍強力なデバイスで報酬１つもらうより、そのデバイスで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](https://assets.ctfassets.net/r1dr6vzfxhev/4iQXZ7bZGwSsE26SkqOQao/2ebf046578dabec5c1d3c48ed442c86f/On_timestamps_in_the_Tangle.pdf)」の論文で詳しく言及。
> 4. Abraでは無限ループを禁止している。つまり、Epoch内ではチューリーング不完全。長くなる処理はEpochを跨ぐように設計する。


# 参考文献
**Qubic: Quorum-based Computations**： https://qubic.iota.org/

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