使用 Google Cloud 密钥管理服务签署以太坊交易

问题描述 投票:0回答:1

我一直在为以太坊交易管理器编写签名服务,我需要使用 Google KMS Golang API 来签署以太坊交易。我将尝试总结下面我面临的问题。

以太坊需要 R || 中的紧凑 RLP 编码 65 字节 ECDSA 签名S || V 格式。另一方面,Google KMS 的 ECDSA 签名具有额外的标头组件(R 长度、S 长度等)以及可变长度的 R 和 S 组件。这使得这些签名与以太坊交易签名不兼容。

解决这个问题的一种方法是解析从 Google KMS 获得的 ecdsa 签名中的 R 和 S 字节,计算并将 V 字节添加到末尾,然后使用此签名来获取签名的以太坊交易。像这样的东西:

var parsedSig struct{ R, S *big.Int }
_, err = asn1.Unmarshal(body, &parsedSig)
if err != nil {
    logger.WithError(err).Error("failed to parse signature bytes")
    return err
}

但是,由于以下一个或多个原因,这可能会失败:

  • 通过解析 R 和 S 分量并添加 V 分量来创建 65 字节长度的紧凑 ECDSA 签名可能像听起来一样令人不信任。如上所述,对于标准 ECDSA 签名,R 和 S 分量并不总是 32 字节长度,这意味着通过连接这些分量创建的 ECDSA 签名可能并不总是产生 64 字节。
  • 以太坊中当前签名的交易是在 RLP 编码交易后根据 Keccak-256 摘要哈希创建的,如下所示:
    // from go-ethereum
    func rlpHash(x interface{}) (h common.Hash) {
        hw := sha3.NewLegacyKeccak256()
        rlp.Encode(hw, x)
        hw.Sum(h[:0])
        return h
    }
    
    Google KMS 中的非对称 ECDSA 密钥签名不支持 Keccak-256 SHA3 消息摘要。使用 SHA-256 摘要进行以太坊交易有效吗? IMO 这会失败,因为所有交易签名验证都发生在 RLP 编码的 Keccak 哈希上。
  • 在检查了 secp256k1_ecdsa_sign_recoverable() 函数的
    secp256k1 实现
    后,我不太确定如何计算 ECDSA 签名的 V 分量。

我如何解决上述问题,以便能够使用 Google KMS 的非对称椭圆曲线签名算法创建可验证的签名以太坊交易?

ecdsa go-ethereum google-cloud-kms sha-3 keccak
1个回答
3
投票

您可以使用 GCP 签署以太坊交易(使用 secp256k1)。但它需要对“v”值进行一些计算。这是一个包含完整程序的库:

https://pkg.go.dev/github.com/pascaldekloe/[电子邮件受保护]/google

使用 SHA-256 摘要进行以太坊交易有用吗?

我也有同样的疑问。据我所知,曲线计算并不关心哈希算法。也许谷歌仅使用尺寸分类?不管怎样,SHA-256 在这里工作得很好。

https://github.com/pascaldekloe/etherkeyms/blob/096d712031548e601994c859637009eb53a08e34/google/google.go#L101

© www.soinside.com 2019 - 2024. All rights reserved.