{"id":2736,"date":"2018-12-17T11:07:44","date_gmt":"2018-12-17T05:37:44","guid":{"rendered":"http:\/\/navveenbalani.dev\/?p=2736"},"modified":"2019-12-19T20:30:39","modified_gmt":"2019-12-19T15:00:39","slug":"deploying-trade-finance-application-on-hyperledger","status":"publish","type":"post","link":"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/","title":{"rendered":"Deploying Trade Finance application on Hyperledger"},"content":{"rendered":"\n<h3><\/h3>\n\n\n\n<p>In previous article, we showed you the network topology and the function of each network component. In this step of application deployment, we will set up this topology using Fabric based tools and commands. We will cover the whole network setup with the following steps<\/p>\n\n\n\n<ul><li>Generating crypto keys and certificates<\/li><li>Generating transaction configuration<\/li><li>Starting the network<\/li><li>Creating channel<\/li><li>Joining peers to the channel<\/li><li>Installing the chaincode<\/li><li>Instantiating the chaincode<\/li><li>Invoking the chaincode<\/li><li>\u25cf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nQuerying the ledger<\/li><\/ul>\n\n\n\n<h4><a>Generating\ncrypto keys and certificates<\/a><\/h4>\n\n\n\n<p>The first step will be to generate keys and certificates for every\norganization and its associated entities like peers and orderer so that it can\nbe used to sign\/verify as they communicate over the network. For this use case,\nas mentioned earlier, we will use &#8216;cryptogen&#8217; tool to generate the necessary\ncertificates. The following command generates the x.509 based crypto files.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OrdererOrgs:\n  - Name: Orderer\n    Domain: fte.com\n    Specs:\n      - Hostname: orderer\nPeerOrgs:\n  - Name: Org1\n    Domain: app.fte.com\n    Template:\n      Count: 2\n    Users:\n      Count: 2\n  - Name: Org2\n    Domain: bnk.com\n    Template:\n      Count: 2\n    Users:\n      Count: 2\n  - Name: Org3\n    Domain: shp.com\n    Template:\n      Count: 2\n    Users:\n      Count: 1\n<\/code><\/pre>\n\n\n\n<p>cryptogen generate &#8211;config=.\/crypto-config.yaml<\/p>\n\n\n\n<p>The above command uses the &#8216;cryptogen&#8217; tool that reads the\n&#8216;crypto-config.yaml.&#8217; file to generate the certificates. The &#8216;crypto-config.yaml&#8217;\nfile depicts our network topology in a declarative way. The following\nconfiguration shows the \u2018crypto-config.yaml.\u2019 file that has our orderer and\nthree organizations with peers and users. <\/p>\n\n\n\n<p>Peers and users are denoted by numbers (using <em>Count<\/em> field) where you can specify how\nmany users and peers you would like to setup per organization. <\/p>\n\n\n\n<h4><a>Generating\ntransaction configuration<\/a><\/h4>\n\n\n\n<p>Moving ahead, we will create transaction configuration artifacts.\nThese are stated as below:<\/p>\n\n\n\n<ul><li>Genesis block<\/li><li>Channel transaction configuration<\/li><\/ul>\n\n\n\n<p>We will use \u2018configtxgen\u2019 tool to generate the above artifacts. The\nsaid tool will read the \u2018configtx.yaml.\u2019 file. The below configuration shows\nthe \u2018configtx.yaml.\u2019 file. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Profiles:\n\n    TradeFinanceOrdererGenesis:\n        Orderer:\n            &lt;&lt;: *OrdererDefaults\n            Organizations:\n                - *OrdererOrg\n        Consortiums:\n            TradeConsortium:\n                Organizations:\n                    - *Org1\n                    - *Org2\n                    - *Org3\n                    \n    TradeFinanceOrgsChannel:\n        Consortium: TradeConsortium\n        Application:\n            &lt;&lt;: *ApplicationDefaults\n            Organizations:\n                - *Org1\n                - *Org2\n                - *Org3\n\nOrganizations:\n\n    - &amp;OrdererOrg\n        Name: OrdererOrg\n        ID: OrdererMSP\n        MSPDir: crypto-config\/ordererOrganizations\/fte.com\/msp\n\n    - &amp;Org1\n        Name: Org1FTE\n        ID: Org1FTE\n        MSPDir: crypto-config\/peerOrganizations\/app.fte.com\/msp\n\n        AnchorPeers:\n            - Host: peer0.app.fte.com\n              Port: 7051\n\n    - &amp;Org2\n        Name: Org2BNK\n        ID: Org2BNK\n        MSPDir: crypto-config\/peerOrganizations\/bnk.com\/msp\n        AnchorPeers:\n            - Host: peer0.bnk.com\n              Port: 7051\n\n    - &amp;Org3\n        Name: Org3SHP\n        ID: Org3SHP\n        MSPDir: crypto-config\/peerOrganizations\/shp.com\/msp\n        AnchorPeers:\n            - Host: peer0.shp.com\n              Port: 7051\n\nOrderer: &amp;OrdererDefaults\n\n    OrdererType: solo\n    Addresses:\n        - orderer.fte.com:7050\n    BatchTimeout: 5s\n    BatchSize:\n        MaxMessageCount: 5\n        AbsoluteMaxBytes: 10 MB\n        PreferredMaxBytes: 512 KB\n\n    Kafka:\n       Brokers:\n            - 127.0.0.1:9092\n\n    Organizations:\n\nApplication: &amp;ApplicationDefaults\n\n    Organizations:\n<\/code><\/pre>\n\n\n\n<p>The \u2018configtx.yaml\u2019 file consists of profiles for ordering service and\nchannel. The orderer profile named &#8216;TradeFinanceOrdererGenesis&#8217; will define a\nconsortium of our three organizations. The channel profile\n&#8216;TradeFinanceOrgsChannel&#8217; will have a reference to this consortium and will\nalso imply that all the three organization&#8217;s signature will be required to\ncreate that channel.&nbsp; <\/p>\n\n\n\n<p>The \u2018configtx.yaml\u2019 file also contains\ninformation like the path to root certificates for our three organizations, the\nendorsing peer with endpoint details and orderer default settings. <\/p>\n\n\n\n<h4><a>Genesis\nblock<\/a><\/h4>\n\n\n\n<p>As a first step, we will create a genesis block or the first block of\nthe transaction. It is also called a configuration block, which will describe\nour three peer organizations and an orderer stating their root certificates and\naccess policies. This block will initialize the blockchain network or channel.\nThe following command generates the genesis block<\/p>\n\n\n\n<p>configtxgen -profile TradeFinanceOrdererGenesis -outputBlock\n.\/channel-artifacts\/genesis.block<\/p>\n\n\n\n<p>The above command uses ordering service profile named &#8216;TradeFinanceOrdererGenesis&#8217;\nto generate \u2018genesis.block\u2019 file and place it in the \u2018channel-artifacts\u2019\nfolder. The \u2018genesis.block\u2019 file will be used to bootstrap the ordering\nservice.<\/p>\n\n\n\n<h4><a>Channel\ntransaction configuration<\/a><\/h4>\n\n\n\n<p>Next, we will generate channel transaction configuration file. This\nwill be used to create the channel for our network. The following command\ngenerates the channel transaction configuration file. <\/p>\n\n\n\n<p>configtxgen -profile TradeFinanceOrgsChannel -outputCreateChannelTx\n.\/channel-artifacts\/channel.tx -channelID tradechannel<\/p>\n\n\n\n<p>The above command uses channel profile named\n&#8216;TradeFinanceOrgsChannel&#8217; to generate \u2018channel.tx\u2019 configuration file and\nplaces it in the channel-artifacts folder. The said file will be used to create\nthe channel.<\/p>\n\n\n\n<h4><a>Starting\nthe network<\/a><\/h4>\n\n\n\n<p>We will start the network by spinning up our nodes. To start these\nnodes, we will use docker images provided by Fabric runtime. Docker provides a &nbsp;consistent environment to work with different\nplatforms like OS\/Mac\/Windows. Moreover, with Docker, you could also port your\napplication on the cloud. We will spin up the following nodes:<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><em>Note: We will\nonly show few docker code snippets here. To view the entire code, you can\ndownload it from the GitHub at <a href=\"https:\/\/github.com\/enterprise-blockchain-book\/first-edition\/blob\/master\/hyperledger-fabric\/base\/docker-trade-finance-base.yaml\">https:\/\/github.com\/enterprise-blockchain-book\/first-edition\/blob\/master\/hyperledger-fabric\/base\/docker-trade-finance-base.yaml<\/a><\/em> <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    image: hyperledger\/fabric-orderer\n    environment:\n      - ORDERER_GENERAL_GENESISFILE=\/var\/hyperledger\/orderer\/orderer.genesis.block\n    command: orderer\n    volumes:\n    - ..\/channel-artifacts\/genesis.block:\/var\/hyperledger\/orderer\/orderer.genesis.block\n    ports:\n      - 7050:7050\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Node: Orderer (orderer.fte.com)<\/p>\n\n\n\n<p>Below is the short docker snippet:<\/p>\n\n\n\n<p>The above docker image will spin up the orderer container on port\n7050. The important thing to observe is that we have bootstrapped our orderer\nservice with the genesis block we created earlier. It means the configuration\nblock will be created on the orderer service startup. We also specify the path\nto root certificates and key here.<\/p>\n\n\n\n<p>Node: Peer0 of Org1FTE(peer0.app.fte.com)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/p>\n\n\n\n<p>Below is the short docker snippet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    image: hyperledger\/fabric-peer\n    environment:\n      - CORE_PEER_TLS_CERT_FILE=\/etc\/hyperledger\/fabric\/tls\/server.crt\n      - CORE_PEER_TLS_KEY_FILE=\/etc\/hyperledger\/fabric\/tls\/server.key\n      - CORE_PEER_TLS_ROOTCERT_FILE=\/etc\/hyperledger\/fabric\/tls\/ca.crt\n    command: peer node start\n    ports:\n      - 7051:7051\n<\/code><\/pre>\n\n\n\n<p>The above docker image will spin up peer node container for the first\norganization. It will use 7051 as a host and container port. It also specifies\npath to crypto credentials used for signing and verification. The rest of the\npeer nodes will also use the same above docker image and environment, but each\nwill use different host port. The below are the details of other peer nodes:<\/p>\n\n\n\n<ul><li>Org1 MSP id: Org1FTE &#8211; peer1.app.fte.com &#8211;\n8051:7051<\/li><li>Org2 MSP id: Org2BNK &#8211; peer0.bnk.com &#8211; 9051:7051<\/li><li>Org2 MSP id: Org2BNK &#8211; peer1.bnk.com &#8211; 10051:7051<\/li><li>Org3 MSP id: Org3SHP &#8211; peer0.bnk.com &#8211; 11051:7051<\/li><li>Org3 MSP id: Org3SHP &#8211; peer1.bnk.com &#8211; 12051:7051<\/li><\/ul>\n\n\n\n<p>Once all the nodes are up and running, we will go\nahead and create the channel.<\/p>\n\n\n\n<h4><a>Creating\nChannel<\/a><\/h4>\n\n\n\n<p>The channel creation process reads our previously generated channel\ntransaction configuration artifact to create the channel. The following command\ncreates the channel:<\/p>\n\n\n\n<p>peer channel create -o orderer.fte.com:7050 -c tradechannel -f\n.\/channel-artifacts\/channel.tx <\/p>\n\n\n\n<p>The above command reads our previously configured\nartifact \u2018channel.tx\u2019 and creates the channel with the channel name as\n\u2018tradechannel.&#8217; The \u2018-c\u2019 flag is used to specify the channel name. The channel\nname can be any name of your choice. The \u2018-f\u2019 flag is used to specify the\nconfiguration file, in this case, it is \u2018channel.tx\u2019 we generated using\n\u2018configtxgen\u2019 tool. The command returns the genesis block named\n&#8216;tradechannel.block.&#8217; This block file is then used to make our peer nodes join\nthe &#8216;tradechannel&#8217; channel.<\/p>\n\n\n\n<h4><a>Joining\npeers to the channel<\/a><\/h4>\n\n\n\n<p>Once the channel is created, the peer nodes should formally join the\nchannel to participate in the transactions on that channel. The following\ncommand is used to onboard peers to the channel &#8216;tradechannel&#8217;.<\/p>\n\n\n\n<p>peer channel join -b tradechannel.block<\/p>\n\n\n\n<p>The above command is supplied with the channel\nblock file &#8216;tradefinance.block&#8217; we created in the previous (create channel)\ncommand. The -b&#8217; option is used to specify the channel block file. You could be\nwondering where the name of the peer node is provided for joining the\n\u2018tradechannel\u2019? The answer lies in the <em>CORE_PEER_ADDRESS<\/em>\nenvironment variable. You have to set this environment variable with the value\nof peer node address that you wish to join. Since we have 6 peer nodes, we must\nrun this command six times and change the value of the <em>CORE_PEER_ADDRESS<\/em> environment to point to the correct peer node\naddress each time we run the command. So, to join the first peer node from\nOrg1, set the <em>CORE_PEER_ADDRESS<\/em>\nvariable to the value &#8216;peer0.app.fte.com:7051&#8242; and run the above command. You\nthen update the environment variable to point to the second peer node of the\nOrg1, i.e., peer1.app.fte.com:7051&#8217; and run the command. Similarly, you do this\nfor all the peer nodes in Org2 and Org3. This way you will have all the peers\nnow becoming part of the &#8216;tradechannel&#8217; channel. In the next step, we will\ninstall the chaincode (smart contract) on all the peer nodes.<\/p>\n\n\n\n<h4><a>Installing\nthe chaincode<\/a><\/h4>\n\n\n\n<p>We will now install our trade finance chaincode file &#8216;tradefinancecontract.go&#8217;\non every peer nodes. Peer node endorses and verifies transactions invoked using\nthe chaincode. The following command installs the chaincode in the peer node\nfile system:<\/p>\n\n\n\n<p>peer chaincode install -n tradefinancecc -v 1.0 -p\ngithub.com\/hyperledger\/fabric\/examples\/chaincode\/go\/tradecontract<\/p>\n\n\n\n<p>The above command will install the chaincode\nwhich is located in the path\n&#8216;github.com\/hyperledger\/fabric\/examples\/chaincode\/go\/tradecontract&#8217; and give it\na name as &#8216;tradefinancecc&#8217;. The path denoted is mapped to volume path on the\ndocker container. It points to &#8216;hyperledger-fabric\/chaincode\/tradecontract&#8217; folder\nthat contains our chaincode file. The chaincode will be installed in the file\nsystem of the peer node. Peer node address can be specified by setting the <em>CORE_PEER_ADDRESS<\/em> environment variable\nas stated in the previous step. Since we have six peer nodes, you must run this\ncommand six times with each time updating the said environment variable to\npoint to correct peer address. The &#8216;-n&#8217; option is used to provide a name to\nchaincode, and &#8216;-p&#8217; option is used to specify the source path of our chaincode\nfile. In the next step, we will instantiate this chaincode.<\/p>\n\n\n\n<h4><a>Instantiating\nthe chaincode<\/a><\/h4>\n\n\n\n<p>Now, the chaincode &#8216;tradefinancecc&#8217; is installed on each peer, we will\ninstantiate the same. Instantiating the chaincode means initializing the\nchaincode by invoking its init() method. The following command instantiates the\nchaincode:<\/p>\n\n\n\n<p>peer chaincode instantiate -o orderer.fte.com:7050 -C tradechannel\n-n tradefinancecc -v 1.0 -c &#8216;{&#8220;Args&#8221;:[&#8220;init&#8221;,&#8221;FTE_2&#8243;,&#8221;FTE_B_1&#8243;,&#8221;FTE_S_1&#8243;,&#8221;SKU001&#8243;,&#8221;10000&#8243;,&#8221;1000&#8243;]}&#8217;\n-P &#8220;OR&nbsp; (&#8216;Org1FTE.member&#8217;,&#8217;Org2BNK.member&#8217;,&#8217;Org3SHP.member&#8217;)&#8221;<\/p>\n\n\n\n<p>The above command instantiates the chaincode on\nthe target peer (as mentioned in the <em>CORE_PEER_ADDRESS<\/em>\nenvironment variable) and launches its own isolated docker container. The\ncommand uses <em>Args<\/em> key field to pass\nthe function name <em>&#8216;Init&#8217;<\/em> and various\nother parameters to initialize our trade finance smart contract. It also sets\nthe endorsing policy by specifying which organization peers will do the\nendorsement. The policy is specified using &#8216;-P&#8217; option.<\/p>\n\n\n\n<h4><a>Invoking\nthe chaincode<\/a><\/h4>\n\n\n\n<p>With the chaincode instantiated in earlier step, we can now invoke\nbusiness methods. Invoking means calling the <em>&#8216;Invoke&#8217;<\/em> method of the chaincode, which then calls the appropriate\nbusiness method based on the method name passed as a parameter to the command.\nThe following command invokes the \u2018createLOC\u2019 method of the chaincode.<\/p>\n\n\n\n<p>peer chaincode invoke -o orderer.fte.com:7050 -C tradechannel -n\ntradefinancecc -c &#8216;{&#8220;Args&#8221;:[&#8220;createLOC&#8221;,&#8221;FTE_2&#8243;]}&#8217;<\/p>\n\n\n\n<p>The above command invokes the <em>\u2018createLOC\u2019<\/em> method on the target peer\n(as mentioned in the <em>CORE_PEER_ADDRESS<\/em>\nenvironment variable). You can point to any peer as transactions are invoked on\nall peers. If you recall, every peer maintains a copy of the ledger, and\ntherefore, all peer will execute the transaction. Once the chaincode is\ninstantiated or any business method is invoked, it starts the chaincode\ncontainers for all the peers. The above command executes <em>\u2018createLOC\u2019<\/em> method by passing the trade id. The trade status is\nthen updated to the ledger. In the next step, we will query the state of the\nledger.<\/p>\n\n\n\n<h4><a>Querying\nthe ledger<\/a><\/h4>\n\n\n\n<p>Now, since we have executed one business method named <em>\u2018createLOC&#8217;<\/em>, we will check if it indeed\nupdated the trade status. You can check the state of the ledger by giving the\nfollowing command:<\/p>\n\n\n\n<p>peer chaincode query -C tradechannel -n mycc -c\n&#8216;{&#8220;Args&#8221;:[&#8220;query&#8221;,&#8221;FTE_2&#8243;]}&#8217;<\/p>\n\n\n\n<p>The above command queries the channel by passing the trade id. The\nquery is executed on the target peer and returns the current state of the\nledger. If you view the log file of the container, you will see the trade\nstatus changed to &#8216;LOC created.&#8217;<\/p>\n\n\n\n<p>This ends our fourth stage of design and implementation approach. In the next stage, we will demonstrate the complete end-to-end flow, fulfilling our trade finance smart contract as test cases by running a single script file. <a href=\"https:\/\/navveenbalani.dev\/index.php\/uncategorized\/end-to-end-test-execution-of-trade-finance-application\/\">Click here for next article.<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In previous article, we showed you the network topology and the function of each network component. In this step of application deployment, we will set up this topology using Fabric based tools and commands. We will cover the whole network setup with the following steps Generating crypto keys and certificates Generating transaction configuration Starting the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,174],"tags":[286],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.0.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Deploying Trade Finance application on Hyperledger - Current and Future Technology Trends by Navveen Balani<\/title>\n<meta name=\"description\" content=\"Deploying Trade Finance application on Hyperledger - Articles\" \/>\n<link rel=\"canonical\" href=\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploying Trade Finance application on Hyperledger - Current and Future Technology Trends by Navveen Balani\" \/>\n<meta property=\"og:description\" content=\"Deploying Trade Finance application on Hyperledger - Articles\" \/>\n<meta property=\"og:url\" content=\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/\" \/>\n<meta property=\"og:site_name\" content=\"Current and Future Technology Trends by Navveen Balani\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-17T05:37:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-12-19T15:00:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"11 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/navveenbalani.dev\/#website\",\"url\":\"https:\/\/navveenbalani.dev\/\",\"name\":\"Current and Future Technology Trends by Navveen Balani\",\"description\":\"Current and Future Technology Trends by Navveen Balani\",\"publisher\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/navveenbalani.dev\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/#webpage\",\"url\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/\",\"name\":\"Deploying Trade Finance application on Hyperledger - Current and Future Technology Trends by Navveen Balani\",\"isPartOf\":{\"@id\":\"https:\/\/navveenbalani.dev\/#website\"},\"datePublished\":\"2018-12-17T05:37:44+00:00\",\"dateModified\":\"2019-12-19T15:00:39+00:00\",\"description\":\"Deploying Trade Finance application on Hyperledger - Articles\",\"breadcrumb\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/\",\"url\":\"https:\/\/navveenbalani.dev\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/\",\"url\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/\",\"name\":\"Deploying Trade Finance application on Hyperledger\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/#webpage\"},\"author\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"headline\":\"Deploying Trade Finance application on Hyperledger\",\"datePublished\":\"2018-12-17T05:37:44+00:00\",\"dateModified\":\"2019-12-19T15:00:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/deploying-trade-finance-application-on-hyperledger\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"keywords\":\"blockchain-guide\",\"articleSection\":\"Articles,Blockchain\",\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\",\"name\":\"Navveen\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/navveenbalani.dev\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/07\/navveen_balani.jpeg\",\"width\":200,\"height\":200,\"caption\":\"Navveen\"},\"logo\":{\"@id\":\"https:\/\/navveenbalani.dev\/#personlogo\"},\"sameAs\":[\"http:\/\/naveenbalani.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/2736"}],"collection":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/comments?post=2736"}],"version-history":[{"count":5,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/2736\/revisions"}],"predecessor-version":[{"id":2762,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/2736\/revisions\/2762"}],"wp:attachment":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/media?parent=2736"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/categories?post=2736"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/tags?post=2736"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}