A distributed blockchain cryptocurrency implementation, with a CLI interface.
- Ensure that you have Go installed on your machine
- Clone this repository, then, in the project directory, run:
$ go build- You can execute the binary by running:
$ ./go-cryptoNote: Running
./go-cryptowith no arguments will print usage instructions tostdout.
The "distributed" nature of this blockchain is to run many nodes on a single machine, by specifying port numbers as node IDs. You can specify the port number/node ID in a given terminal session by setting the $NODE_ID environment variable to your port number of choice.
Create a new blockchain (genesis block), and send the genesis block reward to <address>.
Generate a new wallet key pair, and save it into a corresponding wallet.dat file. Outputs the address of the new wallet to stdout.
Print the wallet balance for <address> to stdout.
Print all addresses in any wallet.dat files to stdout.
Print all blocks in the blockchain to stdout.
Rebuilds the UTXO set.
Send <amount> of coins from address to address. When -mine is used, mine on the current node.
Start a node with an ID specified in $NODE_ID environment variable. Optionally specify a -miner address.
Follow the below instructions to instantiate a new blockchain on your machine, with 3 nodes - a central node, a wallet node, and a miner node.
- Set
$NODE_IDin the current terminal session (NODE 3000):
$ export NODE_ID=3000- On NODE 3000, create a new wallet, to be used as the central node:
$ ./go-crypto createwallet
Your new address: 16uJjnDXDC6NaykibKbw76pfbfqgsUirYZ- On NODE 3000, create a new blockchain:
$ ./go-crypto createblockchain -address 16uJjnDXDC6NaykibKbw76pfbfqgsUirYZ- Save the genesis block, making it available to other nodes:
$ cp blockchain_3000.db blockchain_genesis.db- Open an additional terminal session (NODE 3001), and set
$NODE_IDto a different port number from your central node, to be used as a wallet node:
export NODE_ID=3001- On NODE 3001, generate three new wallets:
$ ./go-crypto createwallet
Your new address: 18ZpjvATd4xtra5x2QMkWmihj729BRbt6p
$ ./go-crypto createwallet
Your new address: 1GeGo7buaqo71yfCQ9NPwGFZJM1AVosteV
$ ./go-crypto createwallet
Your new address: 1Gf3ZQKc1VEouPWihSM5CimhZ7eYzbK1bC- On NODE 3000, send some coins to wallet addresses:
$ ./go-crypto send -from 16uJjnDXDC6NaykibKbw76pfbfqgsUirYZ -to 18ZpjvATd4xtra5x2QMkWmihj729BRbt6p -amount 10 -mine
fe5002a6cbd66c10dceb21d98eb0b81a1d8e09a6f253c6eca7e0a84bb8e8675f
Success!
$ ./go-crypto send -from 16uJjnDXDC6NaykibKbw76pfbfqgsUirYZ -to 1GeGo7buaqo71yfCQ9NPwGFZJM1AVosteV -amount 10 -mine
c239d7ea5933613238efb2ad300107bc6ee05d10d95192f11e75f9d5fab1753f
Success!- On NODE 3000, start the node, and keep it running for the remainder of this example:
$ ./go-crypto startnode
Starting node 3000
- On NODE 3001, start the node's blockchain with the same genesis block as the central node:
$ cp blockchain_genesis.db blockchain_3001.db- Start NODE 3001:
$ ./go-crypto startnode
Starting node 3001
Received version command
Received inv command
Recevied inventory with 3 block
Received block command
Recevied a new block!
Added block 00000cbe359cc0de4aadd87351766ca20bc0ef357b2ffa6b8c146e0de17e3621
Received block command
Recevied a new block!
Added block 0000755097a897556bb23ba856e1ff605206979b4c8d6bd1446615592866c70c
Received block command
Recevied a new block!
Added block 00003014666abc9c04a9ac8a8668d1fca221fadd285ae67d12326ba315e6c472- Check that everything's ok by stopping NODE 3001 and checking the balances:
$ ./go-crypto getbalance -address 18ZpjvATd4xtra5x2QMkWmihj729BRbt6p
Balance of '18ZpjvATd4xtra5x2QMkWmihj729BRbt6p': 10
$ ./go-crypto getbalance -address 1GeGo7buaqo71yfCQ9NPwGFZJM1AVosteV
Balance of '1GeGo7buaqo71yfCQ9NPwGFZJM1AVosteV': 10- On NODE 3001, check the balance of the central node, proving that NODE 3001 has the full blockchain:
$ ./go-crypto getbalance -address 16uJjnDXDC6NaykibKbw76pfbfqgsUirYZ
Balance of '16uJjnDXDC6NaykibKbw76pfbfqgsUirYZ': 10- Open an additional terminal session (NODE 3002), and set
$NODE_IDto a different port number from both your central node and wallet node, to be used as a miner node. Then, initialize the blockchain, create a wallet, and start NODE 3002:
$ export NODE_ID=3002
$ cp blockchain_genesis.db blockchain_3002.db
$ ./go-crypto createwallet
Your new address: 17bmRV6jrjitenXt2QfAo33qrEwKrs1sLZ
$ ./go-crypto startnode -miner 17bmRV6jrjitenXt2QfAo33qrEwKrs1sLZ
Starting node 3002
Mining is on. Address to receive rewards: 17bmRV6jrjitenXt2QfAo33qrEwKrs1sLZ
Received version command
Received inv command
Recevied inventory with 3 block
Received block command
Recevied a new block!
Added block 00000cbe359cc0de4aadd87351766ca20bc0ef357b2ffa6b8c146e0de17e3621
Received block command
Recevied a new block!
Added block 0000755097a897556bb23ba856e1ff605206979b4c8d6bd1446615592866c70c
Received block command
Recevied a new block!
Added block 00003014666abc9c04a9ac8a8668d1fca221fadd285ae67d12326ba315e6c472- On NODE 3001, complete some transactions, and observe the output on NODE 3002:
# NODE 3001
$ ./go-crypto send -from 18ZpjvATd4xtra5x2QMkWmihj729BRbt6p -to 1Gf3ZQKc1VEouPWihSM5CimhZ7eYzbK1bC -amount 1
Success!
$ ./go-crypto send -from 1GeGo7buaqo71yfCQ9NPwGFZJM1AVosteV -to 17bmRV6jrjitenXt2QfAo33qrEwKrs1sLZ -amount 1
Success!
# NODE 3002
Received inv command
Recevied inventory with 1 tx
Received tx command
Received inv command
Recevied inventory with 1 tx
Received tx command
e936a00eee5c0f66c6fe250b2d53bcb77463d6ea9cedb754981718960c29fa45
New block is mined!
Received getdata command
- Start NODE 3001 and observe it download the newly mined block:
$ ./go-crypto startnode
Starting node 3001
Received version command
Received inv command
Recevied inventory with 4 block
Received block command
Recevied a new block!
Added block 0000e7e33f3c2252adf236f776a80eaacd32f35e08b933a9a894bc722f46253e
Received block command
Recevied a new block!
Added block 00000cbe359cc0de4aadd87351766ca20bc0ef357b2ffa6b8c146e0de17e3621
Received block command
Recevied a new block!
Added block 0000755097a897556bb23ba856e1ff605206979b4c8d6bd1446615592866c70c
Received block command
Recevied a new block!
Added block 00003014666abc9c04a9ac8a8668d1fca221fadd285ae67d12326ba315e6c472