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.
426 lines
16 KiB
426 lines
16 KiB
// 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 |
|
}
|
|
|