pycoind で testnetにつなげれるよう設定ファイル?を変更するところまで

技術メモ

pycoindがmainnetにデフォルトだとつなぎにいってしまうので testnet につなぐ方法がないか見ていると・・・

https://github.com/ricmoo/pycoind/blob/33a600e617ec89c5a0f680ce7725b777d6176ea8/pycoind/coins/bitcoin.py#L81

#class BitcoinTestnet(Bitcoin):
#    name = "bitcoin-testnet"
#    address_version = chr(111)
#    magic = "xfaxbfxb5xda"

#class BitcoinTestnet3(Bitcoin):
#    name = "bitcoin-testnet3"
#    port = 18333
#    magic = "x0bx11x09x07"
#    alert_public_key = '04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a'.decode('hex')

どうも、testnet対応ソース部分がコメントアウトされている、、、
自分でソース修正するしかなさそう、、、

元のソースが以下なのだが1個1個testnet用に改造してみる。

class Bitcoin(coin.Coin):

    name = "bitcoin"

    # All symbols the coin uses and "primary" symbol
    symbols = ['BTC', 'XBT']
    symbol = symbols[0]

    # See: https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery
    #      https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L143
    dns_seeds = [
        ("seed.bitcoin.sipa.be", 8333),
        ("dnsseed.bluematt.me", 8333),
        ("dnsseed.bitcoin.dashjr.org", 8333),
        ("seed.bitcoinstats.com", 8333),
        ("seed.bitnodes.io", 8333),
        ("bitseed.xf2.org", 8333),
    ]

    port = 8333
    rpc_port = 8332

    genesis_version = 1
    genesis_block_hash = '6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000'.decode('hex')
    genesis_merkle_root = '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a'.decode('hex')
    genesis_timestamp = 1231006505
    genesis_bits = 486604799
    genesis_nonce = 2083236893

    magic = 'xf9xbexb4xd9'

    address_version = chr(0)

    alert_public_key = '04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284'.decode('hex')

    # Not sure if these will be needed later... from chainparams
    secret_key = chr(239)
    ext_public_key = "".join(chr(i) for i in (0x04, 0x35, 0x87, 0xCF))
    ext_secret_key = "".join(chr(i) for i in (0x04, 0x35, 0x83, 0x94))

    script_address = chr(5)

    block_height_guess = [
        ('blockchain.info', util.fetch_url_json_path_int('https://blockchain.info/latestblock', 'height')),
        ('blockexplorer.com', util.fetch_url_int('https://blockexplorer.com/q/getblockcount')),
        ('blockr.io', util.fetch_url_json_path_int('http://btc.blockr.io/api/v1/coin/info', 'data/last_block/nb')),
        ('chain.so', util.fetch_url_json_path_int('https://chain.so/api/v2/get_info/BTC', 'data/blocks')),
    ]

c++のリファレンス実装でいうと

https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L75

のあたり。

上から順に見ていく

DNS部分

    # See: https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery
    #      https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L143
    dns_seeds = [
        ("seed.bitcoin.sipa.be", 8333),
        ("dnsseed.bluematt.me", 8333),
        ("dnsseed.bitcoin.dashjr.org", 8333),
        ("seed.bitcoinstats.com", 8333),
        ("seed.bitnodes.io", 8333),
        ("bitseed.xf2.org", 8333),
    ]

の部分。p2pを探しにいくためのdnsサーバーだと思われるが、これをtestnet用に変更する。

mainnetのc++実装部分は以下なので
https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L127

        vSeeds.emplace_back("seed.bitcoin.sipa.be", true); // Pieter Wuille, only supports x1, x5, x9, and xd
        vSeeds.emplace_back("dnsseed.bluematt.me", true); // Matt Corallo, only supports x9
        vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org", false); // Luke Dashjr
        vSeeds.emplace_back("seed.bitcoinstats.com", true); // Christian Decker, supports x1 - xf
        vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch", true); // Jonas Schnelli, only supports x1, x5, x9, and xd
        vSeeds.emplace_back("seed.btc.petertodd.org", true); // Peter Todd, only supports x1, x5, x9, and xd

これのtestnetの部分を探すと以下。

https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L228

        // nodes with support for servicebits filtering should be at the top
        vSeeds.emplace_back("testnet-seed.bitcoin.jonasschnelli.ch", true);
        vSeeds.emplace_back("seed.tbtc.petertodd.org", true);
        vSeeds.emplace_back("testnet-seed.bluematt.me", false);
        vSeeds.emplace_back("testnet-seed.bitcoin.schildbach.de", false);

これにならって修正すると

    # See: https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery
    #      https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L143
    dns_seeds = [
        ("testnet-seed.bitcoin.jonasschnelli.ch", port),
        ("seed.tbtc.petertodd.org", port),
        ("testnet-seed.bluematt.me", port),
        ("testnet-seed.bitcoin.schildbach.de", port),
    ]

のような感じだろうか。 port はあとで変数にするので 書き換えている。

Port部分

    port = 18333  # 8333
    rpc_port = 18332 # 8332

Genesis部分

ジェネシスブロック部分。
C++ mainnet

        assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));

C++ testnet

        assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"));

pycoind mainnet。一見違うように見えるが、Little Endian のため逆になっている。

    genesis_block_hash = '6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000'.decode('hex')

pycoind testnet はどうなるかというと・・・
http://web.save-editor.com/tool/wse_hex.html
こちらのサイトを使って出してしまう。

    genesis_block_hash = '43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000'.decode('hex')

残りもリファレンス実装のtestnet部分を見ながら変更すると・・・

    genesis_version = 1  # 変わらず
    genesis_block_hash = '43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000'.decode('hex')
    genesis_merkle_root = '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a'.decode('hex')  # 変わらず
    genesis_timestamp = 1296688602
    genesis_bits = 486604799   # 変わらず
    genesis_nonce = 414098458  

その他

以下は pycoind の “#class BitcoinTestnet3(Bitcoin):” の部分にのっていた

    magic = ' xFAxBFxB5xDA'
    alert_public_key = '04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a'.decode('hex')

以下のtestnetのブロック長はなんとか探し出せた。

    block_height_guess = [
        ('blockexplorer.com', util.fetch_url_json_path_int('https://testnet.blockexplorer.com/api/status?q=getBlockCount', 'blockcount')),
    ]

これでpycoindでtestnetが動くか調べてみる。

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならZaifがおすすめです。

特に国内でETHを購入するなら、アルトコインでも板取引に対応しているZaif(ザイフ)が割安なのでよいですよ。

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Ethereum(イーサリアム)
Ethereumの開発用ツールリストが公開されていた!

ALISのCTO石井さんがつぶやいてたんですが とてもありがたい #Ethereum 開発ツールの一 …

技術メモ
Counterpartyの環境構築が大変という話

暗号通貨の独自通貨を作ろうとするとEthereumが有名で簡単ですが、BitcoinでもCounte …

Ethereum(イーサリアム)
Error: The contract code couldn’t be stored, please check your gas amount.

ALISのICOソースのzeppelinバージョンを1.2から1.8にあげようとしたときにはまったエ …