Go-Ethereum
來自 Stack-Overflow 的交叉發布:使用 Google Cloud Key Management Service 簽署乙太坊交易
從問題交叉發布
我一直在為乙太坊交易管理器編寫簽名服務,我需要使用Google KMS Golang APIs簽署乙太坊交易。我將嘗試在下面總結我面臨的問題。
乙太坊需要在 R 中使用緊湊型 RLP 編碼的 65 字節 ECDSA 簽名 || 小號 || 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 簽名可能和聽起來一樣不可信。上面提到的 R 和 S 組件對於標準 ECDSA 簽名並不總是 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 簽名的 V 分量
secp256k1_ecdsa_sign_recoverable()
。我該如何解決上述問題,以便能夠使用 Google KMS 的非對稱橢圓曲線簽名算法創建可驗證的簽名乙太坊交易?
我對 GCP KMS 做了一些研究,不幸的是它不支持乙太坊中使用的 ECDSA secp256k1,所以在這種情況下無法使用它。您可以在此處找到更多詳細資訊https://stackoverflow.com/questions/58053715/how-to-set-up-a-keyvault-using-secp256k1-algorithm-in-gcp