我一直在为以太坊交易管理器编写签名服务,我需要使用 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
}
但是,由于以下一个或多个原因,这可能会失败:
// 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 的非对称椭圆曲线签名算法创建可验证的签名以太坊交易?
您可以使用 GCP 签署以太坊交易(使用 secp256k1)。但它需要对“v”值进行一些计算。这是一个包含完整程序的库:
https://pkg.go.dev/github.com/pascaldekloe/[电子邮件受保护]/google
使用 SHA-256 摘要进行以太坊交易有用吗?
我也有同样的疑问。据我所知,曲线计算并不关心哈希算法。也许谷歌仅使用尺寸分类?不管怎样,SHA-256 在这里工作得很好。