102 lines
3.1 KiB
Nim
102 lines
3.1 KiB
Nim
# Fluffy
|
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
|
# Licensed and distributed under either of
|
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
# As per spec:
|
|
# https://github.com/ethereum/portal-network-specs/blob/master/state-network.md#content-keys-and-content-ids
|
|
|
|
{.push raises: [].}
|
|
|
|
import results, eth/common/eth_types, ssz_serialization, ../../../common/common_types
|
|
|
|
export ssz_serialization, common_types, hash, results
|
|
|
|
const
|
|
MAX_TRIE_NODE_LEN = 1024
|
|
MAX_TRIE_PROOF_LEN = 65
|
|
MAX_BYTECODE_LEN = 32768
|
|
|
|
type
|
|
TrieNode* = List[byte, MAX_TRIE_NODE_LEN]
|
|
TrieProof* = List[TrieNode, MAX_TRIE_PROOF_LEN]
|
|
Bytecode* = List[byte, MAX_BYTECODE_LEN]
|
|
|
|
AccountTrieNodeOffer* = object
|
|
proof*: TrieProof
|
|
blockHash*: BlockHash
|
|
|
|
AccountTrieNodeRetrieval* = object
|
|
node*: TrieNode
|
|
|
|
ContractTrieNodeOffer* = object
|
|
storageProof*: TrieProof
|
|
accountProof*: TrieProof
|
|
blockHash*: BlockHash
|
|
|
|
ContractTrieNodeRetrieval* = object
|
|
node*: TrieNode
|
|
|
|
ContractCodeOffer* = object
|
|
code*: Bytecode
|
|
accountProof*: TrieProof
|
|
blockHash*: BlockHash
|
|
|
|
ContractCodeRetrieval* = object
|
|
code*: Bytecode
|
|
|
|
ContentOfferType* = AccountTrieNodeOffer | ContractTrieNodeOffer | ContractCodeOffer
|
|
ContentRetrievalType* =
|
|
AccountTrieNodeRetrieval | ContractTrieNodeRetrieval | ContractCodeRetrieval
|
|
ContentValueType* = ContentOfferType | ContentRetrievalType
|
|
|
|
func init*(T: type AccountTrieNodeOffer, proof: TrieProof, blockHash: BlockHash): T =
|
|
AccountTrieNodeOffer(proof: proof, blockHash: blockHash)
|
|
|
|
func init*(T: type AccountTrieNodeRetrieval, node: TrieNode): T =
|
|
AccountTrieNodeRetrieval(node: node)
|
|
|
|
func init*(
|
|
T: type ContractTrieNodeOffer,
|
|
storageProof: TrieProof,
|
|
accountProof: TrieProof,
|
|
blockHash: BlockHash,
|
|
): T =
|
|
ContractTrieNodeOffer(
|
|
storageProof: storageProof, accountProof: accountProof, blockHash: blockHash
|
|
)
|
|
|
|
func init*(T: type ContractTrieNodeRetrieval, node: TrieNode): T =
|
|
ContractTrieNodeRetrieval(node: node)
|
|
|
|
func init*(
|
|
T: type ContractCodeOffer,
|
|
code: Bytecode,
|
|
accountProof: TrieProof,
|
|
blockHash: BlockHash,
|
|
): T =
|
|
ContractCodeOffer(code: code, accountProof: accountProof, blockHash: blockHash)
|
|
|
|
func init*(T: type ContractCodeRetrieval, code: Bytecode): T =
|
|
ContractCodeRetrieval(code: code)
|
|
|
|
func toRetrievalValue*(offer: AccountTrieNodeOffer): AccountTrieNodeRetrieval =
|
|
AccountTrieNodeRetrieval.init(offer.proof[^1])
|
|
|
|
func toRetrievalValue*(offer: ContractTrieNodeOffer): ContractTrieNodeRetrieval =
|
|
ContractTrieNodeRetrieval.init(offer.storageProof[^1])
|
|
|
|
func toRetrievalValue*(offer: ContractCodeOffer): ContractCodeRetrieval =
|
|
ContractCodeRetrieval.init(offer.code)
|
|
|
|
func empty*(T: type TrieProof): T =
|
|
TrieProof.init(@[])
|
|
|
|
func encode*(value: ContentValueType): seq[byte] =
|
|
SSZ.encode(value)
|
|
|
|
func decode*(T: type ContentValueType, bytes: openArray[byte]): Result[T, string] =
|
|
decodeSsz(bytes, T)
|