Как автономно запускать транзакции из Node.js?

У меня есть файл JS, работающий на NodeJS на нескольких устройствах, которые взаимодействуют друг с другом, пытаясь записывать данные в блокчейн и отправлять транзакции. Проблема в том, что каждый раз мне приходится вручную вводить пароль. Я использовал personal.unlockAccount в клиентской консоли, но это не решает ситуацию...

Я пытаюсь разработать рынок микроэлектроэнергии, на котором каждые 15 минут отправляются несколько автономных транзакций, я не могу все время сидеть перед экраном.

Есть ли способ добиться того, что я хотел бы сделать?

заранее спасибо

Не уверен насчет Parity, но Go-Ethereu unlockAccountиспользует второй аргумент — время, в течение которого учетная запись остается разблокированной.

Ответы (2)

Если personalна вашем узле включен API, вы можете взаимодействовать с ним через web3 точно так же, как через консоль.

Если я что-то автоматизирую, я обычно настраиваю службу для работы от имени изолированного пользователя в моей системе. Затем я помещу пароль для учетной записи, с которой взаимодействует пользователь, в файл в домашнем каталоге пользователя (или в другом месте) и изменю разрешения, чтобы они были доступны для чтения только этому пользователю.

Затем я буду использовать оболочку, подобную следующей, чтобы позволить мне легко разблокировать учетную запись, отправить транзакцию (или набор транзакций), а затем повторно заблокировать учетную запись:

function whileUnlocked(web3, account, pwfile, task) {
  return readFile(pwfile, 'utf8')
    .then(function(pw) {
      return web3.personal.unlockAccount(account, pw.trim())
        .then(task)
        .then(function() {
          return web3.personal.lockAccount(account)
        });
    });
}

Обратите внимание, что для этого требуется модифицированная версия web3, которая была расширена для использования промисов, поскольку это упрощает этот процесс.

Это, вероятно, можно было бы улучшить, сделав окончательный thena finally, чтобы всегда блокировать учетную запись, независимо от того, завершается ли задача неудачно.

Важные биты для вашего использования: вы хотите вызвать web3.personal.unlockAccount, передать ему обратный вызов, который делает все, что вам нужно, пока транзакция разблокирована, а затем позвонить, web3.personal.lockAccountкогда вы закончите.

Мы использовали в проходе ConsenSys' hooked-web3-provider (сейчас он устарел, они указывают на аналогичный проект https://github.com/ethjs/ethjs-provider-signer ). Таким образом, у нас есть служба, которая будет подписывать транзакции, не раскрывая закрытый ключ, например, у нас может быть аппаратный ключ.

Наша проблема personal.unlockAccountзаключается в том, что пока ваша учетная запись разблокирована, ваша нода может подписать любую транзакцию. Таким образом, у вас есть крошечный промежуток времени, когда ваш узел может быть атакован злоумышленником.