Documentation ¶
Overview ¶
Package chaincfg defines chain configuration parameters. In addition to the main Bitcoin network, which is intended for the transfer of monetary value, there also exists two currently active standard networks: regression test and testnet (version 3). These networks are incompatible with each other (each sharing a different genesis block) and software should handle errors where input intended for one network is used on an application instance running on a different network.
For library packages, chaincfg provides the ability to lookup chain parameters and encoding magics when passed a *Params. Older APIs not updated to the new convention of passing a *Params may lookup the parameters for a wire.BitcoinNet using ParamsForNet, but be aware that this usage is deprecated and will be removed from chaincfg in the future.
For main packages, a (typically global) var may be assigned the address of one of the standard Param vars for use as the application's "active" network. When a network parameter is needed, it may then be looked up through this variable (either directly, or hidden in a library call).
package main import ( "flag" "fmt" "github.com/cybriq/p9/pkg/util" "github.com/cybriq/p9/pkg/chain/config" ) var testnet = flag.Bool("testnet", false, "operate on the testnet Bitcoin network") // By default (without -testnet), use mainnet. var chainParams = &chaincfg.MainNetParams func main() { flag.Parse() // Modify active network parameters if operating on testnet. if *testnet { chainParams = &chaincfg.TestNet3Params } // later... // Create and print new payment address, specific to the active network. pubKeyHash := make([]byte, 20) addr, e := util.NewAddressPubKeyHash(pubKeyHash, chainParams) if e != nil { Log.Fatal <- err.Error() } fmt.Println(addr) }
If an application does not use one of the three standard Bitcoin networks, a new Params struct may be created which defines the parameters for the non-standard network. As a general rule of thumb, all network parameters should be unique to the network, but parameter collisions can still occur (unfortunately, this is the case with regtest and testnet3 sharing magics).
Index ¶
- Variables
- func BigToCompact(n *big.Int) uint32
- func CompactToBig(compact uint32) *big.Int
- func HDPrivateKeyToPublicKeyID(id []byte) ([]byte, error)
- func IsBech32SegwitPrefix(prefix string) bool
- func IsPubKeyHashAddrID(id byte) bool
- func IsScriptHashAddrID(id byte) bool
- func Register(params *Params) (e error)
- type Checkpoint
- type DNSSeed
- type Params
Constants ¶
This section is empty.
Variables ¶
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") // MainPowLimit is the pre-hardfork pow limit MainPowLimit = mainPowLimit // MainPowLimitBits is the bits version of the above MainPowLimitBits = BigToCompact(&MainPowLimit) // ScryptPowLimit is the pre-hardfork maximum hash for Scrypt algorithm ScryptPowLimit = scryptPowLimit // ScryptPowLimitBits is the bits version of the above ScryptPowLimitBits = BigToCompact(&scryptPowLimit) // Interval is the number of blocks in the averaging window Interval int64 = 100 // MaxAdjustDown is the percentage hard limit for downwards difficulty adjustment (ie 90%) MaxAdjustDown int64 = 10 // MaxAdjustUp is the percentage hard limit for upwards (ie 120%) MaxAdjustUp int64 = 20 // TargetTimePerBlock is the pre hardfork target time for blocks TargetTimePerBlock int64 = 300 // AveragingInterval is the number of blocks to average (per algorithm) AveragingInterval int64 = 10 // AveragingTargetTimespan is how many seconds for the averaging target interval AveragingTargetTimespan = TargetTimePerBlock * AveragingInterval // TargetTimespan is the base for adjustment TargetTimespan = Interval * TargetTimePerBlock // TestnetInterval is the number of blocks in the averaging window TestnetInterval int64 = 100 // TestnetMaxAdjustDown is the percentage hard limit for downwards difficulty adjustment (ie 90%) TestnetMaxAdjustDown int64 = 10 // TestnetMaxAdjustUp is the percentage hard limit for upwards (ie 120%) TestnetMaxAdjustUp int64 = 20 // TestnetTargetTimePerBlock is the pre hardfork target time for blocks TestnetTargetTimePerBlock int64 = 9 // TestnetAveragingInterval is the number of blocks to average (per algorithm) TestnetAveragingInterval int64 = 1600 // TestnetAveragingTargetTimespan is how many seconds for the averaging target interval TestnetAveragingTargetTimespan = TestnetTargetTimePerBlock * TestnetAveragingInterval // TestnetTargetTimespan is the base for adjustment TestnetTargetTimespan = TestnetInterval * TestnetTargetTimePerBlock )
var F, E, W, I, D, T log.LevelPrinter = log.GetLogPrinterSet(subsystem)
var MainNetParams = Params{ Name: "mainnet", Net: wire.MainNet, DefaultPort: "11047", DNSSeeds: []DNSSeed{ {"seed1.parallelcoin.io", true}, {"seed2.parallelcoin.io", true}, {"seed3.parallelcoin.io", true}, {"seed4.parallelcoin.io", true}, {"seed5.parallelcoin.io", true}, {"185.69.55.35", true}, {"46.28.107.182", true}, {"91.206.16.214", true}, {"157.161.128.62", true}, {"85.15.179.171", true}, {"103.254.148.9", true}, {"144.217.73.92", true}, {"165.227.110.22", true}, {"194.135.88.119", true}, {"73.164.170.207", true}, {"76.176.77.120", true}, {"89.40.12.55", true}, }, GenesisBlock: &genesisBlock, GenesisHash: &genesisHash, PowLimit: &mainPowLimit, PowLimitBits: MainPowLimitBits, CoinbaseMaturity: 100, SubsidyReductionInterval: 250000, TargetTimespan: TargetTimespan, TargetTimePerBlock: TargetTimePerBlock, RetargetAdjustmentFactor: 2, ReduceMinDifficulty: false, MinDiffReductionTime: 0, GenerateSupported: true, Checkpoints: []Checkpoint{}, RuleChangeActivationThreshold: 1916, MinerConfirmationWindow: 2016, RelayNonStdTxs: false, PubKeyHashAddrID: 83, ScriptHashAddrID: 9, PrivateKeyID: 178, HDPrivateKeyID: [4]byte{0x04, 0x88, 0xad, 0xe4}, HDPublicKeyID: [4]byte{0x04, 0x88, 0xb2, 0x1e}, HDCoinType: 0, Interval: Interval, AveragingInterval: AveragingInterval, AveragingTargetTimespan: AveragingTargetTimespan, MaxAdjustDown: MaxAdjustDown, MaxAdjustUp: MaxAdjustUp, TargetTimespanAdjDown: AveragingTargetTimespan * (Interval + MaxAdjustDown) / Interval, MinActualTimespan: 2400, MaxActualTimespan: 3300, ScryptPowLimit: &scryptPowLimit, ScryptPowLimitBits: ScryptPowLimitBits, RPCClientPort: "11048", WalletRPCServerPort: "11046", }
MainNetParams defines the network parameters for the main Bitcoin network.
var RegressionTestParams = Params{ Name: "regtest", Net: wire.TestNet, DefaultPort: "31047", DNSSeeds: []DNSSeed{}, GenesisBlock: ®TestGenesisBlock, GenesisHash: ®TestGenesisHash, PowLimit: regressionPowLimit, PowLimitBits: 0x207fffff, CoinbaseMaturity: 100, SubsidyReductionInterval: 150, TargetTimespan: 30000, TargetTimePerBlock: 300, RetargetAdjustmentFactor: 2, ReduceMinDifficulty: true, MinDiffReductionTime: 300 * 2, GenerateSupported: true, Checkpoints: nil, RuleChangeActivationThreshold: 108, MinerConfirmationWindow: 144, RelayNonStdTxs: true, PubKeyHashAddrID: 0x00, ScriptHashAddrID: 0x05, PrivateKeyID: 0x80, HDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, HDPublicKeyID: [4]byte{0x04, 0x35, 0x87, 0xcf}, HDCoinType: 1, Interval: Interval, AveragingInterval: 10, AveragingTargetTimespan: AveragingTargetTimespan, MaxAdjustDown: MaxAdjustDown, MaxAdjustUp: MaxAdjustUp, TargetTimespanAdjDown: AveragingTargetTimespan * (Interval + MaxAdjustDown) / Interval, MinActualTimespan: AveragingTargetTimespan * (Interval - MaxAdjustUp) / Interval, MaxActualTimespan: AveragingTargetTimespan * (Interval + MaxAdjustDown) / Interval, ScryptPowLimit: &scryptPowLimit, ScryptPowLimitBits: ScryptPowLimitBits, RPCClientPort: "31048", WalletRPCServerPort: "31046", }
RegressionTestParams 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 SimNetParams = Params{ Name: "simnet", Net: wire.SimNet, DefaultPort: "41047", DNSSeeds: []DNSSeed{}, GenesisBlock: &simNetGenesisBlock, GenesisHash: &simNetGenesisHash, PowLimit: simNetPowLimit, PowLimitBits: 0x207fffff, CoinbaseMaturity: 100, SubsidyReductionInterval: 210000, TargetTimespan: 30000, TargetTimePerBlock: 300, RetargetAdjustmentFactor: 2, ReduceMinDifficulty: true, MinDiffReductionTime: time.Minute * 10, GenerateSupported: true, Checkpoints: nil, RuleChangeActivationThreshold: 75, MinerConfirmationWindow: 100, RelayNonStdTxs: true, PubKeyHashAddrID: 0x3f, ScriptHashAddrID: 0x7b, PrivateKeyID: 0x64, HDPrivateKeyID: [4]byte{0x04, 0x20, 0xb9, 0x00}, HDPublicKeyID: [4]byte{0x04, 0x20, 0xbd, 0x3a}, HDCoinType: 115, Interval: 100, AveragingInterval: 10, AveragingTargetTimespan: 10 * 300, MaxAdjustDown: 10, MaxAdjustUp: 20, TargetTimespanAdjDown: 300 * (100 + 10) / 100, MinActualTimespan: 10 * 300 * (100 - 20) / 100, MaxActualTimespan: 10 * 300 * (100 + 10) / 100, ScryptPowLimit: &scryptPowLimit, ScryptPowLimitBits: ScryptPowLimitBits, RPCClientPort: "41048", WalletRPCServerPort: "41046", }
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 routeable rules. This is important as otherwise it would just turn into another public testnet.
var TestNet3Params = Params{ Name: "testnet", Net: wire.TestNet3, DefaultPort: "21047", DNSSeeds: []DNSSeed{}, GenesisBlock: &testNet3GenesisBlock, GenesisHash: &testNet3GenesisHash, PowLimit: &fork.SecondPowLimit, PowLimitBits: fork.SecondPowLimitBits, CoinbaseMaturity: 9, SubsidyReductionInterval: 250000, TargetTimespan: TestnetTargetTimespan, TargetTimePerBlock: TestnetTargetTimePerBlock, RetargetAdjustmentFactor: 2, ReduceMinDifficulty: false, MinDiffReductionTime: 0, GenerateSupported: true, Checkpoints: []Checkpoint{}, RuleChangeActivationThreshold: 2, MinerConfirmationWindow: 2016, RelayNonStdTxs: true, PubKeyHashAddrID: 18, ScriptHashAddrID: 188, PrivateKeyID: 239, HDPrivateKeyID: [4]byte{0x04, 0x35, 0x83, 0x94}, HDPublicKeyID: [4]byte{0x04, 0x35, 0x87, 0xcf}, HDCoinType: 1, Interval: TestnetInterval, AveragingInterval: TestnetAveragingInterval, AveragingTargetTimespan: TestnetAveragingTargetTimespan, MaxAdjustDown: TestnetMaxAdjustDown, MaxAdjustUp: TestnetMaxAdjustUp, TargetTimespanAdjDown: TestnetAveragingTargetTimespan * (TestnetInterval + TestnetMaxAdjustDown) / TestnetInterval, MinActualTimespan: TestnetAveragingTargetTimespan * (TestnetInterval - TestnetMaxAdjustUp) / TestnetInterval, MaxActualTimespan: TestnetAveragingTargetTimespan * (TestnetInterval + TestnetMaxAdjustDown) / TestnetInterval, ScryptPowLimit: &scryptPowLimit, ScryptPowLimitBits: ScryptPowLimitBits, RPCClientPort: "21048", WalletRPCServerPort: "21046", }
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".
Functions ¶
func BigToCompact ¶
BigToCompact converts a whole number N to a compact representation using an unsigned 32-bit number. The compact representation only provides 23 bits of precision, so values larger than (2^23 - 1) only encode the most significant digits of the number. See CompactToBig for details.
func CompactToBig ¶
CompactToBig converts a compact representation of a whole number N to an unsigned 32-bit number. The representation is similar to IEEE754 floating point numbers. Like IEEE754 floating point, there are three basic components: the sign, the exponent, and the mantissa. They are broken out as follows:
- the most significant 8 bits represent the unsigned base 256 exponent
- bit 23 (the 24th bit) represents the sign bit
- the least significant 23 bits represent the mantissa ------------------------------------------------- | Exponent | Sign | Mantissa | ------------------------------------------------- | 8 bits [31-24] | 1 bit [23] | 23 bits [22-00] | -------------------------------------------------
The formula to calculate N is:
N = (-1^sign) * mantissa * 256^(exponent-3)
This compact form is only used in bitcoin to encode unsigned 256-bit numbers which represent difficulty targets, thus there really is not a need for a sign bit, but it is implemented here to stay consistent with bitcoind.
func HDPrivateKeyToPublicKeyID ¶
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 IsBech32SegwitPrefix ¶
IsBech32SegwitPrefix returns whether the prefix is a known prefix for segwit addresses on any default or registered network. This is used when decoding an address string into a specific address type.
func IsPubKeyHashAddrID ¶
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 IsScriptHashAddrID ¶
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 Register ¶
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.
Types ¶
type Checkpoint ¶
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 DNSSeed ¶
type DNSSeed struct { // Host defines the hostname of the seed. Host string // HasFiltering defines whether the seed supports filtering by service flags (wire.ServiceFlag). HasFiltering bool }
DNSSeed identifies a DNS seed.
type Params ¶
type Params struct { // Name defines a human-readable identifier for the network. Name string // Net defines the magic bytes used to identify the network. Net wire.BitcoinNet // DefaultPort defines the default peer-to-peer port for the network. DefaultPort string RPCClientPort string WalletRPCServerPort string // DNSSeeds defines a list of DNS seeds for the network that are used // as one method to discover peers. DNSSeeds []DNSSeed // GenesisBlock defines the first block of the chain. GenesisBlock *wire.Block // GenesisHash is the starting block hash. GenesisHash *chainhash.Hash // PowLimit defines the highest allowed proof of work value for a // as a uint256. PowLimit *big.Int // PowLimitBits defines the highest allowed proof of work value for a block in compact form. PowLimitBits uint32 // // These fields define the block heights at which the specified softfork BIP became active. // BIP0034Height int32 // BIP0065Height int32 // BIP0066Height int32 // CoinbaseMaturity is the number of blocks required before newly mined coins (coinbase transactions) can be spent. CoinbaseMaturity uint16 // SubsidyReductionInterval is the interval of blocks before the subsidy is reduced. SubsidyReductionInterval int32 // TargetTimespan is the desired amount of time that should elapse before the block difficulty requirement is // examined to determine how it should be changed in order to maintain the desired block generation rate. TargetTimespan int64 // TargetTimePerBlock is the desired amount of time to generate each block. Same as TargetSpacing in legacy client. TargetTimePerBlock int64 // RetargetAdjustmentFactor is the adjustment factor used to limit the minimum and maximum amount of adjustment that // can occur between difficulty retargets. RetargetAdjustmentFactor int64 // ReduceMinDifficulty defines whether the network should reduce the minimum required difficulty after a long enough // period of time has passed without finding a block. This is really only useful for test networks and should not be // set on a main network. ReduceMinDifficulty bool // MinDiffReductionTime is the amount of time after which the minimum required difficulty should be reduced when a // block hasn't been found. NOTE: This only applies if ReduceMinDifficulty is true. MinDiffReductionTime time.Duration // GenerateSupported specifies whether or not CPU mining is allowed. GenerateSupported bool // Checkpoints ordered from oldest to newest. Checkpoints []Checkpoint // These fields are related to voting on consensus rule changes as defined by BIP0009. // // RuleChangeActivationThreshold is the number of blocks in a threshold state retarget window for which a positive // vote for a rule change must be cast in order to lock in a rule change. It should typically be 95% for the main // network and 75% for test networks. RuleChangeActivationThreshold uint32 // MinerConfirmationWindow is the number of blocks in each threshold state retarget window. MinerConfirmationWindow uint32 // // Deployments define the specific consensus rule changes to be voted on. // Deployments [DefinedDeployments]ConsensusDeployment // Mempool parameters RelayNonStdTxs bool // // Human-readable part for Bech32 encoded segwit addresses, as defined in BIP 173. // Bech32HRPSegwit string // 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 // WitnessPubKeyHashAddrID byte // First byte of a P2WPKH address // WitnessScriptHashAddrID byte // First byte of a P2WSH address // 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 // Parallelcoin specific difficulty adjustment parameters Interval int64 AveragingInterval int64 AveragingTargetTimespan int64 MaxAdjustDown int64 MaxAdjustUp int64 TargetTimespanAdjDown int64 MinActualTimespan int64 MaxActualTimespan int64 // PowLimit defines the highest allowed proof of work value for a scrypt block as a uint256. ScryptPowLimit *big.Int ScryptPowLimitBits uint32 }
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.