本文整理匯總了Golang中github.com/piotrnar/gocoin/lib/btc.Block.SigopsCost方法的典型用法代碼示例。如果您正苦於以下問題:Golang Block.SigopsCost方法的具體用法?Golang Block.SigopsCost怎麽用?Golang Block.SigopsCost使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/piotrnar/gocoin/lib/btc.Block
的用法示例。
在下文中一共展示了Block.SigopsCost方法的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: commitTxs
// This isusually the most time consuming process when applying a new block
func (ch *Chain) commitTxs(bl *btc.Block, changes *BlockChanges) (e error) {
sumblockin := btc.GetBlockReward(changes.Height)
var txoutsum, txinsum, sumblockout uint64
if changes.Height+ch.Unspent.UnwindBufLen >= changes.LastKnownHeight {
changes.UndoData = make(map[[32]byte]*QdbRec)
}
blUnsp := make(map[[32]byte][]*btc.TxOut, 4*len(bl.Txs))
var wg sync.WaitGroup
var ver_err_cnt uint32
for i := range bl.Txs {
txoutsum, txinsum = 0, 0
bl.SigopsCost += uint32(btc.WITNESS_SCALE_FACTOR * bl.Txs[i].GetLegacySigOpCount())
// Check each tx for a valid input, except from the first one
if i > 0 {
tx_trusted := bl.Trusted
if !tx_trusted && TrustedTxChecker != nil && TrustedTxChecker(bl.Txs[i].Hash) {
tx_trusted = true
}
for j := 0; j < len(bl.Txs[i].TxIn); j++ {
inp := &bl.Txs[i].TxIn[j].Input
spendrec, waspent := changes.DeledTxs[inp.Hash]
if waspent && spendrec[inp.Vout] {
println("txin", inp.String(), "already spent in this block")
e = errors.New("Input spent more then once in same block")
return
}
tout := ch.PickUnspent(inp)
if tout == nil {
t, ok := blUnsp[inp.Hash]
if !ok {
e = errors.New("Unknown input TxID: " + btc.NewUint256(inp.Hash[:]).String())
return
}
if inp.Vout >= uint32(len(t)) {
println("Vout too big", len(t), inp.String())
e = errors.New("Vout too big")
return
}
if t[inp.Vout] == nil {
println("Vout already spent", inp.String())
e = errors.New("Vout already spent")
return
}
if t[inp.Vout].WasCoinbase {
e = errors.New("Cannot spend block's own coinbase in TxID: " + btc.NewUint256(inp.Hash[:]).String())
return
}
tout = t[inp.Vout]
t[inp.Vout] = nil // and now mark it as spent:
} else {
if tout.WasCoinbase && changes.Height-tout.BlockHeight < COINBASE_MATURITY {
e = errors.New("Trying to spend prematured coinbase: " + btc.NewUint256(inp.Hash[:]).String())
return
}
// it is confirmed already so delete it later
if !waspent {
spendrec = make([]bool, tout.VoutCount)
changes.DeledTxs[inp.Hash] = spendrec
}
spendrec[inp.Vout] = true
if changes.UndoData != nil {
var urec *QdbRec
urec = changes.UndoData[inp.Hash]
if urec == nil {
urec = new(QdbRec)
urec.TxID = inp.Hash
urec.Coinbase = tout.WasCoinbase
urec.InBlock = tout.BlockHeight
urec.Outs = make([]*QdbTxOut, tout.VoutCount)
changes.UndoData[inp.Hash] = urec
}
tmp := new(QdbTxOut)
tmp.Value = tout.Value
tmp.PKScr = make([]byte, len(tout.Pk_script))
copy(tmp.PKScr, tout.Pk_script)
urec.Outs[inp.Vout] = tmp
}
}
if !tx_trusted { // run VerifyTxScript() in a parallel task
wg.Add(1)
go func(prv []byte, amount uint64, i int, tx *btc.Tx) {
if !script.VerifyTxScript(prv, amount, i, tx, bl.VerifyFlags) {
atomic.AddUint32(&ver_err_cnt, 1)
}
wg.Done()
}(tout.Pk_script, tout.Value, j, bl.Txs[i])
//.........這裏部分代碼省略.........