Creating a Testnet Using Geth

written in ethereum, geth

With Frontier (finally) launched more and more people are flocking to the development of the Ethereum Distributed Apps or “DAPPs” as we like to call them.

While it’s completly feasible to develop your apps against the Frontier network it is probably safer, and lighter on your wallet, to develop them on your own private network.

Let’s see how we can create our own network to develop on using Geth and a custom genesis file.

First off I am going to assume you already have Geth installed. If not please go to Ethereum.org and follow the instructions to do so.

We need a couple of things in order to succesfully create a private network:

  1. A unique networkid
  2. Not allowing outside peers
  3. Decreased start difficulty
  4. Increased Gaslimit
  5. Changing the datadir

Let’s go through these one by one.

A unique networkid

The Frontier network has the simple networkid of ‘1’. Every network has it’s own id. To define that we are working not on the Frontier network but our own private network we can tell geth to use a different networkid by using the --networkid flag. I suggest you pick something high-up to reduce the risk of collision.

Max peers

To exclude the risk of other peers connecting to your private chain further I also recommend you disable peer connections. You can do this by specifing --maxpeers 0 this will prevent Geth from searching for peers on the same networkid.

Start difficulty

The default Genesis block for Frontier expected quite a bit of mining power and as such it set up the difficulty quite high (although in the end it was still way too low as anybody mining of the first day can attest to). This number is so high in fact that the chances of you mining a block successfully are quite slim. You might be waiting ages for fast blocks since the retarget mechanism actually needs to find blocks to scale down the total difficulty and make sure we hit the 15 second block time. To help out with this we can change the difficulty parameter in the genesis file. By lowering the difficulty you will find blocks much faster. I will offer a pre-made genesis file later where this edit is already made.

Increased Gaslimit

Now the last problem is the freeze. The default genesis block has a very low start gasLimit so any contract that you might try to deploy won’t work. You can overcome this by editing the gasLimit key in the genesis file, or again download my pre-made genesis file.

Unique datadir

If you already synced to the Frontier network at one point you already have block data. You want this new network to live in it’s own folder so that you can start this new chain from scratch. You do this by supplying the --datadir flag. I’m using DevChain in the example but feel free to name this anything you want.

All together now

Let’s actually get to work now that you understand the logic behind the requirements.

First off download the development genesis file and place it somewhere you won’t forget about it.

If you want you get edit it and supply your own address with some either by replacing the bbbbbaaaaa82db86a35502193b4c6ee9a76ebe8f address with your own.

Next start geth with the following parameters: ./build/bin/geth --rpc --networkid=39318 --maxpeers=0 --datadir=~/.ethereum/DevChain/ --mine --minerthreads 1 --genesis genesis.json console

If everything went ok you should be finding blocks now… If not, let me know :)