¿Cómo enviar la función de transacción/llamada desde el lado del servidor?

Después de que se emite un evento desde mi contrato inteligente y lo escucho del lado del servidor, quiero llamar a una determinada función en el contrato inteligente y pasarle información para usar.

Me pregunto cómo coloca una transacción del lado del servidor. En esta pregunta parece simple: Firmar una transacción del lado del servidor

pero, ¿cómo sabe el lado del servidor qué cuenta usar/clave privada? Del lado del navegador, aparece una metamáscara y el usuario la firma físicamente. ¿Cómo hace eso el lado del servidor? ¿No hay nadie para firmarlo físicamente y no hay ningún lugar para que aparezca?

¡Gracias por cualquier ayuda!

Respuestas (3)

Para firmar una transacción para una cuenta determinada, solo necesita acceder a la clave privada de esa cuenta.

Los complementos como MetaMask simplemente administran el acceso a sus claves privadas y le permiten al usuario decidir cuándo y cómo usar su clave privada para firmar transacciones o mensajes.

Para una aplicación del lado del servidor, necesitaría almacenar una clave privada que el servicio pueda usar y, a través de su código, controlar cuándo y dónde ese servicio firma transacciones.

Eche un vistazo a las funciones web3.eth.accountscomo:

Probablemente tenga sentido que genere una cuenta de Ethereum específica para su servicio y permita que ese servicio tenga acceso especial a su contrato si espera que haya una gran confianza entre estas dos aplicaciones. Esto es muy similar al servicio privilegiado a las llamadas de servicio en el desarrollo de aplicaciones modernas.

Está bien. Así que pondría la clave privada en una variable y la usaría para 'desbloquear' la cuenta de ethereum que poseo. Genial gracias por la aclaración. Una pregunta: ¿cómo habilitaría un acceso especial a mi contrato para una cuenta determinada? ¿Quiere decir algo como require('thatAccountAddress' == msg.sender) para que solo esa cuenta pueda llamar a la función? ¿O es su otro patrón que se puede usar? ¡Gracias!
Le gustaría hacer algo de RBAC dentro de su contrato similar a Ownable.sol de Open-Zeppelin , básicamente donde define una determinada dirección para tener acceso a funciones a las que otras cuentas no tendrían acceso. Es posible que esto no sea necesario en su escenario, pero, por lo general, en los sistemas en los que tiene un back-end y un contrato inteligente que interactúa, querrá tratarlo de manera diferente. También te recomiendo que generes una nueva cuenta para tu backend, en lugar de usar tu cuenta personal.

He extraído el código a continuación de mi secuencia de comandos de nodo js donde estoy tratando de conectarme con un contrato inteligente y buscando un evento. Puede que te ayude a hacerte una idea.

var expreso = require('expreso'); var aplicación = express(); const Web3 = require('web3'); const web3 = new Web3(new Web3.providers.HttpProvider(" http://localhost:7545 "));

web3.eth.defaultAccount = web3.eth.cuentas[1];

var StudentContract = web3.eth.contract([TU_ABI]);

var Student = StudentContract.at('YOUR_CONTRACT_ADD');

app.post('/subir', function(requerido, res) {

    Student.createStudents(studentName,studentAccYear, hashCode, {gas: '195253'});

    var studentEvent = Student.studentInfo();
    studentEvent.watch(function(error, result){
    if (!error)
        {
            console.log(result);
            } else {
            console.log(error);
        } 
        return;
   });

});

app.listen('3000', function(){ console.log('ejecutándose en 3000...'); });

No entiendo cómo esto ayuda en absoluto. Solo está configurando una cuenta predeterminada basada en cuentas preestablecidas (inyectadas).

En el lado del cliente, las billeteras como Metamask mantienen los detalles de su cuenta (incluida la clave privada), por lo que para las transacciones de contratos inteligentes, se siente intimidado con una ventana emergente para firmar una transacción (metamask que solicita el uso de la clave privada)

En el lado del servidor, es algo similar, lo único que necesita almacenar es la clave privada de la cuenta con la que necesita realizar transacciones o ejecutar un contrato inteligente. Y después de la ejecución de su API, puede ver que sus fondos se reducen automáticamente de su billetera Metamask en lugar de las tarifas de gasolina, si corresponde.

Use la biblioteca ethers.js para la ejecución de contratos inteligentes.

Ejemplo de uso en el lado del servidor: -

  const provider = new ethers.providers.JsonRpcProvider(
    'http://localhost:8545'
  );
  const signer = new ethers.Wallet('privateKeyString', provider);
  const contract = new ethers.Contract('contractAddress', abi, signer);
  await contract.someContractFunction();