Web3js
就像在 web3.js 中一樣,從 signTypedData_v4 方法中獲得與簽名相同的簽名?
根據這個方案(沒有 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 ) )
以下是一些範例: