@aztec/foundation 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5a9928
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/array/sorted_array.d.ts +6 -1
- package/dest/array/sorted_array.d.ts.map +1 -1
- package/dest/array/sorted_array.js +18 -15
- package/dest/bigint-buffer/index.d.ts +1 -1
- package/dest/bigint-buffer/index.d.ts.map +1 -1
- package/dest/bigint-buffer/index.js +6 -1
- package/dest/branded-types/block_number.d.ts +3 -3
- package/dest/branded-types/block_number.d.ts.map +1 -1
- package/dest/branded-types/block_number.js +15 -4
- package/dest/branded-types/buffer32_hash.d.ts +27 -0
- package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
- package/dest/branded-types/buffer32_hash.js +12 -0
- package/dest/branded-types/checkpoint_number.d.ts +9 -3
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
- package/dest/branded-types/checkpoint_number.js +11 -0
- package/dest/branded-types/epoch.d.ts +2 -2
- package/dest/branded-types/epoch.d.ts.map +1 -1
- package/dest/branded-types/index.d.ts +2 -1
- package/dest/branded-types/index.d.ts.map +1 -1
- package/dest/branded-types/index.js +1 -0
- package/dest/branded-types/index_within_checkpoint.d.ts +2 -2
- package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -1
- package/dest/branded-types/slot.d.ts +5 -2
- package/dest/branded-types/slot.d.ts.map +1 -1
- package/dest/branded-types/slot.js +3 -0
- package/dest/buffer/buffer16.d.ts +3 -1
- package/dest/buffer/buffer16.d.ts.map +1 -1
- package/dest/buffer/buffer32.d.ts +28 -61
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +29 -63
- package/dest/buffer/index.d.ts +2 -1
- package/dest/buffer/index.d.ts.map +1 -1
- package/dest/buffer/index.js +1 -0
- package/dest/buffer/utils.d.ts +3 -0
- package/dest/buffer/utils.d.ts.map +1 -0
- package/dest/buffer/utils.js +7 -0
- package/dest/collection/array.d.ts +11 -1
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +33 -0
- package/dest/collection/index.d.ts +3 -1
- package/dest/collection/index.d.ts.map +1 -1
- package/dest/collection/index.js +2 -0
- package/dest/collection/lru_map.d.ts +41 -0
- package/dest/collection/lru_map.d.ts.map +1 -0
- package/dest/collection/lru_map.js +119 -0
- package/dest/collection/lru_set.d.ts +35 -0
- package/dest/collection/lru_set.d.ts.map +1 -0
- package/dest/collection/lru_set.js +95 -0
- package/dest/committable/committable.js +1 -1
- package/dest/config/env_var.d.ts +2 -2
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/config/index.d.ts +67 -37
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +86 -70
- package/dest/config/network_config.d.ts +15 -41
- package/dest/config/network_config.d.ts.map +1 -1
- package/dest/config/network_config.js +4 -1
- package/dest/config/network_name.d.ts +2 -2
- package/dest/config/network_name.d.ts.map +1 -1
- package/dest/config/network_name.js +3 -3
- package/dest/config/secret_value.d.ts +2 -2
- package/dest/config/secret_value.d.ts.map +1 -1
- package/dest/crypto/aes128/index.d.ts +2 -1
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +11 -2
- package/dest/crypto/bls/bn254_keystore.d.ts +10 -177
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
- package/dest/crypto/bls/bn254_keystore.js +22 -34
- package/dest/crypto/poseidon/index.d.ts +1 -1
- package/dest/crypto/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.js +40 -33
- package/dest/crypto/schnorr/index.d.ts +8 -7
- package/dest/crypto/schnorr/index.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.js +6 -6
- package/dest/crypto/schnorr/signature.d.ts +9 -29
- package/dest/crypto/schnorr/signature.d.ts.map +1 -1
- package/dest/crypto/schnorr/signature.js +20 -36
- package/dest/crypto/secp256k1-signer/utils.d.ts +12 -1
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
- package/dest/crypto/secp256k1-signer/utils.js +26 -0
- package/dest/curves/bls12/field.d.ts +3 -3
- package/dest/curves/bls12/field.d.ts.map +1 -1
- package/dest/curves/bls12/field.js +0 -5
- package/dest/curves/bls12/point.d.ts +2 -2
- package/dest/curves/bls12/point.d.ts.map +1 -1
- package/dest/curves/bn254/field.d.ts +24 -19
- package/dest/curves/bn254/field.d.ts.map +1 -1
- package/dest/curves/bn254/field.js +28 -19
- package/dest/curves/grumpkin/point.d.ts +14 -28
- package/dest/curves/grumpkin/point.d.ts.map +1 -1
- package/dest/curves/grumpkin/point.js +29 -43
- package/dest/eth-address/index.d.ts +2 -2
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +0 -3
- package/dest/eth-signature/eth_signature.d.ts +3 -2
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/eth-signature/eth_signature.js +7 -2
- package/dest/fifo/fifo_frame_reader.d.ts +41 -0
- package/dest/fifo/fifo_frame_reader.d.ts.map +1 -0
- package/dest/fifo/fifo_frame_reader.js +74 -0
- package/dest/fifo/index.d.ts +2 -0
- package/dest/fifo/index.d.ts.map +1 -0
- package/dest/fifo/index.js +1 -0
- package/dest/fifo_set/fifo_set.d.ts +15 -0
- package/dest/fifo_set/fifo_set.d.ts.map +1 -0
- package/dest/fifo_set/fifo_set.js +39 -0
- package/dest/fifo_set/index.d.ts +2 -0
- package/dest/fifo_set/index.d.ts.map +1 -0
- package/dest/fifo_set/index.js +1 -0
- package/dest/iterable/first.d.ts +8 -0
- package/dest/iterable/first.d.ts.map +1 -0
- package/dest/iterable/first.js +11 -0
- package/dest/iterable/index.d.ts +2 -1
- package/dest/iterable/index.d.ts.map +1 -1
- package/dest/iterable/index.js +1 -0
- package/dest/jest/setup.js +24 -0
- package/dest/json-rpc/client/fetch.d.ts +8 -3
- package/dest/json-rpc/client/fetch.d.ts.map +1 -1
- package/dest/json-rpc/client/fetch.js +11 -7
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +2 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.js +3 -3
- package/dest/json-rpc/client/undici.d.ts +14 -3
- package/dest/json-rpc/client/undici.d.ts.map +1 -1
- package/dest/json-rpc/client/undici.js +47 -14
- package/dest/json-rpc/fixtures/test_state.d.ts +4 -8
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/test_state.js +57 -17
- package/dest/json-rpc/server/api_key_auth.d.ts +19 -0
- package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
- package/dest/json-rpc/server/api_key_auth.js +57 -0
- package/dest/json-rpc/server/index.d.ts +2 -1
- package/dest/json-rpc/server/index.d.ts.map +1 -1
- package/dest/json-rpc/server/index.js +1 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +49 -11
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.js +159 -40
- package/dest/log/aws-logger-config.d.ts +8 -0
- package/dest/log/aws-logger-config.d.ts.map +1 -0
- package/dest/log/aws-logger-config.js +55 -0
- package/dest/log/bigint-utils.d.ts +5 -0
- package/dest/log/bigint-utils.d.ts.map +1 -0
- package/dest/log/bigint-utils.js +21 -0
- package/dest/log/gcloud-logger-config.d.ts +1 -1
- package/dest/log/gcloud-logger-config.d.ts.map +1 -1
- package/dest/log/gcloud-logger-config.js +3 -0
- package/dest/log/pino-logger.d.ts +1 -1
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +31 -6
- package/dest/noir/noir_package_config.d.ts +19 -104
- package/dest/noir/noir_package_config.d.ts.map +1 -1
- package/dest/noir/noir_package_config.js +1 -1
- package/dest/promise/running-promise.d.ts +8 -2
- package/dest/promise/running-promise.d.ts.map +1 -1
- package/dest/promise/running-promise.js +17 -5
- package/dest/promise/utils.d.ts +14 -1
- package/dest/promise/utils.d.ts.map +1 -1
- package/dest/promise/utils.js +20 -0
- package/dest/queue/base_memory_queue.d.ts +2 -2
- package/dest/queue/base_memory_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.d.ts +1 -1
- package/dest/queue/batch_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.js +1 -0
- package/dest/retry/index.d.ts +31 -3
- package/dest/retry/index.d.ts.map +1 -1
- package/dest/retry/index.js +44 -2
- package/dest/schemas/api.d.ts +12 -10
- package/dest/schemas/api.d.ts.map +1 -1
- package/dest/schemas/api.js +7 -1
- package/dest/schemas/parse.d.ts +4 -4
- package/dest/schemas/parse.d.ts.map +1 -1
- package/dest/schemas/parse.js +6 -5
- package/dest/schemas/schemas.d.ts +15 -15
- package/dest/schemas/types.d.ts +3 -3
- package/dest/schemas/types.d.ts.map +1 -1
- package/dest/schemas/utils.d.ts +7 -11
- package/dest/schemas/utils.d.ts.map +1 -1
- package/dest/schemas/utils.js +2 -18
- package/dest/serialize/buffer_reader.d.ts +8 -1
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.js +18 -0
- package/dest/serialize/buffer_sink.d.ts +134 -0
- package/dest/serialize/buffer_sink.d.ts.map +1 -0
- package/dest/serialize/buffer_sink.js +297 -0
- package/dest/serialize/index.d.ts +2 -1
- package/dest/serialize/index.d.ts.map +1 -1
- package/dest/serialize/index.js +1 -0
- package/dest/serialize/serialize.d.ts +19 -32
- package/dest/serialize/serialize.d.ts.map +1 -1
- package/dest/serialize/serialize.js +31 -21
- package/dest/sleep/index.d.ts +2 -1
- package/dest/sleep/index.d.ts.map +1 -1
- package/dest/sleep/index.js +10 -1
- package/dest/string/index.js +1 -1
- package/dest/testing/files/index.d.ts +2 -3
- package/dest/testing/files/index.d.ts.map +1 -1
- package/dest/testing/files/index.js +1 -2
- package/dest/timer/date.d.ts +3 -1
- package/dest/timer/date.d.ts.map +1 -1
- package/dest/timer/date.js +4 -0
- package/dest/timer/index.d.ts +2 -2
- package/dest/timer/index.d.ts.map +1 -1
- package/dest/timer/index.js +1 -1
- package/dest/timer/timeout.d.ts +3 -1
- package/dest/timer/timeout.d.ts.map +1 -1
- package/dest/timer/timeout.js +26 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +11 -2
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -1
- package/dest/transport/index.d.ts +1 -2
- package/dest/transport/index.d.ts.map +1 -1
- package/dest/transport/index.js +0 -1
- package/dest/transport/transport_client.js +2 -2
- package/dest/trees/balanced_merkle_tree_root.d.ts +2 -3
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -1
- package/dest/trees/balanced_merkle_tree_root.js +2 -3
- package/dest/trees/hasher.d.ts +3 -2
- package/dest/trees/hasher.d.ts.map +1 -1
- package/dest/trees/hasher.js +5 -5
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.js +5 -1
- package/dest/trees/membership_witness.d.ts +2 -6
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/membership_witness.js +0 -9
- package/dest/trees/merkle_tree_calculator.d.ts +4 -2
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +1 -5
- package/dest/trees/sibling_path.d.ts +13 -14
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/sibling_path.js +23 -28
- package/dest/trees/unbalanced_merkle_tree_root.d.ts +2 -3
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree_root.js +2 -3
- package/dest/types/index.d.ts +23 -1
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +15 -0
- package/package.json +6 -4
- package/src/array/sorted_array.ts +22 -17
- package/src/bigint-buffer/index.ts +6 -1
- package/src/branded-types/block_number.ts +20 -2
- package/src/branded-types/buffer32_hash.ts +38 -0
- package/src/branded-types/checkpoint_number.ts +16 -1
- package/src/branded-types/epoch.ts +1 -1
- package/src/branded-types/index.ts +1 -0
- package/src/branded-types/index_within_checkpoint.ts +1 -1
- package/src/branded-types/slot.ts +6 -1
- package/src/buffer/buffer16.ts +3 -0
- package/src/buffer/buffer32.ts +39 -68
- package/src/buffer/index.ts +1 -0
- package/src/buffer/utils.ts +8 -0
- package/src/collection/array.ts +34 -0
- package/src/collection/index.ts +2 -0
- package/src/collection/lru_map.ts +143 -0
- package/src/collection/lru_set.ts +115 -0
- package/src/committable/committable.ts +1 -1
- package/src/config/env_var.ts +85 -23
- package/src/config/index.ts +157 -121
- package/src/config/network_config.ts +3 -0
- package/src/config/network_name.ts +6 -6
- package/src/config/secret_value.ts +1 -1
- package/src/crypto/aes128/index.ts +11 -2
- package/src/crypto/bls/bn254_keystore.ts +33 -43
- package/src/crypto/poseidon/index.ts +42 -34
- package/src/crypto/schnorr/index.ts +9 -8
- package/src/crypto/schnorr/signature.ts +17 -46
- package/src/crypto/secp256k1-signer/utils.ts +32 -0
- package/src/curves/bls12/field.ts +0 -7
- package/src/curves/bn254/field.ts +41 -36
- package/src/curves/grumpkin/point.ts +23 -40
- package/src/eth-address/index.ts +0 -4
- package/src/eth-signature/eth_signature.ts +7 -1
- package/src/fifo/fifo_frame_reader.ts +98 -0
- package/src/fifo/index.ts +1 -0
- package/src/fifo_set/fifo_set.ts +52 -0
- package/src/fifo_set/index.ts +1 -0
- package/src/iterable/first.ts +14 -0
- package/src/iterable/index.ts +1 -0
- package/src/jest/setup.mjs +27 -0
- package/src/json-rpc/client/fetch.ts +19 -5
- package/src/json-rpc/client/safe_json_rpc_client.ts +4 -2
- package/src/json-rpc/client/undici.ts +54 -12
- package/src/json-rpc/fixtures/test_state.ts +10 -10
- package/src/json-rpc/server/api_key_auth.ts +63 -0
- package/src/json-rpc/server/index.ts +1 -0
- package/src/json-rpc/server/safe_json_rpc_server.ts +204 -47
- package/src/log/aws-logger-config.ts +32 -0
- package/src/log/bigint-utils.ts +25 -0
- package/src/log/gcloud-logger-config.ts +5 -0
- package/src/log/pino-logger.ts +37 -6
- package/src/noir/noir_package_config.ts +32 -20
- package/src/promise/running-promise.ts +20 -7
- package/src/promise/utils.ts +31 -0
- package/src/queue/base_memory_queue.ts +1 -1
- package/src/queue/batch_queue.ts +1 -0
- package/src/retry/index.ts +66 -4
- package/src/schemas/api.ts +25 -25
- package/src/schemas/parse.ts +9 -6
- package/src/schemas/schemas.ts +4 -4
- package/src/schemas/types.ts +2 -2
- package/src/schemas/utils.ts +4 -38
- package/src/serialize/buffer_reader.ts +20 -0
- package/src/serialize/buffer_sink.ts +350 -0
- package/src/serialize/index.ts +1 -0
- package/src/serialize/serialize.ts +32 -50
- package/src/sleep/index.ts +10 -1
- package/src/string/index.ts +1 -1
- package/src/testing/files/index.ts +1 -2
- package/src/timer/date.ts +6 -0
- package/src/timer/index.ts +1 -1
- package/src/timer/timeout.ts +31 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +11 -1
- package/src/transport/index.ts +0 -1
- package/src/transport/transport_client.ts +2 -2
- package/src/trees/balanced_merkle_tree_root.ts +2 -5
- package/src/trees/hasher.ts +6 -3
- package/src/trees/indexed_merkle_tree_calculator.ts +5 -1
- package/src/trees/membership_witness.ts +0 -8
- package/src/trees/merkle_tree_calculator.ts +4 -10
- package/src/trees/sibling_path.ts +24 -30
- package/src/trees/unbalanced_merkle_tree_root.ts +2 -5
- package/src/types/index.ts +47 -0
- package/dest/crypto/serialize.d.ts +0 -51
- package/dest/crypto/serialize.d.ts.map +0 -1
- package/dest/crypto/serialize.js +0 -68
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +0 -25
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +0 -1
- package/dest/transport/dispatch/create_dispatch_fn.js +0 -17
- package/src/crypto/serialize.ts +0 -85
- package/src/transport/dispatch/create_dispatch_fn.ts +0 -35
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
import { BarretenbergSync } from '@aztec/bb.js';
|
|
1
|
+
import { Barretenberg, BarretenbergSync } from '@aztec/bb.js';
|
|
2
2
|
|
|
3
3
|
import { Fr } from '../../curves/bn254/field.js';
|
|
4
4
|
import { type Fieldable, serializeToFields } from '../../serialize/serialize.js';
|
|
5
5
|
|
|
6
|
+
const IS_BROWSER = typeof self !== 'undefined';
|
|
7
|
+
|
|
8
|
+
async function poseidon2HashFields(inputFields: Fr[]): Promise<Fr> {
|
|
9
|
+
if (IS_BROWSER) {
|
|
10
|
+
await BarretenbergSync.initSingleton();
|
|
11
|
+
const api = BarretenbergSync.getSingleton();
|
|
12
|
+
const response = api.poseidon2Hash({
|
|
13
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
14
|
+
});
|
|
15
|
+
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
16
|
+
} else {
|
|
17
|
+
await Barretenberg.initSingleton();
|
|
18
|
+
const api = Barretenberg.getSingleton();
|
|
19
|
+
const response = await api.poseidon2Hash({
|
|
20
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
21
|
+
});
|
|
22
|
+
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
6
26
|
/**
|
|
7
27
|
* Create a poseidon hash (field) from an array of input fields.
|
|
8
28
|
* @param input - The input fields to hash.
|
|
9
29
|
* @returns The poseidon hash.
|
|
10
30
|
*/
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
await BarretenbergSync.initSingleton();
|
|
14
|
-
const api = BarretenbergSync.getSingleton();
|
|
15
|
-
const response = api.poseidon2Hash({
|
|
16
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
17
|
-
});
|
|
18
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
31
|
+
export function poseidon2Hash(input: Fieldable[]): Promise<Fr> {
|
|
32
|
+
return poseidon2HashFields(serializeToFields(input));
|
|
19
33
|
}
|
|
20
34
|
|
|
21
35
|
/**
|
|
@@ -24,15 +38,10 @@ export async function poseidon2Hash(input: Fieldable[]): Promise<Fr> {
|
|
|
24
38
|
* @param separator - The domain separator.
|
|
25
39
|
* @returns The poseidon hash.
|
|
26
40
|
*/
|
|
27
|
-
export
|
|
41
|
+
export function poseidon2HashWithSeparator(input: Fieldable[], separator: number): Promise<Fr> {
|
|
28
42
|
const inputFields = serializeToFields(input);
|
|
29
43
|
inputFields.unshift(new Fr(separator));
|
|
30
|
-
|
|
31
|
-
const api = BarretenbergSync.getSingleton();
|
|
32
|
-
const response = api.poseidon2Hash({
|
|
33
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
34
|
-
});
|
|
35
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
44
|
+
return poseidon2HashFields(inputFields);
|
|
36
45
|
}
|
|
37
46
|
|
|
38
47
|
/**
|
|
@@ -42,19 +51,24 @@ export async function poseidon2HashWithSeparator(input: Fieldable[], separator:
|
|
|
42
51
|
*/
|
|
43
52
|
export async function poseidon2Permutation(input: Fieldable[]): Promise<Fr[]> {
|
|
44
53
|
const inputFields = serializeToFields(input);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
if (IS_BROWSER) {
|
|
55
|
+
await BarretenbergSync.initSingleton();
|
|
56
|
+
const api = BarretenbergSync.getSingleton();
|
|
57
|
+
const response = api.poseidon2Permutation({
|
|
58
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
59
|
+
});
|
|
60
|
+
return response.outputs.map(o => Fr.fromBuffer(Buffer.from(o)));
|
|
61
|
+
} else {
|
|
62
|
+
await Barretenberg.initSingleton();
|
|
63
|
+
const api = Barretenberg.getSingleton();
|
|
64
|
+
const response = await api.poseidon2Permutation({
|
|
65
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
66
|
+
});
|
|
67
|
+
return response.outputs.map(o => Fr.fromBuffer(Buffer.from(o)));
|
|
68
|
+
}
|
|
55
69
|
}
|
|
56
70
|
|
|
57
|
-
export
|
|
71
|
+
export function poseidon2HashBytes(input: Buffer): Promise<Fr> {
|
|
58
72
|
const inputFields = [];
|
|
59
73
|
for (let i = 0; i < input.length; i += 31) {
|
|
60
74
|
const fieldBytes = Buffer.alloc(32, 0);
|
|
@@ -65,11 +79,5 @@ export async function poseidon2HashBytes(input: Buffer): Promise<Fr> {
|
|
|
65
79
|
inputFields.push(Fr.fromBuffer(fieldBytes));
|
|
66
80
|
}
|
|
67
81
|
|
|
68
|
-
|
|
69
|
-
const api = BarretenbergSync.getSingleton();
|
|
70
|
-
const response = api.poseidon2Hash({
|
|
71
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
82
|
+
return poseidon2HashFields(inputFields);
|
|
75
83
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BarretenbergSync } from '@aztec/bb.js';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import type { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
3
4
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
4
5
|
|
|
@@ -23,33 +24,33 @@ export class Schnorr {
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
|
-
* Constructs a Schnorr signature
|
|
27
|
-
* @param msg -
|
|
27
|
+
* Constructs a Schnorr signature over a 32-byte message field element.
|
|
28
|
+
* @param msg - The message hash, as a grumpkin base field element.
|
|
28
29
|
* @param privateKey - The private key of the signer.
|
|
29
30
|
* @returns A Schnorr signature of the form (s, e).
|
|
30
31
|
*/
|
|
31
|
-
public async constructSignature(msg:
|
|
32
|
+
public async constructSignature(msg: Fr, privateKey: GrumpkinScalar) {
|
|
32
33
|
await BarretenbergSync.initSingleton();
|
|
33
34
|
const api = BarretenbergSync.getSingleton();
|
|
34
35
|
const response = api.schnorrConstructSignature({
|
|
35
|
-
|
|
36
|
+
messageField: msg.toBuffer(),
|
|
36
37
|
privateKey: privateKey.toBuffer(),
|
|
37
38
|
});
|
|
38
39
|
return new SchnorrSignature(Buffer.from([...response.s, ...response.e]));
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
/**
|
|
42
|
-
* Verifies a Schnorr signature
|
|
43
|
-
* @param msg -
|
|
43
|
+
* Verifies a Schnorr signature against a Grumpkin public key.
|
|
44
|
+
* @param msg - The message hash, as a grumpkin base field element.
|
|
44
45
|
* @param pubKey - The Grumpkin public key of the signer.
|
|
45
46
|
* @param sig - The Schnorr signature.
|
|
46
47
|
* @returns True or false.
|
|
47
48
|
*/
|
|
48
|
-
public async verifySignature(msg:
|
|
49
|
+
public async verifySignature(msg: Fr, pubKey: Point, sig: SchnorrSignature) {
|
|
49
50
|
await BarretenbergSync.initSingleton();
|
|
50
51
|
const api = BarretenbergSync.getSingleton();
|
|
51
52
|
const response = api.schnorrVerifySignature({
|
|
52
|
-
|
|
53
|
+
messageField: msg.toBuffer(),
|
|
53
54
|
publicKey: { x: pubKey.x.toBuffer(), y: pubKey.y.toBuffer() },
|
|
54
55
|
s: sig.s,
|
|
55
56
|
e: sig.e,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
2
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import {
|
|
2
|
+
import { mapTuple } from '@aztec/foundation/serialize';
|
|
4
3
|
|
|
5
4
|
import type { Signature } from '../signature/index.js';
|
|
6
5
|
|
|
@@ -14,46 +13,12 @@ export class SchnorrSignature implements Signature {
|
|
|
14
13
|
*/
|
|
15
14
|
public static SIZE = 64;
|
|
16
15
|
|
|
17
|
-
/**
|
|
18
|
-
* An empty signature.
|
|
19
|
-
*/
|
|
20
|
-
public static EMPTY = new SchnorrSignature(Buffer.alloc(64));
|
|
21
|
-
|
|
22
16
|
constructor(private buffer: Buffer) {
|
|
23
17
|
if (buffer.length !== SchnorrSignature.SIZE) {
|
|
24
18
|
throw new Error(`Invalid signature buffer of length ${buffer.length}.`);
|
|
25
19
|
}
|
|
26
20
|
}
|
|
27
21
|
|
|
28
|
-
/**
|
|
29
|
-
* Determines if the provided signature is valid or not.
|
|
30
|
-
* @param signature - The data to be checked.
|
|
31
|
-
* @returns Boolean indicating if the provided data is a valid schnorr signature.
|
|
32
|
-
*/
|
|
33
|
-
public static isSignature(signature: string) {
|
|
34
|
-
return /^(0x)?[0-9a-f]{128}$/i.test(signature);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Constructs a SchnorrSignature from the provided string.
|
|
39
|
-
* @param signature - The string to be converted to a schnorr signature.
|
|
40
|
-
* @returns The constructed schnorr signature.
|
|
41
|
-
*/
|
|
42
|
-
public static fromString(signature: string) {
|
|
43
|
-
if (!SchnorrSignature.isSignature(signature)) {
|
|
44
|
-
throw new Error(`Invalid signature string: ${signature}`);
|
|
45
|
-
}
|
|
46
|
-
return new SchnorrSignature(Buffer.from(signature.replace(/^0x/i, ''), 'hex'));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Generates a random schnorr signature.
|
|
51
|
-
* @returns The randomly constructed signature.
|
|
52
|
-
*/
|
|
53
|
-
public static random() {
|
|
54
|
-
return new SchnorrSignature(randomBytes(64));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
22
|
/**
|
|
58
23
|
* Returns the 's' component of the signature.
|
|
59
24
|
* @returns A buffer containing the signature's 's' component.
|
|
@@ -78,16 +43,6 @@ export class SchnorrSignature implements Signature {
|
|
|
78
43
|
return this.buffer;
|
|
79
44
|
}
|
|
80
45
|
|
|
81
|
-
/**
|
|
82
|
-
* Deserializes from a buffer.
|
|
83
|
-
* @param buffer - The buffer representation of the object.
|
|
84
|
-
* @returns The new object.
|
|
85
|
-
*/
|
|
86
|
-
static fromBuffer(buffer: Buffer | BufferReader): SchnorrSignature {
|
|
87
|
-
const reader = BufferReader.asReader(buffer);
|
|
88
|
-
return new SchnorrSignature(reader.readBytes(SchnorrSignature.SIZE));
|
|
89
|
-
}
|
|
90
|
-
|
|
91
46
|
/**
|
|
92
47
|
* Returns the full signature as a hex string.
|
|
93
48
|
* @returns A string containing the signature in hex format.
|
|
@@ -113,4 +68,20 @@ export class SchnorrSignature implements Signature {
|
|
|
113
68
|
|
|
114
69
|
return mapTuple([buf1, buf2, buf3], Fr.fromBuffer);
|
|
115
70
|
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Splits the signature into the four 128-bit limbs that Noir's `EmbeddedCurveScalar` consumes:
|
|
74
|
+
* `[s.lo, s.hi, e.lo, e.hi]`, where each component scalar is encoded as `lo + hi * 2^128`.
|
|
75
|
+
*
|
|
76
|
+
* Each 32-byte big-endian component is sliced into its top 16 bytes (`hi`) and bottom 16 bytes
|
|
77
|
+
* (`lo`); each half is zero-padded into a 32-byte buffer and decoded as `Fr` (big-endian).
|
|
78
|
+
*/
|
|
79
|
+
toLimbFields(): [Fr, Fr, Fr, Fr] {
|
|
80
|
+
const limb = (start: number) => {
|
|
81
|
+
const buf = Buffer.alloc(32);
|
|
82
|
+
this.buffer.copy(buf, 16, start, start + 16);
|
|
83
|
+
return Fr.fromBuffer(buf);
|
|
84
|
+
};
|
|
85
|
+
return [limb(16), limb(0), limb(48), limb(32)];
|
|
86
|
+
}
|
|
116
87
|
}
|
|
@@ -210,3 +210,35 @@ export function recoverPublicKey(hash: Buffer32, signature: Signature, opts: Rec
|
|
|
210
210
|
const publicKey = sig.recoverPublicKey(hash.buffer).toHex(false);
|
|
211
211
|
return Buffer.from(publicKey, 'hex');
|
|
212
212
|
}
|
|
213
|
+
|
|
214
|
+
/** Arbitrary hash used for testing signature recoverability. */
|
|
215
|
+
const PROBE_HASH = Buffer32.fromBuffer(keccak256(Buffer.from('signature-recoverability-probe')));
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Generates a random valid ECDSA signature that is recoverable to some address.
|
|
219
|
+
* Since Signature.random() produces real signatures via secp256k1 signing, the result is always
|
|
220
|
+
* recoverable, but we verify defensively by checking tryRecoverAddress.
|
|
221
|
+
*/
|
|
222
|
+
export function generateRecoverableSignature(): Signature {
|
|
223
|
+
for (let i = 0; i < 100; i++) {
|
|
224
|
+
const sig = Signature.random();
|
|
225
|
+
if (tryRecoverAddress(PROBE_HASH, sig) !== undefined) {
|
|
226
|
+
return sig;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
throw new Secp256k1Error('Failed to generate a recoverable signature after 100 attempts');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Generates a random signature where ECDSA address recovery fails.
|
|
234
|
+
* Uses random r/s values (not from real signing) so that r is unlikely to be a valid secp256k1 x-coordinate.
|
|
235
|
+
*/
|
|
236
|
+
export function generateUnrecoverableSignature(): Signature {
|
|
237
|
+
for (let i = 0; i < 100; i++) {
|
|
238
|
+
const sig = new Signature(Buffer32.random(), Buffer32.random(), 27);
|
|
239
|
+
if (tryRecoverAddress(PROBE_HASH, sig) === undefined) {
|
|
240
|
+
return sig;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
throw new Secp256k1Error('Failed to generate an unrecoverable signature after 100 attempts');
|
|
244
|
+
}
|
|
@@ -6,7 +6,6 @@ import { toBigIntBE, toBufferBE } from '../../bigint-buffer/index.js';
|
|
|
6
6
|
import { randomBytes } from '../../crypto/random/index.js';
|
|
7
7
|
import { hexSchemaFor } from '../../schemas/utils.js';
|
|
8
8
|
import { BufferReader } from '../../serialize/buffer_reader.js';
|
|
9
|
-
import { TypeRegistry } from '../../serialize/type_registry.js';
|
|
10
9
|
import { Fr } from '../bn254/field.js';
|
|
11
10
|
|
|
12
11
|
/**
|
|
@@ -323,9 +322,6 @@ export class BLS12Fr extends BLS12Field {
|
|
|
323
322
|
}
|
|
324
323
|
}
|
|
325
324
|
|
|
326
|
-
// For deserializing JSON.
|
|
327
|
-
TypeRegistry.register('BLS12Fr', BLS12Fr);
|
|
328
|
-
|
|
329
325
|
/**
|
|
330
326
|
* Fq field class.
|
|
331
327
|
* @dev This class is used to represent elements of BLS12-381 base field.
|
|
@@ -458,6 +454,3 @@ export class BLS12Fq extends BLS12Field {
|
|
|
458
454
|
return hexSchemaFor(BLS12Fq);
|
|
459
455
|
}
|
|
460
456
|
}
|
|
461
|
-
|
|
462
|
-
// For deserializing JSON.
|
|
463
|
-
TypeRegistry.register('BLS12Fq', BLS12Fq);
|
|
@@ -6,9 +6,7 @@ import { toBigIntBE, toBufferBE } from '../../bigint-buffer/index.js';
|
|
|
6
6
|
import { randomBytes } from '../../crypto/random/index.js';
|
|
7
7
|
import { hexSchemaFor } from '../../schemas/utils.js';
|
|
8
8
|
import { BufferReader } from '../../serialize/buffer_reader.js';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
|
|
9
|
+
import type { BufferSink } from '../../serialize/buffer_sink.js';
|
|
12
10
|
|
|
13
11
|
/**
|
|
14
12
|
* Represents a field derived from BaseField.
|
|
@@ -67,10 +65,16 @@ abstract class BaseField {
|
|
|
67
65
|
protected abstract modulus(): bigint;
|
|
68
66
|
|
|
69
67
|
/**
|
|
70
|
-
* Converts the bigint to a Buffer.
|
|
68
|
+
* Converts the bigint to a Buffer. With a sink, streams the 32 big-endian bytes straight in (no allocation)
|
|
69
|
+
* and returns undefined; without one, returns a freshly allocated buffer.
|
|
71
70
|
*/
|
|
72
|
-
toBuffer(): Buffer
|
|
73
|
-
|
|
71
|
+
toBuffer(): Buffer;
|
|
72
|
+
toBuffer(sink: BufferSink): void;
|
|
73
|
+
toBuffer(sink?: BufferSink): Buffer | void {
|
|
74
|
+
if (!sink) {
|
|
75
|
+
return toBufferBE(this.asBigInt, BaseField.SIZE_IN_BYTES);
|
|
76
|
+
}
|
|
77
|
+
sink.writeField(this.asBigInt);
|
|
74
78
|
}
|
|
75
79
|
|
|
76
80
|
toString(): `0x${string}` {
|
|
@@ -118,14 +122,18 @@ abstract class BaseField {
|
|
|
118
122
|
}
|
|
119
123
|
|
|
120
124
|
cmp(rhs: BaseField): -1 | 0 | 1 {
|
|
121
|
-
|
|
122
|
-
return this.asBigInt === rhsBigInt ? 0 : this.asBigInt < rhsBigInt ? -1 : 1;
|
|
125
|
+
return BaseField.cmpAsBigInt(this.asBigInt, rhs.asBigInt);
|
|
123
126
|
}
|
|
124
127
|
|
|
125
128
|
static cmp(lhs: BaseField, rhs: BaseField): -1 | 0 | 1 {
|
|
126
129
|
return lhs.cmp(rhs);
|
|
127
130
|
}
|
|
128
131
|
|
|
132
|
+
// Actual bigint comparison. Arguments must have been validated previously.
|
|
133
|
+
static cmpAsBigInt(lhs: bigint, rhs: bigint): -1 | 0 | 1 {
|
|
134
|
+
return lhs === rhs ? 0 : lhs < rhs ? -1 : 1;
|
|
135
|
+
}
|
|
136
|
+
|
|
129
137
|
isZero(): boolean {
|
|
130
138
|
return this.asBigInt === 0n;
|
|
131
139
|
}
|
|
@@ -183,10 +191,25 @@ function fromHexString<T extends BaseField>(buf: string, f: DerivedField<T>) {
|
|
|
183
191
|
return new f(toBigIntBE(buffer));
|
|
184
192
|
}
|
|
185
193
|
|
|
186
|
-
/**
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
194
|
+
/**
|
|
195
|
+
* Abstract unbranded base class for BN254 scalar field elements.
|
|
196
|
+
* Extend this instead of Fr when defining a branded subtype (e.g. BlockHash)
|
|
197
|
+
* to avoid inheriting Fr's `_branding`.
|
|
198
|
+
*/
|
|
199
|
+
export abstract class BaseFr extends BaseField {
|
|
200
|
+
static MODULUS = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n;
|
|
201
|
+
|
|
202
|
+
constructor(value: number | bigint | boolean | BaseField | Buffer) {
|
|
203
|
+
super(value);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
protected modulus() {
|
|
207
|
+
return BaseFr.MODULUS;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
toJSON() {
|
|
211
|
+
return this.toString();
|
|
212
|
+
}
|
|
190
213
|
}
|
|
191
214
|
|
|
192
215
|
/**
|
|
@@ -194,10 +217,12 @@ export interface Fr {
|
|
|
194
217
|
* @dev This class is used to represent elements of BN254 scalar field or elements in the base field of Grumpkin.
|
|
195
218
|
* (Grumpkin's scalar field corresponds to BN254's base field and vice versa.)
|
|
196
219
|
*/
|
|
197
|
-
export class Fr extends
|
|
220
|
+
export class Fr extends BaseFr {
|
|
221
|
+
/** Branding for nominal typing. */
|
|
222
|
+
declare private readonly _branding: 'Fr';
|
|
223
|
+
static override MODULUS = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n;
|
|
198
224
|
static ZERO = new Fr(0n);
|
|
199
225
|
static ONE = new Fr(1n);
|
|
200
|
-
static MODULUS = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n;
|
|
201
226
|
static MAX_FIELD_VALUE = new Fr(this.MODULUS - 1n);
|
|
202
227
|
|
|
203
228
|
constructor(value: number | bigint | boolean | Fr | Buffer) {
|
|
@@ -208,10 +233,6 @@ export class Fr extends BaseField {
|
|
|
208
233
|
return `Fr<${this.toString()}>`;
|
|
209
234
|
}
|
|
210
235
|
|
|
211
|
-
protected modulus() {
|
|
212
|
-
return Fr.MODULUS;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
236
|
static random() {
|
|
216
237
|
return random(Fr);
|
|
217
238
|
}
|
|
@@ -316,10 +337,6 @@ export class Fr extends BaseField {
|
|
|
316
337
|
return Fr.fromBuffer(Buffer.from(response.value));
|
|
317
338
|
}
|
|
318
339
|
|
|
319
|
-
toJSON() {
|
|
320
|
-
return this.toString();
|
|
321
|
-
}
|
|
322
|
-
|
|
323
340
|
/**
|
|
324
341
|
* Creates an Fr instance from a plain object without Zod validation.
|
|
325
342
|
* This method is optimized for performance and skips validation, making it suitable
|
|
@@ -341,23 +358,14 @@ export class Fr extends BaseField {
|
|
|
341
358
|
}
|
|
342
359
|
}
|
|
343
360
|
|
|
344
|
-
// For deserializing JSON.
|
|
345
|
-
TypeRegistry.register('Fr', Fr);
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Branding to ensure fields are not interchangeable types.
|
|
349
|
-
*/
|
|
350
|
-
export interface Fq {
|
|
351
|
-
/** Brand. */
|
|
352
|
-
_branding: 'Fq';
|
|
353
|
-
}
|
|
354
|
-
|
|
355
361
|
/**
|
|
356
362
|
* Fq field class.
|
|
357
363
|
* @dev This class is used to represent elements of BN254 base field or elements in the scalar field of Grumpkin.
|
|
358
364
|
* (Grumpkin's scalar field corresponds to BN254's base field and vice versa.)
|
|
359
365
|
*/
|
|
360
366
|
export class Fq extends BaseField {
|
|
367
|
+
/** Branding for nominal typing. */
|
|
368
|
+
declare private readonly _branding: 'Fq';
|
|
361
369
|
static ZERO = new Fq(0n);
|
|
362
370
|
static MODULUS = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47n;
|
|
363
371
|
private static HIGH_SHIFT = BigInt((BaseField.SIZE_IN_BYTES / 2) * 8);
|
|
@@ -466,9 +474,6 @@ export class Fq extends BaseField {
|
|
|
466
474
|
}
|
|
467
475
|
}
|
|
468
476
|
|
|
469
|
-
// For deserializing JSON.
|
|
470
|
-
TypeRegistry.register('Fq', Fq);
|
|
471
|
-
|
|
472
477
|
// Beware: Performance bottleneck below
|
|
473
478
|
|
|
474
479
|
/**
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { toBigIntBE } from '../../bigint-buffer/index.js';
|
|
2
|
-
import { poseidon2Hash } from '../../crypto/poseidon/index.js';
|
|
3
2
|
import { randomBoolean } from '../../crypto/random/index.js';
|
|
4
3
|
import { hexSchemaFor } from '../../schemas/utils.js';
|
|
5
4
|
import { BufferReader, FieldReader, serializeToBuffer } from '../../serialize/index.js';
|
|
@@ -13,13 +12,16 @@ import { Fr } from '../bn254/field.js';
|
|
|
13
12
|
* TODO(#7386): Clean up this class.
|
|
14
13
|
*/
|
|
15
14
|
export class Point {
|
|
16
|
-
static
|
|
15
|
+
static INFINITY = new Point(Fr.ZERO, Fr.ZERO);
|
|
17
16
|
static SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * 2;
|
|
18
17
|
static COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
19
18
|
|
|
20
19
|
/** Used to differentiate this class from AztecAddress */
|
|
21
20
|
public readonly kind = 'point';
|
|
22
21
|
|
|
22
|
+
/** Whether the point is at infinity */
|
|
23
|
+
public readonly isInfinite: boolean;
|
|
24
|
+
|
|
23
25
|
constructor(
|
|
24
26
|
/**
|
|
25
27
|
* The point's x coordinate
|
|
@@ -29,12 +31,10 @@ export class Point {
|
|
|
29
31
|
* The point's y coordinate
|
|
30
32
|
*/
|
|
31
33
|
public readonly y: Fr,
|
|
32
|
-
/**
|
|
33
|
-
* Whether the point is at infinity
|
|
34
|
-
*/
|
|
35
|
-
public readonly isInfinite: boolean,
|
|
36
34
|
) {
|
|
37
35
|
// TODO(#7386): check if on curve
|
|
36
|
+
// NOTE: now there is no isInfinite in the struct, empty == inf, so an empty class would pass an on-curve check. This may be fine depending on the usage.
|
|
37
|
+
this.isInfinite = x.isZero() && y.isZero();
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
toJSON() {
|
|
@@ -61,11 +61,11 @@ export class Point {
|
|
|
61
61
|
if (obj instanceof Buffer || Buffer.isBuffer(obj)) {
|
|
62
62
|
return Point.fromBuffer(obj);
|
|
63
63
|
}
|
|
64
|
-
return new
|
|
64
|
+
return new this(Fr.fromPlainObject(obj.x), Fr.fromPlainObject(obj.y));
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
|
-
* Generate a random Point instance.
|
|
68
|
+
* Generate a random Point instance that is on the curve.
|
|
69
69
|
*
|
|
70
70
|
* @returns A randomly generated Point instance.
|
|
71
71
|
*/
|
|
@@ -92,7 +92,7 @@ export class Point {
|
|
|
92
92
|
*/
|
|
93
93
|
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
94
94
|
const reader = BufferReader.asReader(buffer);
|
|
95
|
-
return new this(Fr.fromBuffer(reader), Fr.fromBuffer(reader)
|
|
95
|
+
return new this(Fr.fromBuffer(reader), Fr.fromBuffer(reader));
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
/**
|
|
@@ -129,12 +129,13 @@ export class Point {
|
|
|
129
129
|
* @returns The point as an array of 2 fields
|
|
130
130
|
*/
|
|
131
131
|
toFields() {
|
|
132
|
-
return [this.x, this.y
|
|
132
|
+
return [this.x, this.y];
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
static fromFields(fields: Fr[] | FieldReader) {
|
|
136
136
|
const reader = FieldReader.asReader(fields);
|
|
137
|
-
|
|
137
|
+
const [x, y] = [reader.readField(), reader.readField()];
|
|
138
|
+
return new this(x, y);
|
|
138
139
|
}
|
|
139
140
|
|
|
140
141
|
/**
|
|
@@ -159,11 +160,12 @@ export class Point {
|
|
|
159
160
|
const finalY = sign ? new Fr(yPositiveBigInt) : new Fr(yNegativeBigInt);
|
|
160
161
|
|
|
161
162
|
// Create and return the new Point
|
|
162
|
-
return new this(x, finalY
|
|
163
|
+
return new this(x, finalY);
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
/**
|
|
166
|
-
* @
|
|
167
|
+
* @param x - The x coordinate of the point
|
|
168
|
+
* @returns y^2 such that y^2 = x^3 - 17
|
|
167
169
|
*/
|
|
168
170
|
static YFromX(x: Fr): Promise<Fr | null> {
|
|
169
171
|
// Calculate y^2 = x^3 - 17 (i.e. the Grumpkin curve equation)
|
|
@@ -191,24 +193,15 @@ export class Point {
|
|
|
191
193
|
return {
|
|
192
194
|
x: this.x.toBigInt(),
|
|
193
195
|
y: this.y.toBigInt(),
|
|
194
|
-
isInfinite: this.isInfinite ? 1n : 0n,
|
|
195
196
|
};
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
/**
|
|
199
200
|
* Converts the Point instance to a Buffer representation of the coordinates.
|
|
200
201
|
* @returns A Buffer representation of the Point instance.
|
|
201
|
-
* @dev Note that toBuffer does not include the isInfinite flag
|
|
202
|
-
* This is because currently when we work with point as bytes we don't want to populate the extra bytes for
|
|
203
|
-
* isInfinite flag because:
|
|
204
|
-
* 1. Our Grumpkin BB API currently does not handle point at infinity,
|
|
205
|
-
* 2. we use toBuffer when serializing notes and events and there we only work with public keys and point at infinity
|
|
206
|
-
* is not considered a valid public key and the extra byte would raise DA cost.
|
|
202
|
+
* @dev Note that toBuffer does not include the isInfinite flag. The point at infinity is serialized as (0, 0).
|
|
207
203
|
*/
|
|
208
204
|
toBuffer() {
|
|
209
|
-
if (this.isInfinite) {
|
|
210
|
-
throw new Error('Cannot serialize infinite point with isInfinite flag');
|
|
211
|
-
}
|
|
212
205
|
const buf = serializeToBuffer([this.x, this.y]);
|
|
213
206
|
if (buf.length !== Point.SIZE_IN_BYTES) {
|
|
214
207
|
throw new Error(`Invalid buffer length for Point: ${buf.length}`);
|
|
@@ -258,12 +251,10 @@ export class Point {
|
|
|
258
251
|
}
|
|
259
252
|
|
|
260
253
|
toNoirStruct() {
|
|
261
|
-
|
|
262
|
-
return { x: this.x, y: this.y, is_infinite: this.isInfinite };
|
|
263
|
-
/* eslint-enable camelcase */
|
|
254
|
+
return { x: this.x, y: this.y };
|
|
264
255
|
}
|
|
265
256
|
|
|
266
|
-
// Used for IvpkM
|
|
257
|
+
// Used for IvpkM. TODO(#8124): Consider removing this method.
|
|
267
258
|
toWrappedNoirStruct() {
|
|
268
259
|
return { inner: this.toNoirStruct() };
|
|
269
260
|
}
|
|
@@ -283,21 +274,13 @@ export class Point {
|
|
|
283
274
|
return this.x.isZero() && this.y.isZero();
|
|
284
275
|
}
|
|
285
276
|
|
|
286
|
-
hash() {
|
|
287
|
-
return poseidon2Hash(this.toFields());
|
|
288
|
-
}
|
|
289
|
-
|
|
290
277
|
/**
|
|
291
|
-
*
|
|
292
|
-
*
|
|
278
|
+
* @param x - The x coordinate of the point
|
|
279
|
+
* @param y - The y coordinate of the point
|
|
280
|
+
* @returns Whether the point exists on Grumpkin
|
|
293
281
|
*/
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
isOnGrumpkin() {
|
|
299
|
-
// TODO: Check this against how bb handles curve check and infinity point check
|
|
300
|
-
if (this.inf) {
|
|
282
|
+
isOnCurve() {
|
|
283
|
+
if (this.isInfinite) {
|
|
301
284
|
return true;
|
|
302
285
|
}
|
|
303
286
|
|
package/src/eth-address/index.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { randomBytes } from '../crypto/random/index.js';
|
|
|
5
5
|
import { Fr } from '../curves/bn254/index.js';
|
|
6
6
|
import { hexSchemaFor } from '../schemas/utils.js';
|
|
7
7
|
import { BufferReader, FieldReader } from '../serialize/index.js';
|
|
8
|
-
import { TypeRegistry } from '../serialize/type_registry.js';
|
|
9
8
|
import { bufferToHex } from '../string/index.js';
|
|
10
9
|
|
|
11
10
|
/**
|
|
@@ -268,6 +267,3 @@ export class EthAddress {
|
|
|
268
267
|
return addrA.equals(addrB);
|
|
269
268
|
}
|
|
270
269
|
}
|
|
271
|
-
|
|
272
|
-
// For deserializing JSON.
|
|
273
|
-
TypeRegistry.register('EthAddress', EthAddress);
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
2
2
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
3
3
|
|
|
4
|
+
import { secp256k1 } from '@noble/curves/secp256k1';
|
|
4
5
|
import { z } from 'zod';
|
|
5
6
|
|
|
7
|
+
import { randomBytes } from '../crypto/random/index.js';
|
|
6
8
|
import { hasHexPrefix, hexToBuffer } from '../string/index.js';
|
|
7
9
|
|
|
8
10
|
/**
|
|
@@ -77,8 +79,12 @@ export class Signature {
|
|
|
77
79
|
return new Signature(Buffer32.fromBuffer(hexToBuffer(sig.r)), Buffer32.fromBuffer(hexToBuffer(sig.s)), sig.yParity);
|
|
78
80
|
}
|
|
79
81
|
|
|
82
|
+
/** Generates a random valid ECDSA signature with a low s-value by signing a random message with a random key. */
|
|
80
83
|
static random(): Signature {
|
|
81
|
-
|
|
84
|
+
const privateKey = randomBytes(32);
|
|
85
|
+
const message = randomBytes(32);
|
|
86
|
+
const { r, s, recovery } = secp256k1.sign(message, privateKey);
|
|
87
|
+
return new Signature(Buffer32.fromBigInt(r), Buffer32.fromBigInt(s), recovery ? 28 : 27);
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
static empty(): Signature {
|