You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
427 lines
16 KiB
427 lines
16 KiB
9 years ago
|
// Copyright (c) 2014 The btcsuite developers
|
||
|
// Use of this source code is governed by an ISC
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package chaincfg
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"math/big"
|
||
|
|
||
|
"github.com/btcsuite/btcd/wire"
|
||
|
)
|
||
|
|
||
|
// These variables are the chain proof-of-work limit parameters for each default
|
||
|
// network.
|
||
|
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)
|
||
|
|
||
|
// mainPowLimit is the highest proof of work value a Bitcoin block can
|
||
|
// have for the main network. It is the value 2^224 - 1.
|
||
|
mainPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 224), bigOne)
|
||
|
|
||
|
// 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)
|
||
|
|
||
|
// testNet3PowLimit is the highest proof of work value a Bitcoin block
|
||
|
// can have for the test network (version 3). It is the value
|
||
|
// 2^224 - 1.
|
||
|
testNet3PowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 224), bigOne)
|
||
|
|
||
|
// simNetPowLimit is the highest proof of work value a Bitcoin block
|
||
|
// can have for the simulation test network. It is the value 2^255 - 1.
|
||
|
simNetPowLimit = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 255), bigOne)
|
||
|
)
|
||
|
|
||
|
// Checkpoint identifies a known good point in the block chain. Using
|
||
|
// checkpoints allows a few optimizations for old blocks during initial download
|
||
|
// and also prevents forks from old blocks.
|
||
|
//
|
||
|
// Each checkpoint is selected based upon several factors. See the
|
||
|
// documentation for blockchain.IsCheckpointCandidate for details on the
|
||
|
// selection criteria.
|
||
|
type Checkpoint struct {
|
||
|
Height int64
|
||
|
Hash *wire.ShaHash
|
||
|
}
|
||
|
|
||
|
// Params defines a Bitcoin network by its parameters. These parameters may be
|
||
|
// used by Bitcoin applications to differentiate networks as well as addresses
|
||
|
// and keys for one network from those intended for use on another network.
|
||
|
type Params struct {
|
||
|
Name string
|
||
|
Net wire.BitcoinNet
|
||
|
DefaultPort string
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock *wire.MsgBlock
|
||
|
GenesisHash *wire.ShaHash
|
||
|
PowLimit *big.Int
|
||
|
PowLimitBits uint32
|
||
|
SubsidyHalvingInterval int32
|
||
|
ResetMinDifficulty bool
|
||
|
GenerateSupported bool
|
||
|
|
||
|
// Checkpoints ordered from oldest to newest.
|
||
|
Checkpoints []Checkpoint
|
||
|
|
||
|
// Enforce current block version once network has
|
||
|
// upgraded. This is part of BIP0034.
|
||
|
BlockEnforceNumRequired uint64
|
||
|
|
||
|
// Reject previous block versions once network has
|
||
|
// upgraded. This is part of BIP0034.
|
||
|
BlockRejectNumRequired uint64
|
||
|
|
||
|
// The number of nodes to check. This is part of BIP0034.
|
||
|
BlockUpgradeNumToCheck uint64
|
||
|
|
||
|
// Mempool parameters
|
||
|
RelayNonStdTxs bool
|
||
|
|
||
|
// Address encoding magics
|
||
|
PubKeyHashAddrID byte // First byte of a P2PKH address
|
||
|
ScriptHashAddrID byte // First byte of a P2SH address
|
||
|
PrivateKeyID byte // First byte of a WIF private key
|
||
|
|
||
|
// BIP32 hierarchical deterministic extended key magics
|
||
|
HDPrivateKeyID [4]byte
|
||
|
HDPublicKeyID [4]byte
|
||
|
|
||
|
// BIP44 coin type used in the hierarchical deterministic path for
|
||
|
// address generation.
|
||
|
HDCoinType uint32
|
||
|
}
|
||
|
|
||
|
// MainNetParams defines the network parameters for the main Bitcoin network.
|
||
|
var MainNetParams = Params{
|
||
|
Name: "mainnet",
|
||
|
Net: wire.MainNet,
|
||
|
DefaultPort: "8333",
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: &genesisBlock,
|
||
|
GenesisHash: &genesisHash,
|
||
|
PowLimit: mainPowLimit,
|
||
|
PowLimitBits: 0x1d00ffff,
|
||
|
SubsidyHalvingInterval: 210000,
|
||
|
ResetMinDifficulty: false,
|
||
|
GenerateSupported: false,
|
||
|
|
||
|
// Checkpoints ordered from oldest to newest.
|
||
|
Checkpoints: []Checkpoint{
|
||
|
{11111, newShaHashFromStr("0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")},
|
||
|
{33333, newShaHashFromStr("000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")},
|
||
|
{74000, newShaHashFromStr("0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")},
|
||
|
{105000, newShaHashFromStr("00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")},
|
||
|
{134444, newShaHashFromStr("00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")},
|
||
|
{168000, newShaHashFromStr("000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")},
|
||
|
{193000, newShaHashFromStr("000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")},
|
||
|
{210000, newShaHashFromStr("000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")},
|
||
|
{216116, newShaHashFromStr("00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")},
|
||
|
{225430, newShaHashFromStr("00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")},
|
||
|
{250000, newShaHashFromStr("000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")},
|
||
|
{267300, newShaHashFromStr("000000000000000a83fbd660e918f218bf37edd92b748ad940483c7c116179ac")},
|
||
|
{279000, newShaHashFromStr("0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")},
|
||
|
{300255, newShaHashFromStr("0000000000000000162804527c6e9b9f0563a280525f9d08c12041def0a0f3b2")},
|
||
|
{319400, newShaHashFromStr("000000000000000021c6052e9becade189495d1c539aa37c58917305fd15f13b")},
|
||
|
{343185, newShaHashFromStr("0000000000000000072b8bf361d01a6ba7d445dd024203fafc78768ed4368554")},
|
||
|
{352940, newShaHashFromStr("000000000000000010755df42dba556bb72be6a32f3ce0b6941ce4430152c9ff")},
|
||
|
},
|
||
|
|
||
|
// Enforce current block version once majority of the network has
|
||
|
// upgraded.
|
||
|
// 75% (750 / 1000)
|
||
|
// Reject previous block versions once a majority of the network has
|
||
|
// upgraded.
|
||
|
// 95% (950 / 1000)
|
||
|
BlockEnforceNumRequired: 750,
|
||
|
BlockRejectNumRequired: 950,
|
||
|
BlockUpgradeNumToCheck: 1000,
|
||
|
|
||
|
// Mempool parameters
|
||
|
RelayNonStdTxs: false,
|
||
|
|
||
|
// Address encoding magics
|
||
|
PubKeyHashAddrID: 0x00, // starts with 1
|
||
|
ScriptHashAddrID: 0x05, // starts with 3
|
||
|
PrivateKeyID: 0x80, // starts with 5 (uncompressed) or K (compressed)
|
||
|
|
||
|
// BIP32 hierarchical deterministic extended key magics
|
||
|
HDPrivateKeyID: [4]byte{0x04, 0x88, 0xad, 0xe4}, // starts with xprv
|
||
|
HDPublicKeyID: [4]byte{0x04, 0x88, 0xb2, 0x1e}, // starts with xpub
|
||
|
|
||
|
// BIP44 coin type used in the hierarchical deterministic path for
|
||
|
// address generation.
|
||
|
HDCoinType: 0,
|
||
|
}
|
||
|
|
||
|
// RegressionNetParams defines the network parameters for the regression test
|
||
|
// Bitcoin network. Not to be confused with the test Bitcoin network (version
|
||
|
// 3), this network is sometimes simply called "testnet".
|
||
|
var RegressionNetParams = Params{
|
||
|
Name: "regtest",
|
||
|
Net: wire.TestNet,
|
||
|
DefaultPort: "18444",
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: ®TestGenesisBlock,
|
||
|
GenesisHash: ®TestGenesisHash,
|
||
|
PowLimit: regressionPowLimit,
|
||
|
PowLimitBits: 0x207fffff,
|
||
|
SubsidyHalvingInterval: 150,
|
||
|
ResetMinDifficulty: true,
|
||
|
GenerateSupported: true,
|
||
|
|
||
|
// Checkpoints ordered from oldest to newest.
|
||
|
Checkpoints: nil,
|
||
|
|
||
|
// Enforce current block version once majority of the network has
|
||
|
// upgraded.
|
||
|
// 75% (750 / 1000)
|
||
|
// Reject previous block versions once a majority of the network has
|
||
|
// upgraded.
|
||
|
// 95% (950 / 1000)
|
||
|
BlockEnforceNumRequired: 750,
|
||
|
BlockRejectNumRequired: 950,
|
||
|
BlockUpgradeNumToCheck: 1000,
|
||
|
|
||
|
// 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,
|
||
|
}
|
||
|
|
||
|
// TestNet3Params defines the network parameters for the test Bitcoin network
|
||
|
// (version 3). Not to be confused with the regression test network, this
|
||
|
// network is sometimes simply called "testnet".
|
||
|
var TestNet3Params = Params{
|
||
|
Name: "testnet3",
|
||
|
Net: wire.TestNet3,
|
||
|
DefaultPort: "18333",
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: &testNet3GenesisBlock,
|
||
|
GenesisHash: &testNet3GenesisHash,
|
||
|
PowLimit: testNet3PowLimit,
|
||
|
PowLimitBits: 0x1d00ffff,
|
||
|
SubsidyHalvingInterval: 210000,
|
||
|
ResetMinDifficulty: true,
|
||
|
GenerateSupported: false,
|
||
|
|
||
|
// Checkpoints ordered from oldest to newest.
|
||
|
Checkpoints: []Checkpoint{
|
||
|
{546, newShaHashFromStr("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")},
|
||
|
},
|
||
|
|
||
|
// Enforce current block version once majority of the network has
|
||
|
// upgraded.
|
||
|
// 51% (51 / 100)
|
||
|
// Reject previous block versions once a majority of the network has
|
||
|
// upgraded.
|
||
|
// 75% (75 / 100)
|
||
|
BlockEnforceNumRequired: 51,
|
||
|
BlockRejectNumRequired: 75,
|
||
|
BlockUpgradeNumToCheck: 100,
|
||
|
|
||
|
// 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,
|
||
|
}
|
||
|
|
||
|
// SimNetParams defines the network parameters for the simulation test Bitcoin
|
||
|
// network. This network is similar to the normal test network except it is
|
||
|
// intended for private use within a group of individuals doing simulation
|
||
|
// testing. The functionality is intended to differ in that the only nodes
|
||
|
// which are specifically specified are used to create the network rather than
|
||
|
// following normal discovery rules. This is important as otherwise it would
|
||
|
// just turn into another public testnet.
|
||
|
var SimNetParams = Params{
|
||
|
Name: "simnet",
|
||
|
Net: wire.SimNet,
|
||
|
DefaultPort: "18555",
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: &simNetGenesisBlock,
|
||
|
GenesisHash: &simNetGenesisHash,
|
||
|
PowLimit: simNetPowLimit,
|
||
|
PowLimitBits: 0x207fffff,
|
||
|
SubsidyHalvingInterval: 210000,
|
||
|
ResetMinDifficulty: true,
|
||
|
GenerateSupported: true,
|
||
|
|
||
|
// Checkpoints ordered from oldest to newest.
|
||
|
Checkpoints: nil,
|
||
|
|
||
|
// Enforce current block version once majority of the network has
|
||
|
// upgraded.
|
||
|
// 51% (51 / 100)
|
||
|
// Reject previous block versions once a majority of the network has
|
||
|
// upgraded.
|
||
|
// 75% (75 / 100)
|
||
|
BlockEnforceNumRequired: 51,
|
||
|
BlockRejectNumRequired: 75,
|
||
|
BlockUpgradeNumToCheck: 100,
|
||
|
|
||
|
// Mempool parameters
|
||
|
RelayNonStdTxs: true,
|
||
|
|
||
|
// Address encoding magics
|
||
|
PubKeyHashAddrID: 0x3f, // starts with S
|
||
|
ScriptHashAddrID: 0x7b, // starts with s
|
||
|
PrivateKeyID: 0x64, // starts with 4 (uncompressed) or F (compressed)
|
||
|
|
||
|
// BIP32 hierarchical deterministic extended key magics
|
||
|
HDPrivateKeyID: [4]byte{0x04, 0x20, 0xb9, 0x00}, // starts with sprv
|
||
|
HDPublicKeyID: [4]byte{0x04, 0x20, 0xbd, 0x3a}, // starts with spub
|
||
|
|
||
|
// BIP44 coin type used in the hierarchical deterministic path for
|
||
|
// address generation.
|
||
|
HDCoinType: 115, // ASCII for s
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
// ErrDuplicateNet describes an error where the parameters for a Bitcoin
|
||
|
// network could not be set due to the network already being a standard
|
||
|
// network or previously-registered into this package.
|
||
|
ErrDuplicateNet = errors.New("duplicate Bitcoin network")
|
||
|
|
||
|
// ErrUnknownHDKeyID describes an error where the provided id which
|
||
|
// is intended to identify the network for a hierarchical deterministic
|
||
|
// private extended key is not registered.
|
||
|
ErrUnknownHDKeyID = errors.New("unknown hd private extended key bytes")
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
registeredNets = map[wire.BitcoinNet]struct{}{
|
||
|
MainNetParams.Net: struct{}{},
|
||
|
TestNet3Params.Net: struct{}{},
|
||
|
RegressionNetParams.Net: struct{}{},
|
||
|
SimNetParams.Net: struct{}{},
|
||
|
}
|
||
|
|
||
|
pubKeyHashAddrIDs = map[byte]struct{}{
|
||
|
MainNetParams.PubKeyHashAddrID: struct{}{},
|
||
|
TestNet3Params.PubKeyHashAddrID: struct{}{}, // shared with regtest
|
||
|
SimNetParams.PubKeyHashAddrID: struct{}{},
|
||
|
}
|
||
|
|
||
|
scriptHashAddrIDs = map[byte]struct{}{
|
||
|
MainNetParams.ScriptHashAddrID: struct{}{},
|
||
|
TestNet3Params.ScriptHashAddrID: struct{}{}, // shared with regtest
|
||
|
SimNetParams.ScriptHashAddrID: struct{}{},
|
||
|
}
|
||
|
|
||
|
// Testnet is shared with regtest.
|
||
|
hdPrivToPubKeyIDs = map[[4]byte][]byte{
|
||
|
MainNetParams.HDPrivateKeyID: MainNetParams.HDPublicKeyID[:],
|
||
|
TestNet3Params.HDPrivateKeyID: TestNet3Params.HDPublicKeyID[:],
|
||
|
SimNetParams.HDPrivateKeyID: SimNetParams.HDPublicKeyID[:],
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// Register registers the network parameters for a Bitcoin network. This may
|
||
|
// error with ErrDuplicateNet if the network is already registered (either
|
||
|
// due to a previous Register call, or the network being one of the default
|
||
|
// networks).
|
||
|
//
|
||
|
// Network parameters should be registered into this package by a main package
|
||
|
// as early as possible. Then, library packages may lookup networks or network
|
||
|
// parameters based on inputs and work regardless of the network being standard
|
||
|
// or not.
|
||
|
func Register(params *Params) error {
|
||
|
if _, ok := registeredNets[params.Net]; ok {
|
||
|
return ErrDuplicateNet
|
||
|
}
|
||
|
registeredNets[params.Net] = struct{}{}
|
||
|
pubKeyHashAddrIDs[params.PubKeyHashAddrID] = struct{}{}
|
||
|
scriptHashAddrIDs[params.ScriptHashAddrID] = struct{}{}
|
||
|
hdPrivToPubKeyIDs[params.HDPrivateKeyID] = params.HDPublicKeyID[:]
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// IsPubKeyHashAddrID returns whether the id is an identifier known to prefix a
|
||
|
// pay-to-pubkey-hash address on any default or registered network. This is
|
||
|
// used when decoding an address string into a specific address type. It is up
|
||
|
// to the caller to check both this and IsScriptHashAddrID and decide whether an
|
||
|
// address is a pubkey hash address, script hash address, neither, or
|
||
|
// undeterminable (if both return true).
|
||
|
func IsPubKeyHashAddrID(id byte) bool {
|
||
|
_, ok := pubKeyHashAddrIDs[id]
|
||
|
return ok
|
||
|
}
|
||
|
|
||
|
// IsScriptHashAddrID returns whether the id is an identifier known to prefix a
|
||
|
// pay-to-script-hash address on any default or registered network. This is
|
||
|
// used when decoding an address string into a specific address type. It is up
|
||
|
// to the caller to check both this and IsPubKeyHashAddrID and decide whether an
|
||
|
// address is a pubkey hash address, script hash address, neither, or
|
||
|
// undeterminable (if both return true).
|
||
|
func IsScriptHashAddrID(id byte) bool {
|
||
|
_, ok := scriptHashAddrIDs[id]
|
||
|
return ok
|
||
|
}
|
||
|
|
||
|
// HDPrivateKeyToPublicKeyID accepts a private hierarchical deterministic
|
||
|
// extended key id and returns the associated public key id. When the provided
|
||
|
// id is not registered, the ErrUnknownHDKeyID error will be returned.
|
||
|
func HDPrivateKeyToPublicKeyID(id []byte) ([]byte, error) {
|
||
|
if len(id) != 4 {
|
||
|
return nil, ErrUnknownHDKeyID
|
||
|
}
|
||
|
|
||
|
var key [4]byte
|
||
|
copy(key[:], id)
|
||
|
pubBytes, ok := hdPrivToPubKeyIDs[key]
|
||
|
if !ok {
|
||
|
return nil, ErrUnknownHDKeyID
|
||
|
}
|
||
|
|
||
|
return pubBytes, nil
|
||
|
}
|
||
|
|
||
|
// newShaHashFromStr converts the passed big-endian hex string into a
|
||
|
// wire.ShaHash. It only differs from the one available in wire 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 newShaHashFromStr(hexStr string) *wire.ShaHash {
|
||
|
sha, err := wire.NewShaHashFromStr(hexStr)
|
||
|
if err != nil {
|
||
|
// Ordinarily I don't like panics in library code since it
|
||
|
// can take applications down without them having a chance to
|
||
|
// recover which is extremely annoying, however an exception is
|
||
|
// being made in this case because the only way this can panic
|
||
|
// is if there is an error in the hard-coded hashes. Thus it
|
||
|
// will only ever potentially panic on init and therefore is
|
||
|
// 100% predictable.
|
||
|
panic(err)
|
||
|
}
|
||
|
return sha
|
||
|
}
|