diff options
author | Wei-Ning Huang <aitjcize@gmail.com> | 2018-11-13 15:26:21 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2018-12-19 20:54:27 +0800 |
commit | 1fbea1eeb71062477d104b4def4c367cc5407de8 (patch) | |
tree | c95c74e5dfbabdcb245c1753229a92b8ce25d4fe | |
parent | 2029c52f5a683f8135dba829495981a128412e40 (diff) | |
download | dexon-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.go | 13 | ||||
-rw-r--r-- | dex/api_backend.go | 3 | ||||
-rw-r--r-- | dex/app.go | 6 | ||||
-rw-r--r-- | internal/ethapi/api.go | 7 |
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 |