Cómo crear un faucet para mi red Ethereum Private como un clon de https://faucet.ropsten.be/

He configurado una red Ethereum con 5 nodos en Azure. Ahora quiero hacer un faucet como https://faucet.ropsten.be/ . Donde cualquiera pueda ir y poner allí la dirección de la billetera y pueda obtener mi testether de red. Entonces, para esto, implementé un contrato inteligente en mi red. En ese contrato inteligente hay una función que los usuarios deberán ejecutar para obtener el testether. Pero debido a que no tienen ningún testether, por lo que no pueden pagar el gas por la ejecución de la función, tendré que implementar una solución en la que el contrato inteligente pague el gas que almacena el testether de mi red. Así que para esto la solución es un poco compleja, tendrá que usar la transacción de firma y todo como en este artículo ( Cree un grifo para la red privada Ethereum para obtener EthersMe preguntaba si alguien puede sugerir una solución fácil en la que mi usuario de envío simplemente extraiga la dirección de su billetera y haga clic en un botón en la interfaz y obtengan el testether sin mostrarles ninguna firma y nada como rinkbey o ropsten testnet faucet.

Respuestas (3)

Después de intentarlo, descubrí que podemos hacer faucet como una aplicación web cliente-servidor tradicional. Para esto, podemos almacenar una gran cantidad de éteres en una billetera externa (puede enviar una gran cantidad de éteres manualmente desde la consola geth a esta billetera que envía éteres desde el servidor). El siguiente código para ejecutar un servidor. Acceda a este http://localhost:3000/sendtx . Esto enviará 1 éter a una dirección de billetera que proporcionó. He usado este artículo para responder https://medium.com/coinmonks/ethereum-tutorial-sending-transaction-via-nodejs-backend-7b623b885707 Puede crear una interfaz para esto con un botón y un formulario para ingresar un

const web3 = require('web3');
const express = require('express');
const Tx = require('ethereumjs-tx');
const app = express();
web3js = new web3(new web3.providers.HttpProvider("https://rinkeby.infura.io/YOUR_API_KEY")); //You can use your costom RPC also
app.get('/sendtx',function(req,res){
    var myAddress = 'Your address';//'ADDRESS_THAT_SENDS_TRANSACTION';
    var privateKey = Buffer.from('PrivateKey', 'hex')
    var toAddress = '0x';//Address to which sending transaction.
    var amount = 1000000000000000000 //in wei

    web3js.eth.getTransactionCount(myAddress).then(function(v){
        console.log("Count: "+v);
        count = v;
        //creating raw tranaction
        var rawTransaction = {"from":myAddress, "gasPrice":web3js.utils.toHex(20* 1e9),"gasLimit":web3js.utils.toHex(210000),"to":toAddress,"value":web3js.utils.toHex(amount),"data":"0x0","nonce":web3js.utils.toHex(count)}
        console.log(rawTransaction);
        //creating tranaction via ethereumjs-tx
        var transaction = new Tx(rawTransaction);
        //signing transaction with private key
        transaction.sign(privateKey);
        //sending transacton via web3js module
        web3js.eth.sendSignedTransaction('0x'+transaction.serialize().toString('hex'))
        .on('transactionHash',console.log);
    })
});
app.listen(3000, () => console.log('Example app listening on port 3000!'))

Sin pensarlo primero, este es un problema de huevo de gallina muy bien formado, es decir, un usuario en la red necesita tokens para ejecutar un contrato, ¡pero el usuario necesita ejecutar un contrato para obtener tokens!

Así es como se logra el resultado deseado:

  1. El lugar donde el usuario hace clic en el botón en su interfaz es básicamente la interfaz DApp. Digamos que el usuario ingresa una dirección, una cantidad y luego hace clic en el botón para recibir la cantidad de testether.

  2. Realiza una validación básica en el formulario, se asegura de que no haya demasiadas solicitudes del mismo usuario, etc.

  3. Ahora tome la solicitud del usuario y realice una transacción en nombre del usuario. Aquí es donde necesitará el tipo de interfaz web3.js o web3.py para interactuar con su red ethereum local.

El último punto, es decir, el 3, es todo el trabajo que tendrá que hacer. Personalmente, pondría una cierta cantidad de éter en otra(s) dirección(es) al implementar e iniciar mi red local. Luego haré de estas direcciones el propietario del contrato o un delegado que pueda transferir testether a un usuario. Y como describí anteriormente, al recibir una solicitud de un usuario, realizo una transacción para la solicitud de testether.

si usó marionetas para configurarlo, tiene un grifo incorporado, una billetera web, etc.