[2] Build your own Blockchain

We are going to build a permissioned blockchain using the open source version of the MultiChain Framework with distributed consensus between identified block validators.

It's close in spirit to PBFT (Practical Byzantine Fault Tolerance), but instead of multiple validators per block, there is one validator per block, working in a round-robin fashion.

This is described in detail in the 'Mining in MultiChain' section beginning on page 7 of the Multichain white paper.

Key features are:

  1. High speed: Greater than 1000 tps, which includes signature verification & transaction processing i.e. real Byzantine. Block time as low as 2 seconds.

  2. High scalability: Supports millions of addresses, assets, streams, and unlimited transactions / stream items. Also supports unlimited nodes in the network.

  3. High security: Forked from Bitcoin Core; Full multi-signature support; External key management (Bitcoin hardware security modules).

  4. Unified JSON-RPC API for applications: API cleanly separates the app from the node; Compatible with any API library developed for Bitcoin Core.

  5. Flexible assets: No need for smart contracts; Flexible asset metadata; Permissioned follow-on issuance; Atomic multi-asset payments; Multi-way atomic asset exchanges; Multi-signatures for security & escrow; Subscribe to an asset to query transactions.

  6. Permissioned blockchain: Validation by consensus, not proof of work.

  7. Full asset lifecycle: Issuance, transfer, exchange, escrow, re-issuance, redemption, destruction.

  8. General storage and search: 64 MB of data per transaction. Streams support key–value, identity, time series.

  9. Multiple deployment options: Environment agnostic (self-hosted in a data center, public or private cloud); Accessed as a service; Nodes added simply and quickly; Shared administration model; Smooth governance transitions.

  10. 45+ blockchain parameters: Block size/time, permissioning, admin consensus, mining, optional native currency.

  11. Data streams: Enable a blockchain to be used as a general-purpose append-only database, with the blockchain providing time stamping, notarization, and immutability.

1. Setting up a permissioned blockchain

System requirements:

  • Linux: 64-bit, supports Ubuntu 12.04+, CentOS 6.2+, Debian 7+, Fedora 15+, RHEL 6.2+.
  • Windows: 64-bit, supports Windows 7, 8, 10, 11, Server 2008 or later.
  • Mac: 64-bit, supports OS X 10.11 or later.
  • 512 MB of RAM
  • 1 GB of disk space

The steps to setup a blockchain called rohas on Linux are:

Once the blockchain is setup:

2. Addresses

Each address can have one or more of the following 8 permissions:

  1. connect – to connect to other nodes and see the blockchain’s contents.
  2. send – to send funds, i.e. sign inputs of transactions.
  3. receive – to receive funds, i.e. appear in the outputs of transactions.
  4. issue – to issue assets, i.e. sign inputs of transactions that create new native assets.
  5. create – to create streams, i.e. sign inputs of transactions which create new streams.
  6. mine – to create blocks, i.e. to sign the metadata of coinbase transactions.
  7. activate – to change connect, send, and receive permissions for other users, i.e. sign transactions which change those permissions.
  8. admin – to change all permissions for other users, including issue, mine, activate, and admin.

For details on permissions management, see: https://www.multichain.com/developers/permissions-management/

Addresses can be custodial (the private key is stored in the node) or non-custodial (the private key is not stored in the node.)

Creating a custodial address

getnewaddress returns a new address whose private key is added to the wallet. This is a custodial address.

Creating a non-custodial address

createkeypairs generates one or more public / private key pairs, which are not stored in the wallet or drawn from the node’s key pool, ready for external key management. These are non-custodial addresses.

For each key pair, the address, public key (as embedded in transaction inputs) and private key (used for signatures) is provided.

Creating a multi-sig address

Addmultisigaddress creates a pay-to-scripthash (P2SH) multisig address and adds it to the wallet.

Funds sent to this address can only be spent by transactions signed by nrequired of the specified keys. Each key can be a full public key, or an address if the corresponding key is in the node’s wallet.

Output is the P2SH address

3. Assets

When an asset is created on the Blockchain, the following parameters can be customized:

  1. the address which is creating the asset
  2. address to which the assets are to be sent on creation
  3. asset name
  4. whether additional units can be created
  5. whether it has per-asset send and/or receive permissions
  6. the smallest transact-able unit
  7. custom-fields parameter to provide extra information

Creating an Asset

An asset can be issued using:
issuefrom fromAddress toAddress name|params qty (units=1) (customFields)

Information about an asset can be obtained using
getassetinfo asset-name

JSON-RPC API commands

See the following sections on the MultiChain JSON-RPC API commands page
1. Asset management
2. Querying wallet balances and transactions
3. Sending one-way payments
4. Atomic exchange transactions – tutorial
5. Managing stream and asset subscriptions
6. Querying subscribed assets
7. Smart filters and upgrades

Tutorial

4. Transactions

Transactions can be one-way payments or atomic exchange transactions.

One-way payments can be sent using sendassetfrom fromAddress toAddress asset quantity

You can get a list of all the asset balances for an address using getaddressbalances address

Atomic exchange transactions

Atomic exchange transactions are used to safely swap assets between counterparties.

Any MultiChain transaction can have multiple inputs and outputs, and each one can relate to a different address on the blockchain.

This enables a single transaction to perform an asset exchange between two or more parties, for example sending a dollar-denominated asset from Alice to Bob, while simultaneously sending a Euro-denominated asset from Bob to Alice.

Because the exchange takes place in a single transaction, it comes with a guarantee of atomicity, meaning that all of the asset transfers take place simultaneously, or none take place at all. In the finance world, this type of transaction is termed delivery-versus-payment, or DvP for short.

Atomic Exchange Transactions on a Blockchain

5. Electronic signatures

Electronic Signatures can be generated using custodial and non-custodial addresses.

Signing by a custodial address

A message (text or hash) can be electronically signed by a custodial address using signmessage addressOfSigner "message"

An electronic signature can be verified using verifymessage addressOfSigner electronicSignature "message"

Signing by a non-custodial address

A message (text or hash) can be electronically signed by a non-custodial address using signmessage privateKeyOfSigner "message"

An electronic signature can be verified using verifymessage addressOfSigner electronicSignature "message"