fixes #558, use distinct uint for ChainId and NetworkId to prevent confusion
This commit is contained in:
parent
2566cebfe0
commit
8486c1834c
|
@ -98,11 +98,11 @@ type
|
||||||
staticNodes*: seq[ENode] ## List of static nodes to connect to
|
staticNodes*: seq[ENode] ## List of static nodes to connect to
|
||||||
bindPort*: uint16 ## Main TCP bind port
|
bindPort*: uint16 ## Main TCP bind port
|
||||||
discPort*: uint16 ## Discovery UDP bind port
|
discPort*: uint16 ## Discovery UDP bind port
|
||||||
metricsServer*: bool ## Enable metrics server
|
metricsServer*: bool ## Enable metrics server
|
||||||
metricsServerPort*: uint16 ## metrics HTTP server port
|
metricsServerPort*: uint16 ## metrics HTTP server port
|
||||||
maxPeers*: int ## Maximum allowed number of peers
|
maxPeers*: int ## Maximum allowed number of peers
|
||||||
maxPendingPeers*: int ## Maximum allowed pending peers
|
maxPendingPeers*: int ## Maximum allowed pending peers
|
||||||
networkId*: uint ## Network ID as integer
|
networkId*: NetworkId ## Network ID as integer
|
||||||
ident*: string ## Server ident name string
|
ident*: string ## Server ident name string
|
||||||
nodeKey*: PrivateKey ## Server private key
|
nodeKey*: PrivateKey ## Server private key
|
||||||
nat*: NatStrategy ## NAT strategy
|
nat*: NatStrategy ## NAT strategy
|
||||||
|
@ -126,8 +126,13 @@ type
|
||||||
keystore*: JsonNode
|
keystore*: JsonNode
|
||||||
unlocked*: bool
|
unlocked*: bool
|
||||||
|
|
||||||
|
# beware that although in some cases
|
||||||
|
# chainId have identical value to networkId
|
||||||
|
# they are separate entity
|
||||||
|
ChainId* = distinct uint
|
||||||
|
|
||||||
ChainConfig* = object
|
ChainConfig* = object
|
||||||
chainId*: uint
|
chainId*: ChainId
|
||||||
homesteadBlock*: BlockNumber
|
homesteadBlock*: BlockNumber
|
||||||
daoForkBlock*: BlockNumber
|
daoForkBlock*: BlockNumber
|
||||||
daoForkSupport*: bool
|
daoForkSupport*: bool
|
||||||
|
@ -162,7 +167,7 @@ type
|
||||||
accounts*: Table[EthAddress, NimbusAccount]
|
accounts*: Table[EthAddress, NimbusAccount]
|
||||||
|
|
||||||
CustomGenesisConfig = object
|
CustomGenesisConfig = object
|
||||||
chainId*: uint
|
chainId*: ChainId
|
||||||
homesteadBlock*: BlockNumber
|
homesteadBlock*: BlockNumber
|
||||||
daoForkBlock*: BlockNumber
|
daoForkBlock*: BlockNumber
|
||||||
daoForkSupport*: bool
|
daoForkSupport*: bool
|
||||||
|
@ -227,10 +232,12 @@ proc privateChainConfig*(): ChainConfig =
|
||||||
trace "Custom genesis block configuration loaded", configuration=result
|
trace "Custom genesis block configuration loaded", configuration=result
|
||||||
|
|
||||||
proc publicChainConfig*(id: PublicNetwork): ChainConfig =
|
proc publicChainConfig*(id: PublicNetwork): ChainConfig =
|
||||||
|
# For some public networks, NetworkId and ChainId value are identical
|
||||||
|
# but that is not always the case
|
||||||
result = case id
|
result = case id
|
||||||
of MainNet:
|
of MainNet:
|
||||||
ChainConfig(
|
ChainConfig(
|
||||||
chainId: MainNet.uint,
|
chainId: MainNet.ChainId,
|
||||||
homesteadBlock: 1_150_000.toBlockNumber, # 14/03/2016 20:49:53
|
homesteadBlock: 1_150_000.toBlockNumber, # 14/03/2016 20:49:53
|
||||||
daoForkBlock: 1_920_000.toBlockNumber,
|
daoForkBlock: 1_920_000.toBlockNumber,
|
||||||
daoForkSupport: true,
|
daoForkSupport: true,
|
||||||
|
@ -247,7 +254,7 @@ proc publicChainConfig*(id: PublicNetwork): ChainConfig =
|
||||||
)
|
)
|
||||||
of RopstenNet:
|
of RopstenNet:
|
||||||
ChainConfig(
|
ChainConfig(
|
||||||
chainId: RopstenNet.uint,
|
chainId: RopstenNet.ChainId,
|
||||||
homesteadBlock: 0.toBlockNumber,
|
homesteadBlock: 0.toBlockNumber,
|
||||||
daoForkSupport: false,
|
daoForkSupport: false,
|
||||||
eip150Block: 0.toBlockNumber,
|
eip150Block: 0.toBlockNumber,
|
||||||
|
@ -263,7 +270,7 @@ proc publicChainConfig*(id: PublicNetwork): ChainConfig =
|
||||||
)
|
)
|
||||||
of RinkebyNet:
|
of RinkebyNet:
|
||||||
ChainConfig(
|
ChainConfig(
|
||||||
chainId: RinkebyNet.uint,
|
chainId: RinkebyNet.ChainId,
|
||||||
homesteadBlock: 1.toBlockNumber,
|
homesteadBlock: 1.toBlockNumber,
|
||||||
daoForkSupport: false,
|
daoForkSupport: false,
|
||||||
eip150Block: 2.toBlockNumber,
|
eip150Block: 2.toBlockNumber,
|
||||||
|
@ -279,7 +286,7 @@ proc publicChainConfig*(id: PublicNetwork): ChainConfig =
|
||||||
)
|
)
|
||||||
of GoerliNet:
|
of GoerliNet:
|
||||||
ChainConfig(
|
ChainConfig(
|
||||||
chainId: GoerliNet.uint,
|
chainId: GoerliNet.ChainId,
|
||||||
homesteadBlock: 0.toBlockNumber,
|
homesteadBlock: 0.toBlockNumber,
|
||||||
daoForkSupport: false,
|
daoForkSupport: false,
|
||||||
eip150Block: 0.toBlockNumber,
|
eip150Block: 0.toBlockNumber,
|
||||||
|
@ -300,7 +307,7 @@ proc publicChainConfig*(id: PublicNetwork): ChainConfig =
|
||||||
doAssert(false, "No chain config for " & $id)
|
doAssert(false, "No chain config for " & $id)
|
||||||
ChainConfig()
|
ChainConfig()
|
||||||
|
|
||||||
result.chainId = uint(id)
|
result.chainId = ChainId(id)
|
||||||
|
|
||||||
proc processCustomGenesisConfig(customGenesis: JsonNode): ConfigStatus =
|
proc processCustomGenesisConfig(customGenesis: JsonNode): ConfigStatus =
|
||||||
## Parses Custom Genesis Block config options when customnetwork option provided
|
## Parses Custom Genesis Block config options when customnetwork option provided
|
||||||
|
@ -357,7 +364,7 @@ proc processCustomGenesisConfig(customGenesis: JsonNode): ConfigStatus =
|
||||||
let config = getConfiguration()
|
let config = getConfiguration()
|
||||||
result = Success
|
result = Success
|
||||||
var
|
var
|
||||||
chainId = 0.uint
|
chainId = 0.ChainId
|
||||||
homesteadBlock, daoForkblock, eip150Block, eip155Block, eip158Block, byzantiumBlock, constantinopleBlock = 0.toBlockNumber
|
homesteadBlock, daoForkblock, eip150Block, eip155Block, eip158Block, byzantiumBlock, constantinopleBlock = 0.toBlockNumber
|
||||||
petersburgBlock, istanbulBlock, muirGlacierBlock, berlinBlock = 0.toBlockNumber
|
petersburgBlock, istanbulBlock, muirGlacierBlock, berlinBlock = 0.toBlockNumber
|
||||||
eip150Hash, mixHash : MDigest[256]
|
eip150Hash, mixHash : MDigest[256]
|
||||||
|
@ -374,8 +381,7 @@ proc processCustomGenesisConfig(customGenesis: JsonNode): ConfigStatus =
|
||||||
if customGenesis.hasKey("config"):
|
if customGenesis.hasKey("config"):
|
||||||
# Validate all fork blocks for custom genesis
|
# Validate all fork blocks for custom genesis
|
||||||
let forkDetails = customGenesis["config"]
|
let forkDetails = customGenesis["config"]
|
||||||
validateConfigValue(forkDetails, chainId, JInt, uint)
|
validateConfigValue(forkDetails, chainId, JInt, ChainId)
|
||||||
config.net.networkId = chainId
|
|
||||||
checkForFork(forkDetails, homesteadBlock, 0.toBlockNumber)
|
checkForFork(forkDetails, homesteadBlock, 0.toBlockNumber)
|
||||||
validateConfigValue(forkDetails, daoForkSupport, JBool, bool, checkError=false)
|
validateConfigValue(forkDetails, daoForkSupport, JBool, bool, checkError=false)
|
||||||
if daoForkSupport == true:
|
if daoForkSupport == true:
|
||||||
|
@ -613,15 +619,15 @@ proc setBootnodes(onodes: var seq[ENode], nodeUris: openarray[string]) =
|
||||||
macro availableEnumValues(T: type enum): untyped =
|
macro availableEnumValues(T: type enum): untyped =
|
||||||
let impl = getTypeImpl(T)[1].getTypeImpl()
|
let impl = getTypeImpl(T)[1].getTypeImpl()
|
||||||
result = newNimNode(nnkBracket)
|
result = newNimNode(nnkBracket)
|
||||||
for i in 1 ..< impl.len: result.add(newCall("uint", copyNimTree(impl[i])))
|
for i in 1 ..< impl.len: result.add(newCall("NetworkId", copyNimTree(impl[i])))
|
||||||
|
|
||||||
proc toPublicNetwork*(id: uint): PublicNetwork {.inline.} =
|
proc toPublicNetwork*(id: NetworkId): PublicNetwork {.inline.} =
|
||||||
if id in availableEnumValues(PublicNetwork):
|
if id in availableEnumValues(PublicNetwork):
|
||||||
result = PublicNetwork(id)
|
result = PublicNetwork(id)
|
||||||
|
|
||||||
proc setNetwork(conf: var NetConfiguration, id: PublicNetwork) =
|
proc setNetwork(conf: var NetConfiguration, id: PublicNetwork) =
|
||||||
## Set network id and default network bootnodes
|
## Set network id and default network bootnodes
|
||||||
conf.networkId = uint(id)
|
conf.networkId = NetworkId(id)
|
||||||
case id
|
case id
|
||||||
of MainNet:
|
of MainNet:
|
||||||
conf.bootNodes.setBootnodes(MainnetBootnodes)
|
conf.bootNodes.setBootnodes(MainnetBootnodes)
|
||||||
|
@ -638,7 +644,7 @@ proc setNetwork(conf: var NetConfiguration, id: PublicNetwork) =
|
||||||
of CustomNet:
|
of CustomNet:
|
||||||
discard
|
discard
|
||||||
|
|
||||||
proc setNetwork(conf: var NetConfiguration, id: uint) =
|
proc setNetwork(conf: var NetConfiguration, id: NetworkId) =
|
||||||
## Set network id and default network bootnodes
|
## Set network id and default network bootnodes
|
||||||
let pubNet = toPublicNetwork(id)
|
let pubNet = toPublicNetwork(id)
|
||||||
if pubNet == CustomNet:
|
if pubNet == CustomNet:
|
||||||
|
@ -692,7 +698,7 @@ proc processNetArguments(key, value: string): ConfigStatus =
|
||||||
var res = 0
|
var res = 0
|
||||||
result = processInteger(value, res)
|
result = processInteger(value, res)
|
||||||
if result == Success:
|
if result == Success:
|
||||||
config.net.setNetwork(uint(result))
|
config.net.setNetwork(NetworkId(result))
|
||||||
elif skey == "nodiscover":
|
elif skey == "nodiscover":
|
||||||
config.net.flags.incl(NoDiscover)
|
config.net.flags.incl(NoDiscover)
|
||||||
elif skey == "v5discover":
|
elif skey == "v5discover":
|
||||||
|
@ -858,7 +864,7 @@ proc initConfiguration(): NimbusConfiguration =
|
||||||
result.rpc.binds = @[initTAddress("127.0.0.1:8545")]
|
result.rpc.binds = @[initTAddress("127.0.0.1:8545")]
|
||||||
|
|
||||||
## Network defaults
|
## Network defaults
|
||||||
result.net.setNetwork(defaultNetwork)
|
result.net.setNetwork(defaultNetwork.NetworkId)
|
||||||
result.net.maxPeers = 25
|
result.net.maxPeers = 25
|
||||||
result.net.maxPendingPeers = 0
|
result.net.maxPendingPeers = 0
|
||||||
result.net.bindPort = 30303'u16
|
result.net.bindPort = 30303'u16
|
||||||
|
|
|
@ -121,7 +121,7 @@ proc unsignedTx*(tx: TxSend, chain: BaseChainDB, defaultNonce: AccountNonce): Un
|
||||||
|
|
||||||
result.payload = hexToSeqByte(tx.data.string)
|
result.payload = hexToSeqByte(tx.data.string)
|
||||||
|
|
||||||
func rlpEncode(tx: UnsignedTx, chainId: uint): auto =
|
func rlpEncode(tx: UnsignedTx, chainId: ChainId): auto =
|
||||||
rlp.encode(Transaction(
|
rlp.encode(Transaction(
|
||||||
accountNonce: tx.nonce,
|
accountNonce: tx.nonce,
|
||||||
gasPrice: tx.gasPrice,
|
gasPrice: tx.gasPrice,
|
||||||
|
@ -144,7 +144,7 @@ proc signTransaction*(tx: UnsignedTx, chain: BaseChainDB, privateKey: PrivateKey
|
||||||
|
|
||||||
let sig = sign(privateKey, rlpTx).toRaw
|
let sig = sign(privateKey, rlpTx).toRaw
|
||||||
let v = if eip155:
|
let v = if eip155:
|
||||||
byte(sig[64].uint + chain.config.chainId * 2'u + 35'u)
|
byte(sig[64].uint + chain.config.chainId.uint * 2'u + 35'u)
|
||||||
else:
|
else:
|
||||||
sig[64] + 27.byte
|
sig[64] + 27.byte
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ template getChainId*(c: Computation): uint =
|
||||||
when evmc_enabled:
|
when evmc_enabled:
|
||||||
Uint256.fromEvmc(c.host.getTxContext().chain_id).truncate(uint)
|
Uint256.fromEvmc(c.host.getTxContext().chain_id).truncate(uint)
|
||||||
else:
|
else:
|
||||||
c.vmState.chaindb.config.chainId
|
c.vmState.chaindb.config.chainId.uint
|
||||||
|
|
||||||
template getOrigin*(c: Computation): EthAddress =
|
template getOrigin*(c: Computation): EthAddress =
|
||||||
when evmc_enabled:
|
when evmc_enabled:
|
||||||
|
|
|
@ -17,7 +17,7 @@ proc hostGetTxContextImpl(ctx: Computation): nimbus_tx_context {.cdecl.} =
|
||||||
result.block_timestamp = vmstate.timestamp.toUnix()
|
result.block_timestamp = vmstate.timestamp.toUnix()
|
||||||
result.block_gas_limit = int64(vmstate.blockHeader.gasLimit)
|
result.block_gas_limit = int64(vmstate.blockHeader.gasLimit)
|
||||||
result.block_difficulty = toEvmc(vmstate.difficulty)
|
result.block_difficulty = toEvmc(vmstate.difficulty)
|
||||||
result.chain_id = toEvmc(vmstate.chaindb.config.chainId.u256)
|
result.chain_id = toEvmc(vmstate.chaindb.config.chainId.uint.u256)
|
||||||
|
|
||||||
proc hostGetBlockHashImpl(ctx: Computation, number: int64): Hash256 {.cdecl.} =
|
proc hostGetBlockHashImpl(ctx: Computation, number: int64): Hash256 {.cdecl.} =
|
||||||
ctx.vmState.getAncestorHash(number.u256)
|
ctx.vmState.getAncestorHash(number.u256)
|
||||||
|
|
|
@ -10,6 +10,7 @@ import
|
||||||
nimcrypto, stew/byteutils, times,
|
nimcrypto, stew/byteutils, times,
|
||||||
json_rpc/[rpcserver, rpcclient], eth/common as eth_common,
|
json_rpc/[rpcserver, rpcclient], eth/common as eth_common,
|
||||||
eth/[rlp, keys], eth/trie/db, eth/p2p/rlpx_protocols/eth_protocol,
|
eth/[rlp, keys], eth/trie/db, eth/p2p/rlpx_protocols/eth_protocol,
|
||||||
|
eth/p2p/private/p2p_types,
|
||||||
../nimbus/rpc/[common, p2p, hexstrings, rpc_types, rpc_utils],
|
../nimbus/rpc/[common, p2p, hexstrings, rpc_types, rpc_utils],
|
||||||
../nimbus/[constants, vm_state, config, genesis, utils, transaction],
|
../nimbus/[constants, vm_state, config, genesis, utils, transaction],
|
||||||
../nimbus/db/[accounts_cache, db_chain, storage_types, state_db],
|
../nimbus/db/[accounts_cache, db_chain, storage_types, state_db],
|
||||||
|
|
|
@ -109,7 +109,7 @@ proc nimbus_start(port: uint16, startListening: bool, enableDiscovery: bool,
|
||||||
|
|
||||||
keypair = privKey[].toKeyPair()
|
keypair = privKey[].toKeyPair()
|
||||||
|
|
||||||
node = newEthereumNode(keypair, address, 1, nil, addAllCapabilities = false)
|
node = newEthereumNode(keypair, address, 1.NetworkId, nil, addAllCapabilities = false)
|
||||||
node.addCapability Whisper
|
node.addCapability Whisper
|
||||||
|
|
||||||
node.protocolState(Whisper).config.powRequirement = minPow
|
node.protocolState(Whisper).config.powRequirement = minPow
|
||||||
|
|
Loading…
Reference in New Issue