Web3js

恢復鍵入的簽名失敗,因為它太長了

  • December 5, 2019

我有一個由 EIP712 V3 生成的類型簽名。它有 132 個字元長。我正在嘗試使用recoverTypedSignaturefrom eth-sig-util來恢復它。這失敗說:

index.js:1 Error: Invalid signature length

因為它依賴於ethereumjs-util’s fromRpcSig

fromRpcSig = function (sig) {
 sig = exports.toBuffer(sig);

 // NOTE: with potential introduction of chainId this might need to be updated
 if (sig.length !== 65) {
   throw new Error('Invalid signature length');
 }

如何恢復簽名?我是否需要以某種方式將 132 個字元轉換為 65 個字元?

就我而言,答案是我錯誤地呼叫了 API 🤦🏻‍♂️

recoverTypedSignature({ data: createPayload(message), sig: signature })

是正確的。我不小心用sign(注意額外的“n”)呼叫它。

我是否需要以某種方式將 132 個字元轉換為 65 個字元?

不,sig = exports.toBuffer(sig)函式中的行fromRpcSig會為您執行此操作。

然而,為了讓它返回一個 65 字節的緩衝區,toBuffer需要接收一個 130 個十六進製字元的輸入字元串,因為每個字元(0-9;AF)代表 1/2 字節(4 位)。

因此,您的 132 個字元的字元串在這裡輸入錯誤。

現在,有可能(如果不深入檢查,我不能肯定地說)toBuffer知道如何處理"0x"輸入字元串可能以開頭的前綴。

因此,首先,您需要做的是:

  1. 確保您的字元串確實以"0x"
  2. 確保剩餘的字元都是十六進制(0-9;AF)

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