leveldb是一个key-value数据库,所有数据都是以键-值对的形式存储。key一般与hash相关,value一般是要存储的数据结构的RLP编码。区块存储时将区块头和区块体分开存储。
区块头的存储格式为:
headerPrefix + num (uint64 big endian) + hash -> rlpEncode(header)
其中key由区块头前缀、区块号(uint64大端格式)、区块hash构成,value是区块头的RLP编码。
区块体的存储格式为:
bodyPrefix + num (uint64 big endian) + hash -> rlpEncode(block body)
其中key由区块体前缀、区块号(uint64大端格式)、区块hash构成,value是区块体的RLP编码。
key中的前缀可以用来区分数据的类型,在core/database_util.go中定义了各种前缀:
headerPrefix = []byte("h") //headerPrefix + num (uint64 big endian) + hash -> header
tdSuffix = []byte("t") //headerPrefix + num (uint64 big endian) + hash + tdSuffix -> td
numSuffix = []byte("n") //headerPrefix + num (uint64 big endian) + numSuffix -> hash
blockHashPrefix = []byte("H") //blockHashPrefix + hash -> num (uint64 big endian)
bodyPrefix = []byte("b") //bodyPrefix + num (uint64 big endian) + hash -