Uncaught TypeError: web3.personal.sign не является функцией при использовании децентрализованного приложения, созданного с использованием трюфеля.

Я запускаю 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)все еще работает.

Почему это происходит?


Действия по воспроизведению проблемы:

  1. Создайте базовое децентрализованное приложение трюфеля, выполнив следующие команды:

    • веб-пакет инициализации трюфеля
    • компиляция трюфелей
    • трюфель мигрировать
    • нпм запустить разработчик
  2. Откройте http://127.0.0.1:8081 в Chrome.

  3. Запустите web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)в консоли разработчика.

Ответы (1)

В итоге

Используйте 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 все еще находится в стадии бета-тестирования, поэтому это может произойти не сразу.