@ -741,23 +741,25 @@ func (h *serverHandler) handleMsg(p *clientPeer, wg *sync.WaitGroup) error {
auxTrie , _ = trie . New ( root , trie . NewDatabase ( rawdb . NewTable ( h . chainDb , prefix ) ) )
auxTrie , _ = trie . New ( root , trie . NewDatabase ( rawdb . NewTable ( h . chainDb , prefix ) ) )
}
}
}
}
if request . AuxReq == auxRoot {
if auxTrie == nil {
var data [ ] byte
sendResponse ( req . ReqID , 0 , nil , task . servingTime )
if root != ( common . Hash { } ) {
return
data = root [ : ]
}
}
auxData = append ( auxData , data )
// TODO(rjl493456442) short circuit if the proving is failed.
auxBytes += len ( data )
// The original client side code has a dirty hack to retrieve
} else {
// the headers with no valid proof. Keep the compatibility for
if auxTrie != nil {
// legacy les protocol and drop this hack when the les2/3 are
auxTrie . Prove ( request . Key , request . FromLevel , nodes )
// not supported.
err := auxTrie . Prove ( request . Key , request . FromLevel , nodes )
if p . version >= lpv4 && err != nil {
sendResponse ( req . ReqID , 0 , nil , task . servingTime )
return
}
}
if request . AuxReq != 0 {
if request . AuxReq == htAuxHeader {
data := h . getAuxiliaryHeaders ( request )
data := h . getAuxiliaryHeaders ( request )
auxData = append ( auxData , data )
auxData = append ( auxData , data )
auxBytes += len ( data )
auxBytes += len ( data )
}
}
}
if nodes . DataSize ( ) + auxBytes >= softResponseLimit {
if nodes . DataSize ( ) + auxBytes >= softResponseLimit {
break
break
}
}
@ -904,7 +906,7 @@ func (h *serverHandler) getHelperTrie(typ uint, index uint64) (common.Hash, stri
// getAuxiliaryHeaders returns requested auxiliary headers for the CHT request.
// getAuxiliaryHeaders returns requested auxiliary headers for the CHT request.
func ( h * serverHandler ) getAuxiliaryHeaders ( req HelperTrieReq ) [ ] byte {
func ( h * serverHandler ) getAuxiliaryHeaders ( req HelperTrieReq ) [ ] byte {
if req . Type == htCanonical && req . AuxReq == a uxHeader && len ( req . Key ) == 8 {
if req . Type == htCanonical && req . AuxReq == htA uxHeader && len ( req . Key ) == 8 {
blockNum := binary . BigEndian . Uint64 ( req . Key )
blockNum := binary . BigEndian . Uint64 ( req . Key )
hash := rawdb . ReadCanonicalHash ( h . chainDb , blockNum )
hash := rawdb . ReadCanonicalHash ( h . chainDb , blockNum )
return rawdb . ReadHeaderRLP ( h . chainDb , hash , blockNum )
return rawdb . ReadHeaderRLP ( h . chainDb , hash , blockNum )