La dirección proporcionada no es válida, la prueba de suma de verificación de mayúsculas falló o es una dirección IBAN incorrecta que no se puede convertir no es un engaño, se trata de firmar mensajes
Mi código:
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 es el proveedor actual... window.web3 pierde su proveedor actual, vea mi otra pregunta window.web3.currentProvider is null para más detalles)
Ejecutando esto me sale el error en el titulo
Se le solicitó a Metamask que firmara... una vez. Ahora el indicador no se mostrará. El indicador de firma tenía los datos de Alice, 1337.
¿Cómo firmo un mensaje con Metamask para obtener la cadena cifrada de ese mensaje firmado?
EDITAR: Merchant es mi clase de utilidad para Metamask. La salida registrada de Merchant.accounts[0] es
0x2e290a50d3193753f156e5b0b12e4231bd568526
EDIT 2: He intentado esto:
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);
});
Todavía recibo este error.
Creo que hay dos problemas:
web3.eth.sign(dataToSign, accountToSignWith, callback)
, pero primero pasa la cuenta para iniciar sesión.Prueba esto para empezar:
web3.eth.sign(web3.utils.sha3("test"), '0x2E290A50d3193753F156e5b0b12e4231Bd568526', function (err, result) { console.log(err, result); });
Asegúrese de que funcione y luego continúe desde allí para firmar lo que desea.
EDITAR
Según https://github.com/MetaMask/metamask-extension/issues/1530 , personal_sign
puede ser una mejor opción:
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);
});
EDIT2
Mejor aún, 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
. La interfaz de usuario es mucho mejor.signTypedData
, que parece ser lo que buscabas.sigUtil.recoverTypedSignature({ data: msgParams, sig: result.result })
La firma requiere una dirección con suma de verificación que se puede generar utilizando la función web3 toChecksumAddress
. Por lo tanto, su código debe ajustarse de la siguiente manera:
let from = web3.toChecksumAddress(Merchant.accounts[0]);
El checksum se calcula poniendo en mayúscula ciertas letras hexadecimales según el algoritmo diseñado por Vitalk en EIP-55
web3.eth.iban.checksum var i = new web3.eth.iban("XE81ETHXREGGAVOFYORK");
es de la documentación... no veo una forma clara de usarloweb3.utils.toChecksumAddress
en su lugar.web3.utils.toChecksumAddress
. Me sale el mismo error.La dirección de resultado de la transacción Remix, que copio para usar como contrato, de hecho, ya no es válida para web3 como hash de contrato (no sé por qué). Fui a etherscan.io y vi todas las transacciones desde mi dirección , hice clic en la última "creación de contrato" que me da una dirección diferente a la salida de remix.
Usé esa dirección y ese error termina.
1 - Hash de salida de remezcla del contrato: 0x866e8ea2987873e4a0b985a5f408181c2b476cc9cf74f41dbb1e5e2231633821
2 - Detalles de la transacción de Etherscan
3 - Dirección del contrato: 0x525d67ef6a08ad80c0956ca04af7eb2cd02a8bf0
tuvo un problema similar, intente copiar la dirección directamente desde bscscan y pasarla como una cadena, por ejemplo, '0xE60000', no es necesario volver a convertirla.
usuario19510
0x2E290A50d3193753F156e5b0b12e4231Bd568526
? (Eso tiene la suma de verificación de mayúsculas correcta).usuario22075
usuario19510
usuario22075