From 23423b76a669d6218334a898d5c531aecc0b41eb Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 11:57:37 -0800 Subject: [PATCH 01/22] Create first draft of Chapter 15 --- 15_0_Setting_Up_a_Bitcoin_Regtest.md | 18 +++++++++++++++ 15_1_Building_the_Regtest.md | 34 ++++++++++++++++++++++++++++ 15_2_Testing_with_Regtest.md | 11 +++++++++ 3 files changed, 63 insertions(+) create mode 100644 15_0_Setting_Up_a_Bitcoin_Regtest.md create mode 100644 15_1_Building_the_Regtest.md create mode 100644 15_2_Testing_with_Regtest.md diff --git a/15_0_Setting_Up_a_Bitcoin_Regtest.md b/15_0_Setting_Up_a_Bitcoin_Regtest.md new file mode 100644 index 0000000..c5602e8 --- /dev/null +++ b/15_0_Setting_Up_a_Bitcoin_Regtest.md @@ -0,0 +1,18 @@ +# Chapter 15: Setting Up a Bitcoin Regtest + +While developing Bitcoin applications, it might happen that you want to use your applications isolated from any public Blockchain such as the Mainnet or the Testnet. +You can create a Blockchain from scratch using the Regtest, with one main advantage over Testnet: you choose when to create new blocks, so you have complete control over the environment. + +## Objectives for This Chapter + +After working through this chapter, a developer will be able to: + + * Create your own Blockchain from scratch + * Create the Genesis block and more blocks on top of it + * Get balance and interact with Bitcoind in a private way + +## Table of Contents + + * [Section One: Building the Regtest](15_1_Building_the_Regtest.md) + * [Section Two: Testing with Regtest](15_2_Testing_with_Regtest.md) + * [Section Three: Mining with Regtest](15_3_Mining_with_Regtest.md) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md new file mode 100644 index 0000000..219047f --- /dev/null +++ b/15_1_Building_the_Regtest.md @@ -0,0 +1,34 @@ +# 15.1: Building the Regtest + +> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. + +This document explains how to build a Regtest (Regression Test) by hand to be able to develop new applications without the need to interact with other peers and blocks. +Bitcoin Core’s regression test mode (regtest mode) lets you instantly create a brand-new private block chain with the same basic rules as testnet—but one major difference: you choose when to create new blocks, so you have complete control over the environment. + +## Starting Bitcoind in Regtest Mode + +To start your bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blockchain, you have to use the following command: +``` +$ bitcoind -regtest -daemon +``` + +## Generating blocks + +You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: +``` +$ bitcoin-cli -regtest generate 101 +``` + +This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. +Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. +Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. +However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. + +## Verifying balance + +After mining blocks and getting the reward for the first one, you can verify the balance on your wallet: +``` +$ bitcoin-cli -regtest getbalance +``` + +Now you can use this balance for any kind of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. diff --git a/15_2_Testing_with_Regtest.md b/15_2_Testing_with_Regtest.md new file mode 100644 index 0000000..6167277 --- /dev/null +++ b/15_2_Testing_with_Regtest.md @@ -0,0 +1,11 @@ +# 15.2: Testing with Regtest + +> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. + +This document explains how to test a Regtest (Regression Test). + +## Testing with Regtest + +After [starting Bitcoind using Regtest mode](15_1_Building_the_Regtest.md) you can use any `bitcoin-cli` command or interact with the blockchain using the RPC (Remote Procedure Call) service. + +You can try to create transactions referring to [Chapter 4 - Sending Bitcoin Transactions](04_0_Sending_Bitcoin_Transactions.md) in this guide. In order to get balance in your Regtest Wallet, you are able to [mine blocks with minimal proof-of-work and get the rewards](15_3_Mining_with_Regtest.md). From 6f23fd6dd58fd02be330a06c72fc2c0ce52aed6b Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:25:16 -0800 Subject: [PATCH 02/22] Add Chapter 15 anchors --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index de0ab6c..7a8cc18 100644 --- a/README.md +++ b/README.md @@ -104,10 +104,10 @@ Add: HOW TO DO A REFUND (short answer: ask!) ** PART FIVE: BITCOIN FUTURES ** -* 15.0: Setting Up a Bitcoin Regtest - * 15.1: Building the Regtest - * 15.2: Testing with Regtest - * 15.3: Mining with Regtest +* [15.0: Setting Up a Bitcoin Regtest](15_0_Setting_Up_a_Bitcoin_Regtest.md) + * [15.1: Building the Regtest](15_1_Building_the_Regtest.md) + * [15.2: Testing with Regtest](15_2_Testing_with_Regtest.md) + * [15.3: Mining with Regtest](15_3_Mining_with_Regtest.md) ** APPENDICES ** From 0c1b5a89b09eeceb00464764bd7187bd267bbdb1 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:28:49 -0800 Subject: [PATCH 03/22] First version of 15.3: Mining the Regtest --- 15_3_Mining_with_Regtest.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 15_3_Mining_with_Regtest.md diff --git a/15_3_Mining_with_Regtest.md b/15_3_Mining_with_Regtest.md new file mode 100644 index 0000000..8522fb4 --- /dev/null +++ b/15_3_Mining_with_Regtest.md @@ -0,0 +1,20 @@ +# 15.3: Mining the Regtest + +> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. + +This document explains how to generate (i.e. mine) blocks using a Regtest (Regression Test) blockchain. +To generate the Genesis block and the next blocks on a new blockchain requires very minimal proof-of-work, due to the low difficulty and that it follows the Testnet rules. + + +## Generating blocks + +You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: +``` +$ bitcoin-cli -regtest generate 101 +``` + +This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. +Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. +Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. +However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. + From 0bdaeb508d181717a0512c7e80ff2961db9c59b1 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:33:17 -0800 Subject: [PATCH 04/22] Update 15.1 to have anchor to other topics --- 15_1_Building_the_Regtest.md | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index 219047f..a3c132b 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -7,28 +7,13 @@ Bitcoin Core’s regression test mode (regtest mode) lets you instantly create a ## Starting Bitcoind in Regtest Mode -To start your bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blockchain, you have to use the following command: +To start your Bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blockchain, you have to use the following command: ``` $ bitcoind -regtest -daemon ``` -## Generating blocks +## What's next -You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: -``` -$ bitcoin-cli -regtest generate 101 -``` +After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_3_Mining_with_Regtest.md). +This will allow you to get balance into your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md) -This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. -Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. -Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. -However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. - -## Verifying balance - -After mining blocks and getting the reward for the first one, you can verify the balance on your wallet: -``` -$ bitcoin-cli -regtest getbalance -``` - -Now you can use this balance for any kind of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. From dfc7c96a2b62f28cdc2a77eb9fcb6d485f975776 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:33:50 -0800 Subject: [PATCH 05/22] small fix --- 15_1_Building_the_Regtest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index a3c132b..d59ce6e 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -15,5 +15,5 @@ $ bitcoind -regtest -daemon ## What's next After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_3_Mining_with_Regtest.md). -This will allow you to get balance into your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md) +This will allow you to get balance into your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md). From 39b80e57418befd468ec4145325731ace266baed Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:36:41 -0800 Subject: [PATCH 06/22] Improve 15.2 and anchors to the other documents --- 15_2_Testing_with_Regtest.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/15_2_Testing_with_Regtest.md b/15_2_Testing_with_Regtest.md index 6167277..808dfe3 100644 --- a/15_2_Testing_with_Regtest.md +++ b/15_2_Testing_with_Regtest.md @@ -4,8 +4,15 @@ This document explains how to test a Regtest (Regression Test). -## Testing with Regtest -After [starting Bitcoind using Regtest mode](15_1_Building_the_Regtest.md) you can use any `bitcoin-cli` command or interact with the blockchain using the RPC (Remote Procedure Call) service. +## Verifying balance -You can try to create transactions referring to [Chapter 4 - Sending Bitcoin Transactions](04_0_Sending_Bitcoin_Transactions.md) in this guide. In order to get balance in your Regtest Wallet, you are able to [mine blocks with minimal proof-of-work and get the rewards](15_3_Mining_with_Regtest.md). +After [mining blocks](15_3_Mining_with_Regtest.md) and getting the rewards, you can verify the balance on your wallet: +``` +$ bitcoin-cli -regtest getbalance +``` + +## Testing the Regtest +Now you should be able to use this balance for any kind of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. + +It is important to note that in order for your transactions to complete, you will have to generate/mine new blocks, so the transactions can be included into them. From a262cb5be83e3a165661a9731e3029dbf1f4453c Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:48:26 -0800 Subject: [PATCH 07/22] fix word --- 15_0_Setting_Up_a_Bitcoin_Regtest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15_0_Setting_Up_a_Bitcoin_Regtest.md b/15_0_Setting_Up_a_Bitcoin_Regtest.md index c5602e8..f7c319f 100644 --- a/15_0_Setting_Up_a_Bitcoin_Regtest.md +++ b/15_0_Setting_Up_a_Bitcoin_Regtest.md @@ -1,6 +1,6 @@ # Chapter 15: Setting Up a Bitcoin Regtest -While developing Bitcoin applications, it might happen that you want to use your applications isolated from any public Blockchain such as the Mainnet or the Testnet. +While developing Bitcoin applications, you might want to use your applications isolated from any public Blockchain such as the Mainnet or the Testnet. You can create a Blockchain from scratch using the Regtest, with one main advantage over Testnet: you choose when to create new blocks, so you have complete control over the environment. ## Objectives for This Chapter From 95514416c4606db3fa094f88f4cec9b52d28ea77 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:49:08 -0800 Subject: [PATCH 08/22] Word fix --- 15_1_Building_the_Regtest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index d59ce6e..b882c62 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -15,5 +15,5 @@ $ bitcoind -regtest -daemon ## What's next After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_3_Mining_with_Regtest.md). -This will allow you to get balance into your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md). +This will allow you to get balance in your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md). From 1e195d8baacb74262076adabd2a291117f8fc21e Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 12:49:58 -0800 Subject: [PATCH 09/22] Words fix --- 15_2_Testing_with_Regtest.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/15_2_Testing_with_Regtest.md b/15_2_Testing_with_Regtest.md index 808dfe3..abc7ad1 100644 --- a/15_2_Testing_with_Regtest.md +++ b/15_2_Testing_with_Regtest.md @@ -13,6 +13,6 @@ $ bitcoin-cli -regtest getbalance ``` ## Testing the Regtest -Now you should be able to use this balance for any kind of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. +Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. -It is important to note that in order for your transactions to complete, you will have to generate/mine new blocks, so the transactions can be included into them. +It is important to note that for your transactions to complete, you will have to generate/mine new blocks so that the transactions can be included into them. From 0c27f80628be39028336609239c1fb0eb59d2148 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 13:34:18 -0800 Subject: [PATCH 10/22] Fix "What's Next?" title to conform with the repo --- 15_1_Building_the_Regtest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index b882c62..e82305a 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -12,7 +12,7 @@ To start your Bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blo $ bitcoind -regtest -daemon ``` -## What's next +## What's Next? After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_3_Mining_with_Regtest.md). This will allow you to get balance in your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md). From 1ef4324b5823b72fe12f359686025ad58139ef07 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 13:46:18 -0800 Subject: [PATCH 11/22] Flag -regtest is needed when using the bitcoin-cli --- 15_2_Testing_with_Regtest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15_2_Testing_with_Regtest.md b/15_2_Testing_with_Regtest.md index abc7ad1..42bc637 100644 --- a/15_2_Testing_with_Regtest.md +++ b/15_2_Testing_with_Regtest.md @@ -13,6 +13,6 @@ $ bitcoin-cli -regtest getbalance ``` ## Testing the Regtest -Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. +Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. The only difference is that you need to use the flag `-regtest` when running the `bitcoin-cli` in order for the request to be sent to the Regtest Bitcoin daemon. It is important to note that for your transactions to complete, you will have to generate/mine new blocks so that the transactions can be included into them. From 643d78f67be9477f936afcdeff88cf5450ac3b13 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 13:50:02 -0800 Subject: [PATCH 12/22] Resetting the Regtest Blockchain --- 15_1_Building_the_Regtest.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index e82305a..f217a5c 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -12,6 +12,11 @@ To start your Bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blo $ bitcoind -regtest -daemon ``` +## Resetting the Regtest Blockchain + +Regtest wallets and block chain state (chainstate) are saved in the regtest subdirectory of the Bitcoin configuration directory. +If you want to start a brand new Blockchain using the Regtest mode, all you have to do is delete the `regtest` folder and restart the Bitcoind. + ## What's Next? After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_3_Mining_with_Regtest.md). From 262dc4b58b5834b061728c738a2f5ffd836619da Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Tue, 12 Dec 2017 13:54:29 -0800 Subject: [PATCH 13/22] Add example of sendtoaddress + confirm the tx --- 15_2_Testing_with_Regtest.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/15_2_Testing_with_Regtest.md b/15_2_Testing_with_Regtest.md index 42bc637..9050efb 100644 --- a/15_2_Testing_with_Regtest.md +++ b/15_2_Testing_with_Regtest.md @@ -16,3 +16,13 @@ $ bitcoin-cli -regtest getbalance Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. The only difference is that you need to use the flag `-regtest` when running the `bitcoin-cli` in order for the request to be sent to the Regtest Bitcoin daemon. It is important to note that for your transactions to complete, you will have to generate/mine new blocks so that the transactions can be included into them. + +For example, to create a transaction and include into a block: +``` +$ bitcoin-cli -regtest sendtoaddress [address] 10.0 +``` + +And after it, if your application requires 6 confirmations, you can mine additional 6 blocks into your Regtest chain: +``` +$ bitcoin-cli -regtest generate 6 +``` From 34886ffcbcb264dab9d09f9a36e60e86328a2c6d Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 14:21:44 -0800 Subject: [PATCH 14/22] Chapter 15 improvements --- 15_1_Building_the_Regtest.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index f217a5c..648cf7b 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -7,15 +7,23 @@ Bitcoin Core’s regression test mode (regtest mode) lets you instantly create a ## Starting Bitcoind in Regtest Mode -To start your Bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blockchain, you have to use the following command: +After [setting up your Bitcoin-Core VPS](02_0_Setting_Up_a_Bitcoin-Core_VPS.md), you are now able to use the Regtest mode. To start Bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blockchain, you have to use the following command: ``` $ bitcoind -regtest -daemon ``` ## Resetting the Regtest Blockchain -Regtest wallets and block chain state (chainstate) are saved in the regtest subdirectory of the Bitcoin configuration directory. -If you want to start a brand new Blockchain using the Regtest mode, all you have to do is delete the `regtest` folder and restart the Bitcoind. +Regtest wallets and block chain state (chainstate) are saved in the regtest subdirectory of the Bitcoin configuration directory: +``` +user@mybtc:~/.bitcoin# ls +bitcoin.conf regtest testnet3 +``` + +If you want to start a brand new Blockchain using the Regtest mode, all you have to do is delete the `regtest` folder and restart the Bitcoind: +``` +$ rm -rf regtest +``` ## What's Next? From c5cc9d7bf5c49588b3bd007d7bf569d0c11443e9 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 14:25:31 -0800 Subject: [PATCH 15/22] Chapter 15 improvements --- 15_3_Mining_with_Regtest.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/15_3_Mining_with_Regtest.md b/15_3_Mining_with_Regtest.md index 8522fb4..319a25c 100644 --- a/15_3_Mining_with_Regtest.md +++ b/15_3_Mining_with_Regtest.md @@ -11,7 +11,16 @@ To generate the Genesis block and the next blocks on a new blockchain requires v You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: ``` $ bitcoin-cli -regtest generate 101 +[ + "57f17afccf28b9296048b6370312678b6d8e48dc3a7b4ef7681d18ed3d91c122", + "631ff7b8135ce633c774828be3b8505726459eb65c339aab981b10363befe5a7", + ... + "1162dbfe025c7da94ee1128dc26d518a94508f532c19edc0de6bc673a909d02c", + "20cb2e815c3d42d6a117a204a0b5e726ab641c826e441b5b3417aca33f2aba48" +] ``` +The output is the block hash of every block generated (in our example, 101 hashes). + This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. From ecc3a6edb8b457489ffd6ca35d0443c5ba6d092c Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 14:44:05 -0800 Subject: [PATCH 16/22] Improve Chapter 15 - Regtest --- 15_0_Setting_Up_a_Bitcoin_Regtest.md | 6 +++--- 15_1_Building_the_Regtest.md | 5 ++--- 15_2_Testing_with_Regtest.md | 28 --------------------------- 15_3_Mining_with_Regtest.md | 29 ---------------------------- README.md | 4 ++-- 5 files changed, 7 insertions(+), 65 deletions(-) delete mode 100644 15_2_Testing_with_Regtest.md delete mode 100644 15_3_Mining_with_Regtest.md diff --git a/15_0_Setting_Up_a_Bitcoin_Regtest.md b/15_0_Setting_Up_a_Bitcoin_Regtest.md index f7c319f..aa2590b 100644 --- a/15_0_Setting_Up_a_Bitcoin_Regtest.md +++ b/15_0_Setting_Up_a_Bitcoin_Regtest.md @@ -10,9 +10,9 @@ After working through this chapter, a developer will be able to: * Create your own Blockchain from scratch * Create the Genesis block and more blocks on top of it * Get balance and interact with Bitcoind in a private way - + ## Table of Contents * [Section One: Building the Regtest](15_1_Building_the_Regtest.md) - * [Section Two: Testing with Regtest](15_2_Testing_with_Regtest.md) - * [Section Three: Mining with Regtest](15_3_Mining_with_Regtest.md) + * [Section Two: Mining with Regtest](15_2_Mining_with_Regtest.md) + * [Section Three: Testing with Regtest](15_3_Testing_with_Regtest.md) diff --git a/15_1_Building_the_Regtest.md b/15_1_Building_the_Regtest.md index 648cf7b..ee57f5f 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Building_the_Regtest.md @@ -27,6 +27,5 @@ $ rm -rf regtest ## What's Next? -After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_3_Mining_with_Regtest.md). -This will allow you to get balance in your wallet and [test the Regtest blockchain](15_2_Testing_with_Regtest.md). - +After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_2_Mining_with_Regtest.md). +This will allow you to get balance in your wallet and [test the Regtest blockchain](15_3_Testing_with_Regtest.md). diff --git a/15_2_Testing_with_Regtest.md b/15_2_Testing_with_Regtest.md deleted file mode 100644 index 9050efb..0000000 --- a/15_2_Testing_with_Regtest.md +++ /dev/null @@ -1,28 +0,0 @@ -# 15.2: Testing with Regtest - -> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. - -This document explains how to test a Regtest (Regression Test). - - -## Verifying balance - -After [mining blocks](15_3_Mining_with_Regtest.md) and getting the rewards, you can verify the balance on your wallet: -``` -$ bitcoin-cli -regtest getbalance -``` - -## Testing the Regtest -Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. The only difference is that you need to use the flag `-regtest` when running the `bitcoin-cli` in order for the request to be sent to the Regtest Bitcoin daemon. - -It is important to note that for your transactions to complete, you will have to generate/mine new blocks so that the transactions can be included into them. - -For example, to create a transaction and include into a block: -``` -$ bitcoin-cli -regtest sendtoaddress [address] 10.0 -``` - -And after it, if your application requires 6 confirmations, you can mine additional 6 blocks into your Regtest chain: -``` -$ bitcoin-cli -regtest generate 6 -``` diff --git a/15_3_Mining_with_Regtest.md b/15_3_Mining_with_Regtest.md deleted file mode 100644 index 319a25c..0000000 --- a/15_3_Mining_with_Regtest.md +++ /dev/null @@ -1,29 +0,0 @@ -# 15.3: Mining the Regtest - -> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. - -This document explains how to generate (i.e. mine) blocks using a Regtest (Regression Test) blockchain. -To generate the Genesis block and the next blocks on a new blockchain requires very minimal proof-of-work, due to the low difficulty and that it follows the Testnet rules. - - -## Generating blocks - -You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: -``` -$ bitcoin-cli -regtest generate 101 -[ - "57f17afccf28b9296048b6370312678b6d8e48dc3a7b4ef7681d18ed3d91c122", - "631ff7b8135ce633c774828be3b8505726459eb65c339aab981b10363befe5a7", - ... - "1162dbfe025c7da94ee1128dc26d518a94508f532c19edc0de6bc673a909d02c", - "20cb2e815c3d42d6a117a204a0b5e726ab641c826e441b5b3417aca33f2aba48" -] -``` -The output is the block hash of every block generated (in our example, 101 hashes). - - -This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. -Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. -Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. -However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. - diff --git a/README.md b/README.md index 7a8cc18..6442540 100644 --- a/README.md +++ b/README.md @@ -106,8 +106,8 @@ Add: HOW TO DO A REFUND (short answer: ask!) * [15.0: Setting Up a Bitcoin Regtest](15_0_Setting_Up_a_Bitcoin_Regtest.md) * [15.1: Building the Regtest](15_1_Building_the_Regtest.md) - * [15.2: Testing with Regtest](15_2_Testing_with_Regtest.md) - * [15.3: Mining with Regtest](15_3_Mining_with_Regtest.md) + * [15.2: Mining with Regtest](15_2_Mining_with_Regtest.md) + * [15.3: Testing with Regtest](15_3_Testing_with_Regtest.md) ** APPENDICES ** From 10b56c708e64b7ea41adb3c92267a93f45d37a1b Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 14:47:54 -0800 Subject: [PATCH 17/22] Add chapters --- 15_2_Mining_with_Regtest.md | 28 +++++++++++++ 15_3_Testing_with_Regtest.md | 77 ++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 15_2_Mining_with_Regtest.md create mode 100644 15_3_Testing_with_Regtest.md diff --git a/15_2_Mining_with_Regtest.md b/15_2_Mining_with_Regtest.md new file mode 100644 index 0000000..885e4e0 --- /dev/null +++ b/15_2_Mining_with_Regtest.md @@ -0,0 +1,28 @@ +# 15.2: Mining the Regtest + +> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. + +This document explains how to generate (i.e. mine) blocks using a Regtest (Regression Test) blockchain. +To generate the Genesis block and the next blocks on a new blockchain requires very minimal proof-of-work, due to the low difficulty and that it follows the Testnet rules. + + +## Generating blocks + +You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: +``` +$ bitcoin-cli -regtest generate 101 +[ + "57f17afccf28b9296048b6370312678b6d8e48dc3a7b4ef7681d18ed3d91c122", + "631ff7b8135ce633c774828be3b8505726459eb65c339aab981b10363befe5a7", + ... + "1162dbfe025c7da94ee1128dc26d518a94508f532c19edc0de6bc673a909d02c", + "20cb2e815c3d42d6a117a204a0b5e726ab641c826e441b5b3417aca33f2aba48" +] +``` +The output is the block hash of every block generated (in our example, 101 hashes). + + +This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. +Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. +Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. +However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. diff --git a/15_3_Testing_with_Regtest.md b/15_3_Testing_with_Regtest.md new file mode 100644 index 0000000..1b9b750 --- /dev/null +++ b/15_3_Testing_with_Regtest.md @@ -0,0 +1,77 @@ +# 15.3: Testing with Regtest + +> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. + +This document explains how to test a Regtest (Regression Test). + + +## Verifying balance + +After [mining blocks](15_2_Mining_with_Regtest.md) and getting the rewards, you can verify the balance on your wallet: +``` +$ bitcoin-cli -regtest getbalance + +``` + +## Testing the Regtest +Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. The only difference is that you need to use the flag `-regtest` when running the `bitcoin-cli` in order for the request to be sent to the Regtest Bitcoin daemon. + +It is important to note that for your transactions to complete, you will have to generate/mine new blocks so that the transactions can be included into them. + +For example, to create a transaction and include into a block, you should use the `sendtoaddress` command: +``` +$ bitcoin-cli -regtest sendtoaddress [address] 15.1 +e834a4ac6ef754164c8e3f0be4f34531b74b768199ffb244ab9f6cb1bbc7465a +``` + +The output is the transaction hash included in the blockchain. You can verify the details using the `gettransaction`: +``` +$ bitcoin-cli -regtest gettransaction e834a4ac6ef754164c8e3f0be4f34531b74b768199ffb244ab9f6cb1bbc7465a +{ + "amount": 0.00000000, + "fee": -0.00178800, + "confirmations": 0, + "trusted": false, + "txid": "e834a4ac6ef754164c8e3f0be4f34531b74b768199ffb244ab9f6cb1bbc7465a", + "walletconflicts": [ + ], + "time": 1513204730, + "timereceived": 1513204730, + "bip125-replaceable": "unknown", + "details": [ + { + "account": "", + "address": "mjtN3C97kuWMgeBbxdB7hG1bjz24Grx2vA", + "category": "send", + "amount": -15.10000000, + "label": "", + "vout": 1, + "fee": -0.00178800, + "abandoned": false + }, + { + "account": "", + "address": "mjtN3C97kuWMgeBbxdB7hG1bjz24Grx2vA", + "category": "receive", + "amount": 15.10000000, + "label": "", + "vout": 1 + } + ], + "hex": "020000000f00fe2c7b70b925d0d40011ce96f8991fee5aba9537bd1b6913b37c37b041a57c00000000494830450221009ad02bfeee2a49196a99811ace20e2e7fefd16d33d525884edbc64bf6e2b1db502200b94f4000556391b0998932edde3033ba2517733c7ddffb87d91f6b756629fe201feffffff06a9301a2b39875b68f8058b8e2ad0b658f505e44a67e1e1d039140ae186ed1f0000000049483045022100c65cd13a85af6fcfba74d2852276a37076c89a7642429aa111b7986eea7fd6c7022012bbcb633d392ed469d5befda8df0a6b96e1acfa342f559877edebc2af7cb93401feffffff434b6f67e5e068401553e89f739a3edc667504597f29feb8edafc2b081cc32d90000000049483045022100b86ecc43e602180c787c36465da7fc8d1e8bfba23d6f49c37190c20889f2dfa0022032c3aec3ceefbb7a33c040ef19090cacbfd6bc9c5cd8e94252eb864891c6f34501feffffff4c65b43f8568ce58fc4c55d24ba0742e9878a031fdfae0fadac7247f42cc1f8e0000000049483045022100d055acfce852259dde051dc61792f94277d094c5da96752f925582b8e739868f02205e69add76e6b001073ad6b7df5f32a681fc8513ee0f6e126ee1c2d45149bd91d01feffffff5a72d60b58300974c5d4731e29b437ea61b87b6733bb3ca6ce5548ef8887d05b0000000049483045022100a7f5b2ee656a5a904fb27f982210de6858dfb165777ec969a77ea1c2c82975a4022001a1a563dbc3714047ec855f7aee901e756b851e255f35435e85c2ba7b0abd8401feffffff60d68e9d5650d55bc9e0b2a65ed27a3b9bceac4955760aa1560408854c3b148d000000004948304502210081a6f0c8232c52f3eaca825965077e88b816e503834989be4afb3f44f87eb98202207ae8becb99efe379fb269f477e7bb70d117dcb83e106c53b7addaa9715029da101feffffff63e2239425aad544f6e1157d5ee245d2500d4e9e9daf8049e0a38add6246da890000000049483045022100e0ab1752e8fbb244b63f7dd5649f2222e0dc42fae293b758e0c28082f77560b60220013f72fbe50acf4af197890b4d18fa89094055ed66f9226a6b461cc4ff560f8e01feffffff6aad4151087f4209ace714193dd64f770305dfb89470b79cca538b88253fbbef0000000049483045022100fee4a5f7ec6e8b55bd6aa0e93b5399af724039171d998b926e8095b70953d5f202203db0d4ef9d1bd57aeff0fe3d47d4358ec0559135dac8107507741eef0638279201feffffff7ddbca5854e25e6a2dfeacfe5828267cd1ef5d86e1da573fe2c2b21b45ecd6ce0000000049483045022100bf45241525592df4625642972dbc940ef74771139dd844bc6a9517197d01488c02203c99ca98892cc2693e8fbb9a600962eec84494fb8596acf0d670822624e497c901feffffff8672949de559e76601684c4ac3731599fd965d0c412e7df9f8ec16038d4420a60000000049483045022100b5a9bd3c6718c6bd2a8300bbd1d9de0ff1c5d02aeb6a659c52bb88958e7e3b0302207f710db1ef975c22edf54e063169aae31bbe470166cc0e5c34fd27b730b8e7d001feffffff8e006b0bb8cef2c5c2a11c8c2aa7d3ba01cb4386c7f780c45bc1014142b425f00000000048473044022046dc9db8daeb09b7c0b9f48013c8af2d0a71f688adaa8d91b40891768c852d4a02204fa15da6d58851191344a56c63bf51a540ec03f73117a3446230bb58a8a4bcce01feffffffbad05b8f86182b9b7c9c5aaa9ce3dc8d08a76848e49a2d9b8dcfb0f764bb26ca000000004847304402200682379dc36cb486309eac4913f41ac19638525677edad45ca8d9a2b0728b12f02203fb44f8a46cbc4c02f5699d7d4d9cd810bdf7e7c981b421218ccbcb7b73845f501feffffffd35228fe9ef0a742eacffc4a13f15ed7ba23854e6cb49d5010810ac11b5bdf690000000048473044022030045b882500808bd707f4654becc63de070818c82716310d39576decdd724e3022034d3b41cb5e939f0011bb5251be7941b6077fde5f4eff59afd8e49a2844288f701fefffffff5ae4cbd4ae8d68b5a34be3231cdc88b660447175f39cf7a86397f37641d4aa70000000049483045022100afe16f0de96a8629d6148f93520d690f30126c37e7f7f05300745a1273d7eb7202200933f6b371c4ea522570f3ec2aee9be2b59730b634e828f543bcdb019cf4749901fefffffff633f61ac61683221cc3d2665cf4bcf193af1c8ffe9d3d756ba83cc5eb7643250000000049483045022100ef0b8853c94d60634eff2fc1d4d75872aacb0a2d3242308b7ee256b24739c614022069fe9be8288bdd635871c263c46be710c001729d43f6fbc1350ed1a693c4646301feffffff0250780000000000001976a91464ed7fb2fe0b06f4cad0d731b122222e3e91088a88ac80c5005a000000001976a9142fed0f02d008f89f6a874168e506e2d4f9bcbfb888acd32b0000" +} +``` + +After creating a transaction, it has to be confirmed and recorded in the Blockchain, the transaction has to be included in a block. +Most of the applications require 6 block confirmations to consider the transaction as irreversible. If that is your case, you can mine additional 6 blocks into your Regtest chain: +``` +$ bitcoin-cli -regtest generate 6 +[ + "33549b2aa249f0a814db4a2ba102194881c14a2ac041c23dcc463b9e4e128e9f", + "2cc5c2012e2cacf118f9db4cdd79582735257f0ec564418867d6821edb55715e", + "128aaa99e7149a520080d90fa989c62caeda11b7d06ed1965e3fa7c76fa1d407", + "6037cc562d97eb3984cca50d8c37c7c19bae8d79b8232b92bec6dcc9708104d3", + "2cb276f5ed251bf629dd52fd108163703473f57c24eac94e169514ce04899581", + "57193ba8fd2761abf4a5ebcb4ed1a9ec2e873d67485a7cb41e75e13c65928bf3" +] +``` From 422484e5587f1c425da49e67705407ddedf946b8 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 15:02:36 -0800 Subject: [PATCH 18/22] Improvements --- 15_3_Testing_with_Regtest.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15_3_Testing_with_Regtest.md b/15_3_Testing_with_Regtest.md index 1b9b750..5ee14d9 100644 --- a/15_3_Testing_with_Regtest.md +++ b/15_3_Testing_with_Regtest.md @@ -10,8 +10,9 @@ This document explains how to test a Regtest (Regression Test). After [mining blocks](15_2_Mining_with_Regtest.md) and getting the rewards, you can verify the balance on your wallet: ``` $ bitcoin-cli -regtest getbalance - +50.00000000 ``` +This will print the balance in your wallet. ## Testing the Regtest Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. The only difference is that you need to use the flag `-regtest` when running the `bitcoin-cli` in order for the request to be sent to the Regtest Bitcoin daemon. From 37a755b325ed8155907d322af99f4d84ec016023 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 19:25:59 -0800 Subject: [PATCH 19/22] What's next on 15.2 Mining --- 15_2_Mining_with_Regtest.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/15_2_Mining_with_Regtest.md b/15_2_Mining_with_Regtest.md index 885e4e0..c8aea1d 100644 --- a/15_2_Mining_with_Regtest.md +++ b/15_2_Mining_with_Regtest.md @@ -26,3 +26,8 @@ This command will generate 101 blocks using a special RPC which is only availabl Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. + + +## What's Next? + +After starting your bitcoind in the Regtest mode and generating the first blocks, you have balance in your address to spend and [test the Regtest blockchain](15_3_Testing_with_Regtest.md). From d87501934109435efa861e34a8a8c3220479b80d Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 22:07:06 -0800 Subject: [PATCH 20/22] Add bitcointest --- 15_3_Testing_with_Regtest.md | 64 +++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/15_3_Testing_with_Regtest.md b/15_3_Testing_with_Regtest.md index 5ee14d9..83d1fb2 100644 --- a/15_3_Testing_with_Regtest.md +++ b/15_3_Testing_with_Regtest.md @@ -14,7 +14,7 @@ $ bitcoin-cli -regtest getbalance ``` This will print the balance in your wallet. -## Testing the Regtest +## Validating the Regtest Now you should be able to use this balance for any type of interaction with the private Blockchain, such as sending Bitcoin transactions according to [Chapter 4]((04_0_Sending_Bitcoin_Transactions.md)) in this guide. The only difference is that you need to use the flag `-regtest` when running the `bitcoin-cli` in order for the request to be sent to the Regtest Bitcoin daemon. It is important to note that for your transactions to complete, you will have to generate/mine new blocks so that the transactions can be included into them. @@ -76,3 +76,65 @@ $ bitcoin-cli -regtest generate 6 "57193ba8fd2761abf4a5ebcb4ed1a9ec2e873d67485a7cb41e75e13c65928bf3" ] ``` + + +## Testing with Regtest + +When you are in the Regtest mode, you are able to simulate edge cases and attacks that might happen in the real world, such as Double Spend. +We are going to use the package [bitcointest by dgarage](https://github.com/dgarage/bitcointest) to simulate a transaction from one wallet to another, but you can check [their guide](https://www.npmjs.com/package/bitcointest) for more specific attack simulations, such as Double Spend. + +First of all, you need to install Node.js, and use the NPM (Node Package Manager) to install `bitcointest`: +``` +$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - +$ sudo apt-get install -y nodejs +$ npm install -g bitcointest +``` + +After installing `bitcointest`, you can create the `test.js` file with the following content: +``` +$ nano test.js +const { BitcoinNet, BitcoinGraph } = require('bitcointest'); +net = new BitcoinNet('/usr/local/bin', '/tmp/bitcointest/', 22001, 22002); +graph = new BitcoinGraph(net); + +try { + + console.log('Launching nodes...'); + + const nodes = net.launchBatchS(4); + const [ n1, n2 ] = nodes; + net.waitForNodesS(nodes, 20000); + + console.log('Connected!'); + const blocks = n1.generateBlocksS(110); + console.info('Generated 110 blocks'); + + console.log(`n2.balance (before) = ${n2.getBalanceS()}`); + + const sometxid = n1.sendToNodeS(n2, 100); + console.log(`Generated transaction = ${sometxid}`); + n1.generateBlocksS(110); + n2.waitForBalanceChangeS(0); + + const sometx = n2.getTransactionS(sometxid); + console.log(`n2.balance (after) = ${n2.getBalanceS()}`); + + +} catch (e) { + console.error(e); + net.shutdownS(); + throw e; +} +``` + +When running `node test.js`, the command outputs: +``` +$ node test.js +Launching nodes... +Connected! +Generated 110 blocks +n2.balance (before) = 0 +Generated transaction = 91e0040c26fc18312efb80bad6ec3b00202a83465872ecf495c392a0b6afce35 +n2.after (before) = 100 + +``` From 6715a51fe8f2370b136940eba22479aa4fcd7304 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 22:23:55 -0800 Subject: [PATCH 21/22] Use javascript lang on the snippet --- 15_3_Testing_with_Regtest.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/15_3_Testing_with_Regtest.md b/15_3_Testing_with_Regtest.md index 83d1fb2..669a14d 100644 --- a/15_3_Testing_with_Regtest.md +++ b/15_3_Testing_with_Regtest.md @@ -93,6 +93,8 @@ $ npm install -g bitcointest After installing `bitcointest`, you can create the `test.js` file with the following content: ``` $ nano test.js +``` +```javascript const { BitcoinNet, BitcoinGraph } = require('bitcointest'); net = new BitcoinNet('/usr/local/bin', '/tmp/bitcointest/', 22001, 22002); graph = new BitcoinGraph(net); From 111be64c2c7fdfd76fff42a57f9db232a6dd96af Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Thu, 14 Dec 2017 09:14:26 -0800 Subject: [PATCH 22/22] Improvements --- 15_0_Setting_Up_a_Bitcoin_Regtest.md | 4 ++-- ..._the_Regtest.md => 15_1_Starting_the_Regtest.md | 10 +++++----- 15_2_Mining_with_Regtest.md | 11 ++++++----- 15_3_Testing_with_Regtest.md | 14 +++++++------- README.md | 2 +- 5 files changed, 21 insertions(+), 20 deletions(-) rename 15_1_Building_the_Regtest.md => 15_1_Starting_the_Regtest.md (65%) diff --git a/15_0_Setting_Up_a_Bitcoin_Regtest.md b/15_0_Setting_Up_a_Bitcoin_Regtest.md index aa2590b..ad47a12 100644 --- a/15_0_Setting_Up_a_Bitcoin_Regtest.md +++ b/15_0_Setting_Up_a_Bitcoin_Regtest.md @@ -8,11 +8,11 @@ You can create a Blockchain from scratch using the Regtest, with one main advant After working through this chapter, a developer will be able to: * Create your own Blockchain from scratch - * Create the Genesis block and more blocks on top of it + * Generate/mine blocks and get the rewards * Get balance and interact with Bitcoind in a private way ## Table of Contents - * [Section One: Building the Regtest](15_1_Building_the_Regtest.md) + * [Section One: Starting the Regtest](15_1_Starting_the_Regtest.md) * [Section Two: Mining with Regtest](15_2_Mining_with_Regtest.md) * [Section Three: Testing with Regtest](15_3_Testing_with_Regtest.md) diff --git a/15_1_Building_the_Regtest.md b/15_1_Starting_the_Regtest.md similarity index 65% rename from 15_1_Building_the_Regtest.md rename to 15_1_Starting_the_Regtest.md index ee57f5f..28f7c8c 100644 --- a/15_1_Building_the_Regtest.md +++ b/15_1_Starting_the_Regtest.md @@ -1,13 +1,13 @@ -# 15.1: Building the Regtest +# 15.1: Starting the Regtest > **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. This document explains how to build a Regtest (Regression Test) by hand to be able to develop new applications without the need to interact with other peers and blocks. Bitcoin Core’s regression test mode (regtest mode) lets you instantly create a brand-new private block chain with the same basic rules as testnet—but one major difference: you choose when to create new blocks, so you have complete control over the environment. -## Starting Bitcoind in Regtest Mode +## Starting Bitcoind on Regtest -After [setting up your Bitcoin-Core VPS](02_0_Setting_Up_a_Bitcoin-Core_VPS.md), you are now able to use the Regtest mode. To start Bitcoind (Bitcoin Daemon) in Regtest mode and create a private Blockchain, you have to use the following command: +After [setting up your Bitcoin-Core VPS](02_0_Setting_Up_a_Bitcoin-Core_VPS.md), you are now able to use Regtest. To start Bitcoind (Bitcoin Daemon) on Regtest and create a private Blockchain, you have to use the following command: ``` $ bitcoind -regtest -daemon ``` @@ -20,12 +20,12 @@ user@mybtc:~/.bitcoin# ls bitcoin.conf regtest testnet3 ``` -If you want to start a brand new Blockchain using the Regtest mode, all you have to do is delete the `regtest` folder and restart the Bitcoind: +If you want to start a brand new Blockchain using regtest, all you have to do is delete the `regtest` folder and restart the Bitcoind: ``` $ rm -rf regtest ``` ## What's Next? -After starting your bitcoind in the Regtest mode, you can now use Regtest-specific RPC commands to [generate/mine blocks in your private chain](15_2_Mining_with_Regtest.md). +After starting your bitcoind on regtest, you can now use RPC commands to [generate/mine blocks in your private chain](15_2_Mining_with_Regtest.md). This will allow you to get balance in your wallet and [test the Regtest blockchain](15_3_Testing_with_Regtest.md). diff --git a/15_2_Mining_with_Regtest.md b/15_2_Mining_with_Regtest.md index c8aea1d..b07814f 100644 --- a/15_2_Mining_with_Regtest.md +++ b/15_2_Mining_with_Regtest.md @@ -3,12 +3,12 @@ > **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. This document explains how to generate (i.e. mine) blocks using a Regtest (Regression Test) blockchain. -To generate the Genesis block and the next blocks on a new blockchain requires very minimal proof-of-work, due to the low difficulty and that it follows the Testnet rules. +To generate blocks on a new blockchain requires very minimal proof-of-work and it will take less than a second, due to the low difficulty and that it follows the Testnet rules. ## Generating blocks -You can generate/mine new blocks using the RPC method `generate`. This method is only available in the Regtest mode, using the following command: +You can generate/mine new blocks using the RPC method `generate`. It only makes sense to use this method on regtest, due to the high difficulty it's very unlikely that it will yield to new blocks in the mainnet or testnet: ``` $ bitcoin-cli -regtest generate 101 [ @@ -22,12 +22,13 @@ $ bitcoin-cli -regtest generate 101 The output is the block hash of every block generated (in our example, 101 hashes). -This command will generate 101 blocks using a special RPC which is only available in regtest mode. This takes less than a second on a generic PC. +This command will generate 101 blocks using a special RPC to generate the blocks on your regtest network. Running this command only makes sense on the regtest, if you try to run on the mainnet or testnet, it is very unlikely that it will be able to yield any block. On regtest, this takes less than a second on a generic PC. Because this is a new block chain using Bitcoin’s default rules, the first blocks pay a block reward of 50 bitcoins. -Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. +Unlike mainnet, in regtest mode only the first 150 blocks pay a reward of 50 bitcoins. After that, the reward halves after 150 blocks, so it pays 25, 12.5, and so on... + However, a block must have 100 confirmations before that reward can be spent, so we generate 101 blocks to get access to the coinbase transaction from block #1. ## What's Next? -After starting your bitcoind in the Regtest mode and generating the first blocks, you have balance in your address to spend and [test the Regtest blockchain](15_3_Testing_with_Regtest.md). +After starting your bitcoind on regtest and generating the first blocks, you have balance in your address to spend and [test using Regtest blockchain](15_3_Testing_with_Regtest.md). diff --git a/15_3_Testing_with_Regtest.md b/15_3_Testing_with_Regtest.md index 669a14d..954771a 100644 --- a/15_3_Testing_with_Regtest.md +++ b/15_3_Testing_with_Regtest.md @@ -2,7 +2,7 @@ > **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. -This document explains how to test a Regtest (Regression Test). +This document explains how to test transactions and situations using regtest (regression test). ## Verifying balance @@ -80,7 +80,7 @@ $ bitcoin-cli -regtest generate 6 ## Testing with Regtest -When you are in the Regtest mode, you are able to simulate edge cases and attacks that might happen in the real world, such as Double Spend. +When you are on regtest, you are able to simulate edge cases and attacks that might happen in the real world, such as Double Spend. We are going to use the package [bitcointest by dgarage](https://github.com/dgarage/bitcointest) to simulate a transaction from one wallet to another, but you can check [their guide](https://www.npmjs.com/package/bitcointest) for more specific attack simulations, such as Double Spend. First of all, you need to install Node.js, and use the NPM (Node Package Manager) to install `bitcointest`: @@ -96,8 +96,8 @@ $ nano test.js ``` ```javascript const { BitcoinNet, BitcoinGraph } = require('bitcointest'); -net = new BitcoinNet('/usr/local/bin', '/tmp/bitcointest/', 22001, 22002); -graph = new BitcoinGraph(net); +const net = new BitcoinNet('/usr/local/bin', '/tmp/bitcointest/', 22001, 22002); +const graph = new BitcoinGraph(net); try { @@ -123,9 +123,9 @@ try { } catch (e) { - console.error(e); - net.shutdownS(); - throw e; + console.error(e); + net.shutdownS(); + throw e; } ``` diff --git a/README.md b/README.md index 6442540..1450e92 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Add: HOW TO DO A REFUND (short answer: ask!) ** PART FIVE: BITCOIN FUTURES ** * [15.0: Setting Up a Bitcoin Regtest](15_0_Setting_Up_a_Bitcoin_Regtest.md) - * [15.1: Building the Regtest](15_1_Building_the_Regtest.md) + * [15.1: Starting the Regtest](15_1_Starting_the_Regtest.md) * [15.2: Mining with Regtest](15_2_Mining_with_Regtest.md) * [15.3: Testing with Regtest](15_3_Testing_with_Regtest.md)