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 webpack
un 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:
Cree el dapp básico de trufas ejecutando los siguientes comandos:
Abra http://127.0.0.1:8081 en Chrome
web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)
en la consola de desarrollo.En resumen
Utilice web3.eth.sign()
en su lugar.
¿Por qué no web3.personal
?
A pesar web3.personal
de 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.personal
no 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.sign
hasta que se actualicen a v1. V1 todavía está en versión beta, por lo que es posible que no suceda de inmediato.