ERC-918 マイニング可能トークンについて

Ethereum上に実装されているトークンをマイニングを通して得られるようにするという，一見よくわからないEIPを教えてもらったので，調べました。

仕様書は↓ここにあります。masterにマージされていますが，まだ記述が不十分なところもたくさんあって，仕様が大きく変わる可能性もあります。

https://eips.ethereum.org/EIPS/eip-918

## モチベーション

1. トークンを発行して，それを公開・配布したい
2. 「まずはトークンを広く流通させないと始まらない」という類のサービスのためのトークンの場合，公平に配布したいという需要がある
    * ICOやAirDropといった方法では，トークンの発行者が全トークンの所有権を持った後にトークンを譲渡・売却することになるので，やや中央集権っぽさがある
    * それに加えて，トークン発行者はトークンの譲渡・売却方法を自由に決められる立場にあるので，トークンの発行者とそれ以外の人の間に格差があって不公平感がある
3. 仮想通貨と同じようにトークンもPoWの報酬として配布すれば，不公平感が無くなるのでは？

## コントラクトの機能

インターフェースとして以下のメソッドを定義することを要求しています。基本的にはインターフェースの紹介のみで，詳細な実装の内容は「○○するのを推奨」という記述にとどまっています。

```solidity
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というプロダクトがリリースされています。

https://0xbitcoin.org/

というよりも，0xBitcoinをEIPで標準化するために提案されたものがERC-918のようです。

[0xBitcoinのマイニングの状況を可視化するethstats.netのようなページ](https://0x1d00ffff.github.io/0xBTC-Stats/) や [0xBitcoinをマイニングするためのツール](https://github.com/0xbitcoin/0xbitcoin-miner)，[0xBitcoinのマイニングプール](http://tokenminingpool.com/) もすでに存在していて，トークンというよりもまるで新しい仮想通貨のように運用されています。

コントラクトの実装はこちらにおいてあります。

https://github.com/0xbitcoin/EIP918-Mineable-Token/tree/master/contracts

コントラクトはすでにメインネットにデプロイされています。

https://etherscan.io/address/0xb6ed7644c69416d67b522e20bc294a9a9b405b31

トークン自体はERC-20に準拠して実装されているのでetherscanで情報を閲覧できます。ERC-918はトークンのmintの仕様を示しただけに過ぎないのでトークン自体の機能はERC-20やERC-721などで実装する必要があります。

https://etherscan.io/token/0xb6ed7644c69416d67b522e20bc294a9a9b405b31

## 感想

以下のような条件に合致しているユースケースがあればハマりそうな気がしました。

1. 中央集権っぽさをなくして「公平に」配布したい
2. 別のコインを作るのではなく，Ethereum上に乗せるべき理由がある（51%攻撃をするためにはEthereumを51%攻撃する必要があって，草コインでも安心…とか？）