core, eth, les, light: get rid of redundant methods
This commit is contained in:
parent
6198c53e28
commit
566d5c0777
@ -312,14 +312,6 @@ func (bc *BlockChain) GasLimit() uint64 {
|
|||||||
return bc.currentBlock.GasLimit()
|
return bc.currentBlock.GasLimit()
|
||||||
}
|
}
|
||||||
|
|
||||||
// LastBlockHash return the hash of the HEAD block.
|
|
||||||
func (bc *BlockChain) LastBlockHash() common.Hash {
|
|
||||||
bc.mu.RLock()
|
|
||||||
defer bc.mu.RUnlock()
|
|
||||||
|
|
||||||
return bc.currentBlock.Hash()
|
|
||||||
}
|
|
||||||
|
|
||||||
// CurrentBlock retrieves the current head block of the canonical chain. The
|
// CurrentBlock retrieves the current head block of the canonical chain. The
|
||||||
// block is retrieved from the blockchain's internal cache.
|
// block is retrieved from the blockchain's internal cache.
|
||||||
func (bc *BlockChain) CurrentBlock() *types.Block {
|
func (bc *BlockChain) CurrentBlock() *types.Block {
|
||||||
@ -338,15 +330,6 @@ func (bc *BlockChain) CurrentFastBlock() *types.Block {
|
|||||||
return bc.currentFastBlock
|
return bc.currentFastBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status returns status information about the current chain such as the HEAD Td,
|
|
||||||
// the HEAD hash and the hash of the genesis block.
|
|
||||||
func (bc *BlockChain) Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash) {
|
|
||||||
bc.mu.RLock()
|
|
||||||
defer bc.mu.RUnlock()
|
|
||||||
|
|
||||||
return bc.GetTd(bc.currentBlock.Hash(), bc.currentBlock.NumberU64()), bc.currentBlock.Hash(), bc.genesisBlock.Hash()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetProcessor sets the processor required for making state modifications.
|
// SetProcessor sets the processor required for making state modifications.
|
||||||
func (bc *BlockChain) SetProcessor(processor Processor) {
|
func (bc *BlockChain) SetProcessor(processor Processor) {
|
||||||
bc.procmu.Lock()
|
bc.procmu.Lock()
|
||||||
@ -1006,7 +989,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
|
|||||||
stats.report(chain, i)
|
stats.report(chain, i)
|
||||||
}
|
}
|
||||||
// Append a single chain head event if we've progressed the chain
|
// Append a single chain head event if we've progressed the chain
|
||||||
if lastCanon != nil && bc.LastBlockHash() == lastCanon.Hash() {
|
if lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() {
|
||||||
events = append(events, ChainHeadEvent{lastCanon})
|
events = append(events, ChainHeadEvent{lastCanon})
|
||||||
}
|
}
|
||||||
return 0, events, coalescedLogs, nil
|
return 0, events, coalescedLogs, nil
|
||||||
|
@ -164,8 +164,8 @@ type LightChain interface {
|
|||||||
// CurrentHeader retrieves the head header from the local chain.
|
// CurrentHeader retrieves the head header from the local chain.
|
||||||
CurrentHeader() *types.Header
|
CurrentHeader() *types.Header
|
||||||
|
|
||||||
// GetTdByHash returns the total difficulty of a local block.
|
// GetTd returns the total difficulty of a local block.
|
||||||
GetTdByHash(common.Hash) *big.Int
|
GetTd(common.Hash, uint64) *big.Int
|
||||||
|
|
||||||
// InsertHeaderChain inserts a batch of headers into the local chain.
|
// InsertHeaderChain inserts a batch of headers into the local chain.
|
||||||
InsertHeaderChain([]*types.Header, int) (int, error)
|
InsertHeaderChain([]*types.Header, int) (int, error)
|
||||||
@ -1218,7 +1218,8 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
|
|||||||
// L: Request new headers up from 11 (R's TD was higher, it must have something)
|
// L: Request new headers up from 11 (R's TD was higher, it must have something)
|
||||||
// R: Nothing to give
|
// R: Nothing to give
|
||||||
if d.mode != LightSync {
|
if d.mode != LightSync {
|
||||||
if !gotHeaders && td.Cmp(d.blockchain.GetTdByHash(d.blockchain.CurrentBlock().Hash())) > 0 {
|
head := d.blockchain.CurrentBlock()
|
||||||
|
if !gotHeaders && td.Cmp(d.blockchain.GetTd(head.Hash(), head.NumberU64())) > 0 {
|
||||||
return errStallingPeer
|
return errStallingPeer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1230,7 +1231,8 @@ func (d *Downloader) processHeaders(origin uint64, td *big.Int) error {
|
|||||||
// queued for processing when the header download completes. However, as long as the
|
// queued for processing when the header download completes. However, as long as the
|
||||||
// peer gave us something useful, we're already happy/progressed (above check).
|
// peer gave us something useful, we're already happy/progressed (above check).
|
||||||
if d.mode == FastSync || d.mode == LightSync {
|
if d.mode == FastSync || d.mode == LightSync {
|
||||||
if td.Cmp(d.lightchain.GetTdByHash(d.lightchain.CurrentHeader().Hash())) > 0 {
|
head := d.lightchain.CurrentHeader()
|
||||||
|
if td.Cmp(d.lightchain.GetTd(head.Hash(), head.Number.Uint64())) > 0 {
|
||||||
return errStallingPeer
|
return errStallingPeer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -299,8 +299,8 @@ func (dl *downloadTester) FastSyncCommitHead(hash common.Hash) error {
|
|||||||
return fmt.Errorf("non existent block: %x", hash[:4])
|
return fmt.Errorf("non existent block: %x", hash[:4])
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTdByHash retrieves the block's total difficulty from the canonical chain.
|
// GetTd retrieves the block's total difficulty from the canonical chain.
|
||||||
func (dl *downloadTester) GetTdByHash(hash common.Hash) *big.Int {
|
func (dl *downloadTester) GetTd(hash common.Hash, number uint64) *big.Int {
|
||||||
dl.lock.RLock()
|
dl.lock.RLock()
|
||||||
defer dl.lock.RUnlock()
|
defer dl.lock.RUnlock()
|
||||||
|
|
||||||
|
@ -257,8 +257,14 @@ func (pm *ProtocolManager) handle(p *peer) error {
|
|||||||
p.Log().Debug("Ethereum peer connected", "name", p.Name())
|
p.Log().Debug("Ethereum peer connected", "name", p.Name())
|
||||||
|
|
||||||
// Execute the Ethereum handshake
|
// Execute the Ethereum handshake
|
||||||
td, head, genesis := pm.blockchain.Status()
|
var (
|
||||||
if err := p.Handshake(pm.networkId, td, head, genesis); err != nil {
|
genesis = pm.blockchain.Genesis()
|
||||||
|
head = pm.blockchain.CurrentHeader()
|
||||||
|
hash = head.Hash()
|
||||||
|
number = head.Number.Uint64()
|
||||||
|
td = pm.blockchain.GetTd(hash, number)
|
||||||
|
)
|
||||||
|
if err := p.Handshake(pm.networkId, td, hash, genesis.Hash()); err != nil {
|
||||||
p.Log().Debug("Ethereum handshake failed", "err", err)
|
p.Log().Debug("Ethereum handshake failed", "err", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -166,8 +166,12 @@ func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*te
|
|||||||
tp := &testPeer{app: app, net: net, peer: peer}
|
tp := &testPeer{app: app, net: net, peer: peer}
|
||||||
// Execute any implicitly requested handshakes and return
|
// Execute any implicitly requested handshakes and return
|
||||||
if shake {
|
if shake {
|
||||||
td, head, genesis := pm.blockchain.Status()
|
var (
|
||||||
tp.handshake(nil, td, head, genesis)
|
genesis = pm.blockchain.Genesis()
|
||||||
|
head = pm.blockchain.CurrentHeader()
|
||||||
|
td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64())
|
||||||
|
)
|
||||||
|
tp.handshake(nil, td, head.Hash(), genesis.Hash())
|
||||||
}
|
}
|
||||||
return tp, errc
|
return tp, errc
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,11 @@ func TestStatusMsgErrors63(t *testing.T) { testStatusMsgErrors(t, 63) }
|
|||||||
|
|
||||||
func testStatusMsgErrors(t *testing.T, protocol int) {
|
func testStatusMsgErrors(t *testing.T, protocol int) {
|
||||||
pm := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
|
pm := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil)
|
||||||
td, currentBlock, genesis := pm.blockchain.Status()
|
var (
|
||||||
|
genesis = pm.blockchain.Genesis()
|
||||||
|
head = pm.blockchain.CurrentHeader()
|
||||||
|
td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64())
|
||||||
|
)
|
||||||
defer pm.Stop()
|
defer pm.Stop()
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
@ -55,16 +59,16 @@ func testStatusMsgErrors(t *testing.T, protocol int) {
|
|||||||
wantError: errResp(ErrNoStatusMsg, "first msg has code 2 (!= 0)"),
|
wantError: errResp(ErrNoStatusMsg, "first msg has code 2 (!= 0)"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
code: StatusMsg, data: statusData{10, DefaultConfig.NetworkId, td, currentBlock, genesis},
|
code: StatusMsg, data: statusData{10, DefaultConfig.NetworkId, td, head.Hash(), genesis.Hash()},
|
||||||
wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", protocol),
|
wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", protocol),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
code: StatusMsg, data: statusData{uint32(protocol), 999, td, currentBlock, genesis},
|
code: StatusMsg, data: statusData{uint32(protocol), 999, td, head.Hash(), genesis.Hash()},
|
||||||
wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"),
|
wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, currentBlock, common.Hash{3}},
|
code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}},
|
||||||
wantError: errResp(ErrGenesisBlockMismatch, "0300000000000000 (!= %x)", genesis[:8]),
|
wantError: errResp(ErrGenesisBlockMismatch, "0300000000000000 (!= %x)", genesis.Hash().Bytes()[:8]),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,13 +77,11 @@ type BlockChain interface {
|
|||||||
GetHeader(hash common.Hash, number uint64) *types.Header
|
GetHeader(hash common.Hash, number uint64) *types.Header
|
||||||
GetHeaderByHash(hash common.Hash) *types.Header
|
GetHeaderByHash(hash common.Hash) *types.Header
|
||||||
CurrentHeader() *types.Header
|
CurrentHeader() *types.Header
|
||||||
GetTdByHash(hash common.Hash) *big.Int
|
GetTd(hash common.Hash, number uint64) *big.Int
|
||||||
InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error)
|
InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error)
|
||||||
Rollback(chain []common.Hash)
|
Rollback(chain []common.Hash)
|
||||||
Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash)
|
|
||||||
GetHeaderByNumber(number uint64) *types.Header
|
GetHeaderByNumber(number uint64) *types.Header
|
||||||
GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash
|
GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash
|
||||||
LastBlockHash() common.Hash
|
|
||||||
Genesis() *types.Block
|
Genesis() *types.Block
|
||||||
SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription
|
SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription
|
||||||
}
|
}
|
||||||
@ -262,9 +260,14 @@ func (pm *ProtocolManager) handle(p *peer) error {
|
|||||||
p.Log().Debug("Light Ethereum peer connected", "name", p.Name())
|
p.Log().Debug("Light Ethereum peer connected", "name", p.Name())
|
||||||
|
|
||||||
// Execute the LES handshake
|
// Execute the LES handshake
|
||||||
td, head, genesis := pm.blockchain.Status()
|
var (
|
||||||
headNum := core.GetBlockNumber(pm.chainDb, head)
|
genesis = pm.blockchain.Genesis()
|
||||||
if err := p.Handshake(td, head, headNum, genesis, pm.server); err != nil {
|
head = pm.blockchain.CurrentHeader()
|
||||||
|
hash = head.Hash()
|
||||||
|
number = head.Number.Uint64()
|
||||||
|
td = pm.blockchain.GetTd(hash, number)
|
||||||
|
)
|
||||||
|
if err := p.Handshake(td, hash, number, genesis.Hash(), pm.server); err != nil {
|
||||||
p.Log().Debug("Light Ethereum handshake failed", "err", err)
|
p.Log().Debug("Light Ethereum handshake failed", "err", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -1135,12 +1138,15 @@ type NodeInfo struct {
|
|||||||
|
|
||||||
// NodeInfo retrieves some protocol metadata about the running host node.
|
// NodeInfo retrieves some protocol metadata about the running host node.
|
||||||
func (self *ProtocolManager) NodeInfo() *NodeInfo {
|
func (self *ProtocolManager) NodeInfo() *NodeInfo {
|
||||||
|
head := self.blockchain.CurrentHeader()
|
||||||
|
hash := head.Hash()
|
||||||
|
|
||||||
return &NodeInfo{
|
return &NodeInfo{
|
||||||
Network: self.networkId,
|
Network: self.networkId,
|
||||||
Difficulty: self.blockchain.GetTdByHash(self.blockchain.LastBlockHash()),
|
Difficulty: self.blockchain.GetTd(hash, head.Number.Uint64()),
|
||||||
Genesis: self.blockchain.Genesis().Hash(),
|
Genesis: self.blockchain.Genesis().Hash(),
|
||||||
Config: self.blockchain.Config(),
|
Config: self.blockchain.Config(),
|
||||||
Head: self.blockchain.LastBlockHash(),
|
Head: hash,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,9 +227,12 @@ func newTestPeer(t *testing.T, name string, version int, pm *ProtocolManager, sh
|
|||||||
}
|
}
|
||||||
// Execute any implicitly requested handshakes and return
|
// Execute any implicitly requested handshakes and return
|
||||||
if shake {
|
if shake {
|
||||||
td, head, genesis := pm.blockchain.Status()
|
var (
|
||||||
headNum := pm.blockchain.CurrentHeader().Number.Uint64()
|
genesis = pm.blockchain.Genesis()
|
||||||
tp.handshake(t, td, head, headNum, genesis)
|
head = pm.blockchain.CurrentHeader()
|
||||||
|
td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64())
|
||||||
|
)
|
||||||
|
tp.handshake(t, td, head.Hash(), head.Number.Uint64(), genesis.Hash())
|
||||||
}
|
}
|
||||||
return tp, errc
|
return tp, errc
|
||||||
}
|
}
|
||||||
|
@ -176,25 +176,6 @@ func (self *LightChain) GasLimit() uint64 {
|
|||||||
return self.hc.CurrentHeader().GasLimit
|
return self.hc.CurrentHeader().GasLimit
|
||||||
}
|
}
|
||||||
|
|
||||||
// LastBlockHash return the hash of the HEAD block.
|
|
||||||
func (self *LightChain) LastBlockHash() common.Hash {
|
|
||||||
self.mu.RLock()
|
|
||||||
defer self.mu.RUnlock()
|
|
||||||
|
|
||||||
return self.hc.CurrentHeader().Hash()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Status returns status information about the current chain such as the HEAD Td,
|
|
||||||
// the HEAD hash and the hash of the genesis block.
|
|
||||||
func (self *LightChain) Status() (td *big.Int, currentBlock common.Hash, genesisBlock common.Hash) {
|
|
||||||
self.mu.RLock()
|
|
||||||
defer self.mu.RUnlock()
|
|
||||||
|
|
||||||
header := self.hc.CurrentHeader()
|
|
||||||
hash := header.Hash()
|
|
||||||
return self.GetTd(hash, header.Number.Uint64()), hash, self.genesisBlock.Hash()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset purges the entire blockchain, restoring it to its genesis state.
|
// Reset purges the entire blockchain, restoring it to its genesis state.
|
||||||
func (bc *LightChain) Reset() {
|
func (bc *LightChain) Reset() {
|
||||||
bc.ResetWithGenesisBlock(bc.genesisBlock)
|
bc.ResetWithGenesisBlock(bc.genesisBlock)
|
||||||
@ -337,7 +318,7 @@ func (self *LightChain) postChainEvents(events []interface{}) {
|
|||||||
for _, event := range events {
|
for _, event := range events {
|
||||||
switch ev := event.(type) {
|
switch ev := event.(type) {
|
||||||
case core.ChainEvent:
|
case core.ChainEvent:
|
||||||
if self.LastBlockHash() == ev.Hash {
|
if self.CurrentHeader().Hash() == ev.Hash {
|
||||||
self.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block})
|
self.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block})
|
||||||
}
|
}
|
||||||
self.chainFeed.Send(ev)
|
self.chainFeed.Send(ev)
|
||||||
|
@ -120,7 +120,7 @@ func (t *BlockTest) Run() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
cmlast := chain.LastBlockHash()
|
cmlast := chain.CurrentBlock().Hash()
|
||||||
if common.Hash(t.json.BestBlock) != cmlast {
|
if common.Hash(t.json.BestBlock) != cmlast {
|
||||||
return fmt.Errorf("last block hash validation mismatch: want: %x, have: %x", t.json.BestBlock, cmlast)
|
return fmt.Errorf("last block hash validation mismatch: want: %x, have: %x", t.json.BestBlock, cmlast)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user