SDK python中Hyperledger Fabric的服务发现

如何解决SDK python中Hyperledger Fabric的服务发现

我实际上正在使用 python SDK 在 Hyperledger Fabric 中进行服务发现。我面临的问题是发现功能不使用随机对等点发送交易,它只返回与超级账本网络上的活动对等点相关的信息。我在 java SDK 之前使用过它,它提供了一个功能来发送一个交易选择随机对等点并且在配置文件中只有一个对等点,如下所示:

<div style={{myStyle.map(style=> {
                     return {style.name:style.value}}}>
                    Hello Second Trial
</div>

还有这个:

Peer discoveryPeer = this.client.newPeer(this.properties.getPeer0Name(),this.properties.getPeer0Address(),peerProperties);

        // TODO: Loop on configured peers
        this.channel.addPeer(discoveryPeer,createPeerOptions().setPeerRoles(EnumSet.of(PeerRole.SERVICE_DISCOVERY,PeerRole.LEDGER_QUERY,PeerRole.EVENT_SOURCE,PeerRole.CHAINCODE_QUERY)));

        this.channel.initialize();
        this.initialized = true;

我在 application-dev.yml 文件中也只使用了一个对等点。 当我尝试为 pythin SDK 做同样的事情时,我有一个这样的配置文件:

    private Pair<HashMap<String,String>,CompletableFuture<TransactionEvent>> sendTransaction(
            String chainCodeName,String functionName,String[] arguments) throws Exception {
        TransactionProposalRequest tpr = this.client.newTransactionProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName(chainCodeName).build();
        tpr.setChaincodeID(cid);
        tpr.setFcn(functionName);
        tpr.setArgs(arguments);
        DiscoveryOptions discoveryOptions = createDiscoveryOptions()
                .setEndorsementSelector(ServiceDiscovery.EndorsementSelector.ENDORSEMENT_SELECTION_RANDOM)
                .setForceDiscovery(true);
        Collection<ProposalResponse> responses;
        try {
            responses = this.channel.sendTransactionProposalToEndorsers(tpr,discoveryOptions);
        } catch (Exception e1) {
            log.error("Sending trx proposal failed");
            throw (e1);

        }

并且我在我的 sdk 文件中做了两个功能:一个用于发现对等点,另一个用于发送交易......使用我在 network.json 文件中创建的内容,如下所示:

  • sdk.py :
{
  "name":"sample-network","description":"Sample network contains 4 peers (2 orgs),1 orderer and 2 cas for Python SDK testing","version":"0.1","client":{
    "organization":"Org1","credentialStore":{
      "path":"/tmp/hfc-kvs","cryptoStore":{
        "path":"/tmp/hfc-cvs"
      },"wallet":"wallet-name"
    }
  },"organizations":{
    "Orderer": {
      "mspid": "OrdererMSP","orderers": [
        "orderer1"
      ],"certificateAuthorities": [
        "ca"
      ],"users": {
        "Admin": {
          "cert": "cert_path","private_key": "key_path"
        }
      }
    },"org1":{
      "mspid":"org1msp","peers":[
        "peer1"
      ],"users": {
        "Admin": {
          "cert": "user_cert_path","private_key": "user_key_path"
      }
    }
  }
},"orderers":{
    "orderer1":{
      "url":"orderer1:7052","grpcOptions":{
        "grpc.ssl_target_name_override":"orderer1","grpc-max-send-message-length":15
      },"tlsCACerts":{
        "path":"ca_cert_path"
      }
    }
  },"peers":{
    "peer1":{
      "url":"peer1:7065","eventUrl":"peer1:7066","grpcOptions":{
        "grpc.ssl_target_name_override":"peer1","grpc.http2.keepalive_time":1000
      },"certificateAuthorities":{

  }
}

这是一个额外的配置文件,我用来获取频道名称和其他有用的信息:

import asyncio
from BerryStorageProxy.tools.HyperledgerFabric.hfc.fabric import Client 
from BerryStorageProxy.tools.HyperledgerFabric.hfc.fabric.peer import Peer
import os 
import sys
sys.path.append(os.path.abspath('.'))

from digitalberry.util.helpers import decorate_all_functions,log_on_call
from digitalberry.util.json import parse_config
import logging
import json
from BerryStorageProxy.settings import CONF_FILE_HLF



consoleHandler = logging.StreamHandler()
_logger = logging.getLogger(__name__)

_logger.setLevel(logging.DEBUG)
_logger.addHandler(consoleHandler)



@decorate_all_functions(log_on_call)
class SDK_HLF:

        def __init__(self):
    
                try:
                        with open(CONF_FILE_HLF) as config_file:
                                conf = json.load(config_file)
                except FileNotFoundError:
                        msg='Couldn\'t load configuration file: {}'.format(CONF_FILE_HLF)
                        _logger.error(msg)
                        raise FileNotFoundError(msg)
                except json.decoder.JSONDecodeError:
                        msg='Invalid JSON file: {}'.format(CONF_FILE_HLF)
                        _logger.error(msg)
                        raise ValueError(msg)
                
                _logger.debug("JSON configuration loaded successfully")

                self.loop = asyncio.new_event_loop()
                asyncio.set_event_loop(self.loop)
                

                self.config_schema={
                "type" : "object","properties" : {
                        "network_profile" : {"type" : "string"},"channel" : {"type" : "string"},"peer_org_name" : {"type" : "string"},"username" : {"type" : "string"},},"required" : ["network_profile","channel","peer_org_name","username",]
                }

                try:
                        parse_config(self.config_schema,conf)
                except Exception:
                        message="Error validating the JSON conf:\n{}".format(conf)
                        _logger.error(message)
                        raise Exception(message)
                
                _logger.debug("JSON configuration valid")

                self.cli = Client(net_profile=conf['network_profile'])

                self.requestor = self.cli.get_user(conf['peer_org_name'],conf['username'])
                self.cli.new_channel(conf['channel'])
                
                


        def chaincode_invoke(self,args):
                
                response = self.loop.run_until_complete(self.cli.chaincode_invoke(
                        requestor=self.requestor,channel_name=args['channel'],peers=args['peer'],args=args['cc_args'],cc_name=args['cc_name'],fcn=args['cc_func'],transient_map=None,))
                _logger.debug("Chaincode invoke response")
                _logger.debug(response)
                return response


        def chaincode_query(self,args):
        
                response = self.loop.run_until_complete(self.cli.chaincode_query(
                        requestor=self.requestor,fcn=args['cc_func']
                        ))
                        
                _logger.debug("Chaincode query response")
                _logger.debug(response)
                return response

        def channel_discovery(self): 

                response = self.loop.run_until_complete(self.cli.query_peers(requestor=self.requestor,peer='peer1',channel='channel1',local=False,decode=True))
                _logger.debug("Chaincode query response")
                _logger.debug(response)
                return response

当我完成所有这些操作并尝试发送交易时,它显示一条错误消息,指出未找到请求的对等方。 您能否帮助我使用发现系统发送请求,而无需像 java 案例那样将所有对等点放在我的 network.json 文件中? 谢谢。

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

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 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 -&gt; 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(&quot;/hires&quot;) 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&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res