diff --git a/postgres/key_type.go b/postgres/key_type.go index b92164a..bfa0ac1 100644 --- a/postgres/key_type.go +++ b/postgres/key_type.go @@ -22,6 +22,7 @@ type KeyType uint const ( Invalid KeyType = iota + Static Keccak Prefixed Suffixed @@ -30,11 +31,11 @@ const ( ) var ( - // keyDelineation is used to delineate the key prefixes and suffixes - KeyDelineation = []byte("/") + // KeyDelineation is used to delineate the key prefixes and suffixes + KeyDelineation = []byte("-fix-") - // numberDelineation is used to delineate the block number encoded in a key - NumberDelineation = []byte(":") + // NumberDelineation is used to delineate the block number encoded in a key + NumberDelineation = []byte("-nmb-") // Data item prefixes (use single byte to avoid mixing data types, avoid `i`, used for indexes). HeaderPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header @@ -45,8 +46,12 @@ var ( func ResolveKeyType(key []byte) (KeyType, [][]byte) { sk := bytes.Split(key, KeyDelineation) + // these heuristics are reliant on the current db key patterns switch len(sk) { case 1: + if len(sk[0]) < 32 { + return Static, sk + } return Keccak, sk case 2: switch prefix := sk[0]; { diff --git a/postgres/util.go b/postgres/util.go index 92838d3..bf7b82a 100644 --- a/postgres/util.go +++ b/postgres/util.go @@ -55,6 +55,8 @@ func DatastoreKeyFromGethKey(h []byte) (string, []byte, error) { // I.e. the public.blocks datastore key == the hex representation of the geth key // Alternatively, decompose the data and derive the hash return common.Bytes2Hex(h), keyComponents[0], nil + case Static: + return common.Bytes2Hex(h), nil, nil default: return "", nil, fmt.Errorf("invalid formatting of database key: %x", h) }