World Conquest Chronicles

World Conquest Chronicles

go-blockchain, v1.3.2

The library that implements models and algorithms of blockchain.

Add the loading of block groups to the storages (including the memory storage) and the blockchain model; simplify the passing of the proofer to the validators; make optional the creation of a genesis block on the blockchain creation; remove the redundant features.

Change Log

  • models:
    • blockchain:
      • operations:
        • creation:
          • make optional:
            • when the storage is empty:
              • creation a genesis block using a proofer;
              • storing the genesis block to the storage;
        • loading block groups from the storage;
  • proofers:
    • kinds:
      • remove the proofers.Simple structure;
  • storages:
    • operations:
      • loading block groups;
    • kinds:
      • memory storage:
        • remove the storages.MemoryStorage.Blocks() method;
  • additionally:
    • replace the blockchain.BlockDependencies structure to the blockchain.Proofer interface:
      • in the blockchain.Block structure:
        • in the blockchain.Block.IsValid() method;
        • in the blockchain.Block.IsValidGenesisBlock() method;
      • in the blockchain.BlockGroup structure:
        • in the blockchain.BlockGroup.IsValid() method;
        • in the blockchain.BlockGroup.IsLastBlockValid() method;
      • in the loading.ChunkValidatingLoader structure;
      • in the loading.LastBlockValidatingLoader structure.

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;
        • validation of the last block (using a proofer):
          • modes:
            • as a full blockchain;
            • as a blockchain chunk;
    • block group loaders:
      • loading block groups via the external interface;
      • automatically saving the loaded block groups to a storage;
      • wrappers:
        • chunk validating loader:
          • automatically validates the loaded block group as a blockchain chunk;
        • last block validating loader:
          • automatically validates the last block from the loaded block group;
          • automatically preloads the next block group to perform the above validation;
        • memoizing loader:
          • remembers loaded block groups;
          • restricts the quantity of the remembered block groups:
            • stores the loaded block groups in the LRU cache;
      • kinds:
        • memory loader:
          • loading blocks from the block group;
    • blockchain:
      • storing:
        • storage;
        • last block;
      • operations:
        • creation:
          • loading the last block from the storage;
          • when the storage is empty (optional):
            • creation a genesis block using a proofer;
            • storing the genesis block to the storage;
        • loading block groups from the storage;
        • adding a block:
          • creation a block using a proofer;
          • storing the block to the storage;
  • proofers:
    • operations:
      • block hashing;
      • block validation;
    • kinds:
      • proof of work:
        • based on the Hashcash algorithm;
        • additional storing in a block (in a hash actually):
          • nonce;
          • target bit;
  • storages:
    • operations:
      • loading block groups;
      • loading the last block;
      • storing a block;
      • storing a block group (optional);
    • wrappers:
      • wrapper that adds support for saving a block group to those storages that cannot do this;
    • kinds:
      • memory storage:
        • storing blocks in memory.

Examples

blockchain.Blockchain:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "time"

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

type StringData string

func (data StringData) String() string {
    return string(data)
}

func main() {
    timestamp := time.Date(2006, time.January, 2, 15, 4, 5, 0, time.UTC)
    blockDependencies := blockchain.BlockDependencies{
        // use the custom clock function to get the same blocks
        Clock: func() time.Time {
            timestamp = timestamp.Add(time.Hour)
            return timestamp
        },
        Proofer: proofers.ProofOfWork{TargetBit: 248},
    }

    blockchain, err := blockchain.NewBlockchain(
        StringData("genesis block"),
        blockchain.Dependencies{
            BlockDependencies: blockDependencies,
            Storage:           &storages.MemoryStorage{},
        },
    )
    if err != nil {
        log.Fatalf("unable to create the blockchain: %v", err)
    }

    const blockCount = 5
    for i := 0; i < blockCount; i++ {
        if err := blockchain.AddBlock(
            StringData(fmt.Sprintf("block #%d", i)),
        ); err != nil {
            log.Fatalf("unable to add the block: %v", err)
        }
    }

    addedBlocks, _, _ := blockchain.LoadBlocks(nil, blockCount+1)
    blocksBytes, _ := json.MarshalIndent(addedBlocks, "", "  ")
    fmt.Println(string(blocksBytes))

    // Output:
    // [
    //   {
    //     "Timestamp": "2006-01-02T16:04:05Z",
    //     "Data": "genesis block",
    //     "Hash": "248:225:00e26abd9974fcdea4b32eca43c9dc5c67fffa8efd53cebffa9b049fd6c2bb36",
    //     "PrevHash": ""
    //   },
    //   {
    //     "Timestamp": "2006-01-02T17:04:05Z",
    //     "Data": "block #0",
    //     "Hash": "248:198:0058f5dae6ca3451801a276c94862c7cce085e6f9371e50d80ddbb87c1438faf",
    //     "PrevHash": "248:225:00e26abd9974fcdea4b32eca43c9dc5c67fffa8efd53cebffa9b049fd6c2bb36"
    //   },
    //   {
    //     "Timestamp": "2006-01-02T18:04:05Z",
    //     "Data": "block #1",
    //     "Hash": "248:15:002fc891ad012c4a89f7b267a2ec1767415c627ff69b88b90a93be938b026efa",
    //     "PrevHash": "248:198:0058f5dae6ca3451801a276c94862c7cce085e6f9371e50d80ddbb87c1438faf"
    //   },
    //   {
    //     "Timestamp": "2006-01-02T19:04:05Z",
    //     "Data": "block #2",
    //     "Hash": "248:136:003c7def3d467a759fad481c03cadbd62e62b2c5dbc10e4bbb6e1944c158a8be",
    //     "PrevHash": "248:15:002fc891ad012c4a89f7b267a2ec1767415c627ff69b88b90a93be938b026efa"
    //   },
    //   {
    //     "Timestamp": "2006-01-02T20:04:05Z",
    //     "Data": "block #3",
    //     "Hash": "248:65:00d5800e119abe44d89469c2161be7f9645d7237697c6d14b4a72717893582fa",
    //     "PrevHash": "248:136:003c7def3d467a759fad481c03cadbd62e62b2c5dbc10e4bbb6e1944c158a8be"
    //   },
    //   {
    //     "Timestamp": "2006-01-02T21:04:05Z",
    //     "Data": "block #4",
    //     "Hash": "248:173:00b6863763acd6ec77ca3521589d8e68c118efe855657d702783e8e6aee169a9",
    //     "PrevHash": "248:65:00d5800e119abe44d89469c2161be7f9645d7237697c6d14b4a72717893582fa"
    //   }
    // ]
}

Repository

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

Content: code.

License: MIT.