Wie würden Sie Ethereum Smart Contracts in ein bestehendes Node/React-Projekt integrieren?

Ich habe ein bestehendes node/graphql/mongodb/react/redux-Projekt, das sich in der Beta-Phase befindet, und ich möchte Ethereum Smart Contracts integrieren, um Transaktionsinformationen in der Blockchain speichern zu können. Ist das möglich? Wenn ja, wie mache ich das?

Ich habe bereits Grundkenntnisse in Solidity und Truffle und habe einige Beispielprojekte erstellt und diese in einem privaten Netzwerk bereitgestellt.

Ist es besser, bei Null anzufangen?

Antworten (2)

Der einfachste Weg, eine JavaScript-Anwendung zu verwalten, die mit der Blockchain kommuniziert, ist die Verwendung eines Entwicklungs-Frameworks und eines Bereitstellungstools wie Truffle .

Truffle kümmert sich darum, Ihnen die Möglichkeit zu geben, Tests und Migrationen durchzuführen und Ihre Vertragsdefinitionen zu verwalten, einschließlich der Adressen, für die sie in jedem Netzwerk bereitgestellt werden. Es bietet auch gute Tutorials , die Ihnen helfen, Anwendungen zu schreiben, die mit der Blockchain kommunizieren.

Die häufigsten Beispiele für die Verwendung von Truffle verwenden eine eigene Build-Bibliothek für Ihre gesamte Anwendung, aber wenn Sie bereits eine bestehende React-Anwendung haben, haben Sie wahrscheinlich bereits Ihren eigenen Build-Prozess mit browserify, webpackoder einem anderen Tool. Theoretisch kann dies nahtlos in integriert werden truffle, aber es kann einfacher sein, wenn Sie sich an die Funktionsweise von Truffle gewöhnt haben, es einfach in ein Unterverzeichnis Ihres eigenen Projekts zu legen und direkt auf seine Bibliotheken und die von ihm erstellten Vertrags-JSON-Dateien zu verweisen.

Siehe dieses Projekt für ein Beispiel. Das ursprüngliche truffleVerzeichnis enthält Verträge, Migrationen und Vertragstests, und die Ausführung truffle migrateinnerhalb dieses Verzeichnisses stellt die Verträge in der Blockchain bereit und speichert ihre Definitionen in seinem buildVerzeichnis. Die truffle.jsDatei definiert das Netzwerk, in dem sie bereitgestellt wird, aber nicht (im Gegensatz zu den meisten Truffle-Tutorials) den HTML- und JavaScript-Erstellungsprozess der Webanwendung, da dies vom ursprünglichen System der Anwendung gemäß Definition in seiner package.json. Das Haupt-Front-End-JavaScript lädt die von Trüffeln generierten Vertragsdefinitionen und interagiert mit ihnen mithilfe von Tools aus der truffle-contractBibliothek.

Ich habe dies als Antwort akzeptiert, weil es Truffle verwendet, mit dem ich vertraut bin, um eine vorhandene Codebasis mit Smart Contracts zu integrieren. Danke für deine Rückmeldung.

Das folgende Beispiel dient nicht genau dem Speichern von Transaktionsinformationen in der Blockchain. Aber zum Aufrufen einer in Smart Contract geschriebenen Übertragungsfunktion aus nodejs-Code. Hoffe das hilft trotzdem.

1> Vertrag:

    contract SmartToken {
//store mapping of address and tokens (like a hashmap)
        mapping(address => uint) tokens;

        event OnamountChanged(address indexed _fromAddress, uint amount);

//transfer amount from one account to another account
        function transfer(address fromAddress, address toAddress, uint amount) returns (bool success) {
            //Cannot transfer to same account
            if (fromAddress == toAddress) {
                return false;
            }

//change balance of accounts
            if ((tokens[fromAddress] - amount) < 0) {
                //Transfer entire amount
                token[toAddress] += tokens[fromAddress];
                tokens[fromAddress] = 0;
            } else {
                token[toAddress] += amount;
                tokens[fromAddress] -= amount;
            }

            OnamountChanged(fromAddress, tokens[fromAddress]);
            return true;
        }
    }

2> nodejs:

    exports.transferTokens = function (transferData, next) {
    var rfr = require('rfr');
    //Copy abi into a json file and put it somewhere within nodejs app folder somewhere
    var abiJson = rfr('/app/account/queries/SmartToken.json');
    //Copy your contract address here
    var contAddr = "Your Contract Address";
    var bcHelper = rfr('/app/utils/bcHelper.js');

//Get connection to your blockchain - see helper code in #3 below
        var bcConn = bcHelper.myBcConnection();
//Reference to ABI JSON
        var contractAbi = bcConn.eth.contract(abiJson);
//Reference to contract address
        var contractRef = contractAbi.at(contAddr);
//fromAddress, toAddress, password and amount are passed from my UI in json format
        var fromAddress = transferData.fromAddress;
        var toAddress = transferData.toAddress;
        var password = transferData.password; //password of fromAccount
        var transferAmount = transferData.amount;

//Default account is required for smart contract write
        bcConn.eth.defaultAccount = bcConn.eth.coinbase;
//unlockAccount so that it is open to transfer required tokens
        bcConn.personal.unlockAccount (fromAddress, password, 15000, function(err, result) {
            if (err) {
                return next(err, null);
            }
    //invoke transfer function on smart contract in #1
            contractRef.transfer(fromAddress, toAddress, transferAmount, function (err, result) {
                if (err) return next(err, null);

                return next(null, result);
            });
        });
    };

3> Hilfsdatei: bcHelper.js

    var Web3 = require('web3');
    var myBcInstance;

    exports.myBcConnection  = function() {
        if (myBcInstance) {
            return myBcInstance;
        } else {
//Connect to web3 instance
            myBcInstance = new Web3(new Web3.providers.HttpProvider('http://localhost:8042');
            return myBcInstance;
        }
    };
Vielen Dank für Ihre Antwort. "Das folgende Beispiel ist nicht genau zum Speichern von Transaktionsinformationen in der Blockchain." Wollen Sie damit sagen, dass es nicht möglich ist, Daten vom Knoten in die Blockchain zu speichern? Könnten Sie bitte auch über jedem Abschnitt des Codes ins Detail gehen?
Es ist möglich, Daten vom Knoten auf eine der beiden Arten zu speichern. 1) durch Aufrufen einer Funktion auf Smart Contract, die einen Schreibvorgang ausführt (siehe Beispiel oben). 2) direktes Aufrufen einer Sendetransaktion zwischen Konten. Was versuchst du zu tun?
Ich habe einige Inline-Kommentare hinzugefügt. Hoffe es wird helfen. Dies deckt ziemlich genau die Art und Weise ab, wie man einen Smart Contract aus dem Code von nodejs für jede Funktion aufrufen würde, die Daten in die Blockchain schreibt.
Vielen Dank für die Kommentare und Codebeispiele. Ich habe die andere Antwort akzeptiert, da sie Trüffel nutzt, mit denen ich bereits vertraut bin. Beide Antworten sind richtig; der andere war näher an dem, was ich suchte. Vielen Dank, dass Sie sich die Zeit genommen haben zu antworten.