Internet Computer の Network Nervous System、ニューロン、ICPユーティリティトークンを理解する(日本語訳)
Medium の DFINITY 公式の記事 Understanding the Internet Computer’s Network Nervous System, Neurons, and ICP Utility Tokens (2021/5/7) の日本語訳です。Internet Computer ブロックチェーンを制御する分散型脳 Network Nervous System の説明と技術的な解説です。
Internet Computer は、ウェブスピードで動作し、容量を拡張できる(無限の計算とデータをホストできる)最初のブロックチェーンであり、スマートコントラクトにより、クラウドサービスを必要とせずにインタラクティブなウェブコンテンツを直接ユーザーに提供することが可能です。また、世界初の順応できるブロックチェーンでもあります。つまり、リアルタイムで自身をアップデートし、ネットワークを進化させ、管理することができるのです。これは、Network Nervous System(またはNNS)と呼ばれるプロトコルに組み込まれた、オープンでパーミッションレスで自律的なガバナンスシステムによって可能になっています。
Internet Computer ブロックチェーンと、そのネットワークをホストする特殊なノードマシンは、NNSの制御下で稼働しています。しかし、世界中の誰もがNNSに提案(プロポーザル)を出すことができ、それが採用されると即座に完全に自動で実行されるため、ネットワークはリアルタイムに順応し進化していくことができます。NNSは、プロトコルの更新 または セキュリティの修正のためのノードマシンのアップグレード、経済パラメータの調整、ネットワーク容量を増やすための新しいサブネットブロックチェーンの形成などのタスクをいつでも実行できます。NNSは Internet Computer のプロトコル内で動作するため、ネットワークの運用を中断したり、セキュリティを壊すことなく、変更を加えることができます。
Network Nervous System は、ユーザーが ICP ガバナンストークンをステークして投票用ニューロンを作成することで機能します。誰でもニューロンを作成することができ、Genesis 後には何万ものニューロンが作成され、アルゴリズムを介してコミュニティの意思を共に行使することになると予想されます。ニューロンは、引き出しを通知しなければならないアカウントのようなもので、通知期間の長さは “溶解遅延(dissolve delay)” と呼ばれる設定です。ニューロンの投票力、および投票報酬に対する相対的な要求は、ステークされたICPの量、設定された 溶解遅延 の長さ、およびニューロンの「年齢」に比例します。ニューロンは手動で投票することもできるし、液体民主主義(liquid democracy) の一形態として他のニューロンを追随することで自動的に投票することもできます。
ニューロン 保持者は暗号経済ゲームに参加し、長期的に Internet Computer ネットワークの価値を最も高めることになるように、提案の採択と却下に投票したり、望ましい方法で自動的に投票するようニューロンのフォローを設定するインセンティブを与えられます。
これは、リーダーと役員を擁する商業組織が運営するプロプライエタリな中央集権型インフラに対抗する事が目的であり、分散型インフラが自己管理する歴史上初めての試みです。
概要
NNS の目的は、Internet Computer ネットワークを、オープンで 分散化されて セキュアな方法で 統治できるようにすることです。NNSは、ネットワークのあらゆる側面を全て制御できます。例えば、ネットワークをホストするノードマシンが使用するプロトコルとソフトウェアのアップグレード、ネットワーク容量を増やすための新しいサブネットブロックチェーンの作成、負荷を分散するためのサブネットの分割、計算能力に対してユーザーが支払わなければならない金額を制御する経済パラメータの設定、極限状況ではネットワークを守るために悪質なキャニスタースマートコントラクトソフトウェアの凍結など、多くのことが可能です。NNS は、提案を受け付け、ネットワーク参加者が作成した「ニューロン」による投票活動に基づいて、採択または却下を決定する仕組みになっています。
また、参加者が新たな提案を行う際にも、ニューロンは使われます。提出された後、提案はニューロン全体の投票によって、ほぼ即座に、あるいは少し遅れて、採択または却下されるかが決まります。各提案は特定の ”提案タイプ” のインスタンスであり、提案タイプによりどのような情報を含むかが決まります。NNS は提案タイプごとに、対応するシステム関数を保持しており、そのタイプの提案が採択されるたびに呼び出されます。NNS で提案が採択されると、パラメータを埋めるために提案の内容から情報を引き出し、対応するシステム関数を呼び出します。提案の種類ごとに 「#NodeAdmin」「#NetworkEconomics」 など特定の「提案トピック」に所属し、処理方法の詳細を決定します。ユーザー(ニューロン)がNNSに大量の提案を送りつける(スパム)ことを防ぐため、提案が却下された場合は提案したニューロンに対して手数料が課されます。
NNS は、ニューロンがどのように投票を行うかを見て、提案を採択するか却下するかを決定します。NNS 内の台帳に保管されている Internet Computer のネイティブユーティリティトークン(ICP)の残高をロックすることで、誰でもニューロンを作成できます。ユーザーがニューロンを作成すると、ロックされたICPの残高は、ニューロンを払い出す(「破壊する」)ことによってのみロックを解除できます。ユーザーがニューロンを作成するインセンティブは、提案に投票すると報酬が得られるからです。報酬は、NNSによって新たに作成され発行された ICP という形で得られます。ICPの報酬の量は、ロックされた残高の大きさ、ロックの残り時間(「溶解遅延」)、ニューロンの「年齢」、参加した投票の割合、全ニューロンの投票活動の合計 などから決定されます。支払われる報酬の合計には上限があり、投票者に分配しなければならないからです。
各ニューロンには、現時点で設定されている「溶解遅延」 があります。これは、「溶解モード」になった場合に、溶解するまでの時間を決定するものです。ニューロンが 溶解モードになると、溶解遅延 はキッチンタイマーのように時間経過とともに減少し、ゼロになると所有者は最後の溶解アクションを行い、ICPの残高のロックを解除できます。溶解遅延 は、ニューロンの所有者が、ある将来の日にロックされたICP残高の価値を最大化するために投票することで経済的インセンティブを生み出します。ICPは長期的なネットワークの成功のための代理であり、短期的な変動がないため、ネットワークの最善の利益のために投票する経済的インセンティブを生み出します。ニューロンの所有者は、最大8年まで 溶解遅延を自由に設定することができますが、自然な時間経過以外で 溶解遅延 を減少させることはできません。NNSは、溶解遅延 が大きいほど高い投票報酬を支払い、超長期的なビジョンに沿った投票を行う経済的インセンティブを生み出すゲームに参加するようにユーザーを促します。
ニューロンの所有者は、NNSに提出されたすべての提案に手作業で直接投票することは困難であると思われます。第一に、大量の提案が厄介なタイミングでNNSに提出されることがあり、所有者はそれぞれの提案を評価するために必要な時間を確保できない可能性があります。また、ニューロンの所有者は、提案の評価に必要な専門知識を持ち合わせていないかもしれません。NNSでは、これらの課題を解決するために、液体民主主義(liquid democracy) の一形態を採用しています。任意の提案トピックについて、ニューロンはニューロングループの投票に従うことで自動的に投票し、フォロイーの半分以上が採択に投票した場合は採択に、フォロイーの半分以上が拒否に投票した場合は拒否に投票するように設定できます。また、フォロールールが定義されていないトピックの提案に対しても、自動的に投票するように、キャッチオールフォロールールを定義できます。ニューロンの所有者がネットワークの利益のために自分のニューロンが他のニューロンをどのようにフォローするかを管理する、と想定されており、ネットワークの利益は、ロックされているICP残高次第で自分自身の経済的利益にもなります。
報酬を得るために、ICPの総供給量のうち多くの割合がロックされることが予想されます。これにより、攻撃者が大きな影響力を得るために十分な量をステークすることが難しくなり、法外なコストがかかるため、Internet Computer のネットワークガバナンスがセキュアになります。ニューロンの所有者は、すべての提案に投票することで報酬を最大化したいかもしれないので、ほとんどのニューロンは、積極的に管理されるか、自動的に投票できるように他のニューロンをフォローするように設定されるかのいずれかになるでしょう。実際には、信頼されたニューロンが提案に投票すると、他のニューロンの大部分は連鎖してフォローしており、その結果、大部分のニューロンは投票することになります。つまり、NNSは通常、全ニューロンで表される全体の投票力の過半数が提案の採択または拒否を望んでいるかどうかを迅速に判断し、それに基づいて提案を決定することができることを意味します。しかし、原理的には、ニューロンの所有者はフォロールールを定義しないことも、単に投票しないことも可能であるため、NNSはそのような多数決には依存できません。
Proposals 提案
フォーマット
NNSに提出される各提案には、以下の項目があります。
- Summary: 提案内容を簡潔に説明するためのテキストです。テキストは、最大280バイトです。
- URL: 提案の評価に必要な追加コンテンツのウェブアドレスを、HTTPSで指定します。例えば、このアドレスには、新しいデータセンターへのDCID(データセンターID)の割り当てをサポートする内容が記述されている場合があります。
- Proposer: 提案を提出したニューロンのID。提案が提出されると、却下された場合に備えて残高に「チャージ」が課せられます。そのため、(すべて)却下された際のチャージを払えるだけの残高が必要です。ニューロンは、投票するために6ヶ月以上の 溶解遅延 が必要であり、これは提案の提出にも適用されます。
- Proposal Type: 提案のタイプ。これにより、その提案がどのトピックに属するか(例: #NodeAdmin)、その提案が採用された場合に処理するシステム関数、その関数に渡されるパラメータの型と構造、が推測されます。
- Parameters: 提案のタイプによって決まる、提案が採用された場合に呼び出されるシステム関数に渡されるパラメータです。提案が提出されると、NNSはこのパラメータをチェックします。
NNSは、受け取った各提案に一意なIDを付与します。
トピック
提案のタイプから推測される提案のトピックは、その提案の処理方法を決定します。例えば、NNSはあるトピックについて、投票者により高い同意度を持つことを求める、または、提案をより速く処理しようとすることがあります。また、ニューロンはトピック単位で他のニューロンをフォローします。初期のトピックは以下の通りです。
- #NeuronManagement: このトピックのフォロイーによってニューロンを管理することができる特別なトピックです(この場合、デフォルトへのフォールバックはありません)。このトピックへの投票は、ニューロンの投票履歴に含まれません。このトピックに関する提案の場合、その提案に関連のあるトピックのニューロンのフォロイーのみが投票できます。このトピックの提案は、投票可能な人が限定されているため、通常の投票期間よりも短くなります。
- #ExchangeRate: すべての提案は、国際通貨基金(IMF)の特別引出権(SDR)で測定される ICP の市場価値に関する情報を「リアルタイム」で提供し、NNS が ICP を実世界のコストで一定に保てるレートでサイクル(計算の動力)に変換することを可能にするものです。このトピックに関する提案は投票期間が短く、とても頻繁に行われるため、このトピックに関する投票はニューロンの投票履歴に含まれません。
- #NetworkEconomics: ネットワークの経済性を管理する提案 — 例えば、ノードオペレータに支払われるべき報酬を決定。
- #Governance: ガバナンスを管理するすべての提案 — 例えば、動議と特定のパラメーターの設定。
- #NodeAdmin: OSのアップグレードまたは設定、仮想マシンフレームワークのアップグレードまたは設定、ノードレプリカソフトウェアのアップグレードまたは設定 などこれらに限らず、ノードマシンを何らかの形で管理するすべての提案。
- #ParticipantManagement: ネットワーク参加者を管理するすべての提案 — 例えば、DCID(データセンターID)または NPID(ノードプロバイダーID)の付与と取り消し。
- #SubnetManagement: ネットワークサブネットを管理するすべての提案 — 例えば、新しいサブネットの作成、サブネットノードの追加と削除、サブネットの分割。
- #NetworkCanisterManagement: ネットワークに属する「システム」キャニスターのインストールとアップグレード — 例えば、NNSのアップグレード。
- #KYC: 規制目的のためにKYC情報を更新する提案 — 例えば、ニューロンの形でICPの最初のGenesis配布の間。
- #NodeProviderRewards: ノードプロバイダーへの報酬の提案に関するトピック。
タイプ
初期の提案のタイプは以下の通りです。
- ManageNeuron (#NeuronManagement, 投票の制限)
特定のターゲットニューロンに対して、主要な関数を呼び出す提案です。この提案は、ターゲットとなるニューロンのフォロイーのみが投票できるため、事実上、ターゲットとなるニューロンをフォロイーがコントロールできるようになります。これは、個人のチームが重要なニューロンを管理するための便利で安全性の高い手段を提供することができます。例えば、あるニューロンが多額の残高を持っている または 評判の高い組織に属していて、他の多くのニューロンがその投票に従うことができるように公表されます。いずれの場合も、プリンシパルの秘密鍵をセキュアに管理することが問題になる可能性があります。(1つのコピーを保持するのは非常に非セキュアであり、一人の当事者がコントロールできるようにするか、あるいは、例えば複雑で時間のかかる閾値暗号を使用して、個人の集まりが責任を分担しなければなりません)。この提案タイプでこれに対処するため、重要なニューロンは、チームの個々のメンバーが制御するニューロンをフォローするように設定することができます。チームメンバーは、重要なニューロンを動作させるための提案を提出することができ、その提案が、チームメンバーの過半数の投票によって採用された場合にのみ、採用されます。(提案の提出には、サービス拒否攻撃防止のため、わずかな手数料がかかります)。ターゲットニューロンに対するコマンドは、フォロールールを変更するコマンドを含め、ほぼすべて実行可能であり、チームメンバーの集合を動的に変更できます。このタイプの提案を使用して、溶解遅延がゼロに達したニューロンを溶解する最終ステップだけは実行することはできません。これにより、ロックされたバランスの制御/「所有権」を譲渡できるためです。 (このルールの唯一の例外は非営利団体に適用され、その団体は最初の秘密鍵を使用せずに ニューロンを溶解することが許可されるかもしれません)。アクシデントでニューロンがプリンシパルの秘密鍵の悪意のある制御下に置かれるのを防ぐために、秘密鍵を破壊することでニューロンをそのフォロイーのみが制御できるようにすることもできますが、その後の残高のロック解除は不可能になります。 - ManageNetworkEconomics (#NetworkEconomics)
これは、1つまたは複数の経済パラメータを更新することができる単一の提案タイプです。
— — Reject cost: 却下された提案の提案者に課されるICPの金額 — 軽薄な提案のスパムを防止するため。
— — Minimum Neuron Stake: ニューロンの生成に必要なICPの最小数を設定します。また、溶解遅延 を増加させる、または ニューロンの状態を 溶解中 から 老化 に変更する場合にも、この制限に注意する必要があります。
— — Neuron Management fee: ニューロン管理提案1件あたりのICPのコスト。ここでは、NNSが特定のニューロンを代表して作業を行っており、この機能の使いすぎ(つまりスパム)を防ぐために少額の料金が適用されます。
— — Minimum ICP/SDR rate: 間違いを防ぐために、ICP/SDRのレートには下限があり、ネットワーク経済提案によって管理されます。
— — Dissolve delay of spawned neurons: 既存のニューロンの成熟度から生成されるニューロンの 溶解遅延。
— — Maximum node provider rewards: 1回の分配イベント(提案)でノードプロバイダに分配される報酬の最大値。
— — Transaction fee: 台帳のトランザクションごとに支払わなければならない取引手数料。
— — Maximum number of proposals to keep per topic: トピックごとに保存する提案の最大数。あるトピックの提案の総数がこの数より多い場合、スペースを節約するために、”final” 状態になった最も古い提案は削除されることがあります。 - Motion (#Governance)
動議(motion)とは、採択または却下される可能性のある文章です。動議が採択された場合、コードは実行されません。採択された動議は、Internet Computer のエコシステムの将来の戦略の指針となるべきものです。 - ApproveGenesisKYC (#KYC)
Genesis で新しいニューロンを作成すると、GenesisKYC=false になります。これは、彼らが実行できるアクションを制限します。具体的には、新しいニューロンを生成することができず、彼らの溶解遅延がゼロになると、新しいアカウントへの払い出しや残高のロック解除ができなくなります。この提案では、プリンシパルのバッチに対して GenesisKYC=true を設定します。
(特記事項: Genesis イベントはすべての ICP をニューロンという形で払い出し、そのプリンシパルは KYC される必要があります。その結果、Genesis の後に作成されたすべてのニューロンは、すでにKYCされた残高から派生しているはずなので、自動的に GenesisKYC=true に設定されます)。 - AddOrRemoveNodeProvider (#Participant Management)
IDをノードプロバイダーに付与(または失効)し、関連付けられた法人に関する重要な情報を関連付けて、それを一意に識別する方法を提供する必要があります。 - RewardNodeProvider (#NodeProviderRewards)
ICへのGen-1ノード提供の報酬として、Gen-1ノードプロバイダーに一定量のICPを報酬として与えることを提案します。 - SetDefaultFollowees (#Governance)
新しく作成されたニューロンが持つべきフォロイーのリストを指定します。
他のNNSキャニスターを呼び出す提案タイプの一覧は以下の通りです。
- CreateSubnet (#SubnetManagement)
データセンターとオペレーターから独立性を保証するような方法で指定されたノード群を、新しい非中央集権のサブネットに結合します。この外部アップデートの実行により、まず分散鍵生成プロトコルの新しいインスタンスが開始されます。そのプロトコルの記録は、サブネットの初期設定情報とともにレジストリの新しいサブネットレコードに書き込まれ、サブネットを構成するノードがそれを受け取ります。 - AddNodeToSubnet (#SubnetManagement)
サブネットに新しいノードを追加します。このノードは現時点ではサブネットに割り当てることはできません。この提案の実行により、既存のサブネットレコードが変更され、ノードが追加されます。NNSの観点からは、このアップデートはレジストリ内のサブネットレコードの単純なアップデートです。 - InstallNetworkCanister (#NetworkCanisterManagement)
NNSのサブネットワークにインストールして実行する新しいキャニスターを追加するための提案。自身を除くNNS上のすべてのキャニスタを制御するルートキャニスターが、この提案タイプを処理します。また、この呼び出しは、インストールされるWasmモジュールを期待します。 - UpgradeNetworkCanister (#NetworkCanisterManagement)
NNSのサブネットワークにある既存のキャニスターをアップグレードする提案。この提案タイプはルートキャニスターによって実行されます。この提案では、ターゲットキャニスターのWasmモジュールをアップグレードするだけでなく、認証情報と割り当てを設定することもできます。 - BlessReplicaVersion (#NodeAdmin)
レプリカをアップグレードできるように新しいバージョンを授ける(bless)提案。この提案は、レプリカのバージョン(インストールイメージのハッシュで識別)をレジストリに登録します。この提案は、そのバージョンのレコードを作成するだけでなく、サブネットにインストール可能な “blessed versions” のリストにそのバージョンを追加します。この提案自体には、アップグレードの効果はありません。(将来的には、レプリカソフトウェアのblessed version はいつでも1つだけになります)。 - RecoverSubnet (#SubnetManagement)
サブネットのリカバリーCUP(停止したサブネットを回復するために使用されます)をアップデートします。サブネットのリカバリーCUPを見つけたノードは、レジストリからそのCUPをロードし、そのCUPでレプリカを再起動します。 - UpdateSubnetConfig (#SubnetManagement)
サブネットの設定をアップデートします。この提案は、レジストリ内のサブネットレコードをアップデートし、サブネット上のノードがそれぞれのレジストリバージョンを参照したときに、その変更を受け取ります。サブネットの設定は、サブネット間で一貫していなければならないプロトコルパラメータで構成されます(メッセージサイズなど)。 - AssignNPID (#ParticipantManagement)
ノードオペレータに、その所有権や所在地の司法権やその他の情報に関する重要な情報を関連付けたIDを付与します。ノードオペレータはレジストリにレコードとして保存されます。そのノードオペレータの残りのノード許容量、つまりノードオペレータがまだICに追加できるノードの数含まれています。ノードオペレータによってノードが追加されると、残許容量が減少します. - RootUpgrade (#NetworkCanisterManagement)
NNSサブネットワーク内のルートキャニスターをアップグレードするための提案。この提案は、ルートキャニスターを制御するライフラインキャニスターによって処理されます。提案は、Wasmモジュールも認証設定も更新します。 - SetICPSDR (#ExchangeRate)
IMF SDRで測定された1ICPの市場価値をNNSに指示します。この設定は、サイクルの価格設定に影響します(サイクルの価値は、IMF SDRに対して一定でなければならないため)。 - UpgradeSubnetToReplicaVersion (#SubnetManagement)
既定のサブネットで動作しているレプリカのバージョンを更新します。この提案は、指定されたサブネットで使用されているレプリカのバージョンを変更します。このバージョンは blessed replica version のリストに含まれている必要があります。アップグレードは、サブネットが次の正規CUPを作成するときに実行されます。 - ClearProvisionalWhitelist (#NetworkEconomics)
リストされたプリンシパルがサイクルを持つキャニスターを作成できるようにする、暫定的なホワイトリストをクリアします。このメカニズムはブートストラップとテストにのみ必要で、その後は無効にしなければなりません。 - RemoveNodeFromSubnet (#SubnetManagement)
サブネットからノードを削除します。その後、再割り当てが可能になります。この提案の実行により、既存のサブネットレコードが変更され、ノードが削除されます。NNSの観点からは、この更新はレジストリ内のサブネットレコードの単純な更新です。 - SetAuthorizedSubnetworks (#Governance)
特定のプリンシパルが特定のサブネットワーク(リストから)の使用を許可されていることを、サイクルミンティング キャニスターに通知します。また、特別な権限を持たないプリンシパルが使用を許可されるサブネットワークの ”デフォルト” リストを設定するために使用できます。 - SetFirewallConfig (#SubnetManagement)
レジストリのファイアウォール設定を変更します(サブネットのブロックチェーンレプリカがどの境界ノードと通信するかを設定します)。 - UpdateNodeOperatorConfig (#NodeAdmin)
レジストリにあるノードオペレータの許容値を変更します。 - StopOrStartNNSCanister (#NetworkCanisterManagement)
NNSキャニスターを停止または起動します。
ICPトークン
ICPは、ネットワーク上で以下の3つの重要な役割を果たすネイティブユーティリティトークンです。
- ネットワークガバナンスの促進
ICPトークンをロックすることで、投票によってネットワークガバナンスに参加するニューロンを作成し、それを通じて経済的報酬を得ることができます。 - 計算用サイクルの生産
ICP は、使用時に燃焼させる燃料の役割として、計算の動力となる ”サイクル” に変換可能な価値の源泉を提供します。NNS は、ICP をサイクルに変換するレートを可変にすることで、ネットワークの利用者が常に新しいサイクルを実質的にほぼ一定のコストで作成できるようにし、燃料調達のコストを予測できるようにしました。 - 参加者への報奨
ネットワークは、新しい ICP を発行して、a)ガバナンスに参加する人への “投票報酬” の提供、b)ネットワークをホストしているノードマシンを稼働させている人への「ノード提供報酬」の提供 を含む、ネットワークの機能を実現する重要な役割を担う人に報酬とインセンティブを与えています。
台帳
ICP 台帳はNNS内でホストされ、表計算ソフトの要領で ICP の全残高を記録しています。各行は「アカウント」 と呼ばれ、2つのフィールド(つまり2つの「カラム」)を持っています。
- アカウントID(bytes)
アカウントを「コントロール」する「プリンシパル」のIDから派生した一意な値です。現在、プリンシパルは以下のいずれかでなければなりません。(i) 公開鍵ペアの所有者、または (ii) NNSの一部であるキャニスタースマートコントラクト。アカウントID は、ドメインセパレーター、プリンシパルID、サブアカウント(サブアカウントがない場合はゼロ)を連結したものをハッシュ化することで導き出されます。 - 残高(正の整数で、ICPの100万分の1を意味します)
アカウントのプリンシパル に割り当てられたICPの数量です。
プリンシパルが公開鍵またはキャニスターの場合、アカウントに対して以下の操作を適用することができます。
- 送信
ICP 残高の一部を他のアカウントに送信します。ICP をすべて別の口座に送った場合、送った口座は存在しなくなります(台帳から削除されます)。 - 通知
送金先が NNS キャニスターのアカウント(例えばガバナンスキャニスターのアカウント)である場合、送信者は台帳に受信者のキャニスターへの着信を通知するよう依頼することができます。その後、受信者のキャニスターはこの通知に基づいて行動することができます。この能力が使用される2つの例は、ニューロンを作成することと、ニューロンのステークをリフレッシュすることです。これらを以下で詳しく説明します。
台帳とガバナンスシステム(ニューロン)間の相互作用が必要な操作は下記です。
- ニューロンの作成
プリンシパルが公開鍵の保有者である場合、残高の一部を新しいニューロン内にロックできます。技術的には、ニューロンの作成は2段階です。まず、ステークするICPをガバナンスキャニスターのアカウントに転送します(これは新しいニューロンに対応 — 関連付けの詳細はここでは省略)。その後、転送があったことをガバナンスキャニスターに通知し、その内部のニューロンブックキーピングを更新します。残高の全てが新しいニューロン内にロックされている場合、そのアカウントは存在しなくなります(つまり、元帳から削除されます)。このICPを別のアカウント、例えば元のアカウントに移動し、再び通常の残高のように管理できるようにするには、関連するニューロンを完全に溶解して払い出す(破壊する)必要があります。作成された新しいニューロンは、それを作成したプリンシパルの秘密鍵で制御されます。 - ステークのリフレッシュ
ニューロンのステークは、台帳のアドレス/アカウントに転送し、転送があったことをガバナンスキャニスターに通知することで増加させることができます。ステークをリフレッシュすると、ニューロンの成熟度と年齢が日割りで変更されます。例えば、ステークが2倍になると、成熟度と年齢が半分になるので、生成は同じ量になり、年齢ボーナスは以前と同じになります(絶対的には)。
ニューロン
ニューロンはICPの残高をロックすることで、その所有者をネットワークガバナンスに参加できるようにします。それによって報酬を得ることができます。
属性
ニューロンは下記の属性を持っています。
- Identity (uint64)
ニューロンオブジェクトの一般的な ID。ニューロンが他のニューロンにフォローするように設定されている場合、この値が使用されます。これは、ニューロン生成時に選択されるランダムな64ビット値です。 - Account (bytes, private)
The ledger account where the locked ICP balance resides. ロックされたICPの残高が存在する台帳のアカウントです。 - Controller (principal ID, private)
実際にニューロンを制御するプリンシパル。プリンシパルは、対応する秘密鍵が非常にセキュアに保たれるように、「マスターキー」として機能する公開鍵ペアを識別しなければなりません。プリンシパルは多くのニューロンを制御することができます。 - Hot Keys (principal ID のリスト, private)
プリンシパルに対応する秘密鍵を公開することなく、投票などの限定された権限のアクションを実行するために使用できる鍵(例えば、WebAuthnの鍵である可能性があります)。 - CreatedAt (timestamp)
ニューロンがいつ作られたか。 - AgingSince (timestamp)
このニューロンが老化を開始した時間に対応するタイムスタンプ。これは、作成時刻またはニューロンの溶解が停止した最後の時刻のいずれかです。溶解しているニューロンは常に年齢がゼロになるため、ニューロンが溶解している時、この値は無意味です。 - DissolveState
いつでも、WhenDissolved と DissolveDelay のうち最大1つが指定されます。
— — WhenDissolved (タイムスタンプ)
溶解タイマーが動作している場合、Unixエポックからの秒単位のタイムスタンプが格納され、その時点でニューロンは溶解されます。ニューロンを溶解している間、ニューロンの所有者は溶解を一時停止することができ、その場合 DissolveDelay(溶解遅延) が代入されます。この場合、DissolveDelay には、WhenDissolved からその動作が行われたときのタイムスタンプを引いた値が代入されます。
— — DissolveDelay (持続期間)
溶解タイマーを停止した時に、溶解タイマーをどれぐらいの時間で開始するかを格納します。最大で8年です。この状態にある間、ニューロンの所有者はいつでも溶解を開始(または再開)することができ、その場合 WhenDissolved には、アクションが取られた時のタイムスタンプに DissolveDelay を加えたものが代入されることになります。 - Maturity (正の数 — パーセント)
ニューロンの成熟度は、新しいニューロンを生成する能力を決定し、生成されたニューロンのステークのパーセントで表したこの値に等しい期待値で、新しく発行されたICPのロックされた残高を対応させます。新しいニューロンが作られたとき、その成熟度はゼロです。ニューロンが投票すると、NNSは時間の経過とともに成熟度を上げ、彼らに報酬を与えます。 - Follow Relationships (トピックからフォロワーのリストへのマッピング, private)
ニューロンは、トピックごとに他のニューロンをフォローすることで、自動的に投票するように設定することができます。任意の有効なトピックに対して、フォロイーのリストを指定することができ、そのトピックに属するタイプの提案に対するフォロイーの過半数の投票にニューロンは従います。nullトピックが指定された場合、これはキャッチオールとして機能し、ルールが指定されていない場合、ニューロンはフォロイーの投票に従うことができるようになります。 - Recent Votes (public)
最近の投票履歴は管理されています。これは、あるニューロンをフォローするかどうか、あるいはフォロイーがどのような投票をしているかを評価したい人のためのガイドとなります。 - NotForProfit (boolean)
このニューロンが 「非営利」 であり、投票によって 溶解可能であるかどうか。
以下の属性を計算できます。
- Age (seconds)
| AgingSinceと現在時刻から計算されます。
ニューロンを作成してから、または最後にディゾルブを停止してから経過した期間。概念的には、ニューロンが溶解し始めるといつでも、その年齢はゼロにリセットされ、溶解している間はゼロのままです。溶解中のニューロンは、溶解をオフにすると、現在時刻が年齢を計算するための有効なニューロン作成日となります。 - State (LOCKED または DISSOLVING または DISSOLVED)
| DissolveStateと現在時刻から計算されます。
— — LOCKED: この状態では、ニューロンは特定の溶解遅延でロックされています。時間の経過とともに年齢を重ね、溶解遅延が 6 ヶ月以上であれば投票できます。start_dissolving メソッドを呼び出すことで、ニューロンを DISSOLVING 状態に移行できます。increase_dissolve_delay メソッドを使うと、ニューロンの状態 または 年齢に影響を与えずに溶解遅延を増やせます。
— — DISSOLVING: この状態では、ニューロンの有効な溶解遅延は時間の経過とともに減少します。溶解中は、ニューロンの年齢がゼロとみなされます。最終的には DISSOLVED 状態になります。stop_dissolving メソッドを呼び出すと、ニューロンは LOCKED 状態に移行し、再び老化を開始します。increase_dissolve_delay メソッドを使用すると、溶解遅延を長くできますが、これはタイマーを停止しない または ニューロンの年齢には影響しません。
— — DISSOLVED: 溶解状態では、disburseメソッドを使用してニューロンのステークを払い出すことができます。溶解遅延はゼロとみなされるため、投票することはできません。この状態で increase_dissolve_delay メソッドが呼ばれると、ニューロンは指定された溶解遅延でロックされ、再び老化を開始します。トークンを流動化させたい場合はニューロンのステークを払い出し、投票報酬を得たい場合は溶解遅延時間を長くする、というように、ニューロン保持者にはニューロンを長時間溶解した状態にしないインセンティブがあります。これらのインセンティブが不十分であることが判明した場合、NNSは溶解したニューロンに対してさらなる制限を課すことを決定できます。 - ControlByProposals (boolean)
| #NeuronManagementトピックに空でないフォロイーリストがある場合、trueを返します。
ニューロンが ManageNeuron トピックでフォロイーを指定すると、ManageNeuron (#NeuronManagement) タイプの提案で管理できるようになり、そのニューロン自身のフォロイーによってのみ投票が可能です。これは、ホットキー または プリンシパルの秘密鍵を使わずにニューロンを管理することができるため、セキュリティの高いセンシティブなニューロンを管理するための基盤となるもので、(ICPの関連残高を解除する必要がない限り)コールドストレージで保持 または 破壊することさえ可能です。例えば、DFINITY Foundation または Internet Computer Association は、彼らの意向に従って投票させる特別なニューロンのアドレスを公表し、他の人が彼らに従うように自分のニューロンを設定し、ガバナンスにおける彼らの専門知識と努力を活用できます。このような慣行の問題点の1つは、公開されたニューロンの管理に使用される秘密鍵が危険にさらされ、ハッカーが制御して多数のフォローしているニューロンを「騙して」、自分の希望通りに投票させることが可能になる危険性があることです。しかし、公開されたニューロンが管理者提案を有効にしていれば、同時に強要できない多数のチームメンバーによって一般的に管理されている、彼らがフォローするニューロン(フォロイー)によって管理することができ、秘密鍵を使用する必要は全くありません。
コマンド
ニューロンを制御するプリンシパルは、ニューロンに以下の動作を指示できます。
- 溶解開始
溶解遅延は、一方向にしか回せないキッチンタイマーのようなものです。任意に増やすこともできますが、減らすにはディゾルブモードをオンにしてカウントダウンするしかありません。ニューロンは、「溶解」 を開始するように指示できます。ニューロンがディゾルブしているとき、そのディゾルブディレイは時間の経過とともに減少し、停止するかゼロになるまで減少します。溶解遅延が6ヶ月以下になると、ニューロンは投票できなくなります(投票による報酬も得られません)。ディゾルブディレイがゼロになると、ディゾルブディレイの減少が止まり、コントロールプリンシパルはニューロンに対して払い出しを指示できます。 - 溶解停止
溶解中のニューロンに対して、停止を指示することができ、その場合、溶解遅延は時間とともに減少しなくなります。 - 払い出し
ニューロンのディゾルブディレイが0になると、コントロールプリンシパルはニューロンのステークを払い出しするよう指示できます。ロックされていた ICP の残高が指定された新しい台帳アカウントに移され、ニューロンと自身の台帳アカウントが消滅します。 - 溶解遅延を増加
ニューロンの溶解遅延は、最大で8年まで増加させることができます。 - 生成(スポーン)
ニューロンの成熟度が閾値以上になると、新しいニューロンを生成するように指示することができます。これにより、台帳に新たなICPの残高をロックする新しいニューロンを作成します。新しいニューロンは、親と同じプリンシパルに制御され続けることも、新しいプリンシパルに割り当てられることも可能です。ニューロンが新しいニューロンを生成すると、その成熟度はゼロになります。 - ホットキーの追加
ニューロンを管理するために使用できる新しいホットキーを追加します。これは、特に定期的に使用する場合、負担が大きく、セキュアに保つのが難しいであろうプリンシパルのコールドキーを使用してニューロンを管理する代替案を提供するものです。ホットキーは、スマートフォンなどのユーザーデバイス内に保持されるWebAuthnキーになるかもしれません。 - ホットキーの削除
以前にニューロンに割り当てられたホットキーを削除します。
設定されたプリンシパルまたはホットキーを使用して、以下のアクションを開始することができます。
- 投票
指定されたIDの提案を採択するか却下するかの投票をニューロンに行わせます。 - フォロー
多数決に従うフォロイーニューロングループを指定することで、特定のトピックに属する提案に自動的に投票できるルールを追加します。このようなフォロールールを設定することで、a) 複数のエンティティ間で投票力を分散させる、b) 新しく提出された提案を評価する時間がない場合、ニューロンに自動的に投票させる、c) 新しく提出された提案を評価する専門知識がない場合、ニューロンに自動的に投票させる、などの目的で使用できます。フォロールールで、フォロイーの集合を指定します。指定されたトピックに属する提案に対して、フォロイーの多数が採択または却下の投票を行うと、ニューロンも同じように投票を行います。もし、大多数のフォロイーが採択することが不可能になった場合(例えば、採択と却下が50–50に分かれたため)、ニューロンは拒否に投票します。提案トピックがNULLの場合、そのルールはキャッチオールフォロールールとなり、特定のルールが指定されていないトピックに属する提案に自動的に投票するために使用されます。フォロイーのリストが空の場合、フォロールールは事実上削除されます。
クリプトエコノミクス
概要
ニューロンは、ガバナンスに参加することで報酬を得る機会を提供します。報酬はニューロンの成熟度を上げるという形で投票者に分配され、最終的には、新たに発行された ICP を含んだ新しいニューロンを生成できるようになります。しかし、ニューロンを生成することで得られる全体的な経済効果は、関連するICPのロックされている残高の値によって変動し、ニューロンの存続期間中に不安定になる可能性があります。
ニューロンの所有者は、経済的成果を最大化するために、まず自分のニューロンが常に投票するようにし、投票に対する報酬を最大限受け取るようにし、次に、どのような行動がネットワーク全体の成功に最もつながるかという自分のビジョンに最も合致する方法で提案に投票するという強いインセンティブを持ちます。
溶解遅延
クリプトエコノミクスのニュアンスは、ニューロンの溶解遅延に関連しています。誰かがICPのロックされた残高を売りたい場合、将来、ロックを解除して売ることができる瞬間に、その価値が最大になれば、最も利益を得ることができます。ロックされたニューロンを考えるとき、その瞬間は常に「溶解遅延日数」後の未来であり、ニューロンの溶解は、日ごとに近づいてきます。一方、ニューロンの所有者が遠い将来のネットワークの価値を最大化するために長期的な視野で投票することが、ネットワークの長期的な成功に最も貢献することになります。そのような理由から、NNSでは、最大8年までの溶解期間を設定することができ、溶解期間が長いほど、ニューロンへの報酬が大きくなるように、ニューロンの所有者にインセンティブを与えています。
また、ニューロンによる投票は、その所有者が長期的な視点を持っているほど意思決定に役立つため、NNSは溶解遅延が大きいほどニューロンからの投票を重視し、溶解遅延が6カ月未満のニューロンは完全に投票できないようにしました。もちろん、ロックされた残高を譲渡することができれば、たとえロックされていない残高よりも割安であっても、ニューロンの所有者はいつでも「自分のニューロンを売る」ことができるため、この仕組みはネットワークにとってあまり利点はないでしょう。
ガバナンスでの51%攻撃
セキュリティ上の重要な懸念は、攻撃者が51%の投票権を獲得すること、あるいは、よく考えずに投票した人に有利になるように情勢を変化させることでネットワークの成功を損なうことを防ぐことです。(ここでいう「攻撃者」とは、ネットワークに害を与えようとする行為者、偶然に悪意ある影響を及ぼす行為者、そして単に権力を過度に集中させる行為者を等しく指します)。幸いなことに、NNSの内部には膨大な量のICPがロックされているため、そのようなステークを得ることは途方もなく高価です。また、せっかく購入しロックした ICP は、ネットワークに被害が及べば価値が激減してしまうため、必要な資金を回収することは困難です。例えば、攻撃者が悪意のある国営企業であるなど、リソースに関する懸念が少ない場合でも、ICP全体の供給の大部分が報酬を得るためにニューロンにロックされているため、ロックされていないICPを金融取引所で素早く購入することはできません。そのため、攻撃者は時間をかけてゆっくりとポジションを築き上げることになり、大量購入による買い圧力で価格は上昇し、連続購入はますます高額になることが予想されます。
これらの理由から、ロックされたICPの残高にアクセスすることなく、51%の議決権を蓄積することは不可能であると思われます。このことは、ニューロンのために市場を作り出せないことが重要であることを示しています。この場合、攻撃者は、ロックされたステークを低コストで迅速に大量に取得するために、市場のパニックを起こそうとするかもしれません。たとえば、ネットワークへの深刻かつ持続的なDoS攻撃と、ソーシャルメディア上でのフェイクニュースや否定的な意見の広範な流布を組み合わせて、ロックされたステークが無価値になる危険性があるとニューロンの所有者に思わせ、大規模な「特売セール」を発生させることができます。国家権力がこのような攻撃を行う可能性は実際には極めて低いが、オープンネットワークとデジタル資産の政治性により、大衆的な狂気と市場の暴落ははるかにより起こり得ることです。このような出来事によって議決権が再編成され、特に資金力のある数人の手での突然の中央集権化は、ネットワークの利益にはなりません。このことは、ニューロンのための市場が望ましくない理由をさらに示しています。
投票報酬の計算
概要
まず、ICPの総供給量の90%はニューロンにロックされるべきであると決めます。次に、90%の参加者を動機付けるために、何を見返りとして提供しなければならないかを、ICPをロックした人に新しくICPを発行するという形で、見積もります。これにより、成功した場合に支払わなければならない報酬の総額を計算することができます。そして、現在の参加率に関係なく、この量の新しく発行されたICPを分配することに決めます。参加率が90%に達するまで、参加者はより大きな報酬を受け取ることになるので、市場は現在参加していない人々が参加するよう勧誘できます。
必要な見返りは現在の供給量に対する割合で見積もり、ネットワークがより安定化するようロックされている残高減少のリスクを考慮し、時間の経過とともに減少させるようにしています。まず、供給量の10%(年率ベース)を分配し、8年後に供給量の5%まで分配を減少させます。
アルゴリズム
ニューロンの成熟度は 0 から始まりますが、投票活動によって上昇します。ニューロンの成熟度がある閾値を超えると、新しく発行された ICP を含む新しいニューロンを生成することができ、自身の成熟度は 0 にリセットされます。生成されたニューロン内の新しく発行された ICP ニューロンの量は、親ニューロン内にロックされた ICP に親ニューロンの成熟度を掛けたものになると期待されます。つまり、例えば 100 ICPを含み、成熟度が 10 パーセントのニューロンは、見込みで 10 ICP を含む新しいニューロンを生成できます。新しく生成されたニューロンは、7 日間の溶解遅延があり、必要であれば内部にロックされた ICP を簡単に回収できます。もちろん、新しく産み出されたニューロンは 0 日齢です。
ニューロンの成熟度と、それが集めた投票報酬の間には近似的な等価性があり、それはまだ別のニューロンを生成することによって引き出せてはいません。(この等価性は、”生成 “操作にはある程度の不確定性があるため、成熟度は、生成されたニューロン内にどれだけのICPが期待されるかを決めるだけだからです)。24時間ごとに、投票に参加したすべてのニューロンの成熟度をどれだけ上げるかを計算しなければなりません。我々は、ニューロンの成熟度の増加として反映される、報酬として作成・配布される可能性のあるICPの名目上の最大量を計算することから始めます。この数量がわかれば、ロックされた ICP の数量、設定された溶解期間、年齢などを考慮して、各ニューロンが受け取るべき報酬の相対的な割合を計算できます。
現在のICPの供給量と Genesis からの日数をもとに、ICPを発行して報酬として配布できる名目上の最大量を導き出します。まず、ICPの供給量の10%を1年の日数(通常365日、うるう年は366日)で割った値が、ICPの供給量に相当します。8年経つと、これは5%に落ちます。ただし、この間にICPの供給量が増減する可能性があるため、実際には投票報酬が半分になるとは限りません。
- Genesisでのレートは年率10%にしたい。
- ジェネシス+8年目のレートは年5%とし、その後は横ばいにしたい。
- レートが時間の2次関数になるようにしたい。
- レートがフラットになった時点で、時間に対して微分可能としたい。
Genesis の時刻を G とすると、G からG+8yまでの任意の時刻 t について、時刻 t における総報酬 R(t) は次式で与えられます。
R(t) = 0.05 + 0.05[ (G + 8y — t) / 8y ]²
または、より一般化すると
R(t) = Rf + (R0 — Rf)[ (T — min(t, T)) / (T — G)]²,
ここで、R0 は初期レート(10%)、Rf は最終レート(5%)、T はレートがフラットとなる時間(G+8y)とします。
下記に注意してください。
R(G) = Rf + (R0 — Rf) [ (T — G) / (T — G) ]² = Rf + (R0 — Rf) = R0
R(T) = Rf + (R0 — Rf) [ (T — T) / (T — G) ]² = Rf
R’(t) = 2 (R0 — Rf) (T — t) / ( T — G )²
R’(T) = 0
fn nominal_voting_rewards_available(icp_supply, days_since_genesis)
{
// 8 years times 365.25 days is 2922 days
let day = min(days_since_genesis, 2922);
let as_perc_of_annual = 0.05 + 0.05 [ (2922 — day) / 2922 ]^2
icp_supply*as_perc_of_annual / 365.25
}
(上図タイトル)総供給量の割合に応じた「投票報酬」のための新しいICPユーティリティトークンをマイニング
ある時点におけるニューロンの投票力は以下のように計算されます。
ニューロン_ステーク * 溶解遅延_ボーナス * 年齢_ボーナス
溶解遅延のボーナスは1から2の間の値で溶解遅延の一次関数(最大値は8年)であり、年齢のボーナスは1から1.25の間の値でニューロンの年齢の一次関数(最大値は4年)です。ニューロンはロック状態になると老化を開始します。したがって、ニューロンは溶解遅延の増加によって最大100%、老化によって最大25%の投票力の増加を受けることができます。これらのボーナスは累積されるので、ICPが100のニューロンの最大投票力は250です。これは、そのニューロンが最大の溶解遅延8年でロックされ、少なくとも4年間老化し続けることで達成されます。
ある与えられた報酬期間(通常1日)の投票報酬を分配するために、この報酬期間に含まれる提案の集合を決定することから始めます。これらは、(1)まだ投票報酬が確定しておらず、(2)もはや投票ができない(すなわち、投票期間が終了した)提案です。次に、これらの提案に対して、採択または拒否の投票を行うニューロンが貢献した投票力の合計が加算されます。最後に、各ニューロンは、これらの提案に貢献した投票力に比例して報酬を得ます。
開発者コミュニティに参加し、forum.dfinity.org で開発を始めましょう。