前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >超级帐本合约调用——fabric SDK Node调用TBaaS的合约

超级帐本合约调用——fabric SDK Node调用TBaaS的合约

原创
作者头像
晓明
修改2020-09-22 16:33:27
1.4K0
修改2020-09-22 16:33:27
举报
文章被收录于专栏:区块链TBaaS区块链TBaaS

TBaaS使用原生sdk使用node sdk调用示例。用户证书就是代表组织的一个用户。Connection Profile描述了网络的拓扑结构,在调用时可以编写使用到的orderer,peer,organizations即可进行合约的调用。

Hyperledger Fabric智能合约调用示例.文中所使用的合约为官网示例

1. 安装npm

yum install npm -y

2. 升级node

node -v

如果版本低于10,则需要升级node,

  • Node.js, version 10 is supported from 10.15.3 and higher
  • Node.js, version 12 is supported from 12.13.1 and higher
  • npm tool version 6 or highe

可以参考如下步骤,升级node

npm install -g n

n stable

可选 npm rebuild

参考:https://juejin.im/post/5c09e47ee51d45721d71087d

3. 安装 sdk

npm install fabric-network@1.4.10

4. 调用sdk

4.1. 生成证书

根据文档https://cloud.tencent.com/document/product/663/38395 进行生成用户公私钥,其中out_sk文件放置到wallet目录下,csr文件登录控制台并上传至用户证书模块,以及下载用户证书并复制到wallet目录下命名,nginx证书下载并放置wallet目录下

wallet是自己创建的目录,不是必须存在的。

用户证书

下载用户证书
下载用户证书

nginx证书:

4.2. 编写Connection Profile

新建Fabric SDK 文档中所描述的 Connection Profile

https://hyperledger-fabric.readthedocs.io/en/release-2.0/developapps/connectionprofile.html

示例:connection.yaml

代码语言:javascript
复制
version: 1.0.0
client:
    organization: Neworg
    connection:
        timeout:
            peer:
                endorser: '300'
                eventHub: '60'
                eventReg: '3'
            orderer: '300'
channels:
    qtardngzy:
        orderers:
        - orderer0.bclpbtf9w1ne
        peers:
            peer0.neworg.bclpbtf9w1ne:
                endorsingPeer: true
                chaincodeQuery: true
                ledgerQuery: true
                eventSource: true
                discover: true
organizations:
    Neworg:
        mspid: NeworgMSP-bclpbtf9w1ne
        peers:
        - peer0.neworg.bclpbtf9w1ne
 
orderers:
    orderer0.bclpbtf9w1ne:
        url: grpcs://neworg-bclpbtf9w1ne.tbaas.tech:8080/orderer0.bclpbtf9w1ne
        grpcOptions:
            ssl-target-name-override: nginx.bclpbtf9w1ne.tbaas
            grpc.primary_user_agent: /orderer0.bclpbtf9w1ne
        tlsCACerts:
            path: /root/fabric/wallet/nginx.pem
peers:
    peer0.neworg.bclpbtf9w1ne:
        url: grpcs://neworg-bclpbtf9w1ne.tbaas.tech:8080/peer0.neworg.bclpbtf9w1ne
        grpcOptions:
            ssl-target-name-override: nginx.bclpbtf9w1ne.tbaas
            grpc.primary_user_agent: /peer0.neworg.bclpbtf9w1ne
        tlsCACerts:
            path: /root/fabric/wallet/nginx.pem

参数说明:

client:

organization: Neworg

组织名在组织管理页获取,client下其它参数不需要修改

channels:

选择要操作的channel,在通道管理页选择复制通道名

orderers,在运营监控,选择任意一个或者多个order节点

organizations:

organization: Neworg

mspid:NeworgMSP-bclpbtf9w1ne 

peers:peer0.neworg.bclpbtf9w1ne

组织管理页可以看到,选择当前帐号所在的组织的相关信息

组织
组织

orderers:

url: grpcs://neworg-bclpbtf9w1ne.tbaas.tech:8080/orderer0.bclpbtf9w1ne

外网域名/order名称

概览页和访问管理页的外网域名

ssl-target-name-override:nginx.网络根域.tbaas

tlsCACerts

ng的证书路径

peers:

url: grpcs://neworg-bclpbtf9w1ne.tbaas.tech:8080/peer0.neworg.bclpbtf9w1ne

外网域名/peer名称

4.3. 调用合约

node invoke.js

代码语言:javascript
复制
/*
 * SPDX-License-Identifier: Apache-2.0
 */
 
'use strict';
 
const Client = require('fabric-client');
const fs = require('fs');
const path = require('path');
 
const ccpPath = path.resolve(__dirname, 'wallet', 'connection.yaml');
const keyPath = path.resolve(__dirname, 'wallet', 'out_sk');
const certPath = path.resolve(__dirname, 'wallet', 'demo@neworg.bclpbtf9w1ne@client.pem');
 
var keyPEM = Buffer.from(fs.readFileSync(keyPath)).toString();
var certPEM = fs.readFileSync(certPath).toString();
 
 
async function main() {
    try {
    var client = Client.loadFromConfig(ccpPath);   
 
    await client.createUser({
        username: 'demo',
        mspid: 'NeworgMSP-bclpbtf9w1ne',
        cryptoContent: {
            privateKeyPEM: keyPEM,
            signedCertPEM: certPEM
        },
                skipPersistence: true
    });
 
    var channel = client.getChannel();
 
    var tx_object = client.newTransactionID();
     
 
    var request = {
            chaincodeId : 'qtaccgyhr',
            fcn: 'invoke',
            args: ['a', 'b','10'],
            txId: tx_object
    };
 
    var proposalResponse = await channel.sendTransactionProposal(request)
 
    request = {
            proposalResponses: proposalResponse[0],
            proposal: proposalResponse[1],
            header: proposalResponse[2]
        };
    await channel.sendTransaction(request);
 
    const tx_id = tx_object.getTransactionID();
 
    let channel_event_hubs = channel.getChannelEventHubsForOrg();
 
    const channel_event_hub = channel_event_hubs[0];
 
 
    let event_monitor = new Promise((resolve, reject) => {
        let handle = setTimeout(() => {
            channel_event_hub.unregisterTxEvent(tx_id);
                console.log('Timeout - Failed to receive the transaction event');
                reject(new Error('Timed out waiting for block event'));
        },20000);
 
        channel_event_hub.registerTxEvent(tx_id, (tx,code) => {
            channel_event_hub.unregisterTxEvent(tx_id);
                clearTimeout(handle);
                console.log(tx)
                console.log(code)
                console.log('Successfully received the transaction event');
                resolve();
        },(error)=> {
                clearTimeout(handle);
                console.log('Failed to receive the transaction event ::'+error);
                reject(error);
            });
 
        channel_event_hub.connect();
    });
 
    await Promise.all([event_monitor]);
        process.exit(0);
    } catch (error) {
        console.error(`Failed to submit transaction: ${error}`);
        process.exit(1);
    }
}
 
 
 
main();
合约调用
合约调用

Query

代码语言:javascript
复制
/*
 * SPDX-License-Identifier: Apache-2.0
 */
 
'use strict';
 
const Client = require('fabric-client');
const fs = require('fs');
const path = require('path');
const util = require('util')
const ccpPath = path.resolve(__dirname, 'wallet', 'connection_sdk.yaml');
const keyPath = path.resolve(__dirname, 'wallet', 'sdk_out_sk');
const certPath = path.resolve(__dirname, 'wallet', 'sdktest@sdkorg.bclpbtf9w1ne@client.pem');
 
var keyPEM = Buffer.from(fs.readFileSync(keyPath)).toString();
var certPEM = fs.readFileSync(certPath).toString();
 
 
async function main() {
    try {
    var client = Client.loadFromConfig(ccpPath);   
 
    await client.createUser({
        username: 'sdktest',
        mspid: 'sdkOrgMSP-bclpbtf9w1ne',
        cryptoContent: {
            privateKeyPEM: keyPEM,
            signedCertPEM: certPEM
        },
                skipPersistence: true
    });
 
    var channel = client.getChannel();
 
    var tx_object = client.newTransactionID();
     
 
    var request = {
            chaincodeId : 'qtaccgyhr',
            fcn: 'query',
            args: ['b'],
            txId: tx_object
    };
     
     
    const responsePayloads = await channel.queryByChaincode(request);
    for (let i = 0; i < responsePayloads.length; i++) {
        console.log(util.format('Query result from peer [%s]: %s', i, responsePayloads[i].toString('utf8')));
    }
 
        process.exit(0);
    } catch (error) {
        console.error(`Failed to submit transaction: ${error}`);
        process.exit(1);
    }
}
 
 
main();

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 安装npm
  • 2. 升级node
  • 3. 安装 sdk
  • 4. 调用sdk
    • 4.1. 生成证书
      • 4.2. 编写Connection Profile
        • 4.3. 调用合约
        相关产品与服务
        腾讯云区块链服务平台 TBaaS
        腾讯云区块链服务平台(Tencent Blockchain as a Service,简称TBaaS)致力于打造全球领先的企业级区块链技术平台,帮助客户、开发者及合作伙伴轻松创建和管理可托管、可扩展的区块链网络,助力产业协同发展。TBaaS 支持长安链·ChainMaker、Hyperledger Fabric等区块链底层平台,简化部署、运维及开发流程,实现业务快速上链,提升链上治理效率。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档