У меня есть файл JS, работающий на NodeJS на нескольких устройствах, которые взаимодействуют друг с другом, пытаясь записывать данные в блокчейн и отправлять транзакции. Проблема в том, что каждый раз мне приходится вручную вводить пароль. Я использовал personal.unlockAccount в клиентской консоли, но это не решает ситуацию...
Я пытаюсь разработать рынок микроэлектроэнергии, на котором каждые 15 минут отправляются несколько автономных транзакций, я не могу все время сидеть перед экраном.
Есть ли способ добиться того, что я хотел бы сделать?
заранее спасибо
Если 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, которая была расширена для использования промисов, поскольку это упрощает этот процесс.
Это, вероятно, можно было бы улучшить, сделав окончательный then
a finally
, чтобы всегда блокировать учетную запись, независимо от того, завершается ли задача неудачно.
Важные биты для вашего использования: вы хотите вызвать web3.personal.unlockAccount
, передать ему обратный вызов, который делает все, что вам нужно, пока транзакция разблокирована, а затем позвонить, web3.personal.lockAccount
когда вы закончите.
Мы использовали в проходе ConsenSys' hooked-web3-provider (сейчас он устарел, они указывают на аналогичный проект https://github.com/ethjs/ethjs-provider-signer ). Таким образом, у нас есть служба, которая будет подписывать транзакции, не раскрывая закрытый ключ, например, у нас может быть аппаратный ключ.
Наша проблема personal.unlockAccount
заключается в том, что пока ваша учетная запись разблокирована, ваша нода может подписать любую транзакцию. Таким образом, у вас есть крошечный промежуток времени, когда ваш узел может быть атакован злоумышленником.
Микко Отамаа
unlockAccount
использует второй аргумент — время, в течение которого учетная запись остается разблокированной.