Как добавить конфигурацию коллекции в Fabric SDK Go? - PullRequest
2 голосов
/ 11 июля 2019

Я работаю над добавлением личных данных в Hyperledger с использованием Fabric SDK Go, но получаю сообщение об ошибке при вызове данных.

Создание цепочки кода

ccPolicy, err := cauthdsl.FromString("AND ('Org1MSP.member','Org2MSP.member')")

resMgmt.InstantiateCC(
    setup.Org.ChannelID,
    resmgmt.InstantiateCCRequest{
        Name:    chaincodeId,
        Path:    setup.Org.ChaincodePath,
        Version: chaincodeVersion,
        Args:    [][]byte{[]byte("init")},
        Policy:  ccPolicy,
    },resmgmt.WithRetry(retry.DefaultResMgmtOpts))

collection_config.json

[
   {
       "name": "collectionMedium",
       "policy": "AND ('Org1MSP.member', 'Org2MSP.member')",
       "requiredPeerCount": 0,
       "maxPeerCount": 3,
       "blockToLive":1000000
   },
   {
       "name": "collectionPrivate",
       "policy": "OR('Org2MSP.member')",
       "requiredPeerCount": 0,
       "maxPeerCount": 3,
       "blockToLive":5
   }
]

Invoke

product := &model.Product{id, name, color, length, width}
productBytes, err1 := json.Marshal(product)

if err1 != nil {
    return shim.Error(err1.Error())
}   

err2 := stub.PutPrivateData("collectionMedium", id, productBytes)

if err2 != nil {
    return shim.Error(err2.Error())
}

Ошибка

Chaincode status Code: (500) UNKNOWN. Description: PUT_STATE failed: collection config not defined for chaincode [CC_ORG_V00], pass the collection configuration upon chaincode definition/instantiation

так,он говорит, что конфигурация коллекции не определена во время создания цепного кода.Но я не знаю точно, как добавить конфигурацию коллекции в запросе на создание цепочки кода.

, пожалуйста, предложите мне решение.

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Я могу создавать запросы CollConfig следующим образом и могу добавить конфигурацию коллекции в мой экземпляр кода цепи.

Мое решение

# CollConfig 1

var collCfg1RequiredPeerCount, collCfg1MaximumPeerCount int32
var collCfg1BlockToLive uint64

collCfg1Name              := "collectionMedium"
collCfg1BlockToLive       = 1000
collCfg1RequiredPeerCount = 0
collCfg1MaximumPeerCount  = 3
collCfg1Policy            := "OR('Org1MSP.member','Org2MSP.member')"

collCfg1, err := newCollectionConfig(collCfg1Name,collCfg1Policy, collCfg1RequiredPeerCount,collCfg1MaximumPeerCount,collCfg1BlockToLive)

if err != nil {
    return errors.WithMessage(err, "failed to create collection config 1")
}

# CollConfig 2

var collCfg2RequiredPeerCount, collCfg2MaximumPeerCount int32
var collCfg2BlockToLive uint64 

collCfg2Name              := "collectionPrivate"
collCfg2BlockToLive       = 100
collCfg2RequiredPeerCount = 0
collCfg2MaximumPeerCount  = 3
collCfg2Policy            := "OR('Org2MSP.member')"

collCfg2, err := newCollectionConfig(collCfg2Name,collCfg2Policy, collCfg2RequiredPeerCount,collCfg2MaximumPeerCount,collCfg2BlockToLive)

if err != nil {
    return errors.WithMessage(err, "failed to create collection config 1")
}

# Создание цепочки кодов

 cfg := []*cb.CollectionConfig{collCfg1,collCfg2}

resp, err := resMgmt.InstantiateCC(
    setup.Org.ChannelID,
    resmgmt.InstantiateCCRequest{

        Name:    chaincodeId,
        Path:    setup.Org.ChaincodePath,
        Version: chaincodeVersion,
        Args:    [][]byte{[]byte("init")},
        Policy:  ccPolicy,
        CollConfig: cfg,

},resmgmt.WithRetry(retry.DefaultResMgmtOpts))

# CollConfig Метод создания запроса

func newCollectionConfig(colName, policy string, reqPeerCount, maxPeerCount int32, 

blockToLive uint64) (*cb.CollectionConfig, error) {
    p, err := cauthdsl.FromString(policy)
    if err != nil {
        return nil, err
    }
    cpc := &cb.CollectionPolicyConfig{
        Payload: &cb.CollectionPolicyConfig_SignaturePolicy{
            SignaturePolicy: p,
        },
    }
    return &cb.CollectionConfig{
        Payload: &cb.CollectionConfig_StaticCollectionConfig{
            StaticCollectionConfig: &cb.StaticCollectionConfig{
                Name:              colName,
                MemberOrgsPolicy:  cpc,
                RequiredPeerCount: reqPeerCount,
                MaximumPeerCount:  maxPeerCount,
                BlockToLive:       blockToLive,
            },
        },
    }, nil }
1 голос
/ 11 июля 2019

вы должны иметь возможность предоставить его в качестве параметра для структуры InstantiateCCRequest - в частности, CollConfig - вы можете проверить структуру в Go документах -> https://github.com/hyperledger/fabric-sdk-go/blob/master/pkg/client/resmgmt/resmgmt.go#L69 и описан тип CollectionConfigздесь -> https://github.com/hyperledger/fabric-sdk-go/blob/master/third_party/github.com/hyperledger/fabric/protos/common/collection.pb.go#L69

...