如何解决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 举报,一经查实,本站将立刻删除。