しゅーと (@shutingrz)
しゅーと (@shutingrz)
Security researcher
Apr 29, 2019 2 min read

自作仮想通貨入門(9) - ブロックデータのマジックバイト変更

※この章では src/chainparams.cpp を変更します。

あまり話題にならないものの仮想通貨では極めて重要な、ブロックデータのマジックバイトを変更します。

ビットコインプロトコルにはブロックに関するデータを含みますが、そのデータを示すためのマジックバイトが存在します。 それが以下の記載です。

        pchMessageStart[0] = 0xfb;
        pchMessageStart[1] = 0xc0;
        pchMessageStart[2] = 0xb6;
        pchMessageStart[3] = 0xdb;

このデータは誤って文字として解釈されないように、ASCII でも UTF-8 でも定義されていない適当な32bitの値になっています。
この値はLitecoinのブロックのプレフィックスになるので、自作仮想通貨のメッセージであることを示せるように数値を少し変える必要があります。

変更する際は、そのバイトがASCII でも UTF-8 でも定義されていない適当な32bitの値であるかどうか、また他の仮想通貨のマジックバイトと被っていないかを確認しておいてください。

なお中途半端に移植されたアルトコインはしばしばこの値がLitecoinと同様になっているようです。

These are the magic bytes. They serve a variety of purposes, including indicating the proper network, and serving as a start for explorers such as Abe to parse. Some altcoins that don't change the magic bytes (n00b launches) have problems such as trying to download the litecoin blockchain on start.

As for what "pchMessage" means exactly, I don't know.

For more info, see http://james.lab6.com/2012/01/12/bitcoin-285-bytes-that-changed-the-world/

https://bitcointalk.org/index.php?topic=445508.0

この値が他の仮想通貨のマジックバイトと同一であれば、仮想通貨同士の見分けがつかず別の仮想通貨のノードと衝突を起こすかもしれません。
ただ各仮想通貨でだいたいポート番号が異なっているため問題が表にでることは少ないと思いますが・・・。

ソースコードの変更作業

Mainnet

pchMessageStart[1]を 0xc5 に変えることにします。

        pchMessageStart[0] = 0xfb;
        pchMessageStart[1] = 0xc5;
        pchMessageStart[2] = 0xb6;
        pchMessageStart[3] = 0xdb;

Testnet

pchMessageStart[1]を 0xc6 に変えることにします。

        pchMessageStart[0] = 0xfb;
        pchMessageStart[1] = 0xc6;
        pchMessageStart[2] = 0xb6;
        pchMessageStart[3] = 0xdb;

Regtest

pchMessageStart[1]を 0xc7 に変えることにします。

        pchMessageStart[0] = 0xfb;
        pchMessageStart[1] = 0xc7;
        pchMessageStart[2] = 0xb6;
        pchMessageStart[3] = 0xdb;

以上でソースコードの変更は終わりです。 ここまでの作業を振り返るとわかるとおり、自作仮想通貨を作成するために必要な変更作業って実はchainparams.cppの変更で殆どが済んでしまうんです。
BitcoinCoreがいかにコード的に洗練されているかがわかりますね。

最後の章は著作権表示の記載です。