aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain.go
diff options
context:
space:
mode:
authorBojie Wu <bojie@dexon.org>2018-10-12 13:50:17 +0800
committerWei-Ning Huang <w@byzantine-lab.io>2019-06-12 17:23:38 +0800
commit25124281519a0ec7d163bb38c64b6b5c9c122df6 (patch)
treef55bf9e2cd460df1e08ad31e4f266019052f01e4 /core/blockchain.go
parent3c47149297c6d81fb5d05d0281a01c943b345b11 (diff)
downloadgo-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.tar
go-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.tar.gz
go-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.tar.bz2
go-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.tar.lz
go-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.tar.xz
go-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.tar.zst
go-tangerine-25124281519a0ec7d163bb38c64b6b5c9c122df6.zip
app: implement new interface method
Diffstat (limited to 'core/blockchain.go')
-rw-r--r--core/blockchain.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index 41b8764f7..30516f7f6 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -18,6 +18,7 @@
package core
import (
+ "bytes"
"errors"
"fmt"
"io"
@@ -27,6 +28,9 @@ import (
"sync/atomic"
"time"
+ coreCommon "github.com/dexon-foundation/dexon-consensus-core/common"
+ coreTypes "github.com/dexon-foundation/dexon-consensus-core/core/types"
+
"github.com/dexon-foundation/dexon/common"
"github.com/dexon-foundation/dexon/common/mclock"
"github.com/dexon-foundation/dexon/common/prque"
@@ -136,6 +140,10 @@ type BlockChain struct {
badBlocks *lru.Cache // Bad block cache
shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block.
+
+ confirmedBlockMu sync.Mutex
+ confirmedBlock map[coreCommon.Hash]*coreTypes.Block
+ filteredConfirmedBlock map[uint32]map[coreCommon.Hash]*coreTypes.Block
}
// NewBlockChain returns a fully initialised block chain using information
@@ -215,6 +223,54 @@ func (bc *BlockChain) GetVMConfig() *vm.Config {
return &bc.vmConfig
}
+func (bc *BlockChain) AddConfirmedBlock(block *coreTypes.Block) {
+ bc.confirmedBlockMu.Lock()
+ defer bc.confirmedBlockMu.Unlock()
+
+ bc.confirmedBlock[block.Hash] = block
+ bc.filteredConfirmedBlock[block.Position.ChainID][block.Hash] = block
+}
+
+func (bc *BlockChain) RemoveConfirmedBlock(hash coreCommon.Hash) {
+ bc.confirmedBlockMu.Lock()
+ defer bc.confirmedBlockMu.Unlock()
+
+ block := bc.confirmedBlock[hash]
+ delete(bc.filteredConfirmedBlock[block.Position.ChainID], block.Hash)
+ delete(bc.confirmedBlock, block.Hash)
+}
+
+func (bc *BlockChain) GetConfirmedBlockByHash(hash coreCommon.Hash) *coreTypes.Block {
+ return bc.confirmedBlock[hash]
+}
+
+func (bc *BlockChain) GetNonceInConfirmedBlock(chainID uint32, address common.Address) (uint64, bool, error) {
+ var nonce uint64
+ var init bool
+ for _, block := range bc.filteredConfirmedBlock[chainID] {
+ var transactions types.Transactions
+ err := rlp.Decode(bytes.NewReader(block.Payload), &transactions)
+ if err != nil {
+ return 0, init, err
+ }
+
+ for _, tx := range transactions {
+ msg, err := tx.AsMessage(types.MakeSigner(bc.chainConfig, new(big.Int)))
+ if err != nil {
+ return 0, init, err
+ }
+
+ if msg.From() == address && (tx.Nonce() > nonce || !init) {
+ if !init {
+ init = true
+ }
+ nonce = tx.Nonce()
+ }
+ }
+ }
+ return nonce, init, nil
+}
+
// loadLastState loads the last known chain state from the database. This method
// assumes that the chain manager mutex is held.
func (bc *BlockChain) loadLastState() error {