DEV Community

Santosh Anand
Santosh Anand

Posted on

Write a Simple blockchain in Golang

Creating a full blockchain implementation in Golang can be quite complex, but here are some basic example to get started. This example will demonstrate the basic structure of a blockchain, including blocks, transactions, and mining. Please note that this implementation is simplified and lacks many features found in real-world blockchain systems.

package main

import (
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "time"
)

// Block represents a single block in the blockchain
type Block struct {
    Index     int
    Timestamp string
    Data      string
    PrevHash  string
    Hash      string
}

// Blockchain represents the entire blockchain
type Blockchain struct {
    Chain []Block
}

// CalculateHash calculates the hash of a block
func CalculateHash(block Block) string {
    record := string(block.Index) + block.Timestamp + block.Data + block.PrevHash
    hash := sha256.New()
    hash.Write([]byte(record))
    hashed := hash.Sum(nil)
    return hex.EncodeToString(hashed)
}

// GenerateBlock creates a new block in the blockchain
func (chain *Blockchain) GenerateBlock(data string) Block {
    prevBlock := chain.Chain[len(chain.Chain)-1]
    newBlock := Block{
        Index:     prevBlock.Index + 1,
        Timestamp: time.Now().String(),
        Data:      data,
        PrevHash:  prevBlock.Hash,
    }
    newBlock.Hash = CalculateHash(newBlock)
    return newBlock
}

// AddBlock adds a new block to the blockchain
func (chain *Blockchain) AddBlock(data string) {
    newBlock := chain.GenerateBlock(data)
    chain.Chain = append(chain.Chain, newBlock)
}

// GenesisBlock creates the first block in the blockchain
func GenesisBlock() Block {
    return Block{
        Index:     0,
        Timestamp: time.Now().String(),
        Data:      "Genesis Block",
        PrevHash:  "",
        Hash:      "",
    }
}

func main() {
    // Create a new blockchain with the genesis block
    blockchain := Blockchain{[]Block{GenesisBlock()}}

    // Add some blocks to the blockchain
    blockchain.AddBlock("Transaction 1")
    blockchain.AddBlock("Transaction 2")

    // Print the entire blockchain
    for _, block := range blockchain.Chain {
        fmt.Printf("Index: %d\n", block.Index)
        fmt.Printf("Timestamp: %s\n", block.Timestamp)
        fmt.Printf("Data: %s\n", block.Data)
        fmt.Printf("Previous Hash: %s\n", block.PrevHash)
        fmt.Printf("Hash: %s\n", block.Hash)
        fmt.Println()
    }
}

Enter fullscreen mode Exit fullscreen mode

This code creates a basic blockchain with blocks containing an index, timestamp, data, previous hash, and current hash. It also provides functions to generate new blocks, add blocks to the blockchain, and calculate the hash of a block. However, it lacks features such as proof-of-work, consensus algorithms, and network communication, which are essential for a fully functional blockchain system.

Top comments (0)