fixes #558, use distinct uint for ChainId and NetworkId to prevent confusion

This commit is contained in:
jangko 2021-02-13 16:32:48 +07:00 committed by andri lim
parent 2566cebfe0
commit 8486c1834c
6 changed files with 30 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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],

View File

@ -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