-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Gabriel Cardona
committed
Sep 21, 2019
0 parents
commit 515f2f8
Showing
107 changed files
with
73,194 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
node_modules/ | ||
.nyc_output/* | ||
.env | ||
start-local-server | ||
test-local-server | ||
coverage | ||
start-my-infra | ||
dist/routes/** | ||
nohup.out | ||
slp-tx-db/ | ||
logs/ | ||
package-lock.json | ||
yarn-error.log | ||
*.DS_Store | ||
./**/*.DS_STORE |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
MIT License | ||
|
||
Copyright (c) 2018 EARTH | ||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
|
||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
[](https://coveralls.io/github/Bitcoin-com/rest.bitcoin.com?branch=ct-coveralls) | ||
|
||
## REST | ||
|
||
[rest.bitcoin.com](https://rest.bitcoin.com) is the REST layer for Bitcoin.com's Cloud. | ||
|
||
More info: [developer.bitcoin.com](https://developer.bitcoin.com). Chatroom [http://geni.us/CashDev](geni.us/CashDev) | ||
|
||
Testnet available at [trest.bitcoin.com](https://trest.bitcoin.com) | ||
|
||
## Usage | ||
|
||
You can also run an instance of REST for your own full node. | ||
|
||
### Prerequisites | ||
|
||
#### NodeJS | ||
|
||
Install nodejs's LTS. 8.11.4 at the time of writing. | ||
|
||
https://nodejs.org/en/ | ||
|
||
#### build-essential package | ||
|
||
If you encounter | ||
|
||
``` | ||
gyp ERR! build error | ||
gyp ERR! stack Error: not found: make | ||
``` | ||
|
||
For Ubuntu | ||
|
||
``` | ||
sudo apt-get install build-essential | ||
``` | ||
|
||
For CENTOS | ||
|
||
``` | ||
RUN yum install -y make gcc* | ||
``` | ||
|
||
### Full node | ||
|
||
Fire up a full Bitcoin Cash node and add the following to your `bitcoin.conf`. | ||
|
||
``` | ||
# Accept command line and JSON-RPC commands. | ||
server=1 | ||
# Username for JSON-RPC connections | ||
rpcuser=rpcUsername | ||
# Password for JSON-RPC connections | ||
rpcpassword=rpcPasssword | ||
# If you're running REST on a different host than bitcoind's localhost | ||
# rpcallowip=* | ||
# Or you can restrict by IP or range of IPs | ||
# rpcallowip=192.168.1.* | ||
# Enable zeromq for real-time data | ||
zmqpubrawtx=tcp://your.nodes.ip.address:28332 | ||
zmqpubrawblock=tcp://your.nodes.ip.address:28332 | ||
zmqpubhashtx=tcp://your.nodes.ip.address:28332 | ||
zmqpubhashblock=tcp://your.nodes.ip.address:28332 | ||
``` | ||
|
||
Also allow tcp requests on port `28332` | ||
|
||
``` | ||
sudo ufw allow 28332 | ||
``` | ||
|
||
### Clone the repo | ||
|
||
Next clone the rest.bitcoin.com repo. | ||
|
||
``` | ||
git clone https://github.com/Bitcoin-com/rest.bitcoin.com.git | ||
``` | ||
|
||
#### Install dependencies | ||
|
||
`cd` into the newly cloned directory and install the dependencies. | ||
|
||
``` | ||
cd rest.bitcoin.com | ||
npm install | ||
``` | ||
|
||
#### Build REST | ||
|
||
```bash | ||
npm run build | ||
``` | ||
|
||
#### Start REST | ||
|
||
Now you need to start REST and pass in the following environment variables | ||
|
||
- BITCOINCOM_BASEURL - On rest.bitcoin.com this env var is to our internal insight API. You can use insight's public API. | ||
- RPC_BASEURL - The IP address of your full BCH node | ||
- RPC_PASSWORD - The rpc password of your full BCH node | ||
- RPC_USERNAME - The rpc username of your full BCH node | ||
- ZEROMQ_PORT - The port on which you enabled ZeroMQ | ||
- ZEROMQ_URL - The IP address of your full BCH node | ||
- NETWORK - mainnet or testnet depending on which network you're using | ||
- BITDB_URL - mainnet or testnet BITDB URL | ||
- SLPDB_URL - mainnet or testnet SLPDB URL | ||
- RATE_LIMIT_MAX_REQUESTS (optional) - Rate limit per route per minute. Defaults to 60. Set to 0 to disable rate limit. | ||
- NON_JS_FRAMEWORK (optional) - enables endpoints to create, mint, send, burn and burnAll SLP tokens | ||
|
||
Here's how the final command would look | ||
|
||
``` | ||
BITCOINCOM_BASEURL=https://bch-insight.bitpay.com/api/ RPC_BASEURL=http://your.nodes.ip.address:8332/ RPC_PASSWORD=rpcPasssword RPC_USERNAME=rpcUsername ZEROMQ_PORT=28332 ZEROMQ_URL=your.nodes.ip.address BITDB_URL=https://bitdb.bitcoin.com/ SLPDB_URL=https://slpdb.bitcoin.com/ NETWORK=mainnet npm run dev | ||
``` | ||
|
||
Starting in the regtest mode (partly working since the bitcoincom_baseurl does not work with local nodes): | ||
|
||
```bash | ||
PORT=3000 BITCOINCOM_BASEURL=http://localhost:3000/api/ RPC_BASEURL=http://localhost:18332/ RPC_PASSWORD=regtest RPC_USERNAME=regtest ZEROMQ_PORT=0 ZEROMQ_URL=0 NETWORK=local npm start | ||
``` | ||
|
||
#### View in browser | ||
|
||
Finally open `http://localhost:3000/` and confirm you see the GUI | ||
|
||
[](https://greenkeeper.io/) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var wtfnode = require("wtfnode"); // Debugging the event loop | ||
// const util = require("util") | ||
var express = require("express"); | ||
var req_logging_1 = require("./middleware/req-logging"); | ||
// Middleware | ||
var route_ratelimit_1 = require("./middleware/route-ratelimit"); | ||
var path = require("path"); | ||
var logger = require("morgan"); | ||
var wlogger = require("./util/winston-logging"); | ||
var cookieParser = require("cookie-parser"); | ||
var bodyParser = require("body-parser"); | ||
// const basicAuth = require("express-basic-auth") | ||
var helmet = require("helmet"); | ||
var debug = require("debug")("rest-cloud:server"); | ||
var http = require("http"); | ||
var cors = require("cors"); | ||
var AuthMW = require("./middleware/auth"); | ||
var swStats = require("swagger-stats"); | ||
var apiSpec; | ||
if (process.env.NETWORK === "mainnet") { | ||
apiSpec = require("./public/bitcoin-com-mainnet-rest-v2.json"); | ||
} | ||
else { | ||
apiSpec = require("./public/bitcoin-com-testnet-rest-v2.json"); | ||
} | ||
// v2 | ||
var indexV2 = require("./routes/v2/index"); | ||
var healthCheckV2 = require("./routes/v2/health-check"); | ||
var addressV2 = require("./routes/v2/address"); | ||
var cashAccountsV2 = require("./routes/v2/cashaccounts"); | ||
var blockV2 = require("./routes/v2/block"); | ||
var blockchainV2 = require("./routes/v2/blockchain"); | ||
var controlV2 = require("./routes/v2/control"); | ||
var generatingV2 = require("./routes/v2/generating"); | ||
var miningV2 = require("./routes/v2/mining"); | ||
var networkV2 = require("./routes/v2/network"); | ||
var rawtransactionsV2 = require("./routes/v2/rawtransactions"); | ||
var transactionV2 = require("./routes/v2/transaction"); | ||
var utilV2 = require("./routes/v2/util"); | ||
var slpV2 = require("./routes/v2/slp"); | ||
require("dotenv").config(); | ||
var app = express(); | ||
app.locals.env = process.env; | ||
app.use(swStats.getMiddleware({ swaggerSpec: apiSpec })); | ||
app.use(helmet()); | ||
app.use(cors()); | ||
app.enable("trust proxy"); | ||
// view engine setup | ||
app.set("views", path.join(__dirname, "views")); | ||
app.set("view engine", "jade"); | ||
app.use("/public", express.static(__dirname + "/public")); | ||
// Log each request to the console with IP addresses. | ||
app.use(logger(":remote-addr :remote-user :method :url :status :response-time ms - :res[content-length] :user-agent")); | ||
app.use(bodyParser.json()); | ||
app.use(bodyParser.urlencoded({ extended: false })); | ||
app.use(cookieParser()); | ||
app.use(express.static(path.join(__dirname, "public"))); | ||
// Local logging middleware for tracking incoming connection information. | ||
app.use("/", req_logging_1.logReqInfo); | ||
// Make io accessible to our router | ||
app.use(function (req, res, next) { | ||
req.io = io; | ||
next(); | ||
}); | ||
var v2prefix = "v2"; | ||
// Instantiate the authorization middleware, used to implement pro-tier rate limiting. | ||
var auth = new AuthMW(); | ||
app.use("/" + v2prefix + "/", auth.mw()); | ||
// Rate limit on all v2 routes | ||
app.use("/" + v2prefix + "/", route_ratelimit_1.routeRateLimit); | ||
app.use("/", indexV2); | ||
app.use("/" + v2prefix + "/" + "health-check", healthCheckV2); | ||
app.use("/" + v2prefix + "/" + "address", addressV2.router); | ||
app.use("/" + v2prefix + "/" + "cashAccounts", cashAccountsV2.router); | ||
app.use("/" + v2prefix + "/" + "blockchain", blockchainV2.router); | ||
app.use("/" + v2prefix + "/" + "block", blockV2.router); | ||
app.use("/" + v2prefix + "/" + "control", controlV2.router); | ||
app.use("/" + v2prefix + "/" + "generating", generatingV2); | ||
app.use("/" + v2prefix + "/" + "mining", miningV2.router); | ||
app.use("/" + v2prefix + "/" + "network", networkV2); | ||
app.use("/" + v2prefix + "/" + "rawtransactions", rawtransactionsV2.router); | ||
app.use("/" + v2prefix + "/" + "transaction", transactionV2.router); | ||
app.use("/" + v2prefix + "/" + "util", utilV2.router); | ||
app.use("/" + v2prefix + "/" + "slp", slpV2.router); | ||
// catch 404 and forward to error handler | ||
app.use(function (req, res, next) { | ||
var err = { | ||
message: "Not Found", | ||
status: 404 | ||
}; | ||
next(err); | ||
}); | ||
// error handler | ||
app.use(function (err, req, res, next) { | ||
var status = err.status || 500; | ||
// set locals, only providing error in development | ||
res.locals.message = err.message; | ||
res.locals.error = req.app.get("env") === "development" ? err : {}; | ||
// render the error page | ||
res.status(status); | ||
res.json({ | ||
status: status, | ||
message: err.message | ||
}); | ||
}); | ||
/** | ||
* Get port from environment and store in Express. | ||
*/ | ||
var port = normalizePort(process.env.PORT || "3000"); | ||
app.set("port", port); | ||
console.log("rest.bitcoin.com started on port " + port); | ||
/** | ||
* Create HTTP server. | ||
*/ | ||
var server = http.createServer(app); | ||
var io = require("socket.io").listen(server); | ||
/** | ||
* Listen on provided port, on all network interfaces. | ||
*/ | ||
server.listen(port); | ||
server.on("error", onError); | ||
server.on("listening", onListening); | ||
// Set the time before a timeout error is generated. This impacts testing and | ||
// the handling of timeout errors. Is 10 seconds too agressive? | ||
server.setTimeout(30 * 1000); | ||
// Dump details about the event loop to debug a possible memory leak | ||
wtfnode.setLogger("info", function (data) { | ||
wlogger.verbose("wtfnode info: " + data); | ||
}); | ||
wtfnode.setLogger("warn", function (data) { | ||
wlogger.verbose("wtfnode warn: " + data); | ||
}); | ||
wtfnode.setLogger("error", function (data) { | ||
wlogger.verbose("wtfnode error: " + data); | ||
}); | ||
setInterval(function () { | ||
wtfnode.dump(); | ||
}, 60000 * 5); | ||
/** | ||
* Normalize a port into a number, string, or false. | ||
*/ | ||
function normalizePort(val) { | ||
var port = parseInt(val, 10); | ||
if (isNaN(port)) { | ||
// named pipe | ||
return val; | ||
} | ||
if (port >= 0) { | ||
// port number | ||
return port; | ||
} | ||
return false; | ||
} | ||
/** | ||
* Event listener for HTTP server "error" event. | ||
*/ | ||
function onError(error) { | ||
if (error.syscall !== "listen") | ||
throw error; | ||
var bind = typeof port === "string" ? "Pipe " + port : "Port " + port; | ||
// handle specific listen errors with friendly messages | ||
switch (error.code) { | ||
case "EACCES": | ||
console.error(bind + " requires elevated privileges"); | ||
process.exit(1); | ||
break; | ||
case "EADDRINUSE": | ||
console.error(bind + " is already in use"); | ||
process.exit(1); | ||
break; | ||
default: | ||
throw error; | ||
} | ||
} | ||
/** | ||
* Event listener for HTTP server "listening" event. | ||
*/ | ||
function onListening() { | ||
var addr = server.address(); | ||
var bind = typeof addr === "string" ? "pipe " + addr : "port " + addr.port; | ||
debug("Listening on " + bind); | ||
} |
Oops, something went wrong.