diff --git a/README.md b/README.md index b3f38d0..cfa189d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,94 @@ # Deploy a Testnet -## Starting Gaiad +## Setup + +If you're running a full node validator we recommend you to comply with the necessary [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements). You can check more information regarding validators in our [website](https://cosmos.network/validators) or in the [validator FAQ](https://cosmos.network/resources/validator-faq). + +### Install the SDK on a Cloud Server + +You can set up a cloud server of your choice to run a non-validator full node. + +#### Digital Ocean Droplet + +Follow these commands to install the SDK on a Digital Ocean [Droplet](https://www.digitalocean.com/products/droplets/): + +``` +export PATH=$PATH:/usr/lib/go-1.10/bin +export PATH=$PATH:/root/go/bin +bash <(curl -s https://gist.github.com/melekes/1bd57c73646de97c8f6cbe1b780eb822/raw/2447b0fbf95775852c93a91ed3e12631c7ceb648/install.sh) +nohup ./build/gaiad start & +``` + +### Software Setup (Manual Installation) + + +#### Install [GNU Wget](https://www.gnu.org/software/wget/) + +**MacOS** + +``` +brew install wget +``` + +**Linux** + +``` +sudo apt-get install wget +``` + +Note: You can check other available options for downloading `wget` [here](https://www.gnu.org/software/wget/faq.html#download). + +#### Install binaries + +Cosmos SDK can be installed to `$GOPATH/src/github.com/cosmos/cosmos-sdk` like a normal Go program: + +``` +go get github.com/cosmos/cosmos-sdk +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +git fetch --all +git checkout 0f2aa6b +make get_tools // run $ make update_tools if already installed +make get_vendor_deps +make install +``` + +This will install `gaiad` and `gaiacli` and four example binaries: `basecoind`, `basecli`, `democoind`, and `democli`. Verify that everything is OK by running: + +``` +gaiad version +gaiacli version +``` + +You should see in both cases: + +``` +0.15.0-rc0-0f2aa6b +``` + +### Genesis Setup + +Now that we have completed the basic SDK setup, we can start working on the genesis configuration for the chain we want to connect to. Initiliaze `gaiad` : + +``` +gaiad init +``` + +You can find the corresponding genesis files [here](https://github.com/cosmos/testnets). Then replace the `genesis.json` and `config.toml` files: + +``` +wget -O $HOME/.gaiad/config/genesis.json https://raw.githubusercontent.com/cosmos/testnet/master/gaia-4000/genesis.json + +wget -O $HOME/.gaiad/config/config.toml https://raw.githubusercontent.com/cosmos/testnet/master/gaia-4000/config.toml +``` + +Lastly change the `moniker` string in the `config.toml` to identify your node. + +``` +# A custom human readable name for this node +moniker = "" +``` + +## Running a Full Node Start the full node: @@ -14,48 +102,57 @@ Check the everything is running smoothly: gaiacli status ``` -## Generate keys +### Generate keys You'll need a private and public key pair \(a.k.a. `sk, pk` respectively\) to be able to receive funds, send txs, bond tx, etc. -To generate your a new key \(default _ed25519 _elliptic curve\): +To generate your a new key \(default _ed25519_ elliptic curve\): ``` KEYNAME= gaiacli keys add $KEYNAME ``` -Next, you will have to enter a passphrase for your`$KEYNAME`key twice. Save the _seed phrase _in a safe place in case you forget the password. +Next, you will have to enter a passphrase for your `$KEYNAME` key twice. Save the _seed_ _phrase_ in a safe place in case you forget the password. -Now if you check your private keys you will see the `$KEYNAME `key among them: +Now if you check your private keys you will see the `$KEYNAME` key among them with the value of your `address`: ``` gaiacli keys show $KEYNAME ``` -You can see your other available keys by typing: +You can see all your other available keys by typing: ``` gaiacli keys list ``` -Save your address and pubkey into a variable +Now get your public key by typing: + +``` +gaiad show_validator +``` + +You'll get the `value` of your `pk` in `base64` format and the `type` of it +To convert your `pk` to `hex` go to this [website](https://cryptii.com/base64-to-hex) and paste the value of the public key in the left box. On the right, select `Group By: None` to covert it. + +Finally, save your address and pubkey into a variable ``` MYADDR= MYPUBKEY= ``` -_IMPORTANT: We strongly recommend to **NOT** use the same passphrase for your different keys. The Tendermint team and the Interchain Foundation will not be responsible for the lost of funds._ +**IMPORTANT:** We strongly recommend to **NOT** use the same passphrase for your different keys. The Tendermint team and the Interchain Foundation will not be responsible for the lost of funds. -## Getting Coins +### Getting coins Go to the faucet in [http://atomexplorer.com/](http://atomexplorer.com/) and claim some coins for your testnet by typing the address of your key, as printed out above. -## Send tokens +### Send tokens ``` -gaiacli send --from=$MYADDR --amount=1000fermion --chain-id= --sequence=1 --name=$KEYNAME --to= +gaiacli --amount=1000fermion --chain-id= --sequence=1 --name=$KEYNAME --to= ``` The `--amount` flag defines the corresponding amount of the coin in the format `--amount=` @@ -85,67 +182,42 @@ gaiacli send --from=$MYADDR --amount=1000fermion --fee=1fermion --chain-id= --chain= --sequence=1 --name=$KEYNAME --to= +gaiacli transfer --amount=20fermion --chain-id= --chain= --sequence=1 --name=$KEYNAME --to= ``` -## Staking: Add a Validator +## Become a Validator -Get your public key by typing: - -``` -gaiad show_validator -``` - -The returned value is your validator address in hex. This can be used to create a new validator candidate by staking some tokens: - -``` -gaiacli declare-candidacy --amount=500fermions --pubkey=$PUBKEY --address-candidate=$MYADDR --moniker=satoshi --chain-id= --sequence=1 --name=$KEYNAME -``` - -You can add more information of the validator candidate such as`--website`, `--keybase-sig `or additional`--details`. If you want to edit the candidate info: - -``` -gaiacli edit-candidacy --details="To the cosmos !" --website="https://cosmos.network" -``` - -Finally, you can check all the candidate information by typing: - -``` -gaiacli candidate --address-candidate=$MYADDR --chain-id= -``` +You can become a validator candidate by staking some tokens: To check that the validator is active you can find it on the validator set list: ``` -basecli validatorset +gaiacli validatorset ``` -\*_Note: Remember that to be in the validator set you need to have more total power than the Xnd validator, where X is the assigned size for the validator set \(by default _`X = 100`_\). _ +**Note:** Remember that to be in the validator set you need to have more total power than the Xnd validator, where X is the assigned size for the validator set \(by default _`X = 100`_\). #### Delegating: Bonding and unbonding to a validator You can delegate \(i.e. bind\) **Atoms** to a validator to obtain a part of its fee revenue in exchange \(the fee token in the Cosmos Hub are **Photons**\). ``` -gaiacli delegate --amount=10fermion --address-delegator=$MYADDR --address-candidate= --shares=MAX --name=$KEYNAME --chain-id= --sequence=1 +gaiacli bond --stake=10fermion --validator= --name=$KEYNAME --chain-id= --sequence=1 ``` If for any reason the validator misbehaves or you just want to unbond a certain amount of the bonded tokens: ``` -gaiacli unbond --address-delegator=$MYADDR --address-candidate= --shares=MAX --name=$KEYNAME --chain-id= --sequence=1 +gaiacli unbond --name=$KEYNAME --chain-id= --sequence=1 ``` -You can unbond a specific amount of`shares`\(eg:`12.1`\) or all of them \(`MAX`\). - -You should now see the unbonded tokens reflected in your balance and in your delegator bond : +You should now see the unbonded tokens reflected in your balance: ``` gaiacli account $MYADDR -gaiacli delegator-bond --address-delegator=$MYADDR --address-candidate= --chain-id= ``` #### Relaying diff --git a/gaia-4000/config.toml b/gaia-4000/config.toml new file mode 100644 index 0000000..3f98939 --- /dev/null +++ b/gaia-4000/config.toml @@ -0,0 +1,170 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +##### main base config options ##### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the Tendermint binary +proxy_app = "tcp://127.0.0.1:46658" + +# A custom human readable name for this node +moniker = "XXX" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: leveldb | memdb +db_backend = "leveldb" + +# Database directory +db_path = "data" + +# Output level for logging, including package level options +log_level = "main:info,state:info,*:error" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_file = "config/priv_validator.json" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# TCP or UNIX socket address for the profiling server to listen on +prof_laddr = "" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + +##### advanced configuration options ##### + +##### rpc server configuration options ##### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://0.0.0.0:46657" + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +##### peer to peer configuration options ##### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:46656" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +# Do not add private peers to this list if you don't want them advertised +persistent_peers = "2871265b0b659a75539342577e4d7b301a21c6ec@67.207.71.85:46656,242048f0f71f2a60881913c2e8f8cf4144e0f175@159.65.211.28:46656" + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +addr_book_strict = true + +# Time to wait before flushing messages out on the connection, in ms +flush_throttle_timeout = 100 + +# Maximum number of peers to connect to +max_num_peers = 50 + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 512000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 512000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Authenticated encryption +auth_enc = true + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +##### mempool configuration options ##### +[mempool] + +recheck = true +recheck_empty = true +broadcast = true +wal_dir = "data/mempool.wal" + +##### consensus configuration options ##### +[consensus] + +wal_file = "data/cs.wal/wal" +wal_light = false + +# All timeouts are in milliseconds +timeout_propose = 3000 +timeout_propose_delta = 500 +timeout_prevote = 1000 +timeout_prevote_delta = 500 +timeout_precommit = 1000 +timeout_precommit_delta = 500 +timeout_commit = 1000 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# BlockSize +max_block_size_txs = 10000 +max_block_size_bytes = 1 + +# EmptyBlocks mode and possible interval between empty blocks in seconds +create_empty_blocks = true +create_empty_blocks_interval = 0 + +# Reactor sleep duration parameters are in milliseconds +peer_gossip_sleep_duration = 100 +peer_query_maj23_sleep_duration = 2000 + +##### transactions indexer configuration options ##### +[tx_index] + +# What indexer to use for transactions +# +# Options: +# 1) "null" (default) +# 2) "kv" - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +indexer = "kv" + +# Comma-separated list of tags to index (by default the only tag is tx hash) +# +# It's recommended to index only a subset of tags due to possible memory +# bloat. This is, of course, depends on the indexer's DB and the volume of +# transactions. +index_tags = "" + +# When set to true, tells indexer to index all tags. Note this may be not +# desirable (see the comment above). IndexTags has a precedence over +# IndexAllTags (i.e. when given both, IndexTags will be indexed). +index_all_tags = false diff --git a/gaia-4000/genesis.json b/gaia-4000/genesis.json new file mode 100644 index 0000000..8024101 --- /dev/null +++ b/gaia-4000/genesis.json @@ -0,0 +1,148 @@ +{ + "genesis_time": "0001-01-01T00:00:00Z", + "chain_id": "gaia-4000", + "validators": [ + { + "pub_key": { + "type": "AC26791624DE60", + "value": "xVpJhOmDiGte+gMqJybHd8B4GDn1lcoA2oanzFhWybI=" + }, + "power": 1000, + "name": "adrian-67" + }, + { + "pub_key": { + "type": "AC26791624DE60", + "value": "aKHNZKaGKoYJysWthvRGwUslEhNr5F5s/RpttUNh5EU=" + }, + "power": 1000, + "name": "adrian-159" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "FD8DA5F512A59A30F8698E3CA638D384A68DF977", + "coins": [ + { + "denom": "steak", + "amount": 1000000 + }, + { + "denom": "adriancoin", + "amount": 33333333 + }, + { + "denom": "photon", + "amount": 10000000000 + } + ] + }, + { + "address": "D86F1E517FC94401BF3AA5FC5667CCB05A2179DC", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "chriscoin", + "amount": 33333333 + } + ] + }, + { + "address": "BE537272ABBDB84E92908F40685FC04F3F83D036", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "mikecoin", + "amount": 100000 + } + ] + }, + { + "address": "ED25519CD750083D289A4859091A9B6EE43AF91D", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "nickcoin", + "amount": 33333333 + } + ] + }, + { + "address": "5D9C04412AE20040A0A1618B2A8724DAD9BB8700", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "bianjiecoin", + "amount": 33333333 + } + ] + }, + { + "address": "8363D802166CD0A0AEDFF44CF1F7A78CD3F94D6F", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "cybermonies", + "amount": 1337 + } + ] + }, + { + "address": "E1DDCCAAFFECDBEC074947E02F1DEE1CE8C8BA0D", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "linocoin", + "amount": 33333333 + } + ] + }, + { + "address": "94933F0B43263C24422A72D2AB2C2823D1D23662", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "nuevaxcoin", + "amount": 33333333 + } + ] + }, + { + "address": "C446B86801B1B67A46C6FABDE7FC7F448755D83F", + "coins": [ + { + "denom": "steak", + "amount": 100 + }, + { + "denom": "paulcoin", + "amount": 33333333 + } + ] + } + ] + } +} diff --git a/internal-1/adrian.json b/internal-1/adrian.json new file mode 100644 index 0000000..20a8829 --- /dev/null +++ b/internal-1/adrian.json @@ -0,0 +1,79 @@ +{"chain_id":"internal-1","node_id":"a2dd1751ddcc480710bb06bb3fd93cdb43a62d9f","ip":"94.130.9.167","app_state":{ + "accounts": [ + { + "address": "0809BCA4DA5C8E44C29FD222AD540842049F1AF6", + "coins": [ + { + "denom": "fermion", + "amount": 1000 + } + ] + } + ], + "stake": { + "pool": { + "total_supply": 100, + "bonded_shares": { + "num": 100, + "denom": 1 + }, + "unbonded_shares": { + "num": 0, + "denom": 1 + }, + "bonded_pool": 100, + "unbonded_pool": 0, + "inflation_last_time": 0, + "inflation": { + "num": 7, + "denom": 100 + } + }, + "params": { + "inflation_rate_change": { + "num": 13, + "denom": 100 + }, + "inflation_max": { + "num": 20, + "denom": 100 + }, + "inflation_min": { + "num": 7, + "denom": 100 + }, + "goal_bonded": { + "num": 67, + "denom": 100 + }, + "max_validators": 100, + "bond_denom": "fermion" + }, + "candidates": [ + { + "status": 1, + "owner": "0809BCA4DA5C8E44C29FD222AD540842049F1AF6", + "pub_key": { + "type": "AC26791624DE60", + "value": "F5qF1KbyNuCGcUEVNPHOirrQzMPc1j1HeQjnArVWhBU=" + }, + "assets": { + "num": 100, + "denom": 1 + }, + "liabilities": { + "num": 0, + "denom": 1 + }, + "description": { + "moniker": "adrian", + "identity": "", + "website": "", + "details": "" + }, + "validator_bond_height": 0, + "validator_bond_counter": 0 + } + ] + } +},"validators":[{"pub_key":{"type":"AC26791624DE60","value":"F5qF1KbyNuCGcUEVNPHOirrQzMPc1j1HeQjnArVWhBU="},"power":100,"name":""}]} \ No newline at end of file diff --git a/internal-1/rige.json b/internal-1/rige.json new file mode 100644 index 0000000..8f37c7e --- /dev/null +++ b/internal-1/rige.json @@ -0,0 +1,79 @@ +{"chain_id":"internal-1","node_id":"be19a7d6c3f8472ad0073b5dcfcbc39f7e0ec9b3","ip":"167.99.160.171","app_state":{ + "accounts": [ + { + "address": "90A9EF09EEB2A6658F9D5B4617727F2ED51FB59C", + "coins": [ + { + "denom": "fermion", + "amount": 1000 + } + ] + } + ], + "stake": { + "pool": { + "total_supply": 100, + "bonded_shares": { + "num": 100, + "denom": 1 + }, + "unbonded_shares": { + "num": 0, + "denom": 1 + }, + "bonded_pool": 100, + "unbonded_pool": 0, + "inflation_last_time": 0, + "inflation": { + "num": 7, + "denom": 100 + } + }, + "params": { + "inflation_rate_change": { + "num": 13, + "denom": 100 + }, + "inflation_max": { + "num": 20, + "denom": 100 + }, + "inflation_min": { + "num": 7, + "denom": 100 + }, + "goal_bonded": { + "num": 67, + "denom": 100 + }, + "max_validators": 100, + "bond_denom": "fermion" + }, + "candidates": [ + { + "status": 1, + "owner": "90A9EF09EEB2A6658F9D5B4617727F2ED51FB59C", + "pub_key": { + "type": "AC26791624DE60", + "value": "Y+FiWjkDJTIRg1v25LaojD0MCCp37yVNqy6eFgO3Q4U=" + }, + "assets": { + "num": 100, + "denom": 1 + }, + "liabilities": { + "num": 0, + "denom": 1 + }, + "description": { + "moniker": "rigel", + "identity": "", + "website": "", + "details": "" + }, + "validator_bond_height": 0, + "validator_bond_counter": 0 + } + ] + } +},"validators":[{"pub_key":{"type":"AC26791624DE60","value":"Y+FiWjkDJTIRg1v25LaojD0MCCp37yVNqy6eFgO3Q4U="},"power":100,"name":""}]} diff --git a/internal2/cwgoes.json b/internal2/cwgoes.json new file mode 100644 index 0000000..74cae88 --- /dev/null +++ b/internal2/cwgoes.json @@ -0,0 +1,20 @@ +{ + "node_id": "efeba710629d9a7ace99ffa3c0767fc0079b4dc7", + "ip": "158.69.63.13", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "DyC8LAqZFmXGkX+hJb0p3iu/oYphvx3JZqHz1VLJ/A0=" + }, + "power": 100, + "name": "" + }, + "app_gen_tx": { + "name": "cwgoes", + "address": "A425870C82ECC0943212A857D1C9D45E0C381C5F", + "pub_key": { + "type": "AC26791624DE60", + "value": "DyC8LAqZFmXGkX+hJb0p3iu/oYphvx3JZqHz1VLJ/A0=" + } + } +} diff --git a/internal2/rige.json b/internal2/rige.json new file mode 100644 index 0000000..f1ba803 --- /dev/null +++ b/internal2/rige.json @@ -0,0 +1,20 @@ +{ + "node_id": "03b977aaecb87315fb64d4925c3cd72305129f2a", + "ip": "138.197.161.235", + "validator": { + "pub_key": { + "type": "AC26791624DE60", + "value": "qwQyuWl3e6bx2S6lZpUA8cI/J0I4CrVZPLagFxrFAVc=" + }, + "power": 100, + "name": "" + }, + "app_gen_tx": { + "name": "rigel", + "address": "B2C472941BA3803E12CD0340047A25F2143AD13B", + "pub_key": { + "type": "AC26791624DE60", + "value": "qwQyuWl3e6bx2S6lZpUA8cI/J0I4CrVZPLagFxrFAVc=" + } + } + }