From 9df4fb5812262c984ba4844c2491972593ae3ced Mon Sep 17 00:00:00 2001 From: James Cramer Date: Tue, 8 Oct 2019 17:27:36 -0400 Subject: [PATCH] add gs++ example --- README.md | 1 + examples/5-validate-txid-gs++.ts | 41 ++ package-lock.json | 618 ++++++++++++++++++++++++++++--- package.json | 3 +- 4 files changed, 606 insertions(+), 57 deletions(-) create mode 100644 examples/5-validate-txid-gs++.ts diff --git a/README.md b/README.md index 37e7984..4c25284 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ The following examples are provided in the examples directory: - `2-validate-tx-rpc-burn-valid-allow.ts`: Allows sending a valid burn transaction - `3-validate-txid-rpc.ts`: Traditional SLP validate method by txid (offers no extra burn protection). - `4-validate-txid-bchd.ts`: Similar to example 3, but uses BCHD's gRPC instead of JSON RPC. + - `5-validate-txid-gs++.ts`: Validate more quickly by downloading transactions in bulk from SLP graph search instead of downloading transactions individually via RPC. diff --git a/examples/5-validate-txid-gs++.ts b/examples/5-validate-txid-gs++.ts new file mode 100644 index 0000000..2e1e274 --- /dev/null +++ b/examples/5-validate-txid-gs++.ts @@ -0,0 +1,41 @@ +/*************************************************************************************** + * + * Example 5: Validate using gs++ server. + * + * Instructions: + * (1) - Optional: Setup SLP graph search server URL + * (2) - Optional: set custom txid. + * + * ************************************************************************************/ + +import { ValidatorType1, Crypto } from '../index'; +import { GraphSearchClient } from 'grpc-slp-graphsearch-node'; + +const txid = "ecaaf0a4de119a59a440089c99a2c103791dbd06086472ff8ff4229c5cd7cc4f"; + +(async function() { + console.time("SLP-VALIDATE-W-GRAPH-SEARCH"); + + // perform graph search + let gs = new GraphSearchClient(); // optional set server url + let dag = new Map(); + (await gs.graphSearchFor(txid)).getTxdataList_asU8().forEach(txn => { + let txnBuf = Buffer.from(txn); + let id = Crypto.hash256(txnBuf).toString('hex'); + dag.set(id, txnBuf); + }); + + // create SLP validator + let getRawTransaction = async (id: string) => { + if(dag.has(id)) return dag.get(id)!; + else return Buffer.alloc(60); + } + const slpValidator = new ValidatorType1({ getRawTransaction }); + + console.log("Validating:", txid); + console.log("This may take a several seconds..."); + let isValid = await slpValidator.isValidSlpTxid({ txid }); + console.log("Final Result:", isValid); + console.log("WARNING: THIS VALIDATION METHOD COMES WITH NO BURN PROTECTION.") + console.timeEnd("SLP-VALIDATE-W-GRAPH-SEARCH"); +})(); diff --git a/package-lock.json b/package-lock.json index a1195b9..d8480d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "slp-validate", - "version": "0.0.1", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -73,16 +73,6 @@ "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-4.0.5.tgz", "integrity": "sha512-D9KFrAt05FDSqLo7PU9TDHfDgkarlwdkuwFsg7Zm4xl62tTNaz+zN+Tkcdx2wGLBbSMf8BnoMhOVeUGUaJfLKg==" }, - "@types/bytebuffer": { - "version": "5.0.40", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.40.tgz", - "integrity": "sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g==", - "dev": true, - "requires": { - "@types/long": "*", - "@types/node": "*" - } - }, "@types/google-protobuf": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.7.1.tgz", @@ -800,12 +790,11 @@ "dev": true }, "grpc": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.23.3.tgz", - "integrity": "sha512-7vdzxPw9s5UYch4aUn4hyM5tMaouaxUUkwkgJlwbR4AXMxiYZJOv19N2ps2eKiuUbJovo5fnGF9hg/X91gWYjw==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.23.1.tgz", + "integrity": "sha512-hEhb5aBh5tlGw6vIwdOv3rMCRjJrRDI/RCjcBlWEfog0jI/2Q5Yzt6zNvUxfQHOYMMFXWX4E3u+nm7jr/qoKYw==", "dev": true, "requires": { - "@types/bytebuffer": "^5.0.40", "lodash.camelcase": "^4.3.0", "lodash.clone": "^4.5.0", "nan": "^2.13.2", @@ -852,7 +841,7 @@ } }, "chownr": { - "version": "1.1.2", + "version": "1.1.1", "bundled": true, "dev": true }, @@ -876,14 +865,6 @@ "bundled": true, "dev": true }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "deep-extend": { "version": "0.6.0", "bundled": true, @@ -927,26 +908,13 @@ "wide-align": "^1.1.0" } }, - "glob": { - "version": "7.1.4", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "has-unicode": { "version": "2.0.1", "bundled": true, "dev": true }, "iconv-lite": { - "version": "0.4.24", + "version": "0.4.23", "bundled": true, "dev": true, "requires": { @@ -971,7 +939,7 @@ } }, "inherits": { - "version": "2.0.4", + "version": "2.0.3", "bundled": true, "dev": true }, @@ -1038,11 +1006,6 @@ } } }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, "needle": { "version": "2.4.0", "bundled": true, @@ -1051,6 +1014,21 @@ "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + } } }, "node-pre-gyp": { @@ -1085,7 +1063,7 @@ "dev": true }, "npm-packlist": { - "version": "1.4.4", + "version": "1.4.1", "bundled": true, "dev": true, "requires": { @@ -1189,11 +1167,26 @@ } }, "rimraf": { - "version": "2.7.1", + "version": "2.6.3", "bundled": true, "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "safe-buffer": { @@ -1212,7 +1205,7 @@ "dev": true }, "semver": { - "version": "5.7.1", + "version": "5.7.0", "bundled": true, "dev": true }, @@ -1222,7 +1215,7 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", + "version": "3.0.1", "bundled": true, "dev": true }, @@ -1297,16 +1290,529 @@ } }, "grpc-bchrpc-node": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/grpc-bchrpc-node/-/grpc-bchrpc-node-0.5.3.tgz", - "integrity": "sha512-1nSElmP8tSeCkuSXM8fQld7Xo0ZnMdct0r0eqv2LY0Ds0HyeTcWSO726novGXbQSStKPMdLa8vfZZX51KS/oKQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/grpc-bchrpc-node/-/grpc-bchrpc-node-0.6.2.tgz", + "integrity": "sha512-ZsrSahFw0HFFO7eX5CaWJtAY23dtKJTv5sGkzvOlo2SSMczENgPGQcBP85ljtPz2+5g1oqyki7hj7TuykQ2RXQ==", "dev": true, "requires": { - "@types/google-protobuf": "^3.7.1", - "@types/node": "^12.0.10", - "google-protobuf": "^3.2.0", - "grpc": "^1.21.1", - "protobufjs": "^6.8.8" + "@types/google-protobuf": "3.7.1", + "google-protobuf": "3.9.1", + "grpc": "1.23.1", + "protobufjs": "6.8.8" + } + }, + "grpc-slp-graphsearch-node": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/grpc-slp-graphsearch-node/-/grpc-slp-graphsearch-node-0.0.1.tgz", + "integrity": "sha512-Yo6oIdpyTZX5K2DLpJH2qO4JnUclLHqwsdSfSU4+M2re0ZowcwNHsYxHtqp8yQ/IXTjoG451wofUDqm9fkWTCA==", + "dev": true, + "requires": { + "@types/google-protobuf": "3.7.1", + "google-protobuf": "3.9.1", + "grpc": "1.23.1", + "protobufjs": "6.8.8" + }, + "dependencies": { + "grpc": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.23.1.tgz", + "integrity": "sha512-hEhb5aBh5tlGw6vIwdOv3rMCRjJrRDI/RCjcBlWEfog0jI/2Q5Yzt6zNvUxfQHOYMMFXWX4E3u+nm7jr/qoKYw==", + "dev": true, + "requires": { + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "node-pre-gyp": "^0.13.0", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "fs-minipass": { + "version": "1.2.6", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "node-pre-gyp": { + "version": "0.13.0", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "dev": true, + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "4.4.10", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + } } }, "has": { diff --git a/package.json b/package.json index b0afab0..ae005bf 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "@types/mocha": "^5.1.1", "slp-unit-test-data": "git+https://github.com/simpleledger/slp-unit-test-data.git", "bitcoin-rpc-promise-retry": "^1.1.1", - "grpc-bchrpc-node": "0.5.3", + "grpc-bchrpc-node": "0.6.2", + "grpc-slp-graphsearch-node": "^0.0.1", "browserify": "^16.2.2", "uglify-es": "^3.3.9", "mkdirp": "^0.5.1"