Metamask

簽名消息:提供的地址無效,大小寫校驗和測試失敗,或者它是無法轉換的間接 IBAN 地址

  • December 19, 2021

如果地址無效,大小寫校驗和測試失敗,或者它的間接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);
     });

我仍然收到此錯誤。

我認為有兩個問題:

  1. 在 Web3.js 1.0.0 中,參數的順序是web3.eth.sign(dataToSign, accountToSignWith, callback),但您首先傳遞要簽名的帳戶。
  2. 我不認為有辦法簽署這樣的對象,但也許你知道一些我不知道的事情?

試試這個開始:

web3.eth.sign(web3.utils.sha3("test"), '0x2E290A50d3193753F156e5b0b12e4231Bd568526', function (err, result) { console.log(err, result); });

確保它有效,然後從那裡繼續簽署你想要的。

編輯

根據https://github.com/MetaMask/metamask-extension/issues/1530personal_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);
});

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