0% found this document useful (0 votes)
11 views14 pages

Blockchain Medium

This document is a tutorial on writing chaincode for a Certificate Credentialing Service using Hyperledger Fabric, building on a previous article. It outlines the process of creating a chaincode that can create, store, and retrieve certificate information on a blockchain ledger. The tutorial includes code snippets for various functions and instructions for deploying the chaincode on a test network.

Uploaded by

Musthafa
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views14 pages

Blockchain Medium

This document is a tutorial on writing chaincode for a Certificate Credentialing Service using Hyperledger Fabric, building on a previous article. It outlines the process of creating a chaincode that can create, store, and retrieve certificate information on a blockchain ledger. The tutorial includes code snippets for various functions and instructions for deploying the chaincode on a test network.

Uploaded by

Musthafa
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Open in app

10
Search

Get unlimited access to the best of Medium for less than $1/week. Become a member

Impelsys · Follow publication

Certificate Credentialing Service, Writing


Chaincode: Blog 2
Muhammed Musthafa Shahal V
Published in Impelsys
9 min read · Nov 3, 2023

Listen Share More

Hi Folks, This is a continuation of the “Certificate Credentialing Service


using Blockchain Technology-Hyperledger Fabric“ blog posted in
September written by Anubhav R. To understand the basics of Hyperledger Fabric
and our business requirements, I highly recommend reading our previous article
and doing the test network setup. In the previous blog, we have set up a test
network, and our test network is up and running.

If you do not wish to download all the fabric samples and set them up, you can use
managed blockchain networks provided by Amazon or any other tech giant,
however, you have to pay for their service. Follow along if you have your own
network or if you only need to learn about blockchains; otherwise, set up the test
network and come back.

Let’s begin, What is a Chaincode?


A Chaincode also referred to as a “smart contract” in other blockchain platforms, is
responsible for defining and executing the business logic of transactions and
governing the state of the ledger.

Our Requirement

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 1/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

To write a chaincode that can create a certificate, store it in the ledger, retrieve
certificate details upon providing the certificate number, and display all certificates
in the ledger.

Let’s start writing the Chaincode

As mentioned earlier, this blog is the continuation of the “Certificate Credentialing


Service using Blockchain technology-Hyperledger Fabric“ blog. If you do not have a
test network setup, please follow the earlier blog, complete the test network setup,
and then come back here.

Now, head over to the fabric-samples/chaincode/fabcar/javascript/lib/fabcar.js file


inside our test network, remove all the code inside “index.js” and let us start from
scratch.

Firstly, start by importing the fabric contract API. Use the code shown below. Also,
use the “contract API” or “fabric shim” API; both of these APIs are critical
components that provide a bridge between the system chaincode and the
underlying Hyperledger Fabric platform.

'use strict';

const { Contract } = require('fabric-contract-api');

Next, create a class called FabCar and export it, refer to the below code. If required
change the class name but you have to change the test network configuration and
the chaincode SDK as well. As I’m using the test network provided by the
Hyperledger Foundation, I’m keeping the same name, and changing the entire
name is out the of scope of this blog.

class FabCar extends Contract {

module.exports = FabCar;

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 2/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Now create the chaincode functions as per our business requirements and create 4
functions inside the Fabcar Class in the same order.

1. Init Function

2. Create a Certificate Function

3. Query Certificate Function

4. Query All Certificate Function

Init Function
As a first step, we will proceed with the Init function. If necessary, you can leave the
Init function empty. When the opportunity arises for Chaincode deployment, this
method will be executed automatically to ensure successful deployment. It is a good
practice to keep some code or initialize some values in the Init method to determine
if the deployment has been successful or not.

To write data into the ledger, you can use the “putState” method. This method will
update the ledger and write the key-value pair into it.

In this case, I will assign a dummy certificate value as the initial value.

async initLedger(ctx) {
console.info('============= START : Initialize Ledger ===========');
const certificate =
{
"name": "Blackacre",
"email": "[email protected]",
"course": "BLS Provider",
"orgCode": "TC0101",
"courseCode": "2022-1234",
"completionDate": "10-10-2023",
"expiryDate": "10-10-2025"
}
const key ="CERT123";
await ctx.stub.putState(key, Buffer.from(JSON.stringify(certificate)));
console.info('Added <--> ', certificate);
console.info('============= END : Initialize Ledger ===========');
}

Create Certificate Function

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 3/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Next, write the Create Certificate Function which accepts the certificate number
and the certificate details as parameters.

async createCertificate(ctx, certNO, name, email, course, orgCode, courseCode,


console.info('============= START : Create Certificate ===========');

const certificateData = {
name,
email,
course,
orgCode,
courseCode,
completionDate,
expiryDate,
};

await ctx.stub.putState(certNO, Buffer.from(JSON.stringify(certificateD


console.info('============= END : Create Certificate ===========');
}

 

Query Certificate Function


Now, write the Query Certificate Function. This function accepts the certificate
number as a parameter and returns the matching certificate data. If no matching
data is found, the function returns the value ‘No data exists’. The “putState” method
can be used to write a certificate. In order to retrieve the state of a certificate from
the ledger, the “getState” method can be used. This method retrieves the state from
the ledger for a particular key.

async queryCertificate(ctx, certNO) {


const certificateAsBytes = await ctx.stub.getState(certNO); // get the
if (!certificateAsBytes || certificateAsBytes.length === 0) {
throw new Error(`${certNO} does not exist`);
}
console.log(certificateAsBytes.toString());
return certificateAsBytes.toString();
}

 

Query All Certificate Function

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 4/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Finally, use the Query All Certificates Function. This function does not accept any
parameters but will return all the certificate information available in the database.

async queryAllCertificates(ctx) {
const startKey = '';
const endKey = '';
const allResults = [];
for await (const {key, value} of ctx.stub.getStateByRange(startKey, end
const strValue = Buffer.from(value).toString('utf8');
let record;
try {
record = JSON.parse(strValue);
} catch (err) {
console.log(err);
record = strValue;
}
allResults.push({ Key: key, Record: record });
}
console.info(allResults);
return JSON.stringify(allResults);
}

 

Below is the consolidated chaincode block :

'use strict';

const {
Contract
} = require('fabric-contract-api');

class FabCar extends Contract {


async initLedger(ctx) {
console.info('============= START : Initialize Ledger ===========');
const certificate = {
"name": "Blackacre",
"email": "[email protected]",
"course": "BLS Provider",
"orgCode": "TC0101",
"courseCode": "2022-1234",
"completionDate": "10-10-2023",
"expiryDate": "10-10-2025"
}

await ctx.stub.putState(CERT123, Buffer.from(JSON.stringify(certificate)));


console.info('Added <--> ', certificate);
https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 5/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

console.info('============= END : Initialize Ledger ===========');


}

async createCertificate(ctx, certNO, name, email, course, orgCode, courseCode,


console.info('============= START : Create Certificate ===========');

const certificateData = {
name,
email,
course,
orgCode,
courseCode,
completionDate,
expiryDate,
};

await ctx.stub.putState(certNO, Buffer.from(JSON.stringify(certificateData)))


console.info('============= END : Create Certificate ===========');
}

async queryCertificate(ctx, certNO) {


const certificateAsBytes = await ctx.stub.getState(certNO); // get the certif
if (!certificateAsBytes || certificateAsBytes.length === 0) {
throw new Error(`${certNO} does not exist`);
}
console.log(certificateAsBytes.toString());
return certificateAsBytes.toString();
}

async queryAllCertificates(ctx) {
const startKey = '';
const endKey = '';
const allResults = [];
for await (const {
key,
value
}
of ctx.stub.getStateByRange(startKey, endKey)) {
const strValue = Buffer.from(value).toString('utf8');
let record;
try {
record = JSON.parse(strValue);
} catch (err) {
console.log(err);
record = strValue;
}
allResults.push({
Key: key,
Record: record
});
}
console.info(allResults);
return JSON.stringify(allResults);

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 6/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

}
}

module.exports = FabCar;

Deploying the Chaincode


We have now finished writing the chaincode. Let us now deploy the chaincode to
the test network and execute some transactions. I am using the Hyperledger
Foundation’s test network. Start the network by running the “startFabric.sh” script
inside the fabcar folder. JavaScript is used as the chaincode language.

The script will deploy the Go version of chaincode by default if you did not mention
javascript. If you would like to use any other programming language, please indicate
it.

fabric-samples/fabcar$ ./startFabric.sh javascript

The “startFabric.sh” script will start the network and deploy our chaincode. It will
create two organizations and one peer for each. Then it will create a test channel,
package our chaincode, and deploy it. Refer to the below Chain code. It provides the
channel name, chaincode name, chaincode language, etc.

After packaging the chaincode, it will wait for approval from each peer in the
network. Once it’s approved, it will deploy the chaincode.

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 7/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

After the execution is complete, confirm your network is up and running by


executing the following command:

fabric-samples/fabcar$ docker ps

The command will list all the containers running.

The test network by default uses the Couchdb as the ledger in the BlockChain. In
the containers list, you can see two instances of the CouchDB database created by
the Fabric test network for each organization on PORTs 5984 and 7984, respectively.
To confirm your chaincode is successfully deployed head-over to any of the
Couchdb database ports mentioned, use the result provided by the “docker ps”
command.

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 8/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

I’m using the first instance of Couchdb running on port 5984. Head over to
“http://localhost:5984/_utils” and login using the default username “admin” and
password “adminpw”.

Go inside “my channel” fabcar ledger. This is the ledger created by the network for
us. Inside that, you can see “CERT123.” Click on it, and then you will be able to see
the entire certificate details that we mentioned in the chaincode Init Function. This
indicates that our chaincode was successfully deployed and the certificate was
added to the ledger.

Creating the Admin & End User

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 9/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

After successfully deploying our chaincode, it is now time to invoke it and execute
transactions. Rather than writing the code on the command line for executing
transactions, Hyperledger Fabric provides SDKs for each programming language for
automating transaction execution. First, we will create an admin user, and then,
utilizing the admin user, we will create an end user to interact with the chaincode.
1. Create an Admin user for getting access to the network
Head over to “fabric-samples/fabcar/javascript/” and run “npm install” to install the
dependencies.

Now run the “enrollAdmin.js” file using node.

You have now successfully created an admin.

2. Create an End user for interacting with the chaincode


After creating the admin, we can set up a user to interact with the chaincode. To do
this, run the “registerUser.js” file using node. If required to change the username,
edit the file and replace the default username “appUser” with the name you desire.

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 10/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Invoking the Chaincode to create a certificate.


When you create a transaction that requires writing data into the ledger, you invoke
the chaincode. Invoking the chaincode for submitting a transaction requires editing
the “invoke.js” file. Simply replace the line “await contract.submitTransaction()” as
follows, or provide the certificate values of your choice.

await contract.submitTransaction('createCertificate', 'CERT111', 'Adam John', '

 

Once done, save the file and run the “invoke.js” file to submit the transaction to the
blockchain. It will sum up the transaction. When the transaction has been
endorsed, you will receive the following response.

Once the transaction has been submitted, you will be able to view the newly created
certificate when you refresh the Couchdb website.

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 11/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Query Chaincode to retrieve certificate


The query method is used when you want to receive data from the blockchain.

In the “query.js” file, replace the “const result = await


contract.evaluateTransaction():” with the following to query all certificates:

const result = await contract.evaluateTransaction('queryAllCertificates');

Save the file and run it using “node query.js”. All the certificates will be printed on
the console.

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 12/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

To query a particular certificate — give the queryCertificate function and a key as


parameters.

const result = await contract.evaluateTransaction('queryCertificate','CERT111')

 

Save the file and run it using “node query.js”. If the certificate is present with the
key you provided you will see the following response.

If the certificate does not exist with the key you provided, you will get an error
message showing that the “key does not exist”.

Conclusion:

We have successfully written our first chaincode and deployed it to our test network.
Happy Coding, and Good Luck.

Chaincode Smart Contracts Blockchain Hyperledger Fabric

Follow

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 13/21
4/23/25, 9:49 PM Certificate Credentialing Service, Writing Chaincode: Blog 2 | by Muhammed Musthafa Shahal V | Impelsys | Medium

Published in Impelsys
30 Followers · Last published Apr 3, 2025

Impelsys is a global leader in delivering impactful, engaging & adaptable online learning solutions for global
publishers, education providers, & enterprises.

Edit profile

Written by Muhammed Musthafa Shahal V


9 Followers · 3 Following

Software Engineer Trainee @Impelsys

No responses yet

Muhammed Musthafa Shahal V

What are your thoughts?

More from Muhammed Musthafa Shahal V and Impelsys

https://medium.com/impelsys/certificate-credentialing-service-writing-chaincode-blog-2-6c94d0c2cf6b 14/21

You might also like