@ -132,6 +132,7 @@ type node struct {
block * types . Block
block * types . Block
hashBy string
hashBy string
blockBy string
blockBy string
peers map [ string ] bool
td * big . Int
td * big . Int
}
}
@ -396,6 +397,7 @@ func (self *BlockPool) AddBlockHashes(next func() (common.Hash, bool), peerId st
if entry := self . get ( bestpeer . currentBlockHash ) ; entry == nil {
if entry := self . get ( bestpeer . currentBlockHash ) ; entry == nil {
plog . DebugDetailf ( "AddBlockHashes: peer <%s> (head: %s) head section starting from [%s] " , peerId , hex ( bestpeer . currentBlockHash ) , hex ( bestpeer . parentHash ) )
plog . DebugDetailf ( "AddBlockHashes: peer <%s> (head: %s) head section starting from [%s] " , peerId , hex ( bestpeer . currentBlockHash ) , hex ( bestpeer . parentHash ) )
// if head block is not yet in the pool, create entry and start node list for section
// if head block is not yet in the pool, create entry and start node list for section
node := & node {
node := & node {
hash : bestpeer . currentBlockHash ,
hash : bestpeer . currentBlockHash ,
block : bestpeer . currentBlock ,
block : bestpeer . currentBlock ,
@ -622,10 +624,14 @@ func (self *BlockPool) AddBlock(block *types.Block, peerId string) {
self . status . lock . Unlock ( )
self . status . lock . Unlock ( )
entry := self . get ( hash )
entry := self . get ( hash )
blockIsCurrentHead := false
// a peer's current head block is appearing the first time
sender . lock . Lock ( )
sender . lock . Lock ( )
// a peer's current head block is appearing the first time
if hash == sender . currentBlockHash {
if hash == sender . currentBlockHash {
// this happens when block came in a newblock message but
// also if sent in a blockmsg (for instance, if we requested, only if we
// dont apply on blockrequests the restriction of flood control)
blockIsCurrentHead = true
if sender . currentBlock == nil {
if sender . currentBlock == nil {
plog . Debugf ( "AddBlock: add head block %s for peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
plog . Debugf ( "AddBlock: add head block %s for peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
sender . setChainInfoFromBlock ( block )
sender . setChainInfoFromBlock ( block )
@ -643,46 +649,29 @@ func (self *BlockPool) AddBlock(block *types.Block, peerId string) {
plog . DebugDetailf ( "AddBlock: head block %s for peer <%s> (head: %s) already known" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
plog . DebugDetailf ( "AddBlock: head block %s for peer <%s> (head: %s) already known" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
// signal to head section process
// signal to head section process
}
}
// self.wg.Add(1)
// go func() {
// timeout := time.After(1 * time.Second)
// select {
// case sender.currentBlockC <- block:
// case <-timeout:
// }
// self.wg.Done()
// }()
} else {
} else {
plog . DebugDetailf ( "AddBlock: block %s received from peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
plog . DebugDetailf ( "AddBlock: block %s received from peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
// update peer chain info if more recent than what we registered
if block . Td != nil && block . Td . Cmp ( sender . td ) > 0 {
sender . td = block . Td
sender . currentBlockHash = block . Hash ( )
sender . parentHash = block . ParentHash ( )
sender . currentBlock = block
sender . headSection = nil
}
/ * @ zelig ! ! !
/ * @ zelig ! ! !
requested 5 hashes from both A & B . A responds sooner then B , process blocks . Close section .
requested 5 hashes from both A & B . A responds sooner then B , process blocks . Close section .
delayed B sends you block ... UNREQUESTED . Blocked
delayed B sends you block ... UNREQUESTED . Blocked
if entry == nil {
if entry == nil {
plog . DebugDetailf ( "AddBlock: unrequested block %s received from peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
plog . DebugDetailf ( "AddBlock: unrequested block %s received from peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
sender . addError ( ErrUnrequestedBlock , "%x" , hash )
sender . addError ( ErrUnrequestedBlock , "%x" , hash )
self . status . lock . Lock ( )
self . status . lock . Lock ( )
self . status . badPeers [ peerId ] ++
self . status . badPeers [ peerId ] ++
self . status . lock . Unlock ( )
self . status . lock . Unlock ( )
return
return
}
}
* /
* /
}
}
sender . lock . Unlock ( )
sender . lock . Unlock ( )
if entry == nil {
if entry == nil {
// FIXME: here check the cache find or create node -
// put peer as blockBy!
return
return
}
}
@ -690,10 +679,22 @@ func (self *BlockPool) AddBlock(block *types.Block, peerId string) {
node . lock . Lock ( )
node . lock . Lock ( )
defer node . lock . Unlock ( )
defer node . lock . Unlock ( )
// register peer on node as source
if node . peers == nil {
node . peers = make ( map [ string ] bool )
}
FoundBlockCurrentHead , found := node . peers [ sender . id ]
if ! found || FoundBlockCurrentHead {
// if found but not FoundBlockCurrentHead, then no update
// necessary (||)
node . peers [ sender . id ] = blockIsCurrentHead
// for those that are false, TD will update their head
// for those that are true, TD is checked !
// this is checked at the time of TD calculation in checkTD
}
// check if block already received
// check if block already received
if node . block != nil {
if node . block != nil {
plog . DebugDetailf ( "AddBlock: block %s from peer <%s> (head: %s) already sent by <%s> " , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) , node . blockBy )
plog . DebugDetailf ( "AddBlock: block %s from peer <%s> (head: %s) already sent by <%s> " , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) , node . blockBy )
return
}
}
// check if block is already inserted in the blockchain
// check if block is already inserted in the blockchain
@ -704,6 +705,8 @@ func (self *BlockPool) AddBlock(block *types.Block, peerId string) {
/ *
/ *
@ zelig needs discussing
@ zelig needs discussing
Viktor : pow check can be delayed in a go routine and therefore cache
creation is not blocking
// validate block for PoW
// validate block for PoW
if ! self . verifyPoW ( block ) {
if ! self . verifyPoW ( block ) {
plog . Warnf ( "AddBlock: invalid PoW on block %s from peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
plog . Warnf ( "AddBlock: invalid PoW on block %s from peer <%s> (head: %s)" , hex ( hash ) , peerId , hex ( sender . currentBlockHash ) )
@ -718,8 +721,7 @@ func (self *BlockPool) AddBlock(block *types.Block, peerId string) {
* /
* /
node . block = block
node . block = block
node . blockBy = peerId
// node.blockBy = peerId
node . td = block . Td // optional field
self . status . lock . Lock ( )
self . status . lock . Lock ( )
self . status . values . Blocks ++
self . status . values . Blocks ++