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..bfa549ca --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-pocket.yml @@ -0,0 +1,15 @@ +version: "3.2" +services: + pocket: + restart: unless-stopped + image: cerc/pocket:local + command: ["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:/root/pocket-configs/chains.json + - ../config/fixturenet-pocket/genesis.json:/root/pocket-configs/genesis.json + # TODO: determine which of the ports below is really needed + ports: + - "8081" + - "26657" diff --git a/app/data/config/fixturenet-pocket/chains.json b/app/data/config/fixturenet-pocket/chains.json new file mode 100755 index 00000000..b3e5ae91 --- /dev/null +++ b/app/data/config/fixturenet-pocket/chains.json @@ -0,0 +1,10 @@ +[ + { + "id": "0001", + "url": "http://127.0.0.1:8081/", + "basic_auth": { + "username": "", + "password": "" + } + } +] \ No newline at end of file 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..46c26006 --- /dev/null +++ b/app/data/config/fixturenet-pocket/create-fixturenet.sh @@ -0,0 +1,58 @@ +#!/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 + +# validate dependencies are installed +command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } + +# 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..23b73d6b --- /dev/null +++ b/app/data/config/fixturenet-pocket/genesis.json @@ -0,0 +1,271 @@ +{ + "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" + ], + "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..431e750c --- /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 diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index d7e427f4..1fee9248 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -35,3 +35,4 @@ cerc/optimism-l2geth cerc/optimism-op-batcher cerc/optimism-op-node cerc/gaia +cerc/pocket diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 5aecf17a..3ab34776 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -25,3 +25,4 @@ kubo foundry fixturenet-optimism fixturenet-gaia +fixturenet-pocket diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index ffeefbf4..0fa14888 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -29,3 +29,4 @@ telackey/act_runner ethereum-optimism/op-geth ethereum-optimism/optimism vknowable/gaia +vknowable/pocket-core diff --git a/app/data/stacks/fixturenet-pocket/README.md b/app/data/stacks/fixturenet-pocket/README.md new file mode 100644 index 00000000..77a017a2 --- /dev/null +++ b/app/data/stacks/fixturenet-pocket/README.md @@ -0,0 +1,48 @@ +# Laconicd Fixturenet + +Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator. + +## 1. Install Laconic Stack Orchestrator +Installation is covered in detail [here](https://github.com/cerc-io/stack-orchestrator#user-mode) but if you're on Linux and already have docker installed it should be as simple as: +``` +$ mkdir my-working-dir +$ cd my-working-dir +$ curl -L -o ./laconic-so https://github.com/cerc-io/stack-orchestrator/releases/latest/download/laconic-so +$ chmod +x ./laconic-so +$ export PATH=$PATH:$(pwd) # Or move laconic-so to ~/bin or your favorite on-path directory +``` +## 2. Prepare the local build environment +Note that this step needs only to be done once on a new machine. +Detailed instructions can be found [here](../build-support/README.md). For the impatient run these commands: +``` +$ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil +$ laconic-so --stack package-registry setup-repositories +$ laconic-so --stack package-registry deploy-system up +``` +Then add the localhost alias `gitea.local` and set `CERC_NPM_AUTH_TOKEN` to the token printed when the package-registry stack was deployed above: +``` +$ sudo vi /etc/hosts +$ export CERC_NPM_AUTH_TOKEN= +``` + +## 3. Clone required repositories +``` +$ laconic-so --stack fixturenet-laconicd setup-repositories +``` +## 4. Build the stack's packages and containers +``` +$ laconic-so --stack fixturenet-laconicd build-npms +$ laconic-so --stack fixturenet-laconicd build-containers +``` +## 5. Deploy the stack +``` +$ laconic-so --stack fixturenet-laconicd deploy up +``` +Correct operation should be verified by checking the laconicd container's logs with: +``` +$ laconic-so --stack fixturenet-laconicd deploy logs +``` +## 6. Test with the Registry CLI +``` +$ laconic-so --stack fixturenet-laconicd deploy exec cli "laconic cns status" +``` diff --git a/app/data/stacks/fixturenet-pocket/stack.yml b/app/data/stacks/fixturenet-pocket/stack.yml new file mode 100644 index 00000000..c75a36fa --- /dev/null +++ b/app/data/stacks/fixturenet-pocket/stack.yml @@ -0,0 +1,9 @@ +version: "1.0" +name: fixturenet-pocket +description: "A pocket fixturenet" +repos: + - vknowable/pocket-core +containers: + - cerc/pocket +pods: + - fixturenet-pocket