【问题标题】:panic: gob: type elliptic.p256Curve has no exported fields恐慌:gob:类型 elliptic.p256Curve 没有导出字段
【发布时间】:2022-10-08 03:11:30
【问题描述】:

当我遇到关于 gob Serialize 的问题时,我正在尝试构建一个区块链项目。 我有一个使用 elliptic.P256() 曲线结构的 struct Wallet,当我尝试序列化 Wallet 时,出现了没有导出字段的错误。

真的希望得到一些帮助。

有我的代码。

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

【问题讨论】:

  • 您可以导出elliptic.p256Curve 的字段或编写自定义函数编码/解码elliptic.p256Curve
  • 谢谢!我实际上正在尝试找到一种更简单的方法,但这很困难。我会尝试导出这些字段。

标签: go elliptic-curve gob


【解决方案1】:

您似乎在这里尝试做的是序列化 crypto/elliptic 包中的 P256 曲线。问题是P256() 函数返回一个名为elliptic.Curve 的接口。

此错误告诉您的是elliptic.Curve 的基础类型,在本例中为elliptic.p256Curve,没有任何导出的字段(以首字母大写命名)。 encoding/gob 使用的 Go 的 reflect 包仅适用于导出的字段。

您可能想尝试使用crypto/ellipticMarshal()GenerateKey() 函数。

【讨论】:

  • 谢谢!你解释得很清楚,我完全理解我的问题!我实际上是在尝试序列化一条曲线,但是加密/椭圆包中的一些没有导出的字段真的让我停下了脚步。我只能通过将所有字段更改为导出来解决问题,或者我可能尝试不序列化任何曲线。
  • 不幸的是,由于您无法控制 crypto/elliptic 包,因此无法导出字段,因为要这样做,您必须更改它们的名称,使它们以大写字母开头。基于elliptic 包中的函数签名,我相信您不应该序列化整个曲线,而是应该序列化曲线上的一个点或生成的密钥。
  • 好吧,我终于放弃序列化整条曲线来解决我的问题了~
【解决方案2】:

你最后是怎么解决这个问题的?拒绝序列化?只是交易将无法进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多