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?
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
, webpack
oder 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 truffle
Verzeichnis enthält Verträge, Migrationen und Vertragstests, und die Ausführung truffle migrate
innerhalb dieses Verzeichnisses stellt die Verträge in der Blockchain bereit und speichert ihre Definitionen in seinem build
Verzeichnis. Die truffle.js
Datei 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-contract
Bibliothek.
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;
}
};
Jason Cochran