@freedomofpress/cometbft 0.1.1 → 0.1.2
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/lightclient.js +134 -0
- package/dist/lightclient.js.map +1 -1
- package/dist/tests/lightclient.test.js +12 -5
- package/dist/tests/lightclient.test.js.map +1 -1
- package/dist/tests/webcat.test.js +9 -43
- package/dist/tests/webcat.test.js.map +1 -1
- package/package.json +5 -5
- package/src/lightclient.ts +176 -0
- package/src/tests/lightclient.test.ts +20 -5
- package/src/tests/webcat.test.ts +17 -47
package/dist/lightclient.js
CHANGED
|
@@ -2,6 +2,136 @@
|
|
|
2
2
|
import { Uint8ArrayToHex } from "./encoding";
|
|
3
3
|
import { CanonicalVote, } from "./proto/cometbft/types/v1/canonical";
|
|
4
4
|
import { SignedMsgType } from "./proto/cometbft/types/v1/types";
|
|
5
|
+
const LEAF_PREFIX = new Uint8Array([0]);
|
|
6
|
+
const INNER_PREFIX = new Uint8Array([1]);
|
|
7
|
+
function concatBytes(...parts) {
|
|
8
|
+
const totalLen = parts.reduce((acc, p) => acc + p.length, 0);
|
|
9
|
+
const out = new Uint8Array(totalLen);
|
|
10
|
+
let offset = 0;
|
|
11
|
+
for (const p of parts) {
|
|
12
|
+
out.set(p, offset);
|
|
13
|
+
offset += p.length;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
async function sha256(input) {
|
|
18
|
+
const digest = await crypto.subtle.digest("SHA-256", new Uint8Array(input));
|
|
19
|
+
return new Uint8Array(digest);
|
|
20
|
+
}
|
|
21
|
+
function encodeVarint(value) {
|
|
22
|
+
if (value < 0n)
|
|
23
|
+
throw new Error("encodeVarint expects a non-negative bigint");
|
|
24
|
+
const bytes = [];
|
|
25
|
+
let v = value;
|
|
26
|
+
while (v >= 0x80n) {
|
|
27
|
+
bytes.push(Number((v & 0x7fn) | 0x80n));
|
|
28
|
+
v >>= 7n;
|
|
29
|
+
}
|
|
30
|
+
bytes.push(Number(v));
|
|
31
|
+
return new Uint8Array(bytes);
|
|
32
|
+
}
|
|
33
|
+
function encodeFieldTag(fieldNumber, wireType) {
|
|
34
|
+
return encodeVarint(BigInt((fieldNumber << 3) | wireType));
|
|
35
|
+
}
|
|
36
|
+
function encodeProtoBytes(fieldNumber, value) {
|
|
37
|
+
return concatBytes(encodeFieldTag(fieldNumber, 2), encodeVarint(BigInt(value.length)), value);
|
|
38
|
+
}
|
|
39
|
+
function encodeProtoUint64(fieldNumber, value) {
|
|
40
|
+
return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(value));
|
|
41
|
+
}
|
|
42
|
+
function encodeProtoInt64(fieldNumber, value) {
|
|
43
|
+
const v = value < 0n ? (1n << 64n) + value : value;
|
|
44
|
+
return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(v));
|
|
45
|
+
}
|
|
46
|
+
function cdcEncodeString(value) {
|
|
47
|
+
if (value.length === 0)
|
|
48
|
+
return undefined;
|
|
49
|
+
return encodeProtoBytes(1, new TextEncoder().encode(value));
|
|
50
|
+
}
|
|
51
|
+
function cdcEncodeInt64(value) {
|
|
52
|
+
return encodeProtoInt64(1, value);
|
|
53
|
+
}
|
|
54
|
+
function cdcEncodeBytes(value) {
|
|
55
|
+
if (value.length === 0)
|
|
56
|
+
return undefined;
|
|
57
|
+
return encodeProtoBytes(1, value);
|
|
58
|
+
}
|
|
59
|
+
function encodeTimestamp(ts) {
|
|
60
|
+
const seconds = encodeProtoInt64(1, ts.seconds ?? 0n);
|
|
61
|
+
const nanos = ts.nanos
|
|
62
|
+
? concatBytes(encodeFieldTag(2, 0), encodeVarint(BigInt(ts.nanos)))
|
|
63
|
+
: new Uint8Array(0);
|
|
64
|
+
return concatBytes(seconds, nanos);
|
|
65
|
+
}
|
|
66
|
+
function encodePartSetHeader(total, hash) {
|
|
67
|
+
return concatBytes(encodeProtoUint64(1, BigInt(total)), encodeProtoBytes(2, hash));
|
|
68
|
+
}
|
|
69
|
+
function encodeBlockId(hash, partSetTotal, partSetHash) {
|
|
70
|
+
const psh = encodePartSetHeader(partSetTotal, partSetHash);
|
|
71
|
+
return concatBytes(encodeProtoBytes(1, hash), encodeProtoBytes(2, psh));
|
|
72
|
+
}
|
|
73
|
+
async function merkleLeafHash(leaf) {
|
|
74
|
+
return sha256(concatBytes(LEAF_PREFIX, leaf));
|
|
75
|
+
}
|
|
76
|
+
async function merkleInnerHash(left, right) {
|
|
77
|
+
return sha256(concatBytes(INNER_PREFIX, left, right));
|
|
78
|
+
}
|
|
79
|
+
function merkleSplitPoint(length) {
|
|
80
|
+
if (length < 1)
|
|
81
|
+
throw new Error("Trying to split a tree with size < 1");
|
|
82
|
+
const bitLen = Math.floor(Math.log2(length)) + 1;
|
|
83
|
+
let k = 1 << (bitLen - 1);
|
|
84
|
+
if (k === length)
|
|
85
|
+
k >>= 1;
|
|
86
|
+
return k;
|
|
87
|
+
}
|
|
88
|
+
async function merkleHashFromByteSlices(items) {
|
|
89
|
+
if (items.length === 0)
|
|
90
|
+
return sha256(new Uint8Array(0));
|
|
91
|
+
if (items.length === 1)
|
|
92
|
+
return merkleLeafHash(items[0]);
|
|
93
|
+
const k = merkleSplitPoint(items.length);
|
|
94
|
+
const left = await merkleHashFromByteSlices(items.slice(0, k));
|
|
95
|
+
const right = await merkleHashFromByteSlices(items.slice(k));
|
|
96
|
+
return merkleInnerHash(left, right);
|
|
97
|
+
}
|
|
98
|
+
async function computeHeaderHash(header) {
|
|
99
|
+
if (!header)
|
|
100
|
+
throw new Error("SignedHeader missing header");
|
|
101
|
+
if (!header.lastBlockId || !header.lastBlockId.partSetHeader) {
|
|
102
|
+
throw new Error("Header lastBlockId is missing");
|
|
103
|
+
}
|
|
104
|
+
if (!header.time)
|
|
105
|
+
throw new Error("Header time is missing");
|
|
106
|
+
const version = concatBytes(encodeProtoUint64(1, header.version?.block ?? 0n), encodeProtoUint64(2, header.version?.app ?? 0n));
|
|
107
|
+
const lastBlockId = encodeBlockId(header.lastBlockId.hash, header.lastBlockId.partSetHeader.total, header.lastBlockId.partSetHeader.hash);
|
|
108
|
+
const fields = [
|
|
109
|
+
version,
|
|
110
|
+
cdcEncodeString(header.chainId),
|
|
111
|
+
cdcEncodeInt64(header.height),
|
|
112
|
+
encodeTimestamp(header.time),
|
|
113
|
+
lastBlockId,
|
|
114
|
+
cdcEncodeBytes(header.lastCommitHash),
|
|
115
|
+
cdcEncodeBytes(header.dataHash),
|
|
116
|
+
cdcEncodeBytes(header.validatorsHash),
|
|
117
|
+
cdcEncodeBytes(header.nextValidatorsHash),
|
|
118
|
+
cdcEncodeBytes(header.consensusHash),
|
|
119
|
+
cdcEncodeBytes(header.appHash),
|
|
120
|
+
cdcEncodeBytes(header.lastResultsHash),
|
|
121
|
+
cdcEncodeBytes(header.evidenceHash),
|
|
122
|
+
cdcEncodeBytes(header.proposerAddress),
|
|
123
|
+
].filter((x) => Boolean(x));
|
|
124
|
+
return merkleHashFromByteSlices(fields);
|
|
125
|
+
}
|
|
126
|
+
function bytesEqual(a, b) {
|
|
127
|
+
if (a.length !== b.length)
|
|
128
|
+
return false;
|
|
129
|
+
for (let i = 0; i < a.length; i++) {
|
|
130
|
+
if (a[i] !== b[i])
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
5
135
|
function encodeUvarint(value) {
|
|
6
136
|
if (!Number.isSafeInteger(value) || value < 0)
|
|
7
137
|
throw new Error("encodeUvarint expects a non-negative safe integer");
|
|
@@ -82,6 +212,10 @@ export async function verifyCommit(sh, vset, cryptoIndex) {
|
|
|
82
212
|
const blockIdHash = bid.hash;
|
|
83
213
|
const partsHash = bid.partSetHeader.hash;
|
|
84
214
|
const partsTotal = bid.partSetHeader.total;
|
|
215
|
+
const expectedBlockHash = await computeHeaderHash(header);
|
|
216
|
+
if (!bytesEqual(expectedBlockHash, blockIdHash)) {
|
|
217
|
+
throw new Error("Header hash does not match commit BlockID hash (header fields were tampered or inconsistent)");
|
|
218
|
+
}
|
|
85
219
|
let signedPower = 0n;
|
|
86
220
|
const unknown = [];
|
|
87
221
|
const invalid = [];
|
package/dist/lightclient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightclient.js","sourceRoot":"","sources":["../src/lightclient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lightclient.js","sourceRoot":"","sources":["../src/lightclient.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ describe("lightclient.verifyCommit", () => {
|
|
|
26
26
|
expect(out.invalidSignatures.length).toBe(0);
|
|
27
27
|
expect(out.countedSignatures).toBeGreaterThan(0);
|
|
28
28
|
});
|
|
29
|
-
it("
|
|
29
|
+
it("throws when commit block_id.hash does not match the header hash", async () => {
|
|
30
30
|
const vResp = validatorsFixture;
|
|
31
31
|
const { proto: vset, cryptoIndex } = await importValidators(vResp);
|
|
32
32
|
const badCommit = clone(commitFixture);
|
|
@@ -34,10 +34,17 @@ describe("lightclient.verifyCommit", () => {
|
|
|
34
34
|
badCommit.signed_header.commit.block_id.hash =
|
|
35
35
|
h.slice(0, -2) + (h.slice(-2) === "00" ? "01" : "00");
|
|
36
36
|
const sh = importCommit(badCommit);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
|
|
38
|
+
});
|
|
39
|
+
it("throws when app_hash is tampered", async () => {
|
|
40
|
+
const vResp = validatorsFixture;
|
|
41
|
+
const { proto: vset, cryptoIndex } = await importValidators(vResp);
|
|
42
|
+
const badHeader = clone(commitFixture);
|
|
43
|
+
const appHash = badHeader.signed_header.header.app_hash;
|
|
44
|
+
badHeader.signed_header.header.app_hash =
|
|
45
|
+
appHash.slice(0, -2) + (appHash.slice(-2) === "00" ? "01" : "00");
|
|
46
|
+
const sh = importCommit(badHeader);
|
|
47
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
|
|
41
48
|
});
|
|
42
49
|
it("drops below 2/3 quorum when two votes are ABSENT", async () => {
|
|
43
50
|
const vResp = validatorsFixture;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightclient.test.js","sourceRoot":"","sources":["../../src/tests/lightclient.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lightclient.test.js","sourceRoot":"","sources":["../../src/tests/lightclient.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { importCommit } from "../commit";
|
|
3
|
-
import { Uint8ArrayToBase64
|
|
3
|
+
import { Uint8ArrayToBase64 } from "../encoding";
|
|
4
4
|
import { verifyCommit } from "../lightclient";
|
|
5
5
|
import { importValidators } from "../validators";
|
|
6
6
|
import blockFixture from "./fixtures/webcat.json";
|
|
@@ -8,55 +8,29 @@ function clone(x) {
|
|
|
8
8
|
return JSON.parse(JSON.stringify(x));
|
|
9
9
|
}
|
|
10
10
|
describe("lightclient.verifyCommit", () => {
|
|
11
|
-
it("
|
|
11
|
+
it("rejects this fixture when header hash does not match commit block_id.hash", async () => {
|
|
12
12
|
const validators = blockFixture.validator_set;
|
|
13
13
|
const commit = blockFixture;
|
|
14
14
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
15
15
|
const sh = importCommit(commit);
|
|
16
|
-
|
|
17
|
-
expect(out.quorum).toBe(true);
|
|
18
|
-
expect(out.ok).toBe(true);
|
|
19
|
-
expect(out.signedPower > 0n).toBe(true);
|
|
20
|
-
expect(out.signedPower <= out.totalPower).toBe(true);
|
|
21
|
-
expect(out.headerTime).toBeDefined();
|
|
22
|
-
expect(out.appHash instanceof Uint8Array).toBe(true);
|
|
23
|
-
expect(out.blockIdHash instanceof Uint8Array).toBe(true);
|
|
24
|
-
expect(out.unknownValidators.length).toBe(0);
|
|
25
|
-
expect(out.invalidSignatures.length).toBe(0);
|
|
26
|
-
expect(out.countedSignatures).toBeGreaterThan(0);
|
|
16
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
|
|
27
17
|
});
|
|
28
|
-
it("
|
|
18
|
+
it("throws when commit block_id.hash does not match header hash", async () => {
|
|
29
19
|
const validators = blockFixture.validator_set;
|
|
30
20
|
const commit = clone(blockFixture);
|
|
31
|
-
// Flip one byte of the BlockID hash to keep the signature well-formed but
|
|
32
|
-
// cryptographically invalid for the mutated sign-bytes.
|
|
33
21
|
commit.signed_header.commit.block_id.hash =
|
|
34
22
|
"3A1D00CC2A092465E85EA2C24986BEE0105285039DC1873BB6B0CA7F610EC89D";
|
|
35
23
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
36
24
|
const sh = importCommit(commit);
|
|
37
|
-
|
|
38
|
-
expect(out.quorum).toBe(false);
|
|
39
|
-
expect(out.ok).toBe(false);
|
|
40
|
-
expect(out.signedPower).toBe(0n);
|
|
41
|
-
expect(out.invalidSignatures).toEqual([
|
|
42
|
-
Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
|
|
43
|
-
]);
|
|
44
|
-
expect(out.countedSignatures).toBe(1);
|
|
25
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
|
|
45
26
|
});
|
|
46
|
-
it("
|
|
27
|
+
it("still rejects on header/commit hash mismatch even when a signature is corrupted", async () => {
|
|
47
28
|
const validators = blockFixture.validator_set;
|
|
48
29
|
const commit = clone(blockFixture);
|
|
49
30
|
commit.signed_header.commit.signatures[0].signature = Uint8ArrayToBase64(new Uint8Array(64));
|
|
50
31
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
51
32
|
const sh = importCommit(commit);
|
|
52
|
-
|
|
53
|
-
expect(out.quorum).toBe(false);
|
|
54
|
-
expect(out.ok).toBe(false);
|
|
55
|
-
expect(out.signedPower).toBe(0n);
|
|
56
|
-
expect(out.invalidSignatures).toEqual([
|
|
57
|
-
Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
|
|
58
|
-
]);
|
|
59
|
-
expect(out.countedSignatures).toBe(1);
|
|
33
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
|
|
60
34
|
});
|
|
61
35
|
it("rejects malformed signature bytes", async () => {
|
|
62
36
|
const validators = blockFixture.validator_set;
|
|
@@ -65,22 +39,14 @@ describe("lightclient.verifyCommit", () => {
|
|
|
65
39
|
commit.signed_header.commit.signatures[0].signature = "AA==";
|
|
66
40
|
await expect(async () => importCommit(commit)).rejects.toThrow(/signature must be 64 bytes/);
|
|
67
41
|
});
|
|
68
|
-
it("
|
|
42
|
+
it("still rejects on header/commit hash mismatch even when validator is unknown", async () => {
|
|
69
43
|
const validators = blockFixture.validator_set;
|
|
70
44
|
const commit = clone(blockFixture);
|
|
71
45
|
commit.signed_header.commit.signatures[0].validator_address =
|
|
72
46
|
"0000000000000000000000000000000000000000";
|
|
73
47
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
74
48
|
const sh = importCommit(commit);
|
|
75
|
-
|
|
76
|
-
expect(out.quorum).toBe(false);
|
|
77
|
-
expect(out.ok).toBe(false);
|
|
78
|
-
expect(out.signedPower).toBe(0n);
|
|
79
|
-
expect(out.invalidSignatures).toEqual([]);
|
|
80
|
-
expect(out.unknownValidators).toEqual([
|
|
81
|
-
"0000000000000000000000000000000000000000",
|
|
82
|
-
]);
|
|
83
|
-
expect(out.countedSignatures).toBe(0);
|
|
49
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
|
|
84
50
|
});
|
|
85
51
|
});
|
|
86
52
|
//# sourceMappingURL=webcat.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webcat.test.js","sourceRoot":"","sources":["../../src/tests/webcat.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"webcat.test.js","sourceRoot":"","sources":["../../src/tests/webcat.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAElD,SAAS,KAAK,CAAI,CAAI;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,YAAqC,CAAC;QAErD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;YACvC,kEAAkE,CAAC;QAErE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,kBAAkB,CACtE,IAAI,UAAU,CAAC,EAAE,CAAC,CACnB,CAAC;QAEF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,wDAAwD;QACxD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;QAE7D,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB;YACzD,0CAA0C,CAAC;QAE7C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@freedomofpress/cometbft",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "A CometBFT light client for the browser.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,13 +27,13 @@
|
|
|
27
27
|
"homepage": "https://github.com/freedomofpress/cometbft-ts#readme",
|
|
28
28
|
"bugs": "https://github.com/freedomofpress/cometbft-ts/issues",
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@vitest/coverage-v8": "^4.0.
|
|
30
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
31
31
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
32
32
|
"typescript": "^5.9.3",
|
|
33
|
-
"typescript-eslint": "^8.
|
|
34
|
-
"vitest": "^4.0.
|
|
33
|
+
"typescript-eslint": "^8.56.1",
|
|
34
|
+
"vitest": "^4.0.18"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@bufbuild/protobuf": "^2.
|
|
37
|
+
"@bufbuild/protobuf": "^2.11.0"
|
|
38
38
|
}
|
|
39
39
|
}
|
package/src/lightclient.ts
CHANGED
|
@@ -12,6 +12,175 @@ import {
|
|
|
12
12
|
} from "./proto/cometbft/types/v1/validator";
|
|
13
13
|
import { Timestamp as PbTimestamp } from "./proto/google/protobuf/timestamp";
|
|
14
14
|
|
|
15
|
+
const LEAF_PREFIX = new Uint8Array([0]);
|
|
16
|
+
const INNER_PREFIX = new Uint8Array([1]);
|
|
17
|
+
|
|
18
|
+
function concatBytes(...parts: Uint8Array[]): Uint8Array {
|
|
19
|
+
const totalLen = parts.reduce((acc, p) => acc + p.length, 0);
|
|
20
|
+
const out = new Uint8Array(totalLen);
|
|
21
|
+
let offset = 0;
|
|
22
|
+
for (const p of parts) {
|
|
23
|
+
out.set(p, offset);
|
|
24
|
+
offset += p.length;
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function sha256(input: Uint8Array): Promise<Uint8Array> {
|
|
30
|
+
const digest = await crypto.subtle.digest("SHA-256", new Uint8Array(input));
|
|
31
|
+
return new Uint8Array(digest);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function encodeVarint(value: bigint): Uint8Array {
|
|
35
|
+
if (value < 0n) throw new Error("encodeVarint expects a non-negative bigint");
|
|
36
|
+
const bytes: number[] = [];
|
|
37
|
+
let v = value;
|
|
38
|
+
while (v >= 0x80n) {
|
|
39
|
+
bytes.push(Number((v & 0x7fn) | 0x80n));
|
|
40
|
+
v >>= 7n;
|
|
41
|
+
}
|
|
42
|
+
bytes.push(Number(v));
|
|
43
|
+
return new Uint8Array(bytes);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function encodeFieldTag(fieldNumber: number, wireType: number): Uint8Array {
|
|
47
|
+
return encodeVarint(BigInt((fieldNumber << 3) | wireType));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function encodeProtoBytes(fieldNumber: number, value: Uint8Array): Uint8Array {
|
|
51
|
+
return concatBytes(
|
|
52
|
+
encodeFieldTag(fieldNumber, 2),
|
|
53
|
+
encodeVarint(BigInt(value.length)),
|
|
54
|
+
value,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function encodeProtoUint64(fieldNumber: number, value: bigint): Uint8Array {
|
|
59
|
+
return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(value));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function encodeProtoInt64(fieldNumber: number, value: bigint): Uint8Array {
|
|
63
|
+
const v = value < 0n ? (1n << 64n) + value : value;
|
|
64
|
+
return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(v));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function cdcEncodeString(value: string): Uint8Array | undefined {
|
|
68
|
+
if (value.length === 0) return undefined;
|
|
69
|
+
return encodeProtoBytes(1, new TextEncoder().encode(value));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function cdcEncodeInt64(value: bigint): Uint8Array {
|
|
73
|
+
return encodeProtoInt64(1, value);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function cdcEncodeBytes(value: Uint8Array): Uint8Array | undefined {
|
|
77
|
+
if (value.length === 0) return undefined;
|
|
78
|
+
return encodeProtoBytes(1, value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function encodeTimestamp(ts: PbTimestamp): Uint8Array {
|
|
82
|
+
const seconds = encodeProtoInt64(1, ts.seconds ?? 0n);
|
|
83
|
+
const nanos = ts.nanos
|
|
84
|
+
? concatBytes(encodeFieldTag(2, 0), encodeVarint(BigInt(ts.nanos)))
|
|
85
|
+
: new Uint8Array(0);
|
|
86
|
+
return concatBytes(seconds, nanos);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function encodePartSetHeader(total: number, hash: Uint8Array): Uint8Array {
|
|
90
|
+
return concatBytes(
|
|
91
|
+
encodeProtoUint64(1, BigInt(total)),
|
|
92
|
+
encodeProtoBytes(2, hash),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function encodeBlockId(
|
|
97
|
+
hash: Uint8Array,
|
|
98
|
+
partSetTotal: number,
|
|
99
|
+
partSetHash: Uint8Array,
|
|
100
|
+
): Uint8Array {
|
|
101
|
+
const psh = encodePartSetHeader(partSetTotal, partSetHash);
|
|
102
|
+
return concatBytes(encodeProtoBytes(1, hash), encodeProtoBytes(2, psh));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function merkleLeafHash(leaf: Uint8Array): Promise<Uint8Array> {
|
|
106
|
+
return sha256(concatBytes(LEAF_PREFIX, leaf));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function merkleInnerHash(
|
|
110
|
+
left: Uint8Array,
|
|
111
|
+
right: Uint8Array,
|
|
112
|
+
): Promise<Uint8Array> {
|
|
113
|
+
return sha256(concatBytes(INNER_PREFIX, left, right));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function merkleSplitPoint(length: number): number {
|
|
117
|
+
if (length < 1) throw new Error("Trying to split a tree with size < 1");
|
|
118
|
+
const bitLen = Math.floor(Math.log2(length)) + 1;
|
|
119
|
+
let k = 1 << (bitLen - 1);
|
|
120
|
+
if (k === length) k >>= 1;
|
|
121
|
+
return k;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function merkleHashFromByteSlices(
|
|
125
|
+
items: Uint8Array[],
|
|
126
|
+
): Promise<Uint8Array> {
|
|
127
|
+
if (items.length === 0) return sha256(new Uint8Array(0));
|
|
128
|
+
if (items.length === 1) return merkleLeafHash(items[0]);
|
|
129
|
+
|
|
130
|
+
const k = merkleSplitPoint(items.length);
|
|
131
|
+
const left = await merkleHashFromByteSlices(items.slice(0, k));
|
|
132
|
+
const right = await merkleHashFromByteSlices(items.slice(k));
|
|
133
|
+
return merkleInnerHash(left, right);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function computeHeaderHash(
|
|
137
|
+
header: SignedHeader["header"],
|
|
138
|
+
): Promise<Uint8Array> {
|
|
139
|
+
if (!header) throw new Error("SignedHeader missing header");
|
|
140
|
+
if (!header.lastBlockId || !header.lastBlockId.partSetHeader) {
|
|
141
|
+
throw new Error("Header lastBlockId is missing");
|
|
142
|
+
}
|
|
143
|
+
if (!header.time) throw new Error("Header time is missing");
|
|
144
|
+
|
|
145
|
+
const version = concatBytes(
|
|
146
|
+
encodeProtoUint64(1, header.version?.block ?? 0n),
|
|
147
|
+
encodeProtoUint64(2, header.version?.app ?? 0n),
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const lastBlockId = encodeBlockId(
|
|
151
|
+
header.lastBlockId.hash,
|
|
152
|
+
header.lastBlockId.partSetHeader.total,
|
|
153
|
+
header.lastBlockId.partSetHeader.hash,
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
const fields: Uint8Array[] = [
|
|
157
|
+
version,
|
|
158
|
+
cdcEncodeString(header.chainId),
|
|
159
|
+
cdcEncodeInt64(header.height),
|
|
160
|
+
encodeTimestamp(header.time),
|
|
161
|
+
lastBlockId,
|
|
162
|
+
cdcEncodeBytes(header.lastCommitHash),
|
|
163
|
+
cdcEncodeBytes(header.dataHash),
|
|
164
|
+
cdcEncodeBytes(header.validatorsHash),
|
|
165
|
+
cdcEncodeBytes(header.nextValidatorsHash),
|
|
166
|
+
cdcEncodeBytes(header.consensusHash),
|
|
167
|
+
cdcEncodeBytes(header.appHash),
|
|
168
|
+
cdcEncodeBytes(header.lastResultsHash),
|
|
169
|
+
cdcEncodeBytes(header.evidenceHash),
|
|
170
|
+
cdcEncodeBytes(header.proposerAddress),
|
|
171
|
+
].filter((x): x is Uint8Array => Boolean(x));
|
|
172
|
+
|
|
173
|
+
return merkleHashFromByteSlices(fields);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {
|
|
177
|
+
if (a.length !== b.length) return false;
|
|
178
|
+
for (let i = 0; i < a.length; i++) {
|
|
179
|
+
if (a[i] !== b[i]) return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
|
|
15
184
|
export type CryptoIndex = Map<string, CryptoKey>;
|
|
16
185
|
|
|
17
186
|
export interface VerifyOutcome {
|
|
@@ -133,6 +302,13 @@ export async function verifyCommit(
|
|
|
133
302
|
const partsHash: Uint8Array = bid.partSetHeader.hash;
|
|
134
303
|
const partsTotal: number = bid.partSetHeader.total;
|
|
135
304
|
|
|
305
|
+
const expectedBlockHash = await computeHeaderHash(header);
|
|
306
|
+
if (!bytesEqual(expectedBlockHash, blockIdHash)) {
|
|
307
|
+
throw new Error(
|
|
308
|
+
"Header hash does not match commit BlockID hash (header fields were tampered or inconsistent)",
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
136
312
|
let signedPower = 0n;
|
|
137
313
|
const unknown: string[] = [];
|
|
138
314
|
const invalid: string[] = [];
|
|
@@ -38,7 +38,7 @@ describe("lightclient.verifyCommit", () => {
|
|
|
38
38
|
expect(out.countedSignatures).toBeGreaterThan(0);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
it("
|
|
41
|
+
it("throws when commit block_id.hash does not match the header hash", async () => {
|
|
42
42
|
const vResp = validatorsFixture as unknown as ValidatorJson;
|
|
43
43
|
const { proto: vset, cryptoIndex } = await importValidators(vResp);
|
|
44
44
|
|
|
@@ -48,11 +48,26 @@ describe("lightclient.verifyCommit", () => {
|
|
|
48
48
|
h.slice(0, -2) + (h.slice(-2) === "00" ? "01" : "00");
|
|
49
49
|
|
|
50
50
|
const sh = importCommit(badCommit as CommitJson);
|
|
51
|
-
const out = await verifyCommit(sh, vset, cryptoIndex);
|
|
52
51
|
|
|
53
|
-
expect(
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
|
|
53
|
+
/header hash does not match commit blockid hash/i,
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("throws when app_hash is tampered", async () => {
|
|
58
|
+
const vResp = validatorsFixture as unknown as ValidatorJson;
|
|
59
|
+
const { proto: vset, cryptoIndex } = await importValidators(vResp);
|
|
60
|
+
|
|
61
|
+
const badHeader = clone(commitFixture) as any;
|
|
62
|
+
const appHash: string = badHeader.signed_header.header.app_hash;
|
|
63
|
+
badHeader.signed_header.header.app_hash =
|
|
64
|
+
appHash.slice(0, -2) + (appHash.slice(-2) === "00" ? "01" : "00");
|
|
65
|
+
|
|
66
|
+
const sh = importCommit(badHeader as CommitJson);
|
|
67
|
+
|
|
68
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
|
|
69
|
+
/header hash does not match commit blockid hash/i,
|
|
70
|
+
);
|
|
56
71
|
});
|
|
57
72
|
|
|
58
73
|
it("drops below 2/3 quorum when two votes are ABSENT", async () => {
|
package/src/tests/webcat.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
|
|
3
3
|
import { importCommit } from "../commit";
|
|
4
|
-
import { Uint8ArrayToBase64
|
|
4
|
+
import { Uint8ArrayToBase64 } from "../encoding";
|
|
5
5
|
import { verifyCommit } from "../lightclient";
|
|
6
6
|
import type { CommitJson, ValidatorJson } from "../types";
|
|
7
7
|
import { importValidators } from "../validators";
|
|
@@ -12,51 +12,34 @@ function clone<T>(x: T): T {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
describe("lightclient.verifyCommit", () => {
|
|
15
|
-
it("
|
|
15
|
+
it("rejects this fixture when header hash does not match commit block_id.hash", async () => {
|
|
16
16
|
const validators = blockFixture.validator_set as unknown as ValidatorJson;
|
|
17
17
|
const commit = blockFixture as unknown as CommitJson;
|
|
18
18
|
|
|
19
19
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
20
20
|
const sh = importCommit(commit);
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
expect(out.ok).toBe(true);
|
|
26
|
-
expect(out.signedPower > 0n).toBe(true);
|
|
27
|
-
expect(out.signedPower <= out.totalPower).toBe(true);
|
|
28
|
-
expect(out.headerTime).toBeDefined();
|
|
29
|
-
expect(out.appHash instanceof Uint8Array).toBe(true);
|
|
30
|
-
expect(out.blockIdHash instanceof Uint8Array).toBe(true);
|
|
31
|
-
expect(out.unknownValidators.length).toBe(0);
|
|
32
|
-
expect(out.invalidSignatures.length).toBe(0);
|
|
33
|
-
expect(out.countedSignatures).toBeGreaterThan(0);
|
|
22
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
|
|
23
|
+
/header hash does not match commit blockid hash/i,
|
|
24
|
+
);
|
|
34
25
|
});
|
|
35
26
|
|
|
36
|
-
it("
|
|
27
|
+
it("throws when commit block_id.hash does not match header hash", async () => {
|
|
37
28
|
const validators = blockFixture.validator_set as unknown as ValidatorJson;
|
|
38
29
|
const commit = clone(blockFixture) as unknown as CommitJson;
|
|
39
30
|
|
|
40
|
-
// Flip one byte of the BlockID hash to keep the signature well-formed but
|
|
41
|
-
// cryptographically invalid for the mutated sign-bytes.
|
|
42
31
|
commit.signed_header.commit.block_id.hash =
|
|
43
32
|
"3A1D00CC2A092465E85EA2C24986BEE0105285039DC1873BB6B0CA7F610EC89D";
|
|
44
33
|
|
|
45
34
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
46
35
|
const sh = importCommit(commit);
|
|
47
36
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
expect(out.ok).toBe(false);
|
|
52
|
-
expect(out.signedPower).toBe(0n);
|
|
53
|
-
expect(out.invalidSignatures).toEqual([
|
|
54
|
-
Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
|
|
55
|
-
]);
|
|
56
|
-
expect(out.countedSignatures).toBe(1);
|
|
37
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
|
|
38
|
+
/header hash does not match commit blockid hash/i,
|
|
39
|
+
);
|
|
57
40
|
});
|
|
58
41
|
|
|
59
|
-
it("
|
|
42
|
+
it("still rejects on header/commit hash mismatch even when a signature is corrupted", async () => {
|
|
60
43
|
const validators = blockFixture.validator_set as unknown as ValidatorJson;
|
|
61
44
|
const commit = clone(blockFixture) as unknown as CommitJson;
|
|
62
45
|
|
|
@@ -67,15 +50,9 @@ describe("lightclient.verifyCommit", () => {
|
|
|
67
50
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
68
51
|
const sh = importCommit(commit);
|
|
69
52
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
expect(out.ok).toBe(false);
|
|
74
|
-
expect(out.signedPower).toBe(0n);
|
|
75
|
-
expect(out.invalidSignatures).toEqual([
|
|
76
|
-
Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
|
|
77
|
-
]);
|
|
78
|
-
expect(out.countedSignatures).toBe(1);
|
|
53
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
|
|
54
|
+
/header hash does not match commit blockid hash/i,
|
|
55
|
+
);
|
|
79
56
|
});
|
|
80
57
|
|
|
81
58
|
it("rejects malformed signature bytes", async () => {
|
|
@@ -90,7 +67,7 @@ describe("lightclient.verifyCommit", () => {
|
|
|
90
67
|
);
|
|
91
68
|
});
|
|
92
69
|
|
|
93
|
-
it("
|
|
70
|
+
it("still rejects on header/commit hash mismatch even when validator is unknown", async () => {
|
|
94
71
|
const validators = blockFixture.validator_set as unknown as ValidatorJson;
|
|
95
72
|
const commit = clone(blockFixture) as unknown as CommitJson;
|
|
96
73
|
|
|
@@ -100,15 +77,8 @@ describe("lightclient.verifyCommit", () => {
|
|
|
100
77
|
const { proto: vset, cryptoIndex } = await importValidators(validators);
|
|
101
78
|
const sh = importCommit(commit);
|
|
102
79
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
expect(out.ok).toBe(false);
|
|
107
|
-
expect(out.signedPower).toBe(0n);
|
|
108
|
-
expect(out.invalidSignatures).toEqual([]);
|
|
109
|
-
expect(out.unknownValidators).toEqual([
|
|
110
|
-
"0000000000000000000000000000000000000000",
|
|
111
|
-
]);
|
|
112
|
-
expect(out.countedSignatures).toBe(0);
|
|
80
|
+
await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
|
|
81
|
+
/header hash does not match commit blockid hash/i,
|
|
82
|
+
);
|
|
113
83
|
});
|
|
114
84
|
});
|