(3 minute read)
I've recently been getting into Ethereum development. As part of that I want to be able to setup a local, private blockchain whenever needed so that I can easily and quickly test my contracts and dapps prior to deploying them to the live network. I found a great tutorial by Ade Duke which helped me get setup with a private blockchain, but the process was a bit cumbersome, and furthermore I wondered if I could automate the process and save myself some time. As it turned out, I was able to and thus geth-private was born!
geth-private is an NPM module which provides a way to quickly setup and cleanup private blockchains, both via a programmatic API and directly from the command-line.
To get started first ensure you have both geth and Node v4 installed. Then install geth-private globally:
$ npm install -g geth-private
Running a geth private blockchain is now as simple as doing:
$ geth-private
If everything works you'll see something like:
geth is now running (pid: 2428).
Etherbase: 8864324ac84c3b6c507591dfabeffdc1ad02e09b
Data folder: /var/folders/4v/br6x6mlx113235v1lz39nwfc0000gn/T/tmp-242211yXIVsOX5tP
To attach: geth attach ipc:///var/folders/4v/br6x6mlx113235v1lz39nwfc0000gn/T/tmp-242211yXIVsOX5tP/
You can use the outputted geth attach command (see above) to attach to this running instance of geth and issue commands like you normally would.
To turn on verbose logging (so that you can see what is happening under the hood) use the -v option:
$ geth-private -v
Effectively, what happens is the following:
1. geth-private first creates a folder within the system temporary folder and sets this as the --datadir for geth.
2. It then writes a genesis.json file and starts up geth, pointing it to this file.
3. Once geth has started it creates an account (which will also be the etherbase for this chain) with the password 1234.
4. It then shuts down geth and updates the genesis.json file with the account id and a preset balance of 5 million Ether (yay!)
5. It restarts geth with the same options. Now everything is ready!
The CLI can be fed some options. The best part is that any options not directly applicable to geth-private get passed onto geth itself. For example, I can customize the private network id using the --identity option which geth supports:
$ geth-private --identity mynetwork
Note that if you specify the --datadir option then it will attempt to create the specified folder if it doesn't exist. If, however, the folder already exists and there is already a genesis.json file within it then geth-private will use what's already there. Thus, if you wish to preserve your blockchain changes and re-use the same keys and accounts again simply specify a data folder location using --datadir, e.g:
$ geth-private --datadir /path/to/my/data
To get Mist / Ethereum Wallet to connect to your private network you need to set datadir to the one normally used by Mist. To find out what that is for your system you can type in:
$ geth --help | grep datadir
--datadir "/Users/myname/Library/Ethereum" Data directory for the databases and keystore
With this you will be able to create and visually manage your accounts and contracts. Cool, eh? :)
The Node.js API works very similarly to the CLI. In a nutshell here is how you can use it:
var geth = require('geth-private');
var inst = geth();
inst.start()
.then(function() {
// do some work
});
.then(function() {
// stop it
return inst.stop();
});
.catch(function(err) {
console.error(err);
})
You can pass options in the construction phase:
var geth = require('geth-private');
var inst = geth({
gethPath: '/path/to/geth',
verbose: true,
gethOptions: {
/*
These options get passed to the geth command-line
e.g.
mine: true
rpc: false,
identity: 'testnetwork123'
*/
}
});
inst.start().then(...);
With geth-private now ready it should be easier to both setup and use private blockchains, as well as write automated Node tests which do the same.
Github: hiddentao/geth-private