From 1834d95b432d990ecd36708120663870fa60060a Mon Sep 17 00:00:00 2001 From: Brannon King Date: Thu, 26 Aug 2021 15:07:42 -0400 Subject: [PATCH] rollback on hash mismatch --- blockchain/chain.go | 4 ++-- blockchain/claimtrie.go | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/blockchain/chain.go b/blockchain/chain.go index 128101f8..1511b770 100644 --- a/blockchain/chain.go +++ b/blockchain/chain.go @@ -586,7 +586,7 @@ func (b *BlockChain) connectBlock(node *blockNode, block *btcutil.Block, // Handle LBRY Claim Scripts if b.claimTrie != nil { - if err := b.ParseClaimScripts(block, node, view, false, current); err != nil { + if err := b.ParseClaimScripts(block, node, view, current); err != nil { return ruleError(ErrBadClaimTrie, err.Error()) } } @@ -1881,7 +1881,7 @@ func rebuildMissingClaimTrieData(b *BlockChain, done <-chan struct{}) error { } if h >= b.claimTrie.Height() { - err = b.ParseClaimScripts(block, n, view, true, false) + err = b.ParseClaimScripts(block, n, view, false) if err != nil { return err } diff --git a/blockchain/claimtrie.go b/blockchain/claimtrie.go index 8b9b449e..1032860d 100644 --- a/blockchain/claimtrie.go +++ b/blockchain/claimtrie.go @@ -20,7 +20,7 @@ func (b *BlockChain) SetClaimtrieHeader(block *btcutil.Block, view *UtxoViewpoin b.chainLock.Lock() defer b.chainLock.Unlock() - err := b.ParseClaimScripts(block, nil, view, false, false) + err := b.ParseClaimScripts(block, nil, view, false) if err != nil { return errors.Wrapf(err, "in parse claim scripts") } @@ -31,8 +31,7 @@ func (b *BlockChain) SetClaimtrieHeader(block *btcutil.Block, view *UtxoViewpoin return errors.Wrapf(err, "in reset height") } -func (b *BlockChain) ParseClaimScripts(block *btcutil.Block, bn *blockNode, view *UtxoViewpoint, - failOnHashMiss bool, shouldFlush bool) error { +func (b *BlockChain) ParseClaimScripts(block *btcutil.Block, bn *blockNode, view *UtxoViewpoint, shouldFlush bool) error { ht := block.Height() for _, tx := range block.Transactions() { @@ -56,10 +55,10 @@ func (b *BlockChain) ParseClaimScripts(block *btcutil.Block, bn *blockNode, view hash := b.claimTrie.MerkleHash() if bn != nil && bn.claimTrie != *hash { - if failOnHashMiss { - return errors.Errorf("height: %d, ct.MerkleHash: %s != node.ClaimTrie: %s", ht, *hash, bn.claimTrie) - } - node.LogOnce(fmt.Sprintf("\n\nHeight: %d, ct.MerkleHash: %s != node.ClaimTrie: %s, Error: %s", ht, *hash, bn.claimTrie, err)) + // undo our AppendBlock call as we've decided that our interpretation of the block data is incorrect, + // or that the person who made the block assembled the pieces incorrectly. + _ = b.claimTrie.ResetHeight(b.claimTrie.Height() - 1) + return errors.Errorf("height: %d, computed hash: %s != header's ClaimTrie: %s", ht, *hash, bn.claimTrie) } return nil }