オレオレコインの作り方(前編)
ビットコイン・ライトコインを始めとする分散暗号通貨は取引されているだけでも200種類以上あると言います。
これらのビットコイン派生コイン(altcoin)の実態はオープンソースで開発されているP2Pソフトウェアで、
最初にC++で実装されたbitcoindをベースに作られています。
altocoinがたくさん作られている上に、独自のコインを作るサービスもあることから、技術的には難しくないことは予想できます。そこで、実際にライトコインをベースにaltcoinをつくってみようと思い調査を始めました。
調査方法
モナコインはライトコイン派生のコインです。モナコインのソースとライトコインのソースを比較することで修正ポイントを洗い出しました。実際にはライトコインのgithubのリポジトリのなかのsrc
ディレクトリにモナコインのソースを上書きして比較します。この時、ユーザインタフェース(Qt)部分は無視しました。作業に使ったリポジトリを見ていただければわかりますが地道な比較作業です。
変更点
本調査により洗い出された変更点を以下に列挙します。
名称部分
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によると
M
から始まるアドレスのみになっているようです(コメントの間違い?)
チェックポイントのメンテナンス
チェックポイントについては以下を参考にしてください。
ブロックチェインのある時点のハッシュをソースコード内に埋め込みます。
ライトコインではちょくちょくメンテナンスされているのですが、
モナコインではこの部分まだメンテナンスされていません。
初期接続ノードの変更
ウォレットがP2Pに接続するときに最初に接続する相手をカスタマイズしています。
初期接続ノードサーバ
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://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://github.com/tumf/litecoin/commit/97455c51f21458bc8f747933aa110ed0232dda2e
ファイルの末尾に改行があるかないかなど本質的には変わらない部分
https://github.com/tumf/litecoin/commit/6fc1dd749fb9e80fb32d2b87791e17720c47d1a5
バージョン表記など
Copyright
https://github.com/tumf/litecoin/commit/7fa85292d0eed9b6a480456a1520301ad8d625fb#diff-0
変更点のあるソースコードの著作権表示を追加しています。
以上のように意外と修正点は少なくて済みそうです。後編では実際にオレオレコインを実装してみたいと思います。
勉強しながら調べたので間違い・勘違いあるかと思います、お気づきの点がありましたらコメント欄などでご指摘いただけるとありがたいです。