ALISのインセンティブ設計を考える : 記事の評価者の場合

ALISはブロックチェーンを使ったソーシャルメディアサービスです。
alismedia.jp


記事の作成者と記事の評価下の2つの視点で、ALISのトークンエコノミーのインセンティブ設計を考えます。
ホワイトペーパーhttps://alisproject.github.io/whitepaper/whitepaper_v1.01_ja.pdf

ユーザからみて、「どうしたらALISトークンを効率よく増やせるか」という視点でインセンティブ設計を整理します。

記事の評価者の場合

結論

  • 5分以内に複数の記事を評価しないこと
  • 将来いいねを集めそうな記事に対しては早くいいねをすること
  • アリストークンを多く持つこと

が重要になります。

説明
alisのホワイトペーパーには、記事の評価者がもらえるトークン数をBi(評価者ポイント)で説明しています。

f:id:tahtan:20180727182006p:plain

パラメータの意味は以下の通りです。
α:評価を行ったユーザが5分以内に別の記事を評価していた場合0、そうでない場合1

つまり、5分以内に複数の記事を評価するとBiの値は0になります。




n:記事が報酬を承認されるまでに評価を行った総ユーザ数
xi:当該記事を評価したユーザの中で、何番目の評価者か

つまり、(-1/n xi + 1)は
多くの人が評価すればするほどBの値は大きくなり、
その中でも評価する順番が早いほどBの値は大きくなります。




Valid ALIS tokens owned by the owner / ALL valid ALIS tokens
総ALIS トークン量に対する、評価者のALISトーク保有量です。

つまり、ALISトークンを多く保有すればするほど、Bの値は大きくなります。



整理すると、
「5分以内に複数の記事を評価しないという条件のもと、
より多くのALISトークンを保有し、
より多くの人に評価される記事を早く評価するとポイントが多くもらえる」

ということになります。


しかし、Bの値だけのトークン量を評価者はもらえるわけではありません。



獲得トークン量の計算
獲得トークン量 = (自分の評価者ポイント(B) ÷ 総評価者ポイント) x 新規発行分ALIS x 0.1

0.1 という数字は、新規発行分の中で配布する割合が、記事を書く人に対して90%、評価者用に1%が割り当てられる設計をしているということです。

結局、B値は総評価ポイントとの割合で計算されます。
獲得トークン量は、「自分の評価ポイントが全ユーザの総評価ポイントと比較してどれくらい持っているか」
によって確定されます。



配布ロジックの今後の変更の可能性について

ホワイトペーパーには以下のような記述もあります。

我々はインフレ分の ALIS トークンのうち、90%を作成者、10%を評価者に配布するロジックを設定する

これは、初期においては記事の量が集まることが重要であると考えているからである。しかしながら、記事の量が集まった次に重要な指標は記事の評価に徐々に変わっていくだろう。その場合には評価者への配布量を増やすべきであると考える。


つまり先ほどに獲得トークン量の計算で出てきた、「0.1」という数字が変更される可能性があるということです。

当然のことです。

初期は記事の「数」自体がプラットフォームの価値に大きく影響すると考えられ、一方で時間が経つにつれて重要度は「質」を決める評価者に寄ってくると考えられるからです。


このようなインセンティブ設計の変更を踏まえると、
将来的にALISで記事を書こうとしているユーザは、他の人が書いた記事を評価するよりも今すぐ記事を書いた方が、オトクになる可能性が大きいということが言えます。








記事作成者のインセンティブ設計については次回書くことにします。

Bitcoinのデータはどこにあるのか?

Bitcoinのデータが実際どこに入っているのか。調べたのでメモ。

Bitcoin Coreをダウンロードし、ファイルを調べる。
Bitcoin Coreの説明は以下のページがわかりやすい。
speakerdeck.com


データが保存されているファイル、ディレクトリは次のようになっている。

blocks/blk*.dat
実際のブロックチェーンのデータが格納される。ウォレットで欠如しているトランザクションを再スキャンしたり、同期中の他のノードにブロックを提供するのに使われる。
DBになっておらず、追記専用ファイルとして保存される。


chainstate
UTXOとトランザクションメタデータをコンパクトにしたDB(LevelDB)。
新しく受信したブロック、トランザクションの検証に使われる。
新しいブロックを受信すると、そのブロック内に含まれたトランザクションによって消費されたUTXOを削除し、そのアウトプットを追加する。


参照
bitcoin.stackexchange.com


ただ、デフォルトでは、自分に関連したUTXOしか保存されていない。

そこで、任意のトランザクションを見ることができるようにするには、Bitcoin Coreにtxindexというオプションを設定する必要がある。

ビットコインコア設定ファイルbitcoin.confでtxindex=1とし、再起動すると全てのUTXOのダウンロードが開始される。

gettransactionコマンドで、確認できると思う。

geth puppethを使った プライベート・ネットワーク立ち上げ

Ethereumクライアントのgethを使って、プライベート・ネットワークを作成します。

プライベート・ネットワークを作成する際、本来自分でgenesisファイルを作成しなければならないのですが、gethに搭載されているpuppethというツールを使うことで、簡単にgenesisファイルが作成できます。


(puppethの解説⬇️)
https://blog.ethereum.org/2017/04/14/geth-1-6-puppeth-master/
https://modalduality.org/posts/puppeth/

❶puppethでgenesisファイル作成

private-netというフォルダをホームディレクトリ配下に用意しました。以降、このディレクトリでコマンドを実行します。

$ puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
|                                                           |
| This tool lets you create a new Ethereum network down to  |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail.         |
|                                                           |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset.                                   |
+-----------------------------------------------------------+


まず、ネットワークに名前をつけます。

Please specify a network name to administer (no spaces or hyphens, please)
> privateNetwork


2番を選択します。

What would you like to do? (default = stats)
 1. Show network stats
 2. Configure new genesis
 3. Track new remote server
 4. Deploy network components
> 2


コンセンサスアルゴリズムを選びます。今回は、1番のproof-of-workを選択します。

Which consensus engine to use? (default = clique)
 1. Ethash - proof-of-work
 2. Clique - proof-of-authority
> 1


今回は、prefundしないので0xのままenter。

Which accounts should be pre-funded? (advisable at least one)
> 0x


ネットワークIDを指定します。今回は4224を指定します。

Specify your chain/network ID if you want an explicit one (default = random)
> 4224
INFO [04-08|22:33:57] Configured new genesis block 
What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> 
INFO [04-08|22:34:14] No remote machines to gather stats from 


2番を選択し、genesisブロックを操作します。

What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> 2

2番を選択し、genesisファイルをエクスポートします。

 1. Modify existing fork rules
 2. Export genesis configuration
 3. Remove genesis configuration
> 2


enterをクリックします。

Which file to save the genesis into? (default = privateNetwork.json)
> 
INFO [04-08|22:34:35] Exported existing genesis block 

What would you like to do? (default = stats)
 1. Show network stats
 2. Manage existing genesis
 3. Track new remote server
 4. Deploy network components
> ^C


⇨privateNetwork.jsonが作成されているはずです。これがgenesisファイルです。

❷プライベートインスタンスの初期化

$ geth --datadir ~/private-net init privateNetwork.json

⇨geth, keystoreファイルが作成されます。


また、アカウントを作成することができます。(パスワードを設定してください)

$ geth --datadir . account new

❹startnode.shファイル作成

startnode.sh
geth --networkid 4224 --mine --minerthreads 1 --datadir "~/private-net" --nodiscover --rpc --rpcport "8545" --port "30303" --rpccorsdomain "*" --nat "any" --rpcapi eth,web3,personal,net --unlock 0 --password ~/private-net/password.sec --ipcpath "~/Library/Ethereum/geth.ipc"

注)private-net部分は、自分が作成したディレクトリ名に変更してください。

各オプションの意味は、下のリンクをみてください。
https://book.ethereum-jp.net/first_use/connect_to_private_net.html


次に、アカウントロック解除用の、パスワードファイルpassword.secを作成します。

****

❺プライベートネットワーク立ち上げ

先ほど作成したstartnode.shのアクセス権を変更します。

$ chmod +x startnode.sh


startnode.shを実行します。

$ ./startnode.sh

⇨プライベートネットワークが立ち上がります。

❻gethコンソールの操作

geth attach
>  eth.accounts
["0x4563747acfa25bbca20438a81bdd516529670dc7", "0x540e5d6b883c345120bc244ab1194fe69e799ac1", "0xf68778cf200251c46d047f05eca60cb9fd4c63ef"]

> eth.getBalance(eth.accounts[0])
5.991e+21

などなど。

gethコンソールの操作は以下のリンクをみると良いと思います。
https://qiita.com/amachino/items/b59ec8e46863ce2ebd4a