Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/izqui/blockchain
A basic blockchain implementation written in Go
https://github.com/izqui/blockchain
Last synced: about 1 month ago
JSON representation
A basic blockchain implementation written in Go
- Host: GitHub
- URL: https://github.com/izqui/blockchain
- Owner: izqui
- Created: 2014-08-13T18:55:50.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2014-08-28T18:38:05.000Z (almost 10 years ago)
- Last Synced: 2024-04-14T18:03:39.352Z (3 months ago)
- Language: Go
- Homepage:
- Size: 2.77 MB
- Stars: 836
- Watchers: 77
- Forks: 244
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
Lists
- awesome-blockchain - **Go**: _Having fun implementing a blockchain using Golang_
- awesome-blockchain - **Go**: _Having fun implementing a blockchain using Golang_
- awesome-stars - izqui/blockchain - A basic blockchain implementation written in Go (Go)
- awesome-block - **Go**: _Having fun implementing a blockchain using Golang_
- awesome-blockchain - **Go**: _Having fun implementing a blockchain using Golang_
README
# Blockchain
Having fun implementing a blockchain using Golang.Using [Minimum Viable Blockchain](https://artsec.hackpad.com/Blockchains-and-Bitcoins-mR2wlQ4KbVQ)
### Keys
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.
### Protocol
The blockchain runs on port `9191` and uses TCP to handle connections among peers.
##### Message
* Message type (1 byte)
```
const (
MESSAGE_GET_NODES = iota + 20
MESSAGE_SEND_NODESMESSAGE_GET_TRANSACTION
MESSAGE_SEND_TRANSACTIONMESSAGE_GET_BLOCK
MESSAGE_SEND_BLOCK
)
```
* Options (4 bytes): Data specific
* Data (n bytes): Data specific##### Transaction
* 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##### Block
* 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