Я запускаю Metamask в Chrome.
Когда я запускаю следующее в консоли разработчика на случайной странице или даже в Etherdelta, Metamask предлагает мне подписать сообщение, и это ожидаемое поведение.
web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)
Однако, когда я пытаюсь запустить то же самое в консоли разработчика на базовом Dapp, созданном, $ truffle init webpack
я получаю сообщение об ошибке:
Uncaught TypeError: web3.personal.sign is not a function
web3.personal не имеет функции «знак», а имеет только ["_requestManager", "newAccount", "unlockAccount", "sendTransaction", "lockAccount", "listAccounts", "getListAccounts"]
на децентрализованном приложении трюфеля, но на других сайтах имеет следующее ["_requestManager", "newAccount", "importRawKey", "unlockAccount", "ecRecover", "sign", "sendTransaction", "lockAccount", "listAccounts", "getListAccounts"]
.
Примечание: web3.eth.sign(web3.eth.coinbase, '0x68656c6c6f', console.log)
все еще работает.
Почему это происходит?
Действия по воспроизведению проблемы:
Создайте базовое децентрализованное приложение трюфеля, выполнив следующие команды:
Откройте http://127.0.0.1:8081 в Chrome.
web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)
в консоли разработчика.В итоге
Используйте web3.eth.sign()
вместо этого.
Почему нет web3.personal
?
web3.personal
Насколько я могу судить, несмотря на то, что он определен в некоторых реализациях, это не стандарт.
В v0 web3.js API персональный API не указан. Как и v1, за исключением web3.eth.personal
, что может быть тем, что вам нужно.
Я считаю, что Metamask раскрывает нестандартный API web3.personal
. (Так что web3 включен в geth attach
)
Обновление: подтверждение от Metamask
В ответ от metamask на мой вопрос: «На какой спецификации вы основывались web3.personal
?»
kumavis прокомментировал 15 минут назад
@carver et al geth
thread: ethereum/go-ethereum#2940
наша реализация: https://github.com/metamask/eth-sig-util
примеры использования: https://github.com/flyswatter/js-eth-personal -знак-пример
Это подтверждает мое подозрение, что web3.personal
это не стандарт. Некоторые клиенты копируют то, что сделали другие клиенты. Это означает, что вы не можете предполагать, что это будет сделано везде одинаково.
Web3.js v0 против v1 в трюфеле
Последнее примечание к выпуску Truffle, в котором упоминается web3.js:
v3.4.6 ... Внутреннее: теперь мы используем web3 v0.20.1 внутри Truffle
Таким образом, вам придется выполнить реализацию v0 web3.js, web3.eth.sign
пока они не обновятся до v1. V1 все еще находится в стадии бета-тестирования, поэтому это может произойти не сразу.