diff --git a/les/benchmark.go b/les/benchmark.go
index 312d4533dfd9f3379af528733950410bcf6cb7b5..6255c1049e8dc324edccc5285cfa8662344a1db5 100644
--- a/les/benchmark.go
+++ b/les/benchmark.go
@@ -156,7 +156,7 @@ func (b *benchmarkHelperTrie) request(peer *serverPeer, index int) error {
 		for i := range reqs {
 			key := make([]byte, 8)
 			binary.BigEndian.PutUint64(key[:], uint64(rand.Int63n(int64(b.headNum))))
-			reqs[i] = HelperTrieReq{Type: htCanonical, TrieIdx: b.sectionCount - 1, Key: key, AuxReq: auxHeader}
+			reqs[i] = HelperTrieReq{Type: htCanonical, TrieIdx: b.sectionCount - 1, Key: key, AuxReq: htAuxHeader}
 		}
 	}
 
diff --git a/les/handler_test.go b/les/handler_test.go
index 04277f661b55e54d82cd768b937d06c00845f326..f5cbeb8efc092005043f2460f0de6ccf4d6d3dd6 100644
--- a/les/handler_test.go
+++ b/les/handler_test.go
@@ -443,7 +443,7 @@ func testGetCHTProofs(t *testing.T, protocol int) {
 		Type:    htCanonical,
 		TrieIdx: 0,
 		Key:     key,
-		AuxReq:  auxHeader,
+		AuxReq:  htAuxHeader,
 	}}
 	// Send the proof request and verify the response
 	sendRequest(server.peer.app, GetHelperTrieProofsMsg, 42, requestsV2)
diff --git a/les/odr_requests.go b/les/odr_requests.go
index a8cf8f50a97ae1ad4ec2614a3b768c31097e8b0f..962b88a32267de17ea90ab0ca13d90a4a23d407f 100644
--- a/les/odr_requests.go
+++ b/les/odr_requests.go
@@ -295,10 +295,9 @@ const (
 	htCanonical = iota // Canonical hash trie
 	htBloomBits        // BloomBits trie
 
-	// applicable for all helper trie requests
-	auxRoot = 1
-	// applicable for htCanonical
-	auxHeader = 2
+	// helper trie auxiliary types
+	// htAuxNone = 1 ; deprecated number, used in les2/3 previously.
+	htAuxHeader = 2 // applicable for htCanonical, requests for relevant headers
 )
 
 type HelperTrieReq struct {
@@ -339,7 +338,7 @@ func (r *ChtRequest) Request(reqID uint64, peer *serverPeer) error {
 		Type:    htCanonical,
 		TrieIdx: r.ChtNum,
 		Key:     encNum[:],
-		AuxReq:  auxHeader,
+		AuxReq:  htAuxHeader,
 	}
 	return peer.requestHelperTrieProofs(reqID, []HelperTrieReq{req})
 }
diff --git a/les/server_handler.go b/les/server_handler.go
index 2316c9c5a4c0e5bd53f6f539a823861cabb2180a..bec4206e2b8544ac8982110ffc1e88220bb17efd 100644
--- a/les/server_handler.go
+++ b/les/server_handler.go
@@ -741,22 +741,24 @@ func (h *serverHandler) handleMsg(p *clientPeer, wg *sync.WaitGroup) error {
 							auxTrie, _ = trie.New(root, trie.NewDatabase(rawdb.NewTable(h.chainDb, prefix)))
 						}
 					}
-					if request.AuxReq == auxRoot {
-						var data []byte
-						if root != (common.Hash{}) {
-							data = root[:]
-						}
+					if auxTrie == nil {
+						sendResponse(req.ReqID, 0, nil, task.servingTime)
+						return
+					}
+					// TODO(rjl493456442) short circuit if the proving is failed.
+					// The original client side code has a dirty hack to retrieve
+					// the headers with no valid proof. Keep the compatibility for
+					// legacy les protocol and drop this hack when the les2/3 are
+					// 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 == htAuxHeader {
+						data := h.getAuxiliaryHeaders(request)
 						auxData = append(auxData, data)
 						auxBytes += len(data)
-					} else {
-						if auxTrie != nil {
-							auxTrie.Prove(request.Key, request.FromLevel, nodes)
-						}
-						if request.AuxReq != 0 {
-							data := h.getAuxiliaryHeaders(request)
-							auxData = append(auxData, data)
-							auxBytes += len(data)
-						}
 					}
 					if nodes.DataSize()+auxBytes >= softResponseLimit {
 						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.
 func (h *serverHandler) getAuxiliaryHeaders(req HelperTrieReq) []byte {
-	if req.Type == htCanonical && req.AuxReq == auxHeader && len(req.Key) == 8 {
+	if req.Type == htCanonical && req.AuxReq == htAuxHeader && len(req.Key) == 8 {
 		blockNum := binary.BigEndian.Uint64(req.Key)
 		hash := rawdb.ReadCanonicalHash(h.chainDb, blockNum)
 		return rawdb.ReadHeaderRLP(h.chainDb, hash, blockNum)