しゅーと (@shutingrz)
しゅーと (@shutingrz)
Security researcher
Apr 28, 2019 4 min read

自作仮想通貨入門(5) - 単純な文字列置換

この章からいよいよLitecoinのソースコードに修正を加えていきます。

この章ではソースコードおよび関連ドキュメントに含まれるLitecoin関連の文字列を自作仮想通貨の通貨名に変更します。
この時点でLitecoinのどの名称を自分の仮想通貨の名称に変えるかを決めておきましょう。
また、待ち受けるサーバのポート番号についてもこの章で変更するので、ポート番号についても決めていきます。
ノード待受ポート番号については有名どころの仮想通貨およびその他サーバと被らないように設定しましょう。
RPC接続の待受ポート番号は一般的に自分自身で使うためものでありconfで変えられるので、最悪他の仮想通貨と被っても大丈夫です。

下記にLitecoinとRaccoinの比較表を記載しているので、Raccoinの表記を自分の仮想通貨の表記に置き換えて作業をしてください。

LitecoinとRaccoinの名称比較表

Litecoin Raccoin
正式名称 Litecoin Raccoin
大文字名称 LITECOIN RACCOIN
大文字略称 LTC XRI
小文字名称 litecoin raccoin
小文字略称 ltc xri
1000分の1コイン lites mXRI
100万分の1コイン photon uXRI

LitecoinとRaccoinのP2P待受ポート番号比較表

Litecoin Raccoin
Mainnet 9333/tcp 8883/tcp
Testnet 19335/tcp 19883/tcp
Regtest 19444/tcp 20888/tcp

LitecoinとRaccinのRPCポート番号比較表

Litecoin Raccoin
Mainnet 9332/tcp 8882/tcp
Testnet 19332/tcp 19880/tcp
Regtest 19443/tcp 20887/tcp

文字列置換

実際にソースコードを修正していきます。 git cloneを使ってLitecoinをクローンしたため、単純にgrepを用いたファイル検索・置換を行うと.gitディレクトリ内の書き換えも発生してしまいます。 これを防ぐため、基本的にgitのls-filesサブコマンドを用いて置換を行っていきます。

正式名称の書き換え

$ git ls-files -z | xargs -0 sed -i '' -e 's/Litecoin/Raccoin/g'

大文字略称の書き換え

$ git ls-files -z | xargs -0 sed -i '' -e 's/LITECOIN/RACCOIN/g'

小文字略称の書き換え

gitコマンドではなく、ファイルを指定して置換を行います。

$ cat <<EOF|tr -d ''|tr '\n' '\0'| xargs -0 sed -i '' -e 's/ltc/xri/g'
./contrib/gitian-build.sh
./doc/release-process.md
./src/chainparams.cpp
./test/functional/test_framework/address.py
./test/functional/wallet_bumpfee.py
EOF

コラム:小文字略称の罠

小文字略称で単純な文字列検索・置換をすると意図しない置換が行われます。 具体的には下記ファイルで意図しない置換が行われることを確認しました。

./contrib/gitian-keys/petertodd-key.pgp
./src/leveldb/build_detect_platform
./src/test/data/base58_keys_valid.json
./test/util/data/txcreatemultisig3.json
./test/util/data/txcreateoutpubkey2.json
./test/util/data/txcreateoutpubkey2.json

petertodd-key.pgpファイルに至っては大変な置換が起きます・・・。

-emJqiaQez9pd/5BYtOSG8vLZpAxXfnOgDH/YK6u9WdoX7/RgTAltcoGazmyJHZHj 
+emJqiaQez9pd/5BYtOSG8vLZpAxXfnOgDH/YK6u9WdoX7/RgTAxrioGazmyJHZHj

通貨単位の書き換え

Litecoinの基本通貨単位「LTC」に関しては単純な文字列置換で既に XRI に変更していますが、小数点以下の通貨も名称がつけられているので変更します。

$ sed -i '' -e 's/lites/mXRI/g' ./src/qt/bitcoinunits.cpp
$ sed -i '' -e 's/Lites/mXRI/g' ./src/qt/bitcoinunits.cpp
$ sed -i '' -e 's/photons/uXRI/g' ./src/qt/bitcoinunits.cpp
$ sed -i '' -e 's/Photons/uXRI/g' ./src/qt/bitcoinunits.cpp

ポート番号の書き換え

$ git ls-files | grep -v "doc/release-notes/release-notes-0.15.0.md" | tr '\n' '\0'| xargs -0 sed -i '' -e 's/9333/8883/g'
$ git ls-files | grep -v "src/qt/res/src/network_disabled.svg" | tr '\n' '\0' | xargs -0 sed -i '' -e 's/19335/19883/g'
$ git ls-files -z | xargs -0 sed -i '' -e 's/19444/20888/g'

$ git ls-files -z | xargs -0 sed -i '' -e 's/9332/8882/g'
$ git ls-files -z | xargs -0 sed -i '' -e 's/19332/19880/g'
$ git ls-files -z | xargs -0 sed -i '' -e 's/19443/20887/g'

「9333」と「19335」は 特定のファイルで意図しない部分で偶然一致してしまうので、該当ファイルを除外して置き換えています。

ファイル名の変更

litecoin がファイル名に含まれるものは、manのファイル名とGUIの起動時のスプラッシュ画像です。 renameコマンドはOSやバージョンによって全く挙動が異なるため、念のためmvコマンドで変更します。

$ cd ./doc/man/
$ mv litecoin-cli.1 raccoin-cli.1
$ mv litecoin-qt.1 raccoin-qt.1
$ mv litecoin-tx.1 raccoin-tx.1
$ mv litecoind.1 raccoind.1
$ cd ../../
$ mv ./src/qt/res/icons/litecoin_splash.png ./src/qt/res/icons/raccoin_splash.png

誤った名称変更の再修正

単純な文字列置換では本来変更すべきではない箇所まで変更してしまいます。 例として、下記のようなLitecoinの開発チームが開設したコミュニティやサービスがあります。

また、以下の著作権表示も該当します。

Copyright (C) 2011-2018 The Litecoin Core developers

これらのうち、コミュニティやサービスがリンク切れを起こすものに関しては大きな問題にはならないこと、またこの段階で様々なコミュニティを開設するのは自作仮想通貨を作るうえでは完全に蛇足であることから、ここでの修正はしません。 ただし、著作権表示については誤った表示のままだとソースコードのパクリと勘違いされるため、正しい記載に修正する必要があります。 以下のコマンドを実行し、著作権表示を修正します。

著作権表示の修正

$ git ls-files -z | xargs -0 sed -i '' -e 's/The Raccoin Core developers/The Litecoin Core developers/g'

ここまででソースコードの単純な置換は終了です。

次の章からは置換だけでは終わらない、ビットコインのよりディープな部分を解説しながら変更していきます。