Introduction to multichain blockchain and how to create multichain blockchain on Ubuntu

Sourabhh Sethii
DXSYS
Published in
8 min readJun 30, 2018

Step 1:- Buy two Ubuntu LT 14.04 machine on Google cloud platform

Step 2:- Install Multichain on GNU/Linux 4.4.0–128-generic x86_64.

Instance 1

sourabhsethi8888@mutichain-instance-1:~$ sudo su
root@mutichain-instance-1:/home/sourabhsethi8888# mkdir tmp
root@mutichain-instance-1:/home/sourabhsethi8888# cd tmp
root@mutichain-instance-1:/home/sourabhsethi8888/tmp# cd /home/ubuntu/
root@mutichain-instance-1:/home/ubuntu# cd /home/ubuntu/
root@mutichain-instance-1:/home/ubuntu# cd tmp
bash: cd: tmp: No such file or directory
root@mutichain-instance-1:/home/ubuntu# mkdir tmp
root@mutichain-instance-1:/home/ubuntu# cd tmp
root@mutichain-instance-1:/home/ubuntu/tmp# wget http://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz
--2018-06-30 19:39:23-- http://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz
Resolving www.multichain.com (www.multichain.com)... 162.243.214.85
Connecting to www.multichain.com (www.multichain.com)|162.243.214.85|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz [following]
--2018-06-30 19:39:23-- https://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz
Connecting to www.multichain.com (www.multichain.com)|162.243.214.85|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5875759 (5.6M) [application/x-gzip]
Saving to: ‘multichain-1.0-alpha-26.tar.gz’

100%[=========================================================================>] 5,875,759 6.65MB/s in 0.8s

2018-06-30 19:39:24 (6.65 MB/s) - ‘multichain-1.0-alpha-26.tar.gz’ saved [5875759/5875759]

root@mutichain-instance-1:/home/ubuntu/tmp#

Instance 2

sourabhsethi8888@multichain-instance-2:~$ sudo su
root@multichain-instance-2:/home/sourabhsethi8888# cd /home/ubuntu/
root@multichain-instance-2:/home/ubuntu# cd /home/ubuntu/
root@multichain-instance-2:/home/ubuntu# mkdir tmp
root@multichain-instance-2:/home/ubuntu# cd tmp
root@multichain-instance-2:/home/ubuntu/tmp# wget http://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz--2018-06-30 19:39:28-- http://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz
Resolving www.multichain.com (www.multichain.com)... 162.243.214.85
Connecting to www.multichain.com (www.multichain.com)|162.243.214.85|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz [following]
--2018-06-30 19:39:28-- https://www.multichain.com/download/multichain-1.0-alpha-26.tar.gz
Connecting to www.multichain.com (www.multichain.com)|162.243.214.85|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5875759 (5.6M) [application/x-gzip]
Saving to: ‘multichain-1.0-alpha-26.tar.gz’

100%[=========================================================================>] 5,875,759 5.64MB/s in 1.0s

2018-06-30 19:39:29 (5.64 MB/s) - ‘multichain-1.0-alpha-26.tar.gz’ saved [5875759/5875759]

root@multichain-instance-2:/home/ubuntu/tmp#

Step 3:- Unzip Multichain package.

root@multichain-instance-2:/home/ubuntu/tmp# tar -xvzf multichain-1.0-alpha-26.tar.gz
multichain-1.0-alpha-26/
multichain-1.0-alpha-26/multichain-util
multichain-1.0-alpha-26/multichain-cli
multichain-1.0-alpha-26/README.txt
multichain-1.0-alpha-26/multichaind
root@multichain-instance-2:/home/ubuntu/tmp# ls
] multichain-1.0-alpha-26 multichain-1.0-alpha-26.tar.gz
root@multichain-instance-2:/home/ubuntu/tmp#

Step 4:- Move bin files to /usr/local/bin.

multichain-cli  multichaind  multichain-util  README.txt
root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26# mv multichaind multichain-cli multichain-util /usr/local/bin
root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26#

root@multichain-instance-2:/home/ubuntu/tmp#
root@multichain-instance-2:/home/ubuntu/tmp#
root@multichain-instance-2:/home/ubuntu/tmp# cd multichain-1.0-alpha-26
root@multichain-instance-2:/home/ubuntu/tmp/multichain-1.0-alpha-26# ls
multichain-cli multichaind multichain-util README.txt
root@multichain-instance-2:/home/ubuntu/tmp/multichain-1.0-alpha-26# mv multichaind multichain-cli multichain-util /usr/local/bin
root@multichain-instance-2:/home/ubuntu/tmp/multichain-1.0-alpha-26#

Step 5:- Run multichain CLI by executing below commands.

multichain-cliroot@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26# multichain-cli

MultiChain Core RPC client build 1.0 alpha 26 protocol 10006


Usage:
multichain-cli <blockchain-name> [options] <command> [params] Send command to MultiChain Core
multichain-cli <blockchain-name> [options] help List commands
multichain-cli <blockchain-name> [options] help <command> Get help for a command

Options:
-? This help message
-conf=<file> Specify configuration file (default: multichain.conf)
-datadir=<dir> Specify data directory
-saveclilog=<n> If <n>=0 multichain-cli history is not saved, default 1
-rpcconnect=<ip> Send commands to node running on <ip> (default: 127.0.0.1)
-rpcport=<port> Connect to JSON-RPC on <port>
-rpcwait Wait for RPC server to start
-rpcuser=<user> Username for JSON-RPC connections
-rpcpassword=<pw> Password for JSON-RPC connections

SSL options:
-rpcssl Use OpenSSL (https) for JSON-RPC connections
root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26#

Create your Blockchain Network and Zeroth Genesis Block.

Step 6:- Create your Chain1.

root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26# multichain-util create chain1
MultiChain utilities build 1.0 alpha 26 protocol 10006

Blockchain parameter set was successfully generated.
You can edit it in /root/.multichain/chain1/params.dat before running multichaind for the first time.

To generate blockchain please run "multichaind chain1 -daemon".
root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26#

All your Blockchain’s settings are available in params.dat file inside the ~/.multichain/chain1/. To confirm the settings please use below command and it will spit everything in your terminal.

# ==== MultiChain configuration file ====

# Created by multichain-util
# Protocol version: 10006


# The following parameters can only be edited if this file is a prototype of another configuration file.
# Please run "multichain-util clone chain1 <new-network-name>" to generate new network.


# Basic chain parameters

chain-protocol = multichain # Chain protocol: multichain (permissions, native assets) or bitcoin
chain-description = MultiChain chain1 # Chain description, embedded in genesis block coinbase, max 256 chars.
root-stream-name = root # Root stream name, blank means no root stream.
root-stream-open = true # Allow anyone to publish in root stream
chain-is-testnet = false # Content of the 'testnet' field of API responses, for compatibility.
target-block-time = 15 # Target time between blocks (transaction confirmation delay), seconds. (5 - 86400)
maximum-block-size = 8388608 # Maximum block size in bytes. (1000 - 1000000000)

# Global permissions

anyone-can-connect = false # Anyone can connect, i.e. a publicly readable blockchain.
anyone-can-send = false # Anyone can send, i.e. transaction signing not restricted by address.
anyone-can-receive = false # Anyone can receive, i.e. transaction outputs not restricted by address.
anyone-can-create = false # Anyone can create new streams.
anyone-can-issue = false # Anyone can issue new native assets.
anyone-can-mine = false # Anyone can mine blocks (confirm transactions).
anyone-can-activate = false # Anyone can grant or revoke connect, send and receive permissions.
anyone-can-admin = false # Anyone can grant or revoke all permissions.
allow-p2sh-outputs = true # Allow pay-to-scripthash (P2SH) scripts, often used for multisig.
allow-multisig-outputs = true # Allow bare multisignature scripts, rarely used but still supported.

# Consensus requirements

setup-first-blocks = 60 # Length of initial setup phase in blocks, in which mining-diversity,
# admin-consensus-* and mining-requires-peers are not applied. (1 - 31536000)
mining-diversity = 0.3 # Miners must wait <mining-diversity>*<active miners> between blocks. (0 - 1)
admin-consensus-admin = 0.5 # <admin-consensus-admin>*<active admins> needed to change admin perms. (0 - 1)
admin-consensus-activate = 0.5 # <admin-consensus-activate>*<active admins> to change activate perms. (0 - 1)
admin-consensus-mine = 0.5 # <admin-consensus-mine>*<active admins> to change mining permissions. (0 - 1)
admin-consensus-create = 0.0 # <admin-consensus-issue>*<active admins> to change create permissions. (0 - 1)
admin-consensus-issue = 0.0 # <admin-consensus-issue>*<active admins> to change issue permissions. (0 - 1)
mining-requires-peers = true # Default for whether nodes only mine blocks if connected to other nodes.

# Native blockchain currency (likely not required)

initial-block-reward = 0 # Initial block mining reward in raw native currency units. (0 - 1000000000000000000)
first-block-reward = -1 # Different mining reward for first block only, ignored if negative. (-1 - 1000000000000000000)
reward-halving-interval = 52560000 # Interval for halving of mining rewards, in blocks. (60 - 4294967295)
reward-spendable-delay = 1 # Delay before mining reward can be spent, in blocks. (1 - 100000)
minimum-per-output = 0 # Minimum native currency per output (anti-dust), in raw units.
# If set to -1, this is calculated from minimum-relay-fee. (-1 - 1000000000)
maximum-per-output = 100000000000000 # Maximum native currency per output, in raw units. (0 - 1000000000000000000)
minimum-relay-fee = 0 # Minimum transaction fee, in raw units of native currency. (0 - 1000000000)
native-currency-multiple = 100000000 # Number of raw units of native currency per display unit. (0 - 1000000000)

# Advanced mining parameters

skip-pow-check = false # Skip checking whether block hashes demonstrate proof of work.
pow-minimum-bits = 16 # Initial and minimum proof of work difficulty, in leading zero bits. (1 - 32)
target-adjust-freq = -1 # Interval between proof of work difficulty adjustments, in seconds, if negative - never adjusted. (-1 - 4294967295)
allow-min-difficulty-blocks = false # Allow lower difficulty blocks if none after 2*<target-block-time>.

# Standard transaction definitions

only-accept-std-txs = true # Only accept and relay transactions which qualify as 'standard'.
max-std-tx-size = 4194304 # Maximum size of standard transactions, in bytes. (1024 - 10000000)
max-std-op-returns-count = 10 # Maximum number of OP_RETURN metadata outputs in standard transactions. (0 - 1024)
max-std-op-return-size = 2097152 # Maximum size of OP_RETURN metadata in standard transactions, in bytes. (0 - 8388608)
max-std-op-drops-count = 5 # Maximum number of OP_DROPs per output in standard transactions. (0 - 100)
max-std-element-size = 600 # Maximum size of data elements in standard transactions, in bytes. (128 - 32768)

# The following parameters were generated by multichain-util.
# They SHOULD ONLY BE EDITED IF YOU KNOW WHAT YOU ARE DOING.

default-network-port = 9743 # Default TCP/IP port for peer-to-peer connection with other nodes.
default-rpc-port = 9742 # Default TCP/IP port for incoming JSON-RPC API requests.
chain-name = chain1 # Chain name, used as first argument for multichaind and multichain-cli.
protocol-version = 10006 # Protocol version at the moment of blockchain genesis.
network-message-start = f4d0daee # Magic value sent as the first 4 bytes of every peer-to-peer message.
address-pubkeyhash-version = 00284b6c # Version bytes used for pay-to-pubkeyhash addresses.
address-scripthash-version = 05e70854 # Version bytes used for pay-to-scripthash addresses.
private-key-version = 802748d0 # Version bytes used for exporting private keys.
address-checksum-value = 853dcce1 # Bytes used for XOR in address checksum calculation.

# The following parameters were generated by multichaind.
# They SHOULD NOT BE EDITED.

genesis-pubkey = [null] # Genesis block coinbase output public key.
genesis-version = [null] # Genesis block version.
genesis-timestamp = [null] # Genesis block timestamp.
genesis-nbits = [null] # Genesis block difficulty (nBits).
genesis-nonce = [null] # Genesis block nonce.
genesis-pubkey-hash = [null] # Genesis block coinbase output public key hash.
genesis-hash = [null] # Genesis block hash.
chain-params-hash = [null] # Hash of blockchain parameters, to prevent accidental changes.

root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26#

Step 7:- Start you chain1 server.

root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26# multichaind chain1 -daemon

MultiChain Core Daemon build 1.0 alpha 26 protocol 10006

MultiChain server starting
Looking for genesis block...
Genesis block found

Other nodes can connect to this node using:
multichaind chain1@10.142.0.4:9743

Node started
root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26#

Step 8 :- Connect Chain1 from Instance2.

root@multichain-instance-2:/home/ubuntu/tmp/multichain-1.0-alpha-26# multichaind chain1@10.142.0.4:9743

MultiChain Core Daemon build 1.0 alpha 26 protocol 10006

Retrieving blockchain parameters from the seed node 10.142.0.4:9743 ...
Blockchain successfully initialized.

Please ask blockchain admin or user having activate permission to let you connect and/or transact:
multichain-cli chain1 grant 16parmbaW4w2AqJK1rii8H2GtVoPhXh1fJhW8S connect
multichain-cli chain1 grant 16parmbaW4w2AqJK1rii8H2GtVoPhXh1fJhW8S connect,send,receive

root@multichain-instance-2:/home/ubuntu/tmp/multichain-1.0-alpha-26#

Run below commands to grant permission to access chain1 on instance2.

root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26# multichain-cli chain1 grant 16parmbaW4w2AqJK1rii8H2GtVoPhXh1fJhW8S connect,send,receive
{"method":"grant","params":["16parmbaW4w2AqJK1rii8H2GtVoPhXh1fJhW8S","connect,send,receive"],"id":1,"chain_name":"chain1"}

4b662e28e44827ad660efab541a0952dc484db9446721671460daad46d53fc9b
root@mutichain-instance-1:/home/ubuntu/tmp/multichain-1.0-alpha-26#

Connect chain1 on instance2.

root@multichain-instance-2:/home/ubuntu/tmp/multichain-1.0-alpha-26# multichaind chain1@10.142.0.4:9743

MultiChain Core Daemon build 1.0 alpha 26 protocol 10006

Retrieving blockchain parameters from the seed node 10.142.0.4:9743 ...
Other nodes can connect to this node using:
multichaind chain1@10.142.0.5:9743

Node started

Conclusion : We have gone through installation of multichain on ubuntu, created chain1 on instance node 1 and connected chain1 with instance node 2.

--

--

Sourabhh Sethii
DXSYS
Editor for

I am an author of Building Digital Experience Platform and I am passionate about emerging technologies. https://sourabhhsethii.com/