Make the CheckBlockSanity function context free.
Rather than defining CheckBlockSanity as a member of a BlockChain instance, define it at the root level so it is truly context free as intended. In order to make it context free, the proof of work limit is now a required parameter.
This commit is contained in:
parent
09b53a8fca
commit
5295be070d
3 changed files with 7 additions and 14 deletions
|
@ -112,7 +112,7 @@ func (b *BlockChain) ProcessBlock(block *btcutil.Block) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform preliminary sanity checks on the block and its transactions.
|
// Perform preliminary sanity checks on the block and its transactions.
|
||||||
err = b.CheckBlockSanity(block)
|
err = CheckBlockSanity(block, b.chainParams().PowLimit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/conformal/btcutil"
|
"github.com/conformal/btcutil"
|
||||||
"github.com/conformal/btcwire"
|
"github.com/conformal/btcwire"
|
||||||
"math"
|
"math"
|
||||||
|
"math/big"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -265,7 +266,7 @@ func CheckTransactionSanity(tx *btcutil.Tx) error {
|
||||||
// checkProofOfWork ensures the block header bits which indicate the target
|
// checkProofOfWork ensures the block header bits which indicate the target
|
||||||
// difficulty is in min/max range and that the block hash is less than the
|
// difficulty is in min/max range and that the block hash is less than the
|
||||||
// target difficulty as claimed.
|
// target difficulty as claimed.
|
||||||
func (b *BlockChain) checkProofOfWork(block *btcutil.Block) error {
|
func checkProofOfWork(block *btcutil.Block, powLimit *big.Int) error {
|
||||||
// The target difficulty must be larger than zero.
|
// The target difficulty must be larger than zero.
|
||||||
header := block.MsgBlock().Header
|
header := block.MsgBlock().Header
|
||||||
target := CompactToBig(header.Bits)
|
target := CompactToBig(header.Bits)
|
||||||
|
@ -276,7 +277,6 @@ func (b *BlockChain) checkProofOfWork(block *btcutil.Block) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// The target difficulty must be less than the maximum allowed.
|
// The target difficulty must be less than the maximum allowed.
|
||||||
powLimit := b.chainParams().PowLimit
|
|
||||||
if target.Cmp(powLimit) > 0 {
|
if target.Cmp(powLimit) > 0 {
|
||||||
str := fmt.Sprintf("block target difficulty of %064x is "+
|
str := fmt.Sprintf("block target difficulty of %064x is "+
|
||||||
"higher than max of %064x", target, powLimit)
|
"higher than max of %064x", target, powLimit)
|
||||||
|
@ -390,7 +390,7 @@ func countP2SHSigOps(tx *btcutil.Tx, isCoinBaseTx bool, txStore TxStore) (int, e
|
||||||
|
|
||||||
// CheckBlockSanity performs some preliminary checks on a block to ensure it is
|
// CheckBlockSanity performs some preliminary checks on a block to ensure it is
|
||||||
// sane before continuing with block processing. These checks are context free.
|
// sane before continuing with block processing. These checks are context free.
|
||||||
func (b *BlockChain) CheckBlockSanity(block *btcutil.Block) error {
|
func CheckBlockSanity(block *btcutil.Block, powLimit *big.Int) error {
|
||||||
// NOTE: bitcoind does size limits checking here, but the size limits
|
// NOTE: bitcoind does size limits checking here, but the size limits
|
||||||
// have already been checked by btcwire for incoming blocks. Also,
|
// have already been checked by btcwire for incoming blocks. Also,
|
||||||
// btcwire checks the size limits on send too, so there is no need
|
// btcwire checks the size limits on send too, so there is no need
|
||||||
|
@ -399,7 +399,7 @@ func (b *BlockChain) CheckBlockSanity(block *btcutil.Block) error {
|
||||||
// Ensure the proof of work bits in the block header is in min/max range
|
// Ensure the proof of work bits in the block header is in min/max range
|
||||||
// and the block hash is less than the target value described by the
|
// and the block hash is less than the target value described by the
|
||||||
// bits.
|
// bits.
|
||||||
err := b.checkProofOfWork(block)
|
err := checkProofOfWork(block, powLimit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,16 +15,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCheckBlockSanity(t *testing.T) {
|
func TestCheckBlockSanity(t *testing.T) {
|
||||||
// Create a new database and chain instance to run tests against.
|
powLimit := btcchain.ChainParams(btcwire.MainNet).PowLimit
|
||||||
chain, teardownFunc, err := chainSetup("cbsanity")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Failed to setup chain instance: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer teardownFunc()
|
|
||||||
|
|
||||||
block := btcutil.NewBlock(&Block100000)
|
block := btcutil.NewBlock(&Block100000)
|
||||||
err = chain.CheckBlockSanity(block)
|
err := btcchain.CheckBlockSanity(block, powLimit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("CheckBlockSanity: %v", err)
|
t.Errorf("CheckBlockSanity: %v", err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue