---
# System prepended metadata

title: Setup Blockchain

---

# Setup Blockchain

## Prerequisites

-    Install golang, version 1.13+
        -   For Ubuntu: [link](https://medium.com/better-programming/install-go-1-11-on-ubuntu-18-04-16-04-lts-8c098c503c5f). 
               *Change the version to latest  by editing go1.11.linux-amd64.tar.gz to go1.1x.x.linux-amd64.tar.gz*
        -   For Windows: [link](https://www.youtube.com/watch?v=f1rZ47Gj7x4)
        
        **Note:** In Windows, you need to install GCC also. Go to [this link](http://www.codebind.com/cprogramming/install-mingw-windows-10-gcc/).


-    Download persistenceSDK:
            `git clone -v https://github.com/persistenceOne/persistenceSDK.git`

- Go to persistenceSDK directory.
`cd persistenceSDK`

-    Switch to `version0.1` branch:
    `git checkout version0.1`
    
-    Install commit blockchain:
        -    Ubuntu: `make all`
        -    Windows: Run `make.bat`

-    Verify:
        -    In `terminal`/`cmd`, type `maind version` and `maincli version`, you should get a proper response


## Setting up genesis:

- Initialize Node
`maind init [moniker] --chain-id [chainID]`


    **Note:** 
    -    `moniker` will be the name of your node
    -    `chainID` is name of the chain you want to set up

-  Create genesis account
`maincli keys add [key_name]`

    **Note:** 
    -    Add flag `--recover` in the above to give mnemonic manually.
    -    `[key_name]` is the username of the account
    
- Add tokens to the genesis account
`maind add-genesis-account [genesis_account_key_name] [coins_to_account]`

    **Note:** `[coins]` in the format: `10000000000000000000ucommit`

## Setting up Validator node:

- Initialize Node
`maind init [moniker]`

- Replace your `genesis.json` file in `.maind/config/` directory with the one from the genesis node
    - In Windows, `.maind` folder is in `C:`
    - In Ubuntu, it's located in `home` directory as a hidden folder

-  Create your account
`maincli keys add [key_name]`

- **To become validator at genesis:**
    
    - Add tokens to your account:
     `maind add-genesis-account [genesis_account_key_name] [coins_to_account]`
    
    - Create your genesis transaction (this is staking):
        `maind gentx --name [key_name] --amount [coins_to_stake]`
    
    - Collect your genesis transaction:
        `maind collect-gentxs`
        
    - Send the contents of `.maind/config/gentx/gentx-[node_id].json` file and `[coins_to_account]` amount to genesis.

    - Genesis needs to add the gensis transaction received from the node to its `genesis.json` file in `gentxs` field and also create an account for the validator node in the field `accounts` in the same format given there for genesis's own account. Change the amount of coins for the validator accounts as per `[coins_to_account]` amount received.

    - The genesis then needs to send the it's updated `genesis.json` to all the validators who are being created at genesis. And the validators needs to update their `genesis.json` with the new file.
       
- **To become validator during runtime:**

    - Give values of node id and it's ip_address:port you want to connect to in the format `node_id@ip_address:port`  in `seeds` or `persistent_peers` in `.maind/config/config.toml`
    
    - Start the chain `maind start`
    
    - Get some coins in your account
    
    - Stake your coins:
    `maincli tx staking create-validator --from [key_name] --min-self-delegation 1 --commission-max-change-rate 0.1 --commission-max-rate 0.1 --commission-rate 0.1 --moniker [moniker_name] --amount [coins_to_stake] --pubkey [validator_consensus_pubkey] --chain-id [chainID]`
    
        **Note:** `validator_consensus_pubkey` can be found by command:
        `maind tendermint show-validator`
        
        **Note:** For any other details or help type:
        `maincli tx staking create-validator -h`
        
         
- The validator then needs to add `node_id@ip_address:port`  in `seeds` or `persistent_peers` in `.maind/config/config.toml` of genesis and all the other nodes (of any kind) it wants to connect to.
    - Example: 
        `seeds = "50f3fb09270bfaabcdb6e802279e24d3342b9794@172.31.30.160:26656, 8abfe552a9f210584f2096a8bfe34e812079f653@172.31.24.22:26656, c7fd3c3775a07ce0b235ee27d805da3f98c1b3db@172.31.27.25:26656"`
    
    **Note:** Ifyou add only `persistent_peers`, blockchain will never start until it has set up connections with at least one of the persistent peers.
    
    **Note:** `nodeID` can found by `maind tendermint show-node-id`
        
- Start the chain
`maind start`

- Start the light client
`maincli rest-server --chain-id=[chain_name] --node=tcp://0.0.0.0:26657 --laddr=tcp://0.0.0.0:31118`

    **Note:** Change `31118` to run light client on any other port.
        
-  **To Edit Validator:**
    `maincli tx staking edit-validator --from [validator_key_name] --identity="[identity_Signature]" --moniker="[validator_moniker_name]" --details="[details]" --website="[URL]" --chain-id [chain_name]`
    
## Setting up Sync node:

- Initialize Node
`maind init [moniker]`

- Replace your `genesis.json` file in `.maind/config/` directory with the one from the genesis node
  
- Give values of node id and it's ip_address:port you want to connect to in the format `node_id@ip_address:port`  in `seeds` or `persistent_peers` in `.maind/config/config.toml`
    
- Start the chain
`maind start`

- Start the light client
`maincli rest-server --chain-id=[chain_name] --node=tcp://0.0.0.0:26657 --laddr=tcp://0.0.0.0:31118`

    **Note:** Change `31118` to run light client on any other port.
    
## Setting up Sentry Nodes:

-    Setup your validator node with following configurations:
        -    `pex:	false`
        -    `persistent_peers: 	list of sentry nodes`
        -    `private_peer_ids:	    omitted`
        -    `addr_book_strict: 	false`

-    Setup a sync node and configure it to the following to make it a sentry node:
        -    `pex:	true`
        -    `persistent_peers: 	validator node, optionally other sentry nodes`
        -    `private_peer_ids: 	validator node id`
        -    `addr_book_strict: 	false`

        **Note:** To change configuration, edit your `config.toml` file.
        
## Unjailing:

`maincli tx slashing unjail --from [key or address] --chain-id [chainID]`

## Staking:

-    Delegate Coins:
        -    `/staking/delegators/commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz/delegations`
```
{
    "base_req": {       
        "from":"commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz",
        "chain_id":"crust-2"
    },
    "delegator_address": "commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz",
    "validator_address":"commitvaloper1jqusu33shmadmgegs0rxqug24pc72079p4clfe",
    "amount": {
        "denom": "ucommit",
        "amount": "1000"
    },
    "password": "1234567890",
    "mode": "block"
}
```

-    Undelegate Coins:
        -    `/staking/delegators/commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz/unbonding_delegations`
        
```
{
    "base_req": {       
        "from":"commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz",
        "chain_id":"crust-2"
    },
    "delegator_address": "commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz",
    "validator_address":"commitvaloper1jqusu33shmadmgegs0rxqug24pc72079p4clfe",
    "amount": {
        "denom": "ucommit",
        "amount": "1000"
    },
    "password": "1234567890",
    "mode": "block"
}
```

-    Redelgate Coins:
        -    `/staking/delegators/commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz/redelegations`

```
{
    "base_req": {       
        "from":"commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz",
        "chain_id":"crust-2"
    },
    "delegator_address": "commit1jqusu33shmadmgegs0rxqug24pc72079x5sypz",
    "validator_src_address":"commitvaloper1jqusu33shmadmgegs0rxqug24pc72079p4clfe",
    "validator_dst_address":"commitvaloper1jqusu33shmadmgegs0rxqug24pc72079p4clfe",
    "amount": {
        "denom": "ucommit",
        "amount": "1000"
    },
    "password": "1234567890",
    "mode": "block"
}
```
