From f15dab073446f30c7bd3c492009aeaeb4d728dda Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Tue, 9 Jun 2020 11:25:28 +0300 Subject: [PATCH] Add README --- README.md | 146 ++++++++++++++++++++++++++++++++++++++- configs/genesis.json | 3 +- configs/geth-config.toml | 27 +++----- 3 files changed, 155 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index add52af..f99ffb6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,144 @@ -# quorum-testnet -Specification and node configs to setup a node of a Quorum based testnet +# Quorum-Ethereum AMB bridge + +So far, the plan of Quuorum-Ethereum bridge is the following: +* Create public quorum testnet using IBFT consensus. +* Select existing etherum testnet (Kovan/Sokol). +* Deploy AMB bridge between two testnets. +* Deploy mediators/tokens in order to prove that everything works as expected. +* Deploy chain explorer for quorum chain (cakeshop/blockscout or both) +* Deploy faucet for quorum testnet. (Even though gasPrice is `0`, users may want to have native coins for other needs) + +## Quorum testnet +For quorum testnet, the following genesis block (or a similar one) is going to be used: +```jsonld= +{ + "config": { + "chainId": 111, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "homesteadBlock": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "istanbul": { + "epoch": 30000, + "policy": 0, + "ceil2Nby3Block": 0 + }, + "maxCodeSizeConfig": [ + { + "block": 0, + "size": 35 + } + ], + "isQuorum": true + }, + "nonce": "0x0", + "timestamp": "0x5eda1803", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f85ad5947de1cd14693fbe1240011afe8c68d61012e51babb8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gasLimit": "0x989680", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "7de1cd14693fbe1240011afe8c68d61012e51bab": { + "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} +``` + +Exact geth parameters that are used for the quorum nodex configuration can be found in `configs/geth-config.toml`. +Some important values are: +``` +[Eth] +NetworkId = 111 # chain id was selected to be 111, network id == chain id +... + +[Eth.Miner] +GasFloor = 10000000 # block gas limit is set to be 10000000 +GasCeil = 10000000 +GasPrice = 0 # quorum transactions should have 0 gas price, therefore, miner should accept transactions with such gas price +... + +[Eth.TxPool] +... +PriceLimit = 0 # there are no price limits for accepted transactions, since transactions should have zero gas price +PriceBump = 0 +AccountSlots = 16 # any account can have 16 guaranteed executable transactions in the queue +GlobalSlots = 4096 # upper bound on the queue size for all pending executable transactions +AccountQueue = 64 # any account can have 64 guaranteed non-executable transactions in the queue +GlobalQueue = 1024 # upper bound on the queue size for all pending executable transactions +Lifetime = 10800000000000 # maximum time, for which non-executable transaction can be hold, 3 hours +TransactionSizeLimit = 64 # maximum transaction size if 64kb +MaxCodeSize = 35 # maximum contract code size if 35kb + +[Eth.GPO] +Blocks = 0 # gas price oracle is not needed when gas price should be zero +Percentile = 0 + +[Eth.Istanbul] +RequestTimeout = 10000 # timeout for IBFT round, 10s +BlockPeriod = 5 # target block period, 5s + +[Node] +... +HTTPPort = 8545 # HTTP RPC listens on port 8545 +HTTPModules = ["eth", "net"] # the same modules are accessible on public Infura providers +WSPort = 8645 # WS RPC listens on port 8545 +WSModules = ["eth", "net"] # the same modules are accessible on public Infura providers +... +``` + +Enhanced permissions contract-based model is not going to be used from the very beginning. If needed, it can be enabled later, by deploying required smart-contract and restarting the node. + +## Deploy AMB + +So far, after some tests in https://github.com/k1rill-fedoseev/quorum-bridge, no significant compatibility problems were found. +AMB contracts should be slightly modified in order to allow set of `gasPrice=0`. Similar change should be applied to the deployment scripts. +Quorum genesis block includes recent hardFork blocks (`istanbulBlock`), so there are no any invalid opcodes in the contracts. + +Tests confirmed that, bridge successfully operates between these two chains. It is possible to send messages in both directions. Different mediator contracts work as well. + +## Deploy chain explorer + +For ease of interaction with the public Quorum testnet, the chain explorer will be also deployed. Blockscout is the primary option. + +## Deploy faucet + +We are planning to use either serverless faucet https://github.com/PhilippLgh/serverless-faucet with terminal-friendly UI as well https://github.com/PhilippLgh/create-eth-test-account. Backup plan is to setup POA-faucet (https://github.com/poanetwork/poa-faucet), that is used for Quorum and. + +## Quorum node version remarks + +The tests were performed on different versions of quorum's official docker image. The following bugs were noted: +* `2.5.0` - one of the Permission contracts cannot be deployed for some reason. +* `2.6.0` - estimateGas RPC method fails when transaction value is not specified. Corresponding PR was already merged, but no other release appeared yet. +* `latest` - everything works as expected, some side-effects were found. Pending transactions, that were already processed, may be processed once again, https://github.com/jpmorganchase/quorum/issues/1008. + +## Istanbul tools usage + +Compiled binary from https://github.com/jpmorganchase/istanbul-tools is included into this repo. +Example of usage: +```bash +# generate quorum genesis block, with 2 initial validators +./istanbul setup --quorum --nodes --num 2 --verbose +# this will print three important things: +# validators, configs: address + nodekey + enode URL +# static-nodes.json - file with enode URl for all validators +# genesis.json - genesis block configuration, extraData field describes initial set of validators, make sure to regenerate it when using different nodekeys for validators + +# decode extra data field to see initial set of validators +./istanbul extra decode --extradata "0x00..." + +# encode extra data for particular validators set +./istanbul extra encode --validators "0x,0x,..." + +# generate validator address, from its nodekey +./istanbul address --nodekeyhex "<64 hex symbols>" +``` diff --git a/configs/genesis.json b/configs/genesis.json index 7baf152..965f1bd 100644 --- a/configs/genesis.json +++ b/configs/genesis.json @@ -21,7 +21,8 @@ "size": 35 } ], - "isQuorum": true + "isQuorum": true, + "txnSizeLimit": 64 }, "nonce": "0x0", "timestamp": "0x5eda1803", diff --git a/configs/geth-config.toml b/configs/geth-config.toml index 80d90dd..e16220b 100644 --- a/configs/geth-config.toml +++ b/configs/geth-config.toml @@ -15,9 +15,9 @@ EWASMInterpreter = "" EVMInterpreter = "" [Eth.Miner] -GasFloor = 700000000 -GasCeil = 800000000 -GasPrice = 1000000000 +GasFloor = 10000000 +GasCeil = 10000000 +GasPrice = 0 Recommit = 3000000000 Noverify = false @@ -35,28 +35,24 @@ Locals = [] NoLocals = false Journal = "transactions.rlp" Rejournal = 3600000000000 -PriceLimit = 1 -PriceBump = 10 +PriceLimit = 0 +PriceBump = 0 AccountSlots = 16 GlobalSlots = 4096 AccountQueue = 64 GlobalQueue = 1024 Lifetime = 10800000000000 TransactionSizeLimit = 64 -MaxCodeSize = 24 +MaxCodeSize = 35 [Eth.GPO] -Blocks = 20 -Percentile = 60 +Blocks = 0 +Percentile = 0 [Eth.Istanbul] +RequestTimeout = 10000 BlockPeriod = 5 -[Shh] -MaxMessageSize = 1048576 -MinimumAcceptedPOW = 2e-01 -RestrictConnectionBetweenLightClients = true - [Node] UserIdent = "node" DataDir = "/qdata/dd" @@ -90,8 +86,3 @@ EnableMsgEvents = false ReadTimeout = 30000000000 WriteTimeout = 30000000000 IdleTimeout = 120000000000 - -[Dashboard] -Host = "localhost" -Port = 8080 -Refresh = 5000000000