Сообщение о подписи: указанный адрес недействителен, проверка контрольной суммы заглавных букв не удалась, или это косвенный адрес 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 предложил подписать.. один раз. Теперь подсказка не будет отображаться. В приглашении на подпись действительно были данные Алисы, 1337.

Как подписать сообщение с помощью Metamask, чтобы получить зашифрованную строку этого подписанного сообщения?

РЕДАКТИРОВАТЬ: Merchant — мой служебный класс для 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);
      });

Я все еще получаю эту ошибку.

Вы пробовали 0x2E290A50d3193753F156e5b0b12e4231Bd568526? (У этого есть правильная контрольная сумма заглавных букв.)
В чем разница?
Разница в капитализации.
@smarx Я пробовал let addr = "0x2E290A50d3193753F156e5b0b12e4231Bd568526"; пусть от = this.toChecksumAddress (адрес); window.web3.eth.sign(из... та же ошибка

Ответы (4)

Я думаю, что есть две проблемы:

  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/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);
});
Эй, я могу подписать сообщение, когда переключаю второй параметр на один из моих адресов! Поэтому я отмечу это как правильное на данный момент. Однако, если я изменю первый параметр на обычную строку, например. «тест», когда я нажимаю знак, метамаска останавливается (странно). Мое намерение, стоящее за этим процессом, состоит в том, чтобы подписать сообщение, доказывающее, что лицо, подписавшее сообщение, является адресом, которым, как они утверждают, они являются.
Я считаю, что данные для подписи должны быть 32 байта. Когда я пытаюсь использовать более короткую строку и проверяю всплывающее окно MetaMask, я вижу ошибку, зарегистрированную в консоли: «Длина сообщения недействительна». См. github.com/MetaMask/metamask-extension/issues/1530 .
Спасибо, я не получаю ошибку, просто вертушка в метамаске
Если вы щелкните правой кнопкой мыши всплывающее окно MetaMask и выберите «проверить», а затем просмотрите консоль, вы должны увидеть там ошибку, которая при расширении содержит сообщение, о котором я упоминал.
Кроме того, пожалуйста, смотрите мое редактирование. Основываясь на этой проблеме с GitHub, вы можете предпочесть использовать personal_sign. Пользовательский интерфейс намного лучше.
Щелчок правой кнопкой мыши не сработает — в Metamask нет меню. На Mac, может быть, поэтому. (Я только что проверил обычную консоль из инструментов разработчика)
Странный. Я тоже на Mac. В любом случае, я думаю, мы знаем, в чем дело.
И посмотрите мое второе редактирование для использования signTypedData, которое, кажется, было тем, что вам нужно.
Круто, так что я могу подписать TypedData, чтобы проверить сообщение, а затем восстановить с помощьюsigUtil.recoverTypedSignature({ data: msgParams, sig: result.result })

Для подписи требуется адрес с контрольной суммой, который можно сгенерировать с помощью функции web3 toChecksumAddress. Таким образом, ваш код должен быть скорректирован следующим образом:

let from = web3.toChecksumAddress(Merchant.accounts[0]);

Контрольная сумма рассчитывается путем заглавных букв в соответствии с алгоритмом, разработанным Виталком в EIP-55.

Привет. web3.toChecksumADdress не определен. web3.eth.iban.checksum var i = new web3.eth.iban("XE81ETHXREGGAVOFYORK");взято из документации... я не вижу ясного способа его использования
Возможно, вы используете бета-версию web3 1.0.0. Если да, web3.utils.toChecksumAddressто вместо.
Привет @smarx, я использую бета-версию и пробовал web3.utils.toChecksumAddress. Я получаю ту же ошибку.
@smarx похоже, что есть способ подписывать объекты. medium.com/metamask/… , github.com/danfinlay/js-eth-personal-sign-examples << кажется работает над частью подписи, необходимо проверить проверку

Адрес результата транзакции Remix, который я копирую для использования в качестве контракта, на самом деле больше не действителен для web3 в качестве хэша контракта (я не знаю, почему). Я зашел на etherscan.io и увидел все транзакции с моего адреса , нажал на последнее «создание контракта» , который дал мне адрес, отличный от вывода ремикса.

Я использовал этот адрес, и эта ошибка заканчивается.



1 — Выходной хэш ремикса из контракта : 0x866e8ea2987873e4a0b985a5f408181c2b476cc9cf74f41dbb1e5e2231633821

№1 — это хэш TX. Результат сделки != адрес контракта

была аналогичная проблема, попробуйте скопировать адрес непосредственно из bscscan и передать его в виде строки, например, «0xE60000», нет необходимости в преобразовании снова.

Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это относится к заданному вопросу. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре .