如何使用fabric-sdk-go在Hyperledger Fabric中异步或批量发送交易

如何解决如何使用fabric-sdk-go在Hyperledger Fabric中异步或批量发送交易

我想在fabric chaincode上做很多txs,如何在asyncbatch中调用它?
虽然我只发现 channelClient.Execute channelClient.Query 方法,它一个一个发送 txs 并等待 tx 在块中提交。

解决方法

在单个客户端中,在代码中,事务似乎是一项一项提交的,但如果您从广义上查看网络拓扑,则并非如此。

我会根据面料的交易流程进行说明。

  1. 多个客户端同时向多个对等方请求背书,并返回背书结果。
  2. 背书交易,即背书同时传递给orderer,orderer确定交易顺序,进行区块打包,提交给peer。
  3. 换句话说,交易被收集在排序节点中并存储在区块中。事实上,交易包含在块体中。
  • 通过增加块的批处理时间可以很容易地观察到这个过程。
  • BatchTimeout 可以在 Orderer 项下定义为 configtx.yaml 文件中通道的设置值。 fabric/sampleconfig/configtx.yaml

如果您的问题是一次从单个客户端请求多个事务,您可以通过 javascript 中的异步请求轻松实现如下。 代码部分修改了 fabric-samples/fabcar/invoke.js

使用Promise.all()

/*
 * Copyright IBM Corp. All Rights Reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

'use strict';

const { Gateway,Wallets } = require('fabric-network');
const fs = require('fs');
const path = require('path');

async function main(tx_params) {
    try {
        // load the network configuration
        const ccpPath = path.resolve(__dirname,'..','test-network','organizations','peerOrganizations','org1.example.com','connection-org1.json');
        let ccp = JSON.parse(fs.readFileSync(ccpPath,'utf8'));

        // Create a new file system based wallet for managing identities.
        const walletPath = path.join(process.cwd(),'wallet');
        const wallet = await Wallets.newFileSystemWallet(walletPath);
        console.log(`Wallet path: ${walletPath}`);

        // Check to see if we've already enrolled the user.
        const identity = await wallet.get('appUser');
        if (!identity) {
            console.log('An identity for the user "appUser" does not exist in the wallet');
            console.log('Run the registerUser.js application before retrying');
            return;
        }

        // Create a new gateway for connecting to our peer node.
        const gateway = new Gateway();
        await gateway.connect(ccp,{ wallet,identity: 'appUser',discovery: { enabled: true,asLocalhost: true } });

        // Get the network (channel) our contract is deployed to.
        const network = await gateway.getNetwork('mychannel');

        // Get the contract from the network.
        const contract = network.getContract('fabcar');

        // Submit the specified transaction.
        // createCar transaction - requires 5 argument,ex: ('createCar','CAR12','Honda','Accord','Black','Tom')
        // changeCarOwner transaction - requires 2 args,ex: ('changeCarOwner','Dave')
        await contract.submitTransaction(...tx_params);

        console.log(tx_params + ' Transaction has been submitted');

        // Disconnect from the gateway.
        await gateway.disconnect();

    } catch (error) {
        console.error(`Failed to submit transaction: ${error}`);
        process.exit(1);
    }
}

const tx1_params = ['createCar','Tom'];
const tx2_params = ['createCar','CAR13','Hyundai','Genesis','Gray','Myeongkil'];
const tx3_params = ['createCar','CAR14','Porsche','Macan','Blue','Dave'];

main(tx1_params);
main(tx2_params);
main(tx3_params);
  • 结果:标准输出
Wallet path: /Users/kmk/Project/src/github.com/hyperledger/fabric-samples/fabcar/javascript/wallet
Wallet path: /Users/kmk/Project/src/github.com/hyperledger/fabric-samples/fabcar/javascript/wallet
Wallet path: /Users/kmk/Project/src/github.com/hyperledger/fabric-samples/fabcar/javascript/wallet
createCar,CAR13,Hyundai,Genesis,Gray,Myeongkil Transaction has been submitted
createCar,CAR12,Honda,Accord,Black,Tom Transaction has been submitted
createCar,CAR14,Porsche,Macan,Blue,Dave Transaction has been submitted
  • 订购者日志
# 3 endorsments
# -> into 1 block
2020-12-30 02:15:08.948 UTC [comm.grpc.server] 1 -> INFO 096 streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.peer_address=172.30.0.1:49302 grpc.peer_subject="CN=fabric-common" grpc.code=OK grpc.call_duration=7.792537ms
2020-12-30 02:15:08.953 UTC [comm.grpc.server] 1 -> INFO 097 streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.peer_address=172.30.0.1:49304 grpc.peer_subject="CN=fabric-common" grpc.code=OK grpc.call_duration=6.326148ms
2020-12-30 02:15:08.967 UTC [comm.grpc.server] 1 -> INFO 098 streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Broadcast grpc.peer_address=172.30.0.1:49306 grpc.peer_subject="CN=fabric-common" grpc.code=OK grpc.call_duration=2.909602ms
2020-12-30 02:15:10.943 UTC [orderer.consensus.etcdraft] propose -> INFO 099 Created block [20],there are 0 blocks in flight channel=mychannel node=1
2020-12-30 02:15:10.946 UTC [orderer.consensus.etcdraft] writeBlock -> INFO 09a Writing block [20] (Raft index: 22) to ledger channel=mychannel node=1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-