オレオレコインの作り方(前編)

オレオレコインの作り方(前編)
============================

ビットコイン・ライトコインを始めとする分散暗号通貨は取引されているだけでも200種類以上あると言います。
これらのビットコイン派生コイン(altcoin)の実態はオープンソースで開発されているP2Pソフトウェアで、
最初にC++で実装されたbitcoindをベースに作られています。

altocoinがたくさん作られている上に、[独自のコインを作るサービス](http://www.coingen.io/)もあることから、技術的には難しくないことは予想できます。そこで、実際にライトコインをベースにaltcoinをつくってみようと思い調査を始めました。

#### 調査方法

モナコインはライトコイン派生のコインです。モナコインのソースとライトコインのソースを比較することで修正ポイントを洗い出しました。実際にはライトコインのgithubのリポジトリのなかの`src`ディレクトリにモナコインのソースを上書きして比較します。この時、ユーザインタフェース(Qt)部分は無視しました。[作業に使ったリポジトリ](https://github.com/tumf/litecoin/commits/monacoin)を見ていただければわかりますが地道な比較作業です。

## 変更点

本調査により洗い出された変更点を以下に列挙します。

### 名称部分

> https://github.com/tumf/litecoin/commit/ec7c6e6f3673ec5b08726bc43daa6b8f29ed7485

* Litecoin -> Monacoin
* LTC -> MNC

等の単純比較によるところです。変更箇所は多いですが一括置換が可能です。

### RPCリクエストの待ち受けポート変更

> https://github.com/tumf/litecoin/commit/d8820b82c8d13efec644860f0311addecb41eedb

ライトコインが待ち受ける`9333`ポートを`9401`ポートに変更しています。

### アドレスフォーマットの変更

> https://github.com/tumf/litecoin/commit/275258b514340caab52b73fcf523cfcbd289417a

ライトコインのアドレスは`L`から始まります。これをモナコイン用に`M`から始まるように変更しています。

```
-        PUBKEY_ADDRESS = 48, // Litecoin addresses start with L
+        PUBKEY_ADDRESS = 50, // Monacoin addresses start with M or N
```

コメントでは、モナコイン用アドレスは`M`か`N`で始まるように記載がありますが、
[List of address prefixes](https://en.bitcoin.it/wiki/List_of_address_prefixes)によると
`M`から始まるアドレスのみになっているようです(コメントの間違い？)

### チェックポイントのメンテナンス

チェックポイントについては以下を参考にしてください。

> http://qiita.com/hshimo/items/5cca750eecdad58ee990

ブロックチェインのある時点のハッシュをソースコード内に埋め込みます。
ライトコインではちょくちょくメンテナンスされているのですが、
モナコインではこの部分まだメンテナンスされていません。

### 初期接続ノードの変更

ウォレットがP2Pに接続するときに最初に接続する相手をカスタマイズしています。

> 参考
> https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery

#### 初期接続ノードサーバ

> https://github.com/tumf/litecoin/commit/520de48ab40c52318e67dc8d69869c84b96d864c

ライトコインでは、初期接続ノードを知るためのサーバが以下の5つ登録されています。

* dnsseed.litecointools.com
* dnsseed.litecoinpool.org
* dnsseed.ltc.xurious.com
* dnsseed.koin-project.com
* dnsseed.weminemnc.com

モナコインはこれらのかわりになるものは登録されていません。
（以下によると、必須ではないとの事です）

> https://bitcointalk.org/index.php?topic=321547.0

#### 初期接続ノード

> https://github.com/tumf/litecoin/commit/520de48ab40c52318e67dc8d69869c84b96d864c

初期ノードを知るためのサーバの代わりに以下の2つのIPアドレスがハードコードされています。

> 0x8AEBF285, 0x59277899

10進数に直すと以下のようになります。

* 138.235.242.133
* 89.39.120.153

ライトコインにはDNS Seedのサーバ以外に982のハードコードされた初期ノードのIPアドレスが登録されています。


### 発行枚数の上限設定

>https://github.com/tumf/litecoin/commit/affe1a2ec371dc855abb5ec5fa8d7a4abc5b87db

ライトコインはビットコインの発行枚数の4倍8400万枚発行される設定ですが、
モナコインはさらにその2倍1億6800万枚発行される設定がされています。

```
-static const int64 MAX_MONEY = 84000000 * COIN;
+static const int64 MAX_MONEY = 168000000 * COIN;
```


### ジェネシスブロックの設定

>https://github.com/tumf/litecoin/commit/649c8152289b815ffa4992f777f7ce1a1a299092

ブロックチェインの起点となるジェネシスブロックを設定します。(設定の仕方は後編)


### 無料送金の条件

>https://github.com/tumf/litecoin/commit/a8d8c482dd32a17955f7ba40094ba559593b2639

無料送金の資格を以下の式で決めています。

> AGE_THRESHOLD = COIN_IN_SATOSHIS * BLOCKS_PER_DAY / TYPICAL_TX_SIZE_IN_BYTES

モナコインは、1.5分に1ブロック発見されるように`Difficulty`が決定されるため、
`BLOCKS_PER_DAY`は `24(時間) * 60(分) / 1.5 = 960` が設定されています。

```
-        return dPriority > COIN * 576 / 250;
+        return dPriority > COIN * 960 / 250;
```

>参考
>https://github.com/wregab/ltclectrum/wiki/Litecoin-algorithm-for-transaction-fees

### マイナー報酬

>https://github.com/tumf/litecoin/commit/e9e7d0609b0eddd70ba5862932b1ab7204337229

ライトコインでは4年毎にマイナー報酬が半額になるが、モナコインでは3年毎に変更されています。

### Difficultyの設定アルゴリズム

>https://github.com/tumf/litecoin/commit/cc9763282b3afcb32d0394175133f2d95333cfb8

ブロックの発見スピードをライトコインが平均2.5分からモナコインでは1.5分に変更されています。

また、モナコインでは、80000ブロック〜140000ブロックだけ別のDifficulty設定アルゴリズムを使っていましたが、そのための変更が殆どのようです。

### Alert受信チェック用の公開鍵

>https://github.com/tumf/litecoin/commit/721a6a52ef3a6f0e28183169c8728f58e2fbfce3

プログラマからのお知らせを検証するための公開鍵を設定します。ソフトウェアのアップデート情報等が流されます。

> 参考:
> https://en.bitcoin.it/wiki/Alerts


### 単純な表現揺れ

> https://github.com/tumf/litecoin/commit/97455c51f21458bc8f747933aa110ed0232dda2e

ファイルの末尾に改行があるかないかなど本質的には変わらない部分

> https://github.com/tumf/litecoin/commit/6fc1dd749fb9e80fb32d2b87791e17720c47d1a5

バージョン表記など

### Copyright

> https://github.com/tumf/litecoin/commit/7fa85292d0eed9b6a480456a1520301ad8d625fb#diff-0

変更点のあるソースコードの著作権表示を追加しています。


------------------------

以上のように意外と修正点は少なくて済みそうです。後編では実際にオレオレコインを実装してみたいと思います。
勉強しながら調べたので間違い・勘違いあるかと思います、お気づきの点がありましたらコメント欄などでご指摘いただけるとありがたいです。

> 参考:
> https://bitcointalk.org/index.php?topic=225690.0