Metamask
簽名消息:提供的地址無效,大小寫校驗和測試失敗,或者它是無法轉換的間接 IBAN 地址
如果地址無效,大小寫校驗和測試失敗,或者它的間接IBAN地址無法轉換,這不是欺騙,這是關於簽名消息
我的程式碼:
const msgParams = [{ type: 'string', name: 'Message', value: 'Hi, Alice!' },{ type: 'uint32', name: 'A number', value: '1337' }]; let from = Merchant.accounts[0]; console.log(window.provider); let p = window.provider; console.log(Object.keys(window.web3)); window.web3.eth.sign(from, msgParams, function(err, res) { console.log(err); console.log(res); });
(window.provider 是目前的提供者。window.web3 失去了目前的提供者,詳見我的另一個問題window.web3.currentProvider is null)
執行這個我得到標題中的錯誤
Metamask 提示簽名.. 一次。現在提示不會顯示。簽名提示中確實包含 Alice, 1337 數據。
如何使用 Metamask 對消息進行簽名以獲取該簽名消息的加密字元串?
編輯:商人是我的 Metamask 實用程序類。Merchant.accounts 的記錄輸出
$$ 0 $$是
0x2e290a50d3193753f156e5b0b12e4231bd568526
編輯2:我試過這個:
web3.eth.getAccounts(function(a,b) { Merchant.accounts = b; // alert("Saving accounts" + Merchant.accounts); console.log("Merchant accounts: " + Merchant.accounts); let x = web3.eth.getBalance; console.log(x); }); toChecksumAddress (address) { address = address.toLowerCase().replace('0x', '') var hash = createKeccakHash('keccak256').update(address).digest('hex') var ret = '0x' for (var i = 0; i < address.length; i++) { if (parseInt(hash[i], 16) >= 8) { ret += address[i].toUpperCase() } else { ret += address[i] } } return ret } reloadKeys() { const msgParams = [{ type: 'string', name: 'Message', value: 'Hi, Alice!' },{ type: 'uint32', name: 'A number', value: '1337' }]; // Merchant.accounts[0] // let addr = 0x2E290A50d3193753F156e5b0b12e4231Bd568526; let from = this.toChecksumAddress(Merchant.accounts[0]); // window.web3.utils.toChecksumAddress(); console.log(typeof(from)); console.log(from); console.log(Object.keys(window.web3)); window.web3.eth.sign(from, msgParams, function(err, res) { console.log(err); console.log(res); });
我仍然收到此錯誤。
我認為有兩個問題:
- 在 Web3.js 1.0.0 中,參數的順序是
web3.eth.sign(dataToSign, accountToSignWith, callback)
,但您首先傳遞要簽名的帳戶。- 我不認為有辦法簽署這樣的對象,但也許你知道一些我不知道的事情?
試試這個開始:
web3.eth.sign(web3.utils.sha3("test"), '0x2E290A50d3193753F156e5b0b12e4231Bd568526', function (err, result) { console.log(err, result); });
確保它有效,然後從那裡繼續簽署你想要的。
編輯
根據https://github.com/MetaMask/metamask-extension/issues/1530,
personal_sign
可能是更好的選擇:var fromAddress = '0x2E290A50d3193753F156e5b0b12e4231Bd568526'; web3.currentProvider.sendAsync({ method: 'personal_sign', params: [ web3.utils.fromAscii('hello world'), fromAddress, ], from: fromAddress, }, function (err, result) { console.log(err, result); });
編輯2
更好的是,
eth_signTypedData
:web3.currentProvider.sendAsync({ method: 'eth_signTypedData', params: [ [ { type: 'string', name: 'Message', value: 'Hi, Alice!' }, { type: 'uint32', name: 'A number', value: 1337 } ], fromAddress, ], from: fromAddress, }, function (err, result) { console.log(err, result); });