panic:gob:type elliptic.p256曲线没有导出字段

00jrzges  于 2023-01-15  发布在  Go
关注(0)|答案(3)|浏览(584)

我尝试构建一个区块链项目时,遇到了一个关于gob Serialize的问题。我有一个使用elliptic.P256()Curve结构的结构钱包,当我尝试序列化钱包时,出现了一个没有导出字段的bug。
真希望能得到一些帮助。
这就是我的准则。

const walletFile = "Wallets.dat"

type Wallets struct {
    WalletsMap map[string]*Wallet
}

type Wallet struct {
    PrivateKey ecdsa.PrivateKey
    PublicKey []byte
}

func (w *Wallets) SaveWallets() {
    var content bytes.Buffer

    gob.Register(elliptic.P256())

    encoder := gob.NewEncoder(&content)
    err := encoder.Encode(&w)
    if err != nil {
        log.Panic(err)
    }

    err = ioutil.WriteFile(walletFile, content.Bytes(), 0644)
    if err != nil {
        log.Panic(err)
    }

}

func NewWallets() (*Wallets, error) {
    if _, err := os.Stat(walletFile); os.IsNotExist(err) {
        wallets := &Wallets{}
        wallets.WalletsMap = make(map[string]*Wallet)
        return wallets, err
    }

    fileContent, err := ioutil.ReadFile(walletFile)
    if err != nil {
        log.Panic(err)
    }

    var wallets Wallets
    gob.Register(elliptic.P256())
    decoder := gob.NewDecoder(bytes.NewReader(fileContent))
    err = decoder.Decode(&wallets)
    if err != nil {
        log.Panic(err)
    }

    return &wallets, nil
}

问题

2022/09/18 19:42:33 gob: type elliptic.p256Curve has no exported fields
panic: gob: type elliptic.p256Curve has no exported fields
2w2cym1i

2w2cym1i1#

将您的Go版本更改为1.18.10,价格更低。由于最新的Go版本,即1.19.5,我遇到了同样的问题
我们需要用老方法来降级Go语言的版本,因为Go语言没有提供任何类似于高级版本管理器的东西。
降级Go版本的步骤:
1.卸载现有Go版本
要卸载Go,请找到Go在系统中的位置。
$where go此命令将在用户路径中定位程序文件。
要卸载,请删除/usr/local/go目录或在上一个命令中作为输出收到的源目录。使用命令$ sudo rm -rf /usr/local/go删除Go目录。
为了确认运行命令$ go version,如果您已成功删除Go目录,系统将提示 “未找到命令go”
1.安装新版本
进入downloads页面,下载与你的操作系统和架构兼容的版本发布(选择installer而不是Archive来简化操作),解压缩并解压安装包,新的Go版本就安装到你的系统中了。
之后,您需要重启终端才能使修改生效。要检查Go是否安装成功,请运行命令$go version。该命令会打印Go的安装版本。还要确保GOROOTGOPATH没有修改。

ghhkc1vu

ghhkc1vu2#

这里你似乎要做的是从crypto/elliptic包中序列化一条P256曲线,问题是P256()函数返回一个名为elliptic.Curve的接口。
这个错误告诉你的是elliptic.Curve的底层类型,在这里是elliptic.p256Curve,没有导出的字段(以首字母大写命名),encoding/gob使用的Go语言的reflect包只对导出的字段有效。
您可能希望尝试使用crypto/ellipticMarshal()GenerateKey()函数。

yqlxgs2m

yqlxgs2m3#

这个问题在Go语言的1.9.* 版本中出现。例如,安装1.8.7就可以了。安装之后一切都会正常工作。)

相关问题