Bitcoin

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

More than 3 years have passed since last update.

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

ビットコイン・ライトコインを始めとする分散暗号通貨は取引されているだけでも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

コメントでは、モナコイン用アドレスはMNで始まるように記載がありますが、
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_DAY24(時間) * 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