Bump modules to take advantage of the new Json format flavors support
Since quite a lot of additional procs were now compiled as generics, this lead to compiler bugs that had to be worked-around: * The `Domain` type was renamed to `Eth2Domain` to avoid compilation errors due to conflicts with `nativesockets.Domain`. Similarly, `eth2_network.KeyPair` was renamed to `NetKeyPair`. * A new more robust version of `hexToByteArray` was added to stew
This commit is contained in:
parent
8b76ceed52
commit
2eacfc4685
|
@ -31,13 +31,12 @@ export
|
||||||
|
|
||||||
type
|
type
|
||||||
RpcServer* = RpcHttpServer
|
RpcServer* = RpcHttpServer
|
||||||
KeyPair* = eth2_network.KeyPair
|
|
||||||
|
|
||||||
BeaconNode* = ref object
|
BeaconNode* = ref object
|
||||||
nickname*: string
|
nickname*: string
|
||||||
graffitiBytes*: GraffitiBytes
|
graffitiBytes*: GraffitiBytes
|
||||||
network*: Eth2Node
|
network*: Eth2Node
|
||||||
netKeys*: KeyPair
|
netKeys*: NetKeyPair
|
||||||
db*: BeaconChainDB
|
db*: BeaconChainDB
|
||||||
config*: BeaconNodeConf
|
config*: BeaconNodeConf
|
||||||
attachedValidators*: ref ValidatorPool
|
attachedValidators*: ref ValidatorPool
|
||||||
|
|
|
@ -40,7 +40,7 @@ logScope:
|
||||||
topics = "networking"
|
topics = "networking"
|
||||||
|
|
||||||
type
|
type
|
||||||
KeyPair* = crypto.KeyPair
|
NetKeyPair* = crypto.KeyPair
|
||||||
PublicKey* = crypto.PublicKey
|
PublicKey* = crypto.PublicKey
|
||||||
PrivateKey* = crypto.PrivateKey
|
PrivateKey* = crypto.PrivateKey
|
||||||
|
|
||||||
|
@ -1368,7 +1368,7 @@ template tcpEndPoint(address, port): auto =
|
||||||
MultiAddress.init(address, tcpProtocol, port)
|
MultiAddress.init(address, tcpProtocol, port)
|
||||||
|
|
||||||
proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
||||||
config: BeaconNodeConf): KeyPair =
|
config: BeaconNodeConf): NetKeyPair =
|
||||||
case config.cmd
|
case config.cmd
|
||||||
of noCommand, record:
|
of noCommand, record:
|
||||||
if config.netKeyFile == "random":
|
if config.netKeyFile == "random":
|
||||||
|
@ -1384,7 +1384,7 @@ proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
||||||
quit QuitFailure
|
quit QuitFailure
|
||||||
info "Generating new networking key", network_public_key = pubKey,
|
info "Generating new networking key", network_public_key = pubKey,
|
||||||
network_peer_id = $pres.get()
|
network_peer_id = $pres.get()
|
||||||
return KeyPair(seckey: privKey, pubkey: privKey.getKey().tryGet())
|
return NetKeyPair(seckey: privKey, pubkey: privKey.getKey().tryGet())
|
||||||
else:
|
else:
|
||||||
let keyPath =
|
let keyPath =
|
||||||
if isAbsolute(config.netKeyFile):
|
if isAbsolute(config.netKeyFile):
|
||||||
|
@ -1410,7 +1410,7 @@ proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
||||||
let pubKey = privKey.getKey().tryGet()
|
let pubKey = privKey.getKey().tryGet()
|
||||||
info "Network key storage was successfully unlocked",
|
info "Network key storage was successfully unlocked",
|
||||||
key_path = keyPath, network_public_key = pubKey
|
key_path = keyPath, network_public_key = pubKey
|
||||||
return KeyPair(seckey: privKey, pubkey: pubKey)
|
return NetKeyPair(seckey: privKey, pubkey: pubKey)
|
||||||
else:
|
else:
|
||||||
info "Network key storage is missing, creating a new one",
|
info "Network key storage is missing, creating a new one",
|
||||||
key_path = keyPath
|
key_path = keyPath
|
||||||
|
@ -1436,7 +1436,7 @@ proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
||||||
|
|
||||||
info "New network key storage was created", key_path = keyPath,
|
info "New network key storage was created", key_path = keyPath,
|
||||||
network_public_key = pubKey
|
network_public_key = pubKey
|
||||||
return KeyPair(seckey: privKey, pubkey: pubKey)
|
return NetKeyPair(seckey: privKey, pubkey: pubKey)
|
||||||
|
|
||||||
of createTestnet:
|
of createTestnet:
|
||||||
if config.netKeyFile == "random":
|
if config.netKeyFile == "random":
|
||||||
|
@ -1472,7 +1472,7 @@ proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
||||||
info "New network key storage was created", key_path = keyPath,
|
info "New network key storage was created", key_path = keyPath,
|
||||||
network_public_key = pubKey
|
network_public_key = pubKey
|
||||||
|
|
||||||
return KeyPair(seckey: privKey, pubkey: privkey.getKey().tryGet())
|
return NetKeyPair(seckey: privKey, pubkey: privkey.getKey().tryGet())
|
||||||
else:
|
else:
|
||||||
let res = PrivateKey.random(Secp256k1, rng)
|
let res = PrivateKey.random(Secp256k1, rng)
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
|
@ -1480,7 +1480,7 @@ proc getPersistentNetKeys*(rng: var BrHmacDrbgContext,
|
||||||
quit QuitFailure
|
quit QuitFailure
|
||||||
|
|
||||||
let privKey = res.get()
|
let privKey = res.get()
|
||||||
return KeyPair(seckey: privKey, pubkey: privkey.getKey().tryGet())
|
return NetKeyPair(seckey: privKey, pubkey: privkey.getKey().tryGet())
|
||||||
|
|
||||||
func gossipId(data: openArray[byte], valid: bool): seq[byte] =
|
func gossipId(data: openArray[byte], valid: bool): seq[byte] =
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/p2p-interface.md#topics-and-messages
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/p2p-interface.md#topics-and-messages
|
||||||
|
@ -1529,7 +1529,7 @@ proc newBeaconSwitch*(config: BeaconNodeConf, seckey: PrivateKey,
|
||||||
|
|
||||||
proc createEth2Node*(rng: ref BrHmacDrbgContext,
|
proc createEth2Node*(rng: ref BrHmacDrbgContext,
|
||||||
config: BeaconNodeConf,
|
config: BeaconNodeConf,
|
||||||
netKeys: KeyPair,
|
netKeys: NetKeyPair,
|
||||||
enrForkId: ENRForkID): Eth2Node =
|
enrForkId: ENRForkID): Eth2Node =
|
||||||
var
|
var
|
||||||
(extIp, extTcpPort, extUdpPort) = setupAddress(config.nat,
|
(extIp, extTcpPort, extUdpPort) = setupAddress(config.nat,
|
||||||
|
@ -1611,7 +1611,7 @@ proc announcedENR*(node: Eth2Node): enr.Record =
|
||||||
doAssert node.discovery != nil, "The Eth2Node must be initialized"
|
doAssert node.discovery != nil, "The Eth2Node must be initialized"
|
||||||
node.discovery.localNode.record
|
node.discovery.localNode.record
|
||||||
|
|
||||||
proc shortForm*(id: KeyPair): string =
|
proc shortForm*(id: NetKeyPair): string =
|
||||||
$PeerID.init(id.pubkey)
|
$PeerID.init(id.pubkey)
|
||||||
|
|
||||||
proc subscribe*(node: Eth2Node, topic: string, topicParams: TopicParams, enableTopicMetrics: bool = false) =
|
proc subscribe*(node: Eth2Node, topic: string, topicParams: TopicParams, enableTopicMetrics: bool = false) =
|
||||||
|
|
|
@ -126,7 +126,7 @@ type
|
||||||
DOMAIN_SYNC_COMMITTEE = 7
|
DOMAIN_SYNC_COMMITTEE = 7
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#custom-types
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#custom-types
|
||||||
Domain* = array[32, byte]
|
Eth2Domain* = array[32, byte]
|
||||||
|
|
||||||
# https://github.com/nim-lang/Nim/issues/574 and be consistent across
|
# https://github.com/nim-lang/Nim/issues/574 and be consistent across
|
||||||
# 32-bit and 64-bit word platforms.
|
# 32-bit and 64-bit word platforms.
|
||||||
|
@ -324,7 +324,7 @@ type
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#signingdata
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#signingdata
|
||||||
SigningData* = object
|
SigningData* = object
|
||||||
object_root*: Eth2Digest
|
object_root*: Eth2Digest
|
||||||
domain*: Domain
|
domain*: Eth2Domain
|
||||||
|
|
||||||
GraffitiBytes* = distinct array[MAX_GRAFFITI_SIZE, byte]
|
GraffitiBytes* = distinct array[MAX_GRAFFITI_SIZE, byte]
|
||||||
|
|
||||||
|
@ -729,6 +729,14 @@ proc readValue*(reader: var JsonReader, value: var CommitteeIndex)
|
||||||
{.raises: [IOError, SerializationError, Defect].} =
|
{.raises: [IOError, SerializationError, Defect].} =
|
||||||
value = CommitteeIndex reader.readValue(distinctBase CommitteeIndex)
|
value = CommitteeIndex reader.readValue(distinctBase CommitteeIndex)
|
||||||
|
|
||||||
|
proc writeValue*(writer: var JsonWriter, value: HashList)
|
||||||
|
{.raises: [IOError, SerializationError, Defect].} =
|
||||||
|
writeValue(writer, value.data)
|
||||||
|
|
||||||
|
proc readValue*(reader: var JsonReader, value: var HashList)
|
||||||
|
{.raises: [IOError, SerializationError, Defect].} =
|
||||||
|
readValue(reader, value.data)
|
||||||
|
|
||||||
template writeValue*(writer: var JsonWriter, value: Version | ForkDigest) =
|
template writeValue*(writer: var JsonWriter, value: Version | ForkDigest) =
|
||||||
writeValue(writer, $value)
|
writeValue(writer, $value)
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,6 @@ import
|
||||||
# Internal
|
# Internal
|
||||||
./datatypes, ./digest, ./crypto, ../ssz/merkleization
|
./datatypes, ./digest, ./crypto, ../ssz/merkleization
|
||||||
|
|
||||||
type
|
|
||||||
# This solves an ambiguous identifier Error in some contexts
|
|
||||||
# (other candidate is nativesockets.Domain)
|
|
||||||
Domain = datatypes.Domain
|
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#integer_squareroot
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#integer_squareroot
|
||||||
func integer_squareroot*(n: SomeInteger): SomeInteger =
|
func integer_squareroot*(n: SomeInteger): SomeInteger =
|
||||||
## Return the largest integer ``x`` such that ``x**2 <= n``.
|
## Return the largest integer ``x`` such that ``x**2 <= n``.
|
||||||
|
@ -129,7 +124,7 @@ func compute_fork_digest*(current_version: Version,
|
||||||
func compute_domain*(
|
func compute_domain*(
|
||||||
domain_type: DomainType,
|
domain_type: DomainType,
|
||||||
fork_version: Version,
|
fork_version: Version,
|
||||||
genesis_validators_root: Eth2Digest = ZERO_HASH): Domain =
|
genesis_validators_root: Eth2Digest = ZERO_HASH): Eth2Domain =
|
||||||
## Return the domain for the ``domain_type`` and ``fork_version``.
|
## Return the domain for the ``domain_type`` and ``fork_version``.
|
||||||
let fork_data_root =
|
let fork_data_root =
|
||||||
compute_fork_data_root(fork_version, genesis_validators_root)
|
compute_fork_data_root(fork_version, genesis_validators_root)
|
||||||
|
@ -138,7 +133,10 @@ func compute_domain*(
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#get_domain
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#get_domain
|
||||||
func get_domain*(
|
func get_domain*(
|
||||||
fork: Fork, domain_type: DomainType, epoch: Epoch, genesis_validators_root: Eth2Digest): Domain =
|
fork: Fork,
|
||||||
|
domain_type: DomainType,
|
||||||
|
epoch: Epoch,
|
||||||
|
genesis_validators_root: Eth2Digest): Eth2Domain =
|
||||||
## Return the signature domain (fork version concatenated with domain type)
|
## Return the signature domain (fork version concatenated with domain type)
|
||||||
## of a message.
|
## of a message.
|
||||||
let fork_version =
|
let fork_version =
|
||||||
|
@ -149,13 +147,13 @@ func get_domain*(
|
||||||
compute_domain(domain_type, fork_version, genesis_validators_root)
|
compute_domain(domain_type, fork_version, genesis_validators_root)
|
||||||
|
|
||||||
func get_domain*(
|
func get_domain*(
|
||||||
state: BeaconState, domain_type: DomainType, epoch: Epoch): Domain =
|
state: BeaconState, domain_type: DomainType, epoch: Epoch): Eth2Domain =
|
||||||
## Return the signature domain (fork version concatenated with domain type)
|
## Return the signature domain (fork version concatenated with domain type)
|
||||||
## of a message.
|
## of a message.
|
||||||
get_domain(state.fork, domain_type, epoch, state.genesis_validators_root)
|
get_domain(state.fork, domain_type, epoch, state.genesis_validators_root)
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#compute_signing_root
|
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/beacon-chain.md#compute_signing_root
|
||||||
func compute_signing_root*(ssz_object: auto, domain: Domain): Eth2Digest =
|
func compute_signing_root*(ssz_object: auto, domain: Eth2Domain): Eth2Digest =
|
||||||
## Return the signing root of an object by calculating the root of the
|
## Return the signing root of an object by calculating the root of the
|
||||||
## object-domain tree.
|
## object-domain tree.
|
||||||
let domain_wrapped_object = SigningData(
|
let domain_wrapped_object = SigningData(
|
||||||
|
|
|
@ -51,7 +51,7 @@ type
|
||||||
|
|
||||||
proc jsonPrinterImpl[T](m: MemRange, outStream: OutputStream, pretty: bool) {.raisesssz.} =
|
proc jsonPrinterImpl[T](m: MemRange, outStream: OutputStream, pretty: bool) {.raisesssz.} =
|
||||||
var typedNavigator = sszMount(m, T)
|
var typedNavigator = sszMount(m, T)
|
||||||
var jsonWriter = init(JsonWriter, outStream, pretty)
|
var jsonWriter = Json.Writer.init(outStream, pretty)
|
||||||
# TODO: it should be possible to serialize the navigator object
|
# TODO: it should be possible to serialize the navigator object
|
||||||
# without dereferencing it (to avoid the intermediate value).
|
# without dereferencing it (to avoid the intermediate value).
|
||||||
writeValue(jsonWriter, typedNavigator[])
|
writeValue(jsonWriter, typedNavigator[])
|
||||||
|
|
|
@ -40,10 +40,10 @@ type
|
||||||
|
|
||||||
FixedSizedWriterCtx = object
|
FixedSizedWriterCtx = object
|
||||||
|
|
||||||
serializationFormat SSZ,
|
serializationFormat SSZ
|
||||||
Reader = SszReader,
|
|
||||||
Writer = SszWriter,
|
SSZ.setReader SszReader
|
||||||
PreferedOutput = seq[byte]
|
SSZ.setWriter SszWriter, PreferredOutput = seq[byte]
|
||||||
|
|
||||||
template sizePrefixed*[TT](x: TT): untyped =
|
template sizePrefixed*[TT](x: TT): untyped =
|
||||||
type T = TT
|
type T = TT
|
||||||
|
|
|
@ -75,6 +75,11 @@ template layer*(vIdx: int64): int =
|
||||||
## index 0 for the mixed-in-length
|
## index 0 for the mixed-in-length
|
||||||
log2trunc(vIdx.uint64).int
|
log2trunc(vIdx.uint64).int
|
||||||
|
|
||||||
|
func hashListIndicesLen(maxChunkIdx: int64): int =
|
||||||
|
# TODO: This exists only to work-around a compilation issue when the complex
|
||||||
|
# expression is used directly in the HastList array size definition below
|
||||||
|
int(layer(maxChunkIdx)) + 1
|
||||||
|
|
||||||
type
|
type
|
||||||
List*[T; maxLen: static Limit] = distinct seq[T]
|
List*[T; maxLen: static Limit] = distinct seq[T]
|
||||||
BitList*[maxLen: static Limit] = distinct BitSeq
|
BitList*[maxLen: static Limit] = distinct BitSeq
|
||||||
|
@ -86,7 +91,7 @@ type
|
||||||
HashList*[T; maxLen: static Limit] = object
|
HashList*[T; maxLen: static Limit] = object
|
||||||
data*: List[T, maxLen]
|
data*: List[T, maxLen]
|
||||||
hashes* {.dontSerialize.}: seq[Eth2Digest]
|
hashes* {.dontSerialize.}: seq[Eth2Digest]
|
||||||
indices* {.dontSerialize.}: array[int(layer(maxChunkIdx(T, maxLen))) + 1, int64]
|
indices* {.dontSerialize.}: array[hashListIndicesLen(maxChunkIdx(T, maxLen)), int64]
|
||||||
|
|
||||||
# Note for readers:
|
# Note for readers:
|
||||||
# We use `array` for `Vector` and
|
# We use `array` for `Vector` and
|
||||||
|
|
|
@ -237,7 +237,7 @@ proc writeValue*(writer: var JsonWriter, value: PubKey0x)
|
||||||
proc readValue*(reader: var JsonReader, value: var PubKey0x)
|
proc readValue*(reader: var JsonReader, value: var PubKey0x)
|
||||||
{.raises: [SerializationError, IOError, Defect].} =
|
{.raises: [SerializationError, IOError, Defect].} =
|
||||||
try:
|
try:
|
||||||
value = PubKey0x reader.readValue(string).hexToByteArray[:RawPubKeySize]()
|
value = PubKey0x reader.readValue(string).hexToByteArray(RawPubKeySize)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raiseUnexpectedValue(reader, "Hex string expected")
|
raiseUnexpectedValue(reader, "Hex string expected")
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ type
|
||||||
BLSSignMsgInput = object
|
BLSSignMsgInput = object
|
||||||
privkey*: ValidatorPrivKey
|
privkey*: ValidatorPrivKey
|
||||||
message*: seq[byte]
|
message*: seq[byte]
|
||||||
domain*: Domain
|
domain*: Eth2Domain
|
||||||
|
|
||||||
BLSSignMsg* = object
|
BLSSignMsg* = object
|
||||||
input*: BLSSignMsgInput
|
input*: BLSSignMsgInput
|
||||||
|
@ -39,8 +39,8 @@ type
|
||||||
input*: seq[ValidatorPubKey]
|
input*: seq[ValidatorPubKey]
|
||||||
output*: ValidatorPubKey
|
output*: ValidatorPubKey
|
||||||
|
|
||||||
proc readValue*(r: var JsonReader, a: var Domain) =
|
proc readValue*(r: var JsonReader, a: var Eth2Domain) =
|
||||||
## Custom deserializer for Domain
|
## Custom deserializer for Eth2Domain
|
||||||
# Furthermore Nim parseHex doesn't support uint
|
# Furthermore Nim parseHex doesn't support uint
|
||||||
# until https://github.com/nim-lang/Nim/pull/11067
|
# until https://github.com/nim-lang/Nim/pull/11067
|
||||||
# (0.20)
|
# (0.20)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit b42899070a7daa5cf6f0843faf3d6d41659e9591
|
Subproject commit ea0368cc303b6ed59792a7c2556285adf310e455
|
|
@ -1 +1 @@
|
||||||
Subproject commit cfa95661913b0ff8b1609e3954894f8ab31bbf3e
|
Subproject commit f091a70a5bf95ec772c8b4d9978e81b8ae89af0c
|
|
@ -1 +1 @@
|
||||||
Subproject commit 32f75d93b0762328d1d85ce62cef84ed919ae31e
|
Subproject commit fe8a82ca76150b60a950d5aa4e5baa382441ada4
|
|
@ -1 +1 @@
|
||||||
Subproject commit e8e84cfc11de78c7bce0cded800060a29220e76f
|
Subproject commit d79b5c884965b2ab395315d8e5f3f8ae134ff99a
|
|
@ -1 +1 @@
|
||||||
Subproject commit 261de741b73601821cb6e749fc9b4092f1cc5377
|
Subproject commit f9a1121b8733eb75e624ab59f8d79e707f15f76f
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6bcb21184aeb96ce6c62e187a64d678b74609f1e
|
Subproject commit ee78822e057ac5f39804ecb6ac1096734be13ef8
|
Loading…
Reference in New Issue