Как я могу завершить транзакцию без предварительной разблокировки моей учетной записи?

Мне нужно вызвать функцию (изменения состояния) в моем контракте.

Вот как я сейчас выполняю эту транзакцию:

let transaction = contract.methods.myFunc();
await web3.eth.personal.unlockAccount(ACCOUNT_ADDRESS, ACCOUNT_PASSWORD);
let gas = await transaction.estimateGas({from: ACCOUNT_ADDRESS, gasPrice: GAS_PRICE});
await transaction.send({from: ACCOUNT_ADDRESS, gasPrice: GAS_PRICE, gas: gas});

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

Есть ли способ передать свои учетные данные (адрес учетной записи и пароль) при выполнении транзакции вместо предварительной разблокировки учетной записи?

Документация для unlockAccountнаходится здесь .

Документация для sendнаходится здесь .

Большое спасибо!

Ответы (1)

Вы можете просто подписать транзакцию на своей стороне и отправить необработанную транзакцию, вы будете делать это на python или java или в другой среде, но не на своем клиенте Ethereum напрямую. Так что риск сведен к минимуму.

Пример:

var Tx = require('ethereumjs-tx');
dataTx = myContract.methods.myFunc(params).encodeABI(); //The encoded ABI of the method

var rawTx = {
  to: 'yourcantract address', 
  data:dataTx 
}

var tx = new Tx(rawTx);
tx.sign('yourprivateKey');

var serializedTx = tx.serialize();
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
.on('receipt', console.log);

Надеюсь это поможет.

Спасибо. Итак, я смотрю на функции signи signTransaction здесь . Но ни один из них не принимает на вход приватный ключ/фразу-пароль/пароль. Так как именно он может заменить unlockAccount?
О, кажется, я понял. Мне нужно использовать функцию web3.eth.personal.signTransaction(не функцию web3.eth.signTransaction).
Например, предложенная вами функция принимает на вход объект транзакции. Но объект транзакции в моем коде — contract.methods.myFunc()совершенно другой (и да, оба они упоминаются как объект транзакции в документации).
Да, вы правы, взгляните на мое обновление. Дайте мне знать, как это происходит.
Я получаю Returned error: Insufficient funds. The account you tried to send transaction from does not have enough funds(ошибка, которую я не получил, когда использовал unlockAccount).
как говорит ошибка, на вашем счету недостаточно средств.
Как я сказал в своем комментарии, эта ошибка не возникает, когда я разблокирую учетную запись, поэтому причина не может заключаться в том, что на ней «недостаточно средств».
Вы решили это?, дайте мне знать
Я использовал немного другой код (чисто web3, без ethereumjs-tx). Не удалось заставить его работать, поэтому разместил более подробный вопрос здесь .