У меня есть этот фрагмент кода:
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. Есть ли у кого-нибудь опыт решения подобных проблем?
Я понял. «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
не предназначен для использования в качестве библиотеки. «Кроме того» изменения (например, перемещение пакета выше) могут произойти в любое время.
Пожалуйста, отформатируйте ошибку (несколько строк)