@pinionengineering/prover-client 0.1.0 → 0.3.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/README.md +19 -6
- package/dist/challenge.d.ts +20 -1
- package/dist/challenge.d.ts.map +1 -1
- package/dist/challenge.js +29 -1
- package/dist/challenge.js.map +1 -1
- package/dist/client.d.ts +18 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +35 -15
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +43 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -181,17 +181,24 @@ Deletes a key and all associated tags.
|
|
|
181
181
|
#### `client.tag(root, keyId)` → `TagResponse`
|
|
182
182
|
|
|
183
183
|
```typescript
|
|
184
|
-
const { block_ids } = await client.tag(cid, keyId);
|
|
185
|
-
//
|
|
184
|
+
const { block_ids, block_count } = await client.tag(cid, keyId);
|
|
185
|
+
// Exactly one is populated, depending on the key's protocol:
|
|
186
|
+
// block_ids: string[] — base64(CID.Bytes()) for every block, non-chunked
|
|
187
|
+
// protocols only (Ateniese, Erway, BJO), in TagList order
|
|
188
|
+
// block_count: number — super-block count, chunked protocols only
|
|
189
|
+
// (SW-Priv, SW-Pub) — no per-block manifest is sent at all
|
|
186
190
|
```
|
|
187
191
|
|
|
188
192
|
Instructs the server to walk the IPFS DAG for `root`, compute per-block
|
|
189
193
|
authentication tags, and store them under `keyId`. The CID must be in the
|
|
190
194
|
`"pinned"` lifecycle state for the authenticated account.
|
|
191
195
|
|
|
192
|
-
`block_ids` is the full list of blocks for this
|
|
193
|
-
and server will use when ranking against a
|
|
194
|
-
|
|
196
|
+
For non-chunked protocols, `block_ids` is the full list of blocks for this
|
|
197
|
+
root in the order both client and server will use when ranking against a
|
|
198
|
+
challenge seed. For chunked protocols, `block_count` is all the client needs
|
|
199
|
+
— challenge ids are synthesized locally via `superBlockId(rootBytes, i)` for
|
|
200
|
+
`i` in `[0, block_count)`. Call `getSetup()` after tagging to get the
|
|
201
|
+
combined list/count across all roots.
|
|
195
202
|
|
|
196
203
|
#### `client.getSetup(keyId)` → `ParsedSetup`
|
|
197
204
|
|
|
@@ -200,10 +207,16 @@ Fetches the complete setup document for a key.
|
|
|
200
207
|
```typescript
|
|
201
208
|
const setup = await client.getSetup(keyId);
|
|
202
209
|
// setup.clientSetup WireClientSetup — public key material
|
|
203
|
-
// setup.roots [{ root: string, blockIds: Uint8Array[] }, ...]
|
|
210
|
+
// setup.roots [{ root: string, blockIds: Uint8Array[], chunked: boolean }, ...]
|
|
204
211
|
// setup.totalBlocks total block count across all roots
|
|
205
212
|
```
|
|
206
213
|
|
|
214
|
+
`blockIds` is always ready to pass to `buildChallenge()`/`verifyProof()`
|
|
215
|
+
regardless of protocol. `chunked` tells you whether those ids are real
|
|
216
|
+
per-block CIDs (`false`) or synthesized super-block ids (`true`) — only
|
|
217
|
+
relevant if you need to re-derive or re-export ids yourself; synthesized ids
|
|
218
|
+
are not valid CIDs and must never be round-tripped through `CID.decode()`.
|
|
219
|
+
|
|
207
220
|
Call this once after tagging. Re-call whenever you add or remove roots.
|
|
208
221
|
Pass the returned `ParsedSetup` directly to `audit()` — it does not fetch
|
|
209
222
|
the setup for you.
|
package/dist/challenge.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Challenge construction and deterministic derivation.
|
|
3
3
|
*
|
|
4
|
-
* Ports
|
|
4
|
+
* Ports three Go functions exactly:
|
|
5
5
|
*
|
|
6
6
|
* DeriveChallenge() storage-proofs/line/chalderive.go
|
|
7
7
|
* blockHashG1() storage-proofs/por/sw/pub.go
|
|
8
|
+
* SuperBlockID() ipfs-storage-proofs/superblock.go
|
|
8
9
|
*
|
|
9
10
|
* Any deviation from these implementations will produce challenges or
|
|
10
11
|
* verification paths that disagree with the server.
|
|
@@ -48,6 +49,24 @@ export declare function deriveIndicesAndCoeffs(seed: Uint8Array, ids: Uint8Array
|
|
|
48
49
|
indices: number[];
|
|
49
50
|
coeffs: bigint[];
|
|
50
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* Build a challenge id for one super-block of a chunked protocol's root.
|
|
54
|
+
*
|
|
55
|
+
* Exact port of SuperBlockID() in ipfs-storage-proofs/superblock.go:
|
|
56
|
+
* id = rootCID.Bytes() || BigEndian(localIndex as uint64, 8 bytes)
|
|
57
|
+
*
|
|
58
|
+
* Only the root's own CID bytes are used — never a content-block CID or byte
|
|
59
|
+
* offset — because the server maps (rootCID, localIndex) back to real bytes
|
|
60
|
+
* purely through its own local manifest, never over the wire. Both sides only
|
|
61
|
+
* need to agree on `rootBytes` (the client already knows the root it's
|
|
62
|
+
* auditing) and `localIndex` (chosen independently from block_count), so no
|
|
63
|
+
* per-block manifest is required for chunked protocols at all.
|
|
64
|
+
*
|
|
65
|
+
* @param rootBytes CID.parse(root).bytes for the root being audited.
|
|
66
|
+
* @param localIndex Index in [0, block_count) — must fit in a uint64 (Number
|
|
67
|
+
* is safe here since block counts never approach 2^53).
|
|
68
|
+
*/
|
|
69
|
+
export declare function superBlockId(rootBytes: Uint8Array, localIndex: number): Uint8Array;
|
|
51
70
|
/**
|
|
52
71
|
* H(λ‖id) = HashToG1(λ‖id) using RFC 9380 SVDW.
|
|
53
72
|
*
|
package/dist/challenge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../src/challenge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../src/challenge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,WAAW,iFACwD,CAAC;AAMjF,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIvD;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAKrD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CASjF;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,UAAU,EAAE,EACjB,CAAC,EAAE,MAAM,GACR;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAoBzC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAMlF;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAKrE"}
|
package/dist/challenge.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Challenge construction and deterministic derivation.
|
|
3
3
|
*
|
|
4
|
-
* Ports
|
|
4
|
+
* Ports three Go functions exactly:
|
|
5
5
|
*
|
|
6
6
|
* DeriveChallenge() storage-proofs/line/chalderive.go
|
|
7
7
|
* blockHashG1() storage-proofs/por/sw/pub.go
|
|
8
|
+
* SuperBlockID() ipfs-storage-proofs/superblock.go
|
|
8
9
|
*
|
|
9
10
|
* Any deviation from these implementations will produce challenges or
|
|
10
11
|
* verification paths that disagree with the server.
|
|
@@ -94,6 +95,33 @@ export function deriveIndicesAndCoeffs(seed, ids, c) {
|
|
|
94
95
|
return { indices, coeffs };
|
|
95
96
|
}
|
|
96
97
|
// ---------------------------------------------------------------------------
|
|
98
|
+
// Super-block id construction (chunked protocols: SW-Priv, SW-Pub)
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
/**
|
|
101
|
+
* Build a challenge id for one super-block of a chunked protocol's root.
|
|
102
|
+
*
|
|
103
|
+
* Exact port of SuperBlockID() in ipfs-storage-proofs/superblock.go:
|
|
104
|
+
* id = rootCID.Bytes() || BigEndian(localIndex as uint64, 8 bytes)
|
|
105
|
+
*
|
|
106
|
+
* Only the root's own CID bytes are used — never a content-block CID or byte
|
|
107
|
+
* offset — because the server maps (rootCID, localIndex) back to real bytes
|
|
108
|
+
* purely through its own local manifest, never over the wire. Both sides only
|
|
109
|
+
* need to agree on `rootBytes` (the client already knows the root it's
|
|
110
|
+
* auditing) and `localIndex` (chosen independently from block_count), so no
|
|
111
|
+
* per-block manifest is required for chunked protocols at all.
|
|
112
|
+
*
|
|
113
|
+
* @param rootBytes CID.parse(root).bytes for the root being audited.
|
|
114
|
+
* @param localIndex Index in [0, block_count) — must fit in a uint64 (Number
|
|
115
|
+
* is safe here since block counts never approach 2^53).
|
|
116
|
+
*/
|
|
117
|
+
export function superBlockId(rootBytes, localIndex) {
|
|
118
|
+
const id = new Uint8Array(rootBytes.length + 8);
|
|
119
|
+
id.set(rootBytes);
|
|
120
|
+
const view = new DataView(id.buffer, id.byteOffset + rootBytes.length, 8);
|
|
121
|
+
view.setBigUint64(0, BigInt(localIndex), false); // false = big-endian
|
|
122
|
+
return id;
|
|
123
|
+
}
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
97
125
|
// Hash-to-G1
|
|
98
126
|
// ---------------------------------------------------------------------------
|
|
99
127
|
/**
|
package/dist/challenge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"challenge.js","sourceRoot":"","sources":["../src/challenge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"challenge.js","sourceRoot":"","sources":["../src/challenge.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -53,8 +53,10 @@ export declare class PinionProverClient {
|
|
|
53
53
|
createKey(): Promise<CreateKeyResult>;
|
|
54
54
|
deleteKey(keyId: string): Promise<void>;
|
|
55
55
|
/**
|
|
56
|
-
* Fetch the setup document for a key: public key material and
|
|
57
|
-
*
|
|
56
|
+
* Fetch the setup document for a key: public key material and, per
|
|
57
|
+
* registered root, either the block ID list (non-chunked protocols) or the
|
|
58
|
+
* super-block count (chunked protocols: SW-Priv, SW-Pub) — parseSetupResponse
|
|
59
|
+
* turns either into a uniform ParsedRoot.blockIds array.
|
|
58
60
|
*
|
|
59
61
|
* Call this once after tagging to obtain the ParsedSetup needed for auditing.
|
|
60
62
|
* Re-call whenever you add or remove roots.
|
|
@@ -76,11 +78,12 @@ export declare class PinionProverClient {
|
|
|
76
78
|
* Returns the raw proof bytes. Most callers should use audit() instead,
|
|
77
79
|
* which also cryptographically verifies the response.
|
|
78
80
|
*
|
|
79
|
-
* @param keyId
|
|
80
|
-
* @param roots
|
|
81
|
-
* @param challenge
|
|
81
|
+
* @param keyId Challenge key ID.
|
|
82
|
+
* @param roots CID strings to prove, in the same order as the challenge.
|
|
83
|
+
* @param challenge base64(JSON(WireChallenge)) from buildChallenge().
|
|
84
|
+
* @param challengeId Optional idempotency key echoed back in the response.
|
|
82
85
|
*/
|
|
83
|
-
prove(keyId: string, roots: string[], challenge: string): Promise<Uint8Array>;
|
|
86
|
+
prove(keyId: string, roots: string[], challenge: string, challengeId?: string): Promise<Uint8Array>;
|
|
84
87
|
/**
|
|
85
88
|
* Run one audit round against a pre-fetched setup.
|
|
86
89
|
*
|
|
@@ -125,8 +128,15 @@ export declare class PinNotActiveError extends Error {
|
|
|
125
128
|
}
|
|
126
129
|
/**
|
|
127
130
|
* Decode a raw /setup response into a ParsedSetup.
|
|
128
|
-
*
|
|
129
|
-
*
|
|
131
|
+
*
|
|
132
|
+
* The client_setup field is base64(JSON(WireClientSetup)). Each root is
|
|
133
|
+
* either:
|
|
134
|
+
* - non-chunked (Ateniese/Erway/BJO): roots[].block_ids are CID strings,
|
|
135
|
+
* decoded to raw CID bytes (Uint8Array) via multiformats/cid.
|
|
136
|
+
* - chunked (SW-Priv/SW-Pub): roots[].block_count is a super-block count;
|
|
137
|
+
* ids are synthesized locally as superBlockId(rootBytes, i) for i in
|
|
138
|
+
* [0, block_count) — see superBlockId()'s doc comment in challenge.ts for
|
|
139
|
+
* why no per-block manifest is needed for these protocols.
|
|
130
140
|
*/
|
|
131
141
|
export declare function parseSetupResponse(raw: RawSetupResponse): ParsedSetup;
|
|
132
142
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAEhB,eAAe,EACf,WAAW,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAEhB,eAAe,EACf,WAAW,EAGX,gBAAgB,EAChB,WAAW,EAEZ,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACrD;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;gBAExD,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,yBAA8B;IAS9D,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI7C;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAUrC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C;;;;;;;;OAQG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOnD;;;;;;;OAOG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAItD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;;;;;;OAUG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBzG;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;YAkClF,GAAG;YAQH,IAAI;YAWJ,UAAU;YAQV,WAAW;YAKX,SAAS;CAIxB;AAMD,qBAAa,WAAY,SAAQ,KAAK;aAElB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aACd,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAIxC;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,WAAW,CAmBrE"}
|
package/dist/client.js
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* Pass the full base URL including the path prefix, e.g.:
|
|
9
9
|
* new PinionProverClient("https://hydrogen.pinion.build/prover", { getToken })
|
|
10
10
|
*/
|
|
11
|
-
import { buildChallenge, base64ToBytes } from './challenge.js';
|
|
11
|
+
import { buildChallenge, base64ToBytes, superBlockId } from './challenge.js';
|
|
12
12
|
import { verifyProof, parseClientSetup } from './verify.js';
|
|
13
|
+
import { CID } from 'multiformats/cid';
|
|
13
14
|
export class PinionProverClient {
|
|
14
15
|
baseUrl;
|
|
15
16
|
getToken;
|
|
@@ -47,8 +48,10 @@ export class PinionProverClient {
|
|
|
47
48
|
// Setup phase
|
|
48
49
|
// ---------------------------------------------------------------------------
|
|
49
50
|
/**
|
|
50
|
-
* Fetch the setup document for a key: public key material and
|
|
51
|
-
*
|
|
51
|
+
* Fetch the setup document for a key: public key material and, per
|
|
52
|
+
* registered root, either the block ID list (non-chunked protocols) or the
|
|
53
|
+
* super-block count (chunked protocols: SW-Priv, SW-Pub) — parseSetupResponse
|
|
54
|
+
* turns either into a uniform ParsedRoot.blockIds array.
|
|
52
55
|
*
|
|
53
56
|
* Call this once after tagging to obtain the ParsedSetup needed for auditing.
|
|
54
57
|
* Re-call whenever you add or remove roots.
|
|
@@ -80,15 +83,16 @@ export class PinionProverClient {
|
|
|
80
83
|
* Returns the raw proof bytes. Most callers should use audit() instead,
|
|
81
84
|
* which also cryptographically verifies the response.
|
|
82
85
|
*
|
|
83
|
-
* @param keyId
|
|
84
|
-
* @param roots
|
|
85
|
-
* @param challenge
|
|
86
|
+
* @param keyId Challenge key ID.
|
|
87
|
+
* @param roots CID strings to prove, in the same order as the challenge.
|
|
88
|
+
* @param challenge base64(JSON(WireChallenge)) from buildChallenge().
|
|
89
|
+
* @param challengeId Optional idempotency key echoed back in the response.
|
|
86
90
|
*/
|
|
87
|
-
async prove(keyId, roots, challenge) {
|
|
91
|
+
async prove(keyId, roots, challenge, challengeId) {
|
|
88
92
|
const resp = await fetch(`${this.baseUrl}/prove`, {
|
|
89
93
|
method: 'POST',
|
|
90
94
|
headers: { 'Content-Type': 'application/json' },
|
|
91
|
-
body: JSON.stringify({ key_id: keyId, roots, challenge }),
|
|
95
|
+
body: JSON.stringify({ key_id: keyId, roots, challenge, challenge_id: challengeId ?? '' }),
|
|
92
96
|
});
|
|
93
97
|
if (resp.status === 409) {
|
|
94
98
|
const body = await resp.json().catch(() => ({}));
|
|
@@ -97,7 +101,8 @@ export class PinionProverClient {
|
|
|
97
101
|
if (!resp.ok) {
|
|
98
102
|
throw new ProverError(resp.status, await resp.text().catch(() => ''));
|
|
99
103
|
}
|
|
100
|
-
|
|
104
|
+
const pr = await resp.json();
|
|
105
|
+
return base64ToBytes(pr.proof);
|
|
101
106
|
}
|
|
102
107
|
/**
|
|
103
108
|
* Run one audit round against a pre-fetched setup.
|
|
@@ -216,15 +221,30 @@ export class PinNotActiveError extends Error {
|
|
|
216
221
|
// ---------------------------------------------------------------------------
|
|
217
222
|
/**
|
|
218
223
|
* Decode a raw /setup response into a ParsedSetup.
|
|
219
|
-
*
|
|
220
|
-
*
|
|
224
|
+
*
|
|
225
|
+
* The client_setup field is base64(JSON(WireClientSetup)). Each root is
|
|
226
|
+
* either:
|
|
227
|
+
* - non-chunked (Ateniese/Erway/BJO): roots[].block_ids are CID strings,
|
|
228
|
+
* decoded to raw CID bytes (Uint8Array) via multiformats/cid.
|
|
229
|
+
* - chunked (SW-Priv/SW-Pub): roots[].block_count is a super-block count;
|
|
230
|
+
* ids are synthesized locally as superBlockId(rootBytes, i) for i in
|
|
231
|
+
* [0, block_count) — see superBlockId()'s doc comment in challenge.ts for
|
|
232
|
+
* why no per-block manifest is needed for these protocols.
|
|
221
233
|
*/
|
|
222
234
|
export function parseSetupResponse(raw) {
|
|
223
235
|
const clientSetup = parseClientSetup(raw.client_setup);
|
|
224
|
-
const roots = raw.roots.map((r) =>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
236
|
+
const roots = raw.roots.map((r) => {
|
|
237
|
+
if (r.block_count !== undefined) {
|
|
238
|
+
const rootBytes = CID.parse(r.root).bytes;
|
|
239
|
+
const blockIds = Array.from({ length: r.block_count }, (_, i) => superBlockId(rootBytes, i));
|
|
240
|
+
return { root: r.root, blockIds, chunked: true };
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
root: r.root,
|
|
244
|
+
blockIds: (r.block_ids ?? []).map((id) => CID.parse(id).bytes),
|
|
245
|
+
chunked: false,
|
|
246
|
+
};
|
|
247
|
+
});
|
|
228
248
|
const totalBlocks = roots.reduce((s, r) => s + r.blockIds.length, 0);
|
|
229
249
|
return { clientSetup, roots, totalBlocks, challengeSize: clientSetup.l };
|
|
230
250
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ export { PinionProverClient, ProverError, PinNotActiveError, parseSetupResponse,
|
|
|
2
2
|
export type { PinionProverClientOptions, AuditOptions } from './client.js';
|
|
3
3
|
export { verifyProof, parseClientSetup } from './verify.js';
|
|
4
4
|
export type { VerifyParams } from './verify.js';
|
|
5
|
-
export { buildChallenge, deriveIndicesAndCoeffs, blockHashG1, base64ToBytes, uint8ToBase64, BN254_ORDER, } from './challenge.js';
|
|
5
|
+
export { buildChallenge, deriveIndicesAndCoeffs, blockHashG1, superBlockId, base64ToBytes, uint8ToBase64, BN254_ORDER, } from './challenge.js';
|
|
6
6
|
export { g1FromBytes, g2FromBytes, g1ScalarMult, g1Add, atePairing, fp12Equal, bytesToBigInt, G1_BASE, G2_BASE, } from './bn254.js';
|
|
7
7
|
export type { G1Point, G2Point, Fp12Elem } from './bn254.js';
|
|
8
|
-
export type { WireClientSetup, WireChallenge, WireProof, RawTaggedRoot, RawSetupResponse, ParsedRoot, ParsedSetup, ChallengeKeyInfo, CreateKeyResponse, CreateKeyResult, TagResponse, AuditResult, } from './types.js';
|
|
8
|
+
export type { WireClientSetup, WireChallenge, WireProof, ProveResponse, RawTaggedRoot, RawSetupResponse, ParsedRoot, ParsedSetup, ChallengeKeyInfo, CreateKeyResponse, CreateKeyResult, TagResponse, AuditResult, } from './types.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,KAAK,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7D,YAAY,EACV,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,KAAK,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7D,YAAY,EACV,eAAe,EACf,aAAa,EACb,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ export { PinionProverClient, ProverError, PinNotActiveError, parseSetupResponse,
|
|
|
3
3
|
// Verification
|
|
4
4
|
export { verifyProof, parseClientSetup } from './verify.js';
|
|
5
5
|
// Challenge construction
|
|
6
|
-
export { buildChallenge, deriveIndicesAndCoeffs, blockHashG1, base64ToBytes, uint8ToBase64, BN254_ORDER, } from './challenge.js';
|
|
6
|
+
export { buildChallenge, deriveIndicesAndCoeffs, blockHashG1, superBlockId, base64ToBytes, uint8ToBase64, BN254_ORDER, } from './challenge.js';
|
|
7
7
|
// BN254 primitives (for advanced use / other protocols)
|
|
8
8
|
export { g1FromBytes, g2FromBytes, g1ScalarMult, g1Add, atePairing, fp12Equal, bytesToBigInt, G1_BASE, G2_BASE, } from './bn254.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG5D,yBAAyB;AACzB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,wDAAwD;AACxD,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,KAAK,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG5D,yBAAyB;AACzB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,wDAAwD;AACxD,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,KAAK,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -30,18 +30,32 @@ export interface WireChallenge {
|
|
|
30
30
|
n: number;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* The proof returned by POST /prove as
|
|
34
|
-
* Despite the content-type, the body is JSON.
|
|
33
|
+
* The proof returned by POST /prove as JSON.
|
|
35
34
|
* Matches wireProof in storage-proofs/line/swpub/adapter.go.
|
|
36
35
|
*/
|
|
37
36
|
export interface WireProof {
|
|
38
37
|
sigma: string;
|
|
39
38
|
mu: string[];
|
|
40
39
|
}
|
|
41
|
-
/**
|
|
40
|
+
/** JSON response from POST /prove. */
|
|
41
|
+
export interface ProveResponse {
|
|
42
|
+
challenge_id: string;
|
|
43
|
+
proof: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* One root entry in the setup response. Exactly one of block_ids/block_count
|
|
47
|
+
* is populated: block_ids for protocols addressed by real IPFS block CID
|
|
48
|
+
* (Ateniese, Erway, BJO); block_count for protocols that virtualize each root
|
|
49
|
+
* into uniform super-blocks (SW-Priv, SW-Pub). For the latter, no per-block
|
|
50
|
+
* manifest is sent at all — challenge ids are `rootCID.Bytes() || BE64(localIndex)`
|
|
51
|
+
* for localIndex in [0, block_count), constructible from `root` plus this one
|
|
52
|
+
* integer. See superBlockId() in challenge.ts, an exact port of SuperBlockID()
|
|
53
|
+
* in ipfs-storage-proofs/superblock.go.
|
|
54
|
+
*/
|
|
42
55
|
export interface RawTaggedRoot {
|
|
43
56
|
root: string;
|
|
44
|
-
block_ids
|
|
57
|
+
block_ids?: string[];
|
|
58
|
+
block_count?: number;
|
|
45
59
|
}
|
|
46
60
|
/** Raw JSON from GET /api/v1/setup?key_id=<id>. */
|
|
47
61
|
export interface RawSetupResponse {
|
|
@@ -51,7 +65,23 @@ export interface RawSetupResponse {
|
|
|
51
65
|
/** A root entry with block IDs already decoded to Uint8Arrays. */
|
|
52
66
|
export interface ParsedRoot {
|
|
53
67
|
root: string;
|
|
68
|
+
/**
|
|
69
|
+
* Ids ready to feed directly to buildChallenge()/verifyProof(), in order.
|
|
70
|
+
* For non-chunked protocols these are real per-block CID bytes; for chunked
|
|
71
|
+
* protocols (see `chunked` below) these are synthesized super-block ids
|
|
72
|
+
* (superBlockId(rootBytes, i) for i in [0, block_count)) — opaque either way
|
|
73
|
+
* to buildChallenge()/verifyProof(), which only need byte-identity, not
|
|
74
|
+
* meaning.
|
|
75
|
+
*/
|
|
54
76
|
blockIds: Uint8Array[];
|
|
77
|
+
/**
|
|
78
|
+
* True if `blockIds` are synthesized super-block ids (chunked protocol:
|
|
79
|
+
* SW-Priv, SW-Pub) rather than real per-block CIDs. Callers that need to
|
|
80
|
+
* re-derive or re-export ids (e.g. writing an external client-state file)
|
|
81
|
+
* must branch on this — synthesized ids are not valid CIDs and must be
|
|
82
|
+
* reconstructed from `root` + a block count, never decoded as one.
|
|
83
|
+
*/
|
|
84
|
+
chunked: boolean;
|
|
55
85
|
}
|
|
56
86
|
/** Fully decoded result of getSetup(). Ready to pass to audit(). */
|
|
57
87
|
export interface ParsedSetup {
|
|
@@ -88,14 +118,18 @@ export interface CreateKeyResult {
|
|
|
88
118
|
publicKey: WireClientSetup;
|
|
89
119
|
}
|
|
90
120
|
/**
|
|
91
|
-
* Raw tag response from POST /api/v1/tag.
|
|
121
|
+
* Raw tag response from POST /api/v1/tag. Exactly one of block_ids/block_count
|
|
122
|
+
* is populated — see RawTaggedRoot's doc comment for which protocols use which.
|
|
92
123
|
*
|
|
93
|
-
* `block_ids` is the ordered list of CID
|
|
94
|
-
*
|
|
95
|
-
* uses to select which blocks to challenge — the
|
|
124
|
+
* For non-chunked protocols, `block_ids` is the ordered list of CID strings
|
|
125
|
+
* for every block in the DAG; this same list is returned by getSetup() per
|
|
126
|
+
* root and is what the client uses to select which blocks to challenge — the
|
|
127
|
+
* server never picks them. For chunked protocols (SW-Priv, SW-Pub),
|
|
128
|
+
* `block_count` is the super-block count instead — no manifest needed.
|
|
96
129
|
*/
|
|
97
130
|
export interface TagResponse {
|
|
98
|
-
block_ids
|
|
131
|
+
block_ids?: string[];
|
|
132
|
+
block_count?: number;
|
|
99
133
|
}
|
|
100
134
|
/** Result of a complete audit round (challenge → prove → cryptographic verify). */
|
|
101
135
|
export interface AuditResult {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,EAAE,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,EAAE,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,EAAE,CAAC;CACd;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB;;;;;;OAMG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinionengineering/prover-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "JavaScript/TypeScript client for the pinion-prover storage-proof service. Builds SW-Pub challenges and cryptographically verifies proofs using BN254 pairings.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@noble/curves": "^1.4.0",
|
|
28
|
-
"@noble/hashes": "^1.4.0"
|
|
28
|
+
"@noble/hashes": "^1.4.0",
|
|
29
|
+
"multiformats": "^13.0.0"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"@types/node": "^20.0.0",
|