我在Hyperledger Fabric数据库中存储生成的ecdsa私钥时遇到问题。
我正在做的是使用ecdsa提供的ecdsa.GenerateKey(elliptic.P224(),rand.Reader)函数,并尝试使用shim的PutState()函数将该密钥存储在分类帐中。 struct中的变量类型为ecdsa.PrivateKey,但是当我尝试使chaincode似乎停止并得到以下错误时:
错误:无法组装事务:ProposalResponsePayloads不匹配-投标响应:版本:1响应:
当然,这表明两个组织对等方均未安装链码。但是我有。然后,我尝试将ecdsa.PrivateKey转换为字节,然后转换为字符串,但是似乎没有任何效果。我将在下面附加代码。
type UserDetails struct {
ObjectType string `json:"docType"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
PublicKey ecdsa.PublicKey `json:"publicKey"`
PrivateKey []byte `json:"privateKey"`
}
以上是我的结构
priv, err := ecdsa.GenerateKey(elliptic.P224(), rand.Reader)
if err != nil {
fmt.Println(err)
}
enc_key := priv.D.Bytes()
fmt.Println(enc_key)
bytesPrivK := string(enc_key)
objectType := "userDetails"
userDetailsReg := &UserDetails{objectType, firstName, lastName, *ecdsaPublicKey, enc_key}
userDetailsJSONasBytes, err := json.Marshal(userDetailsReg)
if err != nil {
return shim.Error(err.Error())
}
fmt.Println(userDetailsReg)
// === Save userDetails to state ===
err = stub.PutState(lastName, userDetailsJSONasBytes)
if err != nil {
return shim.Error(err.Error())
}
我还尝试使用ecies软件包生成ecies私钥,然后将其转换为ecdsa并存储,但是仍然存在相同的错误。我使用ecies是因为我需要使用ecies加密来加密邮件。
prv, err := ecies.GenerateKey(rand.Reader, ecies.DefaultCurve, nil)
if err != nil {
fmt.Println(err.Error())
}
eciesPrivatePem, err1 := ecies.MarshalPrivate(prv)
if err1 != nil {
fmt.Println(err1)
}
encodedToStr := string(eciesPrivatePem)
ecdsaPrivate := prv.ExportECDSA()
在这里,我尝试将其存储在ecies.PrivateKey类型中,或者存储在字符串中,甚至存储在ecdsa.PrivateKey中,但始终会得到相同的错误。
我正在为此使用Hyperledger Fabric和CouchDB。有谁知道为什么我不能将其存储为字符串?尽管其他2个变量是字符串和1个ecdsa.PublicKey类型,但即使作为字符串也不能存储它,这确实很奇怪。我在日志中找不到其他指示此处更多错误的错误。
任何帮助或建议将不胜感激。
谢谢
答案 0 :(得分:0)
我发现问题确实是由同行引起的。我得到的认可政策错误与同行有关,我很难找到解决方案。
所以,问题在于我在链式代码中将密钥存储在分类帐中,该分类帐是通过必须将随机变量rand io.Reader作为参数传递的函数生成的
该随机变量每次在每个同级中创建的方式都不同,从而导致了同级中的冲突。
最后,请记住,每次创建链码并运行它时,都将其安装在2个或更多对等点中,并且每个对等点以不同的方式运行链码!很重要。
谢谢。