【问题标题】:Vendored Chaincode has false dependencies供应商链码具有错误的依赖关系
【发布时间】:2019-11-16 11:30:17
【问题描述】:

我有具有以下目录结构的链代码

$GOPATH/myproject/chaincode/mycc/go
├── mycc.go
├── chaincode
│   └── chaincode.go
└── vendor
    ├── github.com
    ├── ...

由于我使用了超级账本 cid 包,我使用了 vendoring 并将 vendor 目录放在链代码旁边。现在对于 testablitiy,mycc.go 仅包含 main 函数:

package main

import (
    "myproject/chaincode/mycc/go/chaincode"
    "github.com/hyperledger/fabric/core/chaincode/shim"
)

func main() {
    err := shim.Start(new(chaincode.MyChaincode))
    if err != nil {
        logger.Error(err.Error())
    }
}

chaincode.go 实现了链码的其余部分,包括带有InitInvoke 等的MyChaincode 结构。相关导入与mycc.go 中的相同:

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

在链码的实例化过程中,似乎有些依赖项混淆了,因为我收到错误消息:

*chaincode.MyChaincode does not implement "chaincode/mycc/go/vendor/github.com/hyperledger/fabric/core/chaincode/shim".Chaincode (wrong type for Init method)
    have Init("chaincode/mycc/go/vendor/myproject/chaincode/mycc/go/vendor/github.com/hyperledger/fabric/core/chaincode/shim".ChaincodeStubInterface) "chaincode/approvalcc/go/vendor/ma/chaincode/approvalcc/go/vendor/github.com/hyperledger/fabric/protos/peer".Response
    want Init("chaincode/mycc/go/vendor/github.com/hyperledger/fabric/core/chaincode/shim".ChaincodeStubInterface) "chaincode/mycc/go/vendor/github.com/hyperledger/fabric/protos/peer".Response

很明显,内部链码包中的导入似乎被错误地解析了,供应商目录在路径中出现了两次。

【问题讨论】:

  • 您是否使用了peer chaincode package ... 和/或peer chaincode install ... 命令?
  • 我正在使用peer chaincode install。值得注意的是,当我将链码的所有代码放在主包中时,没有问题。我只是为了可测试性而将其拆分。
  • 好的 ... 对等 cli 尝试在打包内容时提供帮助...但请参阅下面关于将 vendor 文件夹移动到项目顶层的答案。

标签: hyperledger-fabric hyperledger-chaincode chaincode vendoring


【解决方案1】:

构建链码的fabric-ccenv 容器试图“有帮助”,但在容器内的 GOPATH 中包含shim。它最终也包含了shim/ext/... 文件夹,但不幸的是实际上并没有正确包含它们的传递依赖项。

当您将此与链代码安装/打包命令也试图提供帮助以及您尝试供应商的方式结合起来时,事情变得很糟糕。

我实际上只是推送了一个针对 1.4.2 的修复程序来解决 fabric-ccenv 问题。

【讨论】:

  • mycc.go 包含shim.Start(...) 并且位于使用peer chaincode install 安装的目录($GOPATH/myproject/chaincode/mycc/go) 上。 vendor 目录当前与此主包处于同一级别。在myproject 下方将其向上移动会导致实例化失败,因为主包使用github.com/hyperledger/fabric/core/chaincode/shim,而子包引用chaincode/mycc/go/vendor/myproject/vendor/github.com/hyperledger/fabric/core/chaincode/shim(同样的错误,关于 Init(),只是不同的导入冲突)
  • 对不起...我以为vendor 文件夹在chaincode 目录下。您使用什么工具来供应您的依赖项?
  • 您是否也供应商github.com/hyperledger/fabric/core/chaincode/shim
  • 在遇到一些问题后,我对所有软件包都使用了govendor add +external,只添加了.../shim/cid,这是首先使用供应商的原因。现在你的建议让我更有选择性,只添加cid 需要的包。这似乎已经解决了错误,因为我可以完全从供应商目录中删除 shim 包。非常感谢您在这里的帮助。需要注意的是,在销售.../shim/cid 时,也只需要销售github.com/golang/protobufgithub.com/pkg/errors
【解决方案2】:

您的 init 方法似乎未正确初始化,因此请检查链代码是否已正确安装或实例化。你可以通过查看实例化的链码 docker 容器来检查。

【讨论】:

  • 实例化失败,但仅适用于使用供应商的链码。这是供应商问题吗?问题很明显,子包的 shim 导入的解决方式与主包中的不同。出于某种原因,vendor 目录在子包中 shim 的完整导入路径中出现了两次。
  • 我不确定供应商目录,但链码的正确路径在执行链码安装命令时很重要,因为它会寻找一些确切的安装路径。
  • 当我将所有链码函数放入主包中的mycc.go 时,一切正常。这只是我非常想保留的子包的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多