Tengo un proyecto existente de node/graphql/mongodb/react/redux que está en versión beta y me gustaría integrar los contratos inteligentes de Ethereum para poder guardar la información de las transacciones en la cadena de bloques. es posible? Si es así, ¿cómo lo hago?
Ya tengo un conocimiento práctico de Solidity y Truffle y he creado un par de proyectos de muestra y los he implementado en una red privada.
¿Es mejor empezar de cero?
La forma más fácil de administrar una aplicación de JavaScript que se comunica con la cadena de bloques es usar un marco de desarrollo y una herramienta de implementación como Truffle .
Truffle se encarga de brindarle una forma de ejecutar pruebas y migraciones, y administrar las definiciones de sus contratos, incluidas las direcciones en las que se implementan en cada red. También proporciona buenos tutoriales que lo ayudarán a aprender a escribir aplicaciones que se comuniquen con la cadena de bloques.
Los ejemplos más comunes del uso de Truffle usarán su propia biblioteca de compilación para toda su aplicación, pero si ya tiene una aplicación React existente, probablemente ya tenga su propio proceso de compilación usando browserify
, webpack
o alguna otra herramienta. En teoría, esto se puede integrar a la perfección con truffle
, pero puede ser más simple, habiéndose acostumbrado a cómo funciona Truffle, simplemente colocarlo en un subdirectorio de su propio proyecto y hacer referencia a sus bibliotecas y los archivos json de contrato que construye directamente.
Ver este proyecto para un ejemplo. El truffle
directorio original contiene contratos, migraciones y pruebas de contratos, y ejecutar truffle migrate
desde dentro de ese directorio implementará los contratos en la cadena de bloques y almacenará sus definiciones en su build
directorio. El truffle.js
archivo define la red en la que se implementará, pero no (a diferencia de la mayoría de los tutoriales de Truffle) el proceso de compilación HTML y JavaScript de la aplicación web, ya que esto lo maneja el sistema original de la aplicación como se define en su archivo package.json
. El JavaScript principal del front-end carga las definiciones de contrato generadas por truffle e interactúa con ellas utilizando las herramientas que se encuentran en la truffle-contract
biblioteca.
El siguiente ejemplo no es exactamente para guardar información de transacciones en blockchain. Pero para invocar una función de transferencia escrita en un contrato inteligente desde el código nodejs. Espero que esto ayude.
1> Contrato:
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> nodos:
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> archivo auxiliar: 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