Ethereum上に実装されているトークンをマイニングを通して得られるようにするという,一見よくわからないEIPを教えてもらったので,調べました。
仕様書は↓ここにあります。masterにマージされていますが,まだ記述が不十分なところもたくさんあって,仕様が大きく変わる可能性もあります。
モチベーション
- トークンを発行して,それを公開・配布したい
- 「まずはトークンを広く流通させないと始まらない」という類のサービスのためのトークンの場合,公平に配布したいという需要がある
- ICOやAirDropといった方法では,トークンの発行者が全トークンの所有権を持った後にトークンを譲渡・売却することになるので,やや中央集権っぽさがある
- それに加えて,トークン発行者はトークンの譲渡・売却方法を自由に決められる立場にあるので,トークンの発行者とそれ以外の人の間に格差があって不公平感がある
- 仮想通貨と同じようにトークンもPoWの報酬として配布すれば,不公平感が無くなるのでは?
コントラクトの機能
インターフェースとして以下のメソッドを定義することを要求しています。基本的にはインターフェースの紹介のみで,詳細な実装の内容は「○○するのを推奨」という記述にとどまっています。
contract EIP918Interface {
function mint(uint256 nonce) public returns (bool success);
function merge(uint256 nonce, address[] mineTokens) public returns (bool) {}
function getAdjustmentInterval() public view returns (uint);
function getChallengeNumber() public view returns (bytes32);
function getMiningDifficulty() public view returns (uint);
function getMiningTarget() public view returns (uint);
function getMiningReward() public view returns (uint);
function hash(uint256 nonce) public returns (bytes32 digest);
function _reward() internal returns (uint);
function _epoch() internal returns (uint);
function _adjustDifficulty() internal returns (uint);
event Mint(address indexed from, uint reward_amount, uint epochCount, bytes32 newChallengeNumber);
}
mint
マイニングの結果として得られたnonceを送りつけるとnonceの検証を行い,検証の結果nonceが正当なものであれば msg.sender
にトークンを付与してくれるメソッドです。
中間者攻撃を防ぐなどの目的で,nonceの検証を行うのに用いるハッシュ関数の計算には msg.sender
を加えることを推奨しています。
また,pre-miningを防止するために challengeNumber
もハッシュ関数に加えることを推奨しています(getChallengeNumber
の項目参照)。
merge
optionalです。引数の mineTokens
として複数のトークン報酬のアドレスを与えると,それをマージしたトークンを生成するメソッドです。
ユースケースがドキュメントから読み取れないのですが,UTXOなどと関係しているのでしょうか?
getAdjustmentInterval
difficulty(マイニング難易度)の調整間隔(秒)の値のgetterです。
getChallengeNumber
mint
が行われるたびに設定しなおされる challengeNumber
の値のgetterです。
challengeNumber
はハッシュ関数の計算に加えることでpre-miningを防止するために使われます。
getMiningDifficulty
マイニング難易度のgetterです。nonceの検証で「計算したハッシュの値がdifficultyよりも小さければOK」などと判定するために使います。
getMiningTarget
ドキュメントに詳細な記載がありません…
getMiningReward
マイニング報酬のトークンの量を返すgetterです。
hash
PoWに使われるハッシュ関数です。
サンプル実装
0xBitcoinというプロダクトがリリースされています。
というよりも,0xBitcoinをEIPで標準化するために提案されたものがERC-918のようです。
0xBitcoinのマイニングの状況を可視化するethstats.netのようなページ や 0xBitcoinをマイニングするためのツール,0xBitcoinのマイニングプール もすでに存在していて,トークンというよりもまるで新しい仮想通貨のように運用されています。
コントラクトの実装はこちらにおいてあります。
コントラクトはすでにメインネットにデプロイされています。
トークン自体はERC-20に準拠して実装されているのでetherscanで情報を閲覧できます。ERC-918はトークンのmintの仕様を示しただけに過ぎないのでトークン自体の機能はERC-20やERC-721などで実装する必要があります。
感想
以下のような条件に合致しているユースケースがあればハマりそうな気がしました。
- 中央集権っぽさをなくして「公平に」配布したい
- 別のコインを作るのではなく,Ethereum上に乗せるべき理由がある(51%攻撃をするためにはEthereumを51%攻撃する必要があって,草コインでも安心…とか?)