Предоставленный адрес недействителен, проверка контрольной суммы заглавных букв не удалась, или это косвенный адрес 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);
});
Я все еще получаю эту ошибку.
Я думаю, что есть две проблемы:
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);
});
personal_sign
. Пользовательский интерфейс намного лучше.signTypedData
, которое, кажется, было тем, что вам нужно.sigUtil.recoverTypedSignature({ data: msgParams, sig: result.result })
Для подписи требуется адрес с контрольной суммой, который можно сгенерировать с помощью функции web3 toChecksumAddress
. Таким образом, ваш код должен быть скорректирован следующим образом:
let from = web3.toChecksumAddress(Merchant.accounts[0]);
Контрольная сумма рассчитывается путем заглавных букв в соответствии с алгоритмом, разработанным Виталком в EIP-55.
web3.eth.iban.checksum var i = new web3.eth.iban("XE81ETHXREGGAVOFYORK");
взято из документации... я не вижу ясного способа его использованияweb3.utils.toChecksumAddress
то вместо.web3.utils.toChecksumAddress
. Я получаю ту же ошибку.Адрес результата транзакции Remix, который я копирую для использования в качестве контракта, на самом деле больше не действителен для web3 в качестве хэша контракта (я не знаю, почему). Я зашел на etherscan.io и увидел все транзакции с моего адреса , нажал на последнее «создание контракта» , который дал мне адрес, отличный от вывода ремикса.
Я использовал этот адрес, и эта ошибка заканчивается.
1 — Выходной хэш ремикса из контракта : 0x866e8ea2987873e4a0b985a5f408181c2b476cc9cf74f41dbb1e5e2231633821
была аналогичная проблема, попробуйте скопировать адрес непосредственно из bscscan и передать его в виде строки, например, «0xE60000», нет необходимости в преобразовании снова.
пользователь19510
0x2E290A50d3193753F156e5b0b12e4231Bd568526
? (У этого есть правильная контрольная сумма заглавных букв.)пользователь 22075
пользователь19510
пользователь 22075