【问题标题】:Can different hyperledger fabric chaincodes view all key/value pairs in world state?不同的超级账本结构链码可以查看世界状态中的所有键/值对吗?
【发布时间】:2021-10-18 12:08:27
【问题描述】:

我目前在同一个频道上提交了两个智能合约定义。两者都是用 Go 编写的,有些基础,只做基本的 CRUD 操作。但是,我注意到用一个链码编写的键/值对对另一个链码不可用。

所以,我使用go-audit 创建了以下记录:

然后,我尝试使用链码 go-asset 对密钥 ping 执行获取操作,但未找到以下错误(由链码返回)

bad request: failed to invoke go-asset: Error: No valid responses from any peers. Errors: **someurl***, status=500, message=the asset ping does not exist.

这是这样的交易:

func (c *GoAssetContract) ReadGoAsset(ctx contractapi.TransactionContextInterface, goAssetID string) (*GoAsset, error) {

    exists, err := c.GoAssetExists(ctx, hlpAssetID)
    if err != nil {
        return nil, fmt.Errorf("could not read from world state. %s", err)
    } else if !exists {
        return nil, fmt.Errorf("the asset %s does not exist", goAssetID)
    }

    bytes, _ := ctx.GetStub().GetState(goAssetID)

    goAsset := new(GoAsset)

    err = json.Unmarshal(bytes, goAsset)

    if err != nil {
        return nil, fmt.Errorf("could not unmarshal world state data to type GoAsset")
    }

    return GoAsset, nil
}

和 GoAsset 结构

// GoAsset stores a value
type GoAsset struct {
    Value string `json:"value"`
}

世界状态不应该对通道上批准/提交的所有链码都可用吗?

【问题讨论】:

    标签: hyperledger-fabric hyperledger-chaincode


    【解决方案1】:

    部署到同一通道的链代码具有命名空间,因此它们的键仍然特定于使用它们的链代码。因此,您看到部署到同一通道的 2 个链代码按设计工作,它们无法看到彼此的密钥。

    但是,一个链码可以由多个不同的合约组成,在这种情况下,这些合约可以访问彼此的密钥,因为它们仍在同一个链码部署中。

    【讨论】:

    【解决方案2】:

    您可以使用InvokeChaincode() API 在同一通道上让一个链代码调用/查询另一个链代码。被调用的链码可以将键/值返回给调用者的链码。使用这种方法,可以将所有访问控制逻辑嵌入到被调用的链代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 2019-10-04
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      相关资源
      最近更新 更多