fabric private data验证

fabric private data验证

简介

区块链一些应用场景中,有一些数据只有指定的几个节点可以访问到,对同一链上的其他节点则不可见。因此在fabric中增加私密数据的概念,将数据存储在当前peer以及按照指定的规则同步到的一些peer中。

指定私密数据的同步规则
因为在fabric中对数据的操作都是对chaincode进行的。对于私密数据来说,要指定其同步规则,可以在chaincode初始化的时候指定。确定该chaincode是否涉及到私密数据,如果涉及私密数据的,指定私密数据的共享规则,目前初步设计规则包括policy(可以通过policy来指定那些组织有同步的权限),以及该数据最多需要同步的peer的数量等。

增加私密数据,交易流程:

  1. 客户端发起交易提案,交易提案内容包含链名,链码名,调用参数,客户端签名等。
  2. chaincode进行模拟执行,模拟执行的结果分为公开部分和私密部分,peer对其中的公开部分进行签名并返回给客户端,其中公开部分指公开的读写集以及私密数据读写集hash。 对于模拟执行过程中的私密数据部分,模拟执行完毕后得到的私密数据,gossip模块一方面对这些数据按照之前制定的共享规则进行分发。另一方面将这些数据提交到transient store中。接收到该私密数据的节点同样将该私密数据提交到transient store中。
  3. 客户端接收到peer返回的结果,确认是否满足背书策略。
  4. 客户端将返回结果发送给orderer做共识。可以发现在交易过程中只对模拟执行的公开部分进行处理的话。模拟执行的私密数据部分是不会放在链上的。
  5. orderer端对收到的交易,进行共识,产生新的区块。
  6. 当peer从orderer获得新的区块后,首先对区块做一些正确性的校验。Peer通过本地的transient store得到自己拥有该交易对应的私密数据集。记录新的区块,将区块中的模拟执行的公开部分的世界状态,以及私密数据都进行提交。提交之后删除transient store中对应的私密数据集。

执行命令:

peer chaincode install -n prvcc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/map

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n prvcc -v 1.0 -c '{"Args":["init"]}' -P "OR    ('Org1MSP.peer','Org2MSP.peer')" --collections-config private.policy

其中private.policy为:
[{"name":"testcollection","policy":"OR ('Org1MSP.member','Org2MSP.member')","requiredPeerCount":1,"maxPeerCount":2},{"name":"testcollection1","policy":"OR ('Org1MSP.member')","requiredPeerCount":1,"maxPeerCount":2},{"name":"testcollection2","policy":"OR ('Org2MSP.member')","requiredPeerCount":1,"maxPeerCount":2}]

发起交易:
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n prvcc -v 1.0 -c '{"Args":["putPrivate","testcollection1","1","111111"]}'   

查询:
peer chaincode query -C $CHANNEL_NAME -n prvcc -v 1.0 -c '{"Args":["getPrivate","testcollection1","2"]}'

最终结果,和指定的私密数据的规则一致,私密数据对有些节点可见,对另外的节点不可见。

猜你喜欢

转载自blog.csdn.net/yunlilang/article/details/79726682