¿Cómo puedo completar una transacción sin desbloquear mi cuenta primero?

Necesito llamar a una función (de cambio de estado) en mi contrato.

Así es como estoy ejecutando esta transacción actualmente:

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});

Sin embargo, según tengo entendido, desbloquear la cuenta en mi cliente Ethereum deja muchos agujeros de seguridad con los que lidiar.

¿Hay alguna forma de pasar mis credenciales (dirección de cuenta y contraseña) cuando ejecuto la transacción, en lugar de desbloquear la cuenta de antemano?

La documentación para unlockAccountestá aquí .

La documentación para sendestá aquí .

¡Muchas gracias!

Respuestas (1)

Simplemente puede firmar la transacción de su lado y enviar una transacción sin procesar, lo hará en python o java u otro entorno, pero no en su cliente Ethereum directamente. Por lo que el riesgo se minimiza.

Ejemplo:

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);

Espero que esto ayude.

Gracias. Así que estoy mirando funciones signy signTransaction aquí . Pero ninguno de ellos toma la clave privada/frase de contraseña/contraseña como entrada. Entonces, ¿cómo exactamente puede reemplazar unlockAccount?
Oh, creo que lo tengo. Necesito usar la función web3.eth.personal.signTransaction(no la función web3.eth.signTransaction).
¡Sí! mira aquí
Por ejemplo, la función que sugirió toma un objeto de transacción como entrada. Pero el objeto de transacción en mi código contract.methods.myFunc()es completamente diferente (y sí, ambos se denominan objeto de transacción en los documentos).
Sí, tienes razón, echa un vistazo a mi actualización. Déjame saber como va.
Obtengo Returned error: Insufficient funds. The account you tried to send transaction from does not have enough funds(un error que no obtuve cuando usé unlockAccount).
es como dice el error, su cuenta no tiene fondos suficientes.
Como dije en mi comentario, este error no ocurre cuando desbloqueo la cuenta, por lo tanto, la razón no puede ser que "no tenga fondos suficientes".
¿Resolviste esto?, házmelo saber
He usado un código ligeramente diferente (puramente web3, sin ethereumjs-tx). No pude hacer que funcionara, así que publiqué una pregunta más detallada aquí .