1

I create a ganache cli and initialize my accounts to have ethers using

ganache-cli -h "159.89.119.189" -a 3 -e "1000000000000000000000000000" --secure -u 0 -u 1 -u 2 -s 20

but after a couple of minutes, all accounts on the network are 0. I'm not able to run any transactions or call contracts again.

A DApp i created connects to this private network This is my app.js

App = {
web3Provider: null,
contracts: {},
account: 0x0,
coinbase: 0x0,
coinbase_amount: 0,
loading: false,

init: function () {
    return App.initWeb3();
},


initWeb3: function () {
    // initialize web3
    if (typeof web3 !== 'undefined') {
        //reuse the provider of the Web3 object injected by Metamask
        App.web3Provider = web3.currentProvider;
    } else {
        //create a new provider and plug it directly into our local node
        //App.web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
        App.web3Provider = new Web3.providers.HttpProvider('http://159.89.119.189:8545');
    }
    web3 = new Web3(App.web3Provider);

    App.getCoinbase();

    return App.initContract();
},

hostname: function () {
    return window.location.origin;
},

setAccount: function (address) {
    App.account = address;
},

displayAccountInfo: function () {
    // console.log(App);
    if (App.account != 0) {
        toastr.remove();
        toastr.info('Getting Account Info', {timeOut: 300000});
        $('#account').text(App.account);
        App.getBalance();
    }
},

getBalance: function() {
    web3.eth.getBalance(App.account, function (err, balance) {
        if (err === null) {
            if(web3.fromWei(balance, "ether") == 0){
                setTimeout(App.getBalance(), 60000);
            } else {
                console.log(web3.fromWei(balance, "ether"));
                toastr.remove();
                $('#accountBalance').text(web3.fromWei(balance, "ether") + " ETH");
            }
        }
    })
},

getCoinbase: function () {
    web3.eth.getCoinbase(function (err, account) {
        if (err === null) {
            App.coinbase = account;
            // $('#account').text(account);
            web3.eth.getBalance(account, function (err, balance) {
                if (err === null) {
                    App.coinbase_amount = web3.fromWei(balance, "ether").toNumber();
                    console.log(App.coinbase, App.coinbase_amount)
                }
            })
        }
    });
},

transfer: function() {
    web3.personal.unlockAccount(App.coinbase, "pass12345", 100000, function (err, result) {
        console.log(result)
        console.log(err)
    web3.personal.unlockAccount(App.account, "pass@123", 100000, function (err, result) {
        web3.eth.sendTransaction({
            from: App.coinbase,
            to: App.account,
            value: web3.toWei(10, "ether")
        }, function (err, result) {
            if (err == null) {
                console.log("sent money");
                console.log(result)
                console.log(err)
                web3.eth.getBalance(App.account, function (err, balance) {
                    if (err === null) {
                        console.log(web3.fromWei(balance, "ether") + " ETH");
                    }
                })
            }
            else {
                console.log(err);
            }
        })
    });
    });
},

register: function () {
    let email = $('#inputEmail');
    let fname = $('#inputFname');
    let lname = $('#inputLname');
    let password = $('#inputPassword');
    let btnRegister = $('#btnRegister');
    if (email.val() == "" || fname.val() == "" || lname.val() == "" || password.val() == "") {
        toastr.error('Please fill all fields');
        return false;
    }
    btnRegister.attr("disabled", 'disabled');
    web3.personal.newAccount("pass@123", function (err, data) {
        let address = data;
        if (err === null) {
            let postData = {
                email: email.val(),
                fname: fname.val(),
                lname: lname.val(),
                password: password.val(),
                address: data
            }
            $.ajax({
                method: "POST",
                url: App.hostname() + "/register",
                data: postData,
                success: function (data) {
                    console.log(data)
                    if (data.status == "success") {
                        web3.personal.unlockAccount(address, "pass@123", 1000, function (err, result) {
                            web3.eth.sendTransaction({
                                from: App.coinbase,
                                to: address,
                                value: web3.toWei(10, "ether")
                            }, function (err, result) {
                                if (err == null) {
                                    console.log("sent money");
                                    console.log(result)
                                    web3.eth.getBalance(App.coinbase, function (err, balance) {
                                        if (err === null) {
                                            console.log("coinbase "+web3.fromWei(balance, "ether") + " ETH");
                                        }
                                    })
                                    web3.eth.getBalance(address, function (err, balance) {
                                        if (err === null) {
                                            console.log(web3.fromWei(balance, "ether") + " ETH");
                                        }
                                    })
                                }
                                else {
                                    console.log(err);
                                }
                                toastr.success("Success.");
                                window.location.href = App.hostname();
                            })
                        });
                    } else {
                        toastr.error(data.data);
                    }
                    btnRegister.attr("disabled", false);
                },
                error: function (err) {
                    toastr.error('Error Registering');
                    btnRegister.attr("disabled", false);
                }
            });
        } else {
            toastr.error('Error Registering');
            btnRegister.attr("disabled", false);
            return false;
        }
    })
},

login: function () {
    let email = $('#inputEmail');
    let password = $('#inputPassword');
    let btnLogin = $('#btnLogin');
    if (email.val() == "" || password.val() == "") {
        toastr.error('Please fill all fields');
        return false;
    }
    btnLogin.attr("disabled", 'disabled');
    let postData = {
        email: email.val(),
        password: password.val(),
    }
    $.ajax({
        method: "POST",
        url: App.hostname() + "/login",
        data: postData,
        success: function (data) {
            console.log(data)
            if (data.status == "success") {
                toastr.success("Success.");
                window.location.href = App.hostname();
            } else {
                toastr.error(data.data);
            }
            btnLogin.attr("disabled", false);
        },
        error: function (err) {
            toastr.error('Error Registering');
            btnLogin.attr("disabled", false);
        }
    });
},

initContract: function () {
    $.getJSON('Chainlist.json', function (chainListArtifact) {
        // get the contract artifact file and use it to instantiate a truffle contract abstraction
        App.contracts.ChainList = TruffleContract(chainListArtifact);
        // set the provider for our contracts
        App.contracts.ChainList.setProvider(App.web3Provider);
        // listen to events
        App.listenToEvents();
        // retrieve the article from the contract
        return App.reloadArticles();
    });
},

reloadArticles: function () {
    // avoid re-entry
    if (App.loading) {
        return
    }
    App.loading = true
    // refresh account information because the balance might have changed
    App.displayAccountInfo();

    var chainListInstance;

    App.contracts.ChainList.deployed().then(function (instance) {
        chainListInstance = instance;
        return chainListInstance.getArticlesForSale();
    }).then(function (articleIds) {
        $('#articlesRow').empty();
        for (var i = 0; i < articleIds.length; i++) {
            var articleID = articleIds[i];
            chainListInstance.articles(articleID.toNumber())
                .then(function (article) {
                    App.displayArticle(article[0], article[1], article[3], article[4], article[5], article[6])
                });
        }

        App.loading = false;
    }).catch(function (err) {
        console.error(err.message);
        App.loading = false;
    });
},

sellArticle: function () {
    // retrieve the detail of the article
    var _article_name = $('#article_name').val();
    var _description = $('#article_description').val();
    var _price = web3.toWei(parseFloat($('#article_price').val() || 0), "ether");
    const file = $('#article_image').prop('files')[0];

    if ((_article_name.trim() == '') || (_price == 0)) {
        // nothing to sell
        return false;
    }

    const name = (+new Date()) + '-' + file.name;
    const metadata = {
        contentType: file.type
    };
    let ref = firebase.storage().ref();
    const task = ref.child(name).put(file, metadata);
    toastr.info('Processing.....', {timeOut: 30000});
    task.then((snapshot) => {
        const _image_url = snapshot.downloadURL;
        console.log(_image_url);
        web3.personal.unlockAccount(App.account, "pass@123", 1000, function (err, result) {
            console.log(result);
            console.log(err);
            App.contracts.ChainList.deployed().then(function (instance) {
                return instance.sellArticle(_article_name, _description, _price, _image_url, {
                    from: App.account,
                    gas: 500000
                });
            }).then(function (result) {
                console.log(result);
                $('#article_name').val("");
                $('#article_description').val("");
                $('#article_price').val("");
                $('#article_image').val("");
            }).catch(function (err) {
                console.error(err);
            });
        });
    }).catch((error) => {
        console.error(error);
    });


},

displayArticle: function (id, seller, name, description, price, image_url) {
    var articlesRow = $('#articlesRow');
    var etherPrice = web3.fromWei(price, "ether");
    // retrieve the article template and fill it
    var articleTemplate = $('#articleTemplate');
    articleTemplate.find('.panel-title').text(name);
    articleTemplate.find('.article-description').text(description);
    articleTemplate.find('.article-price').text(etherPrice);
    articleTemplate.find('.btn-image-url').attr('href', image_url);
    articleTemplate.find('.btn-buy').attr('data-value', etherPrice);
    articleTemplate.find('.btn-buy').attr('data-id', id);

    if (seller == App.account) {
        articleTemplate.find('.article-seller').text("You");
        articleTemplate.find('.btn-buy').hide();
    } else {
        articleTemplate.find('.article-seller').text(seller);
        articleTemplate.find('.btn-buy').show();
    }
    // buyer
    // var buyer = article[1];
    // if (buyer == App.account) {
    //   buyer = "You";
    // } else if (buyer == 0x0){
    //  buyer = "None yet"
    // }
    // articleTemplate.find('.article-buyer').text(buyer);
    // add this article
    toastr.clear();
    $('#articlesRow').append(articleTemplate.html());
},

// listen to events triggered by the contract
listenToEvents: function () {
    App.contracts.ChainList.deployed().then(function (instance) {
        instance.LogSellArticle({}, {}).watch(function (error, event) {
            if (!error) {
                $("#events").append('<li class="list-group-item">' + event.args._name + ' is now for sale</li>');
            } else {
                console.error(error);
            }
            App.reloadArticles();
        });

        instance.LogBuyArticle({}, {}).watch(function (error, event) {
            if (!error) {
                $('#sellBtn').attr("disabled", false);
                $("#events").append('<li class="list-group-item">' + event.args._buyer + ' bought ' + event.args._name + '</li>');
            } else {
                console.error(error);
            }
            App.reloadArticles();
        });
    });
},

// retrieve article price from data-value and process buyArticle function
buyArticle: function () {
    event.preventDefault();
    // retrieve article Price
    toastr.info('Processing.....', {timeOut: 30000});
    $(event.target).attr("disabled", 'disabled');
    $('#sellBtn').attr("disabled", 'disabled');
    var price = parseFloat($(event.target).data('value'));
    var articleID = parseFloat($(event.target).data('id'));

    web3.personal.unlockAccount(App.account, "pass@123", 1000, function (err, result) {
        console.log(result);
        console.log(err);
        App.contracts.ChainList.deployed().then(function (instance) {
            return instance.buyArticle(articleID, {
                from: App.account,
                value: web3.toWei(price, "ether"),
                gas: 500000
            }).catch(function (error) {
                console.error(error);
            })
        });
    });
}

};

$(function() {
  $(window).load(function() {
    App.init();
      // Initialize Firebase
      var config = {
          apiKey: "AIzaSyAQp34HzZS_3xckuxcVcsUWgCu8_p7UzxA",
          authDomain: "comflo-1518513183870.firebaseapp.com",
          databaseURL: "https://comflo-1518513183870.firebaseio.com",
          projectId: "comflo-1518513183870",
          storageBucket: "comflo-1518513183870.appspot.com",
          messagingSenderId: "798445619042"
      };
      firebase.initializeApp(config);
  });
});

Same thing happens when i run a geth private server. I'm using a node app with express.

3
  • 1
    Is your node in a public accessible computer? Perhaps someone is erroneously trying to drain your node thinking it is on mainnet.
    – Ismael
    May 12, 2018 at 4:01
  • I'm running the node on an ubuntu server How do i make certain of this security
    – Dike Jude
    May 13, 2018 at 21:10
  • Ganache is used to develop locally and doesn't have extra protections. You can put it behind a password protected proxy like nginx, or connect through a ssh tunnel.
    – Ismael
    May 14, 2018 at 0:30

1 Answer 1

0

using ganache node package and set the ganache mnemonic and default balance will ensure the same accounts for each launch, then using metamask transfer 999 eth from wallets 1 through 9 to wallet 0.

const ganache = require('ganache');

const options = {
 namespace: { 
  option: "chain,database,fork,logging,miner,wallet,personal"
 },
 chain: {
  chainId: 1337,
  networkId: 1
 },
 logging: {
  verbose: true
 },
 wallet: {
  accountKeysPath: path.join(os.homedir(),"wallets.json"),
  mnemonic: "some mnemonic fixed sentence",
  maximum_wallets: 10,
  defaultBalance: 1000
 },
 db_path: os.homedir()
};
 
const server = ganache.server(options);
server.listen(8545,async err => {
  if (err) throw err;
  console.log(`ganache listening on port ${PORT}...`);
  provider = server.provider;
  accounts = await provider.request({
     method: "eth_accounts",
     params: []
  });
  console.log(accounts);  
});

Your wallet addresses with private keys are save in the wallet.json file located in your user home directory.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.