El uso de web3 v1 beta de Nodejs para invocar myMethod.send() proporciona el uso de Trusted Signer. ¿Cómo puedo hacer eso?

Usando web3la versión 1 beta 27, conectado a un nodo Parity remoto que está conectado a la red Ropsten.

He creado una cuenta con claves públicas y privadas, he enviado algunos Eth de prueba a esa dirección. Todo eso funciona bien.

Ahora, al tratar de invocar una función en mi contrato, recibo el mensaje

Your account is locked. Unlock the account via CLI, personal_unlockAccount or use Trusted Signer

No tengo acceso al nodo a través de la CLI, así que necesito use Trusted Signer.

Mirando los documentos porque web3.eth.accounts.signveo lo siguiente

firmar

web3.eth.accounts.sign(data, privateKey);

Firma datos arbitrarios. Estos datos son anteriores a UTF-8 HEX decodificados y envueltos de la siguiente manera: "\x19Ethereum Signed Message:\n" + message.length + message.

Parámetros

  1. data - String: Los datos a firmar. Si es una cadena será
  2. privateKey - String: La clave privada para firmar.

que francamente no tiene ningún sentido.

Suponiendo que la función que estoy llamando es

TestContract.methods.test(testAddress).send()

¿Cómo lo uso exactamente web3.eth.accounts.signen este contexto?

Respuestas (1)

He resuelto esto ahora. En primer lugar, debo asegurarme de tener acceso a la clave privada de la dirección, así como a la dirección del remitente.

Dada esa información, puedo hacer lo siguiente.

const testFn = TestContract.methods.test(testAddress)
const gas = await testFn.estimateGas()
const account = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY)
const data = testFn.encodeABI()
const nonce = await web3.eth.getTransactionCount(SENDER_ADDRESS, 'pending')
const payload = {
  nonce,
  data,
  gas,
  from: SENDER_ADDRESS,
  to: testContractAddress
}
const signedTx = await account.signTransaction(payload, account.privateKey)
const { rawTransaction } = signedTx
const response = await web3.eth.sendSignedTransaction(rawTransaction)

Esto funciona bien.

Obviamente, esto solo es adecuado para el código que se ejecuta en NodeJS, ya que nunca desea que la clave privada se exponga en una interfaz web pública.