Transactions
使用 AWS CloudHSM 簽署交易
有人知道如何正確使用 AWS CloudHSM 簽署乙太坊交易(Keccak256)嗎?
好的,
因此,當我們(我和 ShaneT)實施硬體簽名(專門儲存在 AWS CloudHSM 上的私鑰)時,我們學到了很多東西。希望這可以為您提供有關如何實現它的指南。不幸的是,我不能直接共享程式碼,因為它是我公司的 IP。
這是我們第一次在主網上使用 AWS CloudHSM 進行的實際交易 :)
注意事項:
- 大多數 HSM 產品支持專有介面和稱為 PKCS#11 的通用介面。PKCS#11 只是與 HSM 對話的標準方式的一個花哨術語。
- AWS 支持 prop 和 PKCS#11 互動,您應該使用 PKCS#11。
- Keccak256 與 HSM 無關,事實上 AWS 支持SECP256k1曲線,允許它簽署 ETH 交易。
- ECDSA(橢圓曲線數字簽名算法)大於 ETH 或 BTC。即,您可能會遇到 AWS CloudHSM 返回有效ECDSA 簽名的障礙,但它們是無效的乙太坊交易,例如,如果 HSM 返回具有**高 S**值的 sig。
- Web3 中存在許多庫,但是 JS 是主要語言,不要與之抗爭 :)
實施指南:
- 仔細遵循本指南以設置基礎架構/HSM。如果你跳過一點點,你就會得到rekt。ps 我用的是 Amazon Linux 2,比較簡單。
- 為 JS PKCS#11使用這個(石墨烯)庫,我嘗試了所有這些都是使用 imo 的。
- 如果您可以使用
ecrecover
,r
,s
和v
值來計算正確的 Eth 地址,那麼您已經完成了。簽名步驟:
打開與 HSM 的連接,使用 SECP256k1 創建一個公鑰私鑰對。
檢索該對的公鑰併計算對應的 ETH 地址。
你現在有一個 Eth 地址,HSM 擁有它的私鑰。
4)像這樣創建一個交易:
const txParams = { nonce: '0x' + nonce.toString(16), gasPrice: '0x09184e72a00', gasLimit: '0x27100', to: '0x4D8519890C77217A352d3cC978B0b74165154421', value: web3.utils.toHex(web3.utils.toWei('0.01', 'ether')), chainId: 4 };
5)使用私鑰請求籤名的句柄,請記住您正在簽署有效負載的雜湊:
const sign = session.createSign('ECDSA', yourPrivateKey); const sig = sign.once(msgHash);
- 請記住,ECDSA sig的第一個
r
和s
第二個是計算值和代表chainID 的乙太坊綁定概念。32 bytes``v
const rs = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
- CRITICAL:由於EIP-2,您必須循環直到獲得 ECDSA sig 且其
s
值位於曲線右側,否則將是錯誤的 Eth tx。即在哪裡
s < curve.n/2
if (s > curve.n / 2) id = id ^ 1; // Invert id if s of signature is over half the n
- 假設一切都正確實施,您應該能夠用來
ecrecover
檢查 HSM 創建的 sig 的有效性。if (ethUtil.ecrecover(msgHash, 27, rsvOdd.r, rsvOdd.s).toString('hex') === yourETHPublicKeyString)
如果這一切都很好,那麼你已經做到了!您現在可以送出您的 tx,它應該被開採。
這聽起來很棘手,但它是完全可行的。
問題,只是喊。