¿Cómo integraría los contratos inteligentes de Ethereum en un proyecto de nodo/reacción existente?

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?

Respuestas (2)

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, webpacko 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 truffledirectorio original contiene contratos, migraciones y pruebas de contratos, y ejecutar truffle migratedesde dentro de ese directorio implementará los contratos en la cadena de bloques y almacenará sus definiciones en su builddirectorio. El truffle.jsarchivo 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-contractbiblioteca.

Acepté esto como la respuesta porque usa trufa, con la que estoy familiarizado para integrar una base de código existente con contratos inteligentes. Gracias por tus comentarios.

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;
        }
    };
Gracias por su respuesta. "El siguiente ejemplo no es exactamente para guardar información de transacciones en blockchain". ¿Está diciendo que no es posible guardar datos en la cadena de bloques desde el nodo? Además, ¿podría entrar en detalles sobre cada sección del código, por favor?
Es posible guardar datos del nodo de una de las dos maneras. 1) al invocar una función en el contrato inteligente que realizará alguna operación de escritura (ver el ejemplo anterior). 2) invocar directamente una transacción de envío entre cuentas. ¿Qué es lo que estás tratando de hacer?
He añadido algunos comentarios en línea. Espero que ayude Esto cubre prácticamente la forma en que uno invocaría un contrato inteligente desde el código nodejs para cualquier función que escriba datos en blockchain.
Gracias por los comentarios y ejemplos de código. Acepté la otra respuesta porque aprovecha la trufa, que ya conozco. Ambas respuestas son correctas; el otro estaba más cerca de lo que estaba buscando. Gracias por tomarte el tiempo de responder.