mirror of
https://github.com/btcsuite/btcd.git
synced 2025-02-23 22:47:01 +01:00
164 lines
5.4 KiB
Go
164 lines
5.4 KiB
Go
|
package btcnet
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"math/big"
|
||
|
|
||
|
"github.com/conformal/btcwire"
|
||
|
)
|
||
|
|
||
|
// 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)
|
||
|
)
|
||
|
|
||
|
// 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 btcwire.BitcoinNet
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock *btcwire.MsgBlock
|
||
|
GenesisHash *btcwire.ShaHash
|
||
|
PowLimit *big.Int
|
||
|
PowLimitBits uint32
|
||
|
SubsidyHalvingInterval int32
|
||
|
|
||
|
// 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
|
||
|
}
|
||
|
|
||
|
// MainNetParams defines the network parameters for the main Bitcoin network.
|
||
|
var MainNetParams = Params{
|
||
|
Name: "mainnet",
|
||
|
Net: btcwire.MainNet,
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: &btcwire.GenesisBlock,
|
||
|
GenesisHash: &btcwire.GenesisHash,
|
||
|
PowLimit: mainPowLimit,
|
||
|
PowLimitBits: 0x1d00ffff,
|
||
|
SubsidyHalvingInterval: 210000,
|
||
|
|
||
|
// Encoding magics
|
||
|
PubKeyHashAddrID: 0x00,
|
||
|
ScriptHashAddrID: 0x05,
|
||
|
PrivateKeyID: 0x80,
|
||
|
}
|
||
|
|
||
|
// 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: btcwire.TestNet,
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: &btcwire.TestNetGenesisBlock,
|
||
|
GenesisHash: &btcwire.TestNetGenesisHash,
|
||
|
PowLimit: regressionPowLimit,
|
||
|
PowLimitBits: 0x207fffff,
|
||
|
SubsidyHalvingInterval: 150,
|
||
|
|
||
|
// Encoding magics
|
||
|
PubKeyHashAddrID: 0x6f,
|
||
|
ScriptHashAddrID: 0xc4,
|
||
|
PrivateKeyID: 0xef,
|
||
|
}
|
||
|
|
||
|
// 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: "testnet",
|
||
|
Net: btcwire.TestNet3,
|
||
|
|
||
|
// Chain parameters
|
||
|
GenesisBlock: &btcwire.TestNet3GenesisBlock,
|
||
|
GenesisHash: &btcwire.TestNet3GenesisHash,
|
||
|
PowLimit: testNet3PowLimit,
|
||
|
PowLimitBits: 0x1d00ffff,
|
||
|
SubsidyHalvingInterval: 210000,
|
||
|
|
||
|
// Encoding magics
|
||
|
PubKeyHashAddrID: 0x6f,
|
||
|
ScriptHashAddrID: 0xc4,
|
||
|
PrivateKeyID: 0xef,
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
// ErrUnknownNet describes an error where the network parameters for a
|
||
|
// network cannot be looked up because the network is non-standard and
|
||
|
// is not registered into this package.
|
||
|
//
|
||
|
// This will be removed when ParamsForNet is eventually removed.
|
||
|
ErrUnknownNet = errors.New("unknown Bitcoin network")
|
||
|
|
||
|
// 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.
|
||
|
//
|
||
|
// This will be removed when Register is eventually removed.
|
||
|
ErrDuplicateNet = errors.New("duplicate Bitcoin network")
|
||
|
)
|
||
|
|
||
|
var nets = map[btcwire.BitcoinNet]*Params{
|
||
|
btcwire.MainNet: &MainNetParams,
|
||
|
btcwire.TestNet: &RegressionNetParams,
|
||
|
btcwire.TestNet3: &TestNet3Params,
|
||
|
}
|
||
|
|
||
|
// ParamsForNet returns the network parameters for a Bitcoin network, or
|
||
|
// ErrUnknownNet if the network is not a default network (mainnet, regtest,
|
||
|
// or testnet3) and not registered into the package with Register.
|
||
|
//
|
||
|
// This should be considered an unstable API and will be removed when all other
|
||
|
// Conformal btc* packages (btcwire not included) are updated from using
|
||
|
// btcwire.BitcoinNet to *Params.
|
||
|
func ParamsForNet(net btcwire.BitcoinNet) (*Params, error) {
|
||
|
params, ok := nets[net]
|
||
|
if !ok {
|
||
|
return nil, ErrUnknownNet
|
||
|
}
|
||
|
return params, nil
|
||
|
}
|
||
|
|
||
|
// Register registers the network parameters for a Bitcoin network. This may
|
||
|
// error with ErrDuplicateNet if the network is already registered.
|
||
|
//
|
||
|
// 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.
|
||
|
//
|
||
|
// This should be considered an unstable API and will be removed when all other
|
||
|
// Conformal btc* packages (btcwire not included) are updated from using
|
||
|
// btcwire.BitcoinNet to *Params.
|
||
|
func Register(params *Params) error {
|
||
|
if _, ok := nets[params.Net]; ok {
|
||
|
return ErrDuplicateNet
|
||
|
}
|
||
|
nets[params.Net] = params
|
||
|
return nil
|
||
|
}
|