aboutsummaryrefslogtreecommitdiffstats
path: root/dex
diff options
context:
space:
mode:
authorbojie <bojie@dexon.org>2018-12-05 16:24:35 +0800
committerWei-Ning Huang <w@dexon.org>2019-03-12 12:19:09 +0800
commitaf2d4af8f03af72683ba23963b0c432effe7feb6 (patch)
tree422c5f8dfd7f37e3d663f6dbc3bccfe80458fe93 /dex
parentc3d28a2f4d12c98b41d3a874a040489ab0a91ba5 (diff)
downloaddexon-af2d4af8f03af72683ba23963b0c432effe7feb6.tar.gz
dexon-af2d4af8f03af72683ba23963b0c432effe7feb6.tar.zst
dexon-af2d4af8f03af72683ba23963b0c432effe7feb6.zip
app: return retry later instead of retry with sleep time (#78)
Diffstat (limited to 'dex')
-rw-r--r--dex/app.go53
1 files changed, 22 insertions, 31 deletions
diff --git a/dex/app.go b/dex/app.go
index 92e1a6aaa..5ce34668c 100644
--- a/dex/app.go
+++ b/dex/app.go
@@ -36,10 +36,6 @@ import (
"github.com/dexon-foundation/dexon/rlp"
)
-const (
- verifyBlockMaxRetries = 4
-)
-
// DexconApp implements the DEXON consensus core application interface.
type DexconApp struct {
txPool *core.TxPool
@@ -312,40 +308,35 @@ func (d *DexconApp) VerifyBlock(block *coreTypes.Block) coreTypes.BlockVerifySta
return coreTypes.VerifyInvalidBlock
}
- // Wait until the witnessed root is seen on our local chain.
- for i := 0; i < verifyBlockMaxRetries; i++ {
- if d.blockchain.GetPendingHeight() < block.Witness.Height {
- log.Debug("Pending height < witness height")
- time.Sleep(500 * time.Millisecond)
- continue
- }
+ // Validate witness height.
+ if d.blockchain.GetPendingHeight() < block.Witness.Height {
+ log.Debug("Pending height < witness height")
+ return coreTypes.VerifyRetryLater
+ }
- b := d.blockchain.GetPendingBlockByNumber(block.Witness.Height)
+ b := d.blockchain.GetPendingBlockByNumber(block.Witness.Height)
+ if b == nil {
+ b = d.blockchain.GetBlockByNumber(block.Witness.Height)
if b == nil {
- b = d.blockchain.GetBlockByNumber(block.Witness.Height)
- if b == nil {
- log.Error("Can not get block by height %v", block.Witness.Height)
- return coreTypes.VerifyInvalidBlock
- }
- }
-
- if b.Root() != witnessData.Root {
- log.Error("Witness root not correct expect %v but %v", b.Root(), witnessData.Root)
+ log.Error("Can not get block by height %v", block.Witness.Height)
return coreTypes.VerifyInvalidBlock
}
+ }
- if b.ReceiptHash() != witnessData.ReceiptHash {
- log.Error("Witness receipt hash not correct expect %v but %v", b.ReceiptHash(), witnessData.ReceiptHash)
- return coreTypes.VerifyInvalidBlock
- }
+ if b.Root() != witnessData.Root {
+ log.Error("Witness root not correct expect %v but %v", b.Root(), witnessData.Root)
+ return coreTypes.VerifyInvalidBlock
+ }
- _, err = d.blockchain.StateAt(witnessData.Root)
- if err != nil {
- log.Error("Get state by root %v error: %v", witnessData.Root, err)
- return coreTypes.VerifyInvalidBlock
- }
+ if b.ReceiptHash() != witnessData.ReceiptHash {
+ log.Error("Witness receipt hash not correct expect %v but %v", b.ReceiptHash(), witnessData.ReceiptHash)
+ return coreTypes.VerifyInvalidBlock
+ }
- break
+ _, err = d.blockchain.StateAt(witnessData.Root)
+ if err != nil {
+ log.Error("Get state by root %v error: %v", witnessData.Root, err)
+ return coreTypes.VerifyInvalidBlock
}
d.chainRLock(block.Position.ChainID)