@optimystic/db-p2p 0.3.0 → 0.9.0
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/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
- package/dist/src/cluster/block-transfer-service.js +4 -1
- package/dist/src/cluster/block-transfer-service.js.map +1 -1
- package/dist/src/cluster/block-transfer.d.ts +2 -16
- package/dist/src/cluster/block-transfer.d.ts.map +1 -1
- package/dist/src/cluster/block-transfer.js +68 -71
- package/dist/src/cluster/block-transfer.js.map +1 -1
- package/dist/src/cluster/client.d.ts.map +1 -1
- package/dist/src/cluster/client.js +7 -1
- package/dist/src/cluster/client.js.map +1 -1
- package/dist/src/cluster/cluster-repo.d.ts +11 -1
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +53 -18
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/rebalance-monitor.d.ts.map +1 -1
- package/dist/src/cluster/rebalance-monitor.js +3 -5
- package/dist/src/cluster/rebalance-monitor.js.map +1 -1
- package/dist/src/dispute/dispute-service.d.ts +2 -0
- package/dist/src/dispute/dispute-service.d.ts.map +1 -1
- package/dist/src/dispute/dispute-service.js +8 -2
- package/dist/src/dispute/dispute-service.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +5 -3
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.js +1 -1
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +2 -0
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +39 -17
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +2 -2
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +6 -6
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/sync/service.d.ts +7 -7
- package/dist/src/sync/service.d.ts.map +1 -1
- package/dist/src/sync/service.js +42 -73
- package/dist/src/sync/service.js.map +1 -1
- package/package.json +5 -4
- package/src/cluster/block-transfer-service.ts +4 -1
- package/src/cluster/block-transfer.ts +80 -99
- package/src/cluster/client.ts +6 -1
- package/src/cluster/cluster-repo.ts +72 -17
- package/src/cluster/rebalance-monitor.ts +3 -5
- package/src/dispute/dispute-service.ts +9 -3
- package/src/index.ts +2 -0
- package/src/libp2p-key-network.ts +5 -3
- package/src/libp2p-node-base.ts +1 -1
- package/src/repo/cluster-coordinator.ts +44 -18
- package/src/repo/coordinator-repo.ts +8 -8
- package/src/sync/service.ts +62 -96
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-transfer-service.d.ts","sourceRoot":"","sources":["../../../src/cluster/block-transfer-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKvE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASvD,eAAO,MAAM,0BAA0B,GAAI,iBAAgB,MAAW,KAAG,MACJ,CAAC;AAEtE,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,+BAA+B;AAC/B,MAAM,WAAW,qBAAqB;IACrC,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,mDAAmD;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,MAAM,WAAW,wBAAwB;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC9C,SAAS,EAAE;QAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACtG,IAAI,EAAE,KAAK,CAAC;CACZ;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IAOpD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;gBAGtD,UAAU,EAAE,8BAA8B,EAC3D,IAAI,GAAE,wBAA6B;IAO9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,aAAa;YA0Bb,UAAU;
|
|
1
|
+
{"version":3,"file":"block-transfer-service.d.ts","sourceRoot":"","sources":["../../../src/cluster/block-transfer-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKvE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASvD,eAAO,MAAM,0BAA0B,GAAI,iBAAgB,MAAW,KAAG,MACJ,CAAC;AAEtE,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,+BAA+B;AAC/B,MAAM,WAAW,qBAAqB;IACrC,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,mDAAmD;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,MAAM,WAAW,wBAAwB;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC9C,SAAS,EAAE;QAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACtG,IAAI,EAAE,KAAK,CAAC;CACZ;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IAOpD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;gBAGtD,UAAU,EAAE,8BAA8B,EAC3D,IAAI,GAAE,wBAA6B;IAO9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,aAAa;YA0Bb,UAAU;YAqBV,UAAU;YA2BV,WAAW;YAmBX,YAAY;CAO1B;AAED,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,GAAI,OAAM,wBAA6B,MACtE,YAAY,8BAA8B,yBAA+C,CAAC;AAI5F;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,YAAY,EACzB,cAAc,GAAE,MAAW;IAM5B,wCAAwC;IAClC,UAAU,CACf,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,GAAE,oBAAoB,CAAC,QAAQ,CAAe,GAClD,OAAO,CAAC,qBAAqB,CAAC;IAKjC,sCAAsC;IAChC,UAAU,CACf,QAAQ,EAAE,MAAM,EAAE,EAClB,gBAAgB,EAAE,UAAU,EAAE,EAC9B,MAAM,GAAE,oBAAoB,CAAC,QAAQ,CAAe,GAClD,OAAO,CAAC,qBAAqB,CAAC;CAQjC"}
|
|
@@ -88,13 +88,16 @@ export class BlockTransferService {
|
|
|
88
88
|
}
|
|
89
89
|
return { blocks, missing };
|
|
90
90
|
}
|
|
91
|
+
// TODO: handlePush validates incoming block data but does not persist it.
|
|
92
|
+
// The pushed data is a serialized IBlock, not a full BlockArchive with revisions.
|
|
93
|
+
// Persistence should be wired when RebalanceMonitor integrates with BlockStorage.saveRestored().
|
|
91
94
|
async handlePush(request) {
|
|
92
95
|
const blocks = {};
|
|
93
96
|
const missing = [];
|
|
94
97
|
if (!request.blockData) {
|
|
95
98
|
return { blocks: {}, missing: request.blockIds };
|
|
96
99
|
}
|
|
97
|
-
// Accept pushed blocks — for each block,
|
|
100
|
+
// Accept pushed blocks — for each block, validate we received parseable data
|
|
98
101
|
for (const blockId of request.blockIds) {
|
|
99
102
|
const data = request.blockData[blockId];
|
|
100
103
|
if (data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-transfer-service.js","sourceRoot":"","sources":["../../../src/cluster/block-transfer-service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"block-transfer-service.js","sourceRoot":"","sources":["../../../src/cluster/block-transfer-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAEnD,oBAAoB;AACpB,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AACxD,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAEvC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,iBAAyB,EAAE,EAAU,EAAE,CACjF,GAAG,cAAc,GAAG,qBAAqB,GAAG,sBAAsB,EAAE,CAAC;AAgCtE;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IAOd;IANV,OAAO,GAAG,KAAK,CAAC;IACP,QAAQ,CAAS;IACjB,IAAI,CAAQ;IACZ,SAAS,CAA8C;IAExE,YACkB,UAA0C,EAC3D,OAAiC,EAAE;QADlB,eAAU,GAAV,UAAU,CAAgC;QAG3D,IAAI,CAAC,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;YAC9D,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc;QACzC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/C,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAElG,IAAI,QAA+B,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7B,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACP,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC1C,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,GAAG,CAAC,WAAW,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACR,qBAAqB;YACtB,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAA6B;QACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,WAAW,EAAE,KAAK,EAAE,CAAC;gBACxB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,0EAA0E;IAC1E,kFAAkF;IAClF,iGAAiG;IACzF,KAAK,CAAC,UAAU,CAAC,OAA6B;QACrD,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;QAED,6EAA6E;QAC7E,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACV,gCAAgC;gBAChC,IAAI,CAAC;oBACJ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzD,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACR,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAc;QACvC,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,MAAM,IAAI,CACT,MAAM,EACN,EAAE,CAAC,MAAM,EACT,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC,CACD,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAyB,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,QAA+B;QACzE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;CACD;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAiC,EAAE,EAAE,EAAE,CAC3E,CAAC,UAA0C,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAE5F,iBAAiB;AAEjB;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrC,QAAQ,CAAS;IAElC,YACC,MAAc,EACd,WAAyB,EACzB,iBAAyB,EAAE;QAE3B,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,UAAU,CACf,QAAkB,EAClB,SAAyC,WAAW;QAEpD,MAAM,OAAO,GAAyB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACzE,OAAO,MAAM,IAAI,CAAC,cAAc,CAAwB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,UAAU,CACf,QAAkB,EAClB,gBAA8B,EAC9B,SAAyC,WAAW;QAEpD,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,OAAO,GAAyB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACpF,OAAO,MAAM,IAAI,CAAC,cAAc,CAAwB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC;CACD"}
|
|
@@ -1,21 +1,7 @@
|
|
|
1
|
-
import type { IRepo } from '@optimystic/db-core';
|
|
2
|
-
import type { IPeerNetwork } from '@optimystic/db-core';
|
|
1
|
+
import type { IRepo, IPeerNetwork } from '@optimystic/db-core';
|
|
3
2
|
import type { PartitionDetector } from './partition-detector.js';
|
|
4
3
|
import type { RestorationCoordinator } from '../storage/restoration-coordinator-v2.js';
|
|
5
|
-
|
|
6
|
-
* Rebalance event describing gained/lost block responsibilities.
|
|
7
|
-
* Matches the RebalanceMonitor spec from the sibling ticket.
|
|
8
|
-
*/
|
|
9
|
-
export interface RebalanceEvent {
|
|
10
|
-
/** Block IDs this node has gained responsibility for */
|
|
11
|
-
gained: string[];
|
|
12
|
-
/** Block IDs this node has lost responsibility for */
|
|
13
|
-
lost: string[];
|
|
14
|
-
/** Peers that are now closer for the lost blocks: blockId → peerId[] */
|
|
15
|
-
newOwners: Map<string, string[]>;
|
|
16
|
-
/** Timestamp of the topology change that triggered this */
|
|
17
|
-
triggeredAt: number;
|
|
18
|
-
}
|
|
4
|
+
import type { RebalanceEvent } from './rebalance-monitor.js';
|
|
19
5
|
export interface BlockTransferConfig {
|
|
20
6
|
/** Max concurrent transfers. Default: 4 */
|
|
21
7
|
maxConcurrency?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-transfer.d.ts","sourceRoot":"","sources":["../../../src/cluster/block-transfer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"block-transfer.d.ts","sourceRoot":"","sources":["../../../src/cluster/block-transfer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,MAAM,WAAW,mBAAmB;IACnC,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,qBAAa,wBAAwB;IAUnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAbhC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBAGjC,IAAI,EAAE,KAAK,EACX,WAAW,EAAE,YAAY,EACzB,sBAAsB,EAAE,sBAAsB,EAC9C,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,GAAE,MAAW,EAC5C,MAAM,GAAE,mBAAwB;IAQjC;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgBxF;;OAEG;IACG,UAAU,CACf,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC9B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAmBrD;;OAEG;IACG,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAelD,WAAW;YAyCX,WAAW;YA4EX,gBAAgB;IAS9B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,WAAW;CAMnB"}
|
|
@@ -46,10 +46,8 @@ export class BlockTransferCoordinator {
|
|
|
46
46
|
}
|
|
47
47
|
const succeeded = [];
|
|
48
48
|
const failed = [];
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
.map(id => ({ blockId: id, attempt: 0 }));
|
|
52
|
-
await Promise.all(tasks.map(task => this.executePull(task, succeeded, failed)));
|
|
49
|
+
const ids = blockIds.filter(id => !this.inFlight.has(`pull:${id}`));
|
|
50
|
+
await Promise.all(ids.map(id => this.executePull(id, succeeded, failed)));
|
|
53
51
|
return { succeeded, failed };
|
|
54
52
|
}
|
|
55
53
|
/**
|
|
@@ -65,10 +63,8 @@ export class BlockTransferCoordinator {
|
|
|
65
63
|
}
|
|
66
64
|
const succeeded = [];
|
|
67
65
|
const failed = [];
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
.map(id => ({ blockId: id, attempt: 0 }));
|
|
71
|
-
await Promise.all(tasks.map(task => this.executePush(task, newOwners, succeeded, failed)));
|
|
66
|
+
const ids = blockIds.filter(id => !this.inFlight.has(`push:${id}`) && newOwners.has(id));
|
|
67
|
+
await Promise.all(ids.map(id => this.executePush(id, newOwners, succeeded, failed)));
|
|
72
68
|
return { succeeded, failed };
|
|
73
69
|
}
|
|
74
70
|
/**
|
|
@@ -84,95 +80,96 @@ export class BlockTransferCoordinator {
|
|
|
84
80
|
]);
|
|
85
81
|
log('rebalance:done pull=%d/%d push=%d/%d', pullResult.succeeded.length, event.gained.length, pushResult.succeeded.length, event.lost.length);
|
|
86
82
|
}
|
|
87
|
-
async executePull(
|
|
88
|
-
const key = `pull:${
|
|
83
|
+
async executePull(blockId, succeeded, failed) {
|
|
84
|
+
const key = `pull:${blockId}`;
|
|
89
85
|
if (this.inFlight.has(key))
|
|
90
86
|
return;
|
|
91
87
|
this.inFlight.add(key);
|
|
92
88
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
89
|
+
for (let attempt = 0;; attempt++) {
|
|
90
|
+
await this.acquireSemaphore();
|
|
91
|
+
let archive;
|
|
92
|
+
try {
|
|
93
|
+
archive = await this.withTimeout(this.restorationCoordinator.restore(blockId), this.transferTimeoutMs);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
this.releaseSemaphore();
|
|
99
97
|
}
|
|
100
|
-
|
|
101
|
-
log('pull:
|
|
102
|
-
|
|
103
|
-
await this.delay(this.backoffMs(task.attempt));
|
|
104
|
-
await this.executePull({ ...task, attempt: task.attempt + 1 }, succeeded, failed);
|
|
98
|
+
if (archive) {
|
|
99
|
+
log('pull:ok block=%s', blockId);
|
|
100
|
+
succeeded.push(blockId);
|
|
105
101
|
return;
|
|
106
102
|
}
|
|
107
|
-
|
|
108
|
-
log('pull:
|
|
109
|
-
|
|
103
|
+
if (attempt < this.maxRetries) {
|
|
104
|
+
log('pull:retry block=%s attempt=%d', blockId, attempt + 1);
|
|
105
|
+
await this.delay(this.backoffMs(attempt));
|
|
106
|
+
continue;
|
|
110
107
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
log('pull:failed block=%s', blockId);
|
|
109
|
+
failed.push(blockId);
|
|
110
|
+
return;
|
|
114
111
|
}
|
|
115
112
|
}
|
|
116
113
|
finally {
|
|
117
114
|
this.inFlight.delete(key);
|
|
118
115
|
}
|
|
119
116
|
}
|
|
120
|
-
async executePush(
|
|
121
|
-
const key = `push:${
|
|
117
|
+
async executePush(blockId, newOwners, succeeded, failed) {
|
|
118
|
+
const key = `push:${blockId}`;
|
|
122
119
|
if (this.inFlight.has(key))
|
|
123
120
|
return;
|
|
124
121
|
this.inFlight.add(key);
|
|
125
122
|
try {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const owners = newOwners.get(task.blockId);
|
|
129
|
-
if (!owners || owners.length === 0) {
|
|
130
|
-
failed.push(task.blockId);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
// Read block data from local storage
|
|
134
|
-
const result = await this.repo.get({ blockIds: [task.blockId] });
|
|
135
|
-
const blockResult = result[task.blockId];
|
|
136
|
-
if (!blockResult?.block) {
|
|
137
|
-
log('push:no-local-data block=%s', task.blockId);
|
|
138
|
-
failed.push(task.blockId);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
const blockData = new TextEncoder().encode(JSON.stringify(blockResult.block));
|
|
142
|
-
// Push to at least one new owner
|
|
123
|
+
for (let attempt = 0;; attempt++) {
|
|
124
|
+
await this.acquireSemaphore();
|
|
143
125
|
let pushed = false;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
126
|
+
try {
|
|
127
|
+
const owners = newOwners.get(blockId);
|
|
128
|
+
if (!owners || owners.length === 0) {
|
|
129
|
+
failed.push(blockId);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Read block data from local storage
|
|
133
|
+
const result = await this.repo.get({ blockIds: [blockId] });
|
|
134
|
+
const blockResult = result[blockId];
|
|
135
|
+
if (!blockResult?.block) {
|
|
136
|
+
log('push:no-local-data block=%s', blockId);
|
|
137
|
+
failed.push(blockId);
|
|
138
|
+
return;
|
|
154
139
|
}
|
|
155
|
-
|
|
156
|
-
|
|
140
|
+
const blockData = new TextEncoder().encode(JSON.stringify(blockResult.block));
|
|
141
|
+
// Push to at least one new owner
|
|
142
|
+
for (const ownerPeerIdStr of owners) {
|
|
143
|
+
try {
|
|
144
|
+
const peerId = peerIdFromString(ownerPeerIdStr);
|
|
145
|
+
const client = new BlockTransferClient(peerId, this.peerNetwork, this.protocolPrefix);
|
|
146
|
+
const response = await this.withTimeout(client.pushBlocks([blockId], [blockData]), this.transferTimeoutMs);
|
|
147
|
+
if (response && !response.missing.includes(blockId)) {
|
|
148
|
+
pushed = true;
|
|
149
|
+
log('push:ok block=%s peer=%s', blockId, ownerPeerIdStr);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
log('push:peer-error block=%s peer=%s err=%s', blockId, ownerPeerIdStr, err.message);
|
|
155
|
+
}
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
finally {
|
|
159
|
+
this.releaseSemaphore();
|
|
161
160
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
this.inFlight.delete(key);
|
|
165
|
-
await this.delay(this.backoffMs(task.attempt));
|
|
166
|
-
await this.executePush({ ...task, attempt: task.attempt + 1 }, newOwners, succeeded, failed);
|
|
161
|
+
if (pushed) {
|
|
162
|
+
succeeded.push(blockId);
|
|
167
163
|
return;
|
|
168
164
|
}
|
|
169
|
-
|
|
170
|
-
log('push:
|
|
171
|
-
|
|
165
|
+
if (attempt < this.maxRetries) {
|
|
166
|
+
log('push:retry block=%s attempt=%d', blockId, attempt + 1);
|
|
167
|
+
await this.delay(this.backoffMs(attempt));
|
|
168
|
+
continue;
|
|
172
169
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
170
|
+
log('push:failed block=%s', blockId);
|
|
171
|
+
failed.push(blockId);
|
|
172
|
+
return;
|
|
176
173
|
}
|
|
177
174
|
}
|
|
178
175
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-transfer.js","sourceRoot":"","sources":["../../../src/cluster/block-transfer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"block-transfer.js","sourceRoot":"","sources":["../../../src/cluster/block-transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/cluster/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,qBAAa,aAAc,SAAQ,cAAe,YAAW,QAAQ;IACL,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;IAA/F,OAAO;IAIP,mCAAmC;WACrB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa;IAIhG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/cluster/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,qBAAa,aAAc,SAAQ,cAAe,YAAW,QAAQ;IACL,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;IAA/F,OAAO;IAIP,mCAAmC;WACrB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa;IAIhG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAsC5E,OAAO,CAAC,qCAAqC;CAc9C"}
|
|
@@ -22,7 +22,13 @@ export class ClusterClient extends ProtocolClient {
|
|
|
22
22
|
}
|
|
23
23
|
catch (err) {
|
|
24
24
|
if (preferred !== '/db-p2p/cluster/1.0.0') {
|
|
25
|
-
|
|
25
|
+
try {
|
|
26
|
+
response = await this.processMessage(message, '/db-p2p/cluster/1.0.0');
|
|
27
|
+
}
|
|
28
|
+
catch (fallbackErr) {
|
|
29
|
+
// Throw original error - fallback protocol is likely not registered
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
else {
|
|
28
34
|
throw err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/cluster/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,aAAc,SAAQ,cAAc;IACwB;IAAxE,YAAoB,MAAc,EAAE,WAAyB,EAAW,cAAuB;QAC9F,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAD4C,mBAAc,GAAd,cAAc,CAAS;IAE/F,CAAC;IAED,mCAAmC;IAC5B,MAAM,CAAC,MAAM,CAAC,MAAc,EAAE,WAAyB,EAAE,cAAuB;QACtF,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAC/D,CAAC;IAEA,KAAK,CAAC,MAAM,CAAC,MAAqB,EAAE,MAAc,CAAC;QACnD,MAAM,OAAO,GAAG;YACf,SAAS,EAAE,QAAQ;YACnB,MAAM;SACN,CAAC;QACA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,GAAG,gBAAgB,CAAA;QACvE,IAAI,QAAa,CAAA;QACjB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAM,OAAO,EAAE,SAAS,CAAC,CAAA;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;gBAC1C,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAM,OAAO,EAAE,uBAAuB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/cluster/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,9 +52,17 @@ export declare class ClusterMember implements ICluster {
|
|
|
52
52
|
update(record: ClusterRecord): Promise<ClusterRecord>;
|
|
53
53
|
private processUpdate;
|
|
54
54
|
/**
|
|
55
|
-
* Merges two records, validating that non-signature fields match
|
|
55
|
+
* Merges two records, validating that non-signature fields match.
|
|
56
|
+
* Detects equivocation (same peer changing vote type) and applies penalties.
|
|
56
57
|
*/
|
|
57
58
|
private mergeRecords;
|
|
59
|
+
/**
|
|
60
|
+
* Compares existing vs incoming signatures for the same peers.
|
|
61
|
+
* If a peer's vote type changed (approve↔reject), that's equivocation:
|
|
62
|
+
* report a penalty and keep the first-seen signature.
|
|
63
|
+
* New peers are accepted normally.
|
|
64
|
+
*/
|
|
65
|
+
private detectEquivocation;
|
|
58
66
|
private validateRecord;
|
|
59
67
|
/**
|
|
60
68
|
* Compute message hash using the same algorithm as the coordinator.
|
|
@@ -62,6 +70,8 @@ export declare class ClusterMember implements ICluster {
|
|
|
62
70
|
*/
|
|
63
71
|
private computeMessageHash;
|
|
64
72
|
private validateSignatures;
|
|
73
|
+
/** Deterministic JSON: sorts object keys so hash is order-independent */
|
|
74
|
+
private static canonicalJson;
|
|
65
75
|
private computePromiseHash;
|
|
66
76
|
private computeCommitHash;
|
|
67
77
|
private computeSigningPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-repo.d.ts","sourceRoot":"","sources":["../../../src/cluster/cluster-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAA0B,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvI,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAO5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAsB9D,UAAU,uBAAuB;IAChC,WAAW,EAAE,KAAK,CAAC;IACnB,WAAW,EAAE,YAAY,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,eAAe,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,uBAAuB,GAAG,aAAa,CAahF;AAKD;;;GAGG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAgB5C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAtB7B,OAAO,CAAC,kBAAkB,CAA4C;IAEtE,OAAO,CAAC,oBAAoB,CAAkC;IAE9D,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,cAAc,CAAkD;IAExE,OAAO,CAAC,uBAAuB,CAAC,CAAgB;IAEhD,kGAAkG;IAClG,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;gBAG9B,WAAW,EAAE,KAAK,EAClB,WAAW,EAAE,YAAY,EACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,MAAM,YAAA,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,YAAA,EACrC,WAAW,CAAC,EAAE,WAAW,YAAA,EACzB,SAAS,CAAC,EAAE,qBAAqB,YAAA,EACjC,UAAU,CAAC,EAAE,eAAe,YAAA,EAC7C,eAAe,CAAC,EAAE,sBAAsB;IASzC;;;OAGG;IACH,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIpD;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YAyB7C,aAAa;
|
|
1
|
+
{"version":3,"file":"cluster-repo.d.ts","sourceRoot":"","sources":["../../../src/cluster/cluster-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAA0B,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvI,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAO5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAsB9D,UAAU,uBAAuB;IAChC,WAAW,EAAE,KAAK,CAAC;IACnB,WAAW,EAAE,YAAY,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,eAAe,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,uBAAuB,GAAG,aAAa,CAahF;AAKD;;;GAGG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAgB5C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAtB7B,OAAO,CAAC,kBAAkB,CAA4C;IAEtE,OAAO,CAAC,oBAAoB,CAAkC;IAE9D,OAAO,CAAC,YAAY,CAAgB;IAEpC,OAAO,CAAC,cAAc,CAAkD;IAExE,OAAO,CAAC,uBAAuB,CAAC,CAAgB;IAEhD,kGAAkG;IAClG,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;gBAG9B,WAAW,EAAE,KAAK,EAClB,WAAW,EAAE,YAAY,EACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,MAAM,YAAA,EACvB,iBAAiB,CAAC,EAAE,iBAAiB,YAAA,EACrC,WAAW,CAAC,EAAE,WAAW,YAAA,EACzB,SAAS,CAAC,EAAE,qBAAqB,YAAA,EACjC,UAAU,CAAC,EAAE,eAAe,YAAA,EAC7C,eAAe,CAAC,EAAE,sBAAsB;IASzC;;;OAGG;IACH,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIpD;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YAyB7C,aAAa;IA8J3B;;;OAGG;YACW,YAAY;IAkC1B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;YAqCZ,cAAc;IAgB5B;;;OAGG;YACW,kBAAkB;YAMlB,kBAAkB;IAyBhC,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,aAAa;YAQd,kBAAkB;YAMlB,iBAAiB;IAM/B,OAAO,CAAC,qBAAqB;YAKf,QAAQ;YAMR,eAAe;YAaf,mBAAmB;IAwCjC,OAAO,CAAC,WAAW;YAIL,mBAAmB;IA6BjC;;;;OAIG;YACW,sBAAsB;YAuCtB,kBAAkB;IAoBhC;;;;;;;;;;;;;;;OAeG;YACW,eAAe;YAkDf,eAAe;IAI7B,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IA2DnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,mBAAmB;YAmBb,iBAAiB;YAejB,gBAAgB;YA+BhB,gBAAgB;IAM9B,OAAO,CAAC,wBAAwB;YAgBlB,mBAAmB;IAejC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,gBAAgB;CAkBxB"}
|
|
@@ -187,16 +187,8 @@ export class ClusterMember {
|
|
|
187
187
|
log('cluster-member:action-consensus', {
|
|
188
188
|
messageHash: record.messageHash
|
|
189
189
|
});
|
|
190
|
-
//
|
|
191
|
-
|
|
192
|
-
if (inboundPhase !== 'commit') {
|
|
193
|
-
await this.handleConsensus(currentRecord);
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
log('cluster-member:consensus-skip-already-committed', {
|
|
197
|
-
messageHash: record.messageHash
|
|
198
|
-
});
|
|
199
|
-
}
|
|
190
|
+
// handleConsensus has its own idempotency guard via executedTransactions
|
|
191
|
+
await this.handleConsensus(currentRecord);
|
|
200
192
|
// Don't call clearTransaction here - it happens in handleConsensus
|
|
201
193
|
shouldPersist = false;
|
|
202
194
|
break;
|
|
@@ -254,7 +246,8 @@ export class ClusterMember {
|
|
|
254
246
|
return currentRecord;
|
|
255
247
|
}
|
|
256
248
|
/**
|
|
257
|
-
* Merges two records, validating that non-signature fields match
|
|
249
|
+
* Merges two records, validating that non-signature fields match.
|
|
250
|
+
* Detects equivocation (same peer changing vote type) and applies penalties.
|
|
258
251
|
*/
|
|
259
252
|
async mergeRecords(existing, incoming) {
|
|
260
253
|
log('cluster-member:merge-records', {
|
|
@@ -274,13 +267,47 @@ export class ClusterMember {
|
|
|
274
267
|
if (JSON.stringify(existing.peers) !== JSON.stringify(incoming.peers)) {
|
|
275
268
|
throw new Error('Peers mismatch');
|
|
276
269
|
}
|
|
277
|
-
// Merge signatures
|
|
270
|
+
// Merge signatures with equivocation detection
|
|
271
|
+
const mergedPromises = this.detectEquivocation(existing.promises, incoming.promises, 'promise', existing.messageHash);
|
|
272
|
+
const mergedCommits = this.detectEquivocation(existing.commits, incoming.commits, 'commit', existing.messageHash);
|
|
278
273
|
return {
|
|
279
274
|
...existing,
|
|
280
|
-
promises:
|
|
281
|
-
commits:
|
|
275
|
+
promises: mergedPromises,
|
|
276
|
+
commits: mergedCommits
|
|
282
277
|
};
|
|
283
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Compares existing vs incoming signatures for the same peers.
|
|
281
|
+
* If a peer's vote type changed (approve↔reject), that's equivocation:
|
|
282
|
+
* report a penalty and keep the first-seen signature.
|
|
283
|
+
* New peers are accepted normally.
|
|
284
|
+
*/
|
|
285
|
+
detectEquivocation(existing, incoming, phase, messageHash) {
|
|
286
|
+
const merged = { ...existing };
|
|
287
|
+
for (const [peerId, incomingSig] of Object.entries(incoming)) {
|
|
288
|
+
const existingSig = existing[peerId];
|
|
289
|
+
if (existingSig) {
|
|
290
|
+
if (existingSig.type !== incomingSig.type) {
|
|
291
|
+
// Equivocation detected: peer changed their vote type
|
|
292
|
+
log('cluster-member:equivocation-detected', {
|
|
293
|
+
peerId,
|
|
294
|
+
phase,
|
|
295
|
+
messageHash,
|
|
296
|
+
existingType: existingSig.type,
|
|
297
|
+
incomingType: incomingSig.type
|
|
298
|
+
});
|
|
299
|
+
this.reputation?.reportPeer(peerId, PenaltyReason.Equivocation, `${phase}:${messageHash}:${existingSig.type}->${incomingSig.type}`);
|
|
300
|
+
// Keep first-seen signature — do not let the peer flip their vote
|
|
301
|
+
}
|
|
302
|
+
// Same type: keep existing (no-op, already in merged)
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
// New peer — accept normally
|
|
306
|
+
merged[peerId] = incomingSig;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return merged;
|
|
310
|
+
}
|
|
284
311
|
async validateRecord(record) {
|
|
285
312
|
// Validate message hash matches the message content
|
|
286
313
|
const expectedHash = await this.computeMessageHash(record.message);
|
|
@@ -299,7 +326,7 @@ export class ClusterMember {
|
|
|
299
326
|
* Must match cluster-coordinator.ts createMessageHash().
|
|
300
327
|
*/
|
|
301
328
|
async computeMessageHash(message) {
|
|
302
|
-
const msgBytes = new TextEncoder().encode(
|
|
329
|
+
const msgBytes = new TextEncoder().encode(ClusterMember.canonicalJson(message));
|
|
303
330
|
const hashBytes = await sha256.digest(msgBytes);
|
|
304
331
|
return base58btc.encode(hashBytes.digest);
|
|
305
332
|
}
|
|
@@ -327,13 +354,19 @@ export class ClusterMember {
|
|
|
327
354
|
this.currentValidationRecord = undefined;
|
|
328
355
|
}
|
|
329
356
|
}
|
|
357
|
+
/** Deterministic JSON: sorts object keys so hash is order-independent */
|
|
358
|
+
static canonicalJson(value) {
|
|
359
|
+
return JSON.stringify(value, (_, v) => v && typeof v === 'object' && !Array.isArray(v)
|
|
360
|
+
? Object.keys(v).sort().reduce((o, k) => { o[k] = v[k]; return o; }, {})
|
|
361
|
+
: v);
|
|
362
|
+
}
|
|
330
363
|
async computePromiseHash(record) {
|
|
331
|
-
const msgBytes = new TextEncoder().encode(record.messageHash +
|
|
364
|
+
const msgBytes = new TextEncoder().encode(record.messageHash + ClusterMember.canonicalJson(record.message));
|
|
332
365
|
const hashBytes = await sha256.digest(msgBytes);
|
|
333
366
|
return uint8ArrayToString(hashBytes.digest, 'base64url');
|
|
334
367
|
}
|
|
335
368
|
async computeCommitHash(record) {
|
|
336
|
-
const msgBytes = new TextEncoder().encode(record.messageHash +
|
|
369
|
+
const msgBytes = new TextEncoder().encode(record.messageHash + ClusterMember.canonicalJson(record.message) + ClusterMember.canonicalJson(record.promises));
|
|
337
370
|
const hashBytes = await sha256.digest(msgBytes);
|
|
338
371
|
return uint8ArrayToString(hashBytes.digest, 'base64url');
|
|
339
372
|
}
|
|
@@ -351,7 +384,9 @@ export class ClusterMember {
|
|
|
351
384
|
if (!peerInfo?.publicKey?.length) {
|
|
352
385
|
throw new Error(`No public key for peer ${peerId}`);
|
|
353
386
|
}
|
|
354
|
-
|
|
387
|
+
// publicKey is base64url-encoded string (JSON-serialization safe)
|
|
388
|
+
const keyBytes = uint8ArrayFromString(peerInfo.publicKey, 'base64url');
|
|
389
|
+
const pubKey = publicKeyFromRaw(keyBytes);
|
|
355
390
|
const payload = this.computeSigningPayload(hash, signature.type, signature.rejectReason);
|
|
356
391
|
const sigBytes = uint8ArrayFromString(signature.signature, 'base64url');
|
|
357
392
|
return pubKey.verify(payload, sigBytes);
|