A digital identity smart contract built on hyperledger fabric
May 6, 2020
The traditional identity systems of today are fragmented, insecure, and exclusive. Blockchain enables more secure management and storage of digital identities by providing unified, inter-operable, and tamper-proof infrastructure with key benefits to enterprises and users. This project was inspired by the Bank verification number implemented by the Central bank of Nigeria to curb illegal banking. This BVN is currently being used by other Government bodies as a means of identifying individuals E.G national identity management system.
Solution
This is a simple implementation of a digital identity system using blockchain technology and it’s built on IBM hyperledger fabric using smart contract coupled with a CLI for interacting with the network for performing a variety of actions. This solution uses RSA key pairs to encrypt user identity in the world state in the blockchain and these keys are stored inside the user wallet. A combination of letters and numbers of length 16 (C64B32C60227CC) is generated for each user, anyone with the id can request for the user data, user can decide to grant or revoke access to their data.
NB: This project is basically for learning purpose for anyone trying to understand how hyperledger smart contract works
Prerequisites
- NodeJS (Smart contract)
- Git
- Curl
- Python
- Hyperledger Fabric v2.0
- Docker & Golang
- Vscode IBM Blockchain Extention
- Vscode version 1.39
Flow Diagram
This flow diagram depicts how users(identities) and organizations get to interact with the blockchain network via the CLI
Get started
Install & setup docker and Golang if you don’t have them installed already
Docker: https://www.docker.com/products/docker-desktop
Golang: https://golang.org/dl/
Setup hyper ledger fabric
setup all the images needed for Hyperledger Fabric v2.0. create a new folder or a navigate to a blank folder via your CLI and run the below command
curl -sSL https://bit.ly/2ysbOFE | bash -s 2.0.0
The command above downloads and executes a bash script that will download and extract all of the platform-specific binaries you will need to set up our network and place them into the folder you navigated to. It retrieves the following platform-specific binaries:
- configtxgen,
- configtxlator,
- cryptogen,
- discover,
- idemixgen
- orderer,
- peer
- fabric-ca-client
Read more: https://hyperledger-fabric.readthedocs.io/en/release-2.0/install.html
Setup Vscode IBM Blockchain Extention
The IBM Blockchain Platform extension helps developers to create, test, and debug smart contracts, connect to Hyperledger Fabric environments, and build applications that transact on your blockchain network.
Install: https://marketplace.visualstudio.com/items?itemName=IBMBlockchain.ibm-blockchain-platform
Clone Solution Repository
git clone https://github.com/TheDhejavu/digital-identity
Smart contract
Install
There are two smart contracts located inside the repo that you cloned in the previous step. Javascript & Golang but the Golang is currently under development. Add Js-contract to your Vscode workspace and install it by following these steps:
Instantiate
Follow the following steps to instantiate the smart contract
Install the CLI application
From the digital-identity directory inside cli-application, navigate to the JS folder.
cd JS
Run the following command to install the application dependencies. It will take about a minute to complete:
npm install
This process is installing the key application dependencies defined in package.json
Create a global symlink for the CLI dependency with npm link.
npm link
Config files
create config.json file in the cli-application/JS folder and add the following information
{
"connectionProfileFilename":"fabric_connection.json",
"channelName":"mychannel",
"appAdmin": "admin",
"caName": "http://localhost:17050",
"contractName":"identity"
}
create fabric_connection.json file in the cli-application/JS folder and export your connection file data by clicking on the blue circled part on your vscode which is illustrated below. paste this data into your fabric_connection.json
CLI Commands
Enroll Admin
node enrollAdmin.js
Register User
node registerUser.js -name=<USERNAME>
Register organization
node registerOrg.js -org=<ORG_ID>
Create Identity
dig run createIdentity -u <USERNAME> -a '{ firstName: 'akinola', lastName: <LASTNAME>, userName: <USERNAME>, dob: <DOB>, residentialAddress: <ADDRESS>, email: <EMAIL>, passCode: <PASSCODE>}'
Create Organisation
dig run createOrg -u <ORG_ID> -a '{ name: <NAME>, description: <DESCRIPTION>, location: <LOCATION>, type: <TYPE_OF_ORG>, identity: <ORG_ID> }'
Query all data
dig run queryWithQueryString -u ayodeji -a '{ "selector": { }}' --query
Request for user identity
dig run requestUserIdentity -u <ORG_ID> -a '{"identityId": <ID> }'
Get Request identity
dig run getRequestedIdentity -u ayodeji -a '{ "selector": { }}' --query
Grant organization access to identity
dig run grantOrgAccessToIdentity -u ayodeji -a '{"requestId": <ID>, "orgId": <ORG_UID>}'
Check out the repo for the rest of the command https://github.com/TheDhejavu/digital-identity
Common Errors associated with smart contract while working with Vscode blockchain Extention
- error upgrading smart contract: chain code registration failed: container exited with 1
- error instantiating smart contract: chain code registration failed: container exited with 1
Possible Fixes:
- Review your smart contract for possible syntax error
- Change the name of your smart contract and start a newer version with a different name and version.
Medium Article: https://medium.com/@ayoakinola/a-digital-identity-smart-contract-built-on-hyperledger-fabric-184373723fca
Thanks. click the share button if you think this will benefit your network. 🙏