Understanding Blockchain using JavaScript Class
Tags: javascript, node, testing, blockchain
Published: 2023-03-20 19:08:59

## Introduction
This tutorial will demonstrate how to simulate and run a blockchain system using JavaScript. Often times, whenever blockchain and to some extent smart contract is described, what comes to minds is an opaque black-box. It could be that the predominant language used for writing most smart contract codes contributes to this.

This piece will show a detailed step-by-step approach to implementing a smart contract using Node.js and vanilla JavaScript. A test suite will also be added to test the whole application. The source code for the article can be found in this [repository](https://github.com/callezenwaka/blockchain). Let's get started!

Here, we have three parameters, two arrays representing `initialBalances` and `transactions` and a third integer representing the `blockSize`. We are going to create a blockchain smart contract that includes all valid pending transactions in the order in which they are given. And provide functionality to get the balance of a specific account on the blockchain.

## Installation of Dependencies
First, clone the above repository and run `npm install` and skip over to the **Implementation** section below. If you are otherwise coding along, initialize your node.js project by running `npm init -y`. Then, create two files `blockchain.js` and `blockchain.test.js`. Install the following dependencies by running `npm i sha1 chai mocha`.

The files in the directory should look like the below image:

![File directory](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j59evvw7p42tksx5iq9m.PNG)
Then add the following codes to the `blockchain.js` file [blockchain.js](https://github.com/callezenwaka/blockchain/blob/main/blockchain.js)

Save the file and add the following code to the `blockchain.test.js` file [blockchain.test.js](https://github.com/callezenwaka/blockchain/blob/main/blockchain.test.js)

Save the file also and open the `package.json` file. Here, you need to make minor changes to the script commands. First, the following code to the script part of the `package.json`:

```
    "start": "node blockchain.js",
    "test": "mocha --timeout 10000"
```
The `--timeout 10000` will ensure that all the test will pass during testing.

## Implementation
There are two interfaces viz: `init` and `getAccountBalance`. But before that, let's define some parameters.

```
  const balances = [200, 250, 500];
  const transactions = [[0, 1, 50], [1, 2, 80], [1, 0, 100], [1, 2, 600], [2, 0, 150], [1, 0, 50], [2, 1, 60], [0, 1, 55], [1, 2, 40], [1, 0, 70]];
  const blockSize = 3;
  const index = 1;
  const pendingTransactions = [[0,1,50], [1,2,80]];
  const prevBlockHash = '548bc92f827bd41ad97243cc3ca4b765f8c68a2c';
```
We are going to execute the code and run the test. Run the following code sequentially inside the root directory of the project (Ignore the undefined output after executing any of the commands):
1. Activate the Node REPL with `node`

2. Initialize the constructor by running `const Blockchain = require('./blockchain');`

3. Instantiate an object by running `const blockchain = new Blockchain();`

4. Initialize an object by running `blockchain.init(balances, transactions, blockSize);`

5. Retrieve account balance by running `blockchain.getAccountBalance(index);`

The Node REPL should look like the following image if everything checks out: 
![Node REPL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12ofjd7tofg8osdmy41r.PNG)

## Testing the Codes
Exit the Node REPL and return to the root directory. Run the test by executing `npm test ./blockchain.test.js`. The output should look like below image:

![Testing output](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zhue88705yy7t10hqpte.PNG)

You have successfully implemented and tested a blockchain code using JavaScript. You can take some time to go through the code in order to understand how each part of the code interact with each other.

If you like the article, do like and share with friends.