本文整理汇总了Golang中github.com/piotrnar/gocoin/lib/btc.Block.VerifyFlags方法的典型用法代码示例。如果您正苦于以下问题:Golang Block.VerifyFlags方法的具体用法?Golang Block.VerifyFlags怎么用?Golang Block.VerifyFlags使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/piotrnar/gocoin/lib/btc.Block
的用法示例。
在下文中一共展示了Block.VerifyFlags方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: CheckBlock
//.........这里部分代码省略.........
// Check proof of work
gnwr := ch.GetNextWorkRequired(prevblk, bl.BlockTime())
if bl.Bits() != gnwr {
println("AcceptBlock() : incorrect proof of work ", bl.Bits, " at block", height, " exp:", gnwr)
// Here is a "solution" for whatever shit there is in testnet3, that nobody can explain me:
if !ch.testnet() || (height%2016) != 0 {
er = errors.New("CheckBlock: incorrect proof of work")
dos = true
return
}
}
// Count block versions within the Majority Window
var majority_v2, majority_v3 uint
n := prevblk
for cnt := uint(0); cnt < ch.Consensus.Window && n != nil; cnt++ {
ver := binary.LittleEndian.Uint32(n.BlockHeader[0:4])
if ver >= 2 {
majority_v2++
if ver >= 3 {
majority_v3++
}
}
n = n.Parent
}
if bl.Version() < 2 && majority_v2 >= ch.Consensus.RejectBlock {
er = errors.New("CheckBlock() : Rejected nVersion=1 block")
dos = true
return
}
if bl.Version() < 3 && majority_v3 >= ch.Consensus.RejectBlock {
er = errors.New("CheckBlock() : Rejected nVersion=2 block")
dos = true
return
}
if bl.Txs == nil {
er = bl.BuildTxList()
if er != nil {
dos = true
return
}
}
if !bl.Trusted {
if bl.Version() >= 2 && majority_v2 >= ch.Consensus.EnforceUpgrade {
var exp []byte
if height >= 0x800000 {
if height >= 0x80000000 {
exp = []byte{5, byte(height), byte(height >> 8), byte(height >> 16), byte(height >> 24), 0}
} else {
exp = []byte{4, byte(height), byte(height >> 8), byte(height >> 16), byte(height >> 24)}
}
} else {
exp = []byte{3, byte(height), byte(height >> 8), byte(height >> 16)}
}
if len(bl.Txs[0].TxIn[0].ScriptSig) < len(exp) || !bytes.Equal(exp, bl.Txs[0].TxIn[0].ScriptSig[:len(exp)]) {
er = errors.New("CheckBlock() : Unexpected block number in coinbase: " + bl.Hash.String())
dos = true
return
}
}
// This is a stupid check, but well, we need to be satoshi compatible
if len(bl.Txs) == 0 || !bl.Txs[0].IsCoinBase() {
er = errors.New("CheckBlock() : first tx is not coinbase: " + bl.Hash.String())
dos = true
return
}
// Check Merkle Root - that's importnant
if !bytes.Equal(btc.GetMerkel(bl.Txs), bl.MerkleRoot()) {
er = errors.New("CheckBlock() : Merkle Root mismatch")
dos = true
return
}
// Check transactions - this is the most time consuming task
if !CheckTransactions(bl.Txs, height, bl.BlockTime()) {
er = errors.New("CheckBlock() : CheckTransactions() failed")
dos = true
return
}
}
if bl.BlockTime() >= BIP16SwitchTime {
bl.VerifyFlags = script.VER_P2SH
} else {
bl.VerifyFlags = 0
}
if majority_v3 >= ch.Consensus.EnforceUpgrade {
bl.VerifyFlags |= script.VER_DERSIG
}
return
}
示例2: PostCheckBlock
func (ch *Chain) PostCheckBlock(bl *btc.Block) (er error) {
// Size limits
if len(bl.Raw) < 81 {
er = errors.New("CheckBlock() : size limits failed low - RPC_Result:bad-blk-length")
return
}
if bl.Txs == nil {
er = bl.BuildTxList()
if er != nil {
return
}
if len(bl.OldData) > btc.MAX_BLOCK_SIZE {
er = errors.New("CheckBlock() : size limits failed high - RPC_Result:bad-blk-length")
return
}
}
if !bl.Trusted {
// We need to be satoshi compatible
if len(bl.Txs) == 0 || !bl.Txs[0].IsCoinBase() {
er = errors.New("CheckBlock() : first tx is not coinbase: " + bl.Hash.String() + " - RPC_Result:bad-cb-missing")
return
}
// Enforce rule that the coinbase starts with serialized block height
if bl.Height >= ch.Consensus.BIP34Height {
var exp [6]byte
var exp_len int
binary.LittleEndian.PutUint32(exp[1:5], bl.Height)
for exp_len = 5; exp_len > 1; exp_len-- {
if exp[exp_len] != 0 || exp[exp_len-1] >= 0x80 {
break
}
}
exp[0] = byte(exp_len)
exp_len++
if !bytes.HasPrefix(bl.Txs[0].TxIn[0].ScriptSig, exp[:exp_len]) {
er = errors.New("CheckBlock() : Unexpected block number in coinbase: " + bl.Hash.String() + " - RPC_Result:bad-cb-height")
return
}
}
// And again...
for i := 1; i < len(bl.Txs); i++ {
if bl.Txs[i].IsCoinBase() {
er = errors.New("CheckBlock() : more than one coinbase: " + bl.Hash.String() + " - RPC_Result:bad-cb-multiple")
return
}
}
// Check Merkle Root - that's importnant
merkle, mutated := btc.GetMerkle(bl.Txs)
if mutated {
er = errors.New("CheckBlock(): duplicate transaction - RPC_Result:bad-txns-duplicate")
return
}
if !bytes.Equal(merkle, bl.MerkleRoot()) {
er = errors.New("CheckBlock() : Merkle Root mismatch - RPC_Result:bad-txnmrklroot")
return
}
}
if bl.BlockTime() >= BIP16SwitchTime {
bl.VerifyFlags = script.VER_P2SH
} else {
bl.VerifyFlags = 0
}
if bl.Height >= ch.Consensus.BIP66Height {
bl.VerifyFlags |= script.VER_DERSIG
}
if bl.Height >= ch.Consensus.BIP65Height {
bl.VerifyFlags |= script.VER_CLTV
}
if ch.Consensus.Enforce_CSV != 0 && bl.Height >= ch.Consensus.Enforce_CSV {
bl.VerifyFlags |= script.VER_CSV
}
if ch.Consensus.Enforce_SEGWIT != 0 && bl.Height >= ch.Consensus.Enforce_SEGWIT {
bl.VerifyFlags |= script.VER_WITNESS | script.VER_NULLDUMMY
}
if !bl.Trusted {
var blockTime uint32
var had_witness bool
if (bl.VerifyFlags & script.VER_CSV) != 0 {
blockTime = bl.MedianPastTime
} else {
blockTime = bl.BlockTime()
}
// Verify merkle root of witness data
if (bl.VerifyFlags & script.VER_WITNESS) != 0 {
var i int
//.........这里部分代码省略.........