Vijay Verma
Dec 10, 2018 · 6 min read

While working on a project to write a Java Connector for EOS blockchain to:
- Create wallets
- Create accounts
- Create transactions
- Create signed transactions
- Transfer Tokens between accounts
I came across with basic steps we need to follow to setup and running local EOS node.

This small guide is purely to assist you to get your own EOS node up and running. Content and pictures are compilation of my reading and explanation for few days.

This guide is not to explain what blockchain is, this is specific to start using EOS as soon as possible and with less hassle. Purely based on experience.

EOS Blockchain Overview

EOSIO comes with a number of programs. The primary ones that you will use, and the ones that are covered here, are:

  • nodeos (node + eos = nodeos) — the core EOSIO node daemon that can be configured with plugins to run a node. Example uses are block production, dedicated API endpoints, and local development.
  • cleos (cli + eos = cleos) — command line interface to interact with the blockchain and to manage wallets
  • keosd (key + eos = keosd) — component that securely stores EOSIO keys in wallets.
  • eosio-cpp (Part of eosio.cdt) - it compiles C++ code to WASM and can generate ABIs ( CDT - contract development tools chain)

The basic relationship between these components is illustrated in the following diagram.

Basic Relationships between different components of EOS blockchain.

Latest Stack Version (as of today)
nodeos : 1.5.0
cleos : 1.5.0
keosd : 1.5.0
eosio.cdt : 1.4.1
eosio.contracts : 1.4.0

Installation of Local Node

There are couple of ways to do it:
1. Using Docker — Quick and easy
2. Using binaries — Its good too

Installation Using Docker

You create 2 containers. One for 'nodeos' and another for 'keosd'#Pull latest docker image of EOS
docker pull eosio/eos-dev
#Create local network
docker network create eosdev
#Start nodeos(Core Daemon)docker run --name nodeos -d -p 8888:8888 --network eosdev -v /tmp/eosio/work:/work \
-v /tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/config eosio/eos-dev \
/bin/bash -c "nodeos -e -p eosio --plugin eosio::producer_plugin \
--plugin eosio::history_plugin --plugin eosio::chain_api_plugin \
--plugin eosio::history_api_plugin --plugin eosio::http_plugin \
-d /mnt/dev/data --config-dir /mnt/dev/config --http-server-address=0.0.0.0:8888 \
--access-control-allow-origin=* --contracts-console --http-validate-host=false"
###### NOTES about above Command
- Creating a docker container running 'nodeos' daemon
- Exposing port 8888 so that you can access the 'nodeos' using RPC and HTTP
- Mounting few directories on your local machine so that you don't have to login into container
- Few plugins which will allow this node to become a producer, expose rpc api over http, exposing command line interface to run 'nodeos' commands
#Run keosd(Wallet and Keystore)
docker run -d --name keosd --network=eosdev -i eosio/eos-dev /bin/bash \
-c "keosd --http-server-address=0.0.0.0:9876"
#Check installation
docker logs --tail 10 nodeos
and you will see something like:info 2018-12-04T15:01:22.003 thread-0 producer_plugin.cpp:1494 produce_block ] Produced block 00005ce7fabcbcf8... #23783 @ 2018-12-04T15:01:22.000 signed by eosio [trxs: 0, lib: 23782, confirmed: 0]
info 2018-12-04T15:01:22.507 thread-0 producer_plugin.cpp:1494 produce_block ] Produced block 00005ce84867bcbf... #23784 @ 2018-12-04T15:01:22.500 signed by eosio [trxs: 0, lib: 23783, confirmed: 0]
info 2018-12-04T15:01:23.005 thread-0 producer_plugin.cpp:1494 produce_block ] Produced block 00005ce936ca4869... #23785 @ 2018-12-04T15:01:23.000 signed by eosio [trxs: 0, lib: 23784, confirmed: 0]
i
#Check Wallets (Open bash for keosd)
docker exec -it keosd bash
and once in the container, on bash, execute this:cleos --wallet-url http://127.0.0.1:9876 wallet list keys

Should show empty wallets:
Wallets: []
#Check 'nodeos' end points - run this out side containers
curl http://localhost:8888/v1/chain/get_info

{
"server_version":"549c96cd",
"chain_id":"cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
"head_block_num":24182,
"last_irreversible_block_num":24181,
"last_irreversible_block_id":"00005e751a1e31b15acd25ffc8725cb2c67926647edb89e726e386716afdef5d",
"head_block_id":"00005e76fd035dbf694d2a575bb1849f436428b466fd95323e43619b73bf7b9d",
"head_block_time":"2018-12-04T15:04:41.500",
"head_block_producer":"eosio",
"virtual_block_cpu_limit":200000000,
"virtual_block_net_limit":1048576000,
"block_cpu_limit":199900,
"block_net_limit":1048576,
"server_version_string":"v1.5.0-rc2"
}
#Alias cleos so that you can access it by simply 'cleos'
docker network inspect eosdev

check for keosd IP address in the response of above command and execute the following:

alias cleos='docker exec -it nodeos /opt/eosio/bin/cleos --url http://127.0.0.1:8888 --wallet-url http://172.18.0.3:9876'

Installation Using Binaries — Instructions for MAC

#Step 1: Install binaries
brew tap eosio/eosio
brew install eosio
#Step 2: Setup a development directory, stick to it.
mkdir contracts
cd contracts
#Step 3: Install CDT. The EOSIO Contract Development Toolkit, CDT for short
brew tap eosio/eosio.cdt
brew install eosio.cdt
#Boot Node and Wallet
#Start keosd:
keosd &
#Start nodeos:
nodeos -e -p eosio \
--plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin \
-d /Users/vijay/eos_blockchain/contracts/eosio/data \
--config-dir /Users/vijay/eos_blockchain/contracts/eosio/config \
'--access-control-allow-origin=*' --contracts-console
--http-validate-host=false '--filter-on=*' >> nodeos.log 2>&1 &
#Check installation (in current directory)
tail -f nodeos.log
#Check the wallet
cleos wallet list
#Check nodeos endpoints
curl http://localhost:8888/v1/chain/get_info

One of the above steps will help you setup and run a local node.

Working with Wallets, Accounts and Keys

Now are you are ready to do some stuff on blockchain. In EOS, you would have to have an account to do anything i.e. creating token, sending tokens, receiving tokens, writing transactions etc. This node would have a system user called “eosio” so you can use this user to play with the chain.

So in this section we will do these operations on our local node:

- Create a new wallet
- Create new keys (private + public)
- Import those keys to the wallet
- Create new account

Lets run some commands and observe what you see. Just read the notes with all the command to understand what they do.

#List existing wallets. Wallet stores keys
cleos wallet list
#List wallet keys if any
cleos wallet list key
#you should see all empty response
#create wallet now

cleos wallet create
Creating wallet: default
"PW5JYR5u7WTk6RaJARE41qb3Wy6BJtcKCjpDAyjR2uV3CWF8nDFe7"
this will create wallet with name 'default'. Keep note of password it returns.#Create new keys
cleos create key --to-console
Private key: 5JseP8pEsJfAEWix5U6ow77TrKu2uuBhjfobyzgYyCYAtnxnCk8
Public key: EOS4tmc8ufENZNkFQaj8ZfV9UfeRLnyaCecybSgPS1U8671BNdSxD
#Import the private keys in wallet
cleos wallet import -n quant --private-key 5JseP8pEsJfAEWix5U6ow77TrKu2uuBhjfobyzgYyCYAtnxnCk8
#### MOST IMPORTANT STEP ####
Import genesis 'eosio' account keys in the wallet so that eosio account is available for creating new accounts.
Private key of eosio: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

At this stage, you are ready with wallet with eosio (genesis account) and new keys imported. So we are ready to do few more operations now.

We would do the following in next section:
- Deploy Token contract so that blockchain is ready to create new Tokens
- Create new Token
- Assign new Tokens to genesis account (eosio)
- Transfer Token between users
- Check balance etc

#Deploy Token Contacts

create an account first with the name 'eosio.token' for the contract
cleos create account <owner> <newaccountname> <pubkey1> <pubkey2>
cleos create account eosio eosio.token EOS5ySgzeHp9G7TqNDGpyzaCtahAeRcTvPRPJbFey5CmySL3vKYgE EOS5ySgzeHp9G7TqNDGpyzaCtahAeRcTvPRPJbFey5CmySL3vKYgEyou would see something like this:executed transaction: 4a8b53ae6fa5e22ded33b50079e45550e39f3cb72ffa628e771ea21758844039 200 bytes 339 us # eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.token","owner":{"threshold":1,"keys":[{"key":"EOS5ySgzeHp9G7TqNDGpy...Deploy contract now:
cleos set contract eosio.token <path-to-contracts-directory>/contracts/eosio.token -p eosio.token
you would see something like this:Reading WAST/WASM from /opt/eosio/bin/data-dir/contracts/eosio.token/eosio.token.wasm... Using already assembled WASM... Publishing contract... executed transaction: 41677b5fd5c701ca67a153abb09f79c04085cc51a9d021436e7ee5afda1781bd 8048 bytes 1212 us # eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d01000000017f1560037f7e7f0060057f7e... # eosio <= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65...#Create new Token
cleos push action eosio.token create '["eosio", "10000000000.0000 EOS",0,0,0]' -p eosio.token
you would see like this:executed transaction: 566693cba0b0d5d11d85e40cdfb095d525612c5915e17ce75d309054e1912235 120 bytes 552 us # eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 EOS"}#Send newly created Tokens (EOS) to genesis account (eosio)
cleos push action eosio.token issue '["eosio","1000000000.0000 EOS", "issue"]' -p eosio
you would see something like this:executed transaction: 73f72879d220c720fcefb16b6aaf3db0ba492bd62020853b2cd5051557d5fa87 128 bytes 677 us # eosio.token <= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 EOS","memo":"issue"}#Check above transactions if they are completed
cleos get transaction 73f72879d220c720fcefb16b6aaf3db0ba492bd62020853b2cd5051557d5fa87
andcleos get transaction 566693cba0b0d5d11d85e40cdfb095d525612c5915e17ce75d309054e1912235you should have long JSON response. It simply means above steps are successful.#Check balance now of eosio account
cleos get currency balance eosio.token eosio
you would see:1000000000.0000 EOS

Here you go, Now you have token created, eosio account has lot of EOS tokens with him and he can now easily send funds to other accounts.

#Create a new account
cleos create account eosio user1 <public_key_of_user1> <public_key_of_user1>
#Check if account is created. You should have json response
cleos get account user1
#Send money to user1 account
cleos transfer eosio user1 "1000.00 EOS"
#Check the balance of user1
cleos get currency balance eosio.token vijay1

Thats it!

Vijay Verma

Written by

Blockchain technologists, Platform lead @ Quant Network(quant.network).

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade