Mensaje de firma: 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

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.

¿ Has probado 0x2E290A50d3193753F156e5b0b12e4231Bd568526? (Eso tiene la suma de verificación de mayúsculas correcta).
¿Cuál es la diferencia?
La diferencia es la capitalización.
@smarx Intenté let addr = "0x2E290A50d3193753F156e5b0b12e4231Bd568526"; let from = this.toChecksumAddress(addr); window.web3.eth.sign (de ... mismo error

Respuestas (4)

Creo que hay dos problemas:

  1. En Web3.js 1.0.0, el orden de los parámetros es web3.eth.sign(dataToSign, accountToSignWith, callback), pero primero pasa la cuenta para iniciar sesión.
  2. No creo que haya una manera de firmar objetos así, aunque tal vez sepas algo que yo no.

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_signpuede 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);
});
¡Oye, puedo firmar un mensaje cuando cambio el segundo parámetro para que sea una de mis direcciones! Así que lo marcaré como correcto por ahora. Sin embargo, si cambio el primer parámetro a una cadena normal, por ejemplo. "prueba", cuando hago clic en el signo Metamask permanece atascado girando (impar). Mi intención detrás de este proceso es firmar un mensaje que demuestre que el firmante del mensaje es la dirección que dice ser.
Creo que los datos a firmar deben ser de 32 bytes. Cuando pruebo con una cadena más corta e inspecciono la ventana emergente de MetaMask, veo un error registrado en la consola: "la longitud del mensaje no es válida". Consulte github.com/MetaMask/metamask-extension/issues/1530 .
Gracias, no me sale error solo un molinete en metamask
Si hace clic derecho en la ventana emergente de MetaMask y hace clic en "inspeccionar" y luego ve la consola, debería ver un error allí que, cuando se expande, tiene el mensaje que mencioné.
Además, por favor vea mi edición. Según ese problema de GitHub, es posible que prefiera usar personal_sign. La interfaz de usuario es mucho mejor.
El clic derecho no funcionará, no hay menú en Metamask. En Mac, tal vez sea por eso. (Acabo de comprobar la consola normal de las herramientas para desarrolladores)
Extraño. También estoy en una Mac. En cualquier caso, creo que conocemos el problema.
Y mira mi segunda edición para usar signTypedData, que parece ser lo que buscabas.
Genial, puedo firmar TypedData para verificar un mensaje y luego recuperarlo consigUtil.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

Hola. web3.toChecksumADdress no está definido. web3.eth.iban.checksum var i = new web3.eth.iban("XE81ETHXREGGAVOFYORK");es de la documentación... no veo una forma clara de usarlo
Es posible que esté utilizando una versión beta de web3 1.0.0. Si es así, web3.utils.toChecksumAddressen su lugar.
Hola @smarx, estoy usando beta y probé web3.utils.toChecksumAddress. Me sale el mismo error.
@smarx parece que hay una forma de firmar objetos. medium.com/metamask/… , github.com/danfinlay/js-eth-personal-sign-examples << parece funcionar en la parte de firma, necesita probar la verificación

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

# 1 es el hash de TX. Resultado de la transacción != dirección del contrato

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.

Como está escrito actualmente, su respuesta no está clara. Edite para agregar detalles adicionales que ayudarán a otros a comprender cómo esto aborda la pregunta formulada . Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda .