@bsv/overlay 2.3.1 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -0
- package/dist/cjs/mod.d.ts +3 -0
- package/dist/cjs/mod.d.ts.map +1 -1
- package/dist/cjs/mod.js +8 -1
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +10 -4
- package/dist/cjs/src/BASM.d.ts +6 -0
- package/dist/cjs/src/BASM.d.ts.map +1 -1
- package/dist/cjs/src/BASM.js +21 -8
- package/dist/cjs/src/BASM.js.map +1 -1
- package/dist/cjs/src/BASMRemote.d.ts +8 -1
- package/dist/cjs/src/BASMRemote.d.ts.map +1 -1
- package/dist/cjs/src/BASMRemote.js +179 -13
- package/dist/cjs/src/BASMRemote.js.map +1 -1
- package/dist/cjs/src/BASMValidation.d.ts +27 -0
- package/dist/cjs/src/BASMValidation.d.ts.map +1 -0
- package/dist/cjs/src/BASMValidation.js +108 -0
- package/dist/cjs/src/BASMValidation.js.map +1 -0
- package/dist/cjs/src/DiscoveryAdvertisementValidation.d.ts +11 -0
- package/dist/cjs/src/DiscoveryAdvertisementValidation.d.ts.map +1 -0
- package/dist/cjs/src/DiscoveryAdvertisementValidation.js +60 -0
- package/dist/cjs/src/DiscoveryAdvertisementValidation.js.map +1 -0
- package/dist/cjs/src/Engine.d.ts +37 -13
- package/dist/cjs/src/Engine.d.ts.map +1 -1
- package/dist/cjs/src/Engine.js +1713 -336
- package/dist/cjs/src/Engine.js.map +1 -1
- package/dist/cjs/src/EngineAdmission.d.ts +70 -0
- package/dist/cjs/src/EngineAdmission.d.ts.map +1 -0
- package/dist/cjs/src/EngineAdmission.js +297 -0
- package/dist/cjs/src/EngineAdmission.js.map +1 -0
- package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts +4 -3
- package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
- package/dist/cjs/src/GASP/OverlayGASPRemote.js +27 -43
- package/dist/cjs/src/GASP/OverlayGASPRemote.js.map +1 -1
- package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts +22 -16
- package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
- package/dist/cjs/src/GASP/OverlayGASPStorage.js +206 -57
- package/dist/cjs/src/GASP/OverlayGASPStorage.js.map +1 -1
- package/dist/cjs/src/RemoteSecurity.d.ts +50 -0
- package/dist/cjs/src/RemoteSecurity.d.ts.map +1 -0
- package/dist/cjs/src/RemoteSecurity.js +301 -0
- package/dist/cjs/src/RemoteSecurity.js.map +1 -0
- package/dist/cjs/src/storage/AdmissionStorage.d.ts +185 -0
- package/dist/cjs/src/storage/AdmissionStorage.d.ts.map +1 -0
- package/dist/cjs/src/storage/AdmissionStorage.js +93 -0
- package/dist/cjs/src/storage/AdmissionStorage.js.map +1 -0
- package/dist/cjs/src/storage/RecoveryContract.d.ts +50 -0
- package/dist/cjs/src/storage/RecoveryContract.d.ts.map +1 -0
- package/dist/cjs/src/storage/RecoveryContract.js +35 -0
- package/dist/cjs/src/storage/RecoveryContract.js.map +1 -0
- package/dist/cjs/src/storage/Storage.d.ts +32 -19
- package/dist/cjs/src/storage/Storage.d.ts.map +1 -1
- package/dist/cjs/src/storage/Storage.js +5 -0
- package/dist/cjs/src/storage/Storage.js.map +1 -1
- package/dist/cjs/src/storage/knex/KnexStorage.d.ts +8 -8
- package/dist/cjs/src/storage/knex/KnexStorage.d.ts.map +1 -1
- package/dist/cjs/src/storage/knex/KnexStorage.js +98 -61
- package/dist/cjs/src/storage/knex/KnexStorage.js.map +1 -1
- package/dist/cjs/src/storage/knex/all-migrations.d.ts.map +1 -1
- package/dist/cjs/src/storage/knex/all-migrations.js +5 -1
- package/dist/cjs/src/storage/knex/all-migrations.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js +36 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts +5 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.js +16 -0
- package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.d.ts +18 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.js +229 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.d.ts +112 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.js +675 -0
- package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoOverlayStorage.d.ts +71 -0
- package/dist/cjs/src/storage/mongo/MongoOverlayStorage.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoOverlayStorage.js +453 -0
- package/dist/cjs/src/storage/mongo/MongoOverlayStorage.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoPayloadStore.d.ts +134 -0
- package/dist/cjs/src/storage/mongo/MongoPayloadStore.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoPayloadStore.js +756 -0
- package/dist/cjs/src/storage/mongo/MongoPayloadStore.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoReadGuards.d.ts +44 -0
- package/dist/cjs/src/storage/mongo/MongoReadGuards.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoReadGuards.js +135 -0
- package/dist/cjs/src/storage/mongo/MongoReadGuards.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoSchema.d.ts +67 -0
- package/dist/cjs/src/storage/mongo/MongoSchema.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoSchema.js +743 -0
- package/dist/cjs/src/storage/mongo/MongoSchema.js.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoTransactionRunner.d.ts +69 -0
- package/dist/cjs/src/storage/mongo/MongoTransactionRunner.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo/MongoTransactionRunner.js +368 -0
- package/dist/cjs/src/storage/mongo/MongoTransactionRunner.js.map +1 -0
- package/dist/cjs/src/storage/mongo.d.ts +9 -0
- package/dist/cjs/src/storage/mongo.d.ts.map +1 -0
- package/dist/cjs/src/storage/mongo.js +25 -0
- package/dist/cjs/src/storage/mongo.js.map +1 -0
- package/dist/esm/mod.js +3 -0
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/BASM.js +21 -8
- package/dist/esm/src/BASM.js.map +1 -1
- package/dist/esm/src/BASMRemote.js +176 -12
- package/dist/esm/src/BASMRemote.js.map +1 -1
- package/dist/esm/src/BASMValidation.js +95 -0
- package/dist/esm/src/BASMValidation.js.map +1 -0
- package/dist/esm/src/DiscoveryAdvertisementValidation.js +57 -0
- package/dist/esm/src/DiscoveryAdvertisementValidation.js.map +1 -0
- package/dist/esm/src/Engine.js +1698 -326
- package/dist/esm/src/Engine.js.map +1 -1
- package/dist/esm/src/EngineAdmission.js +280 -0
- package/dist/esm/src/EngineAdmission.js.map +1 -0
- package/dist/esm/src/GASP/OverlayGASPRemote.js +27 -43
- package/dist/esm/src/GASP/OverlayGASPRemote.js.map +1 -1
- package/dist/esm/src/GASP/OverlayGASPStorage.js +200 -56
- package/dist/esm/src/GASP/OverlayGASPStorage.js.map +1 -1
- package/dist/esm/src/RemoteSecurity.js +279 -0
- package/dist/esm/src/RemoteSecurity.js.map +1 -0
- package/dist/esm/src/storage/AdmissionStorage.js +85 -0
- package/dist/esm/src/storage/AdmissionStorage.js.map +1 -0
- package/dist/esm/src/storage/RecoveryContract.js +31 -0
- package/dist/esm/src/storage/RecoveryContract.js.map +1 -0
- package/dist/esm/src/storage/Storage.js +4 -1
- package/dist/esm/src/storage/Storage.js.map +1 -1
- package/dist/esm/src/storage/knex/KnexStorage.js +98 -61
- package/dist/esm/src/storage/knex/KnexStorage.js.map +1 -1
- package/dist/esm/src/storage/knex/all-migrations.js +5 -1
- package/dist/esm/src/storage/knex/all-migrations.js.map +1 -1
- package/dist/esm/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js +32 -0
- package/dist/esm/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js.map +1 -0
- package/dist/esm/src/storage/knex/migrations/2026-09-20-001-spent-by.js +12 -0
- package/dist/esm/src/storage/knex/migrations/2026-09-20-001-spent-by.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoAdmissionPlan.js +217 -0
- package/dist/esm/src/storage/mongo/MongoAdmissionPlan.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoAdmissionStorage.js +673 -0
- package/dist/esm/src/storage/mongo/MongoAdmissionStorage.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoOverlayStorage.js +451 -0
- package/dist/esm/src/storage/mongo/MongoOverlayStorage.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoPayloadStore.js +747 -0
- package/dist/esm/src/storage/mongo/MongoPayloadStore.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoReadGuards.js +129 -0
- package/dist/esm/src/storage/mongo/MongoReadGuards.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoSchema.js +730 -0
- package/dist/esm/src/storage/mongo/MongoSchema.js.map +1 -0
- package/dist/esm/src/storage/mongo/MongoTransactionRunner.js +371 -0
- package/dist/esm/src/storage/mongo/MongoTransactionRunner.js.map +1 -0
- package/dist/esm/src/storage/mongo.js +9 -0
- package/dist/esm/src/storage/mongo.js.map +1 -0
- package/dist/types/mod.d.ts +3 -0
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/BASM.d.ts +6 -0
- package/dist/types/src/BASM.d.ts.map +1 -1
- package/dist/types/src/BASMRemote.d.ts +8 -1
- package/dist/types/src/BASMRemote.d.ts.map +1 -1
- package/dist/types/src/BASMValidation.d.ts +27 -0
- package/dist/types/src/BASMValidation.d.ts.map +1 -0
- package/dist/types/src/DiscoveryAdvertisementValidation.d.ts +11 -0
- package/dist/types/src/DiscoveryAdvertisementValidation.d.ts.map +1 -0
- package/dist/types/src/Engine.d.ts +37 -13
- package/dist/types/src/Engine.d.ts.map +1 -1
- package/dist/types/src/EngineAdmission.d.ts +70 -0
- package/dist/types/src/EngineAdmission.d.ts.map +1 -0
- package/dist/types/src/GASP/OverlayGASPRemote.d.ts +4 -3
- package/dist/types/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
- package/dist/types/src/GASP/OverlayGASPStorage.d.ts +22 -16
- package/dist/types/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
- package/dist/types/src/RemoteSecurity.d.ts +50 -0
- package/dist/types/src/RemoteSecurity.d.ts.map +1 -0
- package/dist/types/src/storage/AdmissionStorage.d.ts +185 -0
- package/dist/types/src/storage/AdmissionStorage.d.ts.map +1 -0
- package/dist/types/src/storage/RecoveryContract.d.ts +50 -0
- package/dist/types/src/storage/RecoveryContract.d.ts.map +1 -0
- package/dist/types/src/storage/Storage.d.ts +32 -19
- package/dist/types/src/storage/Storage.d.ts.map +1 -1
- package/dist/types/src/storage/knex/KnexStorage.d.ts +8 -8
- package/dist/types/src/storage/knex/KnexStorage.d.ts.map +1 -1
- package/dist/types/src/storage/knex/all-migrations.d.ts.map +1 -1
- package/dist/types/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts +4 -0
- package/dist/types/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts.map +1 -0
- package/dist/types/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts +5 -0
- package/dist/types/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoAdmissionPlan.d.ts +18 -0
- package/dist/types/src/storage/mongo/MongoAdmissionPlan.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoAdmissionStorage.d.ts +112 -0
- package/dist/types/src/storage/mongo/MongoAdmissionStorage.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoOverlayStorage.d.ts +71 -0
- package/dist/types/src/storage/mongo/MongoOverlayStorage.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoPayloadStore.d.ts +134 -0
- package/dist/types/src/storage/mongo/MongoPayloadStore.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoReadGuards.d.ts +44 -0
- package/dist/types/src/storage/mongo/MongoReadGuards.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoSchema.d.ts +67 -0
- package/dist/types/src/storage/mongo/MongoSchema.d.ts.map +1 -0
- package/dist/types/src/storage/mongo/MongoTransactionRunner.d.ts +69 -0
- package/dist/types/src/storage/mongo/MongoTransactionRunner.d.ts.map +1 -0
- package/dist/types/src/storage/mongo.d.ts +9 -0
- package/dist/types/src/storage/mongo.d.ts.map +1 -0
- package/package.json +11 -5
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OVERLAY_ENGINE_POLICY_ID = void 0;
|
|
4
|
+
exports.getOverlayAdmissionHost = getOverlayAdmissionHost;
|
|
5
|
+
exports.overlayAdmissionContextDigest = overlayAdmissionContextDigest;
|
|
6
|
+
exports.overlayAdmissionOperationId = overlayAdmissionOperationId;
|
|
7
|
+
exports.overlayAdmissionMode = overlayAdmissionMode;
|
|
8
|
+
exports.selectNewAdmissionTopics = selectNewAdmissionTopics;
|
|
9
|
+
exports.buildOverlayAdmissionPlan = buildOverlayAdmissionPlan;
|
|
10
|
+
exports.waitForAdmissionReceipt = waitForAdmissionReceipt;
|
|
11
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
|
+
const BASM_js_1 = require("./BASM.js");
|
|
13
|
+
const AdmissionStorage_js_1 = require("./storage/AdmissionStorage.js");
|
|
14
|
+
exports.OVERLAY_ENGINE_POLICY_ID = 'overlay-engine-submit-v1';
|
|
15
|
+
function getOverlayAdmissionHost(storage) {
|
|
16
|
+
var _a, _b, _c;
|
|
17
|
+
const admission = (0, AdmissionStorage_js_1.getAdmissionStorage)(storage);
|
|
18
|
+
if (admission === undefined || typeof storage !== 'object' || storage === null)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (!('admissionScope' in storage))
|
|
21
|
+
return undefined;
|
|
22
|
+
const scope = storage.admissionScope;
|
|
23
|
+
if (scope === undefined ||
|
|
24
|
+
typeof scope.network !== 'string' ||
|
|
25
|
+
typeof scope.genesisHash !== 'string' ||
|
|
26
|
+
typeof scope.nodeId !== 'string' ||
|
|
27
|
+
!/^[0-9a-f]{64}$/.test(scope.genesisHash)) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const host = storage;
|
|
31
|
+
return {
|
|
32
|
+
admission,
|
|
33
|
+
admissionScope: { ...scope },
|
|
34
|
+
// Adapters are class instances whose methods read instance state, so each
|
|
35
|
+
// optional method stays bound to the storage it came from.
|
|
36
|
+
publishAdmissionPayload: (_a = host.publishAdmissionPayload) === null || _a === void 0 ? void 0 : _a.bind(host),
|
|
37
|
+
enlistedIndexTargets: (_b = host.enlistedIndexTargets) === null || _b === void 0 ? void 0 : _b.bind(host),
|
|
38
|
+
getHistoryFence: (_c = host.getHistoryFence) === null || _c === void 0 ? void 0 : _c.bind(host)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function overlayAdmissionContextDigest(offChainValues) {
|
|
42
|
+
const hash = (0, node_crypto_1.createHash)('sha256');
|
|
43
|
+
if (offChainValues !== undefined)
|
|
44
|
+
hash.update(Buffer.from(offChainValues));
|
|
45
|
+
return hash.digest('hex');
|
|
46
|
+
}
|
|
47
|
+
function overlayAdmissionOperationId(_mode, txid, topics) {
|
|
48
|
+
const topicKey = [...topics].sort((a, b) => a.localeCompare(b, 'en')).join('\n');
|
|
49
|
+
// Historical GASP replay and a later live retry represent the same
|
|
50
|
+
// transaction admission. Keep their id stable so the durable admission
|
|
51
|
+
// record is replayed instead of being submitted a second time.
|
|
52
|
+
const raw = `submit:${txid}:${topicKey}`;
|
|
53
|
+
if (Buffer.byteLength(raw, 'utf8') <= 512 && raw.isWellFormed())
|
|
54
|
+
return raw;
|
|
55
|
+
return `submit:${(0, node_crypto_1.createHash)('sha256').update(raw, 'utf8').digest('hex')}`;
|
|
56
|
+
}
|
|
57
|
+
function overlayAdmissionMode(mode) {
|
|
58
|
+
return mode === 'current-tx' ? 'live' : 'historical';
|
|
59
|
+
}
|
|
60
|
+
async function localPayload(host, kind, bytes, txid) {
|
|
61
|
+
if (host.publishAdmissionPayload !== undefined) {
|
|
62
|
+
return await host.publishAdmissionPayload({ kind, bytes, txid });
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
kind,
|
|
66
|
+
digest: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'),
|
|
67
|
+
byteLength: (0, AdmissionStorage_js_1.asStorageUint64)(String(bytes.byteLength))
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Selects the topics that require a new admission decision: topics that did
|
|
72
|
+
* not fail validation, are not already-applied dupes, and actually admit or
|
|
73
|
+
* retain something (or consume a previously-admitted coin). Already-applied
|
|
74
|
+
* (dupe) topics are excluded so that a retry — including a historical GASP
|
|
75
|
+
* replay after a live admit, or a multi-topic resubmit where only some
|
|
76
|
+
* topics were previously applied — never re-submits an admission decision
|
|
77
|
+
* for a topic that MongoAdmissionStorage.assertAppliedAvailable would reject
|
|
78
|
+
* as belonging to a different operation.
|
|
79
|
+
*/
|
|
80
|
+
function selectNewAdmissionTopics(validations, failedTopics) {
|
|
81
|
+
return validations.filter(validation => !failedTopics.has(validation.topic) &&
|
|
82
|
+
!validation.isDupe &&
|
|
83
|
+
(validation.admissibleOutputs.outputsToAdmit.length > 0 ||
|
|
84
|
+
validation.admissibleOutputs.coinsToRetain.length > 0 ||
|
|
85
|
+
validation.previousCoins.length > 0));
|
|
86
|
+
}
|
|
87
|
+
async function buildOverlayAdmissionPlan(input) {
|
|
88
|
+
var _a, _b;
|
|
89
|
+
var _c, _d;
|
|
90
|
+
// Only topics with a genuinely new admission get an identity/decision entry
|
|
91
|
+
// and take part in the commit. Dupe topics are still reflected in `steak`
|
|
92
|
+
// below (with their empty admissibleOutputs), matching what the classic
|
|
93
|
+
// storage path already returns for a dupe, but they must never be
|
|
94
|
+
// resubmitted to commitAdmission: MongoAdmissionStorage.assertAppliedAvailable
|
|
95
|
+
// rejects an applied row whose admissionId belongs to a different
|
|
96
|
+
// operation, which a dupe re-included here would trigger on retry.
|
|
97
|
+
const accepted = selectNewAdmissionTopics(input.validations, input.failedTopics);
|
|
98
|
+
const identityTopics = accepted.map(validation => ({
|
|
99
|
+
topic: validation.topic,
|
|
100
|
+
policyId: exports.OVERLAY_ENGINE_POLICY_ID
|
|
101
|
+
}));
|
|
102
|
+
if (identityTopics.length === 0)
|
|
103
|
+
throw new Error('Overlay admission plan has no topics');
|
|
104
|
+
const identity = {
|
|
105
|
+
scope: input.host.admissionScope,
|
|
106
|
+
txid: input.txid,
|
|
107
|
+
mode: input.mode,
|
|
108
|
+
contextDigest: overlayAdmissionContextDigest(input.offChainValues),
|
|
109
|
+
topics: identityTopics
|
|
110
|
+
};
|
|
111
|
+
const raw = await localPayload(input.host, 'raw-transaction', Buffer.from(input.tx.toBinary()), input.txid);
|
|
112
|
+
const payloads = [raw];
|
|
113
|
+
let proof;
|
|
114
|
+
if (input.tx.merklePath !== undefined) {
|
|
115
|
+
proof = await localPayload(input.host, 'merkle-path', Buffer.from(input.tx.merklePath.toBinary()));
|
|
116
|
+
payloads.push(proof);
|
|
117
|
+
}
|
|
118
|
+
const merkle = (0, BASM_js_1.extractMerkleProofMetadata)(input.txid, input.tx.merklePath);
|
|
119
|
+
const decisions = [];
|
|
120
|
+
const steak = {};
|
|
121
|
+
for (const validation of input.validations) {
|
|
122
|
+
steak[validation.topic] = {
|
|
123
|
+
outputsToAdmit: validation.admissibleOutputs.outputsToAdmit,
|
|
124
|
+
coinsToRetain: validation.admissibleOutputs.coinsToRetain,
|
|
125
|
+
coinsRemoved: (_c = validation.admissibleOutputs.coinsRemoved) !== null && _c !== void 0 ? _c : []
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
for (const validation of accepted) {
|
|
129
|
+
const { outputsConsumed, outputsToMarkStale } = classifyCoins(input.tx, validation);
|
|
130
|
+
const fence = input.host.getHistoryFence === undefined
|
|
131
|
+
? { chainEpoch: (0, AdmissionStorage_js_1.asStorageUint64)('0'), topicHistoryGeneration: (0, AdmissionStorage_js_1.asStorageUint64)('0') }
|
|
132
|
+
: await input.host.getHistoryFence(validation.topic);
|
|
133
|
+
const outputs = [];
|
|
134
|
+
for (const outputIndex of validation.admissibleOutputs.outputsToAdmit) {
|
|
135
|
+
const txOut = input.tx.outputs[outputIndex];
|
|
136
|
+
if (typeof (txOut === null || txOut === void 0 ? void 0 : txOut.satoshis) !== 'number' || !Number.isSafeInteger(txOut.satoshis))
|
|
137
|
+
continue;
|
|
138
|
+
const scriptBytes = Buffer.from(txOut.lockingScript.toBinary());
|
|
139
|
+
const script = await localPayload(input.host, 'locking-script', scriptBytes);
|
|
140
|
+
payloads.push(script);
|
|
141
|
+
outputs.push({
|
|
142
|
+
txid: input.txid,
|
|
143
|
+
outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(outputIndex)),
|
|
144
|
+
satoshis: (0, AdmissionStorage_js_1.asStorageUint64)(String(txOut.satoshis)),
|
|
145
|
+
score: (0, AdmissionStorage_js_1.asStorageUint64)(String(Date.now())),
|
|
146
|
+
script: { payload: script, offset: (0, AdmissionStorage_js_1.asStorageUint64)('0'), byteLength: script.byteLength }
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const spends = validation.previousOutputs.flatMap(output => output === null
|
|
150
|
+
? []
|
|
151
|
+
: [
|
|
152
|
+
{
|
|
153
|
+
outpoint: { txid: output.txid, outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(output.outputIndex)) },
|
|
154
|
+
expectedVersion: '1',
|
|
155
|
+
spender: input.txid
|
|
156
|
+
}
|
|
157
|
+
]);
|
|
158
|
+
decisions.push({
|
|
159
|
+
topic: validation.topic,
|
|
160
|
+
expectedHistory: fence,
|
|
161
|
+
reads: [],
|
|
162
|
+
spends,
|
|
163
|
+
evictions: outputsToMarkStale.map(item => ({
|
|
164
|
+
txid: item.txid,
|
|
165
|
+
outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(item.previousOutputIndex))
|
|
166
|
+
})),
|
|
167
|
+
outputs,
|
|
168
|
+
edges: outputsConsumed.flatMap(source => outputs.map(output => ({
|
|
169
|
+
source: { txid: source.txid, outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(source.outputIndex)) },
|
|
170
|
+
consumer: { txid: output.txid, outputIndex: output.outputIndex }
|
|
171
|
+
}))),
|
|
172
|
+
applied: appliedRecord(input, proof, merkle)
|
|
173
|
+
});
|
|
174
|
+
steak[validation.topic] = {
|
|
175
|
+
outputsToAdmit: validation.admissibleOutputs.outputsToAdmit,
|
|
176
|
+
coinsToRetain: validation.admissibleOutputs.coinsToRetain,
|
|
177
|
+
coinsRemoved: outputsToMarkStale.map(item => item.inputIndex)
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const enlisted = new Set((_d = (_b = (_a = input.host).enlistedIndexTargets) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _d !== void 0 ? _d : []);
|
|
181
|
+
const outbox = Object.keys(input.lookupServices)
|
|
182
|
+
.filter(target => !enlisted.has(target))
|
|
183
|
+
.map(target => ({
|
|
184
|
+
eventId: `${overlayAdmissionOperationId(input.mode, input.txid, input.topics)}:lookup:${target}`,
|
|
185
|
+
kind: 'lookup',
|
|
186
|
+
target,
|
|
187
|
+
payloads: [raw]
|
|
188
|
+
}));
|
|
189
|
+
if (input.includePropagation && input.mode === 'live') {
|
|
190
|
+
outbox.push({
|
|
191
|
+
eventId: `${overlayAdmissionOperationId(input.mode, input.txid, input.topics)}:propagate`,
|
|
192
|
+
kind: 'propagation',
|
|
193
|
+
target: 'ship',
|
|
194
|
+
payloads: [raw]
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
key: {
|
|
199
|
+
scope: input.host.admissionScope,
|
|
200
|
+
operationId: overlayAdmissionOperationId(input.mode, input.txid, input.topics),
|
|
201
|
+
semanticDigest: (0, AdmissionStorage_js_1.admissionSemanticDigest)(identity)
|
|
202
|
+
},
|
|
203
|
+
identity,
|
|
204
|
+
payloads: uniquePayloads(payloads),
|
|
205
|
+
decisions,
|
|
206
|
+
outbox,
|
|
207
|
+
steak: JSON.stringify(steak)
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function waitForAdmissionReceipt(admission, plan, rebuild) {
|
|
211
|
+
let current = plan;
|
|
212
|
+
for (let attempt = 0; attempt < 8; attempt += 1) {
|
|
213
|
+
const result = await admission.commitAdmission(current);
|
|
214
|
+
if (result.state === 'committed')
|
|
215
|
+
return result;
|
|
216
|
+
if (result.state === 'rejected') {
|
|
217
|
+
if (result.code === 'read-conflict' && attempt < 7) {
|
|
218
|
+
current = await rebuild();
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
throw new Error(`Overlay admission rejected: ${result.code}`);
|
|
222
|
+
}
|
|
223
|
+
const reconciled = await admission.reconcileAdmission(current.key, result.attemptId);
|
|
224
|
+
if (reconciled.state === 'committed')
|
|
225
|
+
return reconciled;
|
|
226
|
+
if (reconciled.state === 'aborted') {
|
|
227
|
+
current = await rebuild();
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (reconciled.state === 'rejected') {
|
|
231
|
+
throw new Error(`Overlay admission rejected: ${reconciled.code}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
throw new Error('Overlay admission commit is pending');
|
|
235
|
+
}
|
|
236
|
+
function appliedRecord(input, proof, merkle) {
|
|
237
|
+
var _a, _b, _c, _d, _e;
|
|
238
|
+
var _f, _g, _h, _j;
|
|
239
|
+
const applied = { txid: input.txid };
|
|
240
|
+
const firstSeen = (_f = (_a = input.applied) === null || _a === void 0 ? void 0 : _a.firstSeenHeight) !== null && _f !== void 0 ? _f : merkle === null || merkle === void 0 ? void 0 : merkle.blockHeight;
|
|
241
|
+
if (firstSeen !== undefined)
|
|
242
|
+
applied.firstSeenHeight = (0, AdmissionStorage_js_1.asStorageUint64)(String(firstSeen));
|
|
243
|
+
if (proof !== undefined)
|
|
244
|
+
applied.proof = proof;
|
|
245
|
+
const blockHash = (_b = input.applied) === null || _b === void 0 ? void 0 : _b.blockHash;
|
|
246
|
+
const height = (_g = (_c = input.applied) === null || _c === void 0 ? void 0 : _c.blockHeight) !== null && _g !== void 0 ? _g : merkle === null || merkle === void 0 ? void 0 : merkle.blockHeight;
|
|
247
|
+
const index = (_h = (_d = input.applied) === null || _d === void 0 ? void 0 : _d.blockIndex) !== null && _h !== void 0 ? _h : merkle === null || merkle === void 0 ? void 0 : merkle.blockIndex;
|
|
248
|
+
const merkleRoot = (_j = (_e = input.applied) === null || _e === void 0 ? void 0 : _e.merkleRoot) !== null && _j !== void 0 ? _j : merkle === null || merkle === void 0 ? void 0 : merkle.merkleRoot;
|
|
249
|
+
if (blockHash !== undefined &&
|
|
250
|
+
height !== undefined &&
|
|
251
|
+
index !== undefined &&
|
|
252
|
+
merkleRoot !== undefined) {
|
|
253
|
+
applied.block = {
|
|
254
|
+
height: (0, AdmissionStorage_js_1.asStorageUint64)(String(height)),
|
|
255
|
+
hash: blockHash,
|
|
256
|
+
index: (0, AdmissionStorage_js_1.asStorageUint64)(String(index)),
|
|
257
|
+
merkleRoot
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return applied;
|
|
261
|
+
}
|
|
262
|
+
function uniquePayloads(payloads) {
|
|
263
|
+
const seen = new Set();
|
|
264
|
+
const result = [];
|
|
265
|
+
for (const payload of payloads) {
|
|
266
|
+
const key = `${payload.kind}:${payload.digest}:${payload.byteLength}`;
|
|
267
|
+
if (seen.has(key))
|
|
268
|
+
continue;
|
|
269
|
+
seen.add(key);
|
|
270
|
+
result.push(payload);
|
|
271
|
+
}
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
274
|
+
function classifyCoins(tx, validation) {
|
|
275
|
+
var _a;
|
|
276
|
+
var _b;
|
|
277
|
+
const outputsConsumed = [];
|
|
278
|
+
const outputsToMarkStale = [];
|
|
279
|
+
for (const inputIndex of validation.previousCoins) {
|
|
280
|
+
const input = tx.inputs[inputIndex];
|
|
281
|
+
const previousTXID = (_b = input.sourceTXID) !== null && _b !== void 0 ? _b : (_a = input.sourceTransaction) === null || _a === void 0 ? void 0 : _a.id('hex');
|
|
282
|
+
if (typeof previousTXID !== 'string')
|
|
283
|
+
continue;
|
|
284
|
+
if (validation.admissibleOutputs.coinsToRetain.includes(inputIndex)) {
|
|
285
|
+
outputsConsumed.push({ txid: previousTXID, outputIndex: input.sourceOutputIndex });
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
outputsToMarkStale.push({
|
|
289
|
+
txid: previousTXID,
|
|
290
|
+
previousOutputIndex: input.sourceOutputIndex,
|
|
291
|
+
inputIndex
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return { outputsConsumed, outputsToMarkStale };
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=EngineAdmission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EngineAdmission.js","sourceRoot":"","sources":["../../../src/EngineAdmission.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { GASPInitialReply, GASPInitialRequest, GASPInitialResponse, GASPNode, GASPNodeResponse, GASPRemote } from '@bsv/gasp';
|
|
2
2
|
export declare class OverlayGASPRemote implements GASPRemote {
|
|
3
|
-
endpointURL: string;
|
|
4
|
-
topic: string;
|
|
5
|
-
|
|
3
|
+
readonly endpointURL: string;
|
|
4
|
+
readonly topic: string;
|
|
5
|
+
private readonly fetchImpl;
|
|
6
|
+
constructor(endpointURL: string, topic: string, fetchImpl?: typeof fetch);
|
|
6
7
|
/**
|
|
7
8
|
* Given an outgoing initial request, sends the request to the foreign instance and obtains their initial response.
|
|
8
9
|
* @param request
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayGASPRemote.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"OverlayGASPRemote.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAe7H,qBAAa,iBAAkB,YAAW,UAAU;IAClD,SAAgB,WAAW,EAAE,MAAM,CAAA;IACnC,SAAgB,KAAK,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IAExC,YAAa,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,EAMxE;IAED;;;;OAIG;IACG,kBAAkB,CAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmBnF;IAED;;;;;;;OAOG;IACG,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyB3G;IAKK,eAAe,CAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEhF;IAIK,UAAU,CAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAExE;CACF"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OverlayGASPRemote = void 0;
|
|
4
|
+
const RemoteSecurity_js_1 = require("../RemoteSecurity.js");
|
|
4
5
|
class OverlayGASPRemote {
|
|
5
|
-
constructor(endpointURL, topic) {
|
|
6
|
-
|
|
6
|
+
constructor(endpointURL, topic, fetchImpl) {
|
|
7
|
+
(0, RemoteSecurity_js_1.assertTopic)(topic);
|
|
8
|
+
const secured = (0, RemoteSecurity_js_1.securePeerFetch)(endpointURL, fetchImpl);
|
|
9
|
+
this.endpointURL = secured.endpoint;
|
|
7
10
|
this.topic = topic;
|
|
11
|
+
this.fetchImpl = secured.fetchImpl;
|
|
8
12
|
}
|
|
9
13
|
/**
|
|
10
14
|
* Given an outgoing initial request, sends the request to the foreign instance and obtains their initial response.
|
|
@@ -12,11 +16,14 @@ class OverlayGASPRemote {
|
|
|
12
16
|
* @returns
|
|
13
17
|
*/
|
|
14
18
|
async getInitialResponse(request) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
var _a;
|
|
20
|
+
(0, RemoteSecurity_js_1.assertNonnegativeInteger)(request.since, 'GASP request since');
|
|
21
|
+
const pageLimit = (_a = request.limit) !== null && _a !== void 0 ? _a : RemoteSecurity_js_1.MAX_GASP_PAGE_SIZE;
|
|
22
|
+
if (!Number.isSafeInteger(pageLimit) || pageLimit < 1 || pageLimit > RemoteSecurity_js_1.MAX_GASP_PAGE_SIZE) {
|
|
23
|
+
throw new TypeError(`GASP request limit must be between 1 and ${RemoteSecurity_js_1.MAX_GASP_PAGE_SIZE}`);
|
|
24
|
+
}
|
|
18
25
|
const url = `${this.endpointURL}/requestSyncResponse`;
|
|
19
|
-
const response = await
|
|
26
|
+
const response = await this.fetchImpl(url, {
|
|
20
27
|
method: 'POST',
|
|
21
28
|
headers: {
|
|
22
29
|
'Content-Type': 'application/json',
|
|
@@ -24,22 +31,9 @@ class OverlayGASPRemote {
|
|
|
24
31
|
},
|
|
25
32
|
body: JSON.stringify(request)
|
|
26
33
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const result = await response.json();
|
|
31
|
-
// Validate and return the response in the correct format
|
|
32
|
-
if (!Array.isArray(result.UTXOList) || typeof result.since !== 'number') {
|
|
33
|
-
throw new TypeError('Invalid response format');
|
|
34
|
-
}
|
|
35
|
-
return {
|
|
36
|
-
UTXOList: result.UTXOList.map((utxo) => { var _a; return ({
|
|
37
|
-
txid: utxo.txid,
|
|
38
|
-
outputIndex: utxo.outputIndex,
|
|
39
|
-
score: (_a = utxo.score) !== null && _a !== void 0 ? _a : 0
|
|
40
|
-
}); }),
|
|
41
|
-
since: result.since
|
|
42
|
-
};
|
|
34
|
+
const result = await (0, RemoteSecurity_js_1.readPeerJSON)(response);
|
|
35
|
+
(0, RemoteSecurity_js_1.assertGASPInitialResponse)(result, pageLimit);
|
|
36
|
+
return result;
|
|
43
37
|
}
|
|
44
38
|
/**
|
|
45
39
|
* Given an outgoing txid, outputIndex and optional metadata, request the associated GASP node from the foreign instance.
|
|
@@ -50,7 +44,11 @@ class OverlayGASPRemote {
|
|
|
50
44
|
* @returns
|
|
51
45
|
*/
|
|
52
46
|
async requestNode(graphID, txid, outputIndex, metadata) {
|
|
53
|
-
|
|
47
|
+
(0, RemoteSecurity_js_1.assertOutpoint)(graphID, 'GASP request graphID');
|
|
48
|
+
(0, RemoteSecurity_js_1.assertHash)(txid, 'GASP request txid');
|
|
49
|
+
(0, RemoteSecurity_js_1.assertOutputIndex)(outputIndex, 'GASP request outputIndex');
|
|
50
|
+
if (typeof metadata !== 'boolean')
|
|
51
|
+
throw new TypeError('GASP request metadata flag is invalid');
|
|
54
52
|
const url = `${this.endpointURL}/requestForeignGASPNode`;
|
|
55
53
|
const body = {
|
|
56
54
|
graphID,
|
|
@@ -58,31 +56,17 @@ class OverlayGASPRemote {
|
|
|
58
56
|
outputIndex,
|
|
59
57
|
metadata
|
|
60
58
|
};
|
|
61
|
-
const response = await
|
|
59
|
+
const response = await this.fetchImpl(url, {
|
|
62
60
|
method: 'POST',
|
|
63
61
|
headers: {
|
|
64
|
-
'Content-Type': 'application/json'
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
'X-BSV-Topic': this.topic
|
|
65
64
|
},
|
|
66
65
|
body: JSON.stringify(body)
|
|
67
66
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const result = await response.json();
|
|
72
|
-
// Validate and return the response in the correct format
|
|
73
|
-
if (typeof result.graphID !== 'string' || typeof result.rawTx !== 'string' || typeof result.outputIndex !== 'number') {
|
|
74
|
-
throw new TypeError('Invalid response format');
|
|
75
|
-
}
|
|
76
|
-
const gaspNode = {
|
|
77
|
-
graphID: result.graphID,
|
|
78
|
-
rawTx: result.rawTx,
|
|
79
|
-
outputIndex: result.outputIndex,
|
|
80
|
-
proof: result.proof,
|
|
81
|
-
txMetadata: result.txMetadata,
|
|
82
|
-
outputMetadata: result.outputMetadata,
|
|
83
|
-
inputs: result.inputs
|
|
84
|
-
};
|
|
85
|
-
return gaspNode;
|
|
67
|
+
const result = await (0, RemoteSecurity_js_1.readPeerJSON)(response, RemoteSecurity_js_1.MAX_GASP_NODE_JSON_BYTES);
|
|
68
|
+
(0, RemoteSecurity_js_1.assertGASPNode)(result, { graphID, txid, outputIndex });
|
|
69
|
+
return result;
|
|
86
70
|
}
|
|
87
71
|
// ---- Now optional methods ----
|
|
88
72
|
// When are only syncing to them
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayGASPRemote.js","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"OverlayGASPRemote.js","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,14 +22,20 @@ export declare class OverlayGASPStorage implements GASPStorage {
|
|
|
22
22
|
topic: string;
|
|
23
23
|
engine: Engine;
|
|
24
24
|
maxNodesInGraph?: number | undefined;
|
|
25
|
+
maxBytesInGraph: number;
|
|
25
26
|
readonly temporaryGraphNodeRefs: Record<string, GraphNode>;
|
|
27
|
+
private readonly graphNodeCounts;
|
|
28
|
+
private readonly graphByteCounts;
|
|
26
29
|
private static activeAnchorValidations;
|
|
27
30
|
private static readonly anchorValidationQueue;
|
|
28
31
|
private static activeFinalizations;
|
|
29
32
|
private static readonly finalizationQueue;
|
|
30
33
|
private static readonly MAX_CONCURRENT_ANCHOR_VALIDATIONS;
|
|
31
34
|
private static readonly MAX_CONCURRENT_FINALIZATIONS;
|
|
32
|
-
constructor(topic: string, engine: Engine, maxNodesInGraph?: number | undefined);
|
|
35
|
+
constructor(topic: string, engine: Engine, maxNodesInGraph?: number | undefined, maxBytesInGraph?: number);
|
|
36
|
+
private graphNodeKey;
|
|
37
|
+
private graphNode;
|
|
38
|
+
private nodeByteLength;
|
|
33
39
|
private static acquireAnchorValidationSlot;
|
|
34
40
|
private static releaseAnchorValidationSlot;
|
|
35
41
|
private static acquireFinalizationSlot;
|
|
@@ -50,10 +56,10 @@ export declare class OverlayGASPStorage implements GASPStorage {
|
|
|
50
56
|
*/
|
|
51
57
|
hydrateGASPNode(graphID: string, txid: string, outputIndex: number, _metadata: boolean): Promise<GASPNode>;
|
|
52
58
|
/**
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
* For a given node, returns the inputs needed to complete the graph, including whether updated metadata is requested for those inputs.
|
|
60
|
+
* @param tx The node for which needed inputs should be found.
|
|
61
|
+
* @returns A promise for a mapping of requested input transactions and whether metadata should be provided for each.
|
|
62
|
+
*/
|
|
57
63
|
findNeededInputs(tx: GASPNode): Promise<GASPNodeResponse | undefined>;
|
|
58
64
|
/**
|
|
59
65
|
* Ensures that no inputs are requested from foreign nodes before sending any GASP response
|
|
@@ -61,21 +67,21 @@ export declare class OverlayGASPStorage implements GASPStorage {
|
|
|
61
67
|
*/
|
|
62
68
|
private stripAlreadyKnownInputs;
|
|
63
69
|
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
70
|
+
* Appends a new node to a temporary graph.
|
|
71
|
+
* @param tx The node to append to this graph.
|
|
72
|
+
* @param spentBy Unless this is the same node identified by the graph ID, denotes the TXID and input index for the node which spent this one, in 36-byte format.
|
|
73
|
+
* @throws If the node cannot be appended to the graph, either because the graph ID is for a graph the recipient does not want or because the graph has grown to be too large before being finalized.
|
|
74
|
+
*/
|
|
69
75
|
appendToGraph(tx: GASPNode, spentBy?: string | undefined): Promise<void>;
|
|
70
76
|
private previousCoinIndexes;
|
|
71
77
|
private admitHistoricalBEEF;
|
|
72
78
|
/**
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
* Checks whether the given graph, in its current state, makes reference only to transactions that are proven in the blockchain, or already known by the recipient to be valid.
|
|
80
|
+
* Additionally, in a breadth-first manner (ensuring that all inputs for any given node are processed before nodes that spend them), it ensures that the root node remains valid according to the rules of the overlay's topic manager,
|
|
81
|
+
* while considering any coins which the Manager had previously indicated were either valid or invalid.
|
|
82
|
+
* @param graphID The TXID and output index (in 36-byte format) for the UTXO at the tip of this graph.
|
|
83
|
+
* @throws If the graph is not well-anchored, according to the rules of Bitcoin or the rules of the Overlay Topic Manager.
|
|
84
|
+
*/
|
|
79
85
|
validateGraphAnchor(graphID: string): Promise<void>;
|
|
80
86
|
/**
|
|
81
87
|
* Deletes all data associated with a temporary graph that has failed to sync, if the graph exists.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayGASPStorage.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OverlayGASPStorage.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPStorage.ts"],"names":[],"mappings":"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"}
|