Hyperledger fabric hyperledger fabric java sdk客户端中多个组织的背书

Hyperledger fabric hyperledger fabric java sdk客户端中多个组织的背书,hyperledger-fabric,Hyperledger Fabric,使用Fabric和JavaSDK 我有一个要求,交易必须由两个组织背书,然后才能添加到分类账中 没有将多个客户端(org.peers)与频道相关联的工具-它来自client.newChannel,并具有对构造函数中单个HFClient实例的瞬时引用 单个组织背书要求我构建一个TransactionProposalRequest,并将其放入我已经创建的渠道 然后解析返回的ProposalResponse集合(每个对等方返回一个),并将其发送给订购方 我不知道如何将更多的组织加入频道 我是否需要实例

使用Fabric和JavaSDK

我有一个要求,交易必须由两个组织背书,然后才能添加到分类账中

没有将多个客户端(org.peers)与
频道
相关联的工具-它来自
client.newChannel
,并具有对构造函数中单个
HFClient
实例的瞬时引用

单个组织背书要求我构建一个
TransactionProposalRequest
,并将其放入我已经创建的渠道

然后解析返回的
ProposalResponse
集合(每个对等方返回一个),并将其发送给订购方

我不知道如何将更多的组织加入频道

我是否需要实例化更多的
HFClient
s并拥有多个
频道的副本,每个组织一个,然后逐个调用不同的频道/客户端组合并聚合响应

这(imo)意味着您需要了解链码的所有背书人,并一次只给他们打电话。对于一个由多个组织管理的联盟来说,这肯定是不正确的

我是否遗漏了什么,有没有更干净的方法


文档中的发送流似乎暗示您连接到一个客户机,并且交易被传播到所有对等方,以获得该客户机的认可

我自己正在处理这个问题,还不完全清楚

  • 在实例化链码时设置背书策略(在1个通道上)。 CLI示例:-P“或('Org1MSP.member','Org2MSP.member')”
  • (两个组织的对等方都必须加入频道并安装cc)
  • 因此,cc知道需要哪些对等方签署交易。我认为这主要应该由客户来处理。(我使用的是NodeSDK,但它们大致相同)
  • 但您仍然需要来自其他组织的端点和ca证书。我在一些IBM文档中找到了这个 '例如,如果您希望以网络中的其他对等方为目标,需要获得不属于您组织的对等方的认可,则需要获得这些对等方的正确API端点信息。您还需要为其他组织存储CA证书,以验证返回到您的应用程序的响应。此信息不会在您的服务凭据中公开,因此您必须联系Bluemix组织的相应管理员,并在带外操作中获取此信息。订购服务URL在网络中是通用的;订购服务不需要任何特定于会员的信息。”

    在节点中,我们使用一个网络配置JSON,其条目类似于(不完美)


    希望这能对你有所帮助,我期待着更好的答案。

    嗯,这比一开始看起来更糟

    如果您为该组织创建另一个客户机,并与该组织的对等方实例化另一个渠道副本,则可以从另一个对等方(集合)获得认可,但这似乎是一个可笑的复杂过程。你需要证书,但在我的情况下,我所有的组织都有证书,所以这不是问题

    因此,您有一组来自多个客户机(ORG)的响应。它们都还可以,你会认为提交给订购方就足够了,不是吗

    那不行

    order。原因:不成功。禁止-403,其他信息:未能达到1个子策略的隐式阈值,需要1剩余:权限被拒绝

    看起来您无法向订购方提交由不同组织签署的交易,而不是您的客户所代表的组织

    这让我很难受。submit to orderer(或者我喜欢的想法是-commit)不是可以分布在多个客户机上的东西。这似乎是一个原子操作


    我开始怀疑是否有人真的这样做了…

    当与另一个组织的对等方联系时,您首先需要向该组织的CA注册,以便使用对等方可以验证的凭据正确签署提案,对吗?您需要每个组织的ID/注册密码。
    "channels": {
    "peers": {
                "org1peer": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
    },
    
                "org2peer": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                }
            }
    
    "peers": {
        "org1peer": {
            "url": "grpc://org1peer.org1.com:7051",
            "eventUrl": "grpc://org1peer.org1.com:7053"
        },
    
        "org2peer": {
            "url": "grpc://org2peer.org2.com:7051",
            "eventUrl": "grpc://org2peer.org2.com:7053"
        }
    
    "organizations": {
        "Org1MSP": {
            "mspid": "Org1MSP",
            "peers": [
                "org1peer"
            ],
            "certificateAuthorities": [
                "fabric-ca1"
            ],
            "adminPrivateKey": {
                "path": "./crypto/org1/bpn/admin/msp/keystore/a4941a637013e_sk"
            },
            "signedCert": {
                "path": "./crypto/org1/bpn/org1peer/msp/signcerts/cert.pem"
            }
        },
    
        "Org2MSP": {
            "mspid": "Org2MSP",
            "peers": [
                "org2peer"
            ],
            "certificateAuthorities": [
                "fabric-ca2"
            ],
            "adminPrivateKey": {
                "path": "./crypto/org2/bpn/admin/msp/keystore/04c5a4992d5_sk"
            },
            "signedCert": {
                "path": "./crypto/org2/bpn/org2peer/msp/signcerts/cert.pem"
            }
        }
    },