@aztec/stdlib 4.0.0-nightly.20260217 → 4.0.0-rc.1
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/dest/auth_witness/auth_witness.js +3 -3
- package/dest/block/block_data.d.ts +52 -0
- package/dest/block/block_data.d.ts.map +1 -0
- package/dest/block/block_data.js +12 -0
- package/dest/block/index.d.ts +2 -1
- package/dest/block/index.d.ts.map +1 -1
- package/dest/block/index.js +1 -0
- package/dest/block/l2_block_source.d.ts +20 -1
- package/dest/block/l2_block_source.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint.d.ts +6 -1
- package/dest/checkpoint/checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint.js +5 -4
- package/dest/checkpoint/checkpoint_data.d.ts +120 -0
- package/dest/checkpoint/checkpoint_data.d.ts.map +1 -0
- package/dest/checkpoint/checkpoint_data.js +26 -0
- package/dest/checkpoint/index.d.ts +2 -1
- package/dest/checkpoint/index.d.ts.map +1 -1
- package/dest/checkpoint/index.js +1 -0
- package/dest/checkpoint/published_checkpoint.d.ts +11 -2
- package/dest/checkpoint/published_checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/published_checkpoint.js +1 -2
- package/dest/contract/contract_address.js +4 -4
- package/dest/contract/contract_class_id.js +3 -3
- package/dest/contract/private_function.js +2 -2
- package/dest/file-store/local.d.ts +3 -3
- package/dest/file-store/local.d.ts.map +1 -1
- package/dest/file-store/local.js +13 -4
- package/dest/file-store/s3.d.ts +1 -1
- package/dest/file-store/s3.d.ts.map +1 -1
- package/dest/file-store/s3.js +11 -3
- package/dest/hash/hash.js +11 -11
- package/dest/hash/map_slot.js +2 -2
- package/dest/interfaces/archiver.d.ts +1 -1
- package/dest/interfaces/archiver.d.ts.map +1 -1
- package/dest/interfaces/archiver.js +5 -0
- package/dest/interfaces/aztec-node-admin.d.ts +27 -2
- package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
- package/dest/interfaces/aztec-node-admin.js +9 -3
- package/dest/interfaces/configs.d.ts +12 -2
- package/dest/interfaces/configs.d.ts.map +1 -1
- package/dest/interfaces/configs.js +3 -1
- package/dest/interfaces/merkle_tree_operations.d.ts +2 -2
- package/dest/interfaces/merkle_tree_operations.d.ts.map +1 -1
- package/dest/kernel/hints/index.d.ts +2 -2
- package/dest/kernel/hints/index.js +2 -2
- package/dest/kernel/hints/key_validation_request_and_separator.d.ts +24 -0
- package/dest/kernel/hints/key_validation_request_and_separator.d.ts.map +1 -0
- package/dest/kernel/hints/{key_validation_request_and_generator.js → key_validation_request_and_separator.js} +12 -15
- package/dest/kernel/hints/{scoped_key_validation_request_and_generator.d.ts → scoped_key_validation_request_and_separator.d.ts} +8 -8
- package/dest/kernel/hints/{scoped_key_validation_request_and_generator.d.ts.map → scoped_key_validation_request_and_separator.d.ts.map} +1 -1
- package/dest/kernel/hints/{scoped_key_validation_request_and_generator.js → scoped_key_validation_request_and_separator.js} +6 -6
- package/dest/kernel/private_circuit_public_inputs.d.ts +6 -6
- package/dest/kernel/private_circuit_public_inputs.js +11 -11
- package/dest/kernel/private_to_public_kernel_circuit_public_inputs.js +2 -2
- package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.js +2 -2
- package/dest/kernel/private_validation_requests.d.ts +3 -3
- package/dest/kernel/private_validation_requests.js +9 -9
- package/dest/keys/derivation.js +8 -8
- package/dest/keys/key_types.d.ts +3 -3
- package/dest/keys/key_types.d.ts.map +1 -1
- package/dest/keys/public_keys.js +2 -2
- package/dest/keys/utils.js +5 -5
- package/dest/logs/private_log.d.ts +2 -2
- package/dest/logs/private_log.d.ts.map +1 -1
- package/dest/p2p/block_proposal.d.ts +1 -1
- package/dest/p2p/block_proposal.d.ts.map +1 -1
- package/dest/p2p/block_proposal.js +1 -3
- package/dest/rollup/checkpoint_header.d.ts +2 -2
- package/dest/rollup/checkpoint_header.js +2 -2
- package/dest/tests/factories.js +10 -10
- package/dest/tx/block_header.js +2 -2
- package/dest/tx/global_variables.d.ts +4 -4
- package/dest/tx/global_variables.d.ts.map +1 -1
- package/dest/tx/protocol_contracts.d.ts +1 -1
- package/dest/tx/protocol_contracts.d.ts.map +1 -1
- package/dest/tx/protocol_contracts.js +2 -2
- package/dest/tx/tx_request.js +2 -2
- package/package.json +9 -9
- package/src/auth_witness/auth_witness.ts +3 -3
- package/src/block/block_data.ts +26 -0
- package/src/block/index.ts +1 -0
- package/src/block/l2_block_source.ts +22 -0
- package/src/checkpoint/checkpoint.ts +5 -3
- package/src/checkpoint/checkpoint_data.ts +51 -0
- package/src/checkpoint/index.ts +1 -0
- package/src/checkpoint/published_checkpoint.ts +3 -1
- package/src/contract/contract_address.ts +4 -4
- package/src/contract/contract_class_id.ts +3 -3
- package/src/contract/private_function.ts +2 -2
- package/src/file-store/local.ts +15 -5
- package/src/file-store/s3.ts +12 -3
- package/src/hash/hash.ts +11 -11
- package/src/hash/map_slot.ts +2 -2
- package/src/interfaces/archiver.ts +5 -0
- package/src/interfaces/aztec-node-admin.ts +23 -0
- package/src/interfaces/configs.ts +8 -1
- package/src/interfaces/merkle_tree_operations.ts +1 -1
- package/src/kernel/hints/index.ts +2 -2
- package/src/kernel/hints/{key_validation_request_and_generator.ts → key_validation_request_and_separator.ts} +12 -15
- package/src/kernel/hints/{scoped_key_validation_request_and_generator.ts → scoped_key_validation_request_and_separator.ts} +10 -10
- package/src/kernel/private_circuit_public_inputs.ts +10 -10
- package/src/kernel/private_to_public_kernel_circuit_public_inputs.ts +2 -2
- package/src/kernel/private_to_rollup_kernel_circuit_public_inputs.ts +2 -2
- package/src/kernel/private_validation_requests.ts +8 -8
- package/src/keys/derivation.ts +8 -8
- package/src/keys/key_types.ts +6 -2
- package/src/keys/public_keys.ts +2 -2
- package/src/keys/utils.ts +5 -5
- package/src/p2p/block_proposal.ts +0 -2
- package/src/rollup/checkpoint_header.ts +2 -2
- package/src/tests/factories.ts +11 -11
- package/src/tx/block_header.ts +2 -2
- package/src/tx/global_variables.ts +3 -3
- package/src/tx/protocol_contracts.ts +2 -2
- package/src/tx/tx_request.ts +2 -2
- package/dest/kernel/hints/key_validation_request_and_generator.d.ts +0 -30
- package/dest/kernel/hints/key_validation_request_and_generator.d.ts.map +0 -1
package/src/hash/hash.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator, NULL_MSG_SENDER_CONTRACT_ADDRESS } from '@aztec/constants';
|
|
2
2
|
import { poseidon2Hash, poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
3
3
|
import { sha256ToField } from '@aztec/foundation/crypto/sha256';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
@@ -23,7 +23,7 @@ export async function hashVK(keyAsFields: Fr[]): Promise<Fr> {
|
|
|
23
23
|
* @returns A note hash nonce.
|
|
24
24
|
*/
|
|
25
25
|
export function computeNoteHashNonce(nullifierZero: Fr, noteHashIndex: number): Promise<Fr> {
|
|
26
|
-
return poseidon2HashWithSeparator([nullifierZero, noteHashIndex],
|
|
26
|
+
return poseidon2HashWithSeparator([nullifierZero, noteHashIndex], DomainSeparator.NOTE_HASH_NONCE);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
@@ -34,7 +34,7 @@ export function computeNoteHashNonce(nullifierZero: Fr, noteHashIndex: number):
|
|
|
34
34
|
* @returns A siloed note hash.
|
|
35
35
|
*/
|
|
36
36
|
export function siloNoteHash(contract: AztecAddress, noteHash: Fr): Promise<Fr> {
|
|
37
|
-
return poseidon2HashWithSeparator([contract, noteHash],
|
|
37
|
+
return poseidon2HashWithSeparator([contract, noteHash], DomainSeparator.SILOED_NOTE_HASH);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -44,7 +44,7 @@ export function siloNoteHash(contract: AztecAddress, noteHash: Fr): Promise<Fr>
|
|
|
44
44
|
* @returns A unique note hash.
|
|
45
45
|
*/
|
|
46
46
|
export function computeUniqueNoteHash(noteNonce: Fr, siloedNoteHash: Fr): Promise<Fr> {
|
|
47
|
-
return poseidon2HashWithSeparator([noteNonce, siloedNoteHash],
|
|
47
|
+
return poseidon2HashWithSeparator([noteNonce, siloedNoteHash], DomainSeparator.UNIQUE_NOTE_HASH);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/**
|
|
@@ -55,7 +55,7 @@ export function computeUniqueNoteHash(noteNonce: Fr, siloedNoteHash: Fr): Promis
|
|
|
55
55
|
* @returns A siloed nullifier.
|
|
56
56
|
*/
|
|
57
57
|
export function siloNullifier(contract: AztecAddress, innerNullifier: Fr): Promise<Fr> {
|
|
58
|
-
return poseidon2HashWithSeparator([contract, innerNullifier],
|
|
58
|
+
return poseidon2HashWithSeparator([contract, innerNullifier], DomainSeparator.SILOED_NULLIFIER);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
@@ -70,7 +70,7 @@ export function computeProtocolNullifier(txRequestHash: Fr): Promise<Fr> {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
export function computeSiloedPrivateLogFirstField(contract: AztecAddress, field: Fr): Promise<Fr> {
|
|
73
|
-
return poseidon2HashWithSeparator([contract, field],
|
|
73
|
+
return poseidon2HashWithSeparator([contract, field], DomainSeparator.PRIVATE_LOG_FIRST_FIELD);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/**
|
|
@@ -91,7 +91,7 @@ export function computePublicDataTreeValue(value: Fr): Fr {
|
|
|
91
91
|
|
|
92
92
|
*/
|
|
93
93
|
export function computePublicDataTreeLeafSlot(contractAddress: AztecAddress, storageSlot: Fr): Promise<Fr> {
|
|
94
|
-
return poseidon2HashWithSeparator([contractAddress, storageSlot],
|
|
94
|
+
return poseidon2HashWithSeparator([contractAddress, storageSlot], DomainSeparator.PUBLIC_LEAF_SLOT);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
/**
|
|
@@ -105,7 +105,7 @@ export function computeVarArgsHash(args: Fr[]): Promise<Fr> {
|
|
|
105
105
|
return Promise.resolve(Fr.ZERO);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
return poseidon2HashWithSeparator(args,
|
|
108
|
+
return poseidon2HashWithSeparator(args, DomainSeparator.FUNCTION_ARGS);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
@@ -114,7 +114,7 @@ export function computeVarArgsHash(args: Fr[]): Promise<Fr> {
|
|
|
114
114
|
* @returns Hash of the calldata.
|
|
115
115
|
*/
|
|
116
116
|
export function computeCalldataHash(calldata: Fr[]): Promise<Fr> {
|
|
117
|
-
return poseidon2HashWithSeparator(calldata,
|
|
117
|
+
return poseidon2HashWithSeparator(calldata, DomainSeparator.PUBLIC_CALLDATA);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
/**
|
|
@@ -124,13 +124,13 @@ export function computeCalldataHash(calldata: Fr[]): Promise<Fr> {
|
|
|
124
124
|
* @returns The hash
|
|
125
125
|
*/
|
|
126
126
|
export function computeSecretHash(secret: Fr): Promise<Fr> {
|
|
127
|
-
return poseidon2HashWithSeparator([secret],
|
|
127
|
+
return poseidon2HashWithSeparator([secret], DomainSeparator.SECRET_HASH);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
export async function computeL1ToL2MessageNullifier(contract: AztecAddress, messageHash: Fr, secret: Fr) {
|
|
131
131
|
const innerMessageNullifier = await poseidon2HashWithSeparator(
|
|
132
132
|
[messageHash, secret],
|
|
133
|
-
|
|
133
|
+
DomainSeparator.MESSAGE_NULLIFIER,
|
|
134
134
|
);
|
|
135
135
|
return siloNullifier(contract, innerMessageNullifier);
|
|
136
136
|
}
|
package/src/hash/map_slot.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator } from '@aztec/constants';
|
|
2
2
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
3
3
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
|
|
@@ -15,5 +15,5 @@ export function deriveStorageSlotInMap(
|
|
|
15
15
|
toField: () => Fr;
|
|
16
16
|
},
|
|
17
17
|
): Promise<Fr> {
|
|
18
|
-
return poseidon2HashWithSeparator([mapSlot, key.toField()],
|
|
18
|
+
return poseidon2HashWithSeparator([mapSlot, key.toField()], DomainSeparator.PUBLIC_STORAGE_MAP_SLOT);
|
|
19
19
|
}
|
|
@@ -4,12 +4,14 @@ import type { ApiSchemaFor } from '@aztec/foundation/schemas';
|
|
|
4
4
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
7
|
+
import { BlockDataSchema } from '../block/block_data.js';
|
|
7
8
|
import { BlockHash } from '../block/block_hash.js';
|
|
8
9
|
import { CheckpointedL2Block } from '../block/checkpointed_l2_block.js';
|
|
9
10
|
import { L2Block } from '../block/l2_block.js';
|
|
10
11
|
import { type L2BlockSource, L2TipsSchema } from '../block/l2_block_source.js';
|
|
11
12
|
import { ValidateCheckpointResultSchema } from '../block/validate_block_result.js';
|
|
12
13
|
import { Checkpoint } from '../checkpoint/checkpoint.js';
|
|
14
|
+
import { CheckpointDataSchema } from '../checkpoint/checkpoint_data.js';
|
|
13
15
|
import { PublishedCheckpoint } from '../checkpoint/published_checkpoint.js';
|
|
14
16
|
import {
|
|
15
17
|
ContractClassPublicSchema,
|
|
@@ -104,6 +106,8 @@ export const ArchiverApiSchema: ApiSchemaFor<ArchiverApi> = {
|
|
|
104
106
|
getCheckpointedBlockByArchive: z.function().args(schemas.Fr).returns(CheckpointedL2Block.schema.optional()),
|
|
105
107
|
getBlockHeaderByHash: z.function().args(BlockHash.schema).returns(BlockHeader.schema.optional()),
|
|
106
108
|
getBlockHeaderByArchive: z.function().args(schemas.Fr).returns(BlockHeader.schema.optional()),
|
|
109
|
+
getBlockData: z.function().args(BlockNumberSchema).returns(BlockDataSchema.optional()),
|
|
110
|
+
getBlockDataByArchive: z.function().args(schemas.Fr).returns(BlockDataSchema.optional()),
|
|
107
111
|
getL2Block: z.function().args(BlockNumberSchema).returns(L2Block.schema.optional()),
|
|
108
112
|
getL2BlockByHash: z.function().args(BlockHash.schema).returns(L2Block.schema.optional()),
|
|
109
113
|
getL2BlockByArchive: z.function().args(schemas.Fr).returns(L2Block.schema.optional()),
|
|
@@ -112,6 +116,7 @@ export const ArchiverApiSchema: ApiSchemaFor<ArchiverApi> = {
|
|
|
112
116
|
getL2SlotNumber: z.function().args().returns(schemas.SlotNumber.optional()),
|
|
113
117
|
getL2EpochNumber: z.function().args().returns(EpochNumberSchema.optional()),
|
|
114
118
|
getCheckpointsForEpoch: z.function().args(EpochNumberSchema).returns(z.array(Checkpoint.schema)),
|
|
119
|
+
getCheckpointsDataForEpoch: z.function().args(EpochNumberSchema).returns(z.array(CheckpointDataSchema)),
|
|
115
120
|
getCheckpointedBlocksForEpoch: z.function().args(EpochNumberSchema).returns(z.array(CheckpointedL2Block.schema)),
|
|
116
121
|
getBlocksForSlot: z.function().args(schemas.SlotNumber).returns(z.array(L2Block.schema)),
|
|
117
122
|
getCheckpointedBlockHeadersForEpoch: z.function().args(EpochNumberSchema).returns(z.array(BlockHeader.schema)),
|
|
@@ -50,6 +50,26 @@ export interface AztecNodeAdmin {
|
|
|
50
50
|
|
|
51
51
|
/** Returns all offenses applicable for the given round. */
|
|
52
52
|
getSlashOffenses(round: bigint | 'all' | 'current'): Promise<Offense[]>;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Reloads keystore configuration from disk.
|
|
56
|
+
*
|
|
57
|
+
* What is updated:
|
|
58
|
+
* - Validator attester keys
|
|
59
|
+
* - Coinbase address per validator
|
|
60
|
+
* - Fee recipient address per validator
|
|
61
|
+
*
|
|
62
|
+
* What is NOT updated (requires node restart):
|
|
63
|
+
* - L1 publisher signers (the funded accounts that send L1 transactions)
|
|
64
|
+
* - Prover keys
|
|
65
|
+
* - HA signer PostgreSQL connections
|
|
66
|
+
*
|
|
67
|
+
* Notes:
|
|
68
|
+
* - New validators must use a publisher key that was already configured at node
|
|
69
|
+
* startup (or omit the publisher field to fall back to the attester key).
|
|
70
|
+
* A validator with an unknown publisher key will cause the reload to be rejected.
|
|
71
|
+
*/
|
|
72
|
+
reloadKeystore(): Promise<void>;
|
|
53
73
|
}
|
|
54
74
|
|
|
55
75
|
// L1 contracts are not mutable via admin updates.
|
|
@@ -88,16 +108,19 @@ export const AztecNodeAdminApiSchema: ApiSchemaFor<AztecNodeAdmin> = {
|
|
|
88
108
|
.function()
|
|
89
109
|
.args(z.union([z.bigint(), z.literal('all'), z.literal('current')]))
|
|
90
110
|
.returns(z.array(OffenseSchema)),
|
|
111
|
+
reloadKeystore: z.function().returns(z.void()),
|
|
91
112
|
};
|
|
92
113
|
|
|
93
114
|
export function createAztecNodeAdminClient(
|
|
94
115
|
url: string,
|
|
95
116
|
versions: Partial<ComponentsVersions> = {},
|
|
96
117
|
fetch = defaultFetch,
|
|
118
|
+
apiKey?: string,
|
|
97
119
|
): AztecNodeAdmin {
|
|
98
120
|
return createSafeJsonRpcClient<AztecNodeAdmin>(url, AztecNodeAdminApiSchema, {
|
|
99
121
|
namespaceMethods: 'nodeAdmin',
|
|
100
122
|
fetch,
|
|
101
123
|
onResponse: getVersioningResponseHandler(versions),
|
|
124
|
+
...(apiKey ? { extraHeaders: { 'x-api-key': apiKey } } : {}),
|
|
102
125
|
});
|
|
103
126
|
}
|
|
@@ -69,6 +69,10 @@ export interface SequencerConfig {
|
|
|
69
69
|
buildCheckpointIfEmpty?: boolean;
|
|
70
70
|
/** Skip pushing proposed blocks to archiver (default: false) */
|
|
71
71
|
skipPushProposedBlocksToArchiver?: boolean;
|
|
72
|
+
/** Minimum number of blocks required for a checkpoint proposal (test only, defaults to undefined = no minimum) */
|
|
73
|
+
minBlocksForCheckpoint?: number;
|
|
74
|
+
/** Skip publishing checkpoint proposals probability (for testing checkpoint prunes only) */
|
|
75
|
+
skipPublishingCheckpointsPercent?: number;
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
export const SequencerConfigSchema = zodFor<SequencerConfig>()(
|
|
@@ -103,6 +107,8 @@ export const SequencerConfigSchema = zodFor<SequencerConfig>()(
|
|
|
103
107
|
blockDurationMs: z.number().positive().optional(),
|
|
104
108
|
buildCheckpointIfEmpty: z.boolean().optional(),
|
|
105
109
|
skipPushProposedBlocksToArchiver: z.boolean().optional(),
|
|
110
|
+
minBlocksForCheckpoint: z.number().positive().optional(),
|
|
111
|
+
skipPublishingCheckpointsPercent: z.number().gte(0).lte(100).optional(),
|
|
106
112
|
}),
|
|
107
113
|
);
|
|
108
114
|
|
|
@@ -117,7 +123,8 @@ type SequencerConfigOptionalKeys =
|
|
|
117
123
|
| 'fakeThrowAfterProcessingTxCount'
|
|
118
124
|
| 'l1PublishingTime'
|
|
119
125
|
| 'txPublicSetupAllowList'
|
|
120
|
-
| 'minValidTxsPerBlock'
|
|
126
|
+
| 'minValidTxsPerBlock'
|
|
127
|
+
| 'minBlocksForCheckpoint';
|
|
121
128
|
|
|
122
129
|
export type ResolvedSequencerConfig = Prettify<
|
|
123
130
|
Required<Omit<SequencerConfig, SequencerConfigOptionalKeys>> & Pick<SequencerConfig, SequencerConfigOptionalKeys>
|
|
@@ -254,7 +254,7 @@ export interface MerkleTreeCheckpointOperations {
|
|
|
254
254
|
export interface MerkleTreeWriteOperations
|
|
255
255
|
extends MerkleTreeReadOperations,
|
|
256
256
|
MerkleTreeCheckpointOperations,
|
|
257
|
-
|
|
257
|
+
AsyncDisposable {
|
|
258
258
|
/**
|
|
259
259
|
* Appends leaves to a given tree.
|
|
260
260
|
* @param treeId - The tree to be updated.
|
|
@@ -6,10 +6,10 @@ export * from './note_hash_read_request_hints.js';
|
|
|
6
6
|
export * from './nullifier_read_request_hints.js';
|
|
7
7
|
export * from './read_request_hints.js';
|
|
8
8
|
export * from './key_validation_hint.js';
|
|
9
|
-
export * from './
|
|
9
|
+
export * from './key_validation_request_and_separator.js';
|
|
10
10
|
export * from './read_request.js';
|
|
11
11
|
export * from './key_validation_request.js';
|
|
12
|
-
export * from './
|
|
12
|
+
export * from './scoped_key_validation_request_and_separator.js';
|
|
13
13
|
export * from './transient_data_squashing_hint.js';
|
|
14
14
|
export * from './private_kernel_reset_hints.js';
|
|
15
15
|
export * from './tree_leaf_read_request.js';
|
|
@@ -5,48 +5,45 @@ import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/
|
|
|
5
5
|
import { KeyValidationRequest } from './key_validation_request.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Request for validating keys used in the app
|
|
8
|
+
* Request for validating keys used in the app, along with a domain separator for the key type.
|
|
9
9
|
*/
|
|
10
|
-
export class
|
|
10
|
+
export class KeyValidationRequestAndSeparator {
|
|
11
11
|
constructor(
|
|
12
12
|
/** The key validation request. */
|
|
13
13
|
public readonly request: KeyValidationRequest,
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
* Note: This generator constrains that a correct key type gets validated in the kernel.
|
|
17
|
-
*/
|
|
18
|
-
public readonly skAppGenerator: Fr,
|
|
14
|
+
/** Domain separator for the key type, used along with sk_m to derive the sk_app stored in the request. */
|
|
15
|
+
public readonly keyTypeDomainSeparator: Fr,
|
|
19
16
|
) {}
|
|
20
17
|
|
|
21
18
|
toBuffer() {
|
|
22
|
-
return serializeToBuffer(this.request, this.
|
|
19
|
+
return serializeToBuffer(this.request, this.keyTypeDomainSeparator);
|
|
23
20
|
}
|
|
24
21
|
|
|
25
22
|
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
26
23
|
const reader = BufferReader.asReader(buffer);
|
|
27
|
-
return new
|
|
24
|
+
return new KeyValidationRequestAndSeparator(reader.readObject(KeyValidationRequest), Fr.fromBuffer(reader));
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
toFields(): Fr[] {
|
|
31
|
-
const fields = [...this.request.toFields(), this.
|
|
28
|
+
const fields = [...this.request.toFields(), this.keyTypeDomainSeparator];
|
|
32
29
|
if (fields.length !== KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH) {
|
|
33
30
|
throw new Error(
|
|
34
|
-
`Invalid number of fields for
|
|
31
|
+
`Invalid number of fields for KeyValidationRequestAndSeparator. Expected ${KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH}, got ${fields.length}`,
|
|
35
32
|
);
|
|
36
33
|
}
|
|
37
34
|
return fields;
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
static fromFields(fields: Fr[] | FieldReader):
|
|
37
|
+
static fromFields(fields: Fr[] | FieldReader): KeyValidationRequestAndSeparator {
|
|
41
38
|
const reader = FieldReader.asReader(fields);
|
|
42
|
-
return new
|
|
39
|
+
return new KeyValidationRequestAndSeparator(KeyValidationRequest.fromFields(reader), reader.readField());
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
isEmpty() {
|
|
46
|
-
return this.request.isEmpty() && this.
|
|
43
|
+
return this.request.isEmpty() && this.keyTypeDomainSeparator.isZero();
|
|
47
44
|
}
|
|
48
45
|
|
|
49
46
|
static empty() {
|
|
50
|
-
return new
|
|
47
|
+
return new KeyValidationRequestAndSeparator(KeyValidationRequest.empty(), Fr.ZERO);
|
|
51
48
|
}
|
|
52
49
|
}
|
|
@@ -3,14 +3,14 @@ import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
3
3
|
import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
4
4
|
|
|
5
5
|
import { AztecAddress } from '../../aztec-address/index.js';
|
|
6
|
-
import {
|
|
6
|
+
import { KeyValidationRequestAndSeparator } from './key_validation_request_and_separator.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Request for validating keys used in the app.
|
|
10
10
|
*/
|
|
11
|
-
export class
|
|
11
|
+
export class ScopedKeyValidationRequestAndSeparator {
|
|
12
12
|
constructor(
|
|
13
|
-
public readonly request:
|
|
13
|
+
public readonly request: KeyValidationRequestAndSeparator,
|
|
14
14
|
public readonly contractAddress: AztecAddress,
|
|
15
15
|
) {}
|
|
16
16
|
|
|
@@ -20,8 +20,8 @@ export class ScopedKeyValidationRequestAndGenerator {
|
|
|
20
20
|
|
|
21
21
|
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
22
22
|
const reader = BufferReader.asReader(buffer);
|
|
23
|
-
return new
|
|
24
|
-
|
|
23
|
+
return new ScopedKeyValidationRequestAndSeparator(
|
|
24
|
+
KeyValidationRequestAndSeparator.fromBuffer(reader),
|
|
25
25
|
AztecAddress.fromBuffer(reader),
|
|
26
26
|
);
|
|
27
27
|
}
|
|
@@ -30,16 +30,16 @@ export class ScopedKeyValidationRequestAndGenerator {
|
|
|
30
30
|
const fields = [...this.request.toFields(), this.contractAddress.toField()];
|
|
31
31
|
if (fields.length !== SCOPED_KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH) {
|
|
32
32
|
throw new Error(
|
|
33
|
-
`Invalid number of fields for
|
|
33
|
+
`Invalid number of fields for ScopedKeyValidationRequestAndSeparator. Expected ${SCOPED_KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH}, got ${fields.length}`,
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
36
|
return fields;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
static fromFields(fields: Fr[] | FieldReader):
|
|
39
|
+
static fromFields(fields: Fr[] | FieldReader): ScopedKeyValidationRequestAndSeparator {
|
|
40
40
|
const reader = FieldReader.asReader(fields);
|
|
41
|
-
return new
|
|
42
|
-
|
|
41
|
+
return new ScopedKeyValidationRequestAndSeparator(
|
|
42
|
+
KeyValidationRequestAndSeparator.fromFields(reader),
|
|
43
43
|
AztecAddress.fromFields(reader),
|
|
44
44
|
);
|
|
45
45
|
}
|
|
@@ -49,6 +49,6 @@ export class ScopedKeyValidationRequestAndGenerator {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
static empty() {
|
|
52
|
-
return new
|
|
52
|
+
return new ScopedKeyValidationRequestAndSeparator(KeyValidationRequestAndSeparator.empty(), AztecAddress.ZERO);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
} from '@aztec/foundation/serialize';
|
|
22
22
|
import type { FieldsOf } from '@aztec/foundation/types';
|
|
23
23
|
|
|
24
|
-
import {
|
|
24
|
+
import { KeyValidationRequestAndSeparator } from '../kernel/hints/key_validation_request_and_separator.js';
|
|
25
25
|
import { CountedLogHash } from '../kernel/log_hash.js';
|
|
26
26
|
import { PrivateCallRequest } from '../kernel/private_call_request.js';
|
|
27
27
|
import { PrivateLogData } from '../kernel/private_log_data.js';
|
|
@@ -106,10 +106,10 @@ export class PrivateCircuitPublicInputs {
|
|
|
106
106
|
*/
|
|
107
107
|
public nullifierReadRequests: ClaimedLengthArray<ScopedReadRequest, typeof MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,
|
|
108
108
|
/**
|
|
109
|
-
* Key validation requests and
|
|
109
|
+
* Key validation requests and separators created by the corresponding function call.
|
|
110
110
|
*/
|
|
111
|
-
public
|
|
112
|
-
|
|
111
|
+
public keyValidationRequestsAndSeparators: ClaimedLengthArray<
|
|
112
|
+
KeyValidationRequestAndSeparator,
|
|
113
113
|
typeof MAX_KEY_VALIDATION_REQUESTS_PER_CALL
|
|
114
114
|
>,
|
|
115
115
|
/**
|
|
@@ -178,7 +178,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
178
178
|
reader.readObject(ClaimedLengthArrayFromBuffer(ScopedReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL)),
|
|
179
179
|
reader.readObject(ClaimedLengthArrayFromBuffer(ScopedReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL)),
|
|
180
180
|
reader.readObject(
|
|
181
|
-
ClaimedLengthArrayFromBuffer(
|
|
181
|
+
ClaimedLengthArrayFromBuffer(KeyValidationRequestAndSeparator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL),
|
|
182
182
|
),
|
|
183
183
|
reader.readObject(ClaimedLengthArrayFromBuffer(PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL)),
|
|
184
184
|
reader.readObject(ClaimedLengthArrayFromBuffer(CountedPublicCallRequest, MAX_ENQUEUED_CALLS_PER_CALL)),
|
|
@@ -209,7 +209,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
209
209
|
reader.readObject(ClaimedLengthArrayFromFields(ScopedReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL)),
|
|
210
210
|
reader.readObject(ClaimedLengthArrayFromFields(ScopedReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL)),
|
|
211
211
|
reader.readObject(
|
|
212
|
-
ClaimedLengthArrayFromFields(
|
|
212
|
+
ClaimedLengthArrayFromFields(KeyValidationRequestAndSeparator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL),
|
|
213
213
|
),
|
|
214
214
|
reader.readObject(ClaimedLengthArrayFromFields(PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL)),
|
|
215
215
|
reader.readObject(ClaimedLengthArrayFromFields(CountedPublicCallRequest, MAX_ENQUEUED_CALLS_PER_CALL)),
|
|
@@ -242,7 +242,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
242
242
|
Fr.ZERO,
|
|
243
243
|
ClaimedLengthArray.empty(ScopedReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL),
|
|
244
244
|
ClaimedLengthArray.empty(ScopedReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL),
|
|
245
|
-
ClaimedLengthArray.empty(
|
|
245
|
+
ClaimedLengthArray.empty(KeyValidationRequestAndSeparator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL),
|
|
246
246
|
ClaimedLengthArray.empty(PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL),
|
|
247
247
|
ClaimedLengthArray.empty(CountedPublicCallRequest, MAX_ENQUEUED_CALLS_PER_CALL),
|
|
248
248
|
PublicCallRequest.empty(),
|
|
@@ -270,7 +270,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
270
270
|
this.expectedRevertibleSideEffectCounter.isZero() &&
|
|
271
271
|
this.noteHashReadRequests.isEmpty() &&
|
|
272
272
|
this.nullifierReadRequests.isEmpty() &&
|
|
273
|
-
this.
|
|
273
|
+
this.keyValidationRequestsAndSeparators.isEmpty() &&
|
|
274
274
|
this.privateCallRequests.isEmpty() &&
|
|
275
275
|
this.publicCallRequests.isEmpty() &&
|
|
276
276
|
this.publicTeardownCallRequest.isEmpty() &&
|
|
@@ -303,7 +303,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
303
303
|
fields.expectedRevertibleSideEffectCounter,
|
|
304
304
|
fields.noteHashReadRequests,
|
|
305
305
|
fields.nullifierReadRequests,
|
|
306
|
-
fields.
|
|
306
|
+
fields.keyValidationRequestsAndSeparators,
|
|
307
307
|
fields.privateCallRequests,
|
|
308
308
|
fields.publicCallRequests,
|
|
309
309
|
fields.publicTeardownCallRequest,
|
|
@@ -337,7 +337,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
337
337
|
this.expectedRevertibleSideEffectCounter,
|
|
338
338
|
this.noteHashReadRequests,
|
|
339
339
|
this.nullifierReadRequests,
|
|
340
|
-
this.
|
|
340
|
+
this.keyValidationRequestsAndSeparators,
|
|
341
341
|
this.privateCallRequests,
|
|
342
342
|
this.publicCallRequests,
|
|
343
343
|
this.publicTeardownCallRequest,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator, PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH } from '@aztec/constants';
|
|
2
2
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
3
3
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import { bufferSchemaFor } from '@aztec/foundation/schemas';
|
|
@@ -92,7 +92,7 @@ export class PrivateToPublicKernelCircuitPublicInputs {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
hash() {
|
|
95
|
-
return poseidon2HashWithSeparator(this.toFields(),
|
|
95
|
+
return poseidon2HashWithSeparator(this.toFields(), DomainSeparator.PUBLIC_TX_HASH);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
toJSON() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator, PRIVATE_TO_ROLLUP_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH } from '@aztec/constants';
|
|
2
2
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
3
3
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import { bufferSchemaFor } from '@aztec/foundation/schemas';
|
|
@@ -113,6 +113,6 @@ export class PrivateToRollupKernelCircuitPublicInputs {
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
hash() {
|
|
116
|
-
return poseidon2HashWithSeparator(this.toFields(),
|
|
116
|
+
return poseidon2HashWithSeparator(this.toFields(), DomainSeparator.PRIVATE_TX_HASH);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -8,7 +8,7 @@ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
|
|
|
8
8
|
|
|
9
9
|
import { inspect } from 'util';
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { ScopedKeyValidationRequestAndSeparator } from '../kernel/hints/scoped_key_validation_request_and_separator.js';
|
|
12
12
|
import { ClaimedLengthArray, ClaimedLengthArrayFromBuffer } from './claimed_length_array.js';
|
|
13
13
|
import { ScopedReadRequest } from './hints/read_request.js';
|
|
14
14
|
|
|
@@ -28,8 +28,8 @@ export class PrivateValidationRequests {
|
|
|
28
28
|
/**
|
|
29
29
|
* All the key validation requests made in this transaction.
|
|
30
30
|
*/
|
|
31
|
-
public
|
|
32
|
-
|
|
31
|
+
public scopedKeyValidationRequestsAndSeparators: ClaimedLengthArray<
|
|
32
|
+
ScopedKeyValidationRequestAndSeparator,
|
|
33
33
|
typeof MAX_KEY_VALIDATION_REQUESTS_PER_TX
|
|
34
34
|
>,
|
|
35
35
|
) {}
|
|
@@ -38,7 +38,7 @@ export class PrivateValidationRequests {
|
|
|
38
38
|
return (
|
|
39
39
|
this.noteHashReadRequests.getSize() +
|
|
40
40
|
this.nullifierReadRequests.getSize() +
|
|
41
|
-
this.
|
|
41
|
+
this.scopedKeyValidationRequestsAndSeparators.getSize()
|
|
42
42
|
);
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -46,7 +46,7 @@ export class PrivateValidationRequests {
|
|
|
46
46
|
return serializeToBuffer(
|
|
47
47
|
this.noteHashReadRequests,
|
|
48
48
|
this.nullifierReadRequests,
|
|
49
|
-
this.
|
|
49
|
+
this.scopedKeyValidationRequestsAndSeparators,
|
|
50
50
|
);
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -65,7 +65,7 @@ export class PrivateValidationRequests {
|
|
|
65
65
|
reader.readObject(ClaimedLengthArrayFromBuffer(ScopedReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_TX)),
|
|
66
66
|
reader.readObject(ClaimedLengthArrayFromBuffer(ScopedReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_TX)),
|
|
67
67
|
reader.readObject(
|
|
68
|
-
ClaimedLengthArrayFromBuffer(
|
|
68
|
+
ClaimedLengthArrayFromBuffer(ScopedKeyValidationRequestAndSeparator, MAX_KEY_VALIDATION_REQUESTS_PER_TX),
|
|
69
69
|
),
|
|
70
70
|
);
|
|
71
71
|
}
|
|
@@ -83,7 +83,7 @@ export class PrivateValidationRequests {
|
|
|
83
83
|
return new PrivateValidationRequests(
|
|
84
84
|
ClaimedLengthArray.empty(ScopedReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_TX),
|
|
85
85
|
ClaimedLengthArray.empty(ScopedReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_TX),
|
|
86
|
-
ClaimedLengthArray.empty(
|
|
86
|
+
ClaimedLengthArray.empty(ScopedKeyValidationRequestAndSeparator, MAX_KEY_VALIDATION_REQUESTS_PER_TX),
|
|
87
87
|
);
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -91,7 +91,7 @@ export class PrivateValidationRequests {
|
|
|
91
91
|
return `PrivateValidationRequests {
|
|
92
92
|
noteHashReadRequests: ${inspect(this.noteHashReadRequests)},
|
|
93
93
|
nullifierReadRequests: ${inspect(this.nullifierReadRequests)},
|
|
94
|
-
|
|
94
|
+
scopedKeyValidationRequestsAndSeparators: ${inspect(this.scopedKeyValidationRequestsAndSeparators)},
|
|
95
95
|
`;
|
|
96
96
|
}
|
|
97
97
|
}
|
package/src/keys/derivation.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator } from '@aztec/constants';
|
|
2
2
|
import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
|
|
3
3
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
4
4
|
import { sha512ToGrumpkinScalar } from '@aztec/foundation/crypto/sha512';
|
|
@@ -27,29 +27,29 @@ export async function computeOvskApp(ovsk: GrumpkinScalar, app: AztecAddress): P
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export function deriveMasterNullifierHidingKey(secretKey: Fr): GrumpkinScalar {
|
|
30
|
-
return sha512ToGrumpkinScalar([secretKey,
|
|
30
|
+
return sha512ToGrumpkinScalar([secretKey, DomainSeparator.NHK_M]);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export function deriveMasterIncomingViewingSecretKey(secretKey: Fr): GrumpkinScalar {
|
|
34
|
-
return sha512ToGrumpkinScalar([secretKey,
|
|
34
|
+
return sha512ToGrumpkinScalar([secretKey, DomainSeparator.IVSK_M]);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export function deriveMasterOutgoingViewingSecretKey(secretKey: Fr): GrumpkinScalar {
|
|
38
|
-
return sha512ToGrumpkinScalar([secretKey,
|
|
38
|
+
return sha512ToGrumpkinScalar([secretKey, DomainSeparator.OVSK_M]);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export function deriveSigningKey(secretKey: Fr): GrumpkinScalar {
|
|
42
42
|
// TODO(#5837): come up with a standard signing key derivation scheme instead of using ivsk_m as signing keys here
|
|
43
|
-
return sha512ToGrumpkinScalar([secretKey,
|
|
43
|
+
return sha512ToGrumpkinScalar([secretKey, DomainSeparator.IVSK_M]);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
export function computePreaddress(publicKeysHash: Fr, partialAddress: Fr) {
|
|
47
|
-
return poseidon2HashWithSeparator([publicKeysHash, partialAddress],
|
|
47
|
+
return poseidon2HashWithSeparator([publicKeysHash, partialAddress], DomainSeparator.CONTRACT_ADDRESS_V1);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export async function computeAddress(publicKeys: PublicKeys, partialAddress: Fr): Promise<AztecAddress> {
|
|
51
51
|
// Given public keys and a partial address, we can compute our address in the following steps.
|
|
52
|
-
// 1. preaddress = poseidon2([publicKeysHash, partialAddress],
|
|
52
|
+
// 1. preaddress = poseidon2([publicKeysHash, partialAddress], DomainSeparator.CONTRACT_ADDRESS_V1);
|
|
53
53
|
// 2. addressPoint = (preaddress * G) + ivpk_m
|
|
54
54
|
// 3. address = addressPoint.x
|
|
55
55
|
const preaddress = await computePreaddress(await publicKeys.hash(), partialAddress);
|
|
@@ -98,7 +98,7 @@ export async function deriveKeys(secretKey: Fr) {
|
|
|
98
98
|
const masterNullifierHidingKey = deriveMasterNullifierHidingKey(secretKey);
|
|
99
99
|
const masterIncomingViewingSecretKey = deriveMasterIncomingViewingSecretKey(secretKey);
|
|
100
100
|
const masterOutgoingViewingSecretKey = deriveMasterOutgoingViewingSecretKey(secretKey);
|
|
101
|
-
const masterTaggingSecretKey = sha512ToGrumpkinScalar([secretKey,
|
|
101
|
+
const masterTaggingSecretKey = sha512ToGrumpkinScalar([secretKey, DomainSeparator.TSK_M]);
|
|
102
102
|
|
|
103
103
|
// Then we derive master public keys
|
|
104
104
|
const masterNullifierPublicKey = await derivePublicKeyFromSecretKey(masterNullifierHidingKey);
|
package/src/keys/key_types.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DomainSeparator } from '@aztec/constants';
|
|
2
2
|
|
|
3
|
-
export type KeyGenerator =
|
|
3
|
+
export type KeyGenerator =
|
|
4
|
+
| DomainSeparator.NHK_M
|
|
5
|
+
| DomainSeparator.IVSK_M
|
|
6
|
+
| DomainSeparator.OVSK_M
|
|
7
|
+
| DomainSeparator.TSK_M;
|
|
4
8
|
export type KeyPrefix = 'n' | 'iv' | 'ov' | 't';
|
|
5
9
|
export const KEY_PREFIXES: KeyPrefix[] = ['n', 'iv', 'ov', 't'];
|
package/src/keys/public_keys.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
DEFAULT_OVPK_M_Y,
|
|
8
8
|
DEFAULT_TPK_M_X,
|
|
9
9
|
DEFAULT_TPK_M_Y,
|
|
10
|
-
|
|
10
|
+
DomainSeparator,
|
|
11
11
|
} from '@aztec/constants';
|
|
12
12
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
13
13
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
@@ -82,7 +82,7 @@ export class PublicKeys {
|
|
|
82
82
|
this.masterOutgoingViewingPublicKey,
|
|
83
83
|
this.masterTaggingPublicKey,
|
|
84
84
|
],
|
|
85
|
-
|
|
85
|
+
DomainSeparator.PUBLIC_KEYS_HASH,
|
|
86
86
|
);
|
|
87
87
|
}
|
|
88
88
|
|
package/src/keys/utils.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator } from '@aztec/constants';
|
|
2
2
|
|
|
3
3
|
import type { KeyGenerator, KeyPrefix } from './key_types.js';
|
|
4
4
|
|
|
5
5
|
export function getKeyGenerator(prefix: KeyPrefix): KeyGenerator {
|
|
6
6
|
const map: Record<KeyPrefix, KeyGenerator> = {
|
|
7
|
-
n:
|
|
8
|
-
iv:
|
|
9
|
-
ov:
|
|
10
|
-
t:
|
|
7
|
+
n: DomainSeparator.NHK_M,
|
|
8
|
+
iv: DomainSeparator.IVSK_M,
|
|
9
|
+
ov: DomainSeparator.OVSK_M,
|
|
10
|
+
t: DomainSeparator.TSK_M,
|
|
11
11
|
};
|
|
12
12
|
return map[prefix];
|
|
13
13
|
}
|
|
@@ -56,8 +56,6 @@ export class BlockProposal extends Gossipable {
|
|
|
56
56
|
/** The per-block header containing block state and global variables */
|
|
57
57
|
public readonly blockHeader: BlockHeader,
|
|
58
58
|
|
|
59
|
-
// TODO(palla/mbps): Is this really needed? Can we just derive it from the indexWithinCheckpoint of the parent block and the slot number?
|
|
60
|
-
// See the block-proposal-handler, we have a lot of extra validations to check this is correct, so maybe we can avoid storing it here.
|
|
61
59
|
/** Index of this block within the checkpoint (0-indexed) */
|
|
62
60
|
public readonly indexWithinCheckpoint: IndexWithinCheckpoint,
|
|
63
61
|
|