Web3js

就像在 web3.js 中一樣,從 signTypedData_v4 方法中獲得與簽名相同的簽名?

  • March 10, 2022

根據這個方案(沒有 JSON.stringify),我有一個使用 Metamask 的標準類型數據對象:

在此處輸入圖像描述

如果您簽署這樣的對象:

let sig = web3.eth.accounts.sign(JSON.stringify(order), secret_key, true)

那么生成的簽名將不同於通過 signTypedData_v4 方法對 Metamask 中的類似對象進行簽名時獲得的簽名。因此,我想在 web3js 中獲得類似於 Metamask 的簽名。我怎樣才能做到這一點?先感謝您!

MetaMask Docs中,我們找到以下 JavaScript 範例signTypedData_v4。我認為這是signTypedData_v4在 web3 中實現的唯一方法。否則,您需要使用signTypedData(...)eth-sig-util 中的 MetaMasks 方法

const msgParams = JSON.stringify({
   types: {
     EIP712Domain: [
       { name: 'name', type: 'string' },
       { name: 'version', type: 'string' },
       { name: 'chainId', type: 'uint256' },
       { name: 'verifyingContract', type: 'address' },
     ],
     // Not an EIP712Domain definition
     Bid: [
       { name: 'name', type: 'string' },

     ],
     // Refer to PrimaryType
     Mail: [
       { name: 'from', type: 'Person' },
       { name: 'to', type: 'Person[]' },
       { name: 'contents', type: 'string' },
     ],
     // Not an EIP712Domain definition
     Person: [
       { name: 'name', type: 'string' },
       { name: 'wallets', type: 'address[]' },
     ],
   },
});

var from = web3.eth.accounts[0];

var params = [from, msgParams];
var method = 'eth_signTypedData_v4';

web3.currentProvider.sendAsync(
   {
     method,
     params,
     from,
   },
   function (err, result) {
     if (err) return console.dir(err);
     if (result.error) {
       alert(result.error.message);
     }
     if (result.error) return console.error('ERROR', result);
     console.log('TYPED SIGNED:' + JSON.stringify(result.result));
   }
)
let sig = web3.eth.accounts.sign(JSON.stringify(order), secret_key, true)

EIP712您正在簽署一個 JSON 字元串,根據規範這不正確

您需要簽名:

keccak256(
 abi.encodePacked(
   '0x1901', // EIP-712 prefix
   DOMAIN_SEPERATOR // a.k.a hash of domain
   hashStruct // hash of data to sign, definition - https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct
 )
)

以下是一些範例:

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