Truthcoin(現在の名称はHivemind)はビットコインのサイドチェーン上に予測市場を作るプロジェクトである。
パブリックブロックチェーン上に予測市場を作るプロジェクトには他にGNOSISとAugurがあり、これらはいずれもBitcoinではなくEthereumのブロックチェーンを使用している。
分散予測市場においては「誰が答えの正しさを保証するのか」という点が問題だが、上の2つは(少なくともその一部を)ブロックチェーン外部のオラクルに頼る方針であるのに対し、Truthcoinでは全てブロックチェーン内で完結させる点に違いがある。
これは「外部オラクルはIncentive Compatibleではない」という作者の主張に基づいている。
どこまで現実的な主張であるかはまだ確信が持てない
そのため、TruthcoinではCashcoin(CSH)とVoteCoin(VTC)という2つのコインを使用する。
CSHはBitcoinと1:1で交換可能な通貨で、所持することによりTruthcoin特有の機能、例えばPredictoin Market(PM)の作成、PMのシェアの売買などを行えるようになる。
VTCは「評判」を表すもので、Truthcoin特有の発明である。 評判を交換可能なものとすることで様々なメリットがある。
Truthcoinはある種の「オラクルコーポレーション」であるサブセクション にわけられ、これを「ブランチ」と呼ぶ。 それぞれのブランチは固有のVotecoinの集合を持ち、ブランチ内での保有VTCはブランチの収益の分配に使用される。
価値の保存という機能においては、VTCはBTC・CSHには劣る。というのも常に投票に参加し続けていないと原価していくためである。 イメージとしては従業員IDに近い。
「投票トランザクション」と「移譲(送金)トランザクション」を分ける。 投票と送金を同時に行うことができない(送金を行えるのは投票と投票の間のフェーズに限る)ことで、間違った投票をしつつ(VTCの価格が下がる前に)売り抜ける、ということができないようになっている。 SVDに対するスパムを防ぐため、全部で10000アドレスに限定
また、プロトコルは以下の役割を持つ。
予測市場はDecision(投票対象)の提起とそれに付随するマーケットの設定により行われ、これを行うものをその市場のAuthorと呼ぶ すべての予測市場は単一のブランチに属す。
a. だれでも自由にあらゆるマーケットを作り、そのAuthorになることができる。 b. Authorは、アウトカムが特定の日付までに誰の目にも明らかな形で開示されるようなマーケットだけを作成するようなインセンティブを持つ。 c. Authorは、十分な流通量が見込める(異なる見解が社会に存在し、したがってPMを作るメリットが見込める)マーケットのみを作成するインセンティブがある。 d. マーケットの開示当初から高い流動性を持つことが見込めるものを作製するインセンティブがある。 e. トレーダーに自身が信用に値することを証明する必要がない(自動で証明される。 )。
a. 投票者は、自身の所属するブランチ(サブマーケットのこと。例えば「スポーツ」「サイエンス」「政治」など)における、ネットワークの長期的信頼を保つインセンティブがある。 b. 投票者はすべての意思決定に投票するインセンティブがある。 c. 投票者は他の投票者が投票すると思われる内容に自分も投票するインセンティブがある。
通常の予測市場においてベッティングする人と全く同様。異なる点は
a. カウンターパーティリスク(胴元の不正、オッズ比の操作、マーケットの内容の検閲、など)がない b. 代わりにブロックチェーンとその運用プロトコルを信用しなくてはならない。
a. ビットコインのサイドチェーンとして、merged miningを行うため、マイニングの限界費用はゼロである。 したがってマイナーは常にブロックをマイニングする動機を持つ。 ビットコインが消えた場合も、そのままTruthcoinのマイナーになれるため、マイニングをやめる動機にはならない。
Voteをする際のトランザクションはBallotと呼ばれる。
投票対象となる命題をDecisionと呼び、以下の2種類がある。
また、マーケットは2次元以上のDecisionを持つことができる。例えば
投票対象 | 2016年のアメリカ大統領選挙は選挙はヒラリー・クリントンが勝利する | しない |
---|---|---|
2020年末のアメリカのGDPは2016年末よりも上 | ||
下 |
これにより、参加者の多様な信念を吸収することができる。これを多次元予測市場(Multidemensional Prediction Market)と呼び、Truthcoin独自の機能である。 また、次元を「チェイン」させることで、任意のパラメトリックな確率分布を表現できるため、たとえばハザードモデルなどを使用した生存時間予測なども可能
こちらの補講に詳しい。
これらの機能を用いて複雑なマーケットを作成したとしても、投票時には独立に投票を受けるため(多分)、後述のSVDには影響しない
Decisionは大雑把に以下の流れをたどる
作成 -> トレード -> Ballotのハッシュを提出 -> 投票結果の開示 -> SVDとRBCR(以下参照) -> 再分配
いったんBallotのハッシュを提出させることで、おたがいの投票内容を独立させる(投票者が他人の投票内容を参考にするということがないことを保証する)ことができる。
import numpy as np
import scipy as sp
import pandas as pd
# 初期値
# n*m vote matrix,
N = 5 # number of voters
M = 6 # number of decisions
RV = np.linspace(0,1,num=N).reshape(N,1) # initial Reputation Vector for each Voter
print(RV)
d1 = np.random.binomial(1, 0.9, N) # Non-Contraversial Binary Decision
d2 = np.random.binomial(1, 0.55, N) # Contraversial Binary Decision
# c3 = np.ndarray([np.NaN for i in c1 if np.random.random() < 0.1])
d3 = np.random.normal(200, 50, N) # Scalar Decision
# Contraversial Scalar Decision
d4_1 = np.random.normal(100, 20, N - 2)
d4_2 = np.random.normal(260, 40, 2)
d4 = np.append(d4_1, d4_2)
d5 = np.random.binomial(1, 0.9, N)
d6 = np.random.binomial(1, 0.55, N)
# Current Balance ... 現時点でのVTCの保有量、投票の「量」はこれに比例する。
CB = np.random.exponential(scale=1.0, size=N)
VM = np.c_[d1, d2, d3, d4, d5, d6]
print(VM, "\n") # 正規化前
VM = (VM / np.max(VM.T, axis=1).T) # Scalar値でも、投票範囲が[0,1]になるよう正規化
print(VM)
$n*m$ の投票行列に対してSVDを行う。
これにより、投票者に協調させるようなインセンティブを与える仕組みをOperationalized Coordination by Singular Value Decomposition(特異値分解による操作的協調)と呼び、Truthcoinに特有の仕組みである。 具体的には以下の手順で行う。
特異値分解は欠損値を扱えないので、以下の手順で埋める。(Appendix 1を参照)
協調を測るために、重み付きPCAの第一主成分(重みはその人の持つVTCの総量=Reputation Vector)を見る。この列はある投票者が架空の「代表的投票者」からどれだけ離れているかの指標になる。
VM_weighted = VM * CB[:, np.newaxis]
# since the demension of return value for `cov` function is adjusted to row.
if M > N:
Gamma = np.cov(VM_weighted.T)
else:
Gamma = np.cov(VM_weighted)
U, Sigma, V = np.linalg.svd(Gamma)
すべてのDecisionに関して平均が0になるようにする。
mu = np.ones([N, M]).dot(np.diag(VM.mean(axis=0)))
VM_normed = VM - mu
c = VM_normed.dot(U[:,0:1])
c
その後、$c$にscalarを足し、最も外れた値がゼロになるようにする。 これにより、最も他と異なる値を報告した投票者が強い罰則を受けるように保証する。 最小の値を足す場合、最大の値を引く場合の二通りがある。(特異値分解に2通りの解があることに起因する)片方は「正解」ベクトルで、もう片方は「正解の反対」ベクトルである。 まずは2通りで計算を行い、その後に選ぶ
# honesty vector
c_adj1 = abs(c - (np.ones([N, 1]) * ( min(c)) ) )
c_adj2 = abs(c - (np.ones([N, 1]) * ( max(c)) ) )
print(c_adj1, "\n",(c_adj1.T * CB).T)
このベクトルは、「最も逸脱した投票者からの距離」を表しているため、システムを攻撃したい主体は自身を二人の投票者に分けることで、最大の値を取得することができる。これは
ため、大きな問題となるものではないが、以下のような操作を行うことで、簡単に回避することができる。
def adjust(c):
m = np.median((c.T * CB).T) # 重み付きmedian
res = np.where(c <= m, c, c - (0.5 * m))
return res
c_adj1_2 = adjust(c_adj1)
c_adj2_2 = adjust(c_adj2)
0.5倍しているのはより「逸脱していない側」に入るインセンティブを維持させるため。
先ほど後回しにした、「2つのベクトルの内どちらが正解のものか選ぶ」作業を行う。 「絶対に正解とわかる」投票が複数あれば問題は解決するので、大きな問題ではない。(人が目で見ればすぐわかる)例えば以下の解決策が考えられる。
ここでは仮にc_adj1_2
が選ばれたものとする。
def stochastic_vectorize(x, axis=None):
return np.abs(x) / np.abs(x).sum(axis=axis)
# update Reputation Vector
RV = stochastic_vectorize(c_adj1_2 * RV / RV.mean())
# 投票の判定
Outcome = stochastic_vectorize(RV.T.dot(VM))
print(Outcome)
投票の結果に応じて、Branch内のVoteCoinを再分配する。
Ballotには公開鍵が含まれているので、再分配ごとに新しいアドレスを指定できる。
各アカウントについて、前回のReputationベクトルと新しいReputationベクトルの値でスムージングする。 スムージングパラメータ$\alpha$を与える。例えば$\alpha = 0.20$の場合、前回までの評判の寄与率を0.8にする。 これにより、継続して誠実な投票を行うインセンティブが生まれる。
RBCRを行うことで、投票者はCSH(つまりBTC)の形で収益を得られる。元となるのは
(手数料の詳細設定は後述)
投票者が結託して誤った結果に投票すること(double-agent incentive)を防ぐため、Truthcoinでは投票者同士が互いに嘘をつくようなインセンティブを与える。(したがって投票者は「どこに投票しようとしているか」という情報の漏洩を防ごうとする) これをactive-coordinationと呼ぶ。
個人的に要検証
一度協調ゲームが成立してしまうと、常に正解票だけを投じ続けるのが投票者にとって最善の選択肢となる。
VoteCoin自体も自由市場で売買されるため、プロジェクトに参加する主体が意欲を失うことはない。
ビットコインに対する51%攻撃と同様、一人の投票者が多量のVTC(具体的には($1-\phi = $)35%になるように設定する。Appendix 3を参照)を取得することで結果を操作することは理論上可能ではある。しかし、ここでのミソは「一人」で持たなくてはならない、という点にある。なぜかというと誰がどれだけVTCを持っているのかわからない(義匿名性)」が成立しているため、複数の主体が協力しようとしても裏切るインセンティブが働くからである。 また、一人で行った場合、そのブランチの「信用」すなわちマーケットキャピタルが大きく下がるため、成功しても得るものは少ない
a. まず、Ballotから代表的なものが5つ選ばれ、VTCではなくCSHによる投票が行われる。 詳細は省くが、つまりこれはHivemindの全参加者による投票という意味なので、「Hivemind自体を潰したい」という動機を持つサードパーティ出ない限り、ここから利益を得ることはできない(上訴の仕組みに似ている)
つまり攻撃者のグループは1. どのマーケットを攻撃するか 2. アウトカムはどのようにすべきかを予め決めなくてはならないが、これは攻撃者の一部が、そのDecisionにCSHを大量に賭けるインセンティブを与える。すると今度は他の攻撃者が「攻撃しない」インセンティブを獲得することになる。
VTCの価格の低下というデメリットがあるとはいえ、原理上一度に大量の収益を得てドロンする(exit scam)ことができなくはない。そのような場合、最終的な決断はマイナーに委ねられ、攻撃を防ぐか、攻撃自体をなかったことにできる。(Appendices 3, 7,8参照)。したがって攻撃に成功しても利益はマイナスとなる。このようなマイナーによる罰則が抑止力として働くため、実際に不正を行うものはいないことが予想できる。 また、マイナーが自体の不正は
この図がわかりやすい。攻撃者が利益を得るのは右上だけだが、マイナーによって封じられる。
Drivechainの説明を見たほうがわかりやすい。
マイナーに「同じ機能をもつサイドチェーンを自由に作らせない」ようにサイドチェーンのプロトコルを作る。 という点がミソ。
マーケットの作成は2段階で行われる。これらは別々のAuthorによって行われてもよく、その場合それぞれDecision Author(DA), Market Author(MA)と呼ばれる。
Feeは定額とする。Feeの決め方はAppendix 4を参照
Nをマーケットが持つパラメータ(次元)の数とする 大量のマーケット作成によるスパム防止のため、以下の2種類のFeeを設定する。
bはAuthorが設定するマーケットの「流動性」パラメータで、Beta Amplificationと呼ばれる。別のNoteに詳しく書いた
これにはマーケット開始時の流動性の担保の役割がある。(「誰も最初に賭ける人物になりたがらない」という問題を防ぐ)
大勢のトレーダーが参加すると期待される場合には低いbを、少ないと期待される場合は大きいbを設定する。
これはパラメータが多すぎるマーケットに対する罰則のために存在する。 著者いわく必須ではない。単に$N>256$をbanするだけでも十分機能する。
Decisionにスカラー値がある場合、投票結果が境界部分(最大、最小)出ない部分のみrefundすることで、適切な境界条件を設定するインセンティブがあるらしいが、この点はよくわからない。
上記に加えてAuthorはトレーディング手数料(例えば0.1%)を設定できる。高すぎると(別の誰かMarketを作りなおすことで)作成時に投資したBondを失う可能性があるが、低すぎると収益が得られない。
全手数料の内50%は投票者の、25%はDAとMAの収益となる。
したがってAuthorは起業家のような性質を持つと言える。
ビットコインと予測市場の大まかな仕組みを知っていれば奇妙なところはないので省略。
先述のコスト関数(LMSR)の計算などはAutomated Market Makerが行う。これはフルノードを保持したサービスで、EthereumにおいてEVMが走るノードと似たようなものだと思えば良い。計算はブロックチェーンの内容から決定論的に導出できるので、ユーザーがこのサービスを信用できない場合は自分でノードを持つことができる。したがってマーケットの状態について嘘をつくことができない。
Truthcoin内におけるブランチは投票者の分割のために働く。 例えば、ある投票者は政治的なことに興味が有り、その事実判定は喜んで行うかもしれないが、スポーツの結果については興味がないということがあり得るかもしれない。
そこで、ビットコインにおけるフォークのように、ブランチをフォークさせることができる。パブリックブロックチェーン上でのフォークの場合、いずれが正当なチェーンであるかの合意が取れないといった問題やダブルスペンドなどの望ましくない性質があるが、VTCの場合、収入は長期的なものでトレーダーの流通量に依存するので大きな問題はない。
したがって(ブロックチェーンそのもののフォークとは別に)ブランチをフォークさせてVTCの量を倍にすることができる仕組みをとる。
とはいえブランチ作成の限界費用が0というのはスパミングなどの観点から望ましくないので、ブランチの作成権は、フォーク元のVTCの所有者に委ねられる。
3回の投票期間にわたってAuthorが現れなかった場合、ブランチは自動消滅する。
ビットコインの10分に一ブロックというのでも十分動作はするが、トレーダー間の競争を健全なものにするには出来る限りブロックインターバルを小さくしたほうが良い。GHOSTなどの実装が待たれる。
また、予測市場における売買はその順番によって利益が変わるため、一般に売買の履歴が一意に定まることを前提としている。
したがって
のいずれかを用いる方法がある。 しかしこれは他人のトランザクションを見てから、同じ内容を先にブロックチェーンに含ませることで利益を得る(Front-Running)問題を引き起こす。 これは考慮すべき変数が多すぎてどれだけ実際に問題になるかはわからないが、 他人のトランザクションが「良い」取引であるかどうかを確認するのが難しいので、大きな問題にならない可能性もある。
AugurのようにLS-LMSRのような仕組みを使うかの検討
マーケット開始時に$b_1$から$b_2$へ流動性パラメータを変更する場合、追加コストは$(b_2 - b_1) * log(N)$となる、過去のテストから、これはトレーディング開始後に行ってもトレーダーへの不利益はないことが判明している。 したがって、「取引はしたくないが真実を知りたい」という人がマーケットに寄付を行うことで流動性を高めることは十分に可能である。
すべてのトレーダーに少しずつ課金して流動性を確保するため、はじめに参画したトレーダーよりも後に参加したトレーダーを有利にする点にある。 基本的に、早く市場に参入することにはメリットがなくてはならない。なぜかというと、その後市場が大きくなりバズれば、情報を手に入れるコストは下がり、正しい内容に賭けるのが楽になるため、リスクが少ないからである。
と、メリットのほうが多いので、後々は多分LS-LMSRになる。
まず、マーケット作成時には絶対に上限と下限を設定する必要がある。なぜかというとそうしなければトレードもSVDも不可能であるため。
よくわからんが、そうらしい。
さらに、Decisionの幅を変更するとさらに面倒になる。仮にTechnical Minimumを0に設定すると、使用されない流動性を置くことになり、LMSRまたはLS-LMSRの利点を損なうことになる。