A basic blockchain implementation written in Go
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
.todos Add Core Aug 27, 2014
benchmarks Benchmarks Aug 27, 2014
cli Presentation Aug 28, 2014
core Presentation Aug 28, 2014
scripts Block broadcast is working Aug 26, 2014
.gitignore Presentation Aug 28, 2014
Dockerfile Presentation Aug 28, 2014
README.md Implement merkel root and test it Aug 21, 2014
presentation.md presentation.md Aug 28, 2014



Having fun implementing a blockchain using Golang.

Using Minimum Viable Blockchain


The Blockchain uses ECDSA (224 bits) keys. When a user first joins the blockchain a random key will be generated.

Keys are encoded using base58.

Given x, y as the components of the public key, the key is generated as following:

	base58(BigInt(append(x as bytes, y as bytes)))

Proof of work

In order to sign a transaction and send it to the network, proof of work is required.

Proof of work is also required for block generation.


The blockchain runs on port 9191 and uses TCP to handle connections among peers.

  • Message type (1 byte)
     const (
     	MESSAGE_GET_NODES = iota + 20
  • Options (4 bytes): Data specific
  • Data (n bytes): Data specific
  • Header:

    • From (80 bytes): Origin public key
    • To (80 bytes): Destination public key
    • Timestamp (4 bytes): int32 UNIX timestamp
    • Payload Hash (32 bytes): sha256(payloadData)
    • Payload Length (4 bytes): len(payloadData)
    • Nonce (4 bytes): Proof of work
  • Signature (80 bytes): signed(sha256(header))

  • Payload data (Payload Length bytes): raw data

  • Header:

    • Origin (80 bytes): Origin public key
    • Timestamp (4 bytes): int32 UNIX timestamp
    • Previous block (32 bytes): sha256(previous block header)
    • Merkel Root (32 Bytes): sha256(transaction hashes)
    • Nonce (4 bytes): int32 UNIX timestamp
  • Signature (80 bytes): signed(sha256(header))

  • Block transactions