RANDAO の消費とインセンティブ

RANDAO 参加者には、プロトコルへの貢献に対してインセンティブが与えられます。このインセンティブのソースは、プロトコルから乱数を要求する RANDAO コンシューマーからのものです。 私たちの実装では、コンシューマー(消費者)からの乱数のリクエストごとに支払いを行うペイヤー(支払者)の役割をさらに導入します。これは通常は契約です (ただし、そのような制限はまだ実装されていません)。支払者は契約(RandaoFundと呼ばれます)に入金します。支払者は、通話料が支払者によって負担される口座のリストを登録することができる。デフォルトで有効になっているため、支払者は自分のアカウントを登録する必要はありません。

ホワイトリストに登録されたアカウントは、次のインターフェイスを使用して、Randao コントラクトと対話して乱数を取得できます。

interface IRandao {
  function currentBlock() external view returns(uint);
  function random(uint randaoId, uint salt, unit sugar) external returns (uint);
  Function RANDAO_PERIOD() external view returns(uint);
}

最初の関数 currentBlock() は、呼び出し時の最も高いRANDAOラウンドIDを返します。おそらく N N-2*M の間のRANDAOラウンドは確定していない可能性があります。ここで、 N = currentBlock()M は関数 RANDAO_PERIOD() によって返されるRANDAO期間です。言い換えれば、これらのラウンドで生成されたランダムな数値を取得するリクエストは拒否されます。例えば、currentBlock()が100を返し、RANDAO_PERIOD() が10を返す場合、91から100までのすべてのラウンドは確定していません。 2つ目の関数 random() は、ランダムな数値のリクエストを行うためのものです。現在の実装では、返される値は初期シード(いわゆる "sugar" と呼ばれる任意の整数値)と、与えられたピボットRANDAOラウンド(randaoId.で示される)に基づいて、一連の連続したRANDAOラウンドで生成されたランダムな数値("salt" と呼ばれる)に基づいて生成されます。

特に、指定されたRANDAOラウンドが確定していない場合、関数は拒否されます。 random() の成功した呼び出しには、事前に定義された固定の料金がかかります(ガス消費は除く)。この料金は、RANDAO参加者(80%)とRANDAOプラットフォームのオペレーター(20%)へのインセンティブとして使用されます。

RANDAO参加者は、時間の一定期間(エポックと呼ばれる)において正しいタイムラインで秘密の数値を提出し公開することに成功したRANDAOラウンドの数に比例してインセンティブが与えられます。参加者のインセンティブは次のように計算されます。

エポック内で RANDAO ラウンドの少なくとも 80% に貢献した参加者のみがインセンティブを受け取る資格があります。不適格な参加者のインセンティブは、次のエポックに自動的に転送されます。

Last updated