// Copyright (c) 2016 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. package fullblocktests import ( "encoding/hex" "math/big" "time" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" ) // newHashFromStr converts the passed big-endian hex string into a // wire.Hash. It only differs from the one available in chainhash in that // it panics on an error since it will only (and must only) be called with // hard-coded, and therefore known good, hashes. func newHashFromStr(hexStr string) *chainhash.Hash { hash, err := chainhash.NewHashFromStr(hexStr) if err != nil { panic(err) } return hash } // fromHex converts the passed hex string into a byte slice and will panic if // there is an error. This is only provided for the hard-coded constants so // errors in the source code can be detected. It will only (and must only) be // called for initialization purposes. func fromHex(s string) []byte { r, err := hex.DecodeString(s) if err != nil { panic("invalid hex in source file: " + s) } return r } var ( // bigOne is 1 represented as a big.Int. It is defined here to avoid // the overhead of creating it multiple times. bigOne = big.NewInt(1) // regressionPowLimit is the highest proof of work value a Bitcoin block // can have for the regression test network. It is the value 2^255 - 1. regressionPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 255), bigOne) // regTestGenesisBlock defines the genesis block of the block chain which serves // as the public transaction ledger for the regression test network. regTestGenesisBlock = wire.MsgBlock{ Header: wire.BlockHeader{ Version: 1, PrevBlock: *newHashFromStr("0000000000000000000000000000000000000000000000000000000000000000"), MerkleRoot: *newHashFromStr("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"), Timestamp: time.Unix(1296688602, 0), // 2011-02-02 23:16:42 +0000 UTC Bits: 0x207fffff, // 545259519 [7fffff0000000000000000000000000000000000000000000000000000000000] Nonce: 2, }, Transactions: []*wire.MsgTx{{ Version: 1, TxIn: []*wire.TxIn{{ PreviousOutPoint: wire.OutPoint{ Hash: chainhash.Hash{}, Index: 0xffffffff, }, SignatureScript: fromHex("04ffff001d010445" + "5468652054696d65732030332f4a616e2f" + "32303039204368616e63656c6c6f72206f" + "6e206272696e6b206f66207365636f6e64" + "206261696c6f757420666f72206261686b73"), Sequence: 0xffffffff, }}, TxOut: []*wire.TxOut{{ Value: 0, PkScript: fromHex("4104678afdb0fe5548271967f1" + "a67130b7105cd6a828e03909a67962e0ea1f" + "61deb649f6bc3f4cef38c4f35504e51ec138" + "c4f35504e51ec112de5c384df7ba0b8d578a" + "4c702b6bf11d5fac"), }}, LockTime: 0, }}, } ) // regressionNetParams defines the network parameters for the regression test // network. // // NOTE: The test generator intentionally does not use the existing definitions // in the chaincfg package since the intent is to be able to generate known // good tests which exercise that code. Using the chaincfg parameters would // allow them to change out from under the tests potentially invalidating them. var regressionNetParams = &chaincfg.Params{ Name: "regtest", Net: wire.TestNet, DefaultPort: "18444", // Chain parameters GenesisBlock: ®TestGenesisBlock, GenesisHash: newHashFromStr("5bec7567af40504e0994db3b573c186fffcc4edefe096ff2e58d00523bd7e8a6"), PowLimit: regressionPowLimit, PowLimitBits: 0x207fffff, CoinbaseMaturity: 100, BIP0034Height: 100000000, // Not active - Permit ver 1 blocks BIP0065Height: 1351, // Used by regression tests BIP0066Height: 1251, // Used by regression tests SubsidyReductionInterval: 150, TargetTimespan: time.Hour * 24 * 14, // 14 days TargetTimePerBlock: time.Minute * 10, // 10 minutes RetargetAdjustmentFactor: 4, // 25% less, 400% more ReduceMinDifficulty: true, MinDiffReductionTime: time.Minute * 20, // TargetTimePerBlock * 2 GenerateSupported: true, // Checkpoints ordered from oldest to newest. Checkpoints: nil, // Mempool parameters RelayNonStdTxs: true, // Address encoding magics PubKeyHashAddrID: 0x6f, // starts with m or n ScriptHashAddrID: 0xc4, // starts with 2 PrivateKeyID: 0xef, // starts with 9 (uncompressed) or c (compressed) // BIP32 hierarchical deterministic extended key magics HDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, // starts with tprv HDPublicKeyID: [4]byte{0x04, 0x35, 0x87, 0xcf}, // starts with tpub // BIP44 coin type used in the hierarchical deterministic path for // address generation. HDCoinType: 1, }