TypeError no detectado: web3.personal.sign no es una función al usar un dapp creado con truffle

Estoy ejecutando Metamask en Chrome.

Cuando ejecuto lo siguiente en la consola del desarrollador en una página aleatoria o incluso Etherdelta Metamask me pide que firme un mensaje y este es el comportamiento esperado.

web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)

Sin embargo, cuando intento ejecutar lo mismo en la consola de desarrollo en la Dapp básica creada por , aparece $ truffle init webpackun error que dice:

Uncaught TypeError: web3.personal.sign is not a function

web3.personal no tiene una función de "firmar", pero solo tiene ["_requestManager", "newAccount", "unlockAccount", "sendTransaction", "lockAccount", "listAccounts", "getListAccounts"]en el dapp de trufas pero tiene lo siguiente en otros sitios ["_requestManager", "newAccount", "importRawKey", "unlockAccount", "ecRecover", "sign", "sendTransaction", "lockAccount", "listAccounts", "getListAccounts"].

Nota: web3.eth.sign(web3.eth.coinbase, '0x68656c6c6f', console.log)todavía funciona sin embargo.

¿Por qué está pasando esto?


Pasos para reproducir el problema:

  1. Cree el dapp básico de trufas ejecutando los siguientes comandos:

    • paquete web de inicio de trufa
    • compilación de trufas
    • la trufa migra
    • npm ejecutar dev
  2. Abra http://127.0.0.1:8081 en Chrome

  3. Ejecutar web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)en la consola de desarrollo.

Respuestas (1)

En resumen

Utilice web3.eth.sign()en su lugar.

¿Por qué no web3.personal?

A pesar web3.personalde estar definido en algunas implementaciones, no es un estándar por lo que puedo decir.

La API v0 web3.js no incluye la API personal. Tampoco la v1, excepto web3.eth.personal, que puede ser lo que quieras.

Creo que Metamask está exponiendo la API no estándar web3.personal. (Así es el web3 incluido en geth attach)

Actualización: Confirmación de Metamask

En respuesta de metamask a mi pregunta, "¿En qué especificación te basaste web3.personal?"

kumavis comentó hace 15 minutos

Hilo de @carver et al
geth: ethereum/go-ethereum#2940
nuestra implementación: https://github.com/metamask/eth-sig-util
ejemplos de uso: https://github.com/flyswatter/js-eth-personal -signo-ejemplo

Esto confirma mi sospecha de que web3.personalno es un estándar. Algunos clientes están copiando lo que hicieron otros clientes. Lo que significa que no puede asumir que se hará de la misma manera en todas partes.

Web3.js v0 vs v1 en Trufa

La nota de lanzamiento más reciente de Truffle que menciona web3.js es:

v3.4.6 ... Interno: ahora usamos web3 v0.20.1 dentro de Truffle

Por lo tanto, tendrá que cumplir con la implementación de v0 web3.js web3.eth.signhasta que se actualicen a v1. V1 todavía está en versión beta, por lo que es posible que no suceda de inmediato.