Как бы вы интегрировали смарт-контракты Ethereum в существующий проект узла /реагирования?

У меня есть существующий проект node /graphql /mongodb /response /redux, который находится в бета-версии, и я хотел бы объединить смарт-контракты Ethereum, чтобы иметь возможность сохранять информацию транзакции в цепочке блоков. Это возможно? Если да, то как это сделать?

У меня уже есть знание Solidity и Truffle, и я создал несколько примеров проектов и развернул их в частной сети.

Лучше ли начинать с нуля?

5 голосов | спросил Jason Cochran 16 AM000000120000003031 2017, 00:06:30

2 ответа


2

Самый простой способ управления приложение JavaScript, что переговоры с blockchain является использование рамок и развертывания разработки инструмента, как трюфель .

Трюфель заботится о том, чтобы дать вам возможность запускать тесты и миграции, а также управлять определениями контрактов, включая адреса, которые они развертывают для каждой сети. Он также предоставляет хорошие учебники , которые помогут вам научиться писать приложения, которые говорят на blockchain.

Наиболее распространенные примеры использования Truffle будут использовать собственную библиотеку сборки для всего вашего приложения, но если у вас уже есть существующее приложение React, у вас, вероятно, уже есть свой собственный процесс сборки, используя browserify, webpack или какой-либо другой инструмент. Теоретически это можно легко интегрировать с помощью truffle, но может быть проще, привыкнуть к тому, как работает трюфель, просто положить его в подкаталог вашего собственного проекта и ссылки на его библиотеки и файлы json контракта, которые он создает напрямую.

См. этот проект для примера. В исходном каталоге truffle содержатся контракты, миграции и тесты контрактов и запуск truffle migrate изнутри этого каталога будет разворачивать контракты на блок-цепочку и хранить их определения в каталоге build. Файл truffle.js определяет сеть, в которую он будет развернут, но не (в отличие от большинства учебников по Трюфелю), процесс создания HTML и JavaScript веб-приложений, поскольку это обрабатывается исходной системой приложения, как определено в ее package.json. main front-end JavaScript загружает определения контрактов, созданных трюфелем, и взаимодействует с ними с помощью инструментов, найденных в библиотеке truffle-contract .

ответил Edmund Edgar 16 AM000000120000003231 2017, 00:59:32
2

Ниже приведен пример не только для сохранения информации о транзакциях в блок-цепочке. Но для вызова передаточной функции, написанной в смарт-контракте из nodejs-кода. Надеюсь, что это поможет.

1 > Контракт:

    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 > вспомогательный файл: 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;
        }
    };
ответил Dhanesh 16 AM000000120000004231 2017, 00:33:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132