From 1bb7c048182cd6ecea73bf724298db7b36dcfdeb Mon Sep 17 00:00:00 2001 From: Prayank Date: Thu, 17 Jun 2021 03:05:56 +0530 Subject: [PATCH] Add i2p + Rename Tor section to Privacy + Add i2p chapter in Privacy section + Change chapter numbers accordingly + Create `i2p_service.md` + Table for basic differences between Tor and i2p + Follow the same format for `15_0_Using_i2p.md` as used in Tor chapter + Add details in the steps used to create Bitcoin Core i2p service --- 15_0_Using_i2p.md | 31 +++++++ 15_1_i2p_service.md | 85 +++++++++++++++++++ ...Bitcoind.md => 16_0_Talking_to_Bitcoind.md | 0 ..._C.md => 16_1_Accessing_Bitcoind_with_C.md | 0 ....md => 16_2_Programming_Bitcoind_with_C.md | 0 ...Receiving_Bitcoind_Notifications_with_C.md | 0 ...ly.md => 17_0_Programming_with_Libwally.md | 0 ...Libwally.md => 17_1_Setting_Up_Libwally.md | 0 ...ally.md => 17_2_Using_BIP39_in_Libwally.md | 0 ...ally.md => 17_3_Using_BIP32_in_Libwally.md | 0 ...ally.md => 17_4_Using_PSBTs_in_Libwally.md | 0 ...ly.md => 17_5_Using_Scripts_in_Libwally.md | 0 ... 17_6_Using_Other_Functions_in_Libwally.md | 0 ..._7_Integrating_Libwally_and_Bitcoin-CLI.md | 0 ...er.md => 18_0_Talking_to_Bitcoind_Other.md | 0 ...o.md => 18_1_Accessing_Bitcoind_with_Go.md | 0 ...md => 18_2_Accessing_Bitcoind_with_Java.md | 24 +++--- ... => 18_3_Accessing_Bitcoind_with_NodeJS.md | 0 ... => 18_4_Accessing_Bitcoind_with_Python.md | 0 ...md => 18_5_Accessing_Bitcoind_with_Rust.md | 0 ...d => 18_6_Accessing_Bitcoind_with_Swift.md | 0 ...19_0_Understanding_Your_Lightning_Setup.md | 0 ... => 19_1_Verifying_Your_Lightning_Setup.md | 0 ...md => 19_2_Knowing_Your_lightning_Setup.md | 0 ...rlude_Accessing_a_Second_Lightning_Node.md | 0 ...Channel.md => 19_3_Setting_Up_a_Channel.md | 0 ...ng_Lightning.md => 20_0_Using_Lightning.md | 0 ...t.md => 20_1_Generate_a_Payment_Request.md | 0 ...g_a_Invoice.md => 20_2_Paying_a_Invoice.md | 0 ..._a_Channel.md => 20_3_Closing_a_Channel.md | 0 ...iew.md => 20_4_Lightning_Network_Review.md | 0 README.md | 73 ++++++++-------- 32 files changed, 166 insertions(+), 47 deletions(-) create mode 100644 15_0_Using_i2p.md create mode 100644 15_1_i2p_service.md rename 15_0_Talking_to_Bitcoind.md => 16_0_Talking_to_Bitcoind.md (100%) rename 15_1_Accessing_Bitcoind_with_C.md => 16_1_Accessing_Bitcoind_with_C.md (100%) rename 15_2_Programming_Bitcoind_with_C.md => 16_2_Programming_Bitcoind_with_C.md (100%) rename 15_3_Receiving_Bitcoind_Notifications_with_C.md => 16_3_Receiving_Bitcoind_Notifications_with_C.md (100%) rename 16_0_Programming_with_Libwally.md => 17_0_Programming_with_Libwally.md (100%) rename 16_1_Setting_Up_Libwally.md => 17_1_Setting_Up_Libwally.md (100%) rename 16_2_Using_BIP39_in_Libwally.md => 17_2_Using_BIP39_in_Libwally.md (100%) rename 16_3_Using_BIP32_in_Libwally.md => 17_3_Using_BIP32_in_Libwally.md (100%) rename 16_4_Using_PSBTs_in_Libwally.md => 17_4_Using_PSBTs_in_Libwally.md (100%) rename 16_5_Using_Scripts_in_Libwally.md => 17_5_Using_Scripts_in_Libwally.md (100%) rename 16_6_Using_Other_Functions_in_Libwally.md => 17_6_Using_Other_Functions_in_Libwally.md (100%) rename 16_7_Integrating_Libwally_and_Bitcoin-CLI.md => 17_7_Integrating_Libwally_and_Bitcoin-CLI.md (100%) rename 17_0_Talking_to_Bitcoind_Other.md => 18_0_Talking_to_Bitcoind_Other.md (100%) rename 17_1_Accessing_Bitcoind_with_Go.md => 18_1_Accessing_Bitcoind_with_Go.md (100%) rename 17_2_Accessing_Bitcoind_with_Java.md => 18_2_Accessing_Bitcoind_with_Java.md (96%) rename 17_3_Accessing_Bitcoind_with_NodeJS.md => 18_3_Accessing_Bitcoind_with_NodeJS.md (100%) rename 17_4_Accessing_Bitcoind_with_Python.md => 18_4_Accessing_Bitcoind_with_Python.md (100%) rename 17_5_Accessing_Bitcoind_with_Rust.md => 18_5_Accessing_Bitcoind_with_Rust.md (100%) rename 17_6_Accessing_Bitcoind_with_Swift.md => 18_6_Accessing_Bitcoind_with_Swift.md (100%) rename 18_0_Understanding_Your_Lightning_Setup.md => 19_0_Understanding_Your_Lightning_Setup.md (100%) rename 18_1_Verifying_Your_Lightning_Setup.md => 19_1_Verifying_Your_Lightning_Setup.md (100%) rename 18_2_Knowing_Your_lightning_Setup.md => 19_2_Knowing_Your_lightning_Setup.md (100%) rename 18_2__Interlude_Accessing_a_Second_Lightning_Node.md => 19_2__Interlude_Accessing_a_Second_Lightning_Node.md (100%) rename 18_3_Setting_Up_a_Channel.md => 19_3_Setting_Up_a_Channel.md (100%) rename 19_0_Using_Lightning.md => 20_0_Using_Lightning.md (100%) rename 19_1_Generate_a_Payment_Request.md => 20_1_Generate_a_Payment_Request.md (100%) rename 19_2_Paying_a_Invoice.md => 20_2_Paying_a_Invoice.md (100%) rename 19_3_Closing_a_Channel.md => 20_3_Closing_a_Channel.md (100%) rename 19_4_Lightning_Network_Review.md => 20_4_Lightning_Network_Review.md (100%) diff --git a/15_0_Using_i2p.md b/15_0_Using_i2p.md new file mode 100644 index 0000000..273bc82 --- /dev/null +++ b/15_0_Using_i2p.md @@ -0,0 +1,31 @@ +# Chapter 15: Using i2p + +The Invisible Internet Project (I2P) is a fully encrypted private network layer. It uses a distributed [network database](https://geti2p.net/en/docs/how/network-database) and encrypted unidirectional tunnels between your and your peers. + +Basic differences between Tor and i2p: + +| | Tor | i2p | +| :--- | :---: | ---: | +| Routing | [Onion](https://www.onion-router.net/) | [Garlic](https://geti2p.net/en/docs/how/garlic-routing) | +| Network Database | Trusted [Directory Servers](https://blog.torproject.org/possible-upcoming-attempts-disable-tor-network) | [Distributed network database](https://geti2p.net/en/docs/how/network-database) | +| Relay | **Two-way** encrypted connections between each Relay | **One-way** connections between every server in its tunnels | +| Hidden services | Slow | Fast | + +Read more: https://geti2p.net/en/comparison/tor + +It is not installed by [Bitcoin Standup](https://github.com/BlockchainCommons/Bitcoin-Standup-Scripts) right now as i2p support was recently added in Bitcoin core. However, you can try it manually by following the steps mentioned in [Section One](15_1_i2p_service.md). + +## Objectives for This Chapter + +After working through this chapter, a developer will be able to: + + * Run Bitcoin Core as an I2P (Invisible Internet Project) service + +Supporting objectives include the ability to: + + * Understand the i2p Network + * Learn difference between Tor and i2p + +## Table of Contents + +* [Section One: Bitcoin Core as an I2P (Invisible Internet Project) service](15_1_i2p_service.md) \ No newline at end of file diff --git a/15_1_i2p_service.md b/15_1_i2p_service.md new file mode 100644 index 0000000..33dacf5 --- /dev/null +++ b/15_1_i2p_service.md @@ -0,0 +1,85 @@ +# 15.1: Bitcoin Core as an I2P (Invisible Internet Project) service + +Users should consider different trade-offs involved in using i2p with other networks in Bitcoin Core for better privacy: + +- Sybil Attacks and Network Partitioning is possible with `onlynet=i2p` +- Running Onion service with i2p service is experimental for now. +- For maximum privacy, it is preferable to disable accepting incoming connections. + +Read more: https://bitcoin.stackexchange.com/questions/107060/tor-and-i2p-tradeoffs-in-bitcoin-core + +Follow the below steps to run Bitcoin Core i2p service: + +1. You can install `i2pd` on Ubuntu with below commands: + + ``` + sudo add-apt-repository ppa:purplei2p/i2pd + sudo apt-get update + sudo apt-get install i2pd + ``` + + For installing on other OS: https://i2pd.readthedocs.io/en/latest/user-guide/install/ + +2. Then [run](https://i2pd.readthedocs.io/en/latest/user-guide/run/) it and check if its running: + + ``` + $ sudo systemctl start i2pd.service + ``` + + You should see it running on port 7656: + + ``` + $ ss -nlt + + State Recv-Q Send-Q Local Address:Port Peer Address:Port Process + + LISTEN 0 4096 127.0.0.1:7656 0.0.0.0:* + ``` + +3. Add the following lines in `bitcoin.conf`. Config logging option `debug=i2p` is used to have additional information in the debug log about your I2P configuration and connections (Default location on Linux: ~/.bitcoin/bitcoin.conf): + + ``` + i2psam=127.0.0.1:7656 + debug=i2p + ``` + +5. Restart `bitcoind` + + ``` + $ bitcoind + ``` + +6. Check `debug.log`if i2p was setup correctly or any errors printed in logs. I2P address is mentioned in the logs and ends with _b32.i2p_: + ``` + 2021-06-15T20:36:16Z i2paccept thread start + 2021-06-15T20:36:16Z I2P: Creating SAM session with 127.0.0.1:7656 + + 2021-06-15T20:36:56Z I2P: SAM session created: session id=3e0f35228b, my address=bmwyyuzyqdc5dcx27s4baltbu6zw7rbqfl2nmclt45i7ng3ul4pa.b32.i2p:18333 + 2021-06-15T20:36:56Z AddLocal(bmwyyuzyqdc5dcx27s4baltbu6zw7rbqfl2nmclt45i7ng3ul4pa.b32.i2p:18333,4) + ``` + +7. Confirm `i2p_private_key` was created in Bitcoin Core data directory. The first time Bitcoin Core connects to the I2P router, its I2P address (and corresponding private key) will be automatically generated and saved in a file named *i2p_private_key*: + ``` + ~/.bitcoin/testnet3$ ls + + anchors.dat chainstate i2p_private_key settings.json + banlist.dat debug.log mempool.dat wallets + blocks fee_estimates.dat peers.dat + ``` + +8. `bitcoin-cli -netinfo` or `bitcoin-cli getnetworkinfo`returns i2p address: + + ``` + Local addresses + bmwyyuzyqdc5dcx27s4baltbu6zw7rbqfl2nmclt45i7ng3ul4pa.b32.i2p port 18333 score 4 + ``` + +## Summary: Bitcoin Core as an I2P (Invisible Internet Project) service + +It is always good to have alternatives for privacy and not depend only on Tor to run Bitcoin Core as hidden service. Since i2p was recently added in Bitcoin Core, less people use it, experiment with it and report bugs if you find any issues. + +> :information_source: **NOTE:** _i2pd_ (C++) is different from _i2prouter_ (Java), you will need `i2pd` for Bitcoin Core. + +Move on to "Programming with RPC" with [Chapter Sixteen: Talking to Bitcoind with C](16_0_Talking_to_Bitcoind.md). + +Or, if you're not a programmer, you can skip to [Chapter Nineteen: Understanding Your Lightning Seutp](https://github.com/BlockchainCommons/Learning-Bitcoin-from-the-Command-Line/blob/master/19_0_Understanding_Your_Lightning_Setup.md) to continue your command-line education with the Lightning Network. \ No newline at end of file diff --git a/15_0_Talking_to_Bitcoind.md b/16_0_Talking_to_Bitcoind.md similarity index 100% rename from 15_0_Talking_to_Bitcoind.md rename to 16_0_Talking_to_Bitcoind.md diff --git a/15_1_Accessing_Bitcoind_with_C.md b/16_1_Accessing_Bitcoind_with_C.md similarity index 100% rename from 15_1_Accessing_Bitcoind_with_C.md rename to 16_1_Accessing_Bitcoind_with_C.md diff --git a/15_2_Programming_Bitcoind_with_C.md b/16_2_Programming_Bitcoind_with_C.md similarity index 100% rename from 15_2_Programming_Bitcoind_with_C.md rename to 16_2_Programming_Bitcoind_with_C.md diff --git a/15_3_Receiving_Bitcoind_Notifications_with_C.md b/16_3_Receiving_Bitcoind_Notifications_with_C.md similarity index 100% rename from 15_3_Receiving_Bitcoind_Notifications_with_C.md rename to 16_3_Receiving_Bitcoind_Notifications_with_C.md diff --git a/16_0_Programming_with_Libwally.md b/17_0_Programming_with_Libwally.md similarity index 100% rename from 16_0_Programming_with_Libwally.md rename to 17_0_Programming_with_Libwally.md diff --git a/16_1_Setting_Up_Libwally.md b/17_1_Setting_Up_Libwally.md similarity index 100% rename from 16_1_Setting_Up_Libwally.md rename to 17_1_Setting_Up_Libwally.md diff --git a/16_2_Using_BIP39_in_Libwally.md b/17_2_Using_BIP39_in_Libwally.md similarity index 100% rename from 16_2_Using_BIP39_in_Libwally.md rename to 17_2_Using_BIP39_in_Libwally.md diff --git a/16_3_Using_BIP32_in_Libwally.md b/17_3_Using_BIP32_in_Libwally.md similarity index 100% rename from 16_3_Using_BIP32_in_Libwally.md rename to 17_3_Using_BIP32_in_Libwally.md diff --git a/16_4_Using_PSBTs_in_Libwally.md b/17_4_Using_PSBTs_in_Libwally.md similarity index 100% rename from 16_4_Using_PSBTs_in_Libwally.md rename to 17_4_Using_PSBTs_in_Libwally.md diff --git a/16_5_Using_Scripts_in_Libwally.md b/17_5_Using_Scripts_in_Libwally.md similarity index 100% rename from 16_5_Using_Scripts_in_Libwally.md rename to 17_5_Using_Scripts_in_Libwally.md diff --git a/16_6_Using_Other_Functions_in_Libwally.md b/17_6_Using_Other_Functions_in_Libwally.md similarity index 100% rename from 16_6_Using_Other_Functions_in_Libwally.md rename to 17_6_Using_Other_Functions_in_Libwally.md diff --git a/16_7_Integrating_Libwally_and_Bitcoin-CLI.md b/17_7_Integrating_Libwally_and_Bitcoin-CLI.md similarity index 100% rename from 16_7_Integrating_Libwally_and_Bitcoin-CLI.md rename to 17_7_Integrating_Libwally_and_Bitcoin-CLI.md diff --git a/17_0_Talking_to_Bitcoind_Other.md b/18_0_Talking_to_Bitcoind_Other.md similarity index 100% rename from 17_0_Talking_to_Bitcoind_Other.md rename to 18_0_Talking_to_Bitcoind_Other.md diff --git a/17_1_Accessing_Bitcoind_with_Go.md b/18_1_Accessing_Bitcoind_with_Go.md similarity index 100% rename from 17_1_Accessing_Bitcoind_with_Go.md rename to 18_1_Accessing_Bitcoind_with_Go.md diff --git a/17_2_Accessing_Bitcoind_with_Java.md b/18_2_Accessing_Bitcoind_with_Java.md similarity index 96% rename from 17_2_Accessing_Bitcoind_with_Java.md rename to 18_2_Accessing_Bitcoind_with_Java.md index ab85b40..6414eab 100644 --- a/17_2_Accessing_Bitcoind_with_Java.md +++ b/18_2_Accessing_Bitcoind_with_Java.md @@ -2,11 +2,11 @@ > :information_source: **NOTE:** This section has been recently added to the course and is an early draft that may still be awaiting review. Caveat reader. -This section explains how to interact with `bitcoind` using the Java programming language and the [JavaBitcoindRpcClient](https://github.com/Polve/JavaBitcoindRpcClient). +This section explains how to interact with `bitcoind` using the Java programming language and the [JavaBitcoindRpcClient](https://github.com/Polve/JavaBitcoindRpcClient). ## Set Up Java -You can install Java on your server, using the `apt-get` command. You will also install [Apache Maven](http://maven.apache.org/) to manage the dependencies. +You can install Java on your server, using the `apt-get` command. You will also install [Apache Maven](http://maven.apache.org/) to manage the dependencies. ``` $ sudo apt-get install openjdk-11-jre-headless maven ``` @@ -57,15 +57,15 @@ In order to include `JavaBitcoindRpcClient`, you must add its dependency to `1.2.1 ``` -You also need to add compiler properties to indicate what JDK version will compile the source code. +You also need to add compiler properties to indicate what JDK version will compile the source code. ``` - + UTF-8 11 11 - + ``` Whenever you add source code to your classes, you'll be able to test it with: @@ -110,7 +110,7 @@ rpcClient.stop(); ### Make an RPC Call -You'll find that the `BitcoindRpcClient` provides most of the functionality that can be accessed through `bitcoin-cli` or other RPC methods, using the same method names, but in camelCase. +You'll find that the `BitcoindRpcClient` provides most of the functionality that can be accessed through `bitcoin-cli` or other RPC methods, using the same method names, but in camelCase. For example, to execute the `getmininginfo` command to get the block information and the difficulty on the network, you should use the `getMiningInfo()` method: ```java @@ -137,7 +137,7 @@ You can look up addresses on your wallet by passing the address as an argument t ```java String addr1 = "mvLyH7Rs45c16FG2dfV7uuTKV6pL92kWxo"; - + AddressInfo addr1Info = rpcClient.getAddressInfo(addr1); System.out.println("Address: " + addr1Info.address()); System.out.println("MasterFingerPrint: " + addr1Info.hdMasterFingerprint()); @@ -154,7 +154,7 @@ PubKey: 0368d0fffa651783524f8b934d24d03b32bf8ff2c0808943a556b3d74b2e5c7d65 ### Run Your Code -The code for these examples can be found in [the src directory](src/17_2_App-getinfo.java) and should be installed into the standard directory structure created here as `~/java-project/src/main/java/com/blockchaincommons/lbtc/App.java`. It can then be compiled and run. +The code for these examples can be found in [the src directory](src/17_2_App-getinfo.java) and should be installed into the standard directory structure created here as `~/java-project/src/main/java/com/blockchaincommons/lbtc/App.java`. It can then be compiled and run. ``` $ mvn compile @@ -200,7 +200,7 @@ The JavaBitcoindRpcClient library has some good tools that make it easy to creat ### Create a Transaction -You can create a raw transaction using the `createRawTransaction` method, passing as arguments two ArrayList objects containing inputs and outputs to be used. +You can create a raw transaction using the `createRawTransaction` method, passing as arguments two ArrayList objects containing inputs and outputs to be used. First you set up your new addresses, here an existing address on your system and a new address on your system. ``` @@ -243,7 +243,7 @@ Second, you fill the ouputs each with an amount and an address: BigDecimal estimatedFee = BigDecimal.valueOf(0.00000200); BigDecimal txToAddr2Amount = utxos.get(0).amount().subtract(estimatedFee); txb.out(addr2, txToAddr2Amount); - + System.out.println("unsignedRawTx in amount: " + utxos.get(0).amount()); System.out.println("unsignedRawTx out amount: " + txToAddr2Amount); ``` @@ -261,7 +261,7 @@ You now can sign transaction with the method `signRawTransactionWithKey`. This m ```java SignedRawTransaction srTx = rpcClient.signRawTransactionWithKey( unsignedRawTxHex, - Arrays.asList(rpcClient.dumpPrivKey(addr1)), // + Arrays.asList(rpcClient.dumpPrivKey(addr1)), // Arrays.asList(in), null); System.out.println("signedRawTx hex: " + srTx.hex()); @@ -273,7 +273,7 @@ You now can sign transaction with the method `signRawTransactionWithKey`. This m Finally, sending requires the `sendRawTransaction` command: ```java String sentRawTransactionID = rpcClient.sendRawTransaction(srTx.hex()); -System.out.println("Sent signedRawTx (txID): " + sentRawTransactionID);``` +System.out.println("Sent signedRawTx (txID): " + sentRawTransactionID); ``` ### Run Your Code diff --git a/17_3_Accessing_Bitcoind_with_NodeJS.md b/18_3_Accessing_Bitcoind_with_NodeJS.md similarity index 100% rename from 17_3_Accessing_Bitcoind_with_NodeJS.md rename to 18_3_Accessing_Bitcoind_with_NodeJS.md diff --git a/17_4_Accessing_Bitcoind_with_Python.md b/18_4_Accessing_Bitcoind_with_Python.md similarity index 100% rename from 17_4_Accessing_Bitcoind_with_Python.md rename to 18_4_Accessing_Bitcoind_with_Python.md diff --git a/17_5_Accessing_Bitcoind_with_Rust.md b/18_5_Accessing_Bitcoind_with_Rust.md similarity index 100% rename from 17_5_Accessing_Bitcoind_with_Rust.md rename to 18_5_Accessing_Bitcoind_with_Rust.md diff --git a/17_6_Accessing_Bitcoind_with_Swift.md b/18_6_Accessing_Bitcoind_with_Swift.md similarity index 100% rename from 17_6_Accessing_Bitcoind_with_Swift.md rename to 18_6_Accessing_Bitcoind_with_Swift.md diff --git a/18_0_Understanding_Your_Lightning_Setup.md b/19_0_Understanding_Your_Lightning_Setup.md similarity index 100% rename from 18_0_Understanding_Your_Lightning_Setup.md rename to 19_0_Understanding_Your_Lightning_Setup.md diff --git a/18_1_Verifying_Your_Lightning_Setup.md b/19_1_Verifying_Your_Lightning_Setup.md similarity index 100% rename from 18_1_Verifying_Your_Lightning_Setup.md rename to 19_1_Verifying_Your_Lightning_Setup.md diff --git a/18_2_Knowing_Your_lightning_Setup.md b/19_2_Knowing_Your_lightning_Setup.md similarity index 100% rename from 18_2_Knowing_Your_lightning_Setup.md rename to 19_2_Knowing_Your_lightning_Setup.md diff --git a/18_2__Interlude_Accessing_a_Second_Lightning_Node.md b/19_2__Interlude_Accessing_a_Second_Lightning_Node.md similarity index 100% rename from 18_2__Interlude_Accessing_a_Second_Lightning_Node.md rename to 19_2__Interlude_Accessing_a_Second_Lightning_Node.md diff --git a/18_3_Setting_Up_a_Channel.md b/19_3_Setting_Up_a_Channel.md similarity index 100% rename from 18_3_Setting_Up_a_Channel.md rename to 19_3_Setting_Up_a_Channel.md diff --git a/19_0_Using_Lightning.md b/20_0_Using_Lightning.md similarity index 100% rename from 19_0_Using_Lightning.md rename to 20_0_Using_Lightning.md diff --git a/19_1_Generate_a_Payment_Request.md b/20_1_Generate_a_Payment_Request.md similarity index 100% rename from 19_1_Generate_a_Payment_Request.md rename to 20_1_Generate_a_Payment_Request.md diff --git a/19_2_Paying_a_Invoice.md b/20_2_Paying_a_Invoice.md similarity index 100% rename from 19_2_Paying_a_Invoice.md rename to 20_2_Paying_a_Invoice.md diff --git a/19_3_Closing_a_Channel.md b/20_3_Closing_a_Channel.md similarity index 100% rename from 19_3_Closing_a_Channel.md rename to 20_3_Closing_a_Channel.md diff --git a/19_4_Lightning_Network_Review.md b/20_4_Lightning_Network_Review.md similarity index 100% rename from 19_4_Lightning_Network_Review.md rename to 20_4_Lightning_Network_Review.md diff --git a/README.md b/README.md index da220d5..5a26498 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,10 @@ _This tutorial assumes that you have some minimal background of how to use the c * [7.1: Creating a Partially Signed Bitcoin Transaction](07_1_Creating_a_Partially_Signed_Bitcoin_Transaction.md) * [7.2: Using a Partially Signed Bitcoin Transaction](07_2_Using_a_Partially_Signed_Bitcoin_Transaction.md) * [7.3: Integrating with Hardware Wallets](07_3_Integrating_with_Hardware_Wallets.md) -* [8.0: Expanding Bitcoin Transactions in Other Ways](08_0_Expanding_Bitcoin_Transactions_Other.md) +* [8.0: Expanding Bitcoin Transactions in Other Ways](08_0_Expanding_Bitcoin_Transactions_Other.md) * [8.1: Sending a Transaction with a Locktime](08_1_Sending_a_Transaction_with_a_Locktime.md) * [8.2: Sending a Transaction with Data](08_2_Sending_a_Transaction_with_Data.md) - + ### PART THREE: BITCOIN SCRIPTING **Status:** Finished. Updated for 0.20 and btcdeb. @@ -86,7 +86,7 @@ _This tutorial assumes that you have some minimal background of how to use the c * [13.2: Writing Complex Multisig Scripts](13_2_Writing_Complex_Multisig_Scripts.md) * [13.3: Empowering Bitcoin with Scripts](13_3_Empowering_Bitcoin_with_Scripts.md) -### PART FOUR: USING TOR +### PART FOUR: PRIVACY **Status:** Finished. @@ -95,45 +95,48 @@ _This tutorial assumes that you have some minimal background of how to use the c * [14.2: Changing Your Bitcoin Hidden Services](14_2_Changing_Your_Bitcoin_Hidden_Services.md) * [14.3: Adding SSH Hidden Services](14_3_Adding_SSH_Hidden_Services.md) +* [15.0: Using i2p](15_0_Using_i2p.md) + * [15.1: Bitcoin Core as an I2P (Invisible Internet Project) service](15_1_i2p_service.md) + ### PART FIVE: PROGRAMMING WITH RPC **Status:** Finished. -* [15.0: Talking to Bitcoind with C](15_0_Talking_to_Bitcoind.md) - * [15.1: Accessing Bitcoind in C with RPC Libraries](15_1_Accessing_Bitcoind_with_C.md) - * [15.2: Programming Bitcoind in C with RPC Libraries](15_2_Programming_Bitcoind_with_C.md) - * [15.3: Receiving Notifications in C with ZMQ Libraries](15_3_Receiving_Bitcoind_Notifications_with_C.md) -* [16.0: Programming Bitcoin with Libwally](16_0_Programming_with_Libwally.md) - * [16.1: Setting Up Libwally](16_1_Setting_Up_Libwally.md) - * [16.2: Using BIP39 in Libwally](16_2_Using_BIP39_in_Libwally.md) - * [16.3: Using BIP32 in Libwally](16_3_Using_BIP32_in_Libwally.md) - * [16.4: Using PSBTs in Libwally](16_4_Using_PSBTs_in_Libwally.md) - * [16.5: Using Scripts in Libwally](16_5_Using_Scripts_in_Libwally.md) - * [16.6: Using Other Functions in Libwally](16_6_Using_Other_Functions_in_Libwally.md) - * [16.7: Integrating Libwally and Bitcoin-CLI](16_7_Integrating_Libwally_and_Bitcoin-CLI.md) -* [17.0: Talking to Bitcoind with Other Languages](17_0_Talking_to_Bitcoind_Other.md) - * [17.1: Accessing Bitcoind with Go](17_1_Accessing_Bitcoind_with_Go.md) - * [17.2: Accessing Bitcoind with Java](17_2_Accessing_Bitcoind_with_Java.md) - * [17.3: Accessing Bitcoind with Node JS](17_3_Accessing_Bitcoind_with_NodeJS.md) - * [17.4: Accessing Bitcoind with Python](17_4_Accessing_Bitcoind_with_Python.md) - * [17.5: Accessing Bitcoind with Rust](17_5_Accessing_Bitcoind_with_Rust.md) - * [17.6: Accessing Bitcoind with Swift](17_6_Accessing_Bitcoind_with_Swift.md) +* [16.0: Talking to Bitcoind with C](15_0_Talking_to_Bitcoind.md) + * [16.1: Accessing Bitcoind in C with RPC Libraries](15_1_Accessing_Bitcoind_with_C.md) + * [16.2: Programming Bitcoind in C with RPC Libraries](15_2_Programming_Bitcoind_with_C.md) + * [16.3: Receiving Notifications in C with ZMQ Libraries](16_3_Receiving_Bitcoind_Notifications_with_C.md) +* [17.0: Programming Bitcoin with Libwally](17_0_Programming_with_Libwally.md) + * [17.1: Setting Up Libwally](17_1_Setting_Up_Libwally.md) + * [17.2: Using BIP39 in Libwally](17_2_Using_BIP39_in_Libwally.md) + * [17.3: Using BIP32 in Libwally](17_3_Using_BIP32_in_Libwally.md) + * [17.4: Using PSBTs in Libwally](17_4_Using_PSBTs_in_Libwally.md) + * [17.5: Using Scripts in Libwally](17_5_Using_Scripts_in_Libwally.md) + * [17.6: Using Other Functions in Libwally](17_6_Using_Other_Functions_in_Libwally.md) + * [17.7: Integrating Libwally and Bitcoin-CLI](17_7_Integrating_Libwally_and_Bitcoin-CLI.md) +* [18.0: Talking to Bitcoind with Other Languages](18_0_Talking_to_Bitcoind_Other.md) + * [18.1: Accessing Bitcoind with Go](18_1_Accessing_Bitcoind_with_Go.md) + * [18.2: Accessing Bitcoind with Java](18_2_Accessing_Bitcoind_with_Java.md) + * [18.3: Accessing Bitcoind with Node JS](18_3_Accessing_Bitcoind_with_NodeJS.md) + * [18.4: Accessing Bitcoind with Python](18_4_Accessing_Bitcoind_with_Python.md) + * [18.5: Accessing Bitcoind with Rust](18_5_Accessing_Bitcoind_with_Rust.md) + * [18.6: Accessing Bitcoind with Swift](18_6_Accessing_Bitcoind_with_Swift.md) ### PART SIX: USING LIGHTNING-CLI **Status:** Finished. -* [18.0: Understanding Your Lightning Setup](18_0_Understanding_Your_Lightning_Setup.md) - * [18.1: Verifying Your c-lightning Setup](18_1_Verifying_Your_Lightning_Setup.md) - * [18.2: Knowing Your c-lightning Setup](18_2_Knowing_Your_lightning_Setup.md) - * [Interlude: Accessing a Second Lightning Node](18_2__Interlude_Accessing_a_Second_Lightning_Node.md) - * [18.3: Creating a Lightning Channel](18_3_Setting_Up_a_Channel.md) -* [19.0: Using Lightning](19_0_Using_Lightning.md) - * [19.1: Generating a Payment Request](19_1_Generate_a_Payment_Request.md) - * [19.2: Paying an Invoice](19_2_Paying_a_Invoice.md) - * [19.3: Closing a Lighnting Channel]((19_3_Closing_a_Channel.md)) - * [19.4: Expanding the Lightning Network](19_4_Lightning_Network_Review.md) - +* [19.0: Understanding Your Lightning Setup](19_0_Understanding_Your_Lightning_Setup.md) + * [19.1: Verifying Your c-lightning Setup](19_1_Verifying_Your_Lightning_Setup.md) + * [19.2: Knowing Your c-lightning Setup](19_2_Knowing_Your_lightning_Setup.md) + * [Interlude: Accessing a Second Lightning Node](19_2__Interlude_Accessing_a_Second_Lightning_Node.md) + * [19.3: Creating a Lightning Channel](19_3_Setting_Up_a_Channel.md) +* [20.0: Using Lightning](20_0_Using_Lightning.md) + * [20.1: Generating a Payment Request](20_1_Generate_a_Payment_Request.md) + * [20.2: Paying an Invoice](20_2_Paying_a_Invoice.md) + * [20.3: Closing a Lighnting Channel]((20_3_Closing_a_Channel.md)) + * [20.4: Expanding the Lightning Network](20_4_Lightning_Network_Review.md) + ### APPENDICES **Status:** Finished. @@ -142,7 +145,7 @@ _This tutorial assumes that you have some minimal background of how to use the c * [Appendix I: Understanding Bitcoin Standup](A1_0_Understanding_Bitcoin_Standup.md) * [Appendix II: Compiling Bitcoin from Source](A2_0_Compiling_Bitcoin_from_Source.md) * [Appendix III: Using Bitcoin Regtest](A3_0_Using_Bitcoin_Regtest.md) - + ## Status - Beta v2.0.1 of **Learning Bitcoin from the Command Line** is feature complete. It may still be undergoing third-party review or editing, but it can be used for learning. @@ -183,7 +186,7 @@ The following people directly contributed to this repository. You can add your n | Name | Role | Github | Email | GPG Fingerprint | | ----------------- | ------------------- | ------------------------------------------------- | ------------------------------------- | -------------------------------------------------- | | Christopher Allen | Lead Author | [@ChristopherA](https://github.com/ChristopherA) | \ | FDFE 14A5 4ECB 30FC 5D22 74EF F8D3 6C91 3574 05ED | -| Shannon Appelcline | Lead Author | [@shannona](https://github.com/shannona) | \ | 7EC6 B928 606F 27AD | +| Shannon Appelcline | Lead Author | [@shannona](https://github.com/shannona) | \ | 7EC6 B928 606F 27AD | Additional contributions are listed below: