o1js-pack 0.4.0 → 0.4.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/README.md +14 -29
- package/build/src/index.d.ts +2 -2
- package/build/src/index.js +2 -2
- package/build/src/index.js.map +1 -1
- package/build/src/lib/PackingPlant.d.ts +4 -12
- package/build/src/lib/PackingPlant.js +11 -12
- package/build/src/lib/PackingPlant.js.map +1 -1
- package/build/src/lib/packed-types/PackedBool.d.ts +1 -6
- package/build/src/lib/packed-types/PackedBool.js +1 -0
- package/build/src/lib/packed-types/PackedBool.js.map +1 -1
- package/build/src/lib/packed-types/PackedString.d.ts +96 -7
- package/build/src/lib/packed-types/PackedString.js +78 -10
- package/build/src/lib/packed-types/PackedString.js.map +1 -1
- package/build/src/lib/packed-types/PackedString.test.js +11 -10
- package/build/src/lib/packed-types/PackedString.test.js.map +1 -1
- package/build/src/lib/packed-types/PackedUInt32.d.ts +1 -6
- package/build/src/lib/packed-types/PackedUInt32.js +1 -0
- package/build/src/lib/packed-types/PackedUInt32.js.map +1 -1
- package/examples/smart_contract/election/README.md +3 -0
- package/examples/smart_contract/election/contract.ts +79 -0
- package/examples/smart_contract/election/run.ts +98 -0
- package/examples/zk_program/age_gate/README.md +7 -0
- package/examples/zk_program/age_gate/circuit.ts +75 -0
- package/examples/zk_program/age_gate/non-packed-circuit.ts +68 -0
- package/examples/zk_program/age_gate/non-packed-run.ts +36 -0
- package/examples/zk_program/age_gate/run.ts +35 -0
- package/package.json +1 -1
- package/tests/provable/end_to_end.test.ts +2 -4
- package/tests/provable/example_packed_string_circuit.ts +3 -8
- package/tests/provable/example_packed_uint_circuit.ts +6 -12
- package/build/src/lib/packed-types/PackedCharacter.d.ts +0 -51
- package/build/src/lib/packed-types/PackedCharacter.js +0 -34
- package/build/src/lib/packed-types/PackedCharacter.js.map +0 -1
- package/build/src/lib/packed-types/PackedCharacter.test.d.ts +0 -1
- package/build/src/lib/packed-types/PackedCharacter.test.js +0 -31
- package/build/src/lib/packed-types/PackedCharacter.test.js.map +0 -1
- package/build/src/lib/scratch.d.ts +0 -1
- package/build/src/lib/scratch.js +0 -16
- package/build/src/lib/scratch.js.map +0 -1
- package/build/src/packed-types/PackedBool.d.ts +0 -51
- package/build/src/packed-types/PackedBool.js +0 -34
- package/build/src/packed-types/PackedBool.js.map +0 -1
- package/build/src/packed-types/PackedBool.test.d.ts +0 -1
- package/build/src/packed-types/PackedBool.test.js +0 -101
- package/build/src/packed-types/PackedBool.test.js.map +0 -1
- package/build/src/packed-types/PackedCharacter.d.ts +0 -51
- package/build/src/packed-types/PackedCharacter.js +0 -34
- package/build/src/packed-types/PackedCharacter.js.map +0 -1
- package/build/src/packed-types/PackedCharacter.test.d.ts +0 -1
- package/build/src/packed-types/PackedCharacter.test.js +0 -31
- package/build/src/packed-types/PackedCharacter.test.js.map +0 -1
- package/build/src/packed-types/PackedUInt32.d.ts +0 -51
- package/build/src/packed-types/PackedUInt32.js +0 -34
- package/build/src/packed-types/PackedUInt32.js.map +0 -1
- package/build/src/packed-types/PackedUInt32.test.d.ts +0 -1
- package/build/src/packed-types/PackedUInt32.test.js +0 -68
- package/build/src/packed-types/PackedUInt32.test.js.map +0 -1
- package/build/src/packed-types/PackingPlant.d.ts +0 -54
- package/build/src/packed-types/PackingPlant.js +0 -45
- package/build/src/packed-types/PackingPlant.js.map +0 -1
- package/build/src/packed-types/scratch.d.ts +0 -1
- package/build/src/packed-types/scratch.js +0 -5
- package/build/src/packed-types/scratch.js.map +0 -1
- package/coverage/clover.xml +0 -166
- package/coverage/coverage-final.json +0 -5
- package/coverage/lcov-report/PackedBool.ts.html +0 -268
- package/coverage/lcov-report/PackedUInt32.ts.html +0 -313
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -131
- package/coverage/lcov-report/lib/PackingPlant.ts.html +0 -478
- package/coverage/lcov-report/lib/index.html +0 -116
- package/coverage/lcov-report/lib/packed-types/PackedBool.ts.html +0 -238
- package/coverage/lcov-report/lib/packed-types/PackedString.ts.html +0 -364
- package/coverage/lcov-report/lib/packed-types/PackedUInt32.ts.html +0 -238
- package/coverage/lcov-report/lib/packed-types/index.html +0 -146
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -282
@@ -1,9 +1,9 @@
|
|
1
1
|
import { Character, Provable } from 'o1js';
|
2
|
-
import { PackedStringFactory } from './PackedString';
|
2
|
+
import { PackedStringFactory, MultiPackedStringFactory } from './PackedString';
|
3
3
|
describe('PackedString', () => {
|
4
4
|
describe('Outside of the Circuit', () => {
|
5
5
|
const vitalik_dot_eth = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
6
|
-
class EthAddressString extends
|
6
|
+
class EthAddressString extends MultiPackedStringFactory(3) {
|
7
7
|
}
|
8
8
|
let characters = [];
|
9
9
|
beforeEach(() => {
|
@@ -21,20 +21,21 @@ describe('PackedString', () => {
|
|
21
21
|
expect(myEthAddress.toString()).toBe(vitalik_dot_eth);
|
22
22
|
});
|
23
23
|
it('#pack and #unPack', () => {
|
24
|
-
const
|
25
|
-
const
|
24
|
+
const unpacked = EthAddressString.unpack(EthAddressString.fromCharacters(characters).packed);
|
25
|
+
const packed = EthAddressString.pack(unpacked);
|
26
26
|
expect(packed.length).toBe(Math.ceil(vitalik_dot_eth.length / 15));
|
27
|
-
expect(unpacked.length).toBe(
|
28
|
-
expect(unpacked.
|
27
|
+
expect(unpacked.length).toBe(EthAddressString.l);
|
28
|
+
expect(unpacked.length).toBe(45);
|
29
|
+
expect(unpacked.slice(0, characters.length).toString()).toBe(characters.toString());
|
29
30
|
});
|
30
31
|
});
|
31
32
|
describe('Provable Properties', () => {
|
32
33
|
it('#sizeInFields', () => {
|
33
34
|
class one extends PackedStringFactory(15) {
|
34
35
|
}
|
35
|
-
class two extends
|
36
|
+
class two extends MultiPackedStringFactory(2) {
|
36
37
|
}
|
37
|
-
class three extends
|
38
|
+
class three extends MultiPackedStringFactory(3) {
|
38
39
|
}
|
39
40
|
expect(one.sizeInFields()).toBe(1);
|
40
41
|
expect(two.sizeInFields()).toBe(2);
|
@@ -59,7 +60,7 @@ describe('PackedString', () => {
|
|
59
60
|
});
|
60
61
|
it('Exceeds maximum size string', () => {
|
61
62
|
const tooLong = 'too long!'.repeat(20);
|
62
|
-
class MaxString extends
|
63
|
+
class MaxString extends MultiPackedStringFactory(8) {
|
63
64
|
}
|
64
65
|
expect(() => {
|
65
66
|
MaxString.fromString(tooLong);
|
@@ -68,7 +69,7 @@ describe('PackedString', () => {
|
|
68
69
|
});
|
69
70
|
describe('In the circuit', () => {
|
70
71
|
const vitalik_dot_eth = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
71
|
-
class EthAddressString extends
|
72
|
+
class EthAddressString extends MultiPackedStringFactory(3) {
|
72
73
|
}
|
73
74
|
const outsideEthAddress = EthAddressString.fromString(vitalik_dot_eth);
|
74
75
|
it('Initializes a string', () => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"PackedString.test.js","sourceRoot":"","sources":["../../../../src/lib/packed-types/PackedString.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAS,QAAQ,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
1
|
+
{"version":3,"file":"PackedString.test.js","sourceRoot":"","sources":["../../../../src/lib/packed-types/PackedString.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAS,QAAQ,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,MAAM,eAAe,GAAG,4CAA4C,CAAC;QACrE,MAAM,gBAAiB,SAAQ,wBAAwB,CAAC,CAAC,CAAC;SAAG;QAC7D,IAAI,UAAU,GAAqB,EAAE,CAAC;QAEtC,UAAU,CAAC,GAAG,EAAE;YACd,UAAU,GAAG,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3D;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YACrB,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAClE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzB,MAAM,YAAY,GAAG,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACjE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CACtC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,MAAM,CACnD,CAAC;YACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAC1D,UAAU,CAAC,QAAQ,EAAE,CACtB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACvB,MAAM,GAAI,SAAQ,mBAAmB,CAAC,EAAE,CAAC;aAAG;YAC5C,MAAM,GAAI,SAAQ,wBAAwB,CAAC,CAAC,CAAC;aAAG;YAChD,MAAM,KAAM,SAAQ,wBAAwB,CAAC,CAAC,CAAC;aAAG;YAElD,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,QAAS,SAAQ,mBAAmB,CAAC,EAAE,CAAC;aAAG;YAEjD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE1C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,QAAS,SAAQ,mBAAmB,CAAC,EAAE,CAAC;aAAG;YAEjD,MAAM,CAAC,GAAG,EAAE;gBACV,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,SAAU,SAAQ,wBAAwB,CAAC,CAAC,CAAC;aAAG;YACtD,MAAM,CAAC,GAAG,EAAE;gBACV,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,MAAM,eAAe,GAAG,4CAA4C,CAAC;QACrE,MAAM,gBAAiB,SAAQ,wBAAwB,CAAC,CAAC,CAAC;SAAG;QAE7D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAEvE,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,CAAC,GAAG,EAAE;gBACV,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;oBACxB,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAEpE,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,GAAG,EAAE;gBACV,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;oBACxB,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAEpE,YAAY,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEjB,MAAM,CAAC,GAAG,EAAE;gBACV,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;oBACxB,MAAM,UAAU,GAAG,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBACjD,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACrC,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAEtD,YAAY,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
@@ -2,9 +2,7 @@ import { Field, UInt32 } from 'o1js';
|
|
2
2
|
export declare function PackedUInt32Factory(l?: number): {
|
3
3
|
new (packed: import("o1js/dist/node/lib/field.js").Field): {
|
4
4
|
toBigInts(): Array<bigint>;
|
5
|
-
bitSize: bigint;
|
6
5
|
assertEquals(other: {
|
7
|
-
bitSize: bigint;
|
8
6
|
assertEquals(other: any): void;
|
9
7
|
packed: import("o1js/dist/node/lib/field.js").Field;
|
10
8
|
}): void;
|
@@ -25,9 +23,7 @@ export declare function PackedUInt32Factory(l?: number): {
|
|
25
23
|
*/
|
26
24
|
fromUInt32s(uint32s: Array<UInt32>): {
|
27
25
|
toBigInts(): Array<bigint>;
|
28
|
-
bitSize: bigint;
|
29
26
|
assertEquals(other: {
|
30
|
-
bitSize: bigint;
|
31
27
|
assertEquals(other: any): void;
|
32
28
|
packed: import("o1js/dist/node/lib/field.js").Field;
|
33
29
|
}): void;
|
@@ -40,9 +36,7 @@ export declare function PackedUInt32Factory(l?: number): {
|
|
40
36
|
*/
|
41
37
|
fromBigInts(bigints: Array<bigint>): {
|
42
38
|
toBigInts(): Array<bigint>;
|
43
|
-
bitSize: bigint;
|
44
39
|
assertEquals(other: {
|
45
|
-
bitSize: bigint;
|
46
40
|
assertEquals(other: any): void;
|
47
41
|
packed: import("o1js/dist/node/lib/field.js").Field;
|
48
42
|
}): void;
|
@@ -54,6 +48,7 @@ export declare function PackedUInt32Factory(l?: number): {
|
|
54
48
|
packed: string;
|
55
49
|
}>;
|
56
50
|
l: number;
|
51
|
+
bitSize: bigint;
|
57
52
|
checkPack(unpacked: UInt32[]): void;
|
58
53
|
pack(unpacked: UInt32[]): import("o1js/dist/node/lib/field.js").Field;
|
59
54
|
unpackToBigints(f: import("o1js/dist/node/lib/field.js").Field): bigint[];
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"PackedUInt32.js","sourceRoot":"","sources":["../../../../src/lib/packed-types/PackedUInt32.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,kCAAkC;AAC/C,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,MAAM,UAAU,mBAAmB,CAAC,IAAY,CAAC;IAC/C,MAAM,aAAc,SAAQ,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC;QAC/D,MAAM,CAAC,YAAY,CAAC,KAAa;YAC/B,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,UAAU;YACf,OAAO,YAAY,CAAC;QACtB,CAAC;QAED;;;;WAIG;QACH,MAAM,CAAC,MAAM,CAAC,CAAQ;YACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE;gBAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED;;;;WAIG;QACH,MAAM,CAAC,WAAW,CAAC,OAAsB;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED;;;;WAIG;QACH,MAAM,CAAC,WAAW,CAAC,OAAsB;YACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,SAAS;YACP,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;KACF;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
1
|
+
{"version":3,"file":"PackedUInt32.js","sourceRoot":"","sources":["../../../../src/lib/packed-types/PackedUInt32.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,kCAAkC;AAC/C,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,MAAM,UAAU,mBAAmB,CAAC,IAAY,CAAC;IAC/C,MAAM,aAAc,SAAQ,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC;QAC/D,MAAM,CAAC,YAAY,CAAC,KAAa;YAC/B,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,UAAU;YACf,OAAO,YAAY,CAAC;QACtB,CAAC;QAED;;;;WAIG;QACH,MAAM,CAAC,MAAM,CAAC,CAAQ;YACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE;gBAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED;;;;WAIG;QACH,MAAM,CAAC,WAAW,CAAC,OAAsB;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED;;;;WAIG;QACH,MAAM,CAAC,WAAW,CAAC,OAAsB;YACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,SAAS;YACP,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;KACF;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import { SmartContract, state, State, method, UInt32 } from 'o1js';
|
2
|
+
import { PackedUInt32Factory } from '../../../src/index.js';
|
3
|
+
|
4
|
+
export class Ballot extends PackedUInt32Factory() {}
|
5
|
+
|
6
|
+
export class Election extends SmartContract {
|
7
|
+
@state(Ballot) ballot1 = State<Ballot>();
|
8
|
+
@state(Ballot) ballot2 = State<Ballot>();
|
9
|
+
@state(Ballot) ballot3 = State<Ballot>();
|
10
|
+
@state(Ballot) ballot4 = State<Ballot>();
|
11
|
+
|
12
|
+
init() {
|
13
|
+
super.init();
|
14
|
+
this.ballot1.set(Ballot.fromBigInts([0n, 0n, 0n, 0n, 0n, 0n, 0n]));
|
15
|
+
this.ballot2.set(Ballot.fromBigInts([0n, 0n, 0n, 0n, 0n, 0n, 0n]));
|
16
|
+
this.ballot3.set(Ballot.fromBigInts([0n, 0n, 0n, 0n, 0n, 0n, 0n]));
|
17
|
+
this.ballot4.set(Ballot.fromBigInts([0n, 0n, 0n, 0n, 0n, 0n, 0n]));
|
18
|
+
}
|
19
|
+
|
20
|
+
@method
|
21
|
+
castBallot1(vote: Ballot) {
|
22
|
+
const unpackedVote = Ballot.unpack(vote.packed);
|
23
|
+
const ballot1 = this.ballot1.getAndAssertEquals();
|
24
|
+
const unpackedBallot1 = Ballot.unpack(ballot1.packed);
|
25
|
+
|
26
|
+
let voteSum = UInt32.from(0);
|
27
|
+
for (let i = 0; i < Ballot.l; i++) {
|
28
|
+
voteSum = voteSum.add(unpackedVote[i]);
|
29
|
+
unpackedBallot1[i] = unpackedBallot1[i].add(unpackedVote[i]);
|
30
|
+
}
|
31
|
+
voteSum.value.assertEquals(1); // vote must be exactly one vote for one choice
|
32
|
+
this.ballot1.set(Ballot.fromUInt32s(unpackedBallot1));
|
33
|
+
}
|
34
|
+
|
35
|
+
@method
|
36
|
+
castBallot2(vote: Ballot) {
|
37
|
+
const unpackedVote = Ballot.unpack(vote.packed);
|
38
|
+
const ballot2 = this.ballot2.getAndAssertEquals();
|
39
|
+
const unpackedBallot2 = Ballot.unpack(ballot2.packed);
|
40
|
+
|
41
|
+
let voteSum = UInt32.from(0);
|
42
|
+
for (let i = 0; i < Ballot.l; i++) {
|
43
|
+
voteSum = voteSum.add(unpackedVote[i]);
|
44
|
+
unpackedBallot2[i] = unpackedBallot2[i].add(unpackedVote[i]);
|
45
|
+
}
|
46
|
+
voteSum.value.assertEquals(1); // vote must be exactly one vote for one choice
|
47
|
+
this.ballot2.set(Ballot.fromUInt32s(unpackedBallot2));
|
48
|
+
}
|
49
|
+
|
50
|
+
@method
|
51
|
+
castBallot3(vote: Ballot) {
|
52
|
+
const unpackedVote = Ballot.unpack(vote.packed);
|
53
|
+
const ballot3 = this.ballot3.getAndAssertEquals();
|
54
|
+
const unpackedBallot3 = Ballot.unpack(ballot3.packed);
|
55
|
+
|
56
|
+
let voteSum = UInt32.from(0);
|
57
|
+
for (let i = 0; i < Ballot.l; i++) {
|
58
|
+
voteSum = voteSum.add(unpackedVote[i]);
|
59
|
+
unpackedBallot3[i] = unpackedBallot3[i].add(unpackedVote[i]);
|
60
|
+
}
|
61
|
+
voteSum.value.assertEquals(1); // vote must be exactly one vote for one choice
|
62
|
+
this.ballot3.set(Ballot.fromUInt32s(unpackedBallot3));
|
63
|
+
}
|
64
|
+
|
65
|
+
@method
|
66
|
+
castBallot4(vote: Ballot) {
|
67
|
+
const unpackedVote = Ballot.unpack(vote.packed);
|
68
|
+
const ballot4 = this.ballot4.getAndAssertEquals();
|
69
|
+
const unpackedBallot4 = Ballot.unpack(ballot4.packed);
|
70
|
+
|
71
|
+
let voteSum = UInt32.from(0);
|
72
|
+
for (let i = 0; i < Ballot.l; i++) {
|
73
|
+
voteSum = voteSum.add(unpackedVote[i]);
|
74
|
+
unpackedBallot4[i] = unpackedBallot4[i].add(unpackedVote[i]);
|
75
|
+
}
|
76
|
+
voteSum.value.assertEquals(1); // vote must be exactly one vote for one choice
|
77
|
+
this.ballot4.set(Ballot.fromUInt32s(unpackedBallot4));
|
78
|
+
}
|
79
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import { AccountUpdate, Mina, PrivateKey } from 'o1js';
|
2
|
+
import { Ballot, Election } from './contract.js';
|
3
|
+
|
4
|
+
let Local = Mina.LocalBlockchain({ proofsEnabled: true });
|
5
|
+
Mina.setActiveInstance(Local);
|
6
|
+
|
7
|
+
// a test account that pays all the fees, and puts additional funds into the zkapp
|
8
|
+
let { privateKey: senderKey, publicKey: sender } = Local.testAccounts[0];
|
9
|
+
|
10
|
+
// the zkapp account
|
11
|
+
let zkappKey = PrivateKey.random();
|
12
|
+
let zkappAddress = zkappKey.toPublicKey();
|
13
|
+
|
14
|
+
// a special account that is allowed to pull out half of the zkapp balance, once
|
15
|
+
let privilegedKey = PrivateKey.random();
|
16
|
+
let privilegedAddress = privilegedKey.toPublicKey();
|
17
|
+
|
18
|
+
let initialBalance = 10_000_000_000;
|
19
|
+
let zkapp = new Election(zkappAddress);
|
20
|
+
|
21
|
+
console.time('compile');
|
22
|
+
await Election.compile();
|
23
|
+
console.timeEnd('compile');
|
24
|
+
|
25
|
+
console.time('deploy');
|
26
|
+
let tx = await Mina.transaction(sender, () => {
|
27
|
+
let senderUpdate = AccountUpdate.fundNewAccount(sender);
|
28
|
+
senderUpdate.send({ to: zkappAddress, amount: initialBalance });
|
29
|
+
zkapp.deploy({ zkappKey });
|
30
|
+
});
|
31
|
+
await tx.prove();
|
32
|
+
await tx.sign([senderKey]).send();
|
33
|
+
console.timeEnd('deploy');
|
34
|
+
|
35
|
+
console.log(
|
36
|
+
'initial state: ',
|
37
|
+
zkapp.ballot1.get().toBigInts(),
|
38
|
+
zkapp.ballot2.get().toBigInts(),
|
39
|
+
zkapp.ballot3.get().toBigInts(),
|
40
|
+
zkapp.ballot4.get().toBigInts()
|
41
|
+
);
|
42
|
+
|
43
|
+
console.time('vote on ballot 1');
|
44
|
+
tx = await Mina.transaction(sender, () => {
|
45
|
+
const myVote = Ballot.fromBigInts([0n, 0n, 1n, 0n, 0n, 0n, 0n]);
|
46
|
+
zkapp.castBallot1(myVote);
|
47
|
+
});
|
48
|
+
await tx.prove();
|
49
|
+
await tx.sign([senderKey]).send();
|
50
|
+
console.timeEnd('vote on ballot 1');
|
51
|
+
|
52
|
+
console.time('vote on ballot 3');
|
53
|
+
tx = await Mina.transaction(sender, () => {
|
54
|
+
const myVote = Ballot.fromBigInts([0n, 0n, 0n, 0n, 0n, 0n, 1n]);
|
55
|
+
zkapp.castBallot3(myVote);
|
56
|
+
});
|
57
|
+
await tx.prove();
|
58
|
+
await tx.sign([senderKey]).send();
|
59
|
+
console.timeEnd('vote on ballot 3');
|
60
|
+
|
61
|
+
console.log(
|
62
|
+
'final state: ',
|
63
|
+
zkapp.ballot1.get().toBigInts(),
|
64
|
+
zkapp.ballot2.get().toBigInts(),
|
65
|
+
zkapp.ballot3.get().toBigInts(),
|
66
|
+
zkapp.ballot4.get().toBigInts()
|
67
|
+
);
|
68
|
+
|
69
|
+
// compile: 28.710s
|
70
|
+
// deploy: 1.848s
|
71
|
+
// initial state: [
|
72
|
+
// 0n, 0n, 0n, 0n,
|
73
|
+
// 0n, 0n, 0n
|
74
|
+
// ] [
|
75
|
+
// 0n, 0n, 0n, 0n,
|
76
|
+
// 0n, 0n, 0n
|
77
|
+
// ] [
|
78
|
+
// 0n, 0n, 0n, 0n,
|
79
|
+
// 0n, 0n, 0n
|
80
|
+
// ] [
|
81
|
+
// 0n, 0n, 0n, 0n,
|
82
|
+
// 0n, 0n, 0n
|
83
|
+
// ]
|
84
|
+
// vote on ballot 1: 24.752s
|
85
|
+
// vote on ballot 3: 23.132s
|
86
|
+
// final state: [
|
87
|
+
// 0n, 0n, 1n, 0n,
|
88
|
+
// 0n, 0n, 0n
|
89
|
+
// ] [
|
90
|
+
// 0n, 0n, 0n, 0n,
|
91
|
+
// 0n, 0n, 0n
|
92
|
+
// ] [
|
93
|
+
// 0n, 0n, 0n, 0n,
|
94
|
+
// 0n, 0n, 1n
|
95
|
+
// ] [
|
96
|
+
// 0n, 0n, 0n, 0n,
|
97
|
+
// 0n, 0n, 0n
|
98
|
+
// ]
|
@@ -0,0 +1,7 @@
|
|
1
|
+
## Age Gate
|
2
|
+
|
3
|
+
This example Zk Program stores a counter of accepted, a counter of rejected, and a method to check an input age.
|
4
|
+
|
5
|
+
If the age is above a required limit, the accepted counter is incremented, else the rejected counter is incremented.
|
6
|
+
|
7
|
+
The 2 counters are stored in a single packed UInt, and the data type for age is a packed string.
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import {
|
2
|
+
Field,
|
3
|
+
Experimental,
|
4
|
+
UInt32,
|
5
|
+
Provable,
|
6
|
+
Poseidon,
|
7
|
+
SelfProof,
|
8
|
+
Character,
|
9
|
+
Bool,
|
10
|
+
Empty,
|
11
|
+
} from 'o1js';
|
12
|
+
import {
|
13
|
+
PackedUInt32Factory,
|
14
|
+
PackedStringFactory,
|
15
|
+
} from '../../../src/index.js';
|
16
|
+
|
17
|
+
export class PackedCounters extends PackedUInt32Factory(2) {}
|
18
|
+
|
19
|
+
export class PackedString extends PackedStringFactory(8) {}
|
20
|
+
|
21
|
+
const isOlderThan = (reference: PackedString, toVerify: PackedString): Bool => {
|
22
|
+
let ref = Field(0);
|
23
|
+
let ver = Field(0);
|
24
|
+
|
25
|
+
const referenceDate = PackedString.unpack(reference.packed);
|
26
|
+
const dateToVerify = PackedString.unpack(toVerify.packed);
|
27
|
+
|
28
|
+
for (let i = 0; i < PackedString.l; i++) {
|
29
|
+
const exp = PackedString.l - i;
|
30
|
+
ref = ref.add(referenceDate[i].value.mul(10 ** exp));
|
31
|
+
ver = ver.add(dateToVerify[i].value.mul(10 ** exp));
|
32
|
+
}
|
33
|
+
|
34
|
+
return ver.greaterThan(ref);
|
35
|
+
};
|
36
|
+
|
37
|
+
export const AgeGateCircuit = Experimental.ZkProgram({
|
38
|
+
publicOutput: PackedCounters,
|
39
|
+
|
40
|
+
methods: {
|
41
|
+
init: {
|
42
|
+
privateInputs: [],
|
43
|
+
method() {
|
44
|
+
return PackedCounters.fromBigInts([0n, 0n]);
|
45
|
+
},
|
46
|
+
},
|
47
|
+
verifyAge: {
|
48
|
+
privateInputs: [SelfProof, PackedString],
|
49
|
+
method(
|
50
|
+
oldProof: SelfProof<Empty, PackedCounters>,
|
51
|
+
dateToVerify: PackedString
|
52
|
+
) {
|
53
|
+
oldProof.verify();
|
54
|
+
const counters = PackedCounters.unpack(oldProof.publicOutput.packed);
|
55
|
+
const referenceDate = PackedString.fromString('20000101'); // hard-coded - date to verify must be older than new years in the year 2000
|
56
|
+
const isOlder = isOlderThan(referenceDate, dateToVerify);
|
57
|
+
const deltaCounter0 = Provable.if(
|
58
|
+
isOlder,
|
59
|
+
UInt32.from(1),
|
60
|
+
UInt32.from(0)
|
61
|
+
);
|
62
|
+
const deltaCounter1 = Provable.if(
|
63
|
+
isOlder,
|
64
|
+
UInt32.from(0),
|
65
|
+
UInt32.from(1)
|
66
|
+
);
|
67
|
+
counters[0] = counters[0].add(deltaCounter0);
|
68
|
+
counters[1] = counters[1].add(deltaCounter1);
|
69
|
+
return PackedCounters.fromUInt32s(counters);
|
70
|
+
},
|
71
|
+
},
|
72
|
+
},
|
73
|
+
});
|
74
|
+
|
75
|
+
export const AgeGateCircuitProof = Experimental.ZkProgram.Proof(AgeGateCircuit);
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import {
|
2
|
+
Field,
|
3
|
+
Experimental,
|
4
|
+
UInt32,
|
5
|
+
Provable,
|
6
|
+
Poseidon,
|
7
|
+
SelfProof,
|
8
|
+
Character,
|
9
|
+
Bool,
|
10
|
+
Empty,
|
11
|
+
CircuitString,
|
12
|
+
} from 'o1js';
|
13
|
+
|
14
|
+
const isOlderThan = (
|
15
|
+
reference: CircuitString,
|
16
|
+
toVerify: CircuitString
|
17
|
+
): Bool => {
|
18
|
+
let ref = Field(0);
|
19
|
+
let ver = Field(0);
|
20
|
+
|
21
|
+
for (let i = 0; i < 8; i++) {
|
22
|
+
const exp = 8 - i;
|
23
|
+
ref = ref.add(reference.values[i].value.mul(10 ** exp));
|
24
|
+
ver = ver.add(toVerify.values[i].value.mul(10 ** exp));
|
25
|
+
}
|
26
|
+
|
27
|
+
return ver.greaterThan(ref);
|
28
|
+
};
|
29
|
+
|
30
|
+
export const AgeGateCircuit = Experimental.ZkProgram({
|
31
|
+
publicOutput: Provable.Array(UInt32, 2),
|
32
|
+
|
33
|
+
methods: {
|
34
|
+
init: {
|
35
|
+
privateInputs: [],
|
36
|
+
method() {
|
37
|
+
return [UInt32.from(0), UInt32.from(0)];
|
38
|
+
},
|
39
|
+
},
|
40
|
+
verifyAge: {
|
41
|
+
privateInputs: [SelfProof, CircuitString],
|
42
|
+
method(
|
43
|
+
oldProof: SelfProof<Empty, Array<UInt32>>,
|
44
|
+
dateToVerify: CircuitString
|
45
|
+
) {
|
46
|
+
oldProof.verify();
|
47
|
+
const counters = oldProof.publicOutput;
|
48
|
+
const referenceDate = CircuitString.fromString('20000101'); // hard-coded - date to verify must be older than new years in the year 2000
|
49
|
+
const isOlder = isOlderThan(referenceDate, dateToVerify);
|
50
|
+
const deltaCounter0 = Provable.if(
|
51
|
+
isOlder,
|
52
|
+
UInt32.from(1),
|
53
|
+
UInt32.from(0)
|
54
|
+
);
|
55
|
+
const deltaCounter1 = Provable.if(
|
56
|
+
isOlder,
|
57
|
+
UInt32.from(0),
|
58
|
+
UInt32.from(1)
|
59
|
+
);
|
60
|
+
counters[0] = counters[0].add(deltaCounter0);
|
61
|
+
counters[1] = counters[1].add(deltaCounter1);
|
62
|
+
return counters;
|
63
|
+
},
|
64
|
+
},
|
65
|
+
},
|
66
|
+
});
|
67
|
+
|
68
|
+
export const AgeGateCircuitProof = Experimental.ZkProgram.Proof(AgeGateCircuit);
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { AgeGateCircuit } from './non-packed-circuit.js';
|
2
|
+
import { CircuitString } from 'o1js';
|
3
|
+
|
4
|
+
console.time('Compiling...');
|
5
|
+
await AgeGateCircuit.compile();
|
6
|
+
console.timeEnd('Compiling...');
|
7
|
+
|
8
|
+
console.time('Running...');
|
9
|
+
let old_proof = await AgeGateCircuit.init();
|
10
|
+
old_proof = await AgeGateCircuit.verifyAge(
|
11
|
+
old_proof,
|
12
|
+
CircuitString.fromString('20210927')
|
13
|
+
);
|
14
|
+
old_proof = await AgeGateCircuit.verifyAge(
|
15
|
+
old_proof,
|
16
|
+
CircuitString.fromString('19011225')
|
17
|
+
);
|
18
|
+
old_proof = await AgeGateCircuit.verifyAge(
|
19
|
+
old_proof,
|
20
|
+
CircuitString.fromString('20071031')
|
21
|
+
);
|
22
|
+
console.timeEnd('Running...');
|
23
|
+
|
24
|
+
// Now we expect old_proof to have a counter of [2, 1] - 2 dates were older than 2000-01-01, 1 date was younger
|
25
|
+
const counters = old_proof.publicOutput;
|
26
|
+
console.log(counters.toString());
|
27
|
+
|
28
|
+
const circuitAnalysis = AgeGateCircuit.analyzeMethods();
|
29
|
+
console.log('Number of gates in method 0: ', circuitAnalysis[0].rows);
|
30
|
+
console.log('Number of gates in method 1: ', circuitAnalysis[1].rows);
|
31
|
+
|
32
|
+
// Compiling...: 1:00.331 (m:ss.mmm)
|
33
|
+
// Running...: 3:31.711 (m:ss.mmm)
|
34
|
+
// 2,1
|
35
|
+
// Number of gates in method 0: 0
|
36
|
+
// Number of gates in method 1: 651
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import { AgeGateCircuit, PackedCounters, PackedString } from './circuit.js';
|
2
|
+
|
3
|
+
console.time('Compiling...');
|
4
|
+
await AgeGateCircuit.compile();
|
5
|
+
console.timeEnd('Compiling...');
|
6
|
+
|
7
|
+
console.time('Running...');
|
8
|
+
let old_proof = await AgeGateCircuit.init();
|
9
|
+
old_proof = await AgeGateCircuit.verifyAge(
|
10
|
+
old_proof,
|
11
|
+
PackedString.fromString('20210927')
|
12
|
+
);
|
13
|
+
old_proof = await AgeGateCircuit.verifyAge(
|
14
|
+
old_proof,
|
15
|
+
PackedString.fromString('19011225')
|
16
|
+
);
|
17
|
+
old_proof = await AgeGateCircuit.verifyAge(
|
18
|
+
old_proof,
|
19
|
+
PackedString.fromString('20071031')
|
20
|
+
);
|
21
|
+
console.timeEnd('Running...');
|
22
|
+
|
23
|
+
// Now we expect old_proof to have a counter of [2, 1] - 2 dates were older than 2000-01-01, 1 date was younger
|
24
|
+
const counters = PackedCounters.unpack(old_proof.publicOutput.packed);
|
25
|
+
console.log(counters.toString());
|
26
|
+
|
27
|
+
const circuitAnalysis = AgeGateCircuit.analyzeMethods();
|
28
|
+
console.log('Number of gates in method 0: ', circuitAnalysis[0].rows);
|
29
|
+
console.log('Number of gates in method 1: ', circuitAnalysis[1].rows);
|
30
|
+
|
31
|
+
// Compiling...: 59.405s
|
32
|
+
// Running...: 3:31.839 (m:ss.mmm)
|
33
|
+
// 2,1
|
34
|
+
// Number of gates in method 0: 0
|
35
|
+
// Number of gates in method 1: 551
|
package/package.json
CHANGED
@@ -56,12 +56,10 @@ describe('End to End Text Input Test', () => {
|
|
56
56
|
const p1 = await TextInputProgram.changeFirstLetter(
|
57
57
|
proofTextInput,
|
58
58
|
initProof,
|
59
|
-
TextInput.unpack(
|
59
|
+
TextInput.unpack(initProof.publicInput.packed),
|
60
60
|
Character.fromString('Z')
|
61
61
|
);
|
62
|
-
|
63
|
-
Poseidon.hash(p1.publicInput.packed)
|
64
|
-
);
|
62
|
+
proofTextInput.assertEquals(p1.publicInput);
|
65
63
|
});
|
66
64
|
});
|
67
65
|
});
|
@@ -6,10 +6,9 @@ import {
|
|
6
6
|
Provable,
|
7
7
|
Field,
|
8
8
|
} from 'o1js';
|
9
|
-
import {
|
9
|
+
import { MultiPackedStringFactory } from '../../src/lib/packed-types/PackedString';
|
10
10
|
|
11
|
-
|
12
|
-
export class TextInput extends PackedStringFactory(MAX_LENGTH) {}
|
11
|
+
export class TextInput extends MultiPackedStringFactory(3) {}
|
13
12
|
|
14
13
|
export const TextInputProgram = Experimental.ZkProgram({
|
15
14
|
publicInput: TextInput,
|
@@ -23,11 +22,7 @@ export const TextInputProgram = Experimental.ZkProgram({
|
|
23
22
|
},
|
24
23
|
},
|
25
24
|
changeFirstLetter: {
|
26
|
-
privateInputs: [
|
27
|
-
SelfProof,
|
28
|
-
Provable.Array(Character, MAX_LENGTH),
|
29
|
-
Character,
|
30
|
-
],
|
25
|
+
privateInputs: [SelfProof, Provable.Array(Character, 45), Character],
|
31
26
|
method(
|
32
27
|
newState: TextInput,
|
33
28
|
oldProof: SelfProof<TextInput, TextInput>,
|
@@ -18,24 +18,18 @@ export const VotesProgram = Experimental.ZkProgram({
|
|
18
18
|
privateInputs: [SelfProof],
|
19
19
|
method(newState: Votes, oldProof: SelfProof<Votes, Votes>) {
|
20
20
|
oldProof.verify();
|
21
|
-
const
|
22
|
-
|
23
|
-
|
24
|
-
);
|
25
|
-
expectedUnpacked[0] = expectedUnpacked[0].add(1);
|
26
|
-
newState.assertEquals(Votes.fromUInt32s(expectedUnpacked));
|
21
|
+
const unpacked = Votes.unpack(oldProof.publicInput.packed);
|
22
|
+
unpacked[0] = unpacked[0].add(1);
|
23
|
+
newState.assertEquals(Votes.fromUInt32s(unpacked));
|
27
24
|
},
|
28
25
|
},
|
29
26
|
incrementIndex1: {
|
30
27
|
privateInputs: [SelfProof],
|
31
28
|
method(newState: Votes, oldProof: SelfProof<Votes, Votes>) {
|
32
29
|
oldProof.verify();
|
33
|
-
const
|
34
|
-
|
35
|
-
|
36
|
-
);
|
37
|
-
expectedUnpacked[1] = expectedUnpacked[1].add(1);
|
38
|
-
newState.assertEquals(Votes.fromUInt32s(expectedUnpacked));
|
30
|
+
const unpacked = Votes.unpack(oldProof.publicInput.packed);
|
31
|
+
unpacked[1] = unpacked[1].add(1);
|
32
|
+
newState.assertEquals(Votes.fromUInt32s(unpacked));
|
39
33
|
},
|
40
34
|
},
|
41
35
|
},
|