Fabric v1.2私有数据使用大致步骤

1. 创建collections_config.json文件

内容:

[
 {
       "name": "collectionMarbles",//
       "policy": "OR('Org1MSP.member', 'Org2MSP.member')",
       "requiredPeerCount": 0,
       "maxPeerCount": 3,
       "blockToLive":1000000
  },
 
  {
       "name": "collectionMarblePrivateDetails",
       "policy": "OR('Org1MSP.member')",
       "requiredPeerCount": 0,
       "maxPeerCount": 3,
       "blockToLive":3
  }
]
  • name:集合的名称。
  • policy:定义允许持久保存集合数据的组织peer
  • requiredPeerCount:传播私有数据所需的peer数量,作为认可链码的条件
  • maxPeerCount:出于数据冗余目的,当前认可peer将尝试将数据分发到的其他peer的数量。如果支持peer发生故障,那么如果有请求提取私有数据,则这些其他peer在提交时可用。
  • blockToLive:对于非常敏感的信息,例如定价或个人信息,此值表示数据应以块为单位存储在私有数据库中的时间。数据将在私有数据库上为此指定数量的块生效,之后将被清除,从而使这些数据从网络中过时。要无限期地保留私有数据,即永远不要清除私有数据,请将blockToLive属性设置为0

2. 编写智能合约

说明:chaincode API 查询数据库中的私有数据GetPrivateData()和将私有数据存储到专用数据库中PutPrivateData()

例如:

package main

import (

         "bytes"

         "encoding/json"

         "fmt"

         "github.com/hyperledger/fabric/core/chaincode/shim"

         pb "github.com/hyperledger/fabric/protos/peer"

)

// SimpleChaincode example simple Chaincode implementation

type SimpleChaincode struct {

}

func (t *SimpleChaincode) InitMarble(stub shim.ChaincodeStubInterface) pb.Response {

         // ==== Create marble object and marshal to JSON ====

         objectType := "marble"

         marble := &marble{objectType, marbleName, color, size, owner}

         marbleJSONasBytes, err := json.Marshal(marble)

         if err != nil {

                 return shim.Error(err.Error())

         }

         //Alternatively, build the marble json string manually if you don't want to use struct marshalling

    //marbleJSONasString := `{"docType":"Marble",  "name": "` + marbleName + `", "color": "` + color + `", "size": ` + strconv.Itoa(size) + `, "owner": "` + owner + `"}`

         //marbleJSONasBytes := []byte(str)

         // === Save marble to state ===

         err = stub.PutPrivateData("collectionMarbles", marbleName, marbleJSONasBytes)

         if err != nil {

                 return shim.Error(err.Error())

         }

         // ==== Save marble private details ====

         objectType = "marblePrivateDetails"

         marblePrivateDetails := &marblePrivateDetails{objectType, marbleName, price}

         marblePrivateDetailsBytes, err := json.Marshal(marblePrivateDetails)

         if err != nil {

                 return shim.Error(err.Error())

         }

         err = stub.PutPrivateData("collectionMarblePrivateDetails", marbleName, marblePrivateDetailsBytes)

         if err != nil {

                 return shim.Error(err.Error())

         }

         return shim.Success(nil)

}

func (t *SimpleChaincode) readMarble(stub shim.ChaincodeStubInterface, args []string) pb.Response {

    var name, jsonResp string

    var err error

    if len(args) != 1 {

         return shim.Error("Incorrect number of arguments. Expecting name of the marble to query")

    }

      name = args[0]

     valAsbytes, err := stub.GetPrivateData("collectionMarbles", name) //get the marble from chaincode state

    if err != nil {

         jsonResp = "{\"Error\":\"Failed to get state for " + name + "\"}"

         return shim.Error(jsonResp)

     } else if valAsbytes == nil {

          jsonResp = "{\"Error\":\"Marble does not exist: " + name + "\"}"

          return shim.Error(jsonResp)

     }

           return shim.Success(valAsbytes)

 }

// ===============================================

// readMarblereadMarblePrivateDetails - read a marble private details from chaincode state

// ===============================================

func (t *SimpleChaincode) readMarblePrivateDetails(stub shim.ChaincodeStubInterface, args []string) pb.Response {

         var name, jsonResp string

         var err error

         if len(args) != 1 {

                 return shim.Error("Incorrect number of arguments. Expecting name of the marble to query")

         }

         name = args[0]

     valAsbytes, err := stub.GetPrivateData("collectionMarblePrivateDetails", name) //get the marble private details from chaincode state

         if err != nil {

                 jsonResp = "{\"Error\":\"Failed to get private details for " + name + ": " + err.Error() + "\"}"

                 return shim.Error(jsonResp)

         } else if valAsbytes == nil {

                 jsonResp = "{\"Error\":\"Marble private details does not exist: " + name + "\"}"

                 return shim.Error(jsonResp)

         }

         return shim.Success(valAsbytes)

}

func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {

         //业务实现

         return shim.Success(nil)

}

 

func main() {

         err := shim.Start(new(SimpleChaincode))

         if err != nil {

                 fmt.Printf("Error starting Simple chaincode: %s", err)

         }

}

3. 实例化通道上的链码

peer chaincode instantiate -o orderer. qklszzn.com:7050 --tls --cafile $ORDERER_CA -C roberttestchannel -n marblesp -v 1.0 -c '{"Args":["init"]}' -P "OR('Org1MSP.member','Org2MSP.member')" --collections-config  $GOPATH/src/github.com/chaincode/marbles02_private/collections_config.json

 

4. 存储私人数据

peer chaincode invoke -o orderer. qklszzn.com:7050 --tls --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 roberttestchannel -n marblesp -c '{"Args":["initMarble","marble1","blue","35","tom","99"]}'

5. 查询私人数据

peer chaincode query -C mychannel -n marblesp -c '{"Args":["readMarble","marble1"]}'

如果觉得能帮到你,就扫码吧,谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值