History content keys (#919)

* Change History content key to us SSZ Union and adjust tests

* Change slot to byteBE instead of LE

This is currently not specified in the Portal network
specifications, but we are using already BE for the actual content
key, so change it also here to remain consistent.
This commit is contained in:
Kim De Mey 2022-01-05 09:49:49 +01:00 committed by GitHub
parent f4ca598c03
commit a8640fe57c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 153 additions and 71 deletions

View File

@ -19,33 +19,27 @@ export ssz_serialization, common_types
type type
ContentType* = enum ContentType* = enum
BlockHeader = 0x01 blockHeader = 0x00
BlockBody = 0x02 blockBody = 0x01
Receipts = 0x03 receipts = 0x02
BlockHash* = MDigest[32 * 8] # Bytes32 BlockHash* = MDigest[32 * 8] # Bytes32
ContentKey* = object ContentKeyType* = object
chainId*: uint16 chainId*: uint16
contentType*: ContentType
blockHash*: BlockHash blockHash*: BlockHash
ContentKey* = object
case contentType*: ContentType
of blockHeader:
blockHeaderKey*: ContentKeyType
of blockBody:
blockBodyKey*: ContentKeyType
of receipts:
receiptsKey*: ContentKeyType
ContentId* = Uint256 ContentId* = Uint256
template toSszType*(x: ContentType): uint8 =
uint8(x)
func fromSszBytes*(T: type ContentType, data: openArray[byte]):
T {.raises: [MalformedSszError, Defect].} =
if data.len != sizeof(uint8):
raiseIncorrectSize T
var contentType: T
if not checkedEnumAssign(contentType, data[0]):
raiseIncorrectSize T
contentType
func encode*(contentKey: ContentKey): ByteList = func encode*(contentKey: ContentKey): ByteList =
ByteList.init(SSZ.encode(contentKey)) ByteList.init(SSZ.encode(contentKey))

View File

@ -111,7 +111,7 @@ func toContentId*(contentKey: ContentKey): ContentId =
h.update(key.address) h.update(key.address)
let n2 = let n2 =
block: computeContentId keccak256: block: computeContentId keccak256:
h.update(toBytesLE(key.slot)) h.update(toBytesBE(key.slot))
n1 + n2 # uint256 will wrap arround, practically applying the modulo 256 n1 + n2 # uint256 will wrap arround, practically applying the modulo 256
of contractBytecode: # sha256(address | code_hash) of contractBytecode: # sha256(address | code_hash)

View File

@ -8,77 +8,110 @@
{.used.} {.used.}
import import
unittest2, stew/byteutils, unittest2, stew/byteutils, stint,
../network/history/history_content ../network/history/history_content
# According to test vectors: # According to test vectors:
# TODO: Add link once test vectors are merged # TODO: Add link once test vectors are merged
suite "History ContentKey Encodings": suite "History ContentKey Encodings":
test "BlockHeader": test "BlockHeader":
# Input
var blockHash: BlockHash var blockHash: BlockHash
blockHash.data = hexToByteArray[sizeof(BlockHash)]( blockHash.data = hexToByteArray[sizeof(BlockHash)](
"0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d") "0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d")
let contentKey =
ContentKey(chainId: 15'u16, contentType: BlockHeader, blockHash: blockHash) # Output
const
contentKeyHex =
"000f00d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
contentId =
"15025167517633317571792618561170587584740338038067807801482118109695980329625"
# or
contentIdHexBE =
"2137f185b713a60dd1190e650d01227b4f94ecddc9c95478e2c591c40557da99"
let contentKey = ContentKey(
contentType: blockHeader,
blockHeaderKey: ContentKeyType(chainId: 15'u16, blockHash: blockHash))
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"0f0001d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
# "010f00d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
let contentKeyDecoded = decoded.get() let contentKeyDecoded = decoded.get()
check: check:
contentKeyDecoded.chainId == contentKey.chainId
contentKeyDecoded.contentType == contentKey.contentType contentKeyDecoded.contentType == contentKey.contentType
contentKeyDecoded.blockHash == contentKey.blockHash contentKeyDecoded.blockHeaderKey == contentKey.blockHeaderKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"9a310df5e6135cbd834041011be1b350e589ba013f11584ed527583bc39d3c27" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE
test "BlockBody": test "BlockBody":
# Input
var blockHash: BlockHash var blockHash: BlockHash
blockHash.data = hexToByteArray[sizeof(BlockHash)]( blockHash.data = hexToByteArray[sizeof(BlockHash)](
"0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d") "0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d")
let contentKey =
ContentKey(chainId: 20'u16, contentType: BlockBody, blockHash: blockHash) # Output
const
contentKeyHex =
"011400d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
contentId =
"12834862124958403129911294156243112356210437741210740000860318140844473844426"
# or
contentIdHexBE =
"1c6046475f0772132774ab549173ca8487bea031ce539cad8e990c08df5802ca"
let contentKey = ContentKey(
contentType: blockBody,
blockBodyKey: ContentKeyType(chainId: 20'u16, blockHash: blockHash))
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"140002d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
# "021400d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
let contentKeyDecoded = decoded.get() let contentKeyDecoded = decoded.get()
check: check:
contentKeyDecoded.chainId == contentKey.chainId
contentKeyDecoded.contentType == contentKey.contentType contentKeyDecoded.contentType == contentKey.contentType
contentKeyDecoded.blockHash == contentKey.blockHash contentKeyDecoded.blockBodyKey == contentKey.blockBodyKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"42a9bb9fd974f4d3020fe81aa584277010a9e344bed52bf1610e9d360203380a" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE
test "Receipts": test "Receipts":
var blockHash: BlockHash var blockHash: BlockHash
blockHash.data = hexToByteArray[sizeof(BlockHash)]( blockHash.data = hexToByteArray[sizeof(BlockHash)](
"0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d") "0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d")
let contentKey =
ContentKey(chainId: 4'u16, contentType: Receipts, blockHash: blockHash) # Output
const
contentKeyHex =
"020400d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
contentId =
"76995449220721979583200368506411933662679656077191192504502358532083948020658"
# or
contentIdHexBE =
"aa39e1423e92f5a667ace5b79c2c98adbfd79c055d891d0b9c49c40f816563b2"
let contentKey = ContentKey(
contentType: receipts,
receiptsKey: ContentKeyType(chainId: 4'u16, blockHash: blockHash))
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"040003d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
# "030400d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
let contentKeyDecoded = decoded.get() let contentKeyDecoded = decoded.get()
check: check:
contentKeyDecoded.chainId == contentKey.chainId
contentKeyDecoded.contentType == contentKey.contentType contentKeyDecoded.contentType == contentKey.contentType
contentKeyDecoded.blockHash == contentKey.blockHash contentKeyDecoded.receiptsKey == contentKey.receiptsKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"4b92510bafa02f62811ce6d0e27d2424ba34d41fbe38abc3ea4e274d6c76fa3e" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE

View File

@ -15,6 +15,7 @@ import
# TODO: Add link once test vectors are merged # TODO: Add link once test vectors are merged
suite "State ContentKey Encodings": suite "State ContentKey Encodings":
# Common input
const const
stateRoot = hexToByteArray[sizeof(Bytes32)]( stateRoot = hexToByteArray[sizeof(Bytes32)](
"0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d") "0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d")
@ -22,10 +23,21 @@ suite "State ContentKey Encodings":
"0x829bd824b016326a401d083b33d092293333a830") "0x829bd824b016326a401d083b33d092293333a830")
test "AccountTrieNode": test "AccountTrieNode":
# Input
var nodeHash: NodeHash var nodeHash: NodeHash
nodeHash.data = hexToByteArray[sizeof(NodeHash)]( nodeHash.data = hexToByteArray[sizeof(NodeHash)](
"0xb8be7903aee73b8f6a59cd44a1f52c62148e1f376c0dfa1f5f773a98666efc2b") "0xb8be7903aee73b8f6a59cd44a1f52c62148e1f376c0dfa1f5f773a98666efc2b")
let path = ByteList.init(@[byte 1, 2, 0, 1]) const
path = ByteList.init(@[byte 1, 2, 0, 1])
# Output
contentKeyHex =
"0044000000b8be7903aee73b8f6a59cd44a1f52c62148e1f376c0dfa1f5f773a98666efc2bd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d01020001"
contentId =
"41237096982860596884042712109427867048220765019203857308279863638242761605893"
# or
contentIdHexBE =
"5b2b5ea9a7384491010c1aa459a0f967dcf8b69988adbfe7e0bed513e9bb8305"
let let
accountTrieNodeKey = AccountTrieNodeKey( accountTrieNodeKey = AccountTrieNodeKey(
@ -34,8 +46,7 @@ suite "State ContentKey Encodings":
contentType: accountTrieNode, accountTrieNodeKey: accountTrieNodeKey) contentType: accountTrieNode, accountTrieNodeKey: accountTrieNodeKey)
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"0044000000b8be7903aee73b8f6a59cd44a1f52c62148e1f376c0dfa1f5f773a98666efc2bd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d01020001"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
@ -44,14 +55,26 @@ suite "State ContentKey Encodings":
contentKeyDecoded.contentType == contentKey.contentType contentKeyDecoded.contentType == contentKey.contentType
contentKeyDecoded.accountTrieNodeKey == contentKey.accountTrieNodeKey contentKeyDecoded.accountTrieNodeKey == contentKey.accountTrieNodeKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"5b2b5ea9a7384491010c1aa459a0f967dcf8b69988adbfe7e0bed513e9bb8305" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE
test "ContractStorageTrieNode": test "ContractStorageTrieNode":
# Input
var nodeHash: NodeHash var nodeHash: NodeHash
nodeHash.data = hexToByteArray[sizeof(NodeHash)]( nodeHash.data = hexToByteArray[sizeof(NodeHash)](
"0x3e190b68719aecbcb28ed2271014dd25f2aa633184988eb414189ce0899cade5") "0x3e190b68719aecbcb28ed2271014dd25f2aa633184988eb414189ce0899cade5")
let path = ByteList.init(@[byte 1, 0, 15, 14, 12, 0]) const
path = ByteList.init(@[byte 1, 0, 15, 14, 12, 0])
# Output
contentKeyHex =
"01829bd824b016326a401d083b33d092293333a830580000003e190b68719aecbcb28ed2271014dd25f2aa633184988eb414189ce0899cade5d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d01000f0e0c00"
contentId =
"43529358882110548041037387588279806363134301284609868141745095118932570363585"
# or
contentIdHexBE =
"603cbe7902925ce359822378a4cb1b4b53e1bf19d003de2c26e55812d76956c1"
let let
contractStorageTrieNodeKey = ContractStorageTrieNodeKey( contractStorageTrieNodeKey = ContractStorageTrieNodeKey(
@ -61,8 +84,7 @@ suite "State ContentKey Encodings":
contractStorageTrieNodeKey: contractStorageTrieNodeKey) contractStorageTrieNodeKey: contractStorageTrieNodeKey)
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"01829bd824b016326a401d083b33d092293333a830580000003e190b68719aecbcb28ed2271014dd25f2aa633184988eb414189ce0899cade5d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d01000f0e0c00"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
@ -72,10 +94,21 @@ suite "State ContentKey Encodings":
contentKeyDecoded.contractStorageTrieNodeKey == contentKeyDecoded.contractStorageTrieNodeKey ==
contentKey.contractStorageTrieNodeKey contentKey.contractStorageTrieNodeKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"603cbe7902925ce359822378a4cb1b4b53e1bf19d003de2c26e55812d76956c1" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE
test "AccountTrieProof": test "AccountTrieProof":
# Output
const
contentKeyHex =
"02829bd824b016326a401d083b33d092293333a830d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
contentId =
"45301550050471302973396879294932122279426162994178563319590607565171451545101"
# or
contentIdHexBE =
"6427c4c8d42db15c2aca8dfc7dff7ce2c8c835441b566424fa3377dd031cc60d"
let let
accountTrieProofKey = AccountTrieProofKey( accountTrieProofKey = AccountTrieProofKey(
address: address, stateRoot: stateRoot) address: address, stateRoot: stateRoot)
@ -84,8 +117,7 @@ suite "State ContentKey Encodings":
accountTrieProofKey: accountTrieProofKey) accountTrieProofKey: accountTrieProofKey)
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"02829bd824b016326a401d083b33d092293333a830d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
@ -94,11 +126,23 @@ suite "State ContentKey Encodings":
contentKeyDecoded.contentType == contentKey.contentType contentKeyDecoded.contentType == contentKey.contentType
contentKeyDecoded.accountTrieProofKey == contentKey.accountTrieProofKey contentKeyDecoded.accountTrieProofKey == contentKey.accountTrieProofKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"6427c4c8d42db15c2aca8dfc7dff7ce2c8c835441b566424fa3377dd031cc60d" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE
test "ContractStorageTrieProof": test "ContractStorageTrieProof":
let slot = 239304.stuint(256) # Input
const
slot = 239304.stuint(256)
# Output
contentKeyHex =
"03829bd824b016326a401d083b33d092293333a830c8a6030000000000000000000000000000000000000000000000000000000000d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
contentId =
"80413803151602881485894828440259195604313253842905231566803078625935967002376"
# or
contentIdHexBE =
"b1c89984803cebd325303ba035f9c4ca0d0d91b2cbfef84d455e7a847ade1f08"
let let
contractStorageTrieProofKey = ContractStorageTrieProofKey( contractStorageTrieProofKey = ContractStorageTrieProofKey(
@ -108,8 +152,7 @@ suite "State ContentKey Encodings":
contractStorageTrieProofKey: contractStorageTrieProofKey) contractStorageTrieProofKey: contractStorageTrieProofKey)
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"03829bd824b016326a401d083b33d092293333a830c8a6030000000000000000000000000000000000000000000000000000000000d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
@ -119,14 +162,26 @@ suite "State ContentKey Encodings":
contentKeyDecoded.contractStorageTrieProofKey == contentKeyDecoded.contractStorageTrieProofKey ==
contentKey.contractStorageTrieProofKey contentKey.contractStorageTrieProofKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"ce5a3a6bc958561da0015d92f2f6b4f5a2cf6a4ae3f6a75c97f05e9e2a6f4387" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE
test "ContractBytecode": test "ContractBytecode":
# Input
var codeHash: CodeHash var codeHash: CodeHash
codeHash.data = hexToByteArray[sizeof(CodeHash)]( codeHash.data = hexToByteArray[sizeof(CodeHash)](
"0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d") "0xd1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d")
# Output
const
contentKeyHex =
"04829bd824b016326a401d083b33d092293333a830d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
contentId =
"9243655320250466575533858917172702581481192615849913473767356296630272634800"
# or
contentIdHexBE =
"146fb937afe42bcf11d25ad57d67734b9a7138677d59eeec3f402908f54dafb0"
let let
contractBytecodeKey = ContractBytecodeKey( contractBytecodeKey = ContractBytecodeKey(
address: address, codeHash: codeHash) address: address, codeHash: codeHash)
@ -135,8 +190,7 @@ suite "State ContentKey Encodings":
contractBytecodeKey: contractBytecodeKey) contractBytecodeKey: contractBytecodeKey)
let encoded = encode(contentKey) let encoded = encode(contentKey)
check encoded.asSeq.toHex == check encoded.asSeq.toHex == contentKeyHex
"04829bd824b016326a401d083b33d092293333a830d1c390624d3bd4e409a61a858e5dcc5517729a9170d014a6c96530d64dd8621d"
let decoded = decode(encoded) let decoded = decode(encoded)
check decoded.isSome() check decoded.isSome()
@ -145,5 +199,6 @@ suite "State ContentKey Encodings":
contentKeyDecoded.contentType == contentKey.contentType contentKeyDecoded.contentType == contentKey.contentType
contentKeyDecoded.contractBytecodeKey == contentKey.contractBytecodeKey contentKeyDecoded.contractBytecodeKey == contentKey.contractBytecodeKey
toContentId(contentKey).toHex() == toContentId(contentKey) == parse(contentId, Stuint[256], 10)
"146fb937afe42bcf11d25ad57d67734b9a7138677d59eeec3f402908f54dafb0" # In stint this does BE hex string
toContentId(contentKey).toHex() == contentIdHexBE