From 096a8ecbc65bbd20443b0e28ddaab6f066adc867 Mon Sep 17 00:00:00 2001 From: cuiweixie Date: Tue, 19 Aug 2025 18:14:53 +0800 Subject: [PATCH] core/rawdb: refactor to use prealloc and copy --- core/rawdb/schema.go | 51 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index 3588063468..2bde17d873 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -185,12 +185,33 @@ func headerKeyPrefix(number uint64) []byte { // headerKey = headerPrefix + num (uint64 big endian) + hash func headerKey(number uint64, hash common.Hash) []byte { - return append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...) + numEnc := encodeBlockNumber(number) + hashBytes := hash.Bytes() + + totalLen := len(headerPrefix) + len(numEnc) + len(hashBytes) + b := make([]byte, totalLen) + + off := 0 + off += copy(b[off:], headerPrefix) + off += copy(b[off:], numEnc) + copy(b[off:], hashBytes) + + return b } // headerHashKey = headerPrefix + num (uint64 big endian) + headerHashSuffix func headerHashKey(number uint64) []byte { - return append(append(headerPrefix, encodeBlockNumber(number)...), headerHashSuffix...) + numEnc := encodeBlockNumber(number) + + totalLen := len(headerPrefix) + len(numEnc) + len(headerHashSuffix) + b := make([]byte, totalLen) + + off := 0 + off += copy(b[off:], headerPrefix) + off += copy(b[off:], numEnc) + copy(b[off:], headerHashSuffix) + + return b } // headerNumberKey = headerNumberPrefix + hash @@ -200,12 +221,34 @@ func headerNumberKey(hash common.Hash) []byte { // blockBodyKey = blockBodyPrefix + num (uint64 big endian) + hash func blockBodyKey(number uint64, hash common.Hash) []byte { - return append(append(blockBodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...) + numEnc := encodeBlockNumber(number) + hashBytes := hash.Bytes() + + totalLen := len(blockBodyPrefix) + len(numEnc) + len(hashBytes) + b := make([]byte, totalLen) + + off := 0 + off += copy(b[off:], blockBodyPrefix) + off += copy(b[off:], numEnc) + copy(b[off:], hashBytes) + + return b } // blockReceiptsKey = blockReceiptsPrefix + num (uint64 big endian) + hash func blockReceiptsKey(number uint64, hash common.Hash) []byte { - return append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...) + numEnc := encodeBlockNumber(number) + hashBytes := hash.Bytes() + + totalLen := len(blockReceiptsPrefix) + len(numEnc) + len(hashBytes) + b := make([]byte, totalLen) + + off := 0 + off += copy(b[off:], blockReceiptsPrefix) + off += copy(b[off:], numEnc) + copy(b[off:], hashBytes) + + return b } // txLookupKey = txLookupPrefix + hash