aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei-Ning Huang <aitjcize@gmail.com>2018-11-13 15:26:21 +0800
committerWei-Ning Huang <w@dexon.org>2018-12-19 20:54:27 +0800
commit1fbea1eeb71062477d104b4def4c367cc5407de8 (patch)
treec95c74e5dfbabdcb245c1753229a92b8ce25d4fe
parent2029c52f5a683f8135dba829495981a128412e40 (diff)
downloaddexon-1fbea1eeb71062477d104b4def4c367cc5407de8.tar.gz
dexon-1fbea1eeb71062477d104b4def4c367cc5407de8.tar.zst
dexon-1fbea1eeb71062477d104b4def4c367cc5407de8.zip
dex: return correct pending nonce (#14)
We need to return the correct pending nonce (include those in the tx pool). Also, StateAndHeaderByNumber is also fixed to use pending block.
-rw-r--r--core/blockchain.go13
-rw-r--r--dex/api_backend.go3
-rw-r--r--dex/app.go6
-rw-r--r--internal/ethapi/api.go7
4 files changed, 23 insertions, 6 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index b2a52f931..3613eb4f9 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -1773,20 +1773,29 @@ func (bc *BlockChain) addPendingBlock(block *types.Block, receipts types.Receipt
bc.lastPendingHeight = block.NumberU64()
}
-func (bc *BlockChain) GetLastPendingHeight() uint64 {
+func (bc *BlockChain) GetPendingHeight() uint64 {
bc.pendingBlockMu.RLock()
defer bc.pendingBlockMu.RUnlock()
return bc.lastPendingHeight
}
-func (bc *BlockChain) GetLastPendingBlock() *types.Block {
+func (bc *BlockChain) GetPendingBlock() *types.Block {
bc.pendingBlockMu.RLock()
defer bc.pendingBlockMu.RUnlock()
return bc.pendingBlocks[bc.lastPendingHeight].block
}
+func (bc *BlockChain) GetPending() (*types.Block, *state.StateDB) {
+ block := bc.GetPendingBlock()
+ s, err := state.New(block.Header().Root, bc.stateCache)
+ if err != nil {
+ panic(err)
+ }
+ return block, s
+}
+
// reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them
// to be part of the new canonical chain and accumulates potential missing transactions and post an
// event about them
diff --git a/dex/api_backend.go b/dex/api_backend.go
index 411855bf3..172b4ec44 100644
--- a/dex/api_backend.go
+++ b/dex/api_backend.go
@@ -80,7 +80,8 @@ func (b *DexAPIBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumb
func (b *DexAPIBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) {
if blockNr == rpc.PendingBlockNumber {
- blockNr = rpc.BlockNumber(b.dex.blockchain.CurrentBlock().Header().Number.Uint64())
+ block, state := b.dex.BlockChain().GetPending()
+ return state, block.Header(), nil
}
header, err := b.HeaderByNumber(ctx, blockNr)
if header == nil || err != nil {
diff --git a/dex/app.go b/dex/app.go
index d0d911e86..a90dfae37 100644
--- a/dex/app.go
+++ b/dex/app.go
@@ -275,13 +275,13 @@ addressMap:
// PrepareWitness will return the witness data no lower than consensusHeight.
func (d *DexconApp) PrepareWitness(consensusHeight uint64) (witness coreTypes.Witness, err error) {
var witnessBlock *types.Block
- lastPendingHeight := d.blockchain.GetLastPendingHeight()
+ lastPendingHeight := d.blockchain.GetPendingHeight()
if lastPendingHeight == 0 && consensusHeight == 0 {
witnessBlock = d.blockchain.CurrentBlock()
} else if lastPendingHeight >= consensusHeight {
- witnessBlock = d.blockchain.GetLastPendingBlock()
+ witnessBlock = d.blockchain.GetPendingBlock()
} else if h := <-d.addNotify(consensusHeight); h >= consensusHeight {
- witnessBlock = d.blockchain.GetLastPendingBlock()
+ witnessBlock = d.blockchain.GetPendingBlock()
} else {
log.Error("need pending block")
return witness, fmt.Errorf("need pending block")
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go
index d1563db6e..e3c7f64d6 100644
--- a/internal/ethapi/api.go
+++ b/internal/ethapi/api.go
@@ -1078,6 +1078,13 @@ func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx cont
// GetTransactionCount returns the number of transactions the given address has sent for the given block number
func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*hexutil.Uint64, error) {
+ if blockNr == rpc.PendingBlockNumber {
+ nonce, err := s.b.GetPoolNonce(ctx, address)
+ if err != nil {
+ return nil, err
+ }
+ return (*hexutil.Uint64)(&nonce), nil
+ }
state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr)
if state == nil || err != nil {
return nil, err