更新链码后,我之前丢失了初始化数据

时间:2016-10-09 10:14:13

标签: hyperledger

每当我更改链码并进行部署时,它会返回一个新的chaincodeID,我必须再次执行init,但在生产环境中,我们不能这样做,我们只想更新链码并且历史数据必须保持健康。我联系了,https://jira.hyperledger.org/browse/FAB-22这个网址告诉我,现在hyperledger不支持链码升级,所以如果我现在需要这个怎么办?如果我误解了它,你可以告诉我。谢谢!

1 个答案:

答案 0 :(得分:3)

正如您在FAB-22中发现的,Fabric v0.5-0.6不支持链码“升级”。这种行为的原因是Fabric如何在分类帐中保存信息。 当chaincode尝试调用PutState方法时:

PutState(customKey string, value []byte) error

Fabric会自动将ChaincodeId添加到密钥中,并使用名称CHAINCODE_ID + customKey保存提供的“值”。 因此,每个链代码只能访问自己的变量。更新后,chaincode接收新的ChaincodeId和新的可见区域。

我们找到了几种解决方法来解决这个问题。

自定义升级功能

  1. 在您的链码(v1)中,您可以创建函数“readAllVars”,它使用“stub.RangeQueryState”方法从分类帐加载所有变量。
  2. 部署新版本(v2)时,您可以使用“InvokeChaincode”向(v1)发出交叉链代码请求,并从“readAllVars”读取先前的状态,然后将所有内容保存在(v2)可见区域中。
  3. DAO图层

    您可以创建单独的链代码,负责“读/写”操作。所有版本都将使用此DAO作为所有“PutState”和“GetState”请求的代理。通过这种方法,Chaincode的所有版本都可以在相同的可见区域内工作。同时,这个DAO层负责安全性,并且应该保证没有其他链路代码可以访问私人信息。