mirror of https://github.com/waku-org/nwaku.git
chore(rln-relay): add chain-id flag to wakunode and restrict usage if mismatches rpc provider (#2858)
This commit is contained in:
parent
dad054d6b3
commit
05356ab97f
|
@ -26,6 +26,8 @@ import
|
||||||
../testlib/common,
|
../testlib/common,
|
||||||
./utils
|
./utils
|
||||||
|
|
||||||
|
const CHAIN_ID = 1337
|
||||||
|
|
||||||
proc generateCredentials(rlnInstance: ptr RLN): IdentityCredential =
|
proc generateCredentials(rlnInstance: ptr RLN): IdentityCredential =
|
||||||
let credRes = membershipKeyGen(rlnInstance)
|
let credRes = membershipKeyGen(rlnInstance)
|
||||||
return credRes.get()
|
return credRes.get()
|
||||||
|
@ -140,7 +142,7 @@ proc runAnvil(): Process =
|
||||||
anvilPath,
|
anvilPath,
|
||||||
args = [
|
args = [
|
||||||
"--port", "8540", "--gas-limit", "300000000000000", "--balance", "1000000000",
|
"--port", "8540", "--gas-limit", "300000000000000", "--balance", "1000000000",
|
||||||
"--chain-id", "1337",
|
"--chain-id", $CHAIN_ID,
|
||||||
],
|
],
|
||||||
options = {poUsePath},
|
options = {poUsePath},
|
||||||
)
|
)
|
||||||
|
@ -195,6 +197,7 @@ proc setup(): Future[OnchainGroupManager] {.async.} =
|
||||||
let manager = OnchainGroupManager(
|
let manager = OnchainGroupManager(
|
||||||
ethClientUrl: EthClient,
|
ethClientUrl: EthClient,
|
||||||
ethContractAddress: $contractAddress,
|
ethContractAddress: $contractAddress,
|
||||||
|
chainId: CHAIN_ID,
|
||||||
ethPrivateKey: pk,
|
ethPrivateKey: pk,
|
||||||
rlnInstance: rlnInstance,
|
rlnInstance: rlnInstance,
|
||||||
)
|
)
|
||||||
|
@ -218,6 +221,20 @@ suite "Onchain group manager":
|
||||||
|
|
||||||
await manager.stop()
|
await manager.stop()
|
||||||
|
|
||||||
|
asyncTest "should error on initialization when chainId does not match":
|
||||||
|
let manager = await setup()
|
||||||
|
manager.chainId = CHAIN_ID + 1
|
||||||
|
|
||||||
|
(await manager.init()).isErrOr:
|
||||||
|
raiseAssert "Expected error when chainId does not match"
|
||||||
|
|
||||||
|
asyncTest "should initialize when chainId is set to 0":
|
||||||
|
let manager = await setup()
|
||||||
|
manager.chainId = 0
|
||||||
|
|
||||||
|
(await manager.init()).isOkOr:
|
||||||
|
raiseAssert $error
|
||||||
|
|
||||||
asyncTest "should error on initialization when loaded metadata does not match":
|
asyncTest "should error on initialization when loaded metadata does not match":
|
||||||
let manager = await setup()
|
let manager = await setup()
|
||||||
(await manager.init()).isOkOr:
|
(await manager.init()).isOkOr:
|
||||||
|
|
|
@ -76,7 +76,7 @@ proc doRlnKeystoreGenerator*(conf: WakuNodeConf) =
|
||||||
debug "Transaction hash", txHash = groupManager.registrationTxHash.get()
|
debug "Transaction hash", txHash = groupManager.registrationTxHash.get()
|
||||||
|
|
||||||
info "Your membership has been registered on-chain.",
|
info "Your membership has been registered on-chain.",
|
||||||
chainId = $groupManager.chainId.get(),
|
chainId = $groupManager.chainId,
|
||||||
contractAddress = conf.rlnRelayEthContractAddress,
|
contractAddress = conf.rlnRelayEthContractAddress,
|
||||||
membershipIndex = groupManager.membershipIndex.get()
|
membershipIndex = groupManager.membershipIndex.get()
|
||||||
info "Your user message limit is", userMessageLimit = conf.rlnRelayUserMessageLimit
|
info "Your user message limit is", userMessageLimit = conf.rlnRelayUserMessageLimit
|
||||||
|
@ -84,7 +84,7 @@ proc doRlnKeystoreGenerator*(conf: WakuNodeConf) =
|
||||||
# 6. write to keystore
|
# 6. write to keystore
|
||||||
let keystoreCred = KeystoreMembership(
|
let keystoreCred = KeystoreMembership(
|
||||||
membershipContract: MembershipContract(
|
membershipContract: MembershipContract(
|
||||||
chainId: $groupManager.chainId.get(), address: conf.rlnRelayEthContractAddress
|
chainId: $groupManager.chainId, address: conf.rlnRelayEthContractAddress
|
||||||
),
|
),
|
||||||
treeIndex: groupManager.membershipIndex.get(),
|
treeIndex: groupManager.membershipIndex.get(),
|
||||||
identityCredential: credential,
|
identityCredential: credential,
|
||||||
|
|
|
@ -76,6 +76,12 @@ type WakuNodeConf* = object
|
||||||
name: "rln-relay-eth-contract-address"
|
name: "rln-relay-eth-contract-address"
|
||||||
.}: string
|
.}: string
|
||||||
|
|
||||||
|
rlnRelayChainId* {.
|
||||||
|
desc: "Chain ID of the provided contract (optional, will fetch from RPC provider if not used)",
|
||||||
|
defaultValue: 0,
|
||||||
|
name: "rln-relay-chain-id"
|
||||||
|
.}: uint
|
||||||
|
|
||||||
rlnRelayCredPassword* {.
|
rlnRelayCredPassword* {.
|
||||||
desc: "Password for encrypting RLN credentials",
|
desc: "Password for encrypting RLN credentials",
|
||||||
defaultValue: "",
|
defaultValue: "",
|
||||||
|
|
|
@ -8,6 +8,7 @@ type ClusterConf* = object
|
||||||
clusterId*: uint16
|
clusterId*: uint16
|
||||||
rlnRelay*: bool
|
rlnRelay*: bool
|
||||||
rlnRelayEthContractAddress*: string
|
rlnRelayEthContractAddress*: string
|
||||||
|
rlnRelayChainId*: uint
|
||||||
rlnRelayDynamic*: bool
|
rlnRelayDynamic*: bool
|
||||||
rlnRelayBandwidthThreshold*: int
|
rlnRelayBandwidthThreshold*: int
|
||||||
rlnEpochSizeSec*: uint64
|
rlnEpochSizeSec*: uint64
|
||||||
|
@ -37,6 +38,7 @@ proc TheWakuNetworkConf*(T: type ClusterConf): ClusterConf =
|
||||||
rlnRelay: true,
|
rlnRelay: true,
|
||||||
rlnRelayEthContractAddress: "0x4976Df0f61135EF3E5720D92eadE2e5F47A68Ef9",
|
rlnRelayEthContractAddress: "0x4976Df0f61135EF3E5720D92eadE2e5F47A68Ef9",
|
||||||
rlnRelayDynamic: true,
|
rlnRelayDynamic: true,
|
||||||
|
rlnRelayChainId: 2442, # https://chainlist.org/chain/2442
|
||||||
rlnRelayBandwidthThreshold: 0,
|
rlnRelayBandwidthThreshold: 0,
|
||||||
rlnEpochSizeSec: 600,
|
rlnEpochSizeSec: 600,
|
||||||
rlnRelayUserMessageLimit: 20,
|
rlnRelayUserMessageLimit: 20,
|
||||||
|
|
|
@ -199,6 +199,7 @@ proc setupProtocols(
|
||||||
rlnRelayDynamic: conf.rlnRelayDynamic,
|
rlnRelayDynamic: conf.rlnRelayDynamic,
|
||||||
rlnRelayCredIndex: conf.rlnRelayCredIndex,
|
rlnRelayCredIndex: conf.rlnRelayCredIndex,
|
||||||
rlnRelayEthContractAddress: conf.rlnRelayEthContractAddress,
|
rlnRelayEthContractAddress: conf.rlnRelayEthContractAddress,
|
||||||
|
rlnRelayChainId: conf.rlnRelayChainId,
|
||||||
rlnRelayEthClientAddress: string(conf.rlnRelayethClientAddress),
|
rlnRelayEthClientAddress: string(conf.rlnRelayethClientAddress),
|
||||||
rlnRelayCredPath: conf.rlnRelayCredPath,
|
rlnRelayCredPath: conf.rlnRelayCredPath,
|
||||||
rlnRelayCredPassword: conf.rlnRelayCredPassword,
|
rlnRelayCredPassword: conf.rlnRelayCredPassword,
|
||||||
|
|
|
@ -116,6 +116,7 @@ proc init*(T: type Waku, conf: WakuNodeConf): Result[Waku, string] =
|
||||||
confCopy.clusterId = twnClusterConf.clusterId
|
confCopy.clusterId = twnClusterConf.clusterId
|
||||||
confCopy.rlnRelay = twnClusterConf.rlnRelay
|
confCopy.rlnRelay = twnClusterConf.rlnRelay
|
||||||
confCopy.rlnRelayEthContractAddress = twnClusterConf.rlnRelayEthContractAddress
|
confCopy.rlnRelayEthContractAddress = twnClusterConf.rlnRelayEthContractAddress
|
||||||
|
confCopy.rlnRelayChainId = twnClusterConf.rlnRelayChainId
|
||||||
confCopy.rlnRelayDynamic = twnClusterConf.rlnRelayDynamic
|
confCopy.rlnRelayDynamic = twnClusterConf.rlnRelayDynamic
|
||||||
confCopy.rlnRelayBandwidthThreshold = twnClusterConf.rlnRelayBandwidthThreshold
|
confCopy.rlnRelayBandwidthThreshold = twnClusterConf.rlnRelayBandwidthThreshold
|
||||||
confCopy.discv5Discovery = twnClusterConf.discv5Discovery
|
confCopy.discv5Discovery = twnClusterConf.discv5Discovery
|
||||||
|
|
|
@ -61,7 +61,7 @@ type
|
||||||
wakuRlnContract*: Option[WakuRlnContractWithSender]
|
wakuRlnContract*: Option[WakuRlnContractWithSender]
|
||||||
latestProcessedBlock*: BlockNumber
|
latestProcessedBlock*: BlockNumber
|
||||||
registrationTxHash*: Option[TxHash]
|
registrationTxHash*: Option[TxHash]
|
||||||
chainId*: Option[Quantity]
|
chainId*: uint
|
||||||
keystorePath*: Option[string]
|
keystorePath*: Option[string]
|
||||||
keystorePassword*: Option[string]
|
keystorePassword*: Option[string]
|
||||||
registrationHandler*: Option[RegistrationHandler]
|
registrationHandler*: Option[RegistrationHandler]
|
||||||
|
@ -106,7 +106,7 @@ proc setMetadata*(
|
||||||
let metadataSetRes = g.rlnInstance.setMetadata(
|
let metadataSetRes = g.rlnInstance.setMetadata(
|
||||||
RlnMetadata(
|
RlnMetadata(
|
||||||
lastProcessedBlock: normalizedBlock,
|
lastProcessedBlock: normalizedBlock,
|
||||||
chainId: uint64(g.chainId.get()),
|
chainId: g.chainId,
|
||||||
contractAddress: g.ethContractAddress,
|
contractAddress: g.ethContractAddress,
|
||||||
validRoots: g.validRoots.toSeq(),
|
validRoots: g.validRoots.toSeq(),
|
||||||
)
|
)
|
||||||
|
@ -540,11 +540,18 @@ method init*(g: OnchainGroupManager): Future[GroupManagerResult[void]] {.async.}
|
||||||
g.retryWrapper(ethRpc, "Failed to connect to the Ethereum client"):
|
g.retryWrapper(ethRpc, "Failed to connect to the Ethereum client"):
|
||||||
await newWeb3(g.ethClientUrl)
|
await newWeb3(g.ethClientUrl)
|
||||||
|
|
||||||
|
var fetchedChainId: uint
|
||||||
|
g.retryWrapper(fetchedChainId, "Failed to get the chain id"):
|
||||||
|
uint(await ethRpc.provider.eth_chainId())
|
||||||
|
|
||||||
# Set the chain id
|
# Set the chain id
|
||||||
var chainId: Quantity
|
if g.chainId == 0:
|
||||||
g.retryWrapper(chainId, "Failed to get the chain id"):
|
warn "Chain ID not set in config, using RPC Provider's Chain ID", providerChainId = fetchedChainId
|
||||||
await ethRpc.provider.eth_chainId()
|
|
||||||
g.chainId = some(chainId)
|
if g.chainId != 0 and g.chainId != fetchedChainId:
|
||||||
|
return err("The RPC Provided a Chain ID which is different than the provided Chain ID: provided = " & $g.chainId & ", actual = " & $fetchedChainId)
|
||||||
|
|
||||||
|
g.chainId = fetchedChainId
|
||||||
|
|
||||||
if g.ethPrivateKey.isSome():
|
if g.ethPrivateKey.isSome():
|
||||||
let pk = g.ethPrivateKey.get()
|
let pk = g.ethPrivateKey.get()
|
||||||
|
@ -567,7 +574,7 @@ method init*(g: OnchainGroupManager): Future[GroupManagerResult[void]] {.async.}
|
||||||
|
|
||||||
var keystoreQuery = KeystoreMembership(
|
var keystoreQuery = KeystoreMembership(
|
||||||
membershipContract:
|
membershipContract:
|
||||||
MembershipContract(chainId: $g.chainId.get(), address: g.ethContractAddress)
|
MembershipContract(chainId: $g.chainId, address: g.ethContractAddress)
|
||||||
)
|
)
|
||||||
if g.membershipIndex.isSome():
|
if g.membershipIndex.isSome():
|
||||||
keystoreQuery.treeIndex = MembershipIndex(g.membershipIndex.get())
|
keystoreQuery.treeIndex = MembershipIndex(g.membershipIndex.get())
|
||||||
|
@ -599,7 +606,7 @@ method init*(g: OnchainGroupManager): Future[GroupManagerResult[void]] {.async.}
|
||||||
warn "could not initialize with persisted rln metadata"
|
warn "could not initialize with persisted rln metadata"
|
||||||
elif metadataGetOptRes.get().isSome():
|
elif metadataGetOptRes.get().isSome():
|
||||||
let metadata = metadataGetOptRes.get().get()
|
let metadata = metadataGetOptRes.get().get()
|
||||||
if metadata.chainId != uint64(g.chainId.get()):
|
if metadata.chainId != uint(g.chainId):
|
||||||
return err("persisted data: chain id mismatch")
|
return err("persisted data: chain id mismatch")
|
||||||
|
|
||||||
if metadata.contractAddress != g.ethContractAddress.toLower():
|
if metadata.contractAddress != g.ethContractAddress.toLower():
|
||||||
|
|
|
@ -40,6 +40,7 @@ type WakuRlnConfig* = object
|
||||||
rlnRelayCredIndex*: Option[uint]
|
rlnRelayCredIndex*: Option[uint]
|
||||||
rlnRelayEthContractAddress*: string
|
rlnRelayEthContractAddress*: string
|
||||||
rlnRelayEthClientAddress*: string
|
rlnRelayEthClientAddress*: string
|
||||||
|
rlnRelayChainId*: uint
|
||||||
rlnRelayCredPath*: string
|
rlnRelayCredPath*: string
|
||||||
rlnRelayCredPassword*: string
|
rlnRelayCredPassword*: string
|
||||||
rlnRelayTreePath*: string
|
rlnRelayTreePath*: string
|
||||||
|
@ -429,6 +430,7 @@ proc mount(
|
||||||
groupManager = OnchainGroupManager(
|
groupManager = OnchainGroupManager(
|
||||||
ethClientUrl: string(conf.rlnRelayethClientAddress),
|
ethClientUrl: string(conf.rlnRelayethClientAddress),
|
||||||
ethContractAddress: $conf.rlnRelayEthContractAddress,
|
ethContractAddress: $conf.rlnRelayEthContractAddress,
|
||||||
|
chainId: conf.rlnRelayChainId,
|
||||||
rlnInstance: rlnInstance,
|
rlnInstance: rlnInstance,
|
||||||
registrationHandler: registrationHandler,
|
registrationHandler: registrationHandler,
|
||||||
keystorePath: rlnRelayCredPath,
|
keystorePath: rlnRelayCredPath,
|
||||||
|
|
Loading…
Reference in New Issue