From 3f2890661cc7d952be6012f0c3e0d9ed54449ac1 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 8 Nov 2020 17:04:17 -0800 Subject: [PATCH 1/3] Updating README --- README.md | 15 ++++----------- generic-network-diagram.png | Bin 0 -> 39667 bytes start-dev-example.sh | 7 +++++++ 3 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 generic-network-diagram.png diff --git a/README.md b/README.md index 47ac800..c5761d4 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,12 @@ # bch-api +This is a node.js JavaScript REST API server using Express.js. The purpose of this code is to create a REST API server that provides a common interface for working with a Bitcoin Cash full node and various indexers. See [this article](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer) to learn about the 'Cash Stack'. Visit [FullStack.cash](https://fullstack.cash), sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/christroutner/bch-js) JavaScript library. -[![Build Status](https://travis-ci.org/christroutner/bch-api.svg?branch=master)](https://travis-ci.org/christroutner/bch-api) +This repository is intended to be paired with [bch-js](https://github.com/christroutner/bch-js), an npm JavaScript library for building Bitcoin Cash apps. -This is a fork and alternative implementation of -the [rest.bitcoin.com](https://github.com/Bitcoin-com/rest.bitcoin.com) repository. -The purpose of this code is to create a REST API server that provides a common -interface for working with a Bitcoin Cash full node and various indexers. See [this article](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer) to learn about the 'Cash Stack'. Visit [FullStack.cash](https://fullstack.cash), sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/christroutner/bch-js) JavaScript library. +![Cash Stack Network Diagram](./generic-network-diagram.png) -This repository is intended to be paired with [bch-js](https://github.com/christroutner/bch-js), -an npm JavaScript library, and an alternative implementation -of [BITBOX SDK](https://github.com/Bitcoin-com/bitbox-sdk). - -Both bch-api and bch-js are part of the -[full stack of BCH software](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). +Both bch-api and bch-js are part of the [full stack of BCH software](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). - [API Documentation](https://fullstack.cash/documentation) - [Example Code](https://fullstack.cash/examples) diff --git a/generic-network-diagram.png b/generic-network-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a30866c57a3dbec240e1259dda5178c2d92fc45a GIT binary patch literal 39667 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 Um(1$j!do^sn=>uZ)M4lU18Xd+3;+NC literal 0 HcmV?d00001 diff --git a/start-dev-example.sh b/start-dev-example.sh index 5034068..3168208 100755 --- a/start-dev-example.sh +++ b/start-dev-example.sh @@ -20,4 +20,11 @@ export FULCRUM_PORT=50002 export TOKENSECRET=somelongpassword +# So that bch-api can call bch-js locally. +export LOCAL_RESTURL=http://127.0.0.1:3000/v3/ + +# slp-api alternative SLP validator. +export SLP_API_URL=http://10.0.0.5:5001/ + + npm start From edae9567425b3240c456171fafb60e7bde1f2f38 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 8 Nov 2020 17:13:03 -0800 Subject: [PATCH 2/3] Updating README --- README.md | 20 +++++++------------- docker/mainnet/start-local-mainnet.sh | 6 ++++++ docker/testnet/start-local-testnet.sh | 6 ++++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c5761d4..0303721 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This repository is intended to be paired with [bch-js](https://github.com/christ ![Cash Stack Network Diagram](./generic-network-diagram.png) -Both bch-api and bch-js are part of the [full stack of BCH software](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). +Both bch-api and bch-js are part of the 'Cash Stack' [full stack of BCH software](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). - [API Documentation](https://fullstack.cash/documentation) - [Example Code](https://fullstack.cash/examples) @@ -17,26 +17,20 @@ Have questions? Need help? Join our community support: ## Features The following features set this repository apart from rest.bitcoin.com: -- Address balance and UTXO queries use the [Blockbook](https://github.com/trezor/blockbook) -indexer instead of Insight. - Fine grain access is controlled with a JWT token using -[this back end auth server](https://github.com/Permissionless-Software-Foundation/jwt-bch-api) and [this front end](https://github.com/Permissionless-Software-Foundation/jwt-bch-frontend). -- Default rate limits are set to 3 RPM for anonymous connections, 10 RPM for [free accounts](https://fullstack.cash/pricing), up to 100 RPM if a full-access JWT token is used. +[this back end auth server](https://github.com/Permissionless-Software-Foundation/jwt-bch-api) and [this front end](https://github.com/Permissionless-Software-Foundation/jwt-bch-frontend). Can be used to monetize access to the REST API. - Typescript removed and ES8 JavaScript used instead. - npm audit run on all dependencies. -- [Greenkeeper](https://greenkeeper.io/) implemented for automatic dependency management -and security updates. ## Live Demo You can test a live demo of the REST API by running the [bch-js examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples). -Rate limits are 3 requests per minute, but you can increase them to 10 with a [free account](https://fullstack.cash/pricing). -This is fast enough to try out the examples -but these servers are not intended as a freemium service. You can run your own -REST server by purchasing the hard drive at [bchjs.cash](https://bchjs.cash). +Rate limits are 20 requests per minute, but you can increase them to 100 with a [paid account](https://fullstack.cash/pricing). +You can run bootstrap your own REST server by downloading and installing the infrastructure listed on the [CashStrap](https://fullstack.cash/cashstrap). -- Mainnet REST API server: https://api.fullstack.cash/v3/ -- Testnet REST API server: https://tapi.fullstack.cash/v3/ +- BCHN Mainnet REST API server: https://bchn.fullstack.cash/v3/ +- ABC Mainnet REST API server: https://abc.fullstack.cash/v3/ +- Testnet3 REST API server: https://testnet3.fullstack.cash/v3/ - Check server status: https://metrics.fullstack.cash ## Installation diff --git a/docker/mainnet/start-local-mainnet.sh b/docker/mainnet/start-local-mainnet.sh index 97d08ad..d6b691b 100755 --- a/docker/mainnet/start-local-mainnet.sh +++ b/docker/mainnet/start-local-mainnet.sh @@ -24,4 +24,10 @@ export REDIS_HOST=172.17.0.1 # JWT Token Secret export TOKENSECRET=somelongsecretvalue +# So that bch-api can call bch-js locally. +export LOCAL_RESTURL=http://127.0.0.1:3000/v3/ + +# slp-api alternative SLP validator. +export SLP_API_URL=http://10.0.0.5:5001/ + npm start diff --git a/docker/testnet/start-local-testnet.sh b/docker/testnet/start-local-testnet.sh index f51b15d..2d969d6 100755 --- a/docker/testnet/start-local-testnet.sh +++ b/docker/testnet/start-local-testnet.sh @@ -21,4 +21,10 @@ export REDIS_HOST=172.17.0.1 # JWT Token Secret export TOKENSECRET=somelongsecretvalue +# So that bch-api can call bch-js locally. +export LOCAL_RESTURL=http://127.0.0.1:3000/v3/ + +# slp-api alternative SLP validator. +export SLP_API_URL=http://10.0.0.5:5001/ + npm start From f36146ef2490ad05a3545fe6220a27574f955a0d Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 8 Nov 2020 17:15:53 -0800 Subject: [PATCH 3/3] Updating README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0303721..d647004 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ You can run bootstrap your own REST server by downloading and installing the inf ## Installation There are two installation paths, depending if you want a *development* or *production* environment. You'll also need to set up the underlying infrastructure -described [this page](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). +described on [this page](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). This code targets the Ubuntu 18.04 LTS Linux OS.