@did-btcr2/method 0.18.1 → 0.20.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/browser.js +4917 -6487
- package/dist/browser.mjs +4917 -6487
- package/dist/cjs/core/beacon/aggregation/cohort/index.js +3 -3
- package/dist/cjs/core/beacon/aggregation/cohort/index.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/base.js +1 -9
- package/dist/cjs/core/beacon/aggregation/cohort/messages/base.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/opt-in.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/subscribe.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/keygen/subscribe.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/authorization-request.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/authorization-request.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/request-signature.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/request-signature.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js +2 -1
- package/dist/cjs/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/communication/adapter/nostr.js +36 -18
- package/dist/cjs/core/beacon/aggregation/communication/adapter/nostr.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/coordinator.js +14 -14
- package/dist/cjs/core/beacon/aggregation/coordinator.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/participant.js +4 -3
- package/dist/cjs/core/beacon/aggregation/participant.js.map +1 -1
- package/dist/cjs/core/beacon/aggregation/session/index.js +1 -1
- package/dist/cjs/core/beacon/aggregation/session/index.js.map +1 -1
- package/dist/cjs/core/beacon/beacon.js +25 -0
- package/dist/cjs/core/beacon/beacon.js.map +1 -0
- package/dist/cjs/core/beacon/cas-beacon.js +39 -0
- package/dist/cjs/core/beacon/cas-beacon.js.map +1 -0
- package/dist/cjs/core/beacon/error.js +4 -4
- package/dist/cjs/core/beacon/error.js.map +1 -1
- package/dist/cjs/core/beacon/factory.js +10 -11
- package/dist/cjs/core/beacon/factory.js.map +1 -1
- package/dist/cjs/core/beacon/interfaces.js +2 -0
- package/dist/cjs/core/beacon/interfaces.js.map +1 -0
- package/dist/cjs/core/beacon/signal-discovery.js +183 -0
- package/dist/cjs/core/beacon/signal-discovery.js.map +1 -0
- package/dist/cjs/core/beacon/singleton.js +75 -178
- package/dist/cjs/core/beacon/singleton.js.map +1 -1
- package/dist/cjs/core/beacon/smt-beacon.js +39 -0
- package/dist/cjs/core/beacon/smt-beacon.js.map +1 -0
- package/dist/cjs/core/beacon/utils.js +71 -114
- package/dist/cjs/core/beacon/utils.js.map +1 -1
- package/dist/cjs/core/identifier.js +18 -21
- package/dist/cjs/core/identifier.js.map +1 -1
- package/dist/cjs/core/interfaces.js +2 -0
- package/dist/cjs/core/interfaces.js.map +1 -0
- package/dist/cjs/core/resolve.js +321 -0
- package/dist/cjs/core/resolve.js.map +1 -0
- package/dist/cjs/{utils → core}/types.js.map +1 -1
- package/dist/cjs/core/update.js +113 -0
- package/dist/cjs/core/update.js.map +1 -0
- package/dist/cjs/did-btcr2.js +168 -129
- package/dist/cjs/did-btcr2.js.map +1 -1
- package/dist/cjs/index.js +17 -16
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/appendix.js +16 -33
- package/dist/cjs/utils/appendix.js.map +1 -1
- package/dist/cjs/utils/did-document-builder.js +5 -0
- package/dist/cjs/utils/did-document-builder.js.map +1 -1
- package/dist/cjs/utils/did-document.js +62 -72
- package/dist/cjs/utils/did-document.js.map +1 -1
- package/dist/cjs/utils/general.js +1 -1
- package/dist/cjs/utils/general.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/index.js +3 -3
- package/dist/esm/core/beacon/aggregation/cohort/index.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/base.js +1 -9
- package/dist/esm/core/beacon/aggregation/cohort/messages/base.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js +2 -1
- package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js +36 -18
- package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/coordinator.js +14 -14
- package/dist/esm/core/beacon/aggregation/coordinator.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/participant.js +4 -3
- package/dist/esm/core/beacon/aggregation/participant.js.map +1 -1
- package/dist/esm/core/beacon/aggregation/session/index.js +1 -1
- package/dist/esm/core/beacon/aggregation/session/index.js.map +1 -1
- package/dist/esm/core/beacon/beacon.js +25 -0
- package/dist/esm/core/beacon/beacon.js.map +1 -0
- package/dist/esm/core/beacon/cas-beacon.js +39 -0
- package/dist/esm/core/beacon/cas-beacon.js.map +1 -0
- package/dist/esm/core/beacon/error.js +4 -4
- package/dist/esm/core/beacon/error.js.map +1 -1
- package/dist/esm/core/beacon/factory.js +10 -11
- package/dist/esm/core/beacon/factory.js.map +1 -1
- package/dist/esm/core/beacon/interfaces.js +2 -0
- package/dist/esm/core/beacon/interfaces.js.map +1 -0
- package/dist/esm/core/beacon/signal-discovery.js +183 -0
- package/dist/esm/core/beacon/signal-discovery.js.map +1 -0
- package/dist/esm/core/beacon/singleton.js +75 -178
- package/dist/esm/core/beacon/singleton.js.map +1 -1
- package/dist/esm/core/beacon/smt-beacon.js +39 -0
- package/dist/esm/core/beacon/smt-beacon.js.map +1 -0
- package/dist/esm/core/beacon/utils.js +71 -114
- package/dist/esm/core/beacon/utils.js.map +1 -1
- package/dist/esm/core/identifier.js +18 -21
- package/dist/esm/core/identifier.js.map +1 -1
- package/dist/esm/core/interfaces.js +2 -0
- package/dist/esm/core/interfaces.js.map +1 -0
- package/dist/esm/core/resolve.js +321 -0
- package/dist/esm/core/resolve.js.map +1 -0
- package/dist/esm/{utils → core}/types.js.map +1 -1
- package/dist/esm/core/update.js +113 -0
- package/dist/esm/core/update.js.map +1 -0
- package/dist/esm/did-btcr2.js +168 -129
- package/dist/esm/did-btcr2.js.map +1 -1
- package/dist/esm/index.js +17 -16
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/appendix.js +16 -33
- package/dist/esm/utils/appendix.js.map +1 -1
- package/dist/esm/utils/did-document-builder.js +5 -0
- package/dist/esm/utils/did-document-builder.js.map +1 -1
- package/dist/esm/utils/did-document.js +62 -72
- package/dist/esm/utils/did-document.js.map +1 -1
- package/dist/esm/utils/general.js +1 -1
- package/dist/esm/utils/general.js.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/index.d.ts +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/base.d.ts +0 -7
- package/dist/types/core/beacon/aggregation/cohort/messages/base.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts +13 -5
- package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/coordinator.d.ts +17 -29
- package/dist/types/core/beacon/aggregation/coordinator.d.ts.map +1 -1
- package/dist/types/core/beacon/aggregation/participant.d.ts.map +1 -1
- package/dist/types/core/beacon/beacon.d.ts +44 -0
- package/dist/types/core/beacon/beacon.d.ts.map +1 -0
- package/dist/types/core/beacon/cas-beacon.d.ts +36 -0
- package/dist/types/core/beacon/cas-beacon.d.ts.map +1 -0
- package/dist/types/core/beacon/error.d.ts +2 -2
- package/dist/types/core/beacon/error.d.ts.map +1 -1
- package/dist/types/core/beacon/factory.d.ts +4 -5
- package/dist/types/core/beacon/factory.d.ts.map +1 -1
- package/dist/types/core/beacon/interfaces.d.ts +59 -0
- package/dist/types/core/beacon/interfaces.d.ts.map +1 -0
- package/dist/types/core/beacon/signal-discovery.d.ts +25 -0
- package/dist/types/core/beacon/signal-discovery.d.ts.map +1 -0
- package/dist/types/core/beacon/singleton.d.ts +20 -76
- package/dist/types/core/beacon/singleton.d.ts.map +1 -1
- package/dist/types/core/beacon/smt-beacon.d.ts +36 -0
- package/dist/types/core/beacon/smt-beacon.d.ts.map +1 -0
- package/dist/types/core/beacon/utils.d.ts +19 -97
- package/dist/types/core/beacon/utils.d.ts.map +1 -1
- package/dist/types/core/identifier.d.ts.map +1 -1
- package/dist/types/core/interfaces.d.ts +87 -0
- package/dist/types/core/interfaces.d.ts.map +1 -0
- package/dist/types/core/resolve.d.ts +89 -0
- package/dist/types/core/resolve.d.ts.map +1 -0
- package/dist/types/core/types.d.ts +84 -0
- package/dist/types/core/types.d.ts.map +1 -0
- package/dist/types/core/update.d.ts +51 -0
- package/dist/types/core/update.d.ts.map +1 -0
- package/dist/types/did-btcr2.d.ts +70 -89
- package/dist/types/did-btcr2.d.ts.map +1 -1
- package/dist/types/index.d.ts +17 -16
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utils/appendix.d.ts +5 -10
- package/dist/types/utils/appendix.d.ts.map +1 -1
- package/dist/types/utils/did-document-builder.d.ts +6 -1
- package/dist/types/utils/did-document-builder.d.ts.map +1 -1
- package/dist/types/utils/did-document.d.ts +46 -42
- package/dist/types/utils/did-document.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/core/beacon/aggregation/cohort/index.ts +3 -3
- package/src/core/beacon/aggregation/cohort/messages/base.ts +1 -12
- package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/keygen/subscribe.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/sign/authorization-request.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/sign/request-signature.ts +2 -2
- package/src/core/beacon/aggregation/cohort/messages/sign/signature-authorization.ts +2 -2
- package/src/core/beacon/aggregation/communication/adapter/nostr.ts +43 -21
- package/src/core/beacon/aggregation/coordinator.ts +41 -29
- package/src/core/beacon/aggregation/participant.ts +4 -3
- package/src/core/beacon/aggregation/session/index.ts +1 -1
- package/src/core/beacon/beacon.ts +58 -0
- package/src/core/beacon/cas-beacon.ts +53 -0
- package/src/core/beacon/error.ts +5 -6
- package/src/core/beacon/factory.ts +12 -16
- package/src/core/beacon/interfaces.ts +67 -0
- package/src/core/beacon/signal-discovery.ts +237 -0
- package/src/core/beacon/singleton.ts +107 -197
- package/src/core/beacon/smt-beacon.ts +53 -0
- package/src/core/beacon/utils.ts +95 -182
- package/src/core/identifier.ts +21 -24
- package/src/core/interfaces.ts +93 -0
- package/src/core/resolve.ts +463 -0
- package/src/core/types.ts +95 -0
- package/src/core/update.ts +154 -0
- package/src/did-btcr2.ts +255 -159
- package/src/index.ts +19 -22
- package/src/utils/appendix.ts +26 -44
- package/src/utils/did-document-builder.ts +6 -1
- package/src/utils/did-document.ts +105 -113
- package/src/utils/general.ts +1 -1
- package/dist/cjs/core/beacon/cid-aggregate.js +0 -116
- package/dist/cjs/core/beacon/cid-aggregate.js.map +0 -1
- package/dist/cjs/core/beacon/smt-aggregate.js +0 -126
- package/dist/cjs/core/beacon/smt-aggregate.js.map +0 -1
- package/dist/cjs/core/crud/deactivate.js +0 -14
- package/dist/cjs/core/crud/deactivate.js.map +0 -1
- package/dist/cjs/core/crud/read.js +0 -679
- package/dist/cjs/core/crud/read.js.map +0 -1
- package/dist/cjs/core/crud/update.js +0 -194
- package/dist/cjs/core/crud/update.js.map +0 -1
- package/dist/cjs/interfaces/beacon.js +0 -41
- package/dist/cjs/interfaces/beacon.js.map +0 -1
- package/dist/cjs/interfaces/crud.js +0 -2
- package/dist/cjs/interfaces/crud.js.map +0 -1
- package/dist/esm/core/beacon/cid-aggregate.js +0 -116
- package/dist/esm/core/beacon/cid-aggregate.js.map +0 -1
- package/dist/esm/core/beacon/smt-aggregate.js +0 -126
- package/dist/esm/core/beacon/smt-aggregate.js.map +0 -1
- package/dist/esm/core/crud/deactivate.js +0 -14
- package/dist/esm/core/crud/deactivate.js.map +0 -1
- package/dist/esm/core/crud/read.js +0 -679
- package/dist/esm/core/crud/read.js.map +0 -1
- package/dist/esm/core/crud/update.js +0 -194
- package/dist/esm/core/crud/update.js.map +0 -1
- package/dist/esm/interfaces/beacon.js +0 -41
- package/dist/esm/interfaces/beacon.js.map +0 -1
- package/dist/esm/interfaces/crud.js +0 -2
- package/dist/esm/interfaces/crud.js.map +0 -1
- package/dist/types/core/beacon/cid-aggregate.d.ts +0 -102
- package/dist/types/core/beacon/cid-aggregate.d.ts.map +0 -1
- package/dist/types/core/beacon/smt-aggregate.d.ts +0 -111
- package/dist/types/core/beacon/smt-aggregate.d.ts.map +0 -1
- package/dist/types/core/crud/deactivate.d.ts +0 -13
- package/dist/types/core/crud/deactivate.d.ts.map +0 -1
- package/dist/types/core/crud/read.d.ts +0 -334
- package/dist/types/core/crud/read.d.ts.map +0 -1
- package/dist/types/core/crud/update.d.ts +0 -93
- package/dist/types/core/crud/update.d.ts.map +0 -1
- package/dist/types/interfaces/beacon.d.ts +0 -116
- package/dist/types/interfaces/beacon.d.ts.map +0 -1
- package/dist/types/interfaces/crud.d.ts +0 -32
- package/dist/types/interfaces/crud.d.ts.map +0 -1
- package/dist/types/utils/types.d.ts +0 -38
- package/dist/types/utils/types.d.ts.map +0 -1
- package/src/canonicalize.d.ts +0 -6
- package/src/core/beacon/cid-aggregate.ts +0 -153
- package/src/core/beacon/smt-aggregate.ts +0 -135
- package/src/core/crud/deactivate.ts +0 -13
- package/src/core/crud/read.ts +0 -948
- package/src/core/crud/update.ts +0 -292
- package/src/interfaces/beacon.ts +0 -137
- package/src/interfaces/crud.ts +0 -33
- package/src/utils/types.ts +0 -41
- /package/dist/cjs/{utils → core}/types.js +0 -0
- /package/dist/esm/{utils → core}/types.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cas-beacon.js","sourceRoot":"","sources":["../../../../src/core/beacon/cas-beacon.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;GAKG;AACH,MAAM,OAAO,SAAU,SAAQ,MAAM;IACnC;;;OAGG;IACH,YAAY,OAAsB;QAChC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CACZ,OAA4B,EAC5B,OAAoB;QAEpB,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACtG,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe,CACnB,YAA+B,EAC/B,SAAmB,EACnB,OAAiC;QAEjC,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,wBAAwB,EAAE,EAAC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAC,CAAC,CAAC;IACpH,CAAC;CACF"}
|
|
@@ -24,13 +24,13 @@ export class AggregateBeaconError extends MethodError {
|
|
|
24
24
|
super(message, type, data);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
export class
|
|
28
|
-
constructor(message, type = '
|
|
27
|
+
export class CASBeaconError extends MethodError {
|
|
28
|
+
constructor(message, type = 'CASBeaconError', data) {
|
|
29
29
|
super(message, type, data);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
export class
|
|
33
|
-
constructor(message, type = '
|
|
32
|
+
export class SMTBeaconError extends MethodError {
|
|
33
|
+
constructor(message, type = 'SMTBeaconError', data) {
|
|
34
34
|
super(message, type, data);
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../../src/core/beacon/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C,YAAY,OAAe,EAAE,OAAe,aAAa,EAAE,IAA0B;QACnF,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IACrD,YAAY,OAAe,EAAE,OAAe,wBAAwB,EAAE,IAA0B;QAC9F,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IACrD,YAAY,OAAe,EAAE,OAAe,wBAAwB,EAAE,IAA0B;QAC9F,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../../src/core/beacon/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C,YAAY,OAAe,EAAE,OAAe,aAAa,EAAE,IAA0B;QACnF,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IACrD,YAAY,OAAe,EAAE,OAAe,wBAAwB,EAAE,IAA0B;QAC9F,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IACrD,YAAY,OAAe,EAAE,OAAe,wBAAwB,EAAE,IAA0B;QAC9F,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnD,YAAY,OAAe,EAAE,OAAe,sBAAsB,EAAE,IAA0B;QAC5F,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnD,YAAY,OAAe,EAAE,OAAe,sBAAsB,EAAE,IAA0B;QAC5F,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,EAAE,OAAe,gBAAgB,EAAE,IAA0B;QACtF,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,EAAE,OAAe,gBAAgB,EAAE,IAA0B;QACtF,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MethodError } from '@did-btcr2/common';
|
|
2
|
-
import {
|
|
2
|
+
import { CASBeacon } from './cas-beacon.js';
|
|
3
3
|
import { SingletonBeacon } from './singleton.js';
|
|
4
|
-
import {
|
|
4
|
+
import { SMTBeacon } from './smt-beacon.js';
|
|
5
5
|
/**
|
|
6
6
|
* Beacon Factory pattern to create Beacon instances.
|
|
7
7
|
* @class BeaconFactory
|
|
@@ -10,20 +10,19 @@ import { SMTAggregateBeacon } from './smt-aggregate.js';
|
|
|
10
10
|
export class BeaconFactory {
|
|
11
11
|
/**
|
|
12
12
|
* Establish a Beacon instance based on the provided service and optional sidecar data.
|
|
13
|
-
* @param {BeaconService} service
|
|
14
|
-
* @param {SidecarData} [sidecar] - The optional sidecar data.
|
|
13
|
+
* @param {BeaconService} service The beacon service configuration.
|
|
15
14
|
* @returns {Beacon} The established Beacon instance.
|
|
16
15
|
*/
|
|
17
|
-
static establish(service
|
|
16
|
+
static establish(service) {
|
|
18
17
|
switch (service.type) {
|
|
19
18
|
case 'SingletonBeacon':
|
|
20
|
-
return new SingletonBeacon(service
|
|
21
|
-
case '
|
|
22
|
-
return new
|
|
23
|
-
case '
|
|
24
|
-
return new
|
|
19
|
+
return new SingletonBeacon(service);
|
|
20
|
+
case 'CASBeacon':
|
|
21
|
+
return new CASBeacon(service);
|
|
22
|
+
case 'SMTBeacon':
|
|
23
|
+
return new SMTBeacon(service);
|
|
25
24
|
default:
|
|
26
|
-
throw new MethodError('Invalid Beacon Type', 'INVALID_BEACON_ERROR',
|
|
25
|
+
throw new MethodError('Invalid Beacon Type', 'INVALID_BEACON_ERROR', service);
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../../src/core/beacon/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../../src/core/beacon/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACxB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,OAAsB;QACrC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,iBAAiB;gBACpB,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,KAAK,WAAW;gBACd,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,KAAK,WAAW;gBACd,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC;gBACE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/core/beacon/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { GENESIS_TX_ID, TXIN_WITNESS_COINBASE } from '@did-btcr2/bitcoin';
|
|
2
|
+
import { ResolveError } from '@did-btcr2/common';
|
|
3
|
+
import { BeaconUtils } from './utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Static utility class for discovering Beacon Signals on the Bitcoin blockchain.
|
|
6
|
+
* Extracted from {@link Resolve} for single-responsibility and independent testability.
|
|
7
|
+
*
|
|
8
|
+
* @class BeaconSignalDiscovery
|
|
9
|
+
*/
|
|
10
|
+
export class BeaconSignalDiscovery {
|
|
11
|
+
/**
|
|
12
|
+
* Retrieves the beacon signals for the given array of BeaconService objects
|
|
13
|
+
* using an esplora/electrs REST API connection via a bitcoin I/O driver.
|
|
14
|
+
* @param {Array<BeaconService>} beaconServices Array of BeaconService objects to retrieve signals for
|
|
15
|
+
* @param {BitcoinNetworkConnection} bitcoin Bitcoin network connection to use for REST calls
|
|
16
|
+
* @returns {Promise<Map<BeaconService, Array<BeaconSignal>>>} Map of beacon service to its discovered signals
|
|
17
|
+
*/
|
|
18
|
+
static async indexer(beaconServices, bitcoin) {
|
|
19
|
+
const beaconServiceSignals = new Map();
|
|
20
|
+
// Fetch the current block count once before the loop
|
|
21
|
+
const currentBlockCount = await bitcoin.network.rest.block.count();
|
|
22
|
+
// Iterate over each beacon
|
|
23
|
+
for (const beaconService of beaconServices) {
|
|
24
|
+
beaconServiceSignals.set(beaconService, []);
|
|
25
|
+
// Get the transactions for the beacon address via REST
|
|
26
|
+
const beaconSignals = await bitcoin.network.rest.address.getTxs(beaconService.serviceEndpoint);
|
|
27
|
+
// If no signals are found, continue
|
|
28
|
+
if (!beaconSignals || !beaconSignals.length) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// Iterate over each signal
|
|
32
|
+
for (const beaconSignal of beaconSignals) {
|
|
33
|
+
// Get the last vout in the transaction
|
|
34
|
+
const signalVout = beaconSignal.vout.slice(-1)[0];
|
|
35
|
+
/**
|
|
36
|
+
* Look for OP_RETURN in last vout scriptpubkey_asm
|
|
37
|
+
* Vout (rest) format:
|
|
38
|
+
* {
|
|
39
|
+
* scriptpubkey: '6a20570f177c65e64fb5cf61180b664cdddf09ab76153c2b192e22006e5b22a3917a',
|
|
40
|
+
* scriptpubkey_asm: 'OP_RETURN OP_PUSHBYTES_32 570f177c65e64fb5cf61180b664cdddf09ab76153c2b192e22006e5b22a3917a',
|
|
41
|
+
* scriptpubkey_type: 'op_return',
|
|
42
|
+
* value: 0
|
|
43
|
+
* }
|
|
44
|
+
*/
|
|
45
|
+
if (!signalVout || !signalVout.scriptpubkey_asm.includes('OP_RETURN')) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Construct output map for easier access
|
|
49
|
+
const outputMap = new Map(Object.entries(signalVout));
|
|
50
|
+
// Grab the signal vout scriptpubkey
|
|
51
|
+
const signalVoutScriptPubkey = outputMap.get('scriptpubkey_asm');
|
|
52
|
+
// If the signal vout scriptpubkey does not exist, continue to next signal
|
|
53
|
+
if (!signalVoutScriptPubkey) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Extract hex string hash of the signal bytes from the scriptpubkey
|
|
57
|
+
const updateHash = signalVoutScriptPubkey.split(' ').slice(-1)[0];
|
|
58
|
+
if (!updateHash) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Use the pre-fetched block count instead of calling per-signal
|
|
62
|
+
const confirmations = currentBlockCount - beaconSignal.status.block_height + 1;
|
|
63
|
+
// Push the beacon signal object to the signals array for the beacon service
|
|
64
|
+
beaconServiceSignals.get(beaconService)?.push({
|
|
65
|
+
tx: beaconSignal,
|
|
66
|
+
signalBytes: updateHash,
|
|
67
|
+
blockMetadata: {
|
|
68
|
+
confirmations,
|
|
69
|
+
height: beaconSignal.status.block_height,
|
|
70
|
+
time: beaconSignal.status.block_time,
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return beaconServiceSignals;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Traverse the full blockchain from genesis to chain top looking for beacon signals.
|
|
79
|
+
* @param {Array<BeaconService>} beaconServices Array of BeaconService objects to search for signals.
|
|
80
|
+
* @param {BitcoinNetworkConnection} bitcoin Bitcoin network connection to use for RPC calls.
|
|
81
|
+
* @returns {Promise<Map<BeaconService, Array<BeaconSignal>>>} Map of beacon service to its discovered signals.
|
|
82
|
+
*/
|
|
83
|
+
static async fullnode(beaconServices, bitcoin) {
|
|
84
|
+
const beaconServiceSignals = new Map();
|
|
85
|
+
for (const beaconService of beaconServices) {
|
|
86
|
+
beaconServiceSignals.set(beaconService, []);
|
|
87
|
+
}
|
|
88
|
+
// Get the RPC connection from the bitcoin network
|
|
89
|
+
const rpc = bitcoin.network.rpc;
|
|
90
|
+
// Ensure that the RPC connection is available
|
|
91
|
+
if (!rpc) {
|
|
92
|
+
throw new ResolveError('RPC connection is not available', 'RPC_CONNECTION_ERROR', bitcoin);
|
|
93
|
+
}
|
|
94
|
+
// Get the current block height once before the loop
|
|
95
|
+
const targetHeight = await rpc.getBlockCount();
|
|
96
|
+
// Hoist the beacon services map before the loop
|
|
97
|
+
const beaconServicesMap = BeaconUtils.getBeaconServicesMap(beaconServices);
|
|
98
|
+
// Set genesis height
|
|
99
|
+
let height = 0;
|
|
100
|
+
// Opt into rpc connection to get the block data at the blockhash
|
|
101
|
+
let block = await bitcoin.network.rpc.getBlock({ height });
|
|
102
|
+
console.info(`Searching for beacon signals, please wait ...`);
|
|
103
|
+
while (block.height <= targetHeight) {
|
|
104
|
+
// Iterate over each transaction in the block
|
|
105
|
+
for (const tx of block.tx) {
|
|
106
|
+
// If the txid is a coinbase, continue ...
|
|
107
|
+
if (tx.txid === GENESIS_TX_ID) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// Iterate over each input in the transaction
|
|
111
|
+
for (const vin of tx.vin) {
|
|
112
|
+
// If the vin is a coinbase transaction, continue ...
|
|
113
|
+
if (vin.coinbase) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// If the vin txinwitness contains a coinbase did, continue ...
|
|
117
|
+
if (vin.txinwitness && vin.txinwitness.length === 1 && vin.txinwitness[0] === TXIN_WITNESS_COINBASE) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// If the txid from the vin is undefined, continue ...
|
|
121
|
+
if (!vin.txid) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// If the vout from the vin is undefined, continue ...
|
|
125
|
+
if (vin.vout === undefined) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Get the previous output transaction data
|
|
129
|
+
const prevout = await rpc.getRawTransaction(vin.txid, 2);
|
|
130
|
+
// If the previous output vout at the vin.vout index is undefined, continue ...
|
|
131
|
+
if (!prevout.vout[vin.vout]) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
// Get the address from the scriptPubKey from the prevvout
|
|
135
|
+
const scriptPubKey = prevout.vout[vin.vout].scriptPubKey;
|
|
136
|
+
// If the scriptPubKey.address is undefined, continue ...
|
|
137
|
+
if (!scriptPubKey.address) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
// Use the hoisted beaconServicesMap instead of rebuilding per-vin
|
|
141
|
+
const beaconService = beaconServicesMap.get(scriptPubKey.address);
|
|
142
|
+
if (!beaconService) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
// Look for 'OP_RETURN' in the scriptPubKey asm
|
|
146
|
+
const txVoutScriptPubkeyAsm = prevout.vout[vin.vout].scriptPubKey.asm;
|
|
147
|
+
if (!txVoutScriptPubkeyAsm.includes('OP_RETURN')) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Log the found txid and beacon
|
|
151
|
+
console.info(`Tx ${tx.txid} contains beacon service address ${scriptPubKey.address} and OP_RETURN!`, tx);
|
|
152
|
+
// Extract hex string hash of the signal bytes from the scriptpubkey
|
|
153
|
+
const updateHash = txVoutScriptPubkeyAsm.split(' ').slice(-1)[0];
|
|
154
|
+
if (!updateHash) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Push the beacon signal object to the beacon signals array for that beacon service
|
|
158
|
+
beaconServiceSignals.get(beaconService)?.push({
|
|
159
|
+
tx,
|
|
160
|
+
signalBytes: updateHash,
|
|
161
|
+
blockMetadata: {
|
|
162
|
+
height: block.height,
|
|
163
|
+
time: block.time,
|
|
164
|
+
confirmations: block.confirmations
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
;
|
|
169
|
+
}
|
|
170
|
+
// Increment the height
|
|
171
|
+
height += 1;
|
|
172
|
+
// Use pre-fetched targetHeight instead of calling rpc.getBlockCount() every iteration
|
|
173
|
+
if (height > targetHeight) {
|
|
174
|
+
console.info(`Chain tip reached ${height}, breaking ...`);
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
// Reset the block var to the next block data
|
|
178
|
+
block = await rpc.getBlock({ height });
|
|
179
|
+
}
|
|
180
|
+
return beaconServiceSignals;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=signal-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-discovery.js","sourceRoot":"","sources":["../../../../src/core/beacon/signal-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,219 +1,116 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Kms, Signer } from '@did-btcr2/kms';
|
|
1
|
+
import { INVALID_SIDECAR_DATA, MISSING_UPDATE_DATA } from '@did-btcr2/common';
|
|
2
|
+
import { SchnorrKeyPair } from '@did-btcr2/keypair';
|
|
3
|
+
import { Signer } from '@did-btcr2/kms';
|
|
5
4
|
import { opcodes, Psbt, script } from 'bitcoinjs-lib';
|
|
6
5
|
import { base58btc } from 'multiformats/bases/base58';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
const bitcoin = new BitcoinNetworkConnection();
|
|
6
|
+
import { canonicalization } from '../../did-btcr2.js';
|
|
7
|
+
import { Beacon } from './beacon.js';
|
|
8
|
+
import { SingletonBeaconError } from './error.js';
|
|
11
9
|
/**
|
|
12
|
-
* Implements {@link https://dcdpr.github.io/did-btcr2
|
|
13
|
-
*
|
|
14
|
-
* A Singleton Beacon enables a single entity to independently post a DID Update Payload in a Beacon Signal. Its is a
|
|
15
|
-
* Beacon that can be used to publish a single DID Update Payload targeting a single DID document. The serviceEndpoint
|
|
16
|
-
* for this Beacon Type is a Bitcoin address represented as a URI following the BIP21 scheme. It is recommended that
|
|
17
|
-
* this Bitcoin address be under the sole control of the DID controller. How the Bitcoin address and the cryptographic
|
|
18
|
-
* material that controls it are generated is left to the implementation.
|
|
19
|
-
*
|
|
10
|
+
* Implements {@link https://dcdpr.github.io/did-btcr2/terminology.html#singleton-beacon | Singleton Beacon}.
|
|
20
11
|
* @class SingletonBeacon
|
|
21
12
|
* @type {SingletonBeacon}
|
|
22
|
-
* @extends {
|
|
13
|
+
* @extends {AggregateBeacon}
|
|
23
14
|
*/
|
|
24
15
|
export class SingletonBeacon extends Beacon {
|
|
25
16
|
/**
|
|
26
17
|
* Creates an instance of SingletonBeacon.
|
|
27
|
-
* @param {BeaconService} service The
|
|
28
|
-
* @param {?BeaconSidecarData} [sidecar] Optional sidecar data.
|
|
29
|
-
*/
|
|
30
|
-
constructor(service, sidecar) {
|
|
31
|
-
super({ ...service, type: 'SingletonBeacon' }, sidecar);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Get the Beacon service.
|
|
35
|
-
* @readonly
|
|
36
|
-
* @type {BeaconService} The Beacon service.
|
|
37
|
-
*/
|
|
38
|
-
get service() {
|
|
39
|
-
return {
|
|
40
|
-
type: this.type,
|
|
41
|
-
id: this.id,
|
|
42
|
-
serviceEndpoint: this.serviceEndpoint
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Implements {@link https://dcdpr.github.io/did-btcr2/#establish-singleton-beacon | 5.1.1 Establish Singleton Beacon}.
|
|
18
|
+
* @param {BeaconService} service The BeaconService object representing the funded beacon to announce the update to.
|
|
47
19
|
*
|
|
48
|
-
* Static, convenience method for establishing a Beacon object.
|
|
49
|
-
*
|
|
50
|
-
* A Singleton Beacon is a Beacon that can be used to publish a single DID Update Payload targeting a single DID
|
|
51
|
-
* document. The serviceEndpoint for this Beacon Type is a Bitcoin address represented as a URI following the BIP21
|
|
52
|
-
* scheme. It is RECOMMENDED that this Bitcoin address be under the sole control of the DID controller. How the
|
|
53
|
-
* Bitcoin address and the cryptographic material that controls it are generated is left to the implementation.
|
|
54
|
-
* The Establish Singleton Beacon algorithm takes in a Bitcoin address and a serviceId and returns a Singleton Beacon service.
|
|
55
|
-
* It returns a SignletonBeacon object with the given id, type, and serviceEndpoint.
|
|
56
|
-
*
|
|
57
|
-
* @param {string} service The Beacon service.
|
|
58
|
-
* @param {BeaconSidecarData<SingletonSidecar>} sidecar The sidecar data.
|
|
59
|
-
* @returns {SingletonBeacon} The Singleton Beacon.
|
|
60
20
|
*/
|
|
61
|
-
|
|
62
|
-
|
|
21
|
+
constructor(service) {
|
|
22
|
+
super({ ...service, type: 'SingletonBeacon' });
|
|
63
23
|
}
|
|
64
24
|
/**
|
|
65
|
-
*
|
|
66
|
-
* @
|
|
67
|
-
* @
|
|
68
|
-
* @throws {MethodError} if the signal is invalid.
|
|
25
|
+
* Processes an array of Beacon Signals associated with a Singleton Beacon Service.
|
|
26
|
+
* @returns {Promise<SignedBTCR2Update | undefined>} The DID Update payload announced by the Beacon Signal.
|
|
27
|
+
* @throws {SingletonBeaconError} if the signalTx is invalid or the signalSidecarData is invalid.
|
|
69
28
|
*/
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
* It returns the DID Update payload announced by the Beacon Signal or throws an error.
|
|
83
|
-
*
|
|
84
|
-
* @param {RawTransactionV2} signal Bitcoin transaction representing a Beacon Signal.
|
|
85
|
-
* @param {SignalsMetadata} signalsMetadata: SignalsMetadata Optional sidecar data for the Beacon Signal.
|
|
86
|
-
* @returns {Promise<DidUpdatePayload | undefined>} The DID Update payload announced by the Beacon Signal.
|
|
87
|
-
* @throws {DidError} if the signalTx is invalid or the signalSidecarData is invalid.
|
|
88
|
-
*/
|
|
89
|
-
async processSignal(signal, signalsMetadata) {
|
|
90
|
-
// 1. Initialize a txOut variable to the 0th transaction output of the tx.
|
|
91
|
-
const output = signal.vout.filter((vout) => (vout['scriptpubkey_asm'] || vout['scriptPubKey'].asm).includes('OP_RETURN'))?.[0];
|
|
92
|
-
if (!output) {
|
|
93
|
-
throw new SingletonBeaconError('No OP_RETURN output found in transaction outputs.', 'NO_OP_RETURN', { signal });
|
|
94
|
-
}
|
|
95
|
-
const outputMap = new Map(Object.entries(output));
|
|
96
|
-
// 2. Set didUpdatePayload to null.
|
|
97
|
-
let didUpdatePayload = undefined;
|
|
98
|
-
// 3. Check txout is of the format [OP_RETURN, OP_PUSH32, <32bytes>], if not, then return didUpdatePayload.
|
|
99
|
-
// The Bitcoin transaction is not a Beacon Signal.
|
|
100
|
-
const UPDATE_PAYLOAD_HASH = (outputMap.get('scriptpubkey_asm') ?? outputMap.get('scriptPubKey').asm).split(' ').last();
|
|
101
|
-
if (!UPDATE_PAYLOAD_HASH) {
|
|
102
|
-
return undefined;
|
|
103
|
-
}
|
|
104
|
-
// 4. Set hashBytes to the 32 bytes in the txout.
|
|
105
|
-
const hashBytes = JSON.canonicalization.encode(Buffer.fromHex(UPDATE_PAYLOAD_HASH), 'base58');
|
|
106
|
-
// Convert signalsMetadata to a Map for easier access
|
|
107
|
-
const signalsMetadataMap = new Map(Object.entries(signalsMetadata));
|
|
108
|
-
// 5. If signalsMetadata:
|
|
109
|
-
if (signalsMetadata) {
|
|
110
|
-
// 5.1 Set didUpdatePayload to signalsMetadata.updatePayload
|
|
111
|
-
didUpdatePayload = signalsMetadataMap.get(signal.txid)?.didUpdate;
|
|
112
|
-
if (!didUpdatePayload) {
|
|
113
|
-
throw new SingletonBeaconError('Update Payload not found in signal metadata.', 'PROCESS_SIGNAL_ERROR');
|
|
29
|
+
async processSignals(signals, sidecar) {
|
|
30
|
+
// Initialize an empty array to hold the BTCR2 signed updates
|
|
31
|
+
const updates = new Array();
|
|
32
|
+
// Loop through each signal in signals
|
|
33
|
+
for (const signal of signals) {
|
|
34
|
+
// Grab the beacon signal bytes hash from the signal
|
|
35
|
+
const updateHash = signal.signalBytes;
|
|
36
|
+
// Use the updateHash as the sidecar data lookup key to retrieve the btcr2 update
|
|
37
|
+
const signedUpdate = sidecar.updateMap.get(updateHash);
|
|
38
|
+
// If no btcr2 update is found in sidecar data maps, throw missingUpdateData error.
|
|
39
|
+
if (!signedUpdate) {
|
|
40
|
+
throw new SingletonBeaconError(`BTCR2 Signed Update not found for update hash ${updateHash}.`, MISSING_UPDATE_DATA, signal);
|
|
114
41
|
}
|
|
115
|
-
//
|
|
116
|
-
const
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
42
|
+
// Canonicalize, hash and encode to base58 the signed update object found in sidecar or CAS
|
|
43
|
+
const encodedUpdate = canonicalization.process(signedUpdate, { encoding: 'base58' });
|
|
44
|
+
// Encode the signal bytes hex string to base58
|
|
45
|
+
const signalBytes = base58btc.encode(Buffer.from(updateHash, 'hex'));
|
|
46
|
+
// Check for mismatch between found sidecar/cas update hash and onchain beacon signal hash
|
|
47
|
+
if (encodedUpdate !== signalBytes) {
|
|
48
|
+
// If mismatch, throw invalidSidecarData error.
|
|
49
|
+
throw new SingletonBeaconError(`Hash mismatch: sidecar update ${encodedUpdate} !== signal bytes ${signalBytes}.`, INVALID_SIDECAR_DATA, { encodedUpdate, signalBytes });
|
|
120
50
|
}
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
// 6. Else:
|
|
125
|
-
// 6.1 Set didUpdatePayload to the result of passing hashBytes into the Fetch Content from Addressable Storage algorithm.
|
|
126
|
-
const didUpdatePayloadString = await Appendix.fetchFromCas(base58btc.decode(hashBytes));
|
|
127
|
-
if (!didUpdatePayloadString || !JSON.parse(didUpdatePayloadString)) {
|
|
128
|
-
throw new SingletonBeaconError('Update payload not found in addressable storage.', INVALID_SIDECAR_DATA);
|
|
129
|
-
}
|
|
130
|
-
didUpdatePayload = JSON.parse(didUpdatePayloadString);
|
|
131
|
-
// 6.2 If didUpdatePayload is null, MUST raise a latePublishingError. MAY identify Beacon Signal to resolver and request additional Sidecar data be provided.
|
|
132
|
-
if (!didUpdatePayload) {
|
|
133
|
-
throw new SingletonBeaconError('Update payload hash does not match transaction hash.', LATE_PUBLISHING_ERROR);
|
|
51
|
+
// Push signedUpdate to updates array
|
|
52
|
+
updates.push([signedUpdate, signal.blockMetadata]);
|
|
134
53
|
}
|
|
135
|
-
//
|
|
136
|
-
return
|
|
54
|
+
// Return the array of signed updates
|
|
55
|
+
return updates;
|
|
137
56
|
}
|
|
138
57
|
/**
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* identified in the service and contains a transaction output of the format [OP_RETURN, OP_PUSH32, <hashBytes>],
|
|
145
|
-
* where hashBytes is the SHA256 hash of the canonical didUpdatePayload. The Bitcoin transaction is then signed and
|
|
146
|
-
* broadcast to the Bitcoin network, thereby publicly announcing a DID update in a Beacon Signal. It returns a
|
|
147
|
-
* signalMetadata object mapping the Bitcoin transaction identifier of the Beacon Signal to the necessary data needed
|
|
148
|
-
* to verify the signal announces a specific DID Update Payload.
|
|
149
|
-
*
|
|
150
|
-
* TODO: Design and implement a way to construct, sign and send via RPC
|
|
151
|
-
*
|
|
152
|
-
* @param {DidUpdatePayload} didUpdatePayload The verificationMethod object to be used for signing.
|
|
153
|
-
* @returns {SignedRawTx} Successful output of a bitcoin transaction.
|
|
58
|
+
* Broadcasts a SingletonBeacon signal to the Bitcoin network.
|
|
59
|
+
* @param {SignedBTCR2Update} signedUpdate The signed BTCR2 update to broadcast.
|
|
60
|
+
* @param {KeyBytes} secretKey The secret key for signing the Bitcoin transaction.
|
|
61
|
+
* @param {BitcoinNetworkConnection} bitcoin The Bitcoin network connection.
|
|
62
|
+
* @returns {Promise<SignedBTCR2Update>} The signed update that was broadcast.
|
|
154
63
|
* @throws {SingletonBeaconError} if the bitcoin address is invalid or unfunded.
|
|
155
64
|
*/
|
|
156
|
-
async broadcastSignal(
|
|
157
|
-
//
|
|
158
|
-
// 2. Set bitcoinAddress to the decoding of addressURI following BIP21.
|
|
65
|
+
async broadcastSignal(signedUpdate, secretKey, bitcoin) {
|
|
66
|
+
// Convert the serviceEndpoint to a bitcoin address by removing the 'bitcoin:' prefix
|
|
159
67
|
const bitcoinAddress = this.service.serviceEndpoint.replace('bitcoin:', '');
|
|
160
|
-
//
|
|
161
|
-
// let inputs: Array<CreateRawTxInputs> = [];
|
|
68
|
+
// Query the Bitcoin network for UTXOs associated with the bitcoinAddress
|
|
162
69
|
const utxos = await bitcoin.network.rest.address.getUtxos(bitcoinAddress);
|
|
70
|
+
// If no utxos are found, throw an error indicating the address is unfunded.
|
|
163
71
|
if (!utxos.length) {
|
|
164
|
-
// TODO: Discuss what to do here because sending to a beacon address does not allow you to spend from it immediately.
|
|
165
72
|
throw new SingletonBeaconError('No UTXOs found, please fund address!', 'UNFUNDED_BEACON_ADDRESS', { bitcoinAddress });
|
|
166
73
|
}
|
|
167
|
-
|
|
74
|
+
// Sort utxos by block height and take the most recent one
|
|
75
|
+
const utxo = utxos.sort((a, b) => b.status.block_height - a.status.block_height).shift();
|
|
76
|
+
// If no utxos are found, throw an error.
|
|
168
77
|
if (!utxo) {
|
|
169
78
|
throw new SingletonBeaconError('Beacon bitcoin address unfunded or utxos unconfirmed.', 'UNFUNDED_BEACON_ADDRESS', { bitcoinAddress });
|
|
170
79
|
}
|
|
171
|
-
//
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
//
|
|
176
|
-
// contains at least one transaction output. This output MUST have the following format
|
|
177
|
-
// [OP_RETURN, OP_PUSH32, hashBytes]
|
|
178
|
-
const { txid, vout } = utxo;
|
|
179
|
-
const prevTx = await bitcoin.network.rest.transaction.getHex(txid);
|
|
180
|
-
const input = {
|
|
181
|
-
hash: txid,
|
|
182
|
-
index: vout,
|
|
183
|
-
nonWitnessUtxo: Buffer.fromHex(prevTx)
|
|
184
|
-
};
|
|
185
|
-
// TODO: Figure out a good way to estimate fees
|
|
80
|
+
// Get the previous tx to the utxo being spent
|
|
81
|
+
const prevTx = await bitcoin.network.rest.transaction.getHex(utxo.txid);
|
|
82
|
+
// Canonicalize and hash the signed update for OP_RETURN output
|
|
83
|
+
const updateHash = canonicalization.canonicalhash(signedUpdate);
|
|
84
|
+
// Construct a spend transaction
|
|
186
85
|
const spendTx = new Psbt({ network: bitcoin.network.data })
|
|
187
|
-
|
|
86
|
+
// Spend tx contains the utxo as its input
|
|
87
|
+
.addInput({
|
|
88
|
+
hash: utxo.txid,
|
|
89
|
+
index: utxo.vout,
|
|
90
|
+
nonWitnessUtxo: Buffer.from(prevTx, 'hex')
|
|
91
|
+
})
|
|
92
|
+
// Add a change output minus a fee of 500 sats
|
|
93
|
+
// TODO: calculate fee based on transaction vsize and current fee rates
|
|
188
94
|
.addOutput({ address: bitcoinAddress, value: BigInt(utxo.value) - BigInt(500) })
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
//
|
|
192
|
-
const
|
|
193
|
-
const keyUri = new CompressedSecp256k1PublicKey(components.genesisBytes).hex;
|
|
194
|
-
const keyPair = Kms.getKey(keyUri);
|
|
95
|
+
// Add an OP_RETURN output containing the update hash
|
|
96
|
+
.addOutput({ script: script.compile([opcodes.OP_RETURN, updateHash]), value: 0n });
|
|
97
|
+
// Construct a Schnorr key pair from the secret key
|
|
98
|
+
const keyPair = SchnorrKeyPair.fromSecret(secretKey);
|
|
195
99
|
if (!keyPair) {
|
|
196
|
-
throw new
|
|
100
|
+
throw new SingletonBeaconError('Key pair not found.', 'KEY_PAIR_NOT_FOUND', { secretKey });
|
|
197
101
|
}
|
|
102
|
+
// Construct a signer object from the key pair and bitcoin network
|
|
198
103
|
const signer = new Signer({ keyPair, network: bitcoin.network.name });
|
|
199
|
-
//
|
|
104
|
+
// Sign 0th input, finalize extract to hex in prep for broadcast
|
|
200
105
|
const signedTx = spendTx.signInput(0, signer)
|
|
201
106
|
.finalizeAllInputs()
|
|
202
107
|
.extractTransaction()
|
|
203
108
|
.toHex();
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
if (!spentTx) {
|
|
210
|
-
throw new SingletonBeaconError('Failed to send raw transaction.', 'SEND_FAILED', { spentTx });
|
|
211
|
-
}
|
|
212
|
-
// 9. Set signalId to the Bitcoin transaction identifier of spendTx.
|
|
213
|
-
// 10. Initialize signalMetadata to an empty object.
|
|
214
|
-
// 11. Set signalMetadata.updatePayload to didUpdatePayload.
|
|
215
|
-
// 12. Return the object {<signalId>: { updatePayload: DidUpdatePayload; proofs?: any; }}.
|
|
216
|
-
return { [spentTx]: { didUpdate: didUpdatePayload } };
|
|
109
|
+
// Broadcast spendTx to the Bitcoin network.
|
|
110
|
+
const txid = await bitcoin.network.rest.transaction.send(signedTx);
|
|
111
|
+
console.info(`Broadcasted Singleton Beacon signal with txid ${txid}`);
|
|
112
|
+
// Return the signed update
|
|
113
|
+
return signedUpdate;
|
|
217
114
|
}
|
|
218
115
|
}
|
|
219
116
|
//# sourceMappingURL=singleton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../../../src/core/beacon/singleton.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../../../src/core/beacon/singleton.ts"],"names":[],"mappings":"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"}
|