Hyperledger fabric Hyperledger Fabric,如何与另一个对等节点共享私有数据?

Hyperledger fabric Hyperledger Fabric,如何与另一个对等节点共享私有数据?,hyperledger-fabric,hyperledger-chaincode,Hyperledger Fabric,Hyperledger Chaincode,我正在进一步探索Hyperledger结构,并对私有数据产生了兴趣。据我所知,当对等节点创建私有数据时,它与该私有数据的哈希一起存储在该节点上。未经授权的节点将只存储私有数据的散列,以便验证其存在 我使用的是4个节点(三个对等节点,一个有序节点),其中Org1(对等节点)具有创建值的唯一权限,该值必须对Org2(对等节点)可见,但不能对Org3(对等节点)可见。有没有办法做到这一点。这是从IBM区块链平台vscode扩展教程中获取的Typescript链代码示例,用于创建私有数据 @Tr

我正在进一步探索Hyperledger结构,并对私有数据产生了兴趣。据我所知,当对等节点创建私有数据时,它与该私有数据的哈希一起存储在该节点上。未经授权的节点将只存储私有数据的散列,以便验证其存在

我使用的是4个节点(三个对等节点,一个有序节点),其中Org1(对等节点)具有创建值的唯一权限,该值必须对Org2(对等节点)可见,但不能对Org3(对等节点)可见。有没有办法做到这一点。这是从IBM区块链平台vscode扩展教程中获取的Typescript链代码示例,用于创建私有数据

    @Transaction()
    public async createMyPrivateAsset(ctx: Context, myPrivateAssetId: string): Promise<void> {
        const exists: boolean = await this.myPrivateAssetExists(ctx, myPrivateAssetId);
        if (exists) {
            throw new Error(`The asset my private asset ${myPrivateAssetId} already exists`);
        }

        const privateAsset: MyPrivateAsset = new MyPrivateAsset();

        const transientData: Map<string, Uint8Array> = ctx.stub.getTransient();
        if (transientData.size === 0 || !transientData.has('privateValue')) {
            throw new Error('The privateValue key was not specified in transient data. Please try again.');
        }
        privateAsset.privateValue = transientData.get('privateValue').toString();

        const collectionName: string = await getCollectionName(ctx);
        await ctx.stub.putPrivateData(collectionName, myPrivateAssetId, Buffer.from(JSON.stringify(privateAsset)));
    }

@Transaction()
公共异步createMyPrivateAsset(ctx:Context,myPrivateAssetId:string):承诺{
const exists:boolean=wait this.myPrivateAssetExists(ctx,myPrivateAssetId);
如果(存在){
抛出新错误(`资产my private asset${myPrivateAssetId}已存在`);
}
const privateAsset:MyPrivateAsset=new MyPrivateAsset();
const transientData:Map=ctx.stub.getTransient();
if(transientData.size==0 | |!transientData.has('privateValue')){
抛出新错误('未在瞬态数据中指定privateValue键。请重试');
}
privateAsset.privateValue=transientData.get('privateValue').toString();
const collectionName:string=await getCollectionName(ctx);
等待ctx.stub.putPrivateData(collectionName,myPrivateAssetId,Buffer.from(JSON.stringify(privateAsset));
}
我需要在这里换些东西吗


提前谢谢

是的,私有数据非常适合这种情况。 有两种基本方法

  • 使用静态集合-创建以Org1和Org2为成员的集合,并将PrivateData放入该集合
  • 使用隐式集合-将putPrivateData用于Org1隐式集合,将putPrivateData用于Org2隐式集合
  • 使用后一种方法,您不需要提前创建静态集合。如果Org3将来获得数据授权,它还允许您在以后与Org3 implicit collection共享私有数据

    有关更多详细信息,请参阅和


    注意,使用这种方法,Org3将知道Org1和Org2正在共享一些数据,但不会看到私有数据本身。如果您不想让Org3知道发生了交易,那么您可以使用Org1和Org2的通道,而不是使用私人数据。

    嘿,谢谢你,
        @Transaction()
        public async createMyPrivateAsset(ctx: Context, myPrivateAssetId: string): Promise<void> {
            const exists: boolean = await this.myPrivateAssetExists(ctx, myPrivateAssetId);
            if (exists) {
                throw new Error(`The asset my private asset ${myPrivateAssetId} already exists`);
            }
    
            const privateAsset: MyPrivateAsset = new MyPrivateAsset();
    
            const transientData: Map<string, Uint8Array> = ctx.stub.getTransient();
            if (transientData.size === 0 || !transientData.has('privateValue')) {
                throw new Error('The privateValue key was not specified in transient data. Please try again.');
            }
            privateAsset.privateValue = transientData.get('privateValue').toString();
    
            const collectionName: string = await getCollectionName(ctx);
            await ctx.stub.putPrivateData(collectionName, myPrivateAssetId, Buffer.from(JSON.stringify(privateAsset)));
        }