From b23b5ae3bfab43b8d9bfefa2ac388da1ad78bff7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 2 May 2023 14:13:48 -0700 Subject: [PATCH] Fixturenet pocket (#350) * add fixturenet-gaia stack * add fixturenet-pocket * integrate with eth fixturenet * separate out fixturenet-gaia * use pocket-deployments Dockerfile --------- Co-authored-by: iskay Co-authored-by: Ian --- .../docker-compose-fixturenet-pocket.yml | 18 ++ app/data/config/fixturenet-pocket/chains.json | 18 ++ .../fixturenet-pocket/create-fixturenet.sh | 65 +++++ .../config/fixturenet-pocket/genesis.json | 272 ++++++++++++++++++ app/data/container-build/cerc-pocket/build.sh | 3 + app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 2 + app/data/stacks/fixturenet-pocket/README.md | 59 ++++ app/data/stacks/fixturenet-pocket/stack.yml | 16 ++ 10 files changed, 455 insertions(+) create mode 100644 app/data/compose/docker-compose-fixturenet-pocket.yml create mode 100755 app/data/config/fixturenet-pocket/chains.json create mode 100644 app/data/config/fixturenet-pocket/create-fixturenet.sh create mode 100644 app/data/config/fixturenet-pocket/genesis.json create mode 100755 app/data/container-build/cerc-pocket/build.sh create mode 100644 app/data/stacks/fixturenet-pocket/README.md create mode 100644 app/data/stacks/fixturenet-pocket/stack.yml diff --git a/app/data/compose/docker-compose-fixturenet-pocket.yml b/app/data/compose/docker-compose-fixturenet-pocket.yml new file mode 100644 index 00000000..88d34f91 --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-pocket.yml @@ -0,0 +1,18 @@ +version: "3.2" +services: + pocket: + restart: unless-stopped + image: cerc/pocket:local + # command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + entrypoint: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + volumes: + # TODO: look at folding these scripts into the container + - ../config/fixturenet-pocket/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh + - ../config/fixturenet-pocket/chains.json:/home/app/pocket-configs/chains.json + - ../config/fixturenet-pocket/genesis.json:/home/app/pocket-configs/genesis.json + ports: + - "8081:8081" # pocket relay rpc +networks: + net1: + name: fixturenet-eth_default + external: true diff --git a/app/data/config/fixturenet-pocket/chains.json b/app/data/config/fixturenet-pocket/chains.json new file mode 100755 index 00000000..3045620a --- /dev/null +++ b/app/data/config/fixturenet-pocket/chains.json @@ -0,0 +1,18 @@ +[ + { + "id": "0001", + "url": "http://127.0.0.1:8081/", + "basic_auth": { + "username": "", + "password": "" + } + }, + { + "id": "0021", + "url": "http://fixturenet-eth-geth-1:8545/", + "basic_auth": { + "username": "", + "password": "" + } + } +] diff --git a/app/data/config/fixturenet-pocket/create-fixturenet.sh b/app/data/config/fixturenet-pocket/create-fixturenet.sh new file mode 100644 index 00000000..4696749f --- /dev/null +++ b/app/data/config/fixturenet-pocket/create-fixturenet.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# TODO: we should have a mechanism to bundle it inside the container rather than link from here +# at deploy time. + +CHAINID="pocketlocal-1" +MONIKER="localtestnet" +SERVICE_URL="http://127.0.0.1:8081" +PASSWORD="mypassword" # wallet password, required by cli + +# check if jq is installed; install if necessary +# command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } +if ! command -v jq > /dev/null 2>&1; then + echo "jq not installed, downloading..." + mkdir -p /home/app/bin + wget -O /home/app/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 + chmod +x /home/app/bin/jq + export PATH=$PATH:/home/app/bin +fi + +# remove existing daemon and client +rm -rf ~/.pocket* + +# create a wallet with password "mypassword" and save the address for later +address=$(pocket accounts create --pwd $PASSWORD | awk '/Address:/ {print $2}') + +# set this address as the validator address for the node +pocket accounts set-validator $address --pwd $PASSWORD + +# save the public key for later +pubkey=$(pocket accounts show $address | awk '/Public Key:/ {print $3}') + +# set node's moniker +echo $(pocket util print-configs) | jq '.tendermint_config.Moniker = "'"$MONIKER"'"' | jq . > $HOME/.pocket/config/config.json + +# pocket mainnet has block time of 15 minutes, set closer to 1 minute instead +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPropose = 8000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutProposeDelta = 600000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrevote = 4000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrevoteDelta = 600000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrecommit = 4000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrecommitDelta = 6000000006' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutCommit = 52000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.CreateEmptyBlocksInterval = 60000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.PeerGossipSleepDuration = 2000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.PeerQueryMaj23SleepDuration = 1200000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json + +# include genesis.json and chains.json +cp $HOME/pocket-configs/genesis.json $HOME/.pocket/config/genesis.json +cp $HOME/pocket-configs/chains.json $HOME/.pocket/config/chains.json + +# set chain-id and add node to genesis.json as a validator +cat $HOME/.pocket/config/genesis.json | jq '.chain_id="'"$CHAINID"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.auth.accounts[0].value.address="'"$address"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.auth.accounts[0].value.public_key.value="'"$pubkey"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.pos.validators[0].address="'"$address"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.pos.validators[0].public_key="'"$pubkey"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.pos.validators[0].service_url="'"$SERVICE_URL"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json + +# if [[ $1 == "pending" ]]; then +# echo "pending mode is on, please wait for the first block committed." +# fi + +# Start the node +pocket start --simulateRelay diff --git a/app/data/config/fixturenet-pocket/genesis.json b/app/data/config/fixturenet-pocket/genesis.json new file mode 100644 index 00000000..4d92d5a6 --- /dev/null +++ b/app/data/config/fixturenet-pocket/genesis.json @@ -0,0 +1,272 @@ +{ + "genesis_time": "2020-07-28T15:00:00.000000Z", + "chain_id": "testnet", + "consensus_params": { + "block": { + "max_bytes": "4000000", + "max_gas": "-1", + "time_iota_ms": "1" + }, + "evidence": { + "max_age": "120000000000" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + } + }, + "app_hash": "", + "app_state": { + "application": { + "params": { + "unstaking_time": "1814000000000000", + "max_applications": "9223372036854775807", + "app_stake_minimum": "1000000", + "base_relays_per_pokt": "167", + "stability_adjustment": "0", + "participation_rate_on": false, + "maximum_chains": "15" + }, + "applications": [], + "exported": false + }, + "auth": { + "params": { + "max_memo_characters": "75", + "tx_sig_limit": "8", + "fee_multipliers": { + "fee_multiplier": [], + "default": "1" + } + }, + "accounts": [ + { + "type": "posmint/Account", + "value": { + "address": "!validator-address", + "coins": [ + { + "amount": "0", + "denom": "upokt" + } + ], + "public_key": { + "type": "crypto/ed25519_public_key", + "value": "!validator-pubkey" + } + } + } + ], + "supply": [] + }, + "gov": { + "params": { + "acl": [ + { + "acl_key": "application/ApplicationStakeMinimum", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/AppUnstakingTime", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/BaseRelaysPerPOKT", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/MaxApplications", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/MaximumChains", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/ParticipationRateOn", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/StabilityAdjustment", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "auth/MaxMemoCharacters", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "auth/TxSigLimit", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "gov/acl", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "gov/daoOwner", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "gov/upgrade", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/ClaimExpiration", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "auth/FeeMultipliers", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/ReplayAttackBurnMultiplier", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/ProposerPercentage", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/ClaimSubmissionWindow", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/MinimumNumberOfProofs", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/SessionNodeCount", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/SupportedBlockchains", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/BlocksPerSession", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/DAOAllocation", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/DowntimeJailDuration", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaxEvidenceAge", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaximumChains", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaxJailedBlocks", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaxValidators", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MinSignedPerWindow", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/RelaysToTokensMultiplier", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/SignedBlocksWindow", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/SlashFractionDoubleSign", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/SlashFractionDowntime", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/StakeDenom", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/StakeMinimum", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/UnstakingTime", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + } + ], + "dao_owner": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4", + "upgrade": { + "Height": "0", + "Version": "0" + } + }, + "DAO_Tokens": "50000000000000" + }, + "pos": { + "params": { + "relays_to_tokens_multiplier": "10000", + "unstaking_time": "1814000000000000", + "max_validators": "5000", + "stake_denom": "upokt", + "stake_minimum": "15000000000", + "session_block_frequency": "4", + "dao_allocation": "10", + "proposer_allocation": "1", + "maximum_chains": "15", + "max_jailed_blocks": "37960", + "max_evidence_age": "120000000000", + "signed_blocks_window": "10", + "min_signed_per_window": "0.60", + "downtime_jail_duration": "3600000000000", + "slash_fraction_double_sign": "0.05", + "slash_fraction_downtime": "0.000001" + }, + "prevState_total_power": "0", + "prevState_validator_powers": null, + "validators": [ + { + "address": "!validator-address", + "public_key": "!validator-pubkey", + "jailed": false, + "status": 2, + "tokens": "5000000000000", + "service_url": "!validator-url", + "chains": [ + "0001", + "0021" + ], + "unstaking_time": "2021-05-15T00:00:00Z" + } + ], + "exported": false, + "signing_infos": {}, + "missed_blocks": {}, + "previous_proposer": "" + }, + "pocketcore": { + "params": { + "session_node_count": "5", + "proof_waiting_period": "3", + "supported_blockchains": [ + "0001", + "0021" + ], + "claim_expiration": "120", + "replay_attack_burn_multiplier": "3", + "minimum_number_of_proofs": "10" + }, + "receipts": null, + "claims": null + } + } +} \ No newline at end of file diff --git a/app/data/container-build/cerc-pocket/build.sh b/app/data/container-build/cerc-pocket/build.sh new file mode 100755 index 00000000..1f59a8f0 --- /dev/null +++ b/app/data/container-build/cerc-pocket/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/pocket +docker build -t cerc/pocket:local ${CERC_REPO_BASE_DIR}/pocket-core-deployments/docker diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 0caea48a..0fe2be5c 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -36,3 +36,4 @@ cerc/optimism-l2geth cerc/optimism-op-batcher cerc/optimism-op-node cerc/optimism-op-proposer +cerc/pocket diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index f24c9ed0..a3ae8f44 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -24,3 +24,4 @@ tx-spammer kubo foundry fixturenet-optimism +fixturenet-pocket diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 0d808d68..438b9bbb 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -27,3 +27,5 @@ lirewine/sdk telackey/act_runner ethereum-optimism/op-geth ethereum-optimism/optimism +pokt-network/pocket-core +pokt-network/pocket-core-deployments diff --git a/app/data/stacks/fixturenet-pocket/README.md b/app/data/stacks/fixturenet-pocket/README.md new file mode 100644 index 00000000..b29520c8 --- /dev/null +++ b/app/data/stacks/fixturenet-pocket/README.md @@ -0,0 +1,59 @@ +# Pocket Fixturenet + +Instructions for deploying a local single-node Pocket chain alongside a geth + lighthouse blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator. + +## 1. Build Laconic Stack Orchestrator +Build this fork of Laconic Stack Orchestrator which includes the fixturenet-pocket stack: +``` +$ scripts/build_shiv_package.sh +$ cd package +$ mv laconic-so-{version} /usr/local/bin/laconic-so # Or move laconic-so to ~/bin or your favorite on-path directory +``` + +## 2. Clone required repositories +``` +$ laconic-so --stack fixturenet-pocket setup-repositories +``` +## 3. Build the stack's containers +``` +$ laconic-so --stack fixturenet-pocket build-containers +``` +## 4. Deploy the stack +``` +$ laconic-so --stack fixturenet-pocket deploy up +``` +It may take up to 10 minutes for the Eth Fixturenet to fully come online and start producing blocks. +## 5. Check status +**Eth Fixturenet:** +``` +$ laconic-so --stack fixturenet-pocket deploy exec fixturenet-eth-bootnode-lighthouse /scripts/status-internal.sh +Waiting for geth to generate DAG.... done +Waiting for beacon phase0.... done +Waiting for beacon altair.... done +Waiting for beacon bellatrix pre-merge.... done +Waiting for beacon bellatrix merge.... done +``` +**Pocket node:** +``` +$ laconic-so --stack fixturenet-pocket deploy exec pocket "pocket query height" +2023/04/20 08:07:46 Initializing Pocket Datadir +2023/04/20 08:07:46 datadir = /home/app/.pocket +http://localhost:8081/v1/query/height +{ + "height": 4 +} +``` +or +``` +$ laconic-so --stack fixturenet-pocket deploy logs pocket +``` +## 6. Send a relay request to Pocket node +The Pocket node serves relay requests at `http://localhost:8081/v1/client/sim` +**Example request:** +``` +$ curl -X POST --data '{"relay_network_id":"0021","payload":{"data":"{\"jsonrpc\": \"2.0\",\"id\": 1,\"method\": \"eth_blockNumber\",\"params\": []}","method":"POST","path":"","headers":{}}}' http://localhost:8081/v1/client/sim +``` +**Response:** +``` +"{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0x6fe\"}\n" +``` diff --git a/app/data/stacks/fixturenet-pocket/stack.yml b/app/data/stacks/fixturenet-pocket/stack.yml new file mode 100644 index 00000000..c5491f9a --- /dev/null +++ b/app/data/stacks/fixturenet-pocket/stack.yml @@ -0,0 +1,16 @@ +version: "1.0" +name: fixturenet-pocket +description: "A single node pocket chain that can serve relays from the geth-1 node in eth-fixturenet" +repos: + - cerc-io/go-ethereum + - pokt-network/pocket-core + - pokt-network/pocket-core-deployments # contains the dockerfile +containers: + - cerc/go-ethereum + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse + - cerc/pocket +pods: + - fixturenet-pocket + - fixturenet-eth