for range ticker.C {
jobs, beginHeight, beginHash := t.prepareJobs()
+ if beginHeight > t.tracerService.BestHeight() {
+ continue
+ }
t.tracer = newTracer(jobs[beginHash])
- for t.currentHeight, t.currentHash = beginHeight, beginHash; len(jobs) != 0 ; {
- if bestHeight := t.tracerService.BestHeight(); t.currentHeight == bestHeight {
+ for t.currentHeight, t.currentHash = beginHeight, beginHash; len(jobs) != 0; {
+ if t.currentHeight == t.tracerService.BestHeight() {
if ok, err := t.finishJobs(jobs); err != nil {
log.WithField("err", err).Error("finish jobs")
} else if ok {
chainStatus := infra.Repository.GetChainStatus()
if chainStatus == nil {
- chainStatus.BlockHeight, chainStatus.BlockHash = infra.Chain.BestChain()
+ bestHeight, bestHash := infra.Chain.BestChain()
+ chainStatus = &ChainStatus{BlockHeight: bestHeight, BlockHash: bestHash}
if err := infra.Repository.SaveChainStatus(chainStatus); err != nil {
logrus.WithField("err", err).Fatal("init chain status for trace service")
}
log.WithFields(log.Fields{"module": logModule, "err": err}).Error("trace updater detach block")
return
}
- }
-
- if err := t.ApplyBlock(block); err != nil {
- log.WithFields(log.Fields{"module": logModule, "err": err}).Error("trace updater attach block")
- return
+ } else {
+ if err := t.ApplyBlock(block); err != nil {
+ log.WithFields(log.Fields{"module": logModule, "err": err}).Error("trace updater attach block")
+ return
+ }
}
}
}
"github.com/bytom/bytom/consensus/segwit"
"github.com/bytom/bytom/protocol/bc"
"github.com/bytom/bytom/protocol/bc/types"
+ "github.com/bytom/bytom/protocol/vm/vmutil"
)
type tracer struct {
func parseContractUTXOs(tx *types.Tx) ([]*UTXO, []*UTXO) {
var inUTXOs, outUTXOs []*UTXO
for i, input := range tx.Inputs {
- if isContract(input.ControlProgram()) {
+ if isContract(input.ControlProgram()) && input.InputType() == types.SpendInputType {
inUTXOs = append(inUTXOs, inputToUTXO(tx, i))
}
}
for i, output := range tx.Outputs {
- if isContract(output.ControlProgram) {
+ if isContract(output.ControlProgram) && output.OutputType() == types.OriginalOutputType {
outUTXOs = append(outUTXOs, outputToUTXO(tx, i))
}
}
}
func isContract(program []byte) bool {
- return !(segwit.IsP2WPKHScript(program) || segwit.IsP2WSHScript(program) || segwit.IsStraightforward(program))
+ return !(segwit.IsP2WScript(program) || vmutil.IsUnspendable(program))
}
func (t *tracer) saveInstances(instances []*Instance) {