Go-Ethereum

來自 Stack-Overflow 的交叉發布:使用 Google Cloud Key Management Service 簽署乙太坊交易

  • January 3, 2021

從問題交叉發布

我一直在為乙太坊交易管理器編寫簽名服務,我需要使用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

引用自:https://ethereum.stackexchange.com/questions/73869