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!
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.accounts
como:
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.
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...'); });
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();
savard
shawn tabrizi