Hyperledger Fabric两机构单通道下数据共享与账本更新实现问询
嘿,这个场景刚好对应Hyperledger Fabric里的「私有数据(Private Data)」核心能力,完美解决你说的Org1只给Org2同步选定数据、更新账本的需求。我给你拆解下具体怎么操作:
核心思路:用私有数据集合(Private Data Collections)
默认情况下,Fabric通道内的所有节点会同步全量账本数据,但私有数据集合可以让你指定仅特定组织能访问和同步指定数据,公开账本里只会存储这些数据的哈希值(保证可追溯性),刚好匹配你要的「Org1仅发送选定数据给Org2」的需求。
1. 编写私有数据集合配置文件
先创建一个JSON配置文件(比如命名为collections_config.json),定义哪些组织有权访问这个私有集合:
[ { "name": "Org2SelectedData", "policy": "OR('Org1MSP.member', 'Org2MSP.member')", "requiredPeerCount": 1, "maxPeerCount": 1, "blockToLive": 0, "memberOnlyRead": true } ]
各字段说明:
name:私有集合的唯一标识policy:指定能访问该集合的组织,这里允许Org1和Org2的成员访问requiredPeerCount:至少需要多少个节点同步私有数据(这里Org2只有1个Peer,设为1即可)blockToLive:数据保留的区块数,设为0表示永久保留memberOnlyRead:仅集合内的组织能读取数据,进一步保障隐私
2. 在链码中实现私有数据的读写逻辑
链码里要明确把Org1的选定数据存入私有集合,而不是公开账本。以Go链码为例:
package main import ( "fmt" "github.com/hyperledger/fabric-contract-api-go/contractapi" ) type SmartContract struct { contractapi.Contract } // Org1调用此方法提交选定数据到私有集合 func (s *SmartContract) SubmitSelectedData(ctx contractapi.TransactionContextInterface, dataKey string, dataValue string) error { // 可选:验证调用者是Org1成员,确保只有Org1能提交数据 callerMSP, err := ctx.GetClientIdentity().GetMSPID() if err != nil { return err } if callerMSP != "Org1MSP" { return fmt.Errorf("only Org1 is authorized to submit selected data") } // 将数据存入私有集合Org2SelectedData return ctx.GetStub().PutPrivateData("Org2SelectedData", []byte(dataKey), []byte(dataValue)) } // Org2调用此方法查询私有数据 func (s *SmartContract) GetSelectedData(ctx contractapi.TransactionContextInterface, dataKey string) ([]byte, error) { return ctx.GetStub().GetPrivateData("Org2SelectedData", []byte(dataKey)) } func main() { chaincode, err := contractapi.NewChaincode(new(SmartContract)) if err != nil { fmt.Printf("Error creating selected data chaincode: %v", err) return } if err := chaincode.Start(); err != nil { fmt.Printf("Error starting selected data chaincode: %v", err) } }
逻辑很清晰:Org1提交数据时,链码会验证身份,然后把数据写入私有集合;Org2可以通过查询方法获取这些数据进行后续处理。
3. 安装并实例化链码(指定私有集合)
安装链码的操作和普通链码一致,但实例化时必须带上私有集合配置:
peer chaincode instantiate -o orderer.example.com:7050 \ --tls true \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ -C mychannel \ -n datasharecc \ -v 1.0 \ -c '{"Args":["Init"]}' \ -P "OR('Org1MSP.member','Org2MSP.member')" \ --collections-config ./collections_config.json
关键参数是--collections-config,指定我们刚才编写的私有集合配置文件,这样链码启动后就能识别并使用这个集合。
4. 执行交易与账本更新流程
- Org1提交交易:Org1的Peer调用链码的
SubmitSelectedData方法,把选定的数据提交到通道。 - 背书与排序:交易经过背书(根据你设置的背书策略,比如仅Org1背书,或者Org1+Org2共同背书)后,提交给排序节点生成区块。
- 节点同步:区块分发给通道内的Org1和Org2 Peer:
- Org1的Peer会把私有数据存入自己的私有数据库(
statedb的私有分区) - Org2的Peer会同步这份私有数据到自己的私有数据库
- 公开账本里只会存储该私有数据的哈希值,确保数据隐私
- Org1的Peer会把私有数据存入自己的私有数据库(
- Org2处理数据:Org2拿到私有数据后,可以调用链码的其他方法(比如更新业务状态),后续操作同样可以选择存入私有集合或公开账本。
额外注意点
- 背书策略调整:如果需要Org2确认数据后才生效,可以把背书策略设为
AND('Org1MSP.member','Org2MSP.member'),确保交易需要双方Peer背书才能提交。 - 数据完整性验证:Org2可以通过
GetPrivateDataHash方法获取公开账本里的哈希值,和自己私有数据库的数据哈希对比,验证数据是否被篡改。 - 权限控制:通过链码里的身份验证,可以严格限制只有Org1能提交数据,避免其他组织(未来如果加入通道)乱提交。
内容的提问来源于stack exchange,提问作者Kshitiz Sharma
相关产品推荐
相关产品推荐

