# Zuzalu Workshop
### Machines
#### Verify files
r6a.8xlarge
#### Mock prover
r6a.8xlarge
#### Full prover
r6a.24xlarge
### Basic OS preparation
````bash=
sudo apt update && sudo \
apt install -y tmux git curl cargo build-essential \
libomp-dev libgmp-dev nlohmann-json3-dev libpqxx-dev \
nasm libgrpc++-dev libprotobuf-dev grpc-proto libsodium-dev \
uuid-dev libsecp256k1-dev unzip
````
#### Nodejs (NVM)
```bash
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
$ source ~/.bashrc
$ nvm install 16
$ node -v
v16.20.0
```
#### Download mainnet files (tmux)
```
$ tmux
$ wget https://de012a78750e59b808d922b39535e862.s3.eu-west-1.amazonaws.com/v1.1.0-rc.1-fork.4.tgz
ctrl + d
...
tar xzvf v1.1.0-rc.1-fork.4.tgz
```
#### Install docker
```
$ sudo apt-get -y install docker.io
$ sudo usermod -aG docker $USER
$ newgrp docker && newgrp ubuntu
```
### Deploy contracts
* commit: b1cefea1431e59b2121e543b786b93af99e859f4
```bash=
$ git clone https://github.com/0xPolygonHermez/zkevm-contracts.git
$ cd zkevm-contracts
$ npm i
$ cp .env.example .env
```
#### Create wallets
##### create wallets.js file:
```js
const ethers = require("ethers");
async function main() {
const arrayNames = ["## Deployment Address", "\n\n## Trusted sequencer", "\n\n## Trusted aggregator"];
for (let i = 0; i < arrayNames.length; i++) {
const wallet = ethers.Wallet.createRandom();
console.log(arrayNames[i]);
console.log(`Address: ${wallet.address}`);
console.log(`PrvKey: ${wallet._signingKey().privateKey}`);
console.log(`mnemonic: "${wallet._mnemonic().phrase}"`);
const keystoreJson = await wallet.encrypt("password");
console.log(`keystore: ${keystoreJson}`);
}
}
main().catch((e) => {
console.error(e);
process.exit(1);
});
```
##### Run wallets.js
```bash!
$ node wallets.js | tee wallets.txt
```
#### edit .env
```
$ nano .env
MNEMONIC="..." (from wallets.txt Deployment Address)
INFURA_PROJECT_ID="..." (your infura project ID)
ETHERSCAN_API_KEY="..." (your etherscan API key)
```
#### Edit deploy_parameters.json
```bash=
$ cd deployment
$ cp deploy_parameters.json.example deploy_parameters.json
```
* edit deploy_parameters.json
```js
"realVerifier": true
"trustedSequencerURL": "http://54.83.84.85:8545", (your machine ip)
"trustedSequencer" (from wallets.txt Trusted sequencer )
"chainID": 42069 (a chainid)
"trustedAggregator" (from wallets.txt aggregator sequencer),
"forkID": 4,
"admin":"",(from wallets.txt Deployment Address)
"zkEVMOwner": "",(from wallets.txt Deployment Address)
"timelockAddress": "", (from wallets.txt Deployment Address),
"initialZkEVMDeployerOwner": "" (from wallets.txt Deployment Address)
"zkEVMDeployerAddress":"" (leave empty)
"maticTokenAddress":"", (leave empty, it's deployed)
```
* Send ether to Deployment address (15 GöETH)
* Edit deployment/helpers/deployment-helpers.js to adjust the gasPrice according to network status
```
const gasPriceKeylessDeployment = '200'; // 100 gweis
```
#### Make the deployment
```bash=
$ npm run deploy:deployer:ZkEVM:goerli
$ npm run verify:deployer:ZkEVM:goerli
$ npm run deploy:testnet:ZkEVM:goerli
$ npm run verify:ZkEVM:goerli
```
if you see errors you can run it again, although is normal to see an error on the last step
```bash=
$ npm run verify:ZkEVM:goerli
> @0xpolygonhermez/zkevm-contracts@0.6.0.0 verify:ZkEVM:goerli
> npx hardhat run deployment/verifyContracts.js --network goerli
The contract 0x7B57AB2fadea6e08A9db517aE8508802614Db4c3 has already been verified
The contract 0x2b8c728f7Ec1C31D67610e9025E8769E9E99F039 has already been verified
The contract 0x5F08d8E4520cDbF0dcE070036C402E98a30d94C2 has already been verified
The contract 0x75676c695427f6a6682C45591aA3bc4364730b33 has already been verified
Verifying implementation: 0x1f908EDa752727BA0Fcce8f306aD165e67C8ecED
The contract 0x1f908EDa752727BA0Fcce8f306aD165e67C8ecED has already been verified
Verifying proxy: 0x7C4dB19d2E90a859A23587361A25697937D57A32
AssertionError: expected false to equal true
at main (/home/ubuntu/zkevm-contracts/deployment/verifyContracts.js:102:74)
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
showDiff: true,
actual: false,
expected: true,
operator: 'strictEqual'
}
```
##### aprove Matic token for sequencer
```
$ npx hardhat console --network goerli
```
```javascript!
const provider = ethers.getDefaultProvider("https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io")
const privateKey = 'From wallet.txt Trusted sequencer'
const wallet = new ethers.Wallet(privateKey, provider);
const maticTokenFactory = await ethers.getContractFactory('ERC20PermitMock', provider);
maticTokenContract = maticTokenFactory.attach("From deployments/goerly_***/deploy_output.json maticTokenAddress")
maticTokenContractWallet = maticTokenContract.connect(wallet)
await maticTokenContractWallet.approve("From deployments/goerly_***/deploy_output.json polygonZkEVMAddress", ethers.utils.parseEther("100.0"))
```
### zkNode deployment
```bash
# DOWNLOAD ARTIFACTS
$ mkdir -p ~/data/{statedb,pooldb} ~/zkevm-config ~/zkevm-node
echo 'export ZKEVM_NET=mainnet' >> ~/.profile
echo 'export ZKEVM_DIR=~/zkevm-node' >> ~/.profile
echo 'export ZKEVM_CONFIG_DIR=~/zkevm-config' >> ~/.profile
source ~/.profile
curl -L https://github.com/0xPolygonHermez/zkevm-node/releases/latest/download/$ZKEVM_NET.zip > $ZKEVM_NET.zip && unzip -o $ZKEVM_NET.zip -d $ZKEVM_DIR && rm $ZKEVM_NET.zip
cp $ZKEVM_DIR/$ZKEVM_NET/example.env $ZKEVM_CONFIG_DIR/.env
````
#### EDIT .env file
```
# EDIT THIS env file:
nano $ZKEVM_CONFIG_DIR/.env
# URL of a JSON RPC for Ethereum mainnet
ZKEVM_NODE_ETHERMAN_URL = "https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io"
# PATH WHERE THE STATEDB POSTGRES CONTAINER WILL STORE PERSISTENT DATA
ZKEVM_NODE_STATEDB_DATA_DIR = "~/data/statedb"
# PATH WHERE THE POOLDB POSTGRES CONTAINER WILL STORE PERSISTENT DATA
ZKEVM_NODE_POOLDB_DATA_DIR = "~/data/pooldb"
# OPTIONAL, UNCOMENT IF YOU WANT TO DO ADVANCED CONFIG
# ZKEVM_ADVANCED_CONFIG_DIR = "/should/be/same/path/as/ZKEVM_CONFIG_DIR"
````
#### Change genesis
* copy genesis from contracts zkevm-contracts/deplyoments/goerli_***/genesis.json into zkevm-node/mainnet/config/environments/public/public.genesis.config.json
##### Edit genesis file zkevm-node/mainnet/config/environments/public/public.genesis.config.json
```
{
"l1Config" : {
"chainId": 5,
"polygonZkEVMAddress": "...",
"maticTokenAddress": "...",
"polygonZkEVMGlobalExitRootAddress": "..."
},
"genesisBlockNumber": 9050589,
"root": "....",
"genesis": [
{
```
The chainId parameter is the L1 network, which in this deployment is goerli (5).
The other values are obtained from the file ~/zkevm-contracts/deployments/goerli_***/deploy_output.json
Just take into account that polygonZkEVMGlobalExitRootAddress is called deploymentBlockNumber in the file.
#### Change config
edit ~/zkevm-node/mainnet/config/environments/public/public.node.config.toml
```yml
IsTrustedSequencer = true
[Log]
Environment = "development" # "production" or "development"
Level = "info"
Outputs = ["stderr"]
[StateDB]
User = "state_user"
Password = "state_password"
Name = "state_db"
Host = "zkevm-state-db"
Port = "5432"
EnableLog = false
MaxConns = 200
[Pool]
FreeClaimGasLimit = 1500000
MaxTxBytesSize=30132
MaxTxDataBytesSize=30000
DefaultMinGasPriceAllowed = 1000000000
MinAllowedGasPriceInterval = "5m"
PollMinAllowedGasPriceInterval = "15s"
[Pool.DB]
User = "pool_user"
Password = "pool_password"
Name = "pool_db"
Host = "zkevm-pool-db"
Port = "5432"
EnableLog = false
MaxConns = 200
[Etherman]
URL = "https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io"
MultiGasProvider = false
L1URL = "https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io"
L2URLs = ["http://zkevm-rpc:8545"]
[Etherman.Etherscan]
ApiKey = "IT8717TY59FYRJYVS859SJ3V2ITI45STGW"
[RPC]
Host = "0.0.0.0"
Port = 8545
ReadTimeoutInSec = 60
WriteTimeoutInSec = 60
MaxRequestsPerIPAndSecond = 5000
SequencerNodeURI = ""
EnableL2SuggestedGasPricePolling = true
[RPC.WebSockets]
Enabled = true
Port = 8546
[Synchronizer]
SyncInterval = "2s"
SyncChunkSize = 100
trustedSequencerURL = ""
[MTClient]
URI = "zkevm-executor:50061"
[Executor]
URI = "zkevm-executor:50071"
[Metrics]
Host = "0.0.0.0"
Port = 9091
Enabled = true
ProfilingHost = "0.0.0.0"
ProfilingPort = 6060
ProfilingEnabled = false
[Sequencer]
WaitPeriodPoolIsEmpty = "1s"
WaitPeriodSendSequence = "15s"
LastBatchVirtualizationTimeMaxWaitPeriod = "10s"
BlocksAmountForTxsToBeDeleted = 100
FrequencyToCheckTxsForDelete = "12h"
MaxTxsPerBatch = 150
MaxBatchBytesSize = 129848
MaxCumulativeGasUsed = 30000000
MaxKeccakHashes = 468
MaxPoseidonHashes = 279620
MaxPoseidonPaddings = 149796
MaxMemAligns = 262144
MaxArithmetics = 262144
MaxBinaries = 262144
MaxSteps = 8388608
WeightBatchBytesSize = 1
WeightCumulativeGasUsed = 1
WeightKeccakHashes = 1
WeightPoseidonHashes = 1
WeightPoseidonPaddings = 1
WeightMemAligns = 1
WeightArithmetics = 1
WeightBinaries = 1
WeightSteps = 1
TxLifetimeCheckTimeout = "10m"
MaxTxLifetime = "3h"
MaxTxSizeForL1 = 131072
[Sequencer.Finalizer]
GERDeadlineTimeoutInSec = "2s"
ForcedBatchDeadlineTimeoutInSec = "60s"
SendingToL1DeadlineTimeoutInSec = "20s"
SleepDurationInMs = "100ms"
ResourcePercentageToCloseBatch = 10
GERFinalityNumberOfBlocks = 0
ClosingSignalsManagerWaitForCheckingL1Timeout = "10s"
ClosingSignalsManagerWaitForCheckingGER = "10s"
ClosingSignalsManagerWaitForCheckingForcedBatches = "10s"
ForcedBatchesFinalityNumberOfBlocks = 0
TimestampResolution = "15s"
[Sequencer.DBManager]
PoolRetrievalInterval = "500ms"
[Sequencer.Worker]
ResourceCostMultiplier = 1000
[SequenceSender]
WaitPeriodSendSequence = "5s"
LastBatchVirtualizationTimeMaxWaitPeriod = "5s"
MaxTxSizeForL1 = 131072
SenderAddress = "0x225c96B7dB4223f0244DcfC833e0bB9f40a948E4"
PrivateKeys = [{Path = "/pk/sequencer.keystore", Password = "password"}]
[Aggregator]
Host = "0.0.0.0"
Port = 50081
ForkId = 4
RetryTime = "5s"
VerifyProofInterval = "30s"
TxProfitabilityCheckerType = "acceptall"
TxProfitabilityMinReward = "1.1"
ProofStatePollingInterval = "5s"
SenderAddress = "0xC44e94B84C6b021a90a3946404cF30d3aF921437"
CleanupLockedProofsInterval = "2m"
GeneratingProofCleanupThreshold = "10m"
[EthTxManager]
ForcedGas = 0
PrivateKeys = [
{Path = "/pk/sequencer.keystore", Password = "password"},
{Path = "/pk/aggregator.keystore", Password = "password"}
]
[Database]
Database = "postgres"
User = "test_user"
Password = "test_password"
Name = "test_db"
Host = "zkevm-bridge-db"
Port = "5435"
MaxConns = 20
[BridgeController]
Store = "postgres"
Height = 32
[BridgeServer]
GRPCPort = "9090"
HTTPPort = "8080"
[NetworkConfig]
GenBlockNumber = 9050589
PolygonZkEVMAddress = "0x85cc56a5d329AB0ACE1D419A89cFcbfE006f1E67"
PolygonBridgeAddress = "0xBe36B148797a3CB52b0818c2a357E7CF35474B98"
PolygonZkEVMGlobalExitRootAddress = "0xc13f0e85326666b12705A81e8BE5e7d7D97A1c31"
MaticTokenAddress = "0x0487999Df59BD3a0C6A2BFc13b31b8EA766289F6"
L2PolygonBridgeAddresses = ["0xBe36B148797a3CB52b0818c2a357E7CF35474B98"]
L1ChainID = 5
[L2GasPriceSuggester]
Type = "default"
DefaultGasPriceWei = 100000000
[ClaimTxManager]
FrequencyToMonitorTxs = "1s"
PrivateKey = {Path = "/pk/sequencer.keystore", Password = "password"}
Enabled = true
```
and change:
```yml
[Etherman]
URL = "https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io"
L1URL ="https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io"
[Etherman.Etherscan]
ApiKey = "..."
[Aggregator]
SenderAddress = "" (trustedAggregator from deploy_output.json)
[NetworkConfig]
GenBlockNumber = (deploymentBlockNumber from deploy_output.json)
PolygonZkEVMAddress = (polygonZkEVMAddress from deploy_output.json)
PolygonBridgeAddress = (PolygonZkEVMBridge from genesis.json)
PolygonZkEVMGlobalExitRootAddress = (polygonZkEVMGlobalExitRootAddress from deploy_output.json)
MaticTokenAddress = (maticTokenAddress from deploy_output.json)
L2PolygonBridgeAddresses = [""] (PolygonZkEVMBridge from genesis.json)
```
#### Add wallets
* nano zkevm-config/sequencer.keystore (from wallets.txt)
* nano zkevm-config/aggregator.keystore (from wallets.txt)
#### edit init_prover_db.sql
got to ~/zkevm-node/mainnet/db/scripts and edit init_prover_db.sql to match this:
```
CREATE DATABASE prover_db;
\connect prover_db;
CREATE SCHEMA state;
CREATE TABLE state.nodes (hash BYTEA PRIMARY KEY, data BYTEA NOT NULL);
CREATE TABLE state.program (hash BYTEA PRIMARY KEY, data BYTEA NOT NULL);
CREATE USER prover_user with password 'prover_pass';
GRANT CONNECT ON DATABASE prover_db TO prover_user;
ALTER USER prover_user SET SEARCH_PATH=state;
GRANT ALL PRIVILEGES ON SCHEMA state TO prover_user;
GRANT ALL PRIVILEGES ON TABLE state.nodes TO prover_user;
GRANT ALL PRIVILEGES ON TABLE state.program TO prover_user;
```
#### Start services
remove zkevm-node/mainnet/docker-compose.yml content
##### start databases
```yml=
version: "3.5"
networks:
default:
name: zkevm
services:
zkevm-state-db:
container_name: zkevm-state-db
restart: unless-stopped
image: postgres
healthcheck:
test: [ "CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}" ]
ports:
- 5432:5432
volumes:
- ./db/scripts/init_prover_db.sql:/docker-entrypoint-initdb.d/init.sql
- ${ZKEVM_NODE_STATEDB_DATA_DIR}:/var/lib/postgresql/data
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/postgresql.conf:/etc/postgresql.conf
environment:
- POSTGRES_USER=state_user
- POSTGRES_PASSWORD=state_password
- POSTGRES_DB=state_db
command:
- "postgres"
- "-N"
- "500"
- "-c"
- "config_file=/etc/postgresql.conf"
zkevm-pool-db:
container_name: zkevm-pool-db
restart: unless-stopped
image: postgres
healthcheck:
test: [ "CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}" ]
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 1G
ports:
- 5433:5432
volumes:
- ${ZKEVM_NODE_POOLDB_DATA_DIR}:/var/lib/postgresql/data
environment:
- POSTGRES_USER=pool_user
- POSTGRES_PASSWORD=pool_password
- POSTGRES_DB=pool_db
command:
- "postgres"
- "-N"
- "500"
```
```bash
$ sudo docker compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d
## Check status
$ sudo docker compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
zkevm-pool-db postgres "docker-entrypoint.s…" zkevm-pool-db 38 seconds ago Up 36 seconds (healthy) 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp
zkevm-state-db postgres "docker-entrypoint.s…" zkevm-state-db 38 seconds ago Up 36 seconds (healthy) 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
```
##### Executor
add:
```
zkevm-executor:
container_name: zkevm-executor
restart: unless-stopped
image: hermeznetwork/zkevm-prover:v1.1.4-RC2-fork.4
depends_on:
zkevm-state-db:
condition: service_healthy
ports:
- 50061:50061 # MT
- 50071:50071 # Executor
volumes:
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.prover.config.json:/usr/src/app/config.json
command: >
zkProver -c /usr/src/app/config.json
```
```bash
$ sudo docker compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml up -d
## Check status
$ sudo docker compose --env-file $ZKEVM_CONFIG_DIR/.env -f $ZKEVM_DIR/$ZKEVM_NET/docker-compose.yml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
zkevm-executor hermeznetwork/zkevm-prover:c231382 "zkProver -c /usr/sr…" zkevm-executor 12 seconds ago Up 7 seconds 0.0.0.0:50061->50061/tcp, :::50061->50061/tcp, 0.0.0.0:50071->50071/tcp, :::50071->50071/tcp
zkevm-pool-db postgres "docker-entrypoint.s…" zkevm-pool-db 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp
zkevm-state-db postgres "docker-entrypoint.s…" zkevm-state-db 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
````
##### syncronizer
```yml=
zkevm-sync:
container_name: zkevm-sync
restart: unless-stopped
depends_on:
zkevm-state-db:
condition: service_healthy
zkevm-executor:
condition: service_started
image: hermeznetwork/zkevm-node:v0.1.2-RC1
environment:
- ZKEVM_NODE_ETHERMAN_URL=${ZKEVM_NODE_ETHERMAN_URL}
volumes:
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.genesis.config.json:/app/genesis.json
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components synchronizer"
```
##### l2-gas-pricer
```
zkevm-l2gaspricer:
container_name: zkevm-l2gaspricer
image: hermeznetwork/zkevm-node:v0.1.2-RC1
depends_on:
zkevm-pool-db:
condition: service_healthy
environment:
- ZKEVM_NODE_POOL_DB_HOST=zkevm-pool-db
volumes:
- /home/ubuntu/zkevm-config/sequencer.keystore:/pk/keystore
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.genesis.config.json:/app/genesis.json
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components l2gaspricer"
```
##### zkevm-eth-tx-manager
```yml
zkevm-eth-tx-manager:
container_name: zkevm-eth-tx-manager
image: hermeznetwork/zkevm-node:v0.1.2-RC1
depends_on:
zkevm-state-db:
condition: service_healthy
ports:
- 9094:9091 # needed if metrics enabled
environment:
- ZKEVM_NODE_STATEDB_HOST=zkevm-state-db
volumes:
- ${ZKEVM_CONFIG_DIR}/sequencer.keystore:/pk/sequencer.keystore
- ${ZKEVM_CONFIG_DIR}/aggregator.keystore:/pk/aggregator.keystore
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.genesis.config.json:/app/genesis.json
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components eth-tx-manager"
```
##### rpc
```
zkevm-rpc:
container_name: zkevm-rpc
restart: unless-stopped
depends_on:
zkevm-pool-db:
condition: service_healthy
zkevm-state-db:
condition: service_healthy
zkevm-sync:
condition: service_started
image: hermeznetwork/zkevm-node:v0.1.2-RC1
ports:
- 8545:8545
- 9091:9091 # needed if metrics enabled
environment:
- ZKEVM_NODE_ETHERMAN_URL=${ZKEVM_NODE_ETHERMAN_URL}
volumes:
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.genesis.config.json:/app/genesis.json
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components rpc --http.api eth,net,debug,zkevm,txpool,web3"
```
##### sequencer
```
zkevm-sequencer:
container_name: zkevm-sequencer
image: hermeznetwork/zkevm-node:v0.1.2-RC1
depends_on:
zkevm-pool-db:
condition: service_healthy
zkevm-state-db:
condition: service_healthy
zkevm-executor:
condition: service_started
ports:
- 9092:9091 # needed if metrics enabled
- 6060:6060
environment:
- ZKEVM_NODE_STATEDB_HOST=zkevm-state-db
- ZKEVM_NODE_POOL_DB_HOST=zkevm-pool-db
- ZKEVM_NODE_SEQUENCER_SENDER_ADDRESS=__CHANGE_ADDRESS__
volumes:
- ${ZKEVM_CONFIG_DIR}/sequencer.keystore:/pk/sequencer.keystore
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.genesis.config.json:/app/genesis.json
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components sequencer,sequence-sender"
```
##### aggregator
````
zkevm-aggregator:
container_name: zkevm-aggregator
image: hermeznetwork/zkevm-node:v0.1.2-RC1
depends_on:
zkevm-pool-db:
condition: service_healthy
zkevm-state-db:
condition: service_healthy
ports:
- 50081:50081
- 9093:9091 # needed if metrics enabled
environment:
- ZKEVM_NODE_STATEDB_HOST=zkevm-state-db
- ZKEVM_NODE_AGGREGATOR_SENDER_ADDRESS=__CHANGE_ADDRESS__
volumes:
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.genesis.config.json:/app/genesis.json
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components aggregator"
````
##### zkevm-explorer
```
zkevm-explorer-l2:
container_name: zkevm-explorer-l2
image: hermeznetwork/zkevm-explorer:latest
ports:
- 4004:4004
environment:
- PORT=4004
- NETWORK=POE
- SUBNETWORK=Polygon zkEVM
- CHAIN_ID=4269
- COIN=ETH
- ETHEREUM_JSONRPC_VARIANT=geth
- ETHEREUM_JSONRPC_HTTP_URL=http://zkevm-rpc:8545
- DATABASE_URL=postgres://l2_explorer_user:l2_explorer_password@zkevm-explorer-l2-db:5432/explorer
- ECTO_USE_SSL=false
- MIX_ENV=prod
- LOGO=/images/blockscout_logo.svg
- LOGO_FOOTER=/images/blockscout_logo.svg
- SUPPORTED_CHAINS=[]
- SHOW_OUTDATED_NETWORK_MODAL=false
command: ["/bin/sh", "-c", "mix do ecto.create, ecto.migrate; mix phx.server"]
zkevm-explorer-l2-db:
container_name: zkevm-explorer-l2-db
image: postgres
ports:
- 5436:5432
environment:
- POSTGRES_USER=l2_explorer_user
- POSTGRES_PASSWORD=l2_explorer_password
- POSTGRES_DB=l2_explorer_db
command: [ "postgres", "-N", "500" ]
```
##### bridge
```
zkevm-bridge-db:
container_name: zkevm-bridge-db
image: postgres
healthcheck:
test: [ "CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}" ]
expose:
- 5435
ports:
- 5435:5432
environment:
- POSTGRES_USER=test_user
- POSTGRES_PASSWORD=test_password
- POSTGRES_DB=test_db
command: ["postgres", "-N", "500"]
zkevm-bridge-service:
container_name: zkevm-bridge-service
image: hermeznetwork/zkevm-bridge-service:v0.1.0
depends_on:
zkevm-bridge-db:
condition: service_healthy
ports:
- 9090:9090
- 8081:8080
environment:
- ZKEVM_BRIDGE_DATABASE_USER=test_user
- ZKEVM_BRIDGE_DATABASE_PASSWORD=test_password
- ZKEVM_BRIDGE_DATABASE_NAME=test_db
- ZKEVM_BRIDGE_DATABASE_HOST=zkevm-bridge-db
- ZKEVM_BRIDGE_DATABASE_PORT=5432
volumes:
- ${ZKEVM_CONFIG_DIR}/sequencer.keystore:/pk/sequencer.keystore
- ${ZKEVM_ADVANCED_CONFIG_DIR:-./config/environments/public}/public.node.config.toml:/app/config.toml
command:
- "/bin/sh"
- "-c"
- "/app/zkevm-bridge run --cfg /app/config.toml"
zkevm-bridge-ui:
container_name: zkevm-bridge-ui
image: hermeznetwork/zkevm-bridge-ui:latest
ports:
- 8080:80
environment:
- ETHEREUM_RPC_URL=https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io
- ETHEREUM_EXPLORER_URL=https://goerli.etherscan.io
- ETHEREUM_BRIDGE_CONTRACT_ADDRESS=...
- ETHEREUM_FORCE_UPDATE_GLOBAL_EXIT_ROOT=true
- ETHEREUM_PROOF_OF_EFFICIENCY_CONTRACT_ADDRESS=...
- POLYGON_ZK_EVM_RPC_URL=http://IP:8545
- POLYGON_ZK_EVM_EXPLORER_URL=http://IP:4004
- POLYGON_ZK_EVM_BRIDGE_CONTRACT_ADDRESS=...
- POLYGON_ZK_EVM_NETWORK_ID=1
- BRIDGE_API_URL=http://IP:8081
- ENABLE_FIAT_EXCHANGE_RATES=false
- ENABLE_OUTDATED_NETWORK_MODAL=false
- ENABLE_DEPOSIT_WARNING=true
- ENABLE_REPORT_FORM=false
```
##### Prover config on ~/config.json
```json
{
"runExecutorServer": false,
"runExecutorClient": false,
"runExecutorClientMultithread": false,
"runStateDBServer": false,
"runStateDBTest": false,
"runAggregatorServer": false,
"runAggregatorClient": true,
"proverName": "static_prover",
"runFileGenBatchProof": false,
"runFileGenAggregatedProof": false,
"runFileGenFinalProof": false,
"runFileProcessBatch": false,
"runFileProcessBatchMultithread": false,
"runFileExecutor": false,
"runKeccakScriptGenerator": false,
"runKeccakTest": false,
"runStorageSMTest": false,
"runBinarySMTest": false,
"runMemAlignSMTest": false,
"runSHA256Test": false,
"runBlakeTest": false,
"executeInParallel": true,
"useMainExecGenerated": true,
"useProcessBatchCache": true,
"saveRequestToFile": false,
"saveInputToFile": true,
"saveDbReadsToFile": true,
"saveDbReadsToFileOnChange": false,
"saveOutputToFile": true,
"saveFilesInSubfolders": false,
"saveProofToFile": true,
"saveResponseToFile": false,
"loadDBToMemCache": true,
"loadDBToMemCacheInParallel": false,
"dbMTCacheSize": 16384,
"dbProgramCacheSize": 16384,
"dbMultiWrite": true,
"dbFlushInParallel": true,
"opcodeTracer": false,
"logRemoteDbReads": false,
"logExecutorServerResponses": false,
"executorServerPort": 50071,
"executorROMLineTraces": false,
"executorClientPort": 50071,
"executorClientHost": "127.0.0.1",
"stateDBServerPort": 5432,
"stateDBURL": "local",
"aggregatorServerPort": 50081,
"aggregatorClientPort": 50081,
"aggregatorClientHost": "YOUR-PUBLIC-IP-ADDRESS",
"aggregatorClientMockTimeout": 10000000,
"mapConstPolsFile": false,
"mapConstantsTreeFile": false,
"inputFile": "testvectors/aggregatedProof/recursive1.zkin.proof_0.json",
"inputFile2": "testvectors/aggregatedProof/recursive1.zkin.proof_1.json",
"outputPath": "/output/",
"configPath": "/mnt/prover/config/",
"zkevmCmPols_disabled": "/mnt/prover/runtime/zkevm.commit",
"c12aCmPols": "runtime/c12a.commit",
"recursive1CmPols_disabled": "runtime/recursive1.commit",
"recursive2CmPols_disabled": "runtime/recursive2.commit",
"recursivefCmPols_disabled": "runtime/recursivef.commit",
"finalCmPols_disabled": "runtime/final.commit",
"publicsOutput": "public.json",
"proofFile": "proof.json",
"databaseURL": "postgresql://prover_user:prover_pass@zkevm-state-db:5432/prover_db",
"databaseURL_disabled": "local",
"dbNodesTableName": "state.nodes",
"dbProgramTableName": "state.program",
"dbConnectionsPool": true,
"cleanerPollingPeriod": 600,
"requestsPersistence": 3600,
"maxExecutorThreads": 20,
"maxProverThreads": 8,
"maxStateDBThreads": 8
}
```
In "aggregatorClientHost" set your public IP address.
##### prover
```
zkevm-prover-server:
container_name: zkevm-prover-server
image: hermeznetwork/zkevm-prover:v1.1.4-RC2-fork.4
ports:
- 50051:50051
volumes:
- ~/v1.1.0-rc.1-fork.4/config:/mnt/prover/config:ro
- ~/config.json:/app/config.json
command: "zkProver -c /app/config.json"
```
#### Open Ports
* 22
* 8081
* 8080
* 50081
* 5432
* 8545
* 4004
* 61090
#### Activate forced tx
```
$ npx hardhat console --network goerli
const zkevm = await ethers.getContractFactory('PolygonZkEVM')
const zkevmContract = zkevm.attach("_polygonZkEVMAddress_")
const provider = ethers.getDefaultProvider("https://erigon-goerli-erigon.b0231289064888c3.dyndns.dappnode.io")
const privateKey = 'From wallet.txt Deployment Address'
const wallet = new ethers.Wallet(privateKey, provider);
const zkevmContractWallet = zkevm.connect(wallet)
await zkevmContract.activateForceBatches()
```
### Install go
```
wget https://go.dev/dl/go1.20.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.20.4.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
source .profile
go version
```
### Provide L1 Ether to the bridge
We are going to create a bridge transaction to send L1 Ether to the bridge.
```
mkdir -p ~/initial-bridge
cd initial-bridge
wget https://raw.githubusercontent.com/0xPolygonHermez/zkevm-bridge-service/develop/test/scripts/deposit/main.go
nano main.go
l1BridgeAddr = "0x5567fAbF3B17F320BA3906d2f6CD43021d27A8AB" // zkevm-contracts/deployments/goerli_*/deploy_output.json: polygonZkEVMBridgeAddress
l1AccHexAddress = "0x593A083125Dc0f6E50c0DAe8689ece7E22987450" // zkevm-contracts/wallets.txt: sequencer address
l1AccHexPrivateKey = "0x438f372ac8cdfa13493cab7d0155e4f4c24f98664edf8a3139cfae6967a48c33" // zkevm-contracts/wallets.txt: sequencer prvkey
l1NetworkURL = "http://147.83.40.37:8545" // public IP
go mod init example.com/deposit
go mod tidy
go run main.go
2023-06-07T06:28:58.739Z INFO initial-bridge/main.go:41 Sending bridge tx... {"pid": 776268, "version": "v0.1.0"}
2023-06-07T06:29:14.211Z DEBUG operations/wait.go:99 Transaction successfully mined: 0x9dfe6006dc01ccd350e63d31547fd562ed3ccd7d572d96d5e24d138f83371864 {"pid": 776268, "version": "v0.1.0"}
2023-06-07T06:29:14.211Z INFO initial-bridge/main.go:46 Success! {"pid": 776268, "version": "v0.1.0"}
https://goerli.etherscan.io/tx/0x9dfe6006dc01ccd350e63d31547fd562ed3ccd7d572d96d5e24d138f83371864
```
### Claim our L2 zkEther
Create a forzed claim to get the zkEther in L2.
```
mkdir -p ~/initial-claim
cd initial-claim
wget https://raw.githubusercontent.com/0xPolygonHermez/zkevm-bridge-service/develop/test/scripts/initialClaim/main.go
```
Open main.go and modify the following parameters:
```
const (
l2BridgeAddr = "0x5567fAbF3B17F320BA3906d2f6CD43021d27A8AB" // zkevm-contracts/deployments/goerli_*/deploy_output.json: polygonZkEVMBridgeAddress
zkevmAddr = "0x12c3e0CC1d4619deaC19014a72C98c129448Cfd7" // zkevm-contracts/deployments/goerli_*/deploy_output.json: polygonZkEVMAddress
accHexAddress = "0x593A083125Dc0f6E50c0DAe8689ece7E22987450" // zkevm-contracts/wallets.txt: sequencer address
accHexPrivateKey = "0x438f372ac8cdfa13493cab7d0155e4f4c24f98664edf8a3139cfae6967a48c33" // zkevm-contracts/wallets.txt: sequencer prvkey
l1NetworkURL = "http://147.83.40.37:8545" // public IP
l2NetworkURL = "http://147.83.40.37:8123" // public IP
bridgeURL = "http://147.83.40.37:8080" // public IP
l2GasLimit = 1000000
mtHeight = 32
miningTimeout = 180
)
```
go
go get github.com/0xPolygonHermez/zkevm-bridge-service@4e1ca558144cac00fe0762329aaf7b3e9482b57a
go run main.go
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:69 bridge: orig_addr:"0x0000000000000000000000000000000000000000" amount:"90000000000000000" dest_net:1 dest_addr:"0x593A083125Dc0f6E50c0DAe8689ece7E22987450" block_num:9136803 tx_hash:"0x9dfe6006dc01ccd350e63d31547fd562ed3ccd7d572d96d5e24d138f83371864" metadata:"0x" ready_for_claim:true {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:70 mainnetExitRoot: 0x2f980da5486db6393ea8bacd68a3e68286eaa8c217fcf4eccaf68fe17746d55b {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:71 rollupExitRoot: 0x0000000000000000000000000000000000000000000000000000000000000000 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x0000000000000000000000000000000000000000000000000000000000000000 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z DEBUG initial-claim/main.go:75 smt: 0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.723Z INFO initial-claim/main.go:81 Sending claim tx... {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:105 L2 tx.Nonce: 0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:106 L2 tx.GasPrice: 0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:107 L2 tx.Gas: 1000000 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:108 L2 tx.Hash: 0x8de2d20ee06e1dcb6d195625ca4e9e9cd45205b9a824f20d23b2c0696185705d {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:114 tx encoded: 0xf905a98080830f4240945567fabf3b17f320ba3906d2f6cd43021d27a8ab80b905442cffd02e0000000000000000000000000000000000000000000000000000000000000000ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea32293237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7358448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a900000000000000000000000000000000000000000000000000000000000000002f980da5486db6393ea8bacd68a3e68286eaa8c217fcf4eccaf68fe17746d55b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000593a083125dc0f6e50c0dae8689ece7e22987450000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000830148cda0a754008042998fa9efaf836ec05b2da654ff0bd915cafa6749735f12d32db6aba01ccd2215559aab1ec5951d649ad51a2cafd9f9402dc4f30779aa0a6ba15cac42 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z DEBUG state/helper.go:29 0 0 1000000 0x5567fAbF3B17F320BA3906d2f6CD43021d27A8AB 0 1348 42069 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:119 forcedBatch content: 0xf905688080830f4240945567fabf3b17f320ba3906d2f6cd43021d27a8ab80b905442cffd02e0000000000000000000000000000000000000000000000000000000000000000ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea32293237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7358448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a900000000000000000000000000000000000000000000000000000000000000002f980da5486db6393ea8bacd68a3e68286eaa8c217fcf4eccaf68fe17746d55b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000593a083125dc0f6e50c0dae8689ece7e22987450000000000000000000000000000000000000000000000000013fbe85edc900000000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000000082a4558080a754008042998fa9efaf836ec05b2da654ff0bd915cafa6749735f12d32db6ab1ccd2215559aab1ec5951d649ad51a2cafd9f9402dc4f30779aa0a6ba15cac421b {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:45.724Z INFO initial-claim/main.go:121 Using address: 0x593A083125Dc0f6E50c0DAe8689ece7E22987450 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:46.058Z INFO initial-claim/main.go:146 Number of forceBatches in the smc: 0 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:46.569Z DEBUG initial-claim/main.go:152 currentBlock.Time(): 1686120096 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:47.061Z INFO initial-claim/main.go:165 TxHash: 0x1ab11947011f9c2edcf341a2900e33c0b5a511406944c34cdf5ad89fe6beb837 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:50.127Z DEBUG operations/wait.go:99 Transaction successfully mined: 0x1ab11947011f9c2edcf341a2900e33c0b5a511406944c34cdf5ad89fe6beb837 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:50.191Z DEBUG initial-claim/main.go:185 log decoded: &{ForceBatchNum:1 LastGlobalExitRoot:[16 237 230 159 3 176 133 128 210 131 176 252 112 62 157 197 14 20 224 230 228 59 198 115 13 253 176 18 80 178 250 204] Sequencer:0x593A083125Dc0f6E50c0DAe8689ece7E22987450 Transactions:[] Raw:{Address:0x12c3e0CC1d4619deaC19014a72C98c129448Cfd7 Topics:[0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931 0x0000000000000000000000000000000000000000000000000000000000000001] Data:[16 237 230 159 3 176 133 128 210 131 176 252 112 62 157 197 14 20 224 230 228 59 198 115 13 253 176 18 80 178 250 204 0 0 0 0 0 0 0 0 0 0 0 0 89 58 8 49 37 220 15 110 80 192 218 232 104 158 206 126 34 152 116 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] BlockNumber:9136851 TxHash:0x1ab11947011f9c2edcf341a2900e33c0b5a511406944c34cdf5ad89fe6beb837 TxIndex:43 BlockHash:0xd03c597d947ea87cf72ea69455e088488c2bd6a52f3de974a80f7b4d51e4c61f Index:109 Removed:false}} {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:50.191Z INFO initial-claim/main.go:187 GlobalExitRoot: 0x10ede69f03b08580d283b0fc703e9dc50e14e0e6e43bc6730dfdb01250b2facc {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:50.191Z INFO initial-claim/main.go:188 Transactions: {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:50.730Z INFO initial-claim/main.go:193 MinForcedTimestamp: 1686120108 {"pid": 783804, "version": "v0.1.0"}
2023-06-07T06:41:50.731Z INFO initial-claim/main.go:196 Success!!!! {"pid": 783804, "version": "v0.1.0"}
#### brid
```
```
```
package main
import (
"context"
"math/big"
"github.com/0xPolygonHermez/zkevm-bridge-service/etherman"
clientUtils "github.com/0xPolygonHermez/zkevm-bridge-service/test/client"
"github.com/0xPolygonHermez/zkevm-bridge-service/utils"
"github.com/0xPolygonHermez/zkevm-node/log"
"github.com/ethereum/go-ethereum/common"
)
const (
l2BridgeAddr = "0xcCAb59a3D6Ca0E945D7807Aea48EE1aBf85dA316"
l2AccHexAddress = "0x88dAA5DB47afc13ade1d8F2a8E102788251454a5"
l2AccHexPrivateKey = "0xcf09fc0001da715d53aa8208c16dca1f325a8c1e90d6dbe314dbcb43a92f5875"
l2NetworkURL = "http://54.227.78.48:8545"
bridgeURL = "http://54.227.78.48:8080"
mtHeight = 32
)
func main() {
ctx := context.Background()
c, err := utils.NewClient(ctx, l2NetworkURL, common.HexToAddress(l2BridgeAddr))
if err != nil {
log.Fatal("Error: ", err)
}
auth, err := c.GetSigner(ctx, l2AccHexPrivateKey)
if err != nil {
log.Fatal("Error: ", err)
}
// Get Claim data
cfg := clientUtils.Config{
L1NodeURL: l2NetworkURL,
L2NodeURL: l2NetworkURL,
BridgeURL: bridgeURL,
L2BridgeAddr: common.HexToAddress(l2BridgeAddr),
}
client, err := clientUtils.NewClient(ctx, cfg)
if err != nil {
log.Fatal("Error: ", err)
}
deposits, _, err := client.GetBridges(l2AccHexAddress, 0, 10) //nolint
if err != nil {
log.Fatal("Error: ", err)
}
bridgeData := deposits[0]
proof, err := client.GetMerkleProof(deposits[0].NetworkId, deposits[0].DepositCnt)
if err != nil {
log.Fatal("error: ", err)
}
log.Debug("bridge: ", bridgeData)
log.Debug("mainnetExitRoot: ", proof.MainExitRoot)
log.Debug("rollupExitRoot: ", proof.RollupExitRoot)
var smt [mtHeight][32]byte
for i := 0; i < len(proof.MerkleProof); i++ {
log.Debug("smt: ", proof.MerkleProof[i])
smt[i] = common.HexToHash(proof.MerkleProof[i])
}
globalExitRoot := ðerman.GlobalExitRoot{
ExitRoots: []common.Hash{common.HexToHash(proof.MainExitRoot), common.HexToHash(proof.RollupExitRoot)},
}
log.Info("Sending claim tx...")
a, _ := big.NewInt(0).SetString(bridgeData.Amount, 0)
e := etherman.Deposit {
LeafType: uint8(bridgeData.LeafType),
OriginalNetwork: uint(bridgeData.OrigNet),
OriginalAddress: common.HexToAddress(bridgeData.OrigAddr),
Amount: a,
DestinationNetwork: uint(bridgeData.DestNet),
DestinationAddress: common.HexToAddress(bridgeData.DestAddr),
DepositCount: uint(bridgeData.DepositCnt),
BlockNumber: bridgeData.BlockNum,
NetworkID: uint(bridgeData.NetworkId),
TxHash: common.HexToHash(bridgeData.TxHash),
Metadata: []byte(bridgeData.Metadata),
ReadyForClaim: bridgeData.ReadyForClaim,
}
to, data, err := c.BuildSendClaim(ctx, &e, smt, globalExitRoot, auth)
if err != nil {
log.Fatal("error: ", err)
}
log.Info("to: ", to)
log.Info("data: ", data)
log.Info("data hex: ", common.Bytes2Hex(data))
log.Info("Success!")
balance, err := c.Client.BalanceAt(ctx, common.HexToAddress(l2AccHexAddress), nil)
if err != nil {
log.Fatal("error getting balance: ", err)
}
log.Info("L2 balance: ", balance)
}
```
edit:
* l2BridgeAddr
* l2AccHexAddress (sequencer address)
* l2AccHexPrivateKey (sequencer private key)
* l2NetworkURL ("http://54.227.78.48:8545")
* bridgeURL ("http://54.227.78.48:8080")
```
go mod init example.com/claim
go mod tidy
go get github.com/0xPolygonHermez/zkevm-bridge-service/utils@dcb8177036017af5f9eeee650a67a5be436f867d
go run main.go
```