Building a Private Ethereum Blockchain: Creating, Mining, and Transactions

·

This guide continues our series on setting up a private Ethereum blockchain using CentOS 7.5. Learn how to create a genesis block, initialize your chain, and perform transactions.


Creating the Genesis Block

The genesis block serves as the foundation of your private blockchain, similar to a linked list's head node.

Step-by-Step Setup

  1. Create a dedicated directory:

    mkdir private_eth
    cd private_eth
    touch genesis.json
  2. Configure genesis.json:

    {
     "config": {
       "chainId": 10001,
       "homesteadBlock": 0,
       "eip150Block": 0,
       "eip155Block": 0,
       "eip158Block": 0,
       "byzantiumBlock": 0,
       "constantinopleBlock": 0,
       "petersburgBlock": 0
     },
     "alloc": {},
     "coinbase": "0x0000000000000000000000000000000000000000",
     "difficulty": "0x20000",
     "extraData": "",
     "gasLimit": "0x2fefd8",
     "nonce": "0x0000000000000042",
     "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
     "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
     "timestamp": "0x00"
    }

    (Optional) Pre-fund accounts for testing by replacing "alloc":{} with:

    "alloc": {
      "0x0000000000000000000000000000000000000001": {
        "balance": "111111111"
      },
      "0x0000000000000000000000000000000000000002": {
        "balance": "222222222"
      }
    }

Initializing the Blockchain

Execute the following command to initialize your chain:

geth init genesis.json --datadir test

👉 Pro Tip: Always specify --datadir to avoid genesis block conflicts like:
Fatal: Failed to write genesis block: database contains incompatible genesis...


Launching the Ethereum Client

Start your node with RPC access (for external interactions):

geth --rpc --rpccorsdomain="*" --nodiscover --al

FAQ Section

1. Why is a genesis block necessary?

The genesis block initializes your blockchain’s parameters, ensuring all nodes start with identical configurations.

2. How do I troubleshoot "incompatible genesis" errors?

Use --datadir to isolate your chain’s data. Example:

geth init genesis.json --datadir /custom/path

3. Can I modify the genesis block later?

No—the genesis block is immutable. Changes require creating a new chain.

4. What’s the purpose of alloc in genesis.json?

It pre-funds accounts for testing. Omit it for a fresh start.

5. How do I enable mining?

Add --mine to your startup command and set a miner account with --miner.etherbase.

6. Is --rpccorsdomain="*" safe for production?

No—restrict it to trusted domains (e.g., "https://myapp.com").


Key Takeaways

👉 Explore advanced Ethereum network configurations for scaling options.