aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Holst Swende <martin@swende.se>2016-11-30 17:48:48 +0800
committerPéter Szilágyi <peterke@gmail.com>2016-11-30 17:48:48 +0800
commit9f8bc00cf56bdf2cabf060303ed69f277a03357a (patch)
tree1d3e13d602c3ae2a0106fef23cc620aba4962f2c
parent3363a1c2277ccd3aee9e05850accd8c50e016bfa (diff)
downloaddexon-9f8bc00cf56bdf2cabf060303ed69f277a03357a.tar.gz
dexon-9f8bc00cf56bdf2cabf060303ed69f277a03357a.tar.zst
dexon-9f8bc00cf56bdf2cabf060303ed69f277a03357a.zip
eth, miner: removed unnecessary state.Copy()
* miner: removed unnecessary state.Copy() * eth: made use of new miner method without state copying * miner: More documentation about new method
-rw-r--r--eth/api_backend.go4
-rw-r--r--miner/miner.go9
-rw-r--r--miner/worker.go15
3 files changed, 26 insertions, 2 deletions
diff --git a/eth/api_backend.go b/eth/api_backend.go
index 0925132ef..7858dee2e 100644
--- a/eth/api_backend.go
+++ b/eth/api_backend.go
@@ -56,7 +56,7 @@ func (b *EthApiBackend) SetHead(number uint64) {
func (b *EthApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) {
// Pending block is only known by the miner
if blockNr == rpc.PendingBlockNumber {
- block, _ := b.eth.miner.Pending()
+ block := b.eth.miner.PendingBlock()
return block.Header(), nil
}
// Otherwise resolve and return the block
@@ -69,7 +69,7 @@ func (b *EthApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNum
func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {
// Pending block is only known by the miner
if blockNr == rpc.PendingBlockNumber {
- block, _ := b.eth.miner.Pending()
+ block := b.eth.miner.PendingBlock()
return block, nil
}
// Otherwise resolve and return the block
diff --git a/miner/miner.go b/miner/miner.go
index c85a1cd8e..87568ac18 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -187,6 +187,15 @@ func (self *Miner) Pending() (*types.Block, *state.StateDB) {
return self.worker.pending()
}
+// PendingBlock returns the currently pending block.
+//
+// Note, to access both the pending block and the pending state
+// simultaneously, please use Pending(), as the pending state can
+// change between multiple method calls
+func (self *Miner) PendingBlock() *types.Block {
+ return self.worker.pendingBlock()
+}
+
func (self *Miner) SetEtherbase(addr common.Address) {
self.coinbase = addr
self.worker.setEtherbase(addr)
diff --git a/miner/worker.go b/miner/worker.go
index ca00c7229..edbd502c1 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -176,6 +176,21 @@ func (self *worker) pending() (*types.Block, *state.StateDB) {
return self.current.Block, self.current.state.Copy()
}
+func (self *worker) pendingBlock() *types.Block {
+ self.currentMu.Lock()
+ defer self.currentMu.Unlock()
+
+ if atomic.LoadInt32(&self.mining) == 0 {
+ return types.NewBlock(
+ self.current.header,
+ self.current.txs,
+ nil,
+ self.current.receipts,
+ )
+ }
+ return self.current.Block
+}
+
func (self *worker) start() {
self.mu.Lock()
defer self.mu.Unlock()