Одна и та же структура в двух разных пакетах Golang

У меня есть этот фрагмент кода:

import (
    "github.com/golang/protobuf/proto"
    "github.com/hyperledger/fabric-protos-go/common"
    "github.com/hyperledger/fabric-protos-go/peer"
        "github.com/hyperledger/fabric-lib-go/bccsp/sw"
    mspmgmt "github.com/hyperledger/fabric/msp/mgmt"
)

.....

cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    if err != nil {
        log.Fatalf("Failed to create bccsp: %v", err)
    }

    bccsp := mspmgmt.GetIdentityDeserializer(channelId, cryptoProvider)
    if bccsp == nil {
        log.Fatalf("could not get msp for channel [%s]", channelId)
    }

И я получаю следующую ошибку:

> ./signatureValidator.go:30:54: cannot use cryptoProvider (variable of
> type "github.com/hyperledger/fabric-lib-go/bccsp".BCCSP) as
> "github.com/hyperledger/fabric/bccsp".BCCSP value in argument to
> mspmgmt.GetIdentityDeserializer:
> "github.com/hyperledger/fabric-lib-go/bccsp".BCCSP does not implement
> "github.com/hyperledger/fabric/bccsp".BCCSP (wrong type for method
> Decrypt)have Decrypt("github.com/hyperledger/fabric-lib-go/bccsp".Key,
> []byte, "github.com/hyperledger/fabric-lib-go/bccsp".DecrypterOpts)
> ([]byte, error)want Decrypt("github.com/hyperledger/fabric/bccsp".Key,
> []byte, "github.com/hyperledger/fabric/bccsp".DecrypterOpts) ([]byte,
> error)

----------------

Очевидно, cryptoProvider является экземпляром структуры, определенной в github.com/hyperledger/fabric-lib-go/bccsp, но GetIdentityDeserializer запрашивает ту же структуру, но из github.com/hyperledger/fabric/bccsp.

Я попытался удалить все экземпляры github.com/hyperledger/fabric, чтобы программа была вынуждена использовать определение из другого репозитория. Однако, поскольку мне нужно использовать github.com/hyperledger/fabric/msp/mgmt, он импортирует весь /fabric в go.mod.

Я понятия не имею, почему структура определяется дважды с разными именами. В идеале оба должны использовать определение в github.com/hyperledger/fabric-lib-go/bccsp. Есть ли у кого-нибудь опыт решения подобных проблем?

Пожалуйста, отформатируйте ошибку (несколько строк)

Christoph 02.07.2024 22:43
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
1
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я понял. «github.com/hyperledger/fabric/bccsp/sw» также является объектом и содержит ту же функцию (NewDefaultSecurityLevelWithKeystore). Не используя пакет Fabric-lib-go, я не смешиваю разные определения интерфейса BCCSP. Вероятно, мне вообще не следовало использовать эти два пакета одновременно.

import (
    "log"

    "github.com/hyperledger/fabric/bccsp/sw"
    "github.com/hyperledger/fabric/msp/mgmt"
)

func Validate() {
    cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    if err != nil {
        log.Fatalf("Failed to create bccsp: %v", err)
    }

    channelId := "1"
    deserializer := mgmt.GetIdentityDeserializer(channelId, cryptoProvider)
    if deserializer == nil {
        log.Fatalf("could not get msp for channel [%s]", channelId)
    }
}

This works - use the correct packages and run the following:

go get github.com/hyperledger/fabric/bccsp/sw
go get github.com/hyperledger/fabric/msp/mgmt
Ответ принят как подходящий

Пакет github.com/hyperledger/fabric/bccsp был перенесен в Fabric-lib-go в следующих запросах на включение:

Если вы видите bccsp как в Fabric, так и в Fabric-Lib-Go, то, скорее всего, вы используете несовпадающие версии этих модулей.

Также обратите внимание, что github.com/hyperledger/fabric не предназначен для использования в качестве библиотеки. «Кроме того» изменения (например, перемещение пакета выше) могут произойти в любое время.

Другие вопросы по теме