gocoin

command module
v0.0.0-...-168d242 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 5, 2014 License: MIT Imports: 21 Imported by: 0

README

Introduction
============

Gocoin implements a toy version of the bitcoin protocol for demonstration
purposes. It is written in Golang (http://golang.org/) so should be easily
compilable on all major platforms (Windows, Mac, Linux).

As with any toy security system, there are numerous practical attacks that make
this system insecure; the real bitcoin software and protocol are substantially
more complicated for this reason (far too complicated to implement for this kind
of project). However, gocoin does use "real" RSA signing as implemented by
Golang's standard crypto library.

Unlike bitcoin, which has an algorithm for adjusting mining speed and reward,
gocoin hard-codes values which should require about 10-15 seconds to mine a
block on a modern CPU. Each block mined rewards the miner with exactly 10 coins.
These values seem to work well for demonstration purposes.

Building a Network
==================

The program automatically starts listening on a random network port and mining
new blocks on a fresh blockchain. It takes four optional flags:

  --listen=ADDR  Choose a specific address to listen on; if not specified the
                 default is a random ephemeral port on localhost.
  --connect=ADDR Connect to the peer at the given address. The network is P2P,
                 so you only have to specify one peer and you will automatically
                 end up connected to the entire network of peers. In this case
                 the client will not start a new blockchain but will download
                 and use the network's existing longest blockchain.
  --delay        Adds random delays to certain network events in order to
                 simulate a flaky network and cause block-chain forks. Useful
                 for demoing divergence and recovery of peers with different
                 block-chains.
  --verbose      Print logs to standard output on most events, including new
                 blocks, transactions, etc.

When the program starts, the very first line it prints contains the listening
address so you can connect to it from other peers.

Interface
=========

These are the available commands in the UI:
  state  - prints out the current internal state, including details of each
           block and transaction in the primary blockchain (this can get quite
           long when the network has been running a while)
  wallet - prints out a summary of your wallet, mapping keys to coin amounts

  cons   - consolidates the value of your current wallet into single key
  pay    - allows you to pay coins to another peer out of your wallet

  addr   - prints the listening network address of the peer
  help   - displays a summary of the interface and flag help
  quit   - shuts down the peer (wallet is lost)

Limitations
===========

Real P2P network logic is quite complicated, so we fake it by simply connecting
every peer to every other peer; this doesn't scale particularly well, but for
the toy examples we're running it's just fine. Don't expect to be able to run
more than about a hundred peers though without hitting OS limits on number of
open sockets.

Due to the networked nature of the software it must handle a bunch of events in
parallel. Mutexes are used to avoid race conditions, but the user-driven UI
cannot hold a lock for the entire time it takes the user to enter payment
details or the rest of the program would grind to a halt. For this reason,
making a payment might occasionally fail if the underlying state changes while
you enter the payment details. This won't corrupt any internal data, so just
try the payment again.

Application state is not persisted in any way outside of memory. When a peer
exits, its wallet is gone forever. When the last peer in a network exits, that
blockchain and all its transactions are gone forever.

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL