So erstellen Sie einen Faucet für mein privates Ethereum-Netzwerk als Klon von https://faucet.ropsten.be/

Ich habe ein Ethereum-Netzwerk mit 5 Knoten auf Azure eingerichtet. Jetzt möchte ich einen Wasserhahn wie https://faucet.ropsten.be/ machen . Wo jeder hingehen und seine Brieftaschenadresse eingeben und meinen Netzwerktestether erhalten kann. Dafür habe ich einen Smart Contract in meinem Netzwerk bereitgestellt. In diesem Smart Contract gibt es eine Funktion, die Benutzer ausführen müssen, um den Testether zu erhalten. Da sie jedoch keinen Testether haben und daher das Gas für die Funktionsausführung nicht bezahlen können, muss ich eine Lösung implementieren, bei der das Gas vom Smart Contract selbst bezahlt wird, der den Testether meines Netzwerks speichert. Also dafür Die Lösung ist ein wenig komplex. Sie müssen eine Signaturtransaktion und alles wie in diesem Artikel verwenden ( Erstellen Sie einen Wasserhahn für das private Ethereum-Netzwerk, um Ether zu erhaltenIch habe mich gefragt, ob jemand eine einfache Lösung vorschlagen kann, bei der mein sendender Benutzer einfach seine Brieftaschenadresse ausgibt und auf eine Schaltfläche im Frontend klickt, und er erhält den Testether, ohne ihm eine Unterschrift und irgendetwas wie Rinkbey oder Ropsten Testnet Faucet zu zeigen.

Antworten (3)

Nach dem Ausprobieren habe ich herausgefunden, dass wir Wasserhahn als traditionelle Client-Server-Webanwendung erstellen können. Dafür können wir viele Ether in einem externen Wallet speichern (Sie können viel Ether manuell von der Geth-Konsole an dieses Wallet senden, das Ether vom Server sendet). Der unten angegebene Code zum Ausführen eines Servers. Greifen Sie auf diesen http://localhost:3000/sendtx zu . Dadurch wird 1 Ether an eine angegebene Wallet-Adresse gesendet. Ich habe diesen Artikel verwendet, um https://medium.com/coinmonks/ethereum-tutorial-sending-transaction-via-nodejs-backend-7b623b885707 zu beantworten . Sie können dafür ein Frontend mit einer Schaltfläche und einem Formular zur Eingabe erstellen a

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!'))

Ohne vorher darüber nachzudenken, ist dies ein sehr wohlgeformtes Henne-Ei-zuerst-Problem – dh ein Benutzer im Netzwerk benötigt Token, um einen Vertrag abzuschließen, aber der Benutzer muss einen Vertrag ausführen, um Token zu erhalten!

So kommen Sie zum gewünschten Ergebnis:

  1. Der Ort, an dem der Benutzer auf die Schaltfläche in Ihrem Frontend klickt, ist im Grunde das DApp-Frontend. Nehmen wir an, der Benutzer gibt eine Adresse und einen Betrag ein und klickt dann auf die Schaltfläche, um die Menge an Testether zu erhalten.

  2. Sie führen eine grundlegende Überprüfung des Formulars durch, stellen sicher, dass nicht zu viele Anfragen von demselben Benutzer vorliegen usw.

  3. Nehmen Sie nun die Anfrage des Benutzers entgegen und führen Sie eine Transaktion im Namen des Benutzers durch. Hier benötigen Sie eine Art web3.js- oder web3.py- Schnittstelle, um mit Ihrem lokalen Ethereum-Netzwerk zu interagieren.

Der letzte Punkt, dh 3, ist die gesamte Arbeit, die Sie erledigen müssen. Ich persönlich würde etwas Ether in andere Adressen stecken, wenn ich mein lokales Netzwerk bereitstelle und starte. Dann mache ich eine dieser Adressen zum Vertragsinhaber / oder einem Delegierten, der Testether an einen Benutzer übertragen kann. Und wie ich oben beschrieben habe, führe ich nach Erhalt einer Anfrage von einem Benutzer eine Transaktion für die Testether-Anfrage durch.

Wenn Sie Puppeth zum Einrichten verwendet haben, hat es einen eingebauten Wasserhahn, eine Web-Brieftasche usw.