"Actualizado:" ¿Cómo ver la "salida" de "web3.personal.sign" en el "navegador"? ("Método personal_sign no compatible")

Nota: actualicé el código html/ JavaScriptde acuerdo con la respuesta y usé ESTE código de muestra de META MASK para el proveedor web3. Sin embargo, recibo el mismo error. Eventualmente no entendí que necesito ejecutar testRPC o no? .

Ejecuto el siguiente html JavaScriptcódigo para generar una firma después de ejecutar testRPC y usar Meta Mask de la siguiente manera:

(1) ejecutar testRPC:

PS C:\Users\s> testrpc
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2

Available Accounts
==================
(0) 0xf4d2b942c3baebef5b81f4b909904015166b238a
(1) 0xef0d1e102d33252f232b39b31950f736ab2535aa
(2) 0x23064a138dc6b681a51a18b837a376f061fbc511
(3) 0x2dfaf5c48bc3c868f63741d6cd0489b336e74b03
(4) 0x372110011158860806d9d9b19aa67c045740727a
(5) 0x3faa74be50e1dfa86e5f6951a8c11b3e726edf65
(6) 0xaecc4c8f0b802b83a2cd84e6c98ecad6b0495c00
(7) 0x36b08ae47ec94870b98b0e0d98fca2646332ae87
(8) 0x1461cfb91f6fd2aca8d722dce9f67f7806732e49
(9) 0x1a0b2fd11e57f6473ae5f9b55e17cbfb6d8b504e

Private Keys
==================
(0) acb8b8ee76ce99fc390127ae88e246d3f8d8ac3db7
(1) 8957622705ccec21da4791f8535c70ab4726bfbe08
(2) 41181e3cf8c0294e949062a894bd96aea15e342db5
(3) c1bad63470c62b56032b034df0f0b827779e678cfd
(4) f49109620e9e56aa0bff9bdeb486d05ca75732cf1a
(5) ed1107372972a702c166924846f6d01234b9d277a7
(6) 10afce272e6a3d1d3474c385bf28be7e58de991995
(7) 0a92c9aa01497d29f01023cdeb50429954be06c949
(8) 87d0c56f9cab4c86ebc66749d0894719b647f72cea
(9) c8ca68e445b249a7d860fc3d76b210d6dd1a1c2197

HD Wallet
==================
Mnemonic:      access invest retire civil eagl
Base HD Path:  m/44'/60'/0'/0/{account_index}

(2) seleccionando 0xf4d2b942c3baebef5b81f4b909904015166b238acomo dirección del firmante.

(3) agregando 0xf4d2b942c3baebef5b81f4b909904015166b238aa Meta Mask .

(4) ejecutando el siguiente html/ JavaScriptcódigo en Google Chrome:

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>EthereumJS - Browser Example</title>
</head>

<body>
  <script src="https://rawgit.com/ethereumjs/browser-builds/master/dist/ethereumjs-abi/ethereumjs-abi-0.6.5.js"></script> 
  <script src="https://rawgit.com/ethereum/web3.js/develop/dist/web3.js"></script> 
  <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>

  <script>

window.addEventListener('load', function() {

   // Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    web3 = new Web3(web3.currentProvider);
  } else {
    console.log('No web3? You should consider trying MetaMask!')
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
  }

//  var Web3 
//  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

  function constructPaymentMessage(contractAddress, amount) 
  {
  return ethereumjs.ABI.soliditySHA3(
    ["address", "uint256"],
    [contractAddress, amount],
  );
  }

  var message = constructPaymentMessage("0x0f0f422477d83bcbed227b0ae2fa3ace7ea3c653", 100);
  console.log(message);

  web3.personal.sign("0x" + message.toString("hex"), "0xF4D2B942c3baebef5B81F4B909904015166b238A", function(err, signature) {
  console.log(signature);
  console.log(err);
  // Be sure to make use of the signature only here.
  // It will not be defined until this callback is invoked.
});

}) 
  </script>
</body>
</html>

Y el siguiente es el resultado:

ingrese la descripción de la imagen aquí

Tenga en cuenta que

Uint8Array(32) [2, 16, 48, 216, 191, 103, 173, 178, 132, 121, 144, 241, 45, 224, 83, 239, 76, 206, 69, 151, 42, 86, 174, 144, 3, 97, 172, 171, 166, 231, 234, 10]

es el messagevalor y el resultado de console.log(message);y no el valor de la firma y cuando uso console.log(signature);la salida es solo undefined.

¿ Cómo puedo ver el valor de la firma ?

Y el siguiente es el mensaje de error, resultado de console.log(err);:

Error: Método personal_sign no compatible

Error: Error: Method personal_sign not supported.
    at GethApiDouble.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89858:16)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at GethDefaults.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89767:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at FilterSubprovider.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:65832:7)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at DelayedBlockFilter.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89595:3)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at ReactiveBlockTracker.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89722:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at GethApiDouble.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89858:16)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at GethDefaults.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89767:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at FilterSubprovider.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:65832:7)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at DelayedBlockFilter.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89595:3)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at ReactiveBlockTracker.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89722:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at Object.InvalidResponse (https://rawgit.com/ethereum/web3.js/develop/dist/web3.js:3138:16)
    at https://rawgit.com/ethereum/web3.js/develop/dist/web3.js:6375:36
    at XMLHttpRequest.request.onreadystatechange (https://rawgit.com/ethereum/web3.js/develop/dist/web3.js:4377:7)

Pregunta relacionada: "ACTUALIZADO:" "Excepción de máquina virtual al procesar la transacción: revertir"

No hay razón para incluir "web3.js" y "web3.min.js". Ellos son la misma cosa.
@Shawn Tabrizi ¿Quieres decir que puedo eliminar uno de ellos? Gracias
Sí. Probablemente solo debería usar el web3.min.jsarchivo a menos que desee ver el código fuente. Ver Minificación (programación)
@Shawn Tabrizi De acuerdo con el comentario de smarxnecesito agregar MetaMast web3 providerel código. ¿Significa que necesito reemplazar HttpProvider("http://localhost:8545"))por otra cosa? Gracias
window.web3 = new Web3(web3.currentProvider);Mira mi respuesta a tu otra pregunta.
@Shawn Tabrizi actualizo mi código de acuerdo con este MetaMaskcódigo de muestra: github.com/MetaMask/faq/blob/master/DEVELOPERS.md Sin embargo, si estoy conectado, testrpcrecibo el mismo error, es decir, Method personal_sign not supportedporque testrpcno es compatible y si soy NO conectado a testrpcRecibo este error: ` localhost: 8545 0 ()` (captura de pantalla: ibb.co/dFRQpJ ) Gracias
Para tu información: ya que 1.0.0-beta.38, web3.eth.personal.signya no acepta un undefinedvalor para el tercer argumento (contraseña de la cuenta).

Respuestas (1)

La firma se envía a su devolución de llamada, que está vacía en el código que compartió. Esto debería funcionar:

web3.personal.sign("0x" + message.toString("hex"), "0xF4D2B942c3baebef5B81F4B909904015166b238A", function(err, signature) {
  console.log(signature);
  // Be sure to make use of the signature only here.
  // It will not be defined until this callback is invoked.
});

Aparte, tenga en cuenta que su código actual no usa MetaMask.

@smartx Gracias, lo reemplacé, sin embargo, todavía está undefined. Por cierto, en testrpcla terminal recibo eth_getBlockByNumberuno tras otro, ¿puede ser un problema? Gracias
Aquí está la salida de testrpc: ibb.co/fZHUid Gracias
A continuación, intente imprimir el archivo err.
Gracias, actualicé mi pregunta. Ahora erres Error: Method personal_sign not supported_ ¿por qué? Gracias
testrpcno es compatible con el método personal_sign. Deberá usar geth, Parity, MetaMask u otra cosa que admita ese método.
Gracias, estoy usando MetaMasky después de ejecutar testrpcme conecto MetaMaska private network (localhost 8545). pero sin ejecutar testrpcno puedo conectarme para localhost 8545usar MetaMask. Como puedó resolver esté problema ? gracias de nuevo
Su código debe usar el proveedor MetaMask web3. En su lugar, se está conectando directamente a testrpc. Y sí, por supuesto, debe ejecutar testrpcMetaMask para poder conectarse a él.
Gracias. Entonces, ¿quieres decir que necesito reemplazarlo HttpProvider("http://localhost:8545"))con algo más MetaMast web3 proviver? Si es así, ¿podría indicarme en qué se MetaMast providerdebe insertar HttpProvider(" ? "))? Gracias
La documentación de MetaMask ayudará.
Gracias, utilicé este código de muestra de MetaMask de aquí: enlace, ¿es lo que quiere decir como documentación de MetaMask? Actualicé mi pregunta, sin embargo, recibo el mismo error. Gracias
De hecho, si estoy conectado a, testRPCrecibo el mensaje de error anterior y si no estoy conectado, testRPCrecibo este error: web3.js:4386 OPTIONS http://localhost:8545/ 0 ()lo que significa que no estoy conectado a MetaMast provider. Estoy realmente confundido ..... Gracias
Aquí hay una captura de pantalla del error cuando no estoy conectado a testrpc: ibb.co/dFRQpJ ¿Finalmente no entendí que necesito ejecutar testrpceste javascriptcódigo o no? Gracias
Sí, como dije, necesitas ejecutar testrpc. ¿Está funcionando?
Gracias. Sí, si se está ejecutando, recibo el error anterior: personal_sign not supportedy cuando lo detengo, recibo otro error: aquí hay una captura de pantalla del error cuando testrpcNO se está ejecutando: ibb.co/dFRQpJ . Entonces, en ambos casos recibo un error. tal vez la prueba Ropstensería mejor ... no lo sé. Por favor revisa mi nuevo código, ya que lo modifiqué. Gracias
¿Estás seguro de que estás conectado a MetaMask? Ves el mensaje de la consola "¿No web3?..."?
Estos son los pasos que hago: (1) ejecutar testrpc. (2) haga clic en el icono de MetaMask y seleccione localhost 8545(3) seleccione uno de los private keysgenerados por testrpc(4) seleccione import accountde MetaMask y péguelo private keyen Paste your private key string here(5) ahora el saldo de esta dirección es 100 eth(6) pegue esta address(clave pública) en web3.personal.sign ...(7) abriendo htmlarchivo al Google Chrome(8) recibir este mensaje: No web3? You should consider trying MetaMask!& Error: Method personal_sign not supported.captura de pantalla: ibb.co/i93oRy .Thx
¿Falta algo en mis pasos? porque aparentemente no está conectado a MetaMask. Gracias
Esta respuesta: ( ethereum.stackexchange.com/a/46400/23024 ) dice que tengo que usar https://mainnet.infura.io/<APIKEY>. ¿El problema está relacionado con ejecutar mi página localmente? (Según esta respuesta) Gracias.
Ese mensaje significa que no estás usando MetaMask. (MetaMask no inyectó web3, así que lo fue undefined). Si está ejecutando su página desde una file://URL, entonces sí, este es el problema. Debe ejecutarse desde una URL http://o https://. La ejecución local está bien, pero debe ser a través de un servidor web, no del sistema de archivos.
Gracias, así que en este caso, tengo que usar ex. Paritypara conectarse a ej. Ropsteny luego use web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));en la parte superior del JavaScriptcódigo y ejecute este JSarchivo usando node filename.js? ¿Hay alguna forma mejor? Gracias
No. Puede simplemente ejecutar testrpc y luego abrir su página web en una http://URL. Cualquier servidor web servirá.
Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .