Hyperledger Composer NodeJS SDK — Submitting Transactions

Varun Raj
Hyperlegendary
Published in
2 min readFeb 19, 2018

In my previous article, I spoke about how to setup the Hyperledger Composer NodeJS SDK with expressJS to build your own RESTFul API for a Composer Business Network. And this article is a continuation of it where it’s about how to create and submit transactions.

CREATE ASSET DEFINITION

As the first step, let’s create an asset say “Car” in our example, which has set of properties. Define them in your model file of composer (.cto)

asset Car identified by id {
o String id
o Integer name
--> User owner
}

The above defined asset Car has three properties named id, name, owner. And in order to create a Car we need to have a transaction, thus define a transaction model as below.

transaction addNewCard {
o String id
o String name
}

As you can notice, here we’re not mentioning the owner while creating the car, since we’ll be using the getCurrentParticipant() method inside transaction processor function to get the current user and define the owner.

/**
* A transaction to send good to an organization
* @param {org.acme.addNewCard} name A human description of the parameter
* @transaction
*/
function addNewCard(transaction) {
var newCard;
var factory = getFactory();
var cId = getRandomId();
var owner = getCurrentParticipant();
return getParticipantRegistry("org.acme.Car").then(function(carRegistry) {
newCar = factory.newResource("org.acme", "Car", cId);
newCar.name = transaction.name;
newCar.owner = transaction.owner;
return carRegistry.add(newCar);
})
}

Now since we’ve everything in our network, let’s update the network with the following commands.

composer archive create -t dir -n .
composer network update -a acme-network@0.0.1.bna -c admin@acme-network

CREATING ENDPOINT FOR TRANSACTION

Next up is to create an endpoint for transaction submission. We do it with express js as follows.

app.post('/api/createCard', function (req, res) {
var transactionData = req.body.transactionData;
var cardName = req.headers.authorization;
var mynetwork = new MyNetwork(cardName);
mynetwork.init().then(function () {
return mynetwork.createCar(transactionData)
}).then(function () {
res.json({ success: true })
}).catch(function (error) {
res.status(500).json({error: error.toString()})
})
})

This is very similar to the ping method, we’re getting the transaction data from the request and passing it to createCar method in our MyNetwork Class.

createCar(transactionData) {
var _this = this;
var resource;
var transactionData;
transactionData['$class'] = "org.acme.createCar";
return this.connection.getTransactionRegistry("org.acme.createCar")
.then(function(createProductTransactionRegistry) {
serializer = _this.businessNetworkDefinition.getSerializer()
resource = serializer.fromJSON(transactionData);
return _this.connection.submitTransaction(resource);
})
}

This returns a null if the transaction is submitted successfully, else catch block is called with the captured error.

The only thing to have in mind is that we need to specify the $class in transactionData and convert it to resource format from JSON before passing it to submitTransactionfunction.

Follow us for more Hyperledger related articles.

Join us on Telegram: https://t.me/Hyperlegendary

--

--

Varun Raj
Hyperlegendary

Sr. Application Architect @SkcriptHQ | Internet Addict | Multi Platform Developer | Technology Evangelist | Crazy thinker