World Conquest Chronicles

World Conquest Chronicles

go-blockchain, v1.2

The library that implements models and algorithms of blockchain.

Implementing a block group abstraction with self-validation; supporting the two modes of its validation: as a full blockchain and as a blockchain chunk.

Change Log

  • models:
    • block group:
      • storing:
        • group of blocks;
      • operations:
        • self-validation (using a proofer):
          • modes:
            • as a full blockchain;
            • as a blockchain chunk;
          • takes into account a prepended chunk;
          • allows empty block groups.

Features

  • models:
    • block:
      • storing:
        • timestamp;
        • custom data;
        • hash;
        • previous hash;
      • operations:
        • creation (using a proofer);
        • getting merged data;
        • self-validation (using a proofer);
    • genesis block:
      • based on a usual block without a previous hash;
    • block group:
      • storing:
        • group of blocks;
      • operations:
        • self-validation (using a proofer):
          • modes:
            • as a full blockchain;
            • as a blockchain chunk;
          • takes into account a prepended chunk;
          • allows empty block groups;
    • blockchain:
      • storing:
        • storage;
        • last block;
      • operations:
        • creation:
          • loading the last block from the storage;
          • when the storage is empty:
            • creation a genesis block using a proofer;
            • storing the genesis block to the storage;
        • adding a block:
          • creation a block using a proofer;
          • storing the block to the storage;
  • proofers:
    • operations:
      • block hashing;
      • block validation;
    • kinds:
      • simple:
        • based on once hashing by the SHA-256 algorithm;
      • proof of work:
        • based on the Hashcash algorithm;
        • additional storing in a block (in a hash actually):
          • nonce;
          • target bit;
  • storages:
    • operations:
      • loading the last block;
      • storing a block;
    • kinds:
      • memory storage:
        • storing blocks in memory;
        • additional operations:
          • getting the stored blocks.

Examples

blockchain.BlockGroup:

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/thewizardplusplus/go-blockchain"
    "github.com/thewizardplusplus/go-blockchain/proofers"
)

type StringHasher string

func (hasher StringHasher) Hash() string {
    return string(hasher)
}

func main() {
    timestamp := time.Date(2006, time.January, 2, 15, 4, 5, 0, time.UTC)
    blockChunks := []blockchain.BlockGroup{
        // chunk #0
        {
            {
                Timestamp: timestamp.Add(6 * time.Hour),
                Data:      StringHasher("block #4"),
                Hash: "248:" +
                    "173:" +
                    "00b6863763acd6ec77ca3521589d8e68c118efe855657d702783e8e6aee169a9",
                PrevHash: "248:" +
                    "65:" +
                    "00d5800e119abe44d89469c2161be7f9645d7237697c6d14b4a72717893582fa",
            },
            {
                Timestamp: timestamp.Add(5 * time.Hour),
                Data:      StringHasher("block #3"),
                Hash: "248:" +
                    "65:" +
                    "00d5800e119abe44d89469c2161be7f9645d7237697c6d14b4a72717893582fa",
                PrevHash: "248:" +
                    "136:" +
                    "003c7def3d467a759fad481c03cadbd62e62b2c5dbc10e4bbb6e1944c158a8be",
            },
        },

        // chunk #1
        {
            {
                Timestamp: timestamp.Add(4 * time.Hour),
                Data:      StringHasher("block #2"),
                Hash: "248:" +
                    "136:" +
                    "003c7def3d467a759fad481c03cadbd62e62b2c5dbc10e4bbb6e1944c158a8be",
                PrevHash: "248:" +
                    "15:" +
                    "002fc891ad012c4a89f7b267a2ec1767415c627ff69b88b90a93be938b026efa",
            },
            {
                Timestamp: timestamp.Add(3 * time.Hour),
                Data:      StringHasher("block #1"),
                Hash: "248:" +
                    "15:" +
                    "002fc891ad012c4a89f7b267a2ec1767415c627ff69b88b90a93be938b026efa",
                PrevHash: "248:" +
                    "198:" +
                    "0058f5dae6ca3451801a276c94862c7cce085e6f9371e50d80ddbb87c1438faf",
            },
        },

        // chunk #2
        {
            {
                Timestamp: timestamp.Add(2 * time.Hour),
                Data:      StringHasher("block #0"),
                Hash: "248:" +
                    "198:" +
                    "0058f5dae6ca3451801a276c94862c7cce085e6f9371e50d80ddbb87c1438faf",
                PrevHash: "248:" +
                    "225:" +
                    "00e26abd9974fcdea4b32eca43c9dc5c67fffa8efd53cebffa9b049fd6c2bb36",
            },
            {
                Timestamp: timestamp.Add(time.Hour),
                Data:      StringHasher("genesis block"),
                Hash: "248:" +
                    "225:" +
                    "00e26abd9974fcdea4b32eca43c9dc5c67fffa8efd53cebffa9b049fd6c2bb36",
                PrevHash: "",
            },
        },
    }

    var prependedChunk blockchain.BlockGroup
    for index, blockChunk := range blockChunks {
        validationMode := blockchain.AsBlockchainChunk
        if index == len(blockChunks)-1 {
            validationMode = blockchain.AsFullBlockchain
        }

        if !blockChunk.IsValid(
            prependedChunk,
            validationMode,
            blockchain.BlockDependencies{
                Proofer: proofers.ProofOfWork{TargetBit: 248},
            },
        ) {
            log.Fatalf("chunk #%d is incorrect", index)
        }

        prependedChunk = blockChunk
    }

    fmt.Println("all chunks are correct")

    // Output:
    // all chunks are correct
}

Repository

Link: https://github.com/thewizardplusplus/go-blockchain/tree/v1.2.

Content: code.

License: MIT.