From f7d5316d24a5b270d22b263190f0b6b19b70698e Mon Sep 17 00:00:00 2001 From: caojiafeng Date: Wed, 29 Nov 2023 11:23:15 +0800 Subject: [PATCH 01/11] [feat][aptos-stdlib] crypto algebra bn254 Signed-off-by: caojiafeng --- Cargo.lock | 12 + Cargo.toml | 1 + .../src/gas_schedule/aptos_framework.rs | 86 +++ .../src/components/feature_flags.rs | 3 + aptos-move/framework/Cargo.toml | 1 + .../aptos-stdlib/doc/bn254_algebra.md | 519 ++++++++++++++++++ .../framework/aptos-stdlib/doc/overview.md | 1 + .../sources/cryptography/bn254_algebra.move | 25 + .../framework/move-stdlib/doc/features.md | 60 ++ .../move-stdlib/sources/configs/features.move | 11 + .../cryptography/algebra/arithmetics/add.rs | 55 +- .../cryptography/algebra/arithmetics/div.rs | 49 +- .../algebra/arithmetics/double.rs | 38 +- .../cryptography/algebra/arithmetics/inv.rs | 29 +- .../cryptography/algebra/arithmetics/mul.rs | 41 +- .../cryptography/algebra/arithmetics/neg.rs | 56 +- .../algebra/arithmetics/scalar_mul.rs | 114 +++- .../cryptography/algebra/arithmetics/sqr.rs | 53 +- .../cryptography/algebra/arithmetics/sub.rs | 55 +- .../natives/cryptography/algebra/casting.rs | 28 +- .../natives/cryptography/algebra/constants.rs | 94 +++- .../src/natives/cryptography/algebra/eq.rs | 47 +- .../src/natives/cryptography/algebra/mod.rs | 99 +++- .../src/natives/cryptography/algebra/new.rs | 35 +- .../natives/cryptography/algebra/pairing.rs | 123 ++++- .../src/natives/cryptography/algebra/rand.rs | 41 +- .../cryptography/algebra/serialization.rs | 334 ++++++++++- aptos-move/vm-genesis/src/lib.rs | 1 + types/src/on_chain_config/aptos_features.rs | 1 + 29 files changed, 1974 insertions(+), 38 deletions(-) create mode 100644 aptos-move/framework/aptos-stdlib/doc/bn254_algebra.md create mode 100644 aptos-move/framework/aptos-stdlib/sources/cryptography/bn254_algebra.move diff --git a/Cargo.lock b/Cargo.lock index 4ea66dc69f759..4d18974e6bd70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1659,6 +1659,7 @@ dependencies = [ "aptos-vm", "aptos-vm-types", "ark-bls12-381", + "ark-bn254", "ark-ec", "ark-ff", "ark-serialize", @@ -4264,6 +4265,17 @@ dependencies = [ "ark-std", ] +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + [[package]] name = "ark-ec" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index eb41ba1379574..4649da3214fdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -435,6 +435,7 @@ anstyle = "1.0.1" arc-swap = "1.6.0" arr_macro = "0.2.1" ark-bls12-381 = "0.4.0" +ark-bn254 = "0.4.0" ark-ec = "0.4.0" ark-ff = "0.4.0" ark-serialize = "0.4.0" diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 2334629380719..24dcb7b9a452b 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -16,6 +16,92 @@ crate::gas_schedule::macros::define_gas_parameters!( [account_create_address_base: InternalGas, "account.create_address.base", 6000], [account_create_signer_base: InternalGas, "account.create_signer.base", 6000], + [algebra_ark_bn254_fq2_add: InternalGas, { 12.. => "algebra.ark_bn254_fq2_add" }, 36380], + [algebra_ark_bn254_fq2_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq2_clone" }, 4220], + [algebra_ark_bn254_fq2_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq2_deser" }, 223600], + [algebra_ark_bn254_fq2_div: InternalGas, { 12.. => "algebra.ark_bn254_fq2_div" }, 5016260], + [algebra_ark_bn254_fq2_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq2_eq" }, 14520], + [algebra_ark_bn254_fq2_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq2_from_u64" }, 18020], + [algebra_ark_bn254_fq2_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq2_inv" }, 4010460], + [algebra_ark_bn254_fq2_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq2_mul" }, 997720], + [algebra_ark_bn254_fq2_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq2_neg" }, 23620], + [algebra_ark_bn254_fq2_one: InternalGas, { 12.. => "algebra.ark_bn254_fq2_one" }, 220], + [algebra_ark_bn254_fq2_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq2_pow_u256" }, 293284140], + [algebra_ark_bn254_fq2_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq2_serialize" }, 161560], + [algebra_ark_bn254_fq2_square: InternalGas, { 12.. => "algebra.ark_bn254_fq2_square" }, 702900], + [algebra_ark_bn254_fq2_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq2_sub" }, 35160], + [algebra_ark_bn254_fq2_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq2_zero" }, 4220], + [algebra_ark_bn254_fq12_add: InternalGas, { 12.. => "algebra.ark_bn254_fq12_add" }, 36380], + [algebra_ark_bn254_fq12_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq12_clone" }, 4220], + [algebra_ark_bn254_fq12_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq12_deser" }, 223600], + [algebra_ark_bn254_fq12_div: InternalGas, { 12.. => "algebra.ark_bn254_fq12_div" }, 5016260], + [algebra_ark_bn254_fq12_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq12_eq" }, 14520], + [algebra_ark_bn254_fq12_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq12_from_u64" }, 18020], + [algebra_ark_bn254_fq12_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq12_inv" }, 4010460], + [algebra_ark_bn254_fq12_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq12_mul" }, 997720], + [algebra_ark_bn254_fq12_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq12_neg" }, 23620], + [algebra_ark_bn254_fq12_one: InternalGas, { 12.. => "algebra.ark_bn254_fq12_one" }, 220], + [algebra_ark_bn254_fq12_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq12_pow_u256" }, 293284140], + [algebra_ark_bn254_fq12_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq12_serialize" }, 161560], + [algebra_ark_bn254_fq12_square: InternalGas, { 12.. => "algebra.ark_bn254_fq12_square" }, 702900], + [algebra_ark_bn254_fq12_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq12_sub" }, 35160], + [algebra_ark_bn254_fq12_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq12_zero" }, 4220], + [algebra_ark_bn254_fr_add: InternalGas, { 12.. => "algebra.ark_bn254_fr_add" }, 4220], + [algebra_ark_bn254_fr_deser: InternalGas, { 12.. => "algebra.ark_bn254_fr_deser" }, 15040], + [algebra_ark_bn254_fr_div: InternalGas, { 12.. => "algebra.ark_bn254_fr_div" }, 1188800], + [algebra_ark_bn254_fr_eq: InternalGas, { 12.. => "algebra.ark_bn254_fr_eq" }, 4240], + [algebra_ark_bn254_fr_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fr_from_u64" }, 9880], + [algebra_ark_bn254_fr_inv: InternalGas, { 12.. => "algebra.ark_bn254_fr_inv" }, 1172200], + [algebra_ark_bn254_fr_mul: InternalGas, { 12.. => "algebra.ark_bn254_fr_mul" }, 10040], + [algebra_ark_bn254_fr_neg: InternalGas, { 12.. => "algebra.ark_bn254_fr_neg" }, 4260], + [algebra_ark_bn254_fr_one: InternalGas, { 12.. => "algebra.ark_bn254_fr_one" }, 4220], + [algebra_ark_bn254_fr_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fr_serialize" }, 22060], + [algebra_ark_bn254_fr_square: InternalGas, { 12.. => "algebra.ark_bn254_fr_square" }, 9500], + [algebra_ark_bn254_fr_sub: InternalGas, { 12.. => "algebra.ark_bn254_fr_sub" }, 5800], + [algebra_ark_bn254_fr_zero: InternalGas, { 12.. => "algebra.ark_bn254_fr_zero" }, 4220], + [algebra_ark_bn254_fq_add: InternalGas, { 12.. => "algebra.ark_bn254_fq_add" }, 4220], + [algebra_ark_bn254_fq_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq_deser" }, 15040], + [algebra_ark_bn254_fq_div: InternalGas, { 12.. => "algebra.ark_bn254_fq_div" }, 1188800], + [algebra_ark_bn254_fq_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq_eq" }, 4240], + [algebra_ark_bn254_fq_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq_from_u64" }, 9880], + [algebra_ark_bn254_fq_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq_inv" }, 1172200], + [algebra_ark_bn254_fq_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq_mul" }, 10040], + [algebra_ark_bn254_fq_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq_neg" }, 4260], + [algebra_ark_bn254_fq_one: InternalGas, { 12.. => "algebra.ark_bn254_fq_one" }, 4220], + [algebra_ark_bn254_fq_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq_serialize" }, 22060], + [algebra_ark_bn254_fq_square: InternalGas, { 12.. => "algebra.ark_bn254_fq_square" }, 9500], + [algebra_ark_bn254_fq_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq_sub" }, 5800], + [algebra_ark_bn254_fq_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq_zero" }, 4220], + [algebra_ark_bn254_g1_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_comp" }, 20591980], + [algebra_ark_bn254_g1_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_uncomp" }, 14412760], + [algebra_ark_bn254_g1_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_comp" }, 40280], + [algebra_ark_bn254_g1_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_uncomp" }, 48660], + [algebra_ark_bn254_g1_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_add" }, 216120], + [algebra_ark_bn254_g1_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_double" }, 105280], + [algebra_ark_bn254_g1_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_eq" }, 100700], + [algebra_ark_bn254_g1_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_generator" }, 220], + [algebra_ark_bn254_g1_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_infinity" }, 220], + [algebra_ark_bn254_g1_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_neg" }, 220], + [algebra_ark_bn254_g1_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_scalar_mul" }, 50470420], + [algebra_ark_bn254_g1_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_sub" }, 222940], + [algebra_ark_bn254_g1_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_to_affine" }, 2420700], + [algebra_ark_bn254_g2_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_comp" }, 41201360], + [algebra_ark_bn254_g2_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_uncomp" }, 20359580], + [algebra_ark_bn254_g2_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_comp" }, 67560], + [algebra_ark_bn254_g2_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_uncomp" }, 84340], + [algebra_ark_bn254_g2_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_add" }, 648020], + [algebra_ark_bn254_g2_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_double" }, 296780], + [algebra_ark_bn254_g2_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_eq" }, 303100], + [algebra_ark_bn254_g2_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_generator" }, 220], + [algebra_ark_bn254_g2_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_infinity" }, 220], + [algebra_ark_bn254_g2_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_neg" }, 220], + [algebra_ark_bn254_g2_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_scalar_mul" }, 150530160], + [algebra_ark_bn254_g2_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_sub" }, 657380], + [algebra_ark_bn254_g2_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_to_affine" }, 2577140], + [algebra_ark_bn254_multi_pairing_base: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_base" }, 179972980], + [algebra_ark_bn254_multi_pairing_per_pair: InternalGasPerArg, { 12.. => "algebra.ark_bn254_multi_pairing_per_pair" }, 92052840], + [algebra_ark_bn254_pairing: InternalGas, { 12.. => "algebra.ark_bn254_pairing" }, 296644400], + // Algebra gas parameters begin. // Generated at time 1680606720.0709136 by `scripts/algebra-gas/update_algebra_gas_params.py` with gas_per_ns=10.23. [algebra_ark_bls12_381_fq12_add: InternalGas, { 8.. => "algebra.ark_bls12_381_fq12_add" }, 36380], diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index 30b61a2758a5a..8b522629e3ab3 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -93,6 +93,7 @@ pub enum FeatureFlag { VMBinaryFormatV7, ResourceGroupsChargeAsSizeSum, CommissionChangeDelegationPool, + BN254Structures, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -244,6 +245,7 @@ impl From for AptosFeatureFlag { FeatureFlag::CommissionChangeDelegationPool => { AptosFeatureFlag::COMMISSION_CHANGE_DELEGATION_POOL }, + FeatureFlag::BN254Structures => AptosFeatureFlag::BN254_STRUCTURES, } } } @@ -318,6 +320,7 @@ impl From for FeatureFlag { AptosFeatureFlag::COMMISSION_CHANGE_DELEGATION_POOL => { FeatureFlag::CommissionChangeDelegationPool }, + AptosFeatureFlag::BN254_STRUCTURES => FeatureFlag::BN254Structures, } } } diff --git a/aptos-move/framework/Cargo.toml b/aptos-move/framework/Cargo.toml index 6f3cf5b8e48bd..f3444ba520e71 100644 --- a/aptos-move/framework/Cargo.toml +++ b/aptos-move/framework/Cargo.toml @@ -26,6 +26,7 @@ aptos-table-natives = { workspace = true } aptos-types = { workspace = true } aptos-vm-types = { workspace = true } ark-bls12-381 = { workspace = true } +ark-bn254 = { workspace = true } ark-ec = { workspace = true } ark-ff = { workspace = true } ark-serialize = { workspace = true } diff --git a/aptos-move/framework/aptos-stdlib/doc/bn254_algebra.md b/aptos-move/framework/aptos-stdlib/doc/bn254_algebra.md new file mode 100644 index 0000000000000..eb5e6803d86ae --- /dev/null +++ b/aptos-move/framework/aptos-stdlib/doc/bn254_algebra.md @@ -0,0 +1,519 @@ + + + +# Module `0x1::bn254_algebra` + + + +- [Struct `Fr`](#0x1_bn254_algebra_Fr) +- [Struct `FormatFrLsb`](#0x1_bn254_algebra_FormatFrLsb) +- [Struct `FormatFrMsb`](#0x1_bn254_algebra_FormatFrMsb) +- [Struct `Fq`](#0x1_bn254_algebra_Fq) +- [Struct `FormatFqLsb`](#0x1_bn254_algebra_FormatFqLsb) +- [Struct `FormatFqMsb`](#0x1_bn254_algebra_FormatFqMsb) +- [Struct `Fq2`](#0x1_bn254_algebra_Fq2) +- [Struct `FormatFq2LscLsb`](#0x1_bn254_algebra_FormatFq2LscLsb) +- [Struct `Fq12`](#0x1_bn254_algebra_Fq12) +- [Struct `FormatFq12LscLsb`](#0x1_bn254_algebra_FormatFq12LscLsb) +- [Struct `G1`](#0x1_bn254_algebra_G1) +- [Struct `FormatG1Uncompr`](#0x1_bn254_algebra_FormatG1Uncompr) +- [Struct `FormatG1Compr`](#0x1_bn254_algebra_FormatG1Compr) +- [Struct `G2`](#0x1_bn254_algebra_G2) +- [Struct `FormatG2Uncompr`](#0x1_bn254_algebra_FormatG2Uncompr) +- [Struct `FormatG2Compr`](#0x1_bn254_algebra_FormatG2Compr) +- [Struct `Gt`](#0x1_bn254_algebra_Gt) +- [Struct `FormatGt`](#0x1_bn254_algebra_FormatGt) + + +
+ + + + + +## Struct `Fr` + + + +
struct Fr
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatFrLsb` + + + +
struct FormatFrLsb
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatFrMsb` + + + +
struct FormatFrMsb
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `Fq` + + + +
struct Fq
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatFqLsb` + + + +
struct FormatFqLsb
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatFqMsb` + + + +
struct FormatFqMsb
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `Fq2` + + + +
struct Fq2
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatFq2LscLsb` + + + +
struct FormatFq2LscLsb
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `Fq12` + + + +
struct Fq12
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatFq12LscLsb` + + + +
struct FormatFq12LscLsb
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `G1` + + + +
struct G1
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatG1Uncompr` + + + +
struct FormatG1Uncompr
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatG1Compr` + + + +
struct FormatG1Compr
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `G2` + + + +
struct G2
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatG2Uncompr` + + + +
struct FormatG2Uncompr
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatG2Compr` + + + +
struct FormatG2Compr
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `Gt` + + + +
struct Gt
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + + +## Struct `FormatGt` + + + +
struct FormatGt
+
+ + + +
+Fields + + +
+
+dummy_field: bool +
+
+ +
+
+ + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-stdlib/doc/overview.md b/aptos-move/framework/aptos-stdlib/doc/overview.md index 2429ae42c644f..6176385db1d97 100644 --- a/aptos-move/framework/aptos-stdlib/doc/overview.md +++ b/aptos-move/framework/aptos-stdlib/doc/overview.md @@ -17,6 +17,7 @@ This is the reference documentation of the Aptos standard library. - [`0x1::big_vector`](big_vector.md#0x1_big_vector) - [`0x1::bls12381`](bls12381.md#0x1_bls12381) - [`0x1::bls12381_algebra`](bls12381_algebra.md#0x1_bls12381_algebra) +- [`0x1::bn254_algebra`](bn254_algebra.md#0x1_bn254_algebra) - [`0x1::capability`](capability.md#0x1_capability) - [`0x1::comparator`](comparator.md#0x1_comparator) - [`0x1::copyable_any`](copyable_any.md#0x1_copyable_any) diff --git a/aptos-move/framework/aptos-stdlib/sources/cryptography/bn254_algebra.move b/aptos-move/framework/aptos-stdlib/sources/cryptography/bn254_algebra.move new file mode 100644 index 0000000000000..3a28c9c271858 --- /dev/null +++ b/aptos-move/framework/aptos-stdlib/sources/cryptography/bn254_algebra.move @@ -0,0 +1,25 @@ +module std::bn254_algebra { + struct Fr {} + struct FormatFrLsb {} + struct FormatFrMsb {} + + struct Fq {} + struct FormatFqLsb {} + struct FormatFqMsb {} + + struct Fq2 {} + struct FormatFq2LscLsb {} + + struct Fq12 {} + struct FormatFq12LscLsb {} + + struct G1 {} + struct FormatG1Uncompr {} + struct FormatG1Compr {} + struct G2 {} + struct FormatG2Uncompr {} + struct FormatG2Compr {} + + struct Gt {} + struct FormatGt {} +} diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index c85b2b6bc24fa..17aeed218f41e 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -55,6 +55,8 @@ return true. - [Function `cryptography_algebra_enabled`](#0x1_features_cryptography_algebra_enabled) - [Function `get_bls12_381_strutures_feature`](#0x1_features_get_bls12_381_strutures_feature) - [Function `bls12_381_structures_enabled`](#0x1_features_bls12_381_structures_enabled) +- [Function `get_bn254_strutures_feature`](#0x1_features_get_bn254_strutures_feature) +- [Function `bn254_structures_enabled`](#0x1_features_bn254_structures_enabled) - [Function `get_periodical_reward_rate_decrease_feature`](#0x1_features_get_periodical_reward_rate_decrease_feature) - [Function `periodical_reward_rate_decrease_enabled`](#0x1_features_periodical_reward_rate_decrease_enabled) - [Function `get_partial_governance_voting`](#0x1_features_get_partial_governance_voting) @@ -207,6 +209,18 @@ Lifetime: transient + + +Whether the generic algebra implementation for BN254 operations are enabled. + +Lifetime: transient + + +
const BN254_STRUCTURES: u64 = 43;
+
+ + + Whether the Bulletproofs zero-knowledge range proof module is enabled, and the related native function is @@ -1115,6 +1129,52 @@ Lifetime: transient + + + + +## Function `get_bn254_strutures_feature` + + + +
public fun get_bn254_strutures_feature(): u64
+
+ + + +
+Implementation + + +
public fun get_bn254_strutures_feature(): u64 { BN254_STRUCTURES }
+
+ + + +
+ + + +## Function `bn254_structures_enabled` + + + +
public fun bn254_structures_enabled(): bool
+
+ + + +
+Implementation + + +
public fun bn254_structures_enabled(): bool acquires Features {
+    is_enabled(BN254_STRUCTURES)
+}
+
+ + +
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 9381807c40241..bd01c5f617bdf 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -145,6 +145,17 @@ module std::features { is_enabled(BLS12_381_STRUCTURES) } + /// Whether the generic algebra implementation for BN254 operations are enabled. + /// + /// Lifetime: transient + const BN254_STRUCTURES: u64 = 43; + + public fun get_bn254_strutures_feature(): u64 { BN254_STRUCTURES } + + public fun bn254_structures_enabled(): bool acquires Features { + is_enabled(BN254_STRUCTURES) + } + /// Whether native_public_key_validate aborts when a public key of the wrong length is given /// Lifetime: ephemeral const ED25519_PUBKEY_VALIDATE_RETURN_FALSE_WRONG_LENGTH: u64 = 14; diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/add.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/add.rs index ccace30f08b90..8b1fce1f0fff9 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/add.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/add.rs @@ -4,8 +4,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, ark_binary_op_internal, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -63,8 +63,59 @@ pub fn add_internal( mul, ALGEBRA_ARK_BLS12_381_FQ12_MUL ), + Some(Structure::BN254(s)) => add_internal_bn254(context, args, s), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } + +fn add_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_binary_op_internal!(context, args, ark_bn254::Fr, add, ALGEBRA_ARK_BN254_FR_ADD) + }, + BN254Structure::BN254Fq => { + ark_binary_op_internal!(context, args, ark_bn254::Fq, add, ALGEBRA_ARK_BN254_FQ_ADD) + }, + BN254Structure::BN254Fq2 => ark_binary_op_internal!( + context, + args, + ark_bn254::Fq2, + add, + ALGEBRA_ARK_BN254_FQ2_ADD + ), + BN254Structure::BN254Fq12 => ark_binary_op_internal!( + context, + args, + ark_bn254::Fq12, + add, + ALGEBRA_ARK_BN254_FQ12_ADD + ), + BN254Structure::BN254G1 => ark_binary_op_internal!( + context, + args, + ark_bn254::G1Projective, + add, + ALGEBRA_ARK_BN254_G1_PROJ_ADD + ), + BN254Structure::BN254G2 => ark_binary_op_internal!( + context, + args, + ark_bn254::G2Projective, + add, + ALGEBRA_ARK_BN254_G2_PROJ_ADD + ), + BN254Structure::BN254Gt => ark_binary_op_internal!( + context, + args, + ark_bn254::Fq12, + mul, + ALGEBRA_ARK_BN254_FQ12_MUL + ), + } +} diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/div.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/div.rs index 1b1f5a977a5b0..688eb53879a34 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/div.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/div.rs @@ -3,8 +3,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -59,6 +59,51 @@ pub fn div_internal( ALGEBRA_ARK_BLS12_381_FQ12_EQ, ALGEBRA_ARK_BLS12_381_FQ12_DIV ), + Some(Structure::BN254(s)) => div_internal_bn254(context, args, s), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn div_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => ark_div_internal!( + context, + args, + ark_bn254::Fr, + div, + ALGEBRA_ARK_BN254_FR_EQ, + ALGEBRA_ARK_BN254_FR_DIV + ), + BN254Structure::BN254Fq => ark_div_internal!( + context, + args, + ark_bn254::Fq, + div, + ALGEBRA_ARK_BN254_FQ_EQ, + ALGEBRA_ARK_BN254_FQ_DIV + ), + BN254Structure::BN254Fq2 => ark_div_internal!( + context, + args, + ark_bn254::Fq2, + div, + ALGEBRA_ARK_BN254_FQ2_EQ, + ALGEBRA_ARK_BN254_FQ2_DIV + ), + BN254Structure::BN254Fq12 => ark_div_internal!( + context, + args, + ark_bn254::Fq12, + div, + ALGEBRA_ARK_BN254_FQ12_EQ, + ALGEBRA_ARK_BN254_FQ12_DIV + ), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/double.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/double.rs index f6137121b01e9..9a6ed0190c9f6 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/double.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/double.rs @@ -4,8 +4,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, ark_unary_op_internal, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -47,6 +47,40 @@ pub fn double_internal( square, ALGEBRA_ARK_BLS12_381_FQ12_SQUARE ), + Some(Structure::BN254(s)) => double_internal_bn254(context, args, s), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn double_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254G1 => ark_unary_op_internal!( + context, + args, + ark_bn254::G1Projective, + double, + ALGEBRA_ARK_BN254_G1_PROJ_DOUBLE + ), + BN254Structure::BN254G2 => ark_unary_op_internal!( + context, + args, + ark_bn254::G2Projective, + double, + ALGEBRA_ARK_BN254_G2_PROJ_DOUBLE + ), + BN254Structure::BN254Gt => ark_unary_op_internal!( + context, + args, + ark_bn254::Fq12, + square, + ALGEBRA_ARK_BN254_FQ12_SQUARE + ), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/inv.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/inv.rs index 5500230abfe8d..e73a3302d18d1 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/inv.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/inv.rs @@ -3,8 +3,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -52,6 +52,31 @@ pub fn inv_internal( ark_bls12_381::Fq12, ALGEBRA_ARK_BLS12_381_FQ12_INV ), + Some(Structure::BN254(s)) => inv_internal_bn254(context, args, s), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn inv_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_inverse_internal!(context, args, ark_bn254::Fr, ALGEBRA_ARK_BN254_FR_INV) + }, + BN254Structure::BN254Fq => { + ark_inverse_internal!(context, args, ark_bn254::Fq, ALGEBRA_ARK_BN254_FQ_INV) + }, + BN254Structure::BN254Fq2 => { + ark_inverse_internal!(context, args, ark_bn254::Fq2, ALGEBRA_ARK_BN254_FQ2_INV) + }, + BN254Structure::BN254Fq12 => { + ark_inverse_internal!(context, args, ark_bn254::Fq12, ALGEBRA_ARK_BN254_FQ12_INV) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/mul.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/mul.rs index 6233190dd65b6..e377522e84673 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/mul.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/mul.rs @@ -4,8 +4,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, ark_binary_op_internal, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -38,6 +38,43 @@ pub fn mul_internal( mul, ALGEBRA_ARK_BLS12_381_FQ12_MUL ), + Some(Structure::BN254(s)) => mul_internal_bn254(context, args, s), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn mul_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_binary_op_internal!(context, args, ark_bn254::Fr, mul, ALGEBRA_ARK_BN254_FR_MUL) + }, + BN254Structure::BN254Fq => { + ark_binary_op_internal!(context, args, ark_bn254::Fq, mul, ALGEBRA_ARK_BN254_FQ_MUL) + }, + BN254Structure::BN254Fq2 => { + ark_binary_op_internal!( + context, + args, + ark_bn254::Fq2, + mul, + ALGEBRA_ARK_BN254_FQ2_MUL + ) + }, + BN254Structure::BN254Fq12 => { + ark_binary_op_internal!( + context, + args, + ark_bn254::Fq12, + mul, + ALGEBRA_ARK_BN254_FQ12_MUL + ) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/neg.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/neg.rs index e0dfdf0b2f339..96a371eae35f6 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/neg.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/neg.rs @@ -4,8 +4,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, ark_unary_op_internal, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -63,8 +63,60 @@ pub fn neg_internal( let new_handle = store_element!(context, new_element)?; Ok(smallvec![Value::u64(new_handle as u64)]) }, + Some(Structure::BN254(s)) => neg_internal_bn254(context, args, s), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } + +fn neg_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_unary_op_internal!(context, args, ark_bn254::Fr, neg, ALGEBRA_ARK_BN254_FR_NEG) + }, + BN254Structure::BN254Fq => { + ark_unary_op_internal!(context, args, ark_bn254::Fq, neg, ALGEBRA_ARK_BN254_FQ_NEG) + }, + BN254Structure::BN254Fq2 => ark_unary_op_internal!( + context, + args, + ark_bn254::Fq2, + neg, + ALGEBRA_ARK_BN254_FQ2_NEG + ), + BN254Structure::BN254Fq12 => ark_unary_op_internal!( + context, + args, + ark_bn254::Fq12, + neg, + ALGEBRA_ARK_BN254_FQ12_NEG + ), + BN254Structure::BN254G1 => ark_unary_op_internal!( + context, + args, + ark_bn254::G1Projective, + neg, + ALGEBRA_ARK_BN254_G1_PROJ_NEG + ), + BN254Structure::BN254G2 => ark_unary_op_internal!( + context, + args, + ark_bn254::G2Projective, + neg, + ALGEBRA_ARK_BN254_G2_PROJ_NEG + ), + BN254Structure::BN254Gt => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq12, element_ptr, element); + context.charge(ALGEBRA_ARK_BN254_FQ12_INV)?; + let new_element = element.inverse().ok_or_else(abort_invariant_violated)?; + let new_handle = store_element!(context, new_element)?; + Ok(smallvec![Value::u64(new_handle as u64)]) + }, + } +} diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/scalar_mul.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/scalar_mul.rs index a144385762d07..e62961789cde2 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/scalar_mul.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/scalar_mul.rs @@ -4,9 +4,9 @@ use crate::{ abort_unless_feature_flag_enabled, natives::cryptography::{ algebra::{ - abort_invariant_violated, AlgebraContext, Structure, E_TOO_MUCH_MEMORY_USED, - MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_INPUT_VECTOR_SIZES_NOT_MATCHING, - MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, AlgebraContext, BN254Structure, Structure, + E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, + MOVE_ABORT_CODE_INPUT_VECTOR_SIZES_NOT_MATCHING, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, helpers::log2_ceil, }, @@ -35,6 +35,19 @@ fn feature_flag_of_group_scalar_mul( | (Some(Structure::BLS12381Gt), Some(Structure::BLS12381Fr)) => { Some(FeatureFlag::BLS12_381_STRUCTURES) }, + ( + Some(Structure::BN254(BN254Structure::BN254G1)), + Some(Structure::BN254(BN254Structure::BN254Fr)), + ) + | ( + Some(Structure::BN254(BN254Structure::BN254G2)), + Some(Structure::BN254(BN254Structure::BN254Fr)), + ) + | ( + Some(Structure::BN254(BN254Structure::BN254Gt)), + Some(Structure::BN254(BN254Structure::BN254Fr)), + ) => Some(FeatureFlag::BN254_STRUCTURES), + _ => None, } } @@ -134,6 +147,60 @@ pub fn scalar_mul_internal( let new_handle = store_element!(context, new_element)?; Ok(smallvec![Value::u64(new_handle as u64)]) }, + ( + Some(Structure::BN254(group_structure)), + Some(Structure::BN254(scalar_field_structure)), + ) => scalar_mul_internal_bn254(context, args, group_structure, scalar_field_structure), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn scalar_mul_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + group_structure: BN254Structure, + scalar_field_structure: BN254Structure, +) -> SafeNativeResult> { + match (group_structure, scalar_field_structure) { + (BN254Structure::BN254G1, BN254Structure::BN254Fr) => { + ark_scalar_mul_internal!( + context, + args, + ark_bn254::G1Projective, + ark_bn254::Fr, + mul_bigint, + ALGEBRA_ARK_BN254_G1_PROJ_SCALAR_MUL + ) + }, + (BN254Structure::BN254G2, BN254Structure::BN254Fr) => { + ark_scalar_mul_internal!( + context, + args, + ark_bn254::G2Projective, + ark_bn254::Fr, + mul_bigint, + ALGEBRA_ARK_BN254_G2_PROJ_SCALAR_MUL + ) + }, + (BN254Structure::BN254Gt, BN254Structure::BN254Fr) => { + let scalar_handle = safely_pop_arg!(args, u64) as usize; + let element_handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!( + context, + element_handle, + ark_bn254::Fq12, + element_ptr, + element + ); + safe_borrow_element!(context, scalar_handle, ark_bn254::Fr, scalar_ptr, scalar); + let scalar_bigint: ark_ff::BigInteger256 = (*scalar).into(); + context.charge(ALGEBRA_ARK_BN254_FQ12_POW_U256)?; + let new_element = element.pow(scalar_bigint); + let new_handle = store_element!(context, new_element)?; + Ok(smallvec![Value::u64(new_handle as u64)]) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), @@ -220,6 +287,47 @@ pub fn multi_scalar_mul_internal( ark_bls12_381::Fr ) }, + ( + Some(Structure::BN254(group_structure)), + Some(Structure::BN254(scalar_field_structure)), + ) => { + multi_scalar_mul_internal_bn254(context, args, group_structure, scalar_field_structure) + }, + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn multi_scalar_mul_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + group_structure: BN254Structure, + scalar_field_structure: BN254Structure, +) -> SafeNativeResult> { + match (group_structure, scalar_field_structure) { + (BN254Structure::BN254G1, BN254Structure::BN254Fr) => { + ark_msm_internal!( + context, + args, + ALGEBRA_ARK_BN254_G1_PROJ_TO_AFFINE.per::(), + ALGEBRA_ARK_BN254_G1_PROJ_ADD.per::(), + ALGEBRA_ARK_BN254_G1_PROJ_DOUBLE.per::(), + ark_bn254::G1Projective, + ark_bn254::Fr + ) + }, + (BN254Structure::BN254G2, BN254Structure::BN254Fr) => { + ark_msm_internal!( + context, + args, + ALGEBRA_ARK_BN254_G2_PROJ_TO_AFFINE.per::(), + ALGEBRA_ARK_BN254_G2_PROJ_ADD.per::(), + ALGEBRA_ARK_BN254_G2_PROJ_DOUBLE.per::(), + ark_bn254::G2Projective, + ark_bn254::Fr + ) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sqr.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sqr.rs index 34fe76f3f0b94..bcf36dcbc473e 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sqr.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sqr.rs @@ -4,8 +4,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, ark_unary_op_internal, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -38,6 +38,55 @@ pub fn sqr_internal( square, ALGEBRA_ARK_BLS12_381_FQ12_SQUARE ), + Some(Structure::BN254(s)) => sqr_internal_bn254(context, args, s), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn sqr_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_unary_op_internal!( + context, + args, + ark_bn254::Fr, + square, + ALGEBRA_ARK_BN254_FR_SQUARE + ) + }, + BN254Structure::BN254Fq => { + ark_unary_op_internal!( + context, + args, + ark_bn254::Fq, + square, + ALGEBRA_ARK_BN254_FQ_SQUARE + ) + }, + BN254Structure::BN254Fq2 => { + ark_unary_op_internal!( + context, + args, + ark_bn254::Fq2, + square, + ALGEBRA_ARK_BN254_FQ2_SQUARE + ) + }, + BN254Structure::BN254Fq12 => { + ark_unary_op_internal!( + context, + args, + ark_bn254::Fq12, + square, + ALGEBRA_ARK_BN254_FQ12_SQUARE + ) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sub.rs b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sub.rs index 08ce570f41408..8b586a33ed065 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sub.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/arithmetics/sub.rs @@ -4,8 +4,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, ark_binary_op_internal, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -63,8 +63,59 @@ pub fn sub_internal( div, ALGEBRA_ARK_BLS12_381_FQ12_DIV ), + Some(Structure::BN254(s)) => sub_internal_bn254(context, args, s), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } + +fn sub_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_binary_op_internal!(context, args, ark_bn254::Fr, sub, ALGEBRA_ARK_BN254_FR_SUB) + }, + BN254Structure::BN254Fq => { + ark_binary_op_internal!(context, args, ark_bn254::Fq, sub, ALGEBRA_ARK_BN254_FQ_SUB) + }, + BN254Structure::BN254Fq2 => ark_binary_op_internal!( + context, + args, + ark_bn254::Fq2, + sub, + ALGEBRA_ARK_BN254_FQ2_SUB + ), + BN254Structure::BN254Fq12 => ark_binary_op_internal!( + context, + args, + ark_bn254::Fq12, + sub, + ALGEBRA_ARK_BN254_FQ12_SUB + ), + BN254Structure::BN254G1 => ark_binary_op_internal!( + context, + args, + ark_bn254::G1Projective, + sub, + ALGEBRA_ARK_BN254_G1_PROJ_SUB + ), + BN254Structure::BN254G2 => ark_binary_op_internal!( + context, + args, + ark_bn254::G2Projective, + sub, + ALGEBRA_ARK_BN254_G2_PROJ_SUB + ), + BN254Structure::BN254Gt => ark_binary_op_internal!( + context, + args, + ark_bn254::Fq12, + div, + ALGEBRA_ARK_BN254_FQ12_DIV + ), + } +} diff --git a/aptos-move/framework/src/natives/cryptography/algebra/casting.rs b/aptos-move/framework/src/natives/cryptography/algebra/casting.rs index 43bd4d09f840e..26a71b07c8118 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/casting.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/casting.rs @@ -3,8 +3,8 @@ use crate::{ abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - abort_invariant_violated, AlgebraContext, Structure, BLS12381_R_SCALAR, - MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, AlgebraContext, BN254Structure, Structure, BLS12381_R_SCALAR, + BN254_R_SCALAR, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, structure_from_ty_arg, }; @@ -27,6 +27,10 @@ fn feature_flag_of_casting( (Some(Structure::BLS12381Fq12), Some(Structure::BLS12381Gt)) => { Some(FeatureFlag::BLS12_381_STRUCTURES) }, + ( + Some(Structure::BN254(BN254Structure::BN254Fq12)), + Some(Structure::BN254(BN254Structure::BN254Gt)), + ) => Some(FeatureFlag::BN254_STRUCTURES), _ => None, } } @@ -58,6 +62,19 @@ pub fn downcast_internal( Ok(smallvec![Value::bool(false), Value::u64(handle as u64)]) } }, + ( + Some(Structure::BN254(BN254Structure::BN254Fq12)), + Some(Structure::BN254(BN254Structure::BN254Gt)), + ) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq12, element_ptr, element); + context.charge(ALGEBRA_ARK_BN254_FQ12_POW_U256)?; + if element.pow(BN254_R_SCALAR.0) == ark_bn254::Fq12::one() { + Ok(smallvec![Value::bool(true), Value::u64(handle as u64)]) + } else { + Ok(smallvec![Value::bool(false), Value::u64(handle as u64)]) + } + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), @@ -78,6 +95,13 @@ pub fn upcast_internal( let handle = safely_pop_arg!(args, u64); Ok(smallvec![Value::u64(handle)]) }, + ( + Some(Structure::BN254(BN254Structure::BN254Gt)), + Some(Structure::BN254(BN254Structure::BN254Fq12)), + ) => { + let handle = safely_pop_arg!(args, u64); + Ok(smallvec![Value::u64(handle)]) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/constants.rs b/aptos-move/framework/src/natives/cryptography/algebra/constants.rs index 73eadaf01d38d..f4d12284e59e7 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/constants.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/constants.rs @@ -3,9 +3,10 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - feature_flag_from_structure, AlgebraContext, Structure, BLS12381_GT_GENERATOR, - BLS12381_Q12_LENDIAN, BLS12381_R_LENDIAN, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, - MOVE_ABORT_CODE_NOT_IMPLEMENTED, + feature_flag_from_structure, AlgebraContext, BN254Structure, Structure, + BLS12381_GT_GENERATOR, BLS12381_Q12_LENDIAN, BLS12381_R_LENDIAN, BN254_GT_GENERATOR, + BN254_Q12_LENDIAN, BN254_Q2_LENDIAN, BN254_Q_LENDIAN, BN254_R_LENDIAN, + E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, store_element, structure_from_ty_arg, }; @@ -65,11 +66,46 @@ pub fn zero_internal( one, ALGEBRA_ARK_BLS12_381_FQ12_ONE ), + Some(Structure::BN254(s)) => zero_internal_bn254(context, s), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } +pub fn zero_internal_bn254( + context: &mut SafeNativeContext, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_constant_op_internal!(context, ark_bn254::Fr, zero, ALGEBRA_ARK_BN254_FR_ZERO) + }, + BN254Structure::BN254Fq => { + ark_constant_op_internal!(context, ark_bn254::Fq, zero, ALGEBRA_ARK_BN254_FQ_ZERO) + }, + BN254Structure::BN254Fq2 => { + ark_constant_op_internal!(context, ark_bn254::Fq2, zero, ALGEBRA_ARK_BN254_FQ2_ZERO) + }, + BN254Structure::BN254Fq12 => { + ark_constant_op_internal!(context, ark_bn254::Fq12, zero, ALGEBRA_ARK_BN254_FQ12_ZERO) + }, + BN254Structure::BN254G1 => ark_constant_op_internal!( + context, + ark_bn254::G1Projective, + zero, + ALGEBRA_ARK_BN254_G1_PROJ_INFINITY + ), + BN254Structure::BN254G2 => ark_constant_op_internal!( + context, + ark_bn254::G2Projective, + zero, + ALGEBRA_ARK_BN254_G2_PROJ_INFINITY + ), + BN254Structure::BN254Gt => { + ark_constant_op_internal!(context, ark_bn254::Fq12, one, ALGEBRA_ARK_BN254_FQ12_ONE) + }, + } +} pub fn one_internal( context: &mut SafeNativeContext, @@ -109,11 +145,49 @@ pub fn one_internal( let handle = store_element!(context, element)?; Ok(smallvec![Value::u64(handle as u64)]) }, + Some(Structure::BN254(s)) => one_internal_bn254(context, s), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } +fn one_internal_bn254( + context: &mut SafeNativeContext, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_constant_op_internal!(context, ark_bn254::Fr, one, ALGEBRA_ARK_BLS12_381_FR_ONE) + }, + BN254Structure::BN254Fq => { + ark_constant_op_internal!(context, ark_bn254::Fq, one, ALGEBRA_ARK_BN254_FQ_ONE) + }, + BN254Structure::BN254Fq2 => { + ark_constant_op_internal!(context, ark_bn254::Fq2, one, ALGEBRA_ARK_BN254_FQ2_ONE) + }, + BN254Structure::BN254Fq12 => { + ark_constant_op_internal!(context, ark_bn254::Fq12, one, ALGEBRA_ARK_BN254_FQ12_ONE) + }, + BN254Structure::BN254G1 => ark_constant_op_internal!( + context, + ark_bn254::G1Projective, + generator, + ALGEBRA_ARK_BN254_G1_PROJ_GENERATOR + ), + BN254Structure::BN254G2 => ark_constant_op_internal!( + context, + ark_bn254::G2Projective, + generator, + ALGEBRA_ARK_BN254_G2_PROJ_GENERATOR + ), + BN254Structure::BN254Gt => { + context.charge(ALGEBRA_ARK_BN254_FQ12_CLONE)?; + let element = *Lazy::force(&BN254_GT_GENERATOR); + let handle = store_element!(context, element)?; + Ok(smallvec![Value::u64(handle as u64)]) + }, + } +} pub fn order_internal( context: &mut SafeNativeContext, @@ -133,8 +207,22 @@ pub fn order_internal( Some(Structure::BLS12381Fq12) => { Ok(smallvec![Value::vector_u8(BLS12381_Q12_LENDIAN.clone())]) }, + Some(Structure::BN254(s)) => order_internal_bn254(s), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } + +#[inline] +fn order_internal_bn254(structure: BN254Structure) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr + | BN254Structure::BN254Gt + | BN254Structure::BN254G1 + | BN254Structure::BN254G2 => Ok(smallvec![Value::vector_u8(BN254_R_LENDIAN.clone())]), + BN254Structure::BN254Fq => Ok(smallvec![Value::vector_u8(BN254_Q_LENDIAN.clone())]), + BN254Structure::BN254Fq2 => Ok(smallvec![Value::vector_u8(BN254_Q2_LENDIAN.clone())]), + BN254Structure::BN254Fq12 => Ok(smallvec![Value::vector_u8(BN254_Q12_LENDIAN.clone())]), + } +} diff --git a/aptos-move/framework/src/natives/cryptography/algebra/eq.rs b/aptos-move/framework/src/natives/cryptography/algebra/eq.rs index 8e94fb0a2efb1..4b7bbdb1c717e 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/eq.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/eq.rs @@ -3,8 +3,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - abort_invariant_violated, feature_flag_from_structure, AlgebraContext, Structure, - MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, feature_flag_from_structure, AlgebraContext, BN254Structure, + Structure, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, structure_from_ty_arg, }; @@ -67,8 +67,51 @@ pub fn eq_internal( ark_bls12_381::Fq12, ALGEBRA_ARK_BLS12_381_FQ12_EQ ), + Some(Structure::BN254(bn254_structure)) => { + eq_internal_bn254(context, args, bn254_structure) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), } } + +fn eq_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_eq_internal!(context, args, ark_bn254::Fr, ALGEBRA_ARK_BN254_FR_EQ) + }, + BN254Structure::BN254Fq => { + ark_eq_internal!(context, args, ark_bn254::Fq, ALGEBRA_ARK_BN254_FQ_EQ) + }, + BN254Structure::BN254Fq2 => { + ark_eq_internal!(context, args, ark_bn254::Fq2, ALGEBRA_ARK_BN254_FQ2_EQ) + }, + BN254Structure::BN254Fq12 => { + ark_eq_internal!(context, args, ark_bn254::Fq12, ALGEBRA_ARK_BN254_FQ12_EQ) + }, + BN254Structure::BN254G1 => { + ark_eq_internal!( + context, + args, + ark_bn254::G1Projective, + ALGEBRA_ARK_BN254_G1_PROJ_EQ + ) + }, + BN254Structure::BN254G2 => { + ark_eq_internal!( + context, + args, + ark_bn254::G2Projective, + ALGEBRA_ARK_BN254_G2_PROJ_EQ + ) + }, + BN254Structure::BN254Gt => { + ark_eq_internal!(context, args, ark_bn254::Fq12, ALGEBRA_ARK_BN254_FQ12_EQ) + }, + } +} diff --git a/aptos-move/framework/src/natives/cryptography/algebra/mod.rs b/aptos-move/framework/src/natives/cryptography/algebra/mod.rs index fd100020dd5e2..83c9ccf46fb68 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/mod.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/mod.rs @@ -25,6 +25,8 @@ use arithmetics::{ inv::inv_internal, scalar_mul::{multi_scalar_mul_internal, scalar_mul_internal}, }; +use ark_ec::{pairing::Pairing, AffineRepr}; +use ark_ff::{BigInteger, PrimeField}; use ark_serialize::CanonicalDeserialize; use better_any::{Tid, TidAble}; use move_binary_format::errors::PartialVMError; @@ -58,6 +60,33 @@ pub enum Structure { BLS12381G2, BLS12381Gt, BLS12381Fr, + BN254(BN254Structure), +} +#[derive(Copy, Clone, Eq, Hash, PartialEq)] +pub enum BN254Structure { + BN254Fr, + BN254Fq, + BN254Fq2, + BN254Fq12, + BN254G1, + BN254G2, + BN254Gt, +} +impl TryFrom for BN254Structure { + type Error = (); + + fn try_from(value: TypeTag) -> Result { + match value.to_string().as_str() { + "0x1::bn254_algebra::Fr" => Ok(Self::BN254Fr), + "0x1::bn254_algebra::Fq" => Ok(Self::BN254Fq), + "0x1::bn254_algebra::Fq2" => Ok(Self::BN254Fq2), + "0x1::bn254_algebra::Fq12" => Ok(Self::BN254Fq12), + "0x1::bn254_algebra::G1" => Ok(Self::BN254G1), + "0x1::bn254_algebra::G2" => Ok(Self::BN254G2), + "0x1::bn254_algebra::Gt" => Ok(Self::BN254Gt), + _ => Err(()), + } + } } impl TryFrom for Structure { @@ -70,7 +99,8 @@ impl TryFrom for Structure { "0x1::bls12381_algebra::G1" => Ok(Structure::BLS12381G1), "0x1::bls12381_algebra::G2" => Ok(Structure::BLS12381G2), "0x1::bls12381_algebra::Gt" => Ok(Structure::BLS12381Gt), - _ => Err(()), + + _ => Ok(Structure::BN254(BN254Structure::try_from(value)?)), } } } @@ -94,6 +124,44 @@ pub enum SerializationFormat { BLS12381Gt, BLS12381FrLsb, BLS12381FrMsb, + + BN254(BN254SerializationFormat), +} + +#[derive(Copy, Clone, Eq, Hash, PartialEq)] +pub enum BN254SerializationFormat { + BN254G1Compressed, + BN254G1Uncompressed, + BN254G2Compressed, + BN254G2Uncompressed, + BN254Gt, + BN254FrLsb, + BN254FrMsb, + BN254FqLsb, + BN254FqMsb, + BN254Fq2LscLsb, + BN254Fq12LscLsb, +} + +impl TryFrom for BN254SerializationFormat { + type Error = (); + + fn try_from(value: TypeTag) -> Result { + match value.to_string().as_str() { + "0x1::bn254_algebra::FormatG1Uncompr" => Ok(Self::BN254G1Uncompressed), + "0x1::bn254_algebra::FormatG1Compr" => Ok(Self::BN254G1Compressed), + "0x1::bn254_algebra::FormatG2Uncompr" => Ok(Self::BN254G2Uncompressed), + "0x1::bn254_algebra::FormatG2Compr" => Ok(Self::BN254G2Compressed), + "0x1::bn254_algebra::FormatGt" => Ok(Self::BN254Gt), + "0x1::bn254_algebra::FormatFrLsb" => Ok(Self::BN254FrLsb), + "0x1::bn254_algebra::FormatFrMsb" => Ok(Self::BN254FrMsb), + "0x1::bn254_algebra::FormatFqLsb" => Ok(Self::BN254FqLsb), + "0x1::bn254_algebra::FormatFqMsb" => Ok(Self::BN254FqMsb), + "0x1::bn254_algebra::FormatFq2LscLsb" => Ok(Self::BN254Fq2LscLsb), + "0x1::bn254_algebra::FormatFq12LscLsb" => Ok(Self::BN254Fq12LscLsb), + _ => Err(()), + } + } } impl TryFrom for SerializationFormat { @@ -115,7 +183,10 @@ impl TryFrom for SerializationFormat { "0x1::bls12381_algebra::FormatGt" => Ok(SerializationFormat::BLS12381Gt), "0x1::bls12381_algebra::FormatFrLsb" => Ok(SerializationFormat::BLS12381FrLsb), "0x1::bls12381_algebra::FormatFrMsb" => Ok(SerializationFormat::BLS12381FrMsb), - _ => Err(()), + + _ => Ok(SerializationFormat::BN254( + BN254SerializationFormat::try_from(value)?, + )), } } } @@ -209,6 +280,7 @@ fn feature_flag_from_structure(structure_opt: Option) -> Option Some(FeatureFlag::BLS12_381_STRUCTURES), + Some(Structure::BN254(_)) => Some(FeatureFlag::BN254_STRUCTURES), _ => None, } } @@ -259,6 +331,29 @@ static BLS12381_Q12_LENDIAN: Lazy> = Lazy::new(|| { hex::decode("1175f55da544c7625f8ccb1360e2b1d3ca40747811c8f5ed04440afe232b476c0215676aec05f2a44ac2da6b6d1b7cff075e7b2a587e0aab601a8d3db4f0d29906e5e4d0d78119f396d5a59f0f8d1ca8bca62540be6ab9c12d0ca00de1f311f106278d000e55a393c9766a74e0d08a298450f60d7e666575e3354bf14b8731f4e721c0c180a5ed55c2f8f51f815baecbf96b5fc717eb58ac161a27d1d5f2bdc1a079609b9d6449165b2466b32a01eac7992a1ea0cac2f223cde1d56f9bbccc67afe44621daf858df3fc0eb837818f3e42ab3e131ce4e492efa63c108e6ef91c29ed63b3045baebcb0ab8d203c7f558beaffccba31b12aca7f54b58d0c28340e4fdb3c7c94fe9c4fef9d640ff2fcff02f1748416cbed0981fbff49f0e39eaf8a30273e67ed851944d33d6a593ef5ddcd62da84568822a6045b633bf6a513b3cfe8f9de13e76f8dcbd915980dec205eab6a5c0c72dcebd9afff1d25509ddbf33f8e24131fbd74cda93336514340cf8036b66b09ed9e6a6ac37e22fb3ac407e321beae8cd9fe74c8aaeb4edaa9a7272848fc623f6fe835a2e647379f547fc5ec6371318a85bfa60009cb20ccbb8a467492988a87633c14c0324ba0d0c3e1798ed29c8494cea35023746da05e35d184b4a301d5b2238d665495c6318b5af8653758008952d06cb9e62487b196d64383c73c06d6e1cccdf9b3ce8f95679e7050d949004a55f4ccf95b2552880ae36d1f7e09504d2338316d87d14a064511a295d768113e301bdf9d4383a8be32192d3f2f3b2de14181c73839a7cb4af5301").unwrap() }); +/// Gt = e(G1, G2) +static BN254_GT_GENERATOR: Lazy = Lazy::new(|| { + ark_bn254::Bn254::pairing( + ark_bn254::G1Affine::generator(), + ark_bn254::G2Affine::generator(), + ) + .0 +}); +static BN254_R_LENDIAN: Lazy> = Lazy::new(|| BN254_R_SCALAR.to_bytes_le()); +const BN254_R_SCALAR: ark_ff::BigInteger256 = ark_bn254::Fr::MODULUS; +static BN254_Q_LENDIAN: Lazy> = Lazy::new(|| BN254_Q_SCALAR.to_bytes_le()); +const BN254_Q_SCALAR: ark_ff::BigInteger256 = ark_bn254::Fq::MODULUS; + +/// generated by: ark_bn254::Fq::MODULUS.pow(2) +static BN254_Q2_LENDIAN: Lazy> = Lazy::new(|| { + hex::decode("b1695d27a258543b01c1ea092d0702a6dcca966d9c18504ac842127a959e68048db3c6345cfaed260656371651850bb01cd248037c6f9a599cbf3c76b8c42509").unwrap() +}); + +/// generated by: ark_bn254::Fq::MODULUS.pow(12) +static BN254_Q12_LENDIAN: Lazy> = Lazy::new(|| { + hex::decode("21f186cad2e2d4c1dbaf8a066b0ebf41f734e3f859b1c523a6c1f4d457413fdbe3cd44add090135d3ae519acc30ee3bdb6bfac6573b767e975b18a77d53cdcddebf3672c74da9d1409d51b2b2db7ff000d59e3aa7cf09220159f925c86b65459ca6558c4eaa703bf45d85030ff85cc6a879c7e2c4034f7045faf20e4d3dcfffac5eb6634c3e7b939b69b2be70bdf6b9a4680297839b4e3a48cd746bd4d0ea82749ffb7e71bd9b3fb10aa684d71e6adab1250b1d8604d91b51c76c256a50b60ddba2f52b6cc853ac926c6ea86d09d400b2f2330e5c8e92e38905ba50a50c9e11cd979c284bf1327ccdc051a6da1a4a7eac5cec16757a27a1a2311bedd108a9b21ac0814269e7523a5dd3a1f5f4767ffe504a6cb3994fb0ec98d5cd5da00b9cb1188a85f2aa871ecb8a0f9d64141f1ccd2699c138e0ef9ac4d8d6a692b29db0f38b60eb08426ab46109fbab9a5221bb44dd338aafebcc4e6c10dd933597f3ff44ba41d04e82871447f3a759cfa9397c22c0c77f13618dfb65adc8aacf008").unwrap() +}); + pub fn make_all( builder: &SafeNativeBuilder, ) -> impl Iterator + '_ { diff --git a/aptos-move/framework/src/natives/cryptography/algebra/new.rs b/aptos-move/framework/src/natives/cryptography/algebra/new.rs index 7584cf14eaebb..5e332aaa2073a 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/new.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/new.rs @@ -3,8 +3,8 @@ use crate::{ abort_unless_arithmetics_enabled_for_structure, abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - feature_flag_from_structure, AlgebraContext, Structure, E_TOO_MUCH_MEMORY_USED, - MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, + feature_flag_from_structure, AlgebraContext, BN254Structure, Structure, + E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, store_element, structure_from_ty_arg, }; @@ -47,6 +47,37 @@ pub fn from_u64_internal( ark_bls12_381::Fq12, ALGEBRA_ARK_BLS12_381_FQ12_FROM_U64 ), + Some(Structure::BN254(s)) => from_u64_internal_bn254(context, args, s), + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn from_u64_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + from_u64_internal!(context, args, ark_bn254::Fr, ALGEBRA_ARK_BN254_FR_FROM_U64) + }, + BN254Structure::BN254Fq => { + from_u64_internal!(context, args, ark_bn254::Fq, ALGEBRA_ARK_BN254_FQ_FROM_U64) + }, + BN254Structure::BN254Fq2 => from_u64_internal!( + context, + args, + ark_bn254::Fq2, + ALGEBRA_ARK_BN254_FQ2_FROM_U64 + ), + BN254Structure::BN254Fq12 => from_u64_internal!( + context, + args, + ark_bn254::Fq12, + ALGEBRA_ARK_BN254_FQ12_FROM_U64 + ), _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/pairing.rs b/aptos-move/framework/src/natives/cryptography/algebra/pairing.rs index 5af6f56addf38..278975fa93b24 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/pairing.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/pairing.rs @@ -3,9 +3,9 @@ use crate::{ abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - abort_invariant_violated, AlgebraContext, Structure, E_TOO_MUCH_MEMORY_USED, - MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_INPUT_VECTOR_SIZES_NOT_MATCHING, - MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, AlgebraContext, BN254Structure, Structure, + E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, + MOVE_ABORT_CODE_INPUT_VECTOR_SIZES_NOT_MATCHING, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -30,6 +30,11 @@ fn feature_flag_of_pairing( (Some(Structure::BLS12381G1), Some(Structure::BLS12381G2), Some(Structure::BLS12381Gt)) => { Some(FeatureFlag::BLS12_381_STRUCTURES) }, + ( + Some(Structure::BN254(BN254Structure::BN254G1)), + Some(Structure::BN254(BN254Structure::BN254G2)), + Some(Structure::BN254(BN254Structure::BN254Gt)), + ) => Some(FeatureFlag::BN254_STRUCTURES), _ => None, } } @@ -104,6 +109,74 @@ pub fn multi_pairing_internal( let new_handle = store_element!(context, new_element)?; Ok(smallvec![Value::u64(new_handle as u64)]) }, + (Some(Structure::BN254(g1)), Some(Structure::BN254(g2)), Some(Structure::BN254(gt))) => { + multi_pairing_internal_bn254(context, args, g1, g2, gt) + }, + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn multi_pairing_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + g1: BN254Structure, + g2: BN254Structure, + gt: BN254Structure, +) -> SafeNativeResult> { + match (g1, g2, gt) { + (BN254Structure::BN254G1, BN254Structure::BN254G2, BN254Structure::BN254Gt) => { + let g2_element_handles = safely_pop_arg!(args, Vec); + let g1_element_handles = safely_pop_arg!(args, Vec); + let num_entries = g1_element_handles.len(); + if num_entries != g2_element_handles.len() { + return Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_INPUT_VECTOR_SIZES_NOT_MATCHING, + }); + } + + context.charge( + ALGEBRA_ARK_BN254_G1_PROJ_TO_AFFINE.per::() + * NumArgs::from(num_entries as u64), + )?; + let mut g1_elements_affine = Vec::with_capacity(num_entries); + for handle in g1_element_handles { + safe_borrow_element!( + context, + handle as usize, + ark_bn254::G1Projective, + ptr, + element + ); + g1_elements_affine.push(element.into_affine()); + } + + context.charge( + ALGEBRA_ARK_BN254_G2_PROJ_TO_AFFINE.per::() + * NumArgs::from(num_entries as u64), + )?; + let mut g2_elements_affine = Vec::with_capacity(num_entries); + for handle in g2_element_handles { + safe_borrow_element!( + context, + handle as usize, + ark_bn254::G2Projective, + ptr, + element + ); + g2_elements_affine.push(element.into_affine()); + } + + context.charge( + ALGEBRA_ARK_BN254_MULTI_PAIRING_BASE + + ALGEBRA_ARK_BN254_MULTI_PAIRING_PER_PAIR * NumArgs::from(num_entries as u64), + )?; + let new_element = + ark_bn254::Bn254::multi_pairing(g1_elements_affine, g2_elements_affine).0; + let new_handle = store_element!(context, new_element)?; + Ok(smallvec![Value::u64(new_handle as u64)]) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), @@ -148,6 +221,50 @@ pub fn pairing_internal( let new_handle = store_element!(context, new_element)?; Ok(smallvec![Value::u64(new_handle as u64)]) }, + (Some(Structure::BN254(g1)), Some(Structure::BN254(g2)), Some(Structure::BN254(gt))) => { + pairing_internal_bn254(context, args, g1, g2, gt) + }, + + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + +fn pairing_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + g1: BN254Structure, + g2: BN254Structure, + gt: BN254Structure, +) -> SafeNativeResult> { + match (g1, g2, gt) { + (BN254Structure::BN254G1, BN254Structure::BN254G2, BN254Structure::BN254Gt) => { + let g2_element_handle = safely_pop_arg!(args, u64) as usize; + let g1_element_handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!( + context, + g1_element_handle, + ark_bn254::G1Projective, + g1_element_ptr, + g1_element + ); + context.charge(ALGEBRA_ARK_BN254_G1_PROJ_TO_AFFINE)?; + let g1_element_affine = g1_element.into_affine(); + safe_borrow_element!( + context, + g2_element_handle, + ark_bn254::G2Projective, + g2_element_ptr, + g2_element + ); + context.charge(ALGEBRA_ARK_BN254_G2_PROJ_TO_AFFINE)?; + let g2_element_affine = g2_element.into_affine(); + context.charge(ALGEBRA_ARK_BN254_PAIRING)?; + let new_element = ark_bn254::Bn254::pairing(g1_element_affine, g2_element_affine).0; + let new_handle = store_element!(context, new_element)?; + Ok(smallvec![Value::u64(new_handle as u64)]) + }, _ => Err(SafeNativeError::Abort { abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, }), diff --git a/aptos-move/framework/src/natives/cryptography/algebra/rand.rs b/aptos-move/framework/src/natives/cryptography/algebra/rand.rs index 52489a4a4123a..682d3ff2c17c1 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/rand.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/rand.rs @@ -3,8 +3,8 @@ #[cfg(feature = "testing")] use crate::{ natives::cryptography::algebra::{ - AlgebraContext, Structure, BLS12381_GT_GENERATOR, E_TOO_MUCH_MEMORY_USED, - MEMORY_LIMIT_IN_BYTES, + AlgebraContext, BN254Structure, Structure, BLS12381_GT_GENERATOR, BN254_GT_GENERATOR, + E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, }, structure_from_ty_arg, }; @@ -77,6 +77,43 @@ pub fn rand_insecure_internal( Err(abort_code) => Err(SafeNativeError::Abort { abort_code }), } }, + Some(Structure::BN254(s)) => rand_insecure_internal_bn254(context, s), _ => unreachable!(), } } +#[cfg(feature = "testing")] +#[inline] +fn rand_insecure_internal_bn254( + context: &mut SafeNativeContext, + structure: BN254Structure, +) -> SafeNativeResult> { + match structure { + BN254Structure::BN254Fr => { + ark_rand_internal!(context, ark_bn254::Fr) + }, + BN254Structure::BN254Fq => { + ark_rand_internal!(context, ark_bn254::Fq) + }, + BN254Structure::BN254Fq2 => { + ark_rand_internal!(context, ark_bn254::Fq2) + }, + BN254Structure::BN254Fq12 => { + ark_rand_internal!(context, ark_bn254::Fq12) + }, + BN254Structure::BN254G1 => { + ark_rand_internal!(context, ark_bn254::G1Projective) + }, + BN254Structure::BN254G2 => { + ark_rand_internal!(context, ark_bn254::G2Projective) + }, + BN254Structure::BN254Gt => { + let k = ark_bn254::Fr::rand(&mut test_rng()); + let k_bigint: ark_ff::BigInteger256 = k.into(); + let element = BN254_GT_GENERATOR.pow(k_bigint); + match store_element!(context, element) { + Ok(handle) => Ok(smallvec![Value::u64(handle as u64)]), + Err(abort_code) => Err(SafeNativeError::Abort { abort_code }), + } + }, + } +} diff --git a/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs b/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs index aff3819078bb8..6e3f1ac36b46c 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs @@ -3,9 +3,9 @@ use crate::{ abort_unless_feature_flag_enabled, natives::cryptography::algebra::{ - abort_invariant_violated, AlgebraContext, SerializationFormat, Structure, - BLS12381_R_SCALAR, E_TOO_MUCH_MEMORY_USED, MEMORY_LIMIT_IN_BYTES, - MOVE_ABORT_CODE_NOT_IMPLEMENTED, + abort_invariant_violated, AlgebraContext, BN254SerializationFormat, BN254Structure, + SerializationFormat, Structure, BLS12381_R_SCALAR, BN254_R_SCALAR, E_TOO_MUCH_MEMORY_USED, + MEMORY_LIMIT_IN_BYTES, MOVE_ABORT_CODE_NOT_IMPLEMENTED, }, safe_borrow_element, store_element, structure_from_ty_arg, }; @@ -37,6 +37,7 @@ pub fn feature_flag_of_serialization_format( | Some(SerializationFormat::BLS12381G2Uncompressed) | Some(SerializationFormat::BLS12381G2Compressed) | Some(SerializationFormat::BLS12381Gt) => Some(FeatureFlag::BLS12_381_STRUCTURES), + Some(SerializationFormat::BN254(_)) => Some(FeatureFlag::BN254_STRUCTURES), _ => None, } } @@ -65,6 +66,10 @@ pub fn serialize_internal( let format_opt = format_from_ty_arg!(context, &ty_args[1]); abort_unless_serialization_format_enabled!(context, format_opt); match (structure_opt, format_opt) { + ( + Some(Structure::BN254(bn254_structure)), + Some(SerializationFormat::BN254(bn254_format)), + ) => serialize_internal_bn254(context, args, bn254_structure, bn254_format), (Some(Structure::BLS12381Fr), Some(SerializationFormat::BLS12381FrLsb)) => { let handle = safely_pop_arg!(args, u64) as usize; safe_borrow_element!(context, handle, ark_bls12_381::Fr, element_ptr, element); @@ -180,6 +185,161 @@ pub fn serialize_internal( } } +fn serialize_internal_bn254( + context: &mut SafeNativeContext, + mut args: VecDeque, + structure: BN254Structure, + format: BN254SerializationFormat, +) -> SafeNativeResult> { + match (structure, format) { + (BN254Structure::BN254Fr, BN254SerializationFormat::BN254FrLsb) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fr, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FR_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254Fr, BN254SerializationFormat::BN254FrMsb) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fr, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FR_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + buf.reverse(); + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254Fq, BN254SerializationFormat::BN254FrLsb) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FQ_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254Fq, BN254SerializationFormat::BN254FqMsb) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FQ_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + buf.reverse(); + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254Fq2, BN254SerializationFormat::BN254Fq2LscLsb) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq2, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FQ2_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + buf.reverse(); + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254Fq12, BN254SerializationFormat::BN254Fq12LscLsb) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq12, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FQ12_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + buf.reverse(); + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254G1, BN254SerializationFormat::BN254G1Uncompressed) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!( + context, + handle, + ark_bn254::G1Projective, + element_ptr, + element + ); + let element_affine = element.into_affine(); + let mut buf = Vec::new(); + context.charge(ALGEBRA_ARK_BN254_G1_AFFINE_SERIALIZE_UNCOMP)?; + element_affine + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254G1, BN254SerializationFormat::BN254G1Compressed) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!( + context, + handle, + ark_bn254::G1Projective, + element_ptr, + element + ); + let element_affine = element.into_affine(); + let mut buf = Vec::new(); + context.charge(ALGEBRA_ARK_BN254_G1_AFFINE_SERIALIZE_COMP)?; + element_affine + .serialize_compressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254G2, BN254SerializationFormat::BN254G2Uncompressed) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!( + context, + handle, + ark_bn254::G2Projective, + element_ptr, + element + ); + let element_affine = element.into_affine(); + let mut buf = Vec::new(); + context.charge(ALGEBRA_ARK_BN254_G2_AFFINE_SERIALIZE_UNCOMP)?; + element_affine + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254G2, BN254SerializationFormat::BN254G2Compressed) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!( + context, + handle, + ark_bn254::G2Projective, + element_ptr, + element + ); + let element_affine = element.into_affine(); + let mut buf = Vec::new(); + context.charge(ALGEBRA_ARK_BN254_G2_AFFINE_SERIALIZE_COMP)?; + element_affine + .serialize_compressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + (BN254Structure::BN254Gt, BN254SerializationFormat::BN254Gt) => { + let handle = safely_pop_arg!(args, u64) as usize; + safe_borrow_element!(context, handle, ark_bn254::Fq12, element_ptr, element); + let mut buf = vec![]; + context.charge(ALGEBRA_ARK_BN254_FQ12_SERIALIZE)?; + element + .serialize_uncompressed(&mut buf) + .map_err(|_e| abort_invariant_violated())?; + Ok(smallvec![Value::vector_u8(buf)]) + }, + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} + /// Macros that implements `deserialize_internal()` using arkworks libraries. macro_rules! ark_deserialize_internal { ($context:expr, $bytes:expr, $ark_typ:ty, $ark_deser_func:ident, $gas:expr) => {{ @@ -233,6 +393,10 @@ pub fn deserialize_internal( let bytes_ref = vector_ref.as_bytes_ref(); let bytes = bytes_ref.as_slice(); match (structure_opt, format_opt) { + ( + Some(Structure::BN254(bn254_structure)), + Some(SerializationFormat::BN254(bn254_format)), + ) => deserialize_internal_bn254(context, bn254_structure, bn254_format, bytes), (Some(Structure::BLS12381Fr), Some(SerializationFormat::BLS12381FrLsb)) => { // Valid BLS12381FrLsb serialization should be 32-byte. // NOTE: Arkworks deserialization cost grows as the input size grows. @@ -355,3 +519,167 @@ pub fn deserialize_internal( }), } } + +pub fn deserialize_internal_bn254( + context: &mut SafeNativeContext, + structure: BN254Structure, + format: BN254SerializationFormat, + bytes: &[u8], +) -> SafeNativeResult> { + match (structure, format) { + (BN254Structure::BN254Fr, BN254SerializationFormat::BN254FrLsb) => { + if bytes.len() != 32 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_deserialize_internal!( + context, + bytes, + ark_bn254::Fr, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_FR_DESER + ) + }, + (BN254Structure::BN254Fr, BN254SerializationFormat::BN254FrMsb) => { + if bytes.len() != 32 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + let mut bytes_copy: Vec = bytes.to_vec(); + bytes_copy.reverse(); + let bytes = bytes_copy.as_slice(); + ark_deserialize_internal!( + context, + bytes, + ark_bn254::Fr, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_FR_DESER + ) + }, + (BN254Structure::BN254Fq, BN254SerializationFormat::BN254FqLsb) => { + if bytes.len() != 32 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_deserialize_internal!( + context, + bytes, + ark_bn254::Fq, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_FQ_DESER + ) + }, + (BN254Structure::BN254Fq, BN254SerializationFormat::BN254FqMsb) => { + if bytes.len() != 32 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + let mut bytes_copy: Vec = bytes.to_vec(); + bytes_copy.reverse(); + let bytes = bytes_copy.as_slice(); + ark_deserialize_internal!( + context, + bytes, + ark_bn254::Fq, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_FQ_DESER + ) + }, + (BN254Structure::BN254Fq2, BN254SerializationFormat::BN254Fq2LscLsb) => { + // Valid BN254Fq2LscLsb serialization should be 32*2 = 64-byte. + if bytes.len() != 64 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_deserialize_internal!( + context, + bytes, + ark_bn254::Fq2, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_FQ2_DESER + ) + }, + (BN254Structure::BN254Fq12, BN254SerializationFormat::BN254Fq12LscLsb) => { + // Valid BN254Fq12LscLsb serialization should be 32*12 = 64-byte. + if bytes.len() != 384 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_deserialize_internal!( + context, + bytes, + ark_bn254::Fq12, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_FQ12_DESER + ) + }, + (BN254Structure::BN254G1, BN254SerializationFormat::BN254G1Uncompressed) => { + // Valid BN254G1AffineUncompressed serialization should be 64-byte. + if bytes.len() != 64 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_ec_point_deserialize_internal!( + context, + bytes, + ark_bn254::G1Affine, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_G1_AFFINE_DESER_UNCOMP + ) + }, + (BN254Structure::BN254G1, BN254SerializationFormat::BN254G1Compressed) => { + // Valid BN254G1AffineCompressed serialization should be 32-byte. + if bytes.len() != 32 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_ec_point_deserialize_internal!( + context, + bytes, + ark_bn254::G1Affine, + deserialize_compressed, + ALGEBRA_ARK_BN254_G1_AFFINE_DESER_COMP + ) + }, + (BN254Structure::BN254G2, BN254SerializationFormat::BN254G2Uncompressed) => { + // Valid BN254G2AffineUncompressed serialization should be 128-byte. + if bytes.len() != 128 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_ec_point_deserialize_internal!( + context, + bytes, + ark_bn254::G2Affine, + deserialize_uncompressed, + ALGEBRA_ARK_BN254_G2_AFFINE_DESER_UNCOMP + ) + }, + (BN254Structure::BN254G2, BN254SerializationFormat::BN254G2Compressed) => { + // Valid BN254G2AffineCompressed serialization should be 64-byte. + if bytes.len() != 64 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + ark_ec_point_deserialize_internal!( + context, + bytes, + ark_bn254::G2Affine, + deserialize_compressed, + ALGEBRA_ARK_BN254_G2_AFFINE_DESER_COMP + ) + }, + (BN254Structure::BN254Gt, BN254SerializationFormat::BN254Gt) => { + // Valid BN254Gt serialization should be 32*12=384-byte. + if bytes.len() != 384 { + return Ok(smallvec![Value::bool(false), Value::u64(0)]); + } + context.charge(ALGEBRA_ARK_BN254_FQ12_DESER)?; + match ::deserialize_uncompressed(bytes) { + Ok(element) => { + context.charge(ALGEBRA_ARK_BN254_FQ12_POW_U256 + ALGEBRA_ARK_BN254_FQ12_EQ)?; + if element.pow(BN254_R_SCALAR.0) == ark_bn254::Fq12::one() { + let handle = store_element!(context, element)?; + Ok(smallvec![Value::bool(true), Value::u64(handle as u64)]) + } else { + Ok(smallvec![Value::bool(false), Value::u64(0)]) + } + }, + _ => Ok(smallvec![Value::bool(false), Value::u64(0)]), + } + }, + _ => Err(SafeNativeError::Abort { + abort_code: MOVE_ABORT_CODE_NOT_IMPLEMENTED, + }), + } +} diff --git a/aptos-move/vm-genesis/src/lib.rs b/aptos-move/vm-genesis/src/lib.rs index c5a5309c84755..457bd2c9e6e11 100644 --- a/aptos-move/vm-genesis/src/lib.rs +++ b/aptos-move/vm-genesis/src/lib.rs @@ -436,6 +436,7 @@ pub fn default_features() -> Vec { FeatureFlag::FEE_PAYER_ACCOUNT_OPTIONAL, FeatureFlag::LIMIT_MAX_IDENTIFIER_LENGTH, FeatureFlag::OPERATOR_BENEFICIARY_CHANGE, + FeatureFlag::BN254_STRUCTURES, ] } diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index d7ca037407609..90bb8710f9f09 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -50,6 +50,7 @@ pub enum FeatureFlag { VM_BINARY_FORMAT_V7 = 40, RESOURCE_GROUPS_CHARGE_AS_SIZE_SUM = 41, COMMISSION_CHANGE_DELEGATION_POOL = 42, + BN254_STRUCTURES = 43, } /// Representation of features on chain as a bitset. From 787cd17402071d0c1a9e6643a546b0f938ff009a Mon Sep 17 00:00:00 2001 From: caojiafeng Date: Thu, 30 Nov 2023 15:04:04 +0800 Subject: [PATCH 02/11] scripts: fix update_algebra_gas_params.py Signed-off-by: caojiafeng --- scripts/algebra-gas/update_algebra_gas_params.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/algebra-gas/update_algebra_gas_params.py b/scripts/algebra-gas/update_algebra_gas_params.py index 2eb69aa21cfb4..06f3855cfaa03 100755 --- a/scripts/algebra-gas/update_algebra_gas_params.py +++ b/scripts/algebra-gas/update_algebra_gas_params.py @@ -96,17 +96,19 @@ def get_algebra_lines(gas_per_ns): return lines def main(gas_per_ns): - path = Path('aptos-move/aptos-gas/src/aptos_framework.rs') + path = Path(PATH_STR) lines = path.read_text().split('\n') - line_id_begin = lines.index(' // Algebra gas parameters begin.') - line_id_end = lines.index(' // Algebra gas parameters end.') + striped_lines = [line.strip() for line in lines] + line_id_begin = striped_lines.index('// Algebra gas parameters begin.') + line_id_end = striped_lines.index('// Algebra gas parameters end.') generator_note_line = f' // Generated at time {time()} by `scripts/algebra-gas/update_algebra_gas_params.py` with gas_per_ns={gas_per_ns}.' new_lines = lines[:line_id_begin+1] + [generator_note_line] + get_algebra_lines(gas_per_ns) + lines[line_id_end:] path.write_text('\n'.join(new_lines)) +PATH_STR = 'aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs' if __name__=='__main__': parser = argparse.ArgumentParser( - description='Generate gas parameters for algebra module in `aptos-move/aptos-gas/src/aptos_framework.rs`.') + description=f'Generate gas parameters for algebra module in `{PATH_STR}`.') parser.add_argument('--gas_per_ns', required=True, type=float) args = parser.parse_args() main(args.gas_per_ns) From 97a8c24e2837047862dc24977006f156b0daa54c Mon Sep 17 00:00:00 2001 From: caojiafeng Date: Thu, 30 Nov 2023 18:33:28 +0800 Subject: [PATCH 03/11] add bn254 to default features to make unit test pass --- types/src/on_chain_config/aptos_features.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 90bb8710f9f09..f0913fcecf5c3 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -74,7 +74,7 @@ impl Default for Features { features.enable(APTOS_UNIQUE_IDENTIFIERS); features.enable(SIGNATURE_CHECKER_V2_SCRIPT_FIX); features.enable(AGGREGATOR_V2_API); - + features.enable(BN254_STRUCTURES); features } } From 6c99c0380daaafe72d60dddf6066c2a2eb26f03c Mon Sep 17 00:00:00 2001 From: caojiafeng Date: Fri, 1 Dec 2023 09:41:05 +0800 Subject: [PATCH 04/11] fix a bug mentioned in the comments --- .../framework/src/natives/cryptography/algebra/serialization.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs b/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs index 6e3f1ac36b46c..c31c44fb664d9 100644 --- a/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs +++ b/aptos-move/framework/src/natives/cryptography/algebra/serialization.rs @@ -242,7 +242,6 @@ fn serialize_internal_bn254( element .serialize_uncompressed(&mut buf) .map_err(|_e| abort_invariant_violated())?; - buf.reverse(); Ok(smallvec![Value::vector_u8(buf)]) }, (BN254Structure::BN254Fq12, BN254SerializationFormat::BN254Fq12LscLsb) => { @@ -253,7 +252,6 @@ fn serialize_internal_bn254( element .serialize_uncompressed(&mut buf) .map_err(|_e| abort_invariant_violated())?; - buf.reverse(); Ok(smallvec![Value::vector_u8(buf)]) }, (BN254Structure::BN254G1, BN254SerializationFormat::BN254G1Uncompressed) => { From f500e7cc588199447c8bc3f13863988c853fcc89 Mon Sep 17 00:00:00 2001 From: "zhoujun.ma" Date: Fri, 1 Dec 2023 10:00:19 -0800 Subject: [PATCH 05/11] initial --- Cargo.lock | 1 + crates/aptos-crypto/Cargo.toml | 5 +++ crates/aptos-crypto/benches/ark_bn254.rs | 55 ++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 crates/aptos-crypto/benches/ark_bn254.rs diff --git a/Cargo.lock b/Cargo.lock index 4d18974e6bd70..0ad2e250ed560 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -926,6 +926,7 @@ dependencies = [ "anyhow", "aptos-crypto-derive", "ark-bls12-381", + "ark-bn254", "ark-ec", "ark-ff", "ark-serialize", diff --git a/crates/aptos-crypto/Cargo.toml b/crates/aptos-crypto/Cargo.toml index ab45c4a24b312..1d86e14fd9725 100644 --- a/crates/aptos-crypto/Cargo.toml +++ b/crates/aptos-crypto/Cargo.toml @@ -54,6 +54,7 @@ x25519-dalek = { workspace = true } [dev-dependencies] ark-bls12-381 = { workspace = true } +ark-bn254 = { workspace = true } ark-serialize = { workspace = true } ark-std = { workspace = true } bitvec = { workspace = true } @@ -81,6 +82,10 @@ harness = false name = "bls12381" harness = false +[[bench]] +name = "ark_bn254" +harness = false + [[bench]] name = "ed25519" harness = false diff --git a/crates/aptos-crypto/benches/ark_bn254.rs b/crates/aptos-crypto/benches/ark_bn254.rs new file mode 100644 index 0000000000000..7c3eaf4fbcd22 --- /dev/null +++ b/crates/aptos-crypto/benches/ark_bn254.rs @@ -0,0 +1,55 @@ +// Copyright © Aptos Foundation + +// Copyright (c) Aptos +// SPDX-License-Identifier: Apache-2.0 + +#[macro_use] +extern crate criterion; + +use aptos_crypto::test_utils::random_bytes; +use ark_bn254::{Fq12, Fr, G1Affine, G1Projective, G2Affine, G2Projective}; +use ark_ec::{ + hashing::HashToCurve, pairing::Pairing, short_weierstrass::Projective, AffineRepr, CurveGroup, + Group, +}; +use ark_ff::{BigInteger256, Field, One, UniformRand, Zero}; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use ark_std::test_rng; +use criterion::{BenchmarkId, Criterion}; +use rand::thread_rng; +use std::ops::{Add, Div, Mul, Neg}; + +macro_rules! rand { + ($typ:ty) => {{ + <$typ>::rand(&mut test_rng()) + }}; +} + +macro_rules! serialize { + ($obj:expr, $method:ident) => {{ + let mut buf = vec![]; + $obj.$method(&mut buf).unwrap(); + buf + }}; +} + +fn bench_group(c: &mut Criterion) { + let mut group = c.benchmark_group("ark_bn254"); + + group.bench_function("fr_add", move |b| { + b.iter_with_setup( + || (rand!(Fr), rand!(Fr)), + |(k_1, k_2)| { + let _k_3 = k_1 + k_2; + }, + ) + }); + + group.finish(); +} + +criterion_group!( + name = ark_bn254_benches; + config = Criterion::default(); //.measurement_time(Duration::from_secs(100)); + targets = bench_group); +criterion_main!(ark_bn254_benches); From d31e5c56bb39858e3a172271631aad59b2bb09e6 Mon Sep 17 00:00:00 2001 From: "zhoujun.ma" Date: Sat, 2 Dec 2023 02:41:06 -0800 Subject: [PATCH 06/11] update --- .../src/gas_schedule/aptos_framework.rs | 87 +- crates/aptos-crypto/benches/ark_bn254.rs | 797 +++++++++++++++++- crates/aptos-crypto/src/bench_utils.rs | 1 + crates/aptos-crypto/src/lib.rs | 1 + .../update_bn254_algebra_gas_params.py | 112 +++ 5 files changed, 910 insertions(+), 88 deletions(-) create mode 100644 crates/aptos-crypto/src/bench_utils.rs create mode 100755 scripts/algebra-gas/update_bn254_algebra_gas_params.py diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 24dcb7b9a452b..76b9c6b23f9dd 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -16,91 +16,8 @@ crate::gas_schedule::macros::define_gas_parameters!( [account_create_address_base: InternalGas, "account.create_address.base", 6000], [account_create_signer_base: InternalGas, "account.create_signer.base", 6000], - [algebra_ark_bn254_fq2_add: InternalGas, { 12.. => "algebra.ark_bn254_fq2_add" }, 36380], - [algebra_ark_bn254_fq2_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq2_clone" }, 4220], - [algebra_ark_bn254_fq2_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq2_deser" }, 223600], - [algebra_ark_bn254_fq2_div: InternalGas, { 12.. => "algebra.ark_bn254_fq2_div" }, 5016260], - [algebra_ark_bn254_fq2_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq2_eq" }, 14520], - [algebra_ark_bn254_fq2_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq2_from_u64" }, 18020], - [algebra_ark_bn254_fq2_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq2_inv" }, 4010460], - [algebra_ark_bn254_fq2_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq2_mul" }, 997720], - [algebra_ark_bn254_fq2_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq2_neg" }, 23620], - [algebra_ark_bn254_fq2_one: InternalGas, { 12.. => "algebra.ark_bn254_fq2_one" }, 220], - [algebra_ark_bn254_fq2_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq2_pow_u256" }, 293284140], - [algebra_ark_bn254_fq2_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq2_serialize" }, 161560], - [algebra_ark_bn254_fq2_square: InternalGas, { 12.. => "algebra.ark_bn254_fq2_square" }, 702900], - [algebra_ark_bn254_fq2_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq2_sub" }, 35160], - [algebra_ark_bn254_fq2_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq2_zero" }, 4220], - [algebra_ark_bn254_fq12_add: InternalGas, { 12.. => "algebra.ark_bn254_fq12_add" }, 36380], - [algebra_ark_bn254_fq12_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq12_clone" }, 4220], - [algebra_ark_bn254_fq12_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq12_deser" }, 223600], - [algebra_ark_bn254_fq12_div: InternalGas, { 12.. => "algebra.ark_bn254_fq12_div" }, 5016260], - [algebra_ark_bn254_fq12_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq12_eq" }, 14520], - [algebra_ark_bn254_fq12_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq12_from_u64" }, 18020], - [algebra_ark_bn254_fq12_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq12_inv" }, 4010460], - [algebra_ark_bn254_fq12_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq12_mul" }, 997720], - [algebra_ark_bn254_fq12_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq12_neg" }, 23620], - [algebra_ark_bn254_fq12_one: InternalGas, { 12.. => "algebra.ark_bn254_fq12_one" }, 220], - [algebra_ark_bn254_fq12_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq12_pow_u256" }, 293284140], - [algebra_ark_bn254_fq12_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq12_serialize" }, 161560], - [algebra_ark_bn254_fq12_square: InternalGas, { 12.. => "algebra.ark_bn254_fq12_square" }, 702900], - [algebra_ark_bn254_fq12_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq12_sub" }, 35160], - [algebra_ark_bn254_fq12_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq12_zero" }, 4220], - [algebra_ark_bn254_fr_add: InternalGas, { 12.. => "algebra.ark_bn254_fr_add" }, 4220], - [algebra_ark_bn254_fr_deser: InternalGas, { 12.. => "algebra.ark_bn254_fr_deser" }, 15040], - [algebra_ark_bn254_fr_div: InternalGas, { 12.. => "algebra.ark_bn254_fr_div" }, 1188800], - [algebra_ark_bn254_fr_eq: InternalGas, { 12.. => "algebra.ark_bn254_fr_eq" }, 4240], - [algebra_ark_bn254_fr_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fr_from_u64" }, 9880], - [algebra_ark_bn254_fr_inv: InternalGas, { 12.. => "algebra.ark_bn254_fr_inv" }, 1172200], - [algebra_ark_bn254_fr_mul: InternalGas, { 12.. => "algebra.ark_bn254_fr_mul" }, 10040], - [algebra_ark_bn254_fr_neg: InternalGas, { 12.. => "algebra.ark_bn254_fr_neg" }, 4260], - [algebra_ark_bn254_fr_one: InternalGas, { 12.. => "algebra.ark_bn254_fr_one" }, 4220], - [algebra_ark_bn254_fr_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fr_serialize" }, 22060], - [algebra_ark_bn254_fr_square: InternalGas, { 12.. => "algebra.ark_bn254_fr_square" }, 9500], - [algebra_ark_bn254_fr_sub: InternalGas, { 12.. => "algebra.ark_bn254_fr_sub" }, 5800], - [algebra_ark_bn254_fr_zero: InternalGas, { 12.. => "algebra.ark_bn254_fr_zero" }, 4220], - [algebra_ark_bn254_fq_add: InternalGas, { 12.. => "algebra.ark_bn254_fq_add" }, 4220], - [algebra_ark_bn254_fq_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq_deser" }, 15040], - [algebra_ark_bn254_fq_div: InternalGas, { 12.. => "algebra.ark_bn254_fq_div" }, 1188800], - [algebra_ark_bn254_fq_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq_eq" }, 4240], - [algebra_ark_bn254_fq_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq_from_u64" }, 9880], - [algebra_ark_bn254_fq_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq_inv" }, 1172200], - [algebra_ark_bn254_fq_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq_mul" }, 10040], - [algebra_ark_bn254_fq_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq_neg" }, 4260], - [algebra_ark_bn254_fq_one: InternalGas, { 12.. => "algebra.ark_bn254_fq_one" }, 4220], - [algebra_ark_bn254_fq_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq_serialize" }, 22060], - [algebra_ark_bn254_fq_square: InternalGas, { 12.. => "algebra.ark_bn254_fq_square" }, 9500], - [algebra_ark_bn254_fq_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq_sub" }, 5800], - [algebra_ark_bn254_fq_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq_zero" }, 4220], - [algebra_ark_bn254_g1_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_comp" }, 20591980], - [algebra_ark_bn254_g1_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_uncomp" }, 14412760], - [algebra_ark_bn254_g1_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_comp" }, 40280], - [algebra_ark_bn254_g1_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_uncomp" }, 48660], - [algebra_ark_bn254_g1_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_add" }, 216120], - [algebra_ark_bn254_g1_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_double" }, 105280], - [algebra_ark_bn254_g1_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_eq" }, 100700], - [algebra_ark_bn254_g1_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_generator" }, 220], - [algebra_ark_bn254_g1_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_infinity" }, 220], - [algebra_ark_bn254_g1_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_neg" }, 220], - [algebra_ark_bn254_g1_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_scalar_mul" }, 50470420], - [algebra_ark_bn254_g1_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_sub" }, 222940], - [algebra_ark_bn254_g1_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_to_affine" }, 2420700], - [algebra_ark_bn254_g2_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_comp" }, 41201360], - [algebra_ark_bn254_g2_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_uncomp" }, 20359580], - [algebra_ark_bn254_g2_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_comp" }, 67560], - [algebra_ark_bn254_g2_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_uncomp" }, 84340], - [algebra_ark_bn254_g2_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_add" }, 648020], - [algebra_ark_bn254_g2_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_double" }, 296780], - [algebra_ark_bn254_g2_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_eq" }, 303100], - [algebra_ark_bn254_g2_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_generator" }, 220], - [algebra_ark_bn254_g2_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_infinity" }, 220], - [algebra_ark_bn254_g2_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_neg" }, 220], - [algebra_ark_bn254_g2_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_scalar_mul" }, 150530160], - [algebra_ark_bn254_g2_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_sub" }, 657380], - [algebra_ark_bn254_g2_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_to_affine" }, 2577140], - [algebra_ark_bn254_multi_pairing_base: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_base" }, 179972980], - [algebra_ark_bn254_multi_pairing_per_pair: InternalGasPerArg, { 12.. => "algebra.ark_bn254_multi_pairing_per_pair" }, 92052840], - [algebra_ark_bn254_pairing: InternalGas, { 12.. => "algebra.ark_bn254_pairing" }, 296644400], + // BN254 algebra gas parameters begin. + // BN254 algebra gas parameters end. // Algebra gas parameters begin. // Generated at time 1680606720.0709136 by `scripts/algebra-gas/update_algebra_gas_params.py` with gas_per_ns=10.23. diff --git a/crates/aptos-crypto/benches/ark_bn254.rs b/crates/aptos-crypto/benches/ark_bn254.rs index 7c3eaf4fbcd22..f4d669c1fc1a0 100644 --- a/crates/aptos-crypto/benches/ark_bn254.rs +++ b/crates/aptos-crypto/benches/ark_bn254.rs @@ -6,19 +6,27 @@ #[macro_use] extern crate criterion; -use aptos_crypto::test_utils::random_bytes; use ark_bn254::{Fq12, Fr, G1Affine, G1Projective, G2Affine, G2Projective}; use ark_ec::{ - hashing::HashToCurve, pairing::Pairing, short_weierstrass::Projective, AffineRepr, CurveGroup, + pairing::Pairing, short_weierstrass::Projective, AffineRepr, CurveGroup, Group, }; use ark_ff::{BigInteger256, Field, One, UniformRand, Zero}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use ark_std::test_rng; use criterion::{BenchmarkId, Criterion}; -use rand::thread_rng; use std::ops::{Add, Div, Mul, Neg}; +fn msm_all_bench_cases() -> Vec { + let series_until_65 = (1..65).step_by(2); + let series_until_129 = (64..129).step_by(4); + let series_until_257 = (129..257).step_by(8); + series_until_65 + .chain(series_until_129) + .chain(series_until_257) + .collect::>() +} + macro_rules! rand { ($typ:ty) => {{ <$typ>::rand(&mut test_rng()) @@ -45,6 +53,789 @@ fn bench_group(c: &mut Criterion) { ) }); + group.bench_function("fr_deser", move |b| { + b.iter_with_setup( + || { + let k = rand!(Fr); + serialize!(k, serialize_uncompressed) + }, + |buf| { + let _k = Fr::deserialize_uncompressed(buf.as_slice()).unwrap(); + }, + ) + }); + + group.bench_function("fr_deser_invalid_4_bytes", move |b| { + b.iter_with_setup( + || vec![0xFF_u8; 4], + |buf| { + let _k = Fr::deserialize_uncompressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("fr_deser_invalid_4000_bytes", move |b| { + b.iter_with_setup( + || vec![0xFF_u8; 4000], + |buf| { + let _k = Fr::deserialize_uncompressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("fr_deser_invalid_4000000_bytes", move |b| { + b.iter_with_setup( + || vec![0xFF_u8; 4000000], + |buf| { + let _k = Fr::deserialize_uncompressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("fr_div", move |b| { + b.iter_with_setup( + || (rand!(Fr), rand!(Fr)), + |(k_1, k_2)| { + let _k_3 = k_1 / k_2; + }, + ) + }); + + group.bench_function("fr_eq", move |b| { + b.iter_with_setup( + || { + let k_1 = rand!(Fr); + let k_2 = k_1; + (k_1, k_2) + }, + |(k_1, k_2)| { + let _res = k_1 == k_2; + }, + ) + }); + + group.bench_function("fr_from_u64", move |b| { + b.iter_with_setup( + || rand!(u64), + |v| { + let _res: Fr = BigInteger256::from(v).into(); + }, + ) + }); + + group.bench_function("fr_inv", move |b| { + b.iter_with_setup( + || rand!(Fr), + |k| { + let _k_inv = k.inverse(); + }, + ) + }); + + group.bench_function("fr_mul", move |b| { + b.iter_with_setup( + || (rand!(Fr), rand!(Fr)), + |(k_1, k_2)| { + let _k_3 = k_1 * k_2; + }, + ) + }); + + group.bench_function("fr_mul_self", move |b| { + b.iter_with_setup( + || rand!(Fr), + |k| { + let _k2 = k.mul(&k); + }, + ) + }); + + group.bench_function("fr_neg", move |b| { + b.iter_with_setup( + || rand!(Fr), + |k| { + let _k_inv = k.neg(); + }, + ) + }); + + group.bench_function("fr_one", move |b| { + b.iter_with_setup( + || {}, + |_| { + let _k = Fr::one(); + }, + ) + }); + + group.bench_function("fr_serialize", move |b| { + b.iter_with_setup( + || rand!(Fr), + |k| { + let _buf = serialize!(k, serialize_uncompressed); + }, + ) + }); + + group.bench_function("fr_square", move |b| { + b.iter_with_setup( + || rand!(Fr), + |k| { + let _k2 = k.square(); + }, + ) + }); + + group.bench_function("fr_sub", move |b| { + b.iter_with_setup( + || (rand!(Fr), rand!(Fr)), + |(k_1, k_2)| { + let _k_3 = k_1 - k_2; + }, + ) + }); + + group.bench_function("fr_zero", move |b| { + b.iter_with_setup( + || {}, + |_| { + let _k = Fr::zero(); + }, + ) + }); + + group.bench_function("fq12_add", move |b| { + b.iter_with_setup( + || (rand!(Fq12), rand!(Fq12)), + |(e_1, e_2)| { + let _e_3 = e_1 + e_2; + }, + ) + }); + + group.bench_function("fq12_add_self", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _e_2 = e.add(&e); + }, + ) + }); + + group.bench_function("fq12_clone", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _e_2 = e; + }, + ) + }); + + group.bench_function("fq12_deser", move |b| { + b.iter_with_setup( + || { + let e = rand!(Fq12); + serialize!(e, serialize_uncompressed) + }, + |buf| { + let _e = Fq12::deserialize_uncompressed(buf.as_slice()).unwrap(); + }, + ) + }); + + group.bench_function("fq12_div", move |b| { + b.iter_with_setup( + || { + let e = rand!(Fq12); + let f = rand!(Fq12); + (e, f) + }, + |(e, f)| { + let _g = e.div(f); + }, + ) + }); + + group.bench_function("fq12_double", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _e_2 = e.double(); + }, + ) + }); + + group.bench_function("fq12_eq", move |b| { + b.iter_with_setup( + || { + let e_1 = rand!(Fq12); + let e_2 = e_1; + (e_1, e_2) + }, + |(e_1, e_2)| { + let _res = e_1 == e_2; + }, + ) + }); + + group.bench_function("fq12_from_u64", move |b| { + b.iter_with_setup( + || rand!(u64), + |i| { + let _res = Fq12::from(i); + }, + ) + }); + + group.bench_function("fq12_inv", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _e_inv = e.inverse(); + }, + ) + }); + + group.bench_function("fq12_mul", move |b| { + b.iter_with_setup( + || (rand!(Fq12), rand!(Fq12)), + |(e_1, e_2)| { + let _e_3 = e_1 * e_2; + }, + ) + }); + + group.bench_function("fq12_mul_self", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _e_2 = e.mul(&e); + }, + ) + }); + + group.bench_function("fq12_neg", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _e_2 = e.neg(); + }, + ) + }); + + group.bench_function("fq12_one", move |b| { + b.iter(|| { + let _e = Fq12::one(); + }) + }); + + group.bench_function("fq12_pow_u256", move |b| { + b.iter_with_setup( + || { + let base = rand!(Fq12); + let exp = rand!(Fr); + let exp = BigInteger256::from(exp); + (base, exp) + }, + |(base, exp)| { + let _res = base.pow(exp); + }, + ) + }); + + group.bench_function("fq12_serialize", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let mut buf = vec![]; + e.serialize_uncompressed(&mut buf).unwrap(); + }, + ) + }); + + group.bench_function("fq12_square", move |b| { + b.iter_with_setup( + || rand!(Fq12), + |e| { + let _res = e.square(); + }, + ) + }); + + group.bench_function("fq12_sub", move |b| { + b.iter_with_setup( + || (rand!(Fq12), rand!(Fq12)), + |(e, f)| { + let _res = e - f; + }, + ) + }); + + group.bench_function("fq12_zero", move |b| { + b.iter_with_setup( + || (), + |_| { + let _res = Fq12::zero(); + }, + ) + }); + + group.bench_function("g1_affine_add", move |b| { + b.iter_with_setup( + || (rand!(G1Affine), rand!(G1Affine)), + |(p1, p2)| { + let _p3 = p1 + p2; + }, + ) + }); + + group.bench_function("g1_affine_deser_comp", move |b| { + b.iter_with_setup( + || { + let p = rand!(G1Affine); + serialize!(p, serialize_compressed) + }, + |buf| { + let _p = G1Affine::deserialize_compressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("g1_affine_deser_uncomp", move |b| { + b.iter_with_setup( + || { + let p = rand!(G1Affine); + serialize!(p, serialize_uncompressed) + }, + |buf| { + let _p = G1Affine::deserialize_uncompressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("g1_affine_eq", move |b| { + b.iter_with_setup( + || { + let p1 = rand!(G1Affine); + let p2 = p1; + (p1, p2) + }, + |(p1, p2)| { + let _res = p1 == Projective::from(p2); + }, + ) + }); + + group.bench_function("g1_affine_generator", move |b| { + b.iter(|| { + let _res = G1Affine::generator(); + }) + }); + + group.bench_function("g1_affine_infinity", move |b| { + b.iter(|| { + let _res = G1Affine::zero(); + }) + }); + + group.bench_function("g1_affine_scalar_mul_to_proj", move |b| { + b.iter_with_setup( + || (rand!(G1Affine), rand!(Fr)), + |(p, k)| { + let _res = p.mul(k); + }, + ) + }); + + group.bench_function("g1_affine_neg", move |b| { + b.iter_with_setup( + || rand!(G1Affine), + |p| { + let _res = p.neg(); + }, + ) + }); + + group.bench_function("g1_affine_serialize_comp", move |b| { + b.iter_with_setup( + || rand!(G1Affine), + |p_affine| { + let _buf = serialize!(p_affine, serialize_compressed); + }, + ) + }); + + group.bench_function("g1_affine_serialize_uncomp", move |b| { + b.iter_with_setup( + || rand!(G1Affine), + |p_affine| { + let _buf = serialize!(p_affine, serialize_uncompressed); + }, + ) + }); + + group.bench_function("g1_affine_to_proj", move |b| { + b.iter_with_setup( + || rand!(G1Affine), + |p_affine| { + let _res = G1Projective::from(p_affine); + }, + ) + }); + + group.bench_function("g1_proj_add", move |b| { + b.iter_with_setup( + || { + let p = rand!(G1Projective); + let q = rand!(G1Projective); + (p, q) + }, + |(p, q)| { + let _res = p + q; + }, + ) + }); + + group.bench_function("g1_proj_double", move |b| { + b.iter_with_setup( + || rand!(G1Projective), + |p| { + let _q = p.double(); + }, + ) + }); + + group.bench_function("g1_proj_eq", move |b| { + b.iter_with_setup( + || { + let p = rand!(G1Projective); + let q = p; + (p, q) + }, + |(p, q)| { + let _res = p == q; + }, + ) + }); + + group.bench_function("g1_proj_generator", move |b| { + b.iter(|| { + let _res = G1Projective::generator(); + }) + }); + + group.bench_function("g1_proj_infinity", move |b| { + b.iter(|| { + let _res = G1Projective::zero(); + }) + }); + + group.bench_function("g1_proj_neg", move |b| { + b.iter_with_setup( + || rand!(G1Projective), + |p| { + let _q = p.neg(); + }, + ) + }); + + group.bench_function("g1_proj_scalar_mul", move |b| { + b.iter_with_setup( + || { + let p = rand!(G1Projective); + let k = rand!(Fr); + (p, k) + }, + |(p, k)| { + let _q = p.mul(k); + }, + ) + }); + + group.bench_function("g1_proj_sub", move |b| { + b.iter_with_setup( + || { + let p = rand!(G1Projective); + let q = rand!(G1Projective); + (p, q) + }, + |(p, q)| { + let _r = p - q; + }, + ) + }); + + group.bench_function("g1_proj_to_affine", move |b| { + b.iter_with_setup( + || rand!(G1Projective), + |p_proj| { + let _ = p_proj.into_affine(); + }, + ) + }); + + group.bench_function("g2_affine_add", move |b| { + b.iter_with_setup( + || (rand!(G2Affine), rand!(G2Affine)), + |(p1, p2)| { + let _p3 = p1 + p2; + }, + ) + }); + + group.bench_function("g2_affine_deser_comp", move |b| { + b.iter_with_setup( + || { + let p = rand!(G2Affine); + serialize!(p, serialize_compressed) + }, + |buf| { + let _p = G2Affine::deserialize_compressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("g2_affine_deser_uncomp", move |b| { + b.iter_with_setup( + || { + let p = rand!(G2Affine); + serialize!(p, serialize_uncompressed) + }, + |buf| { + let _p = G2Affine::deserialize_uncompressed(buf.as_slice()); + }, + ) + }); + + group.bench_function("g2_affine_eq", move |b| { + b.iter_with_setup( + || { + let p1 = rand!(G2Affine); + let p2 = p1; + (p1, p2) + }, + |(p1, p2)| { + let _res = p1 == Projective::from(p2); + }, + ) + }); + + group.bench_function("g2_affine_generator", move |b| { + b.iter(|| { + let _res = G2Affine::generator(); + }) + }); + + group.bench_function("g2_affine_infinity", move |b| { + b.iter(|| { + let _res = G2Affine::zero(); + }) + }); + + group.bench_function("g2_affine_scalar_mul_to_proj", move |b| { + b.iter_with_setup( + || (rand!(G2Affine), rand!(Fr)), + |(p, k)| { + let _res = p.mul(k); + }, + ) + }); + + group.bench_function("g2_affine_neg", move |b| { + b.iter_with_setup( + || rand!(G2Affine), + |p| { + let _res = p.neg(); + }, + ) + }); + + group.bench_function("g2_affine_serialize_comp", move |b| { + b.iter_with_setup( + || rand!(G2Affine), + |p_affine| { + let _buf = serialize!(p_affine, serialize_compressed); + }, + ) + }); + + group.bench_function("g2_affine_serialize_uncomp", move |b| { + b.iter_with_setup( + || rand!(G2Affine), + |p_affine| { + let _buf = serialize!(p_affine, serialize_uncompressed); + }, + ) + }); + + group.bench_function("g2_affine_to_proj", move |b| { + b.iter_with_setup( + || rand!(G2Affine), + |p_affine| { + let _res = G2Projective::from(p_affine); + }, + ) + }); + + group.bench_function("g2_proj_add", move |b| { + b.iter_with_setup( + || { + let p = rand!(G2Projective); + let q = rand!(G2Projective); + (p, q) + }, + |(p, q)| { + let _res = p + q; + }, + ) + }); + + group.bench_function("g2_proj_double", move |b| { + b.iter_with_setup( + || rand!(G2Projective), + |p| { + let _q = p.double(); + }, + ) + }); + + group.bench_function("g2_proj_eq", move |b| { + b.iter_with_setup( + || { + let p = rand!(G2Projective); + let q = p; + (p, q) + }, + |(p, q)| { + let _res = p == q; + }, + ) + }); + + group.bench_function("g2_proj_generator", move |b| { + b.iter(|| { + let _res = G2Projective::generator(); + }) + }); + + group.bench_function("g2_proj_infinity", move |b| { + b.iter(|| { + let _res = G2Projective::zero(); + }) + }); + + group.bench_function("g2_proj_neg", move |b| { + b.iter_with_setup( + || rand!(G2Projective), + |p| { + let _q = p.neg(); + }, + ) + }); + + group.bench_function("g2_proj_scalar_mul", move |b| { + b.iter_with_setup( + || { + let p = rand!(G2Projective); + let k = rand!(Fr); + (p, k) + }, + |(p, k)| { + let _q = p.mul(k); + }, + ) + }); + + group.bench_function("g2_proj_sub", move |b| { + b.iter_with_setup( + || { + let p = rand!(G2Projective); + let q = rand!(G2Projective); + (p, q) + }, + |(p, q)| { + let _r = p - q; + }, + ) + }); + + group.bench_function("g2_proj_to_affine", move |b| { + b.iter_with_setup( + || rand!(G2Projective), + |p_proj| { + let _ = p_proj.into_affine(); + }, + ) + }); + + group.bench_function("pairing", move |b| { + b.iter_with_setup( + || (rand!(G1Affine), rand!(G2Affine)), + |(g1e, g2e)| { + let _res = ark_bn254::Bn254::pairing(g1e, g2e).0; + }, + ) + }); + + let linear_regression_max_num_datapoints = 20; + + let pairing_product_max_num_pairs = 100; + for num_pairs in (0..pairing_product_max_num_pairs) + .step_by(pairing_product_max_num_pairs / linear_regression_max_num_datapoints) + { + group.bench_function(BenchmarkId::new("pairing_product", num_pairs), |b| { + b.iter_with_setup( + || { + let g1_elements = (0..num_pairs).map(|_i| rand!(G1Affine)).collect::>(); + let g2_elements = (0..num_pairs).map(|_i| rand!(G2Affine)).collect::>(); + (g1_elements, g2_elements) + }, + |(g1_elements, g2_elements)| { + let _product = + ark_bn254::Bn254::multi_pairing(g1_elements, g2_elements).0; + }, + ); + }); + } + + for num_entries in msm_all_bench_cases() { + group.bench_function(BenchmarkId::new("g1_affine_msm", num_entries), |b| { + b.iter_with_setup( + || { + let elements = (0..num_entries) + .map(|_i| rand!(G1Affine)) + .collect::>(); + let scalars = (0..num_entries).map(|_i| rand!(Fr)).collect::>(); + (elements, scalars) + }, + |(elements, scalars)| { + let _res: G1Projective = + ark_ec::VariableBaseMSM::msm(elements.as_slice(), scalars.as_slice()) + .unwrap(); + }, + ); + }); + } + + for num_entries in msm_all_bench_cases() { + group.bench_function(BenchmarkId::new("g2_affine_msm", num_entries), |b| { + b.iter_with_setup( + || { + let elements = (0..num_entries) + .map(|_i| rand!(G2Affine)) + .collect::>(); + let scalars = (0..num_entries).map(|_i| rand!(Fr)).collect::>(); + (elements, scalars) + }, + |(elements, scalars)| { + let _res: G2Projective = + ark_ec::VariableBaseMSM::msm(elements.as_slice(), scalars.as_slice()) + .unwrap(); + }, + ); + }); + } + group.finish(); } diff --git a/crates/aptos-crypto/src/bench_utils.rs b/crates/aptos-crypto/src/bench_utils.rs new file mode 100644 index 0000000000000..f61e6478a94c5 --- /dev/null +++ b/crates/aptos-crypto/src/bench_utils.rs @@ -0,0 +1 @@ +//! Some functions/macros shared by benches. \ No newline at end of file diff --git a/crates/aptos-crypto/src/lib.rs b/crates/aptos-crypto/src/lib.rs index 913690b2ef6f0..297e47199027d 100644 --- a/crates/aptos-crypto/src/lib.rs +++ b/crates/aptos-crypto/src/lib.rs @@ -6,6 +6,7 @@ #![deny(missing_docs)] //! A library supplying various cryptographic primitives +pub mod bench_utils; pub mod bls12381; pub mod bulletproofs; pub mod compat; diff --git a/scripts/algebra-gas/update_bn254_algebra_gas_params.py b/scripts/algebra-gas/update_bn254_algebra_gas_params.py new file mode 100755 index 0000000000000..a65c607de360f --- /dev/null +++ b/scripts/algebra-gas/update_bn254_algebra_gas_params.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 + +''' +This module automated the steps to +calculate gas parameters for `algebra.move` natives from benchmarking results, +then update the gas parameter definitions in rust. +''' + +import argparse +import fit_linear_model +import load_bench_ns +import load_bench_datapoints +from math import ceil +from pathlib import Path +from time import time + +# Typically you are making a new version of gas schedule, +# so this should be larger than `LATEST_GAS_FEATURE_VERSION` in `aptos-move/aptos-gas/src/gas_meter.rs`. +TARGET_GAS_VERSION = 12 + +def get_bench_ns_linear(bench_path): + datapoints = load_bench_datapoints.main(bench_path) + X,Y,k,b = fit_linear_model.main(datapoints) + return X,Y,k,b + +def prettify_number(x:int) -> str: + s = str(x) + n = len(s) + b = n % 3 + chunks_0 = [s[:b]] if b>=1 else [] + chunks = chunks_0 + [s[i:i+3] for i in range(b,n,3)] + return '_'.join(chunks) + +def get_algebra_lines(gas_per_ns): + nanoseconds = {} + nanoseconds['ark_bn254_fr_add'] = load_bench_ns.main('target/criterion/ark_bn254/fr_add') + nanoseconds['ark_bn254_fr_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fr_deser') + nanoseconds['ark_bn254_fr_div'] = load_bench_ns.main('target/criterion/ark_bn254/fr_div') + nanoseconds['ark_bn254_fr_eq'] = load_bench_ns.main('target/criterion/ark_bn254/fr_eq') + nanoseconds['ark_bn254_fr_from_u64'] = load_bench_ns.main('target/criterion/ark_bn254/fr_from_u64') + nanoseconds['ark_bn254_fr_inv'] = load_bench_ns.main('target/criterion/ark_bn254/fr_inv') + nanoseconds['ark_bn254_fr_mul'] = load_bench_ns.main('target/criterion/ark_bn254/fr_mul') + nanoseconds['ark_bn254_fr_neg'] = load_bench_ns.main('target/criterion/ark_bn254/fr_neg') + nanoseconds['ark_bn254_fr_one'] = load_bench_ns.main('target/criterion/ark_bn254/fr_one') + nanoseconds['ark_bn254_fr_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fr_serialize') + nanoseconds['ark_bn254_fr_square'] = load_bench_ns.main('target/criterion/ark_bn254/fr_square') + nanoseconds['ark_bn254_fr_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fr_sub') + nanoseconds['ark_bn254_fr_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fr_zero') + nanoseconds['ark_bn254_fq12_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_add') + nanoseconds['ark_bn254_fq12_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_clone') + nanoseconds['ark_bn254_fq12_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_deser') + nanoseconds['ark_bn254_fq12_div'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_div') + nanoseconds['ark_bn254_fq12_eq'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_eq') + nanoseconds['ark_bn254_fq12_from_u64'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_from_u64') + nanoseconds['ark_bn254_fq12_inv'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_inv') + nanoseconds['ark_bn254_fq12_mul'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_mul') + nanoseconds['ark_bn254_fq12_neg'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_neg') + nanoseconds['ark_bn254_fq12_one'] = 1 + nanoseconds['ark_bn254_fq12_pow_u256'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_pow_u256') + nanoseconds['ark_bn254_fq12_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_serialize') + nanoseconds['ark_bn254_fq12_square'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_square') + nanoseconds['ark_bn254_fq12_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_sub') + nanoseconds['ark_bn254_fq12_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_zero') + nanoseconds['ark_bn254_g1_affine_deser_comp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_deser_comp') + nanoseconds['ark_bn254_g1_affine_deser_uncomp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_deser_uncomp') + nanoseconds['ark_bn254_g1_affine_serialize_comp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_serialize_comp') + nanoseconds['ark_bn254_g1_affine_serialize_uncomp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_serialize_uncomp') + nanoseconds['ark_bn254_g1_proj_add'] = load_bench_ns.main('target/criterion/ark_bn254/g1_proj_add') + nanoseconds['ark_bn254_g1_proj_double'] = load_bench_ns.main('target/criterion/ark_bn254/g1_proj_double') + nanoseconds['ark_bn254_g1_proj_eq'] = load_bench_ns.main('target/criterion/ark_bn254/g1_proj_eq') + nanoseconds['ark_bn254_g1_proj_generator'] = 1 + nanoseconds['ark_bn254_g1_proj_infinity'] = 1 + nanoseconds['ark_bn254_g1_proj_neg'] = 1 + nanoseconds['ark_bn254_g1_proj_scalar_mul'] = load_bench_ns.main('target/criterion/ark_bn254/g1_proj_scalar_mul') + nanoseconds['ark_bn254_g1_proj_sub'] = load_bench_ns.main('target/criterion/ark_bn254/g1_proj_sub') + nanoseconds['ark_bn254_g1_proj_to_affine'] = load_bench_ns.main('target/criterion/ark_bn254/g1_proj_to_affine') + nanoseconds['ark_bn254_g2_affine_deser_comp'] = load_bench_ns.main('target/criterion/ark_bn254/g2_affine_deser_comp') + nanoseconds['ark_bn254_g2_affine_deser_uncomp'] = load_bench_ns.main('target/criterion/ark_bn254/g2_affine_deser_uncomp') + nanoseconds['ark_bn254_g2_affine_serialize_comp'] = load_bench_ns.main('target/criterion/ark_bn254/g2_affine_serialize_comp') + nanoseconds['ark_bn254_g2_affine_serialize_uncomp'] = load_bench_ns.main('target/criterion/ark_bn254/g2_affine_serialize_uncomp') + nanoseconds['ark_bn254_g2_proj_add'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_add') + nanoseconds['ark_bn254_g2_proj_double'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_double') + nanoseconds['ark_bn254_g2_proj_eq'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_eq') + nanoseconds['ark_bn254_g2_proj_generator'] = 1 + nanoseconds['ark_bn254_g2_proj_infinity'] = 1 + nanoseconds['ark_bn254_g2_proj_neg'] = 1 + nanoseconds['ark_bn254_g2_proj_scalar_mul'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_scalar_mul') + nanoseconds['ark_bn254_g2_proj_sub'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_sub') + nanoseconds['ark_bn254_g2_proj_to_affine'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_to_affine') + nanoseconds['ark_bn254_pairing'] = load_bench_ns.main('target/criterion/ark_bn254/pairing') + _,_,nanoseconds['ark_bn254_multi_pairing_per_pair'],nanoseconds['ark_bn254_multi_pairing_base'] = get_bench_ns_linear('target/criterion/ark_bn254/pairing_product') + gas_units = {k:gas_per_ns*v for k,v in nanoseconds.items()} + lines = [f' [algebra_{k}: InternalGas, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(v)}],' for k,v in sorted(gas_units.items())] + return lines + +def main(gas_per_ns): + path = Path(PATH_STR) + lines = path.read_text().split('\n') + striped_lines = [line.strip() for line in lines] + line_id_begin = striped_lines.index('// BN254 algebra gas parameters begin.') + line_id_end = striped_lines.index('// BN254 algebra gas parameters end.') + generator_note_line = f' // Generated at time {time()} by `scripts/algebra-gas/update_bn254_algebra_gas_params.py` with gas_per_ns={gas_per_ns}.' + new_lines = lines[:line_id_begin+1] + [generator_note_line] + get_algebra_lines(gas_per_ns) + lines[line_id_end:] + path.write_text('\n'.join(new_lines)) + +PATH_STR = 'aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs' +if __name__=='__main__': + parser = argparse.ArgumentParser( + description=f'Generate gas parameters for algebra module in `{PATH_STR}`.') + parser.add_argument('--gas_per_ns', required=True, type=float) + args = parser.parse_args() + main(args.gas_per_ns) From f90c022c84980750d1164b1bcfd321544622a712 Mon Sep 17 00:00:00 2001 From: Zhoujun Ma Date: Sat, 2 Dec 2023 19:16:01 +0000 Subject: [PATCH 07/11] initial gas param --- .../src/gas_schedule/aptos_framework.rs | 58 +++++++++++++++++++ .../update_bn254_algebra_gas_params.py | 4 +- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 76b9c6b23f9dd..54a1da9fb6527 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -17,6 +17,64 @@ crate::gas_schedule::macros::define_gas_parameters!( [account_create_signer_base: InternalGas, "account.create_signer.base", 6000], // BN254 algebra gas parameters begin. + // Generated at time 1701543687.9372697 by `scripts/algebra-gas/update_bn254_algebra_gas_params.py` with gas_per_ns=209.10511688369482. + [algebra_ark_bn254_fq12_add: InternalGas, { 12.. => "algebra.ark_bn254_fq12_add" }, 4_404], + [algebra_ark_bn254_fq12_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq12_clone" }, 4_407], + [algebra_ark_bn254_fq12_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq12_deser" }, 133_173], + [algebra_ark_bn254_fq12_div: InternalGas, { 12.. => "algebra.ark_bn254_fq12_div" }, 2_886_754], + [algebra_ark_bn254_fq12_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq12_eq" }, 12_539], + [algebra_ark_bn254_fq12_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq12_from_u64" }, 13_172], + [algebra_ark_bn254_fq12_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq12_inv" }, 2_240_936], + [algebra_ark_bn254_fq12_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq12_mul" }, 643_315], + [algebra_ark_bn254_fq12_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq12_neg" }, 14_112], + [algebra_ark_bn254_fq12_one: InternalGas, { 12.. => "algebra.ark_bn254_fq12_one" }, 209], + [algebra_ark_bn254_fq12_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq12_pow_u256" }, 190_546_248], + [algebra_ark_bn254_fq12_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq12_serialize" }, 118_786], + [algebra_ark_bn254_fq12_square: InternalGas, { 12.. => "algebra.ark_bn254_fq12_square" }, 471_596], + [algebra_ark_bn254_fq12_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq12_sub" }, 31_759], + [algebra_ark_bn254_fq12_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq12_zero" }, 4_334], + [algebra_ark_bn254_fr_add: InternalGas, { 12.. => "algebra.ark_bn254_fr_add" }, 4_377], + [algebra_ark_bn254_fr_deser: InternalGas, { 12.. => "algebra.ark_bn254_fr_deser" }, 17_330], + [algebra_ark_bn254_fr_div: InternalGas, { 12.. => "algebra.ark_bn254_fr_div" }, 1_214_844], + [algebra_ark_bn254_fr_eq: InternalGas, { 12.. => "algebra.ark_bn254_fr_eq" }, 4_369], + [algebra_ark_bn254_fr_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fr_from_u64" }, 13_816], + [algebra_ark_bn254_fr_inv: InternalGas, { 12.. => "algebra.ark_bn254_fr_inv" }, 1_209_314], + [algebra_ark_bn254_fr_mul: InternalGas, { 12.. => "algebra.ark_bn254_fr_mul" }, 7_819], + [algebra_ark_bn254_fr_neg: InternalGas, { 12.. => "algebra.ark_bn254_fr_neg" }, 4_372], + [algebra_ark_bn254_fr_one: InternalGas, { 12.. => "algebra.ark_bn254_fr_one" }, 4_333], + [algebra_ark_bn254_fr_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fr_serialize" }, 25_564], + [algebra_ark_bn254_fr_square: InternalGas, { 12.. => "algebra.ark_bn254_fr_square" }, 4_369], + [algebra_ark_bn254_fr_sub: InternalGas, { 12.. => "algebra.ark_bn254_fr_sub" }, 4_369], + [algebra_ark_bn254_fr_zero: InternalGas, { 12.. => "algebra.ark_bn254_fr_zero" }, 4_335], + [algebra_ark_bn254_g1_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_comp" }, 23_513_749], + [algebra_ark_bn254_g1_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_uncomp" }, 21_533_713], + [algebra_ark_bn254_g1_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_comp" }, 42_699], + [algebra_ark_bn254_g1_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_uncomp" }, 57_674], + [algebra_ark_bn254_g1_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_add" }, 108_257], + [algebra_ark_bn254_g1_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_double" }, 63_387], + [algebra_ark_bn254_g1_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_eq" }, 52_599], + [algebra_ark_bn254_g1_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_generator" }, 209], + [algebra_ark_bn254_g1_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_infinity" }, 209], + [algebra_ark_bn254_g1_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_neg" }, 209], + [algebra_ark_bn254_g1_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_scalar_mul" }, 26_808_435], + [algebra_ark_bn254_g1_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_sub" }, 109_719], + [algebra_ark_bn254_g1_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_to_affine" }, 6_263], + [algebra_ark_bn254_g2_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_comp" }, 68_695_000], + [algebra_ark_bn254_g2_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_uncomp" }, 61_554_295], + [algebra_ark_bn254_g2_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_comp" }, 73_334], + [algebra_ark_bn254_g2_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_uncomp" }, 94_974], + [algebra_ark_bn254_g2_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_add" }, 326_526], + [algebra_ark_bn254_g2_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_double" }, 160_304], + [algebra_ark_bn254_g2_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_eq" }, 143_386], + [algebra_ark_bn254_g2_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_generator" }, 209], + [algebra_ark_bn254_g2_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_infinity" }, 209], + [algebra_ark_bn254_g2_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_neg" }, 209], + [algebra_ark_bn254_g2_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_scalar_mul" }, 77_108_001], + [algebra_ark_bn254_g2_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_sub" }, 329_752], + [algebra_ark_bn254_g2_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_to_affine" }, 1_324_072], + [algebra_ark_bn254_multi_pairing_base: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_base" }, 126_522_353], + [algebra_ark_bn254_multi_pairing_per_pair: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_per_pair" }, 68_000_751], + [algebra_ark_bn254_pairing: InternalGas, { 12.. => "algebra.ark_bn254_pairing" }, 209_171_382], // BN254 algebra gas parameters end. // Algebra gas parameters begin. diff --git a/scripts/algebra-gas/update_bn254_algebra_gas_params.py b/scripts/algebra-gas/update_bn254_algebra_gas_params.py index a65c607de360f..5603241ecf15a 100755 --- a/scripts/algebra-gas/update_bn254_algebra_gas_params.py +++ b/scripts/algebra-gas/update_bn254_algebra_gas_params.py @@ -90,7 +90,7 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_pairing'] = load_bench_ns.main('target/criterion/ark_bn254/pairing') _,_,nanoseconds['ark_bn254_multi_pairing_per_pair'],nanoseconds['ark_bn254_multi_pairing_base'] = get_bench_ns_linear('target/criterion/ark_bn254/pairing_product') gas_units = {k:gas_per_ns*v for k,v in nanoseconds.items()} - lines = [f' [algebra_{k}: InternalGas, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(v)}],' for k,v in sorted(gas_units.items())] + lines = [f' [algebra_{k}: InternalGas, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(int(v))}],' for k,v in sorted(gas_units.items())] return lines def main(gas_per_ns): @@ -99,7 +99,7 @@ def main(gas_per_ns): striped_lines = [line.strip() for line in lines] line_id_begin = striped_lines.index('// BN254 algebra gas parameters begin.') line_id_end = striped_lines.index('// BN254 algebra gas parameters end.') - generator_note_line = f' // Generated at time {time()} by `scripts/algebra-gas/update_bn254_algebra_gas_params.py` with gas_per_ns={gas_per_ns}.' + generator_note_line = f' // Generated at time {time()} by `scripts/algebra-gas/update_bn254_algebra_gas_params.py` with gas_per_ns={gas_per_ns}.' new_lines = lines[:line_id_begin+1] + [generator_note_line] + get_algebra_lines(gas_per_ns) + lines[line_id_end:] path.write_text('\n'.join(new_lines)) From 416d7c28d038365353729d8e971903edfc337b4c Mon Sep 17 00:00:00 2001 From: "zhoujun.ma" Date: Sat, 2 Dec 2023 13:10:37 -0800 Subject: [PATCH 08/11] benches for fq and fq2 --- crates/aptos-crypto/benches/ark_bn254.rs | 462 +++--------------- crates/aptos-crypto/benches/bench_utils.rs | 178 +++++++ crates/aptos-crypto/src/bench_utils.rs | 1 - crates/aptos-crypto/src/lib.rs | 1 - .../update_bn254_algebra_gas_params.py | 30 ++ 5 files changed, 286 insertions(+), 386 deletions(-) create mode 100644 crates/aptos-crypto/benches/bench_utils.rs delete mode 100644 crates/aptos-crypto/src/bench_utils.rs diff --git a/crates/aptos-crypto/benches/ark_bn254.rs b/crates/aptos-crypto/benches/ark_bn254.rs index f4d669c1fc1a0..0d1b9410c3d7f 100644 --- a/crates/aptos-crypto/benches/ark_bn254.rs +++ b/crates/aptos-crypto/benches/ark_bn254.rs @@ -6,16 +6,19 @@ #[macro_use] extern crate criterion; -use ark_bn254::{Fq12, Fr, G1Affine, G1Projective, G2Affine, G2Projective}; +use ark_bn254::{Fq, Fq2, Fq12, Fr, G1Affine, G1Projective, G2Affine, G2Projective}; use ark_ec::{ pairing::Pairing, short_weierstrass::Projective, AffineRepr, CurveGroup, Group, }; -use ark_ff::{BigInteger256, Field, One, UniformRand, Zero}; +use ark_ff::{Field, One, UniformRand, Zero}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use ark_std::test_rng; use criterion::{BenchmarkId, Criterion}; use std::ops::{Add, Div, Mul, Neg}; +use crate::bench_utils::{bench_function_add, bench_function_clone, bench_function_deser_comp, bench_function_deser_uncomp, bench_function_div, bench_function_double, bench_function_eq, bench_function_from_u64, bench_function_inv, bench_function_mul, bench_function_neg, bench_function_one, bench_function_pow_u256, bench_function_serialize_uncomp, bench_function_square, bench_function_sub, bench_function_zero}; + +mod bench_utils; fn msm_all_bench_cases() -> Vec { let series_until_65 = (1..65).step_by(2); @@ -44,388 +47,79 @@ macro_rules! serialize { fn bench_group(c: &mut Criterion) { let mut group = c.benchmark_group("ark_bn254"); - group.bench_function("fr_add", move |b| { - b.iter_with_setup( - || (rand!(Fr), rand!(Fr)), - |(k_1, k_2)| { - let _k_3 = k_1 + k_2; - }, - ) - }); - - group.bench_function("fr_deser", move |b| { - b.iter_with_setup( - || { - let k = rand!(Fr); - serialize!(k, serialize_uncompressed) - }, - |buf| { - let _k = Fr::deserialize_uncompressed(buf.as_slice()).unwrap(); - }, - ) - }); - - group.bench_function("fr_deser_invalid_4_bytes", move |b| { - b.iter_with_setup( - || vec![0xFF_u8; 4], - |buf| { - let _k = Fr::deserialize_uncompressed(buf.as_slice()); - }, - ) - }); - - group.bench_function("fr_deser_invalid_4000_bytes", move |b| { - b.iter_with_setup( - || vec![0xFF_u8; 4000], - |buf| { - let _k = Fr::deserialize_uncompressed(buf.as_slice()); - }, - ) - }); - - group.bench_function("fr_deser_invalid_4000000_bytes", move |b| { - b.iter_with_setup( - || vec![0xFF_u8; 4000000], - |buf| { - let _k = Fr::deserialize_uncompressed(buf.as_slice()); - }, - ) - }); - - group.bench_function("fr_div", move |b| { - b.iter_with_setup( - || (rand!(Fr), rand!(Fr)), - |(k_1, k_2)| { - let _k_3 = k_1 / k_2; - }, - ) - }); - - group.bench_function("fr_eq", move |b| { - b.iter_with_setup( - || { - let k_1 = rand!(Fr); - let k_2 = k_1; - (k_1, k_2) - }, - |(k_1, k_2)| { - let _res = k_1 == k_2; - }, - ) - }); - - group.bench_function("fr_from_u64", move |b| { - b.iter_with_setup( - || rand!(u64), - |v| { - let _res: Fr = BigInteger256::from(v).into(); - }, - ) - }); - - group.bench_function("fr_inv", move |b| { - b.iter_with_setup( - || rand!(Fr), - |k| { - let _k_inv = k.inverse(); - }, - ) - }); - - group.bench_function("fr_mul", move |b| { - b.iter_with_setup( - || (rand!(Fr), rand!(Fr)), - |(k_1, k_2)| { - let _k_3 = k_1 * k_2; - }, - ) - }); - - group.bench_function("fr_mul_self", move |b| { - b.iter_with_setup( - || rand!(Fr), - |k| { - let _k2 = k.mul(&k); - }, - ) - }); - - group.bench_function("fr_neg", move |b| { - b.iter_with_setup( - || rand!(Fr), - |k| { - let _k_inv = k.neg(); - }, - ) - }); - - group.bench_function("fr_one", move |b| { - b.iter_with_setup( - || {}, - |_| { - let _k = Fr::one(); - }, - ) - }); - - group.bench_function("fr_serialize", move |b| { - b.iter_with_setup( - || rand!(Fr), - |k| { - let _buf = serialize!(k, serialize_uncompressed); - }, - ) - }); - - group.bench_function("fr_square", move |b| { - b.iter_with_setup( - || rand!(Fr), - |k| { - let _k2 = k.square(); - }, - ) - }); - - group.bench_function("fr_sub", move |b| { - b.iter_with_setup( - || (rand!(Fr), rand!(Fr)), - |(k_1, k_2)| { - let _k_3 = k_1 - k_2; - }, - ) - }); - - group.bench_function("fr_zero", move |b| { - b.iter_with_setup( - || {}, - |_| { - let _k = Fr::zero(); - }, - ) - }); - - group.bench_function("fq12_add", move |b| { - b.iter_with_setup( - || (rand!(Fq12), rand!(Fq12)), - |(e_1, e_2)| { - let _e_3 = e_1 + e_2; - }, - ) - }); - - group.bench_function("fq12_add_self", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _e_2 = e.add(&e); - }, - ) - }); - - group.bench_function("fq12_clone", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _e_2 = e; - }, - ) - }); - - group.bench_function("fq12_deser", move |b| { - b.iter_with_setup( - || { - let e = rand!(Fq12); - serialize!(e, serialize_uncompressed) - }, - |buf| { - let _e = Fq12::deserialize_uncompressed(buf.as_slice()).unwrap(); - }, - ) - }); - - group.bench_function("fq12_div", move |b| { - b.iter_with_setup( - || { - let e = rand!(Fq12); - let f = rand!(Fq12); - (e, f) - }, - |(e, f)| { - let _g = e.div(f); - }, - ) - }); - - group.bench_function("fq12_double", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _e_2 = e.double(); - }, - ) - }); - - group.bench_function("fq12_eq", move |b| { - b.iter_with_setup( - || { - let e_1 = rand!(Fq12); - let e_2 = e_1; - (e_1, e_2) - }, - |(e_1, e_2)| { - let _res = e_1 == e_2; - }, - ) - }); - - group.bench_function("fq12_from_u64", move |b| { - b.iter_with_setup( - || rand!(u64), - |i| { - let _res = Fq12::from(i); - }, - ) - }); - - group.bench_function("fq12_inv", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _e_inv = e.inverse(); - }, - ) - }); - - group.bench_function("fq12_mul", move |b| { - b.iter_with_setup( - || (rand!(Fq12), rand!(Fq12)), - |(e_1, e_2)| { - let _e_3 = e_1 * e_2; - }, - ) - }); - - group.bench_function("fq12_mul_self", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _e_2 = e.mul(&e); - }, - ) - }); - - group.bench_function("fq12_neg", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _e_2 = e.neg(); - }, - ) - }); - - group.bench_function("fq12_one", move |b| { - b.iter(|| { - let _e = Fq12::one(); - }) - }); - - group.bench_function("fq12_pow_u256", move |b| { - b.iter_with_setup( - || { - let base = rand!(Fq12); - let exp = rand!(Fr); - let exp = BigInteger256::from(exp); - (base, exp) - }, - |(base, exp)| { - let _res = base.pow(exp); - }, - ) - }); - - group.bench_function("fq12_serialize", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let mut buf = vec![]; - e.serialize_uncompressed(&mut buf).unwrap(); - }, - ) - }); - - group.bench_function("fq12_square", move |b| { - b.iter_with_setup( - || rand!(Fq12), - |e| { - let _res = e.square(); - }, - ) - }); - - group.bench_function("fq12_sub", move |b| { - b.iter_with_setup( - || (rand!(Fq12), rand!(Fq12)), - |(e, f)| { - let _res = e - f; - }, - ) - }); - - group.bench_function("fq12_zero", move |b| { - b.iter_with_setup( - || (), - |_| { - let _res = Fq12::zero(); - }, - ) - }); - - group.bench_function("g1_affine_add", move |b| { - b.iter_with_setup( - || (rand!(G1Affine), rand!(G1Affine)), - |(p1, p2)| { - let _p3 = p1 + p2; - }, - ) - }); - - group.bench_function("g1_affine_deser_comp", move |b| { - b.iter_with_setup( - || { - let p = rand!(G1Affine); - serialize!(p, serialize_compressed) - }, - |buf| { - let _p = G1Affine::deserialize_compressed(buf.as_slice()); - }, - ) - }); - - group.bench_function("g1_affine_deser_uncomp", move |b| { - b.iter_with_setup( - || { - let p = rand!(G1Affine); - serialize!(p, serialize_uncompressed) - }, - |buf| { - let _p = G1Affine::deserialize_uncompressed(buf.as_slice()); - }, - ) - }); - - group.bench_function("g1_affine_eq", move |b| { - b.iter_with_setup( - || { - let p1 = rand!(G1Affine); - let p2 = p1; - (p1, p2) - }, - |(p1, p2)| { - let _res = p1 == Projective::from(p2); - }, - ) - }); - + group.bench_function("fr_add", bench_function_add::); + group.bench_function("fr_clone", bench_function_clone::); + group.bench_function("fr_deser", bench_function_deser_uncomp::); + group.bench_function("fr_div", bench_function_div::); + group.bench_function("fr_double", bench_function_double::); + group.bench_function("fr_eq", bench_function_eq::); + group.bench_function("fr_from_u64", bench_function_from_u64::); + group.bench_function("fr_inv", bench_function_inv::); + group.bench_function("fr_mul", bench_function_mul::); + group.bench_function("fr_neg", bench_function_neg::); + group.bench_function("fr_one", bench_function_one::); + group.bench_function("fr_pow_u256", bench_function_pow_u256::); + group.bench_function("fr_serialize", bench_function_serialize_uncomp::); + group.bench_function("fr_square", bench_function_square::); + group.bench_function("fr_sub", bench_function_sub::); + group.bench_function("fr_zero", bench_function_zero::); + + group.bench_function("fq_add", bench_function_add::); + group.bench_function("fq_clone", bench_function_clone::); + group.bench_function("fq_deser", bench_function_deser_uncomp::); + group.bench_function("fq_div", bench_function_div::); + group.bench_function("fq_double", bench_function_double::); + group.bench_function("fq_eq", bench_function_eq::); + group.bench_function("fq_from_u64", bench_function_from_u64::); + group.bench_function("fq_inv", bench_function_inv::); + group.bench_function("fq_mul", bench_function_mul::); + group.bench_function("fq_neg", bench_function_neg::); + group.bench_function("fq_one", bench_function_one::); + group.bench_function("fq_pow_u256", bench_function_pow_u256::); + group.bench_function("fq_serialize", bench_function_serialize_uncomp::); + group.bench_function("fq_square", bench_function_square::); + group.bench_function("fq_sub", bench_function_sub::); + group.bench_function("fq_zero", bench_function_zero::); + + group.bench_function("fq2_add", bench_function_add::); + group.bench_function("fq2_clone", bench_function_clone::); + group.bench_function("fq2_deser", bench_function_deser_uncomp::); + group.bench_function("fq2_div", bench_function_div::); + group.bench_function("fq2_double", bench_function_double::); + group.bench_function("fq2_eq", bench_function_eq::); + group.bench_function("fq2_from_u64", bench_function_from_u64::); + group.bench_function("fq2_inv", bench_function_inv::); + group.bench_function("fq2_mul", bench_function_mul::); + group.bench_function("fq2_neg", bench_function_neg::); + group.bench_function("fq2_one", bench_function_one::); + group.bench_function("fq2_pow_u256", bench_function_pow_u256::); + group.bench_function("fq2_serialize", bench_function_serialize_uncomp::); + group.bench_function("fq2_square", bench_function_square::); + group.bench_function("fq2_sub", bench_function_sub::); + group.bench_function("fq2_zero", bench_function_zero::); + + + group.bench_function("fq12_add", bench_function_add::); + group.bench_function("fq12_clone", bench_function_clone::); + group.bench_function("fq12_deser", bench_function_deser_uncomp::); + group.bench_function("fq12_div", bench_function_div::); + group.bench_function("fq12_double", bench_function_double::); + group.bench_function("fq12_eq", bench_function_eq::); + group.bench_function("fq12_from_u64", bench_function_from_u64::); + group.bench_function("fq12_inv", bench_function_inv::); + group.bench_function("fq12_mul", bench_function_mul::); + group.bench_function("fq12_neg", bench_function_neg::); + group.bench_function("fq12_one", bench_function_one::); + group.bench_function("fq12_pow_u256", bench_function_pow_u256::); + group.bench_function("fq12_serialize", bench_function_serialize_uncomp::); + group.bench_function("fq12_square", bench_function_square::); + group.bench_function("fq12_sub", bench_function_sub::); + group.bench_function("fq12_zero", bench_function_zero::); + + group.bench_function("g1_affine_add", bench_function_add::); + group.bench_function("g1_affine_deser_comp", bench_function_deser_comp::); + group.bench_function("g1_affine_deser_uncomp", bench_function_deser_uncomp::); + group.bench_function("g1_affine_eq", bench_function_eq::); group.bench_function("g1_affine_generator", move |b| { b.iter(|| { let _res = G1Affine::generator(); diff --git a/crates/aptos-crypto/benches/bench_utils.rs b/crates/aptos-crypto/benches/bench_utils.rs new file mode 100644 index 0000000000000..3dcf0672ef6d3 --- /dev/null +++ b/crates/aptos-crypto/benches/bench_utils.rs @@ -0,0 +1,178 @@ +use std::ops::{Add, Div, Mul, Neg, Sub}; +use ark_ff::{BigInteger256, Field, One, Zero}; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use ark_std::test_rng; +use ark_std::UniformRand; +use criterion::Bencher; + +fn rand() -> T { + T::rand(&mut test_rng()) +} + +pub fn bench_function_add(b: &mut Bencher) { + b.iter_with_setup( + || (rand::(), rand::()), + |(e_1, e_2)| { + let _e_3 = e_1 + e_2; + }, + ) +} + +pub fn bench_function_clone(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |e| { + let _e_2 = e.clone(); + }, + ) +} + +pub fn bench_function_deser_comp(b: &mut Bencher) { + b.iter_with_setup( + || { + let e = rand::(); + let mut buf = vec![]; + e.serialize_compressed(&mut buf).unwrap(); + buf + }, + |buf| { + let _e = T::deserialize_compressed(buf.as_slice()).unwrap(); + }, + ) +} + +pub fn bench_function_deser_uncomp(b: &mut Bencher) { + b.iter_with_setup( + || { + let e = rand::(); + let mut buf = vec![]; + e.serialize_uncompressed(&mut buf).unwrap(); + buf + }, + |buf| { + let _e = T::deserialize_uncompressed(buf.as_slice()).unwrap(); + }, + ) +} + +pub fn bench_function_div(b: &mut Bencher) { + b.iter_with_setup( + || (rand::(), rand::()), + |(e, f)| { + let _g = e.div(f); + }, + ) +} + +pub fn bench_function_double(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |e| { + let _e_2 = e.double(); + }, + ) +} + +pub fn bench_function_eq(b: &mut Bencher) { + b.iter_with_setup( + || { + let e_1 = rand::(); + let e_2 = e_1.clone(); + (e_1, e_2) + }, + |(e_1, e_2)| { + let _res = e_1 == e_2; + }, + ) +} + +pub fn bench_function_from_u64 + UniformRand>(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |i| { + let _res = T::from(i); + }, + ) +} + +pub fn bench_function_inv(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |e| { + let _e_inv = e.inverse(); + }, + ) +} + +pub fn bench_function_mul(b: &mut Bencher) { + b.iter_with_setup( + || (rand::(), rand::()), + |(e_1, e_2)| { + let _e_3 = e_1 * e_2; + }, + ) +} + +pub fn bench_function_neg(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |e| { + let _e_2 = e.neg(); + }, + ) +} + +pub fn bench_function_one(b: &mut Bencher) { + b.iter(|| { + let _e = T::one(); + }) +} + +pub fn bench_function_pow_u256(b: &mut Bencher) { + b.iter_with_setup( + || { + let base = rand::(); + let exp = rand::(); + (base, exp) + }, + |(base, exp)| { + let _res = base.pow(exp); + }, + ) +} + +pub fn bench_function_serialize_uncomp(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |e| { + let mut buf = vec![]; + e.serialize_uncompressed(&mut buf).unwrap(); + }, + ) +} + +pub fn bench_function_square(b: &mut Bencher) { + b.iter_with_setup( + || rand::(), + |e| { + let _res = e.square(); + }, + ) +} + +pub fn bench_function_sub(b: &mut Bencher) { + b.iter_with_setup( + || (rand::(), rand::()), + |(e, f)| { + let _res = e - f; + }, + ) +} + +pub fn bench_function_zero(b: &mut Bencher) { + b.iter( + || { + let _res = T::zero(); + }, + ) +} diff --git a/crates/aptos-crypto/src/bench_utils.rs b/crates/aptos-crypto/src/bench_utils.rs deleted file mode 100644 index f61e6478a94c5..0000000000000 --- a/crates/aptos-crypto/src/bench_utils.rs +++ /dev/null @@ -1 +0,0 @@ -//! Some functions/macros shared by benches. \ No newline at end of file diff --git a/crates/aptos-crypto/src/lib.rs b/crates/aptos-crypto/src/lib.rs index 297e47199027d..913690b2ef6f0 100644 --- a/crates/aptos-crypto/src/lib.rs +++ b/crates/aptos-crypto/src/lib.rs @@ -6,7 +6,6 @@ #![deny(missing_docs)] //! A library supplying various cryptographic primitives -pub mod bench_utils; pub mod bls12381; pub mod bulletproofs; pub mod compat; diff --git a/scripts/algebra-gas/update_bn254_algebra_gas_params.py b/scripts/algebra-gas/update_bn254_algebra_gas_params.py index 5603241ecf15a..685ef26fb0572 100755 --- a/scripts/algebra-gas/update_bn254_algebra_gas_params.py +++ b/scripts/algebra-gas/update_bn254_algebra_gas_params.py @@ -46,6 +46,36 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_fr_square'] = load_bench_ns.main('target/criterion/ark_bn254/fr_square') nanoseconds['ark_bn254_fr_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fr_sub') nanoseconds['ark_bn254_fr_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fr_zero') + nanoseconds['ark_bn254_fq_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq_add') + nanoseconds['ark_bn254_fq_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq_clone') + nanoseconds['ark_bn254_fq_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq_deser') + nanoseconds['ark_bn254_fq_div'] = load_bench_ns.main('target/criterion/ark_bn254/fq_div') + nanoseconds['ark_bn254_fq_eq'] = load_bench_ns.main('target/criterion/ark_bn254/fq_eq') + nanoseconds['ark_bn254_fq_from_u64'] = load_bench_ns.main('target/criterion/ark_bn254/fq_from_u64') + nanoseconds['ark_bn254_fq_inv'] = load_bench_ns.main('target/criterion/ark_bn254/fq_inv') + nanoseconds['ark_bn254_fq_mul'] = load_bench_ns.main('target/criterion/ark_bn254/fq_mul') + nanoseconds['ark_bn254_fq_neg'] = load_bench_ns.main('target/criterion/ark_bn254/fq_neg') + nanoseconds['ark_bn254_fq_one'] = 1 + nanoseconds['ark_bn254_fq_pow_u256'] = load_bench_ns.main('target/criterion/ark_bn254/fq_pow_u256') + nanoseconds['ark_bn254_fq_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fq_serialize') + nanoseconds['ark_bn254_fq_square'] = load_bench_ns.main('target/criterion/ark_bn254/fq_square') + nanoseconds['ark_bn254_fq_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fq_sub') + nanoseconds['ark_bn254_fq_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fq_zero') + nanoseconds['ark_bn254_fq2_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_add') + nanoseconds['ark_bn254_fq2_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_clone') + nanoseconds['ark_bn254_fq2_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_deser') + nanoseconds['ark_bn254_fq2_div'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_div') + nanoseconds['ark_bn254_fq2_eq'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_eq') + nanoseconds['ark_bn254_fq2_from_u64'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_from_u64') + nanoseconds['ark_bn254_fq2_inv'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_inv') + nanoseconds['ark_bn254_fq2_mul'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_mul') + nanoseconds['ark_bn254_fq2_neg'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_neg') + nanoseconds['ark_bn254_fq2_one'] = 1 + nanoseconds['ark_bn254_fq2_pow_u256'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_pow_u256') + nanoseconds['ark_bn254_fq2_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_serialize') + nanoseconds['ark_bn254_fq2_square'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_square') + nanoseconds['ark_bn254_fq2_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_sub') + nanoseconds['ark_bn254_fq2_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_zero') nanoseconds['ark_bn254_fq12_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_add') nanoseconds['ark_bn254_fq12_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_clone') nanoseconds['ark_bn254_fq12_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_deser') From da2c9e6058961a5fc49ec980db2b96bcceaabc3c Mon Sep 17 00:00:00 2001 From: Zhoujun Ma Date: Sat, 2 Dec 2023 23:25:10 +0000 Subject: [PATCH 09/11] it compiles --- .../src/gas_schedule/aptos_framework.rs | 130 +++++++++++------- crates/aptos-crypto/benches/ark_bn254.rs | 10 +- .../update_bn254_algebra_gas_params.py | 8 +- 3 files changed, 85 insertions(+), 63 deletions(-) diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 54a1da9fb6527..572d6ad91c0cf 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -17,64 +17,94 @@ crate::gas_schedule::macros::define_gas_parameters!( [account_create_signer_base: InternalGas, "account.create_signer.base", 6000], // BN254 algebra gas parameters begin. - // Generated at time 1701543687.9372697 by `scripts/algebra-gas/update_bn254_algebra_gas_params.py` with gas_per_ns=209.10511688369482. - [algebra_ark_bn254_fq12_add: InternalGas, { 12.. => "algebra.ark_bn254_fq12_add" }, 4_404], - [algebra_ark_bn254_fq12_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq12_clone" }, 4_407], - [algebra_ark_bn254_fq12_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq12_deser" }, 133_173], - [algebra_ark_bn254_fq12_div: InternalGas, { 12.. => "algebra.ark_bn254_fq12_div" }, 2_886_754], - [algebra_ark_bn254_fq12_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq12_eq" }, 12_539], - [algebra_ark_bn254_fq12_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq12_from_u64" }, 13_172], - [algebra_ark_bn254_fq12_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq12_inv" }, 2_240_936], - [algebra_ark_bn254_fq12_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq12_mul" }, 643_315], - [algebra_ark_bn254_fq12_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq12_neg" }, 14_112], + // Generated at time 1701559125.5498126 by `scripts/algebra-gas/update_bn254_algebra_gas_params.py` with gas_per_ns=209.10511688369482. + [algebra_ark_bn254_fq12_add: InternalGas, { 12.. => "algebra.ark_bn254_fq12_add" }, 4_406], + [algebra_ark_bn254_fq12_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq12_clone" }, 4_392], + [algebra_ark_bn254_fq12_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq12_deser" }, 129_063], + [algebra_ark_bn254_fq12_div: InternalGas, { 12.. => "algebra.ark_bn254_fq12_div" }, 2_813_602], + [algebra_ark_bn254_fq12_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq12_eq" }, 12_142], + [algebra_ark_bn254_fq12_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq12_from_u64" }, 14_463], + [algebra_ark_bn254_fq12_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq12_inv" }, 2_168_418], + [algebra_ark_bn254_fq12_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq12_mul" }, 643_914], + [algebra_ark_bn254_fq12_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq12_neg" }, 13_311], [algebra_ark_bn254_fq12_one: InternalGas, { 12.. => "algebra.ark_bn254_fq12_one" }, 209], - [algebra_ark_bn254_fq12_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq12_pow_u256" }, 190_546_248], - [algebra_ark_bn254_fq12_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq12_serialize" }, 118_786], - [algebra_ark_bn254_fq12_square: InternalGas, { 12.. => "algebra.ark_bn254_fq12_square" }, 471_596], - [algebra_ark_bn254_fq12_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq12_sub" }, 31_759], - [algebra_ark_bn254_fq12_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq12_zero" }, 4_334], + [algebra_ark_bn254_fq12_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq12_pow_u256" }, 192_871_746], + [algebra_ark_bn254_fq12_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq12_serialize" }, 117_336], + [algebra_ark_bn254_fq12_square: InternalGas, { 12.. => "algebra.ark_bn254_fq12_square" }, 468_955], + [algebra_ark_bn254_fq12_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq12_sub" }, 30_497], + [algebra_ark_bn254_fq12_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq12_zero" }, 209], + [algebra_ark_bn254_fq2_add: InternalGas, { 12.. => "algebra.ark_bn254_fq2_add" }, 4_417], + [algebra_ark_bn254_fq2_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq2_clone" }, 4_318], + [algebra_ark_bn254_fq2_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq2_deser" }, 25_524], + [algebra_ark_bn254_fq2_div: InternalGas, { 12.. => "algebra.ark_bn254_fq2_div" }, 1_183_329], + [algebra_ark_bn254_fq2_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq2_eq" }, 4_393], + [algebra_ark_bn254_fq2_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq2_from_u64" }, 14_227], + [algebra_ark_bn254_fq2_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq2_inv" }, 1_161_471], + [algebra_ark_bn254_fq2_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq2_mul" }, 22_085], + [algebra_ark_bn254_fq2_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq2_neg" }, 4_319], + [algebra_ark_bn254_fq2_one: InternalGas, { 12.. => "algebra.ark_bn254_fq2_one" }, 209], + [algebra_ark_bn254_fq2_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq2_pow_u256" }, 6_265_467], + [algebra_ark_bn254_fq2_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq2_serialize" }, 44_735], + [algebra_ark_bn254_fq2_square: InternalGas, { 12.. => "algebra.ark_bn254_fq2_square" }, 23_962], + [algebra_ark_bn254_fq2_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq2_sub" }, 8_116], + [algebra_ark_bn254_fq2_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq2_zero" }, 209], + [algebra_ark_bn254_fq_add: InternalGas, { 12.. => "algebra.ark_bn254_fq_add" }, 4_373], + [algebra_ark_bn254_fq_clone: InternalGas, { 12.. => "algebra.ark_bn254_fq_clone" }, 4_313], + [algebra_ark_bn254_fq_deser: InternalGas, { 12.. => "algebra.ark_bn254_fq_deser" }, 17_588], + [algebra_ark_bn254_fq_div: InternalGas, { 12.. => "algebra.ark_bn254_fq_div" }, 1_140_544], + [algebra_ark_bn254_fq_eq: InternalGas, { 12.. => "algebra.ark_bn254_fq_eq" }, 4_373], + [algebra_ark_bn254_fq_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fq_from_u64" }, 14_137], + [algebra_ark_bn254_fq_inv: InternalGas, { 12.. => "algebra.ark_bn254_fq_inv" }, 1_136_577], + [algebra_ark_bn254_fq_mul: InternalGas, { 12.. => "algebra.ark_bn254_fq_mul" }, 10_050], + [algebra_ark_bn254_fq_neg: InternalGas, { 12.. => "algebra.ark_bn254_fq_neg" }, 4_314], + [algebra_ark_bn254_fq_one: InternalGas, { 12.. => "algebra.ark_bn254_fq_one" }, 209], + [algebra_ark_bn254_fq_pow_u256: InternalGas, { 12.. => "algebra.ark_bn254_fq_pow_u256" }, 2_081_451], + [algebra_ark_bn254_fq_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fq_serialize" }, 25_938], + [algebra_ark_bn254_fq_square: InternalGas, { 12.. => "algebra.ark_bn254_fq_square" }, 4_314], + [algebra_ark_bn254_fq_sub: InternalGas, { 12.. => "algebra.ark_bn254_fq_sub" }, 6_148], + [algebra_ark_bn254_fq_zero: InternalGas, { 12.. => "algebra.ark_bn254_fq_zero" }, 209], [algebra_ark_bn254_fr_add: InternalGas, { 12.. => "algebra.ark_bn254_fr_add" }, 4_377], - [algebra_ark_bn254_fr_deser: InternalGas, { 12.. => "algebra.ark_bn254_fr_deser" }, 17_330], - [algebra_ark_bn254_fr_div: InternalGas, { 12.. => "algebra.ark_bn254_fr_div" }, 1_214_844], - [algebra_ark_bn254_fr_eq: InternalGas, { 12.. => "algebra.ark_bn254_fr_eq" }, 4_369], - [algebra_ark_bn254_fr_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fr_from_u64" }, 13_816], - [algebra_ark_bn254_fr_inv: InternalGas, { 12.. => "algebra.ark_bn254_fr_inv" }, 1_209_314], - [algebra_ark_bn254_fr_mul: InternalGas, { 12.. => "algebra.ark_bn254_fr_mul" }, 7_819], - [algebra_ark_bn254_fr_neg: InternalGas, { 12.. => "algebra.ark_bn254_fr_neg" }, 4_372], - [algebra_ark_bn254_fr_one: InternalGas, { 12.. => "algebra.ark_bn254_fr_one" }, 4_333], - [algebra_ark_bn254_fr_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fr_serialize" }, 25_564], - [algebra_ark_bn254_fr_square: InternalGas, { 12.. => "algebra.ark_bn254_fr_square" }, 4_369], - [algebra_ark_bn254_fr_sub: InternalGas, { 12.. => "algebra.ark_bn254_fr_sub" }, 4_369], - [algebra_ark_bn254_fr_zero: InternalGas, { 12.. => "algebra.ark_bn254_fr_zero" }, 4_335], - [algebra_ark_bn254_g1_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_comp" }, 23_513_749], - [algebra_ark_bn254_g1_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_uncomp" }, 21_533_713], - [algebra_ark_bn254_g1_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_comp" }, 42_699], - [algebra_ark_bn254_g1_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_uncomp" }, 57_674], - [algebra_ark_bn254_g1_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_add" }, 108_257], - [algebra_ark_bn254_g1_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_double" }, 63_387], - [algebra_ark_bn254_g1_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_eq" }, 52_599], + [algebra_ark_bn254_fr_deser: InternalGas, { 12.. => "algebra.ark_bn254_fr_deser" }, 16_722], + [algebra_ark_bn254_fr_div: InternalGas, { 12.. => "algebra.ark_bn254_fr_div" }, 1_217_943], + [algebra_ark_bn254_fr_eq: InternalGas, { 12.. => "algebra.ark_bn254_fr_eq" }, 4_396], + [algebra_ark_bn254_fr_from_u64: InternalGas, { 12.. => "algebra.ark_bn254_fr_from_u64" }, 13_485], + [algebra_ark_bn254_fr_inv: InternalGas, { 12.. => "algebra.ark_bn254_fr_inv" }, 1_209_015], + [algebra_ark_bn254_fr_mul: InternalGas, { 12.. => "algebra.ark_bn254_fr_mul" }, 9_867], + [algebra_ark_bn254_fr_neg: InternalGas, { 12.. => "algebra.ark_bn254_fr_neg" }, 4_314], + [algebra_ark_bn254_fr_one: InternalGas, { 12.. => "algebra.ark_bn254_fr_one" }, 0], + [algebra_ark_bn254_fr_serialize: InternalGas, { 12.. => "algebra.ark_bn254_fr_serialize" }, 25_749], + [algebra_ark_bn254_fr_square: InternalGas, { 12.. => "algebra.ark_bn254_fr_square" }, 4_311], + [algebra_ark_bn254_fr_sub: InternalGas, { 12.. => "algebra.ark_bn254_fr_sub" }, 10_370], + [algebra_ark_bn254_fr_zero: InternalGas, { 12.. => "algebra.ark_bn254_fr_zero" }, 209], + [algebra_ark_bn254_g1_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_comp" }, 23_497_333], + [algebra_ark_bn254_g1_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_deser_uncomp" }, 21_528_706], + [algebra_ark_bn254_g1_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_comp" }, 44_924], + [algebra_ark_bn254_g1_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g1_affine_serialize_uncomp" }, 58_820], + [algebra_ark_bn254_g1_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_add" }, 106_501], + [algebra_ark_bn254_g1_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_double" }, 63_682], + [algebra_ark_bn254_g1_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_eq" }, 53_021], [algebra_ark_bn254_g1_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_generator" }, 209], [algebra_ark_bn254_g1_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_infinity" }, 209], [algebra_ark_bn254_g1_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_neg" }, 209], - [algebra_ark_bn254_g1_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_scalar_mul" }, 26_808_435], - [algebra_ark_bn254_g1_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_sub" }, 109_719], - [algebra_ark_bn254_g1_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_to_affine" }, 6_263], - [algebra_ark_bn254_g2_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_comp" }, 68_695_000], - [algebra_ark_bn254_g2_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_uncomp" }, 61_554_295], - [algebra_ark_bn254_g2_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_comp" }, 73_334], - [algebra_ark_bn254_g2_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_uncomp" }, 94_974], - [algebra_ark_bn254_g2_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_add" }, 326_526], - [algebra_ark_bn254_g2_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_double" }, 160_304], - [algebra_ark_bn254_g2_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_eq" }, 143_386], + [algebra_ark_bn254_g1_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_scalar_mul" }, 26_456_386], + [algebra_ark_bn254_g1_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_sub" }, 106_903], + [algebra_ark_bn254_g1_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g1_proj_to_affine" }, 6_340], + [algebra_ark_bn254_g2_affine_deser_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_comp" }, 67_710_223], + [algebra_ark_bn254_g2_affine_deser_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_deser_uncomp" }, 60_677_591], + [algebra_ark_bn254_g2_affine_serialize_comp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_comp" }, 69_214], + [algebra_ark_bn254_g2_affine_serialize_uncomp: InternalGas, { 12.. => "algebra.ark_bn254_g2_affine_serialize_uncomp" }, 98_505], + [algebra_ark_bn254_g2_proj_add: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_add" }, 318_234], + [algebra_ark_bn254_g2_proj_double: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_double" }, 158_874], + [algebra_ark_bn254_g2_proj_eq: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_eq" }, 141_359], [algebra_ark_bn254_g2_proj_generator: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_generator" }, 209], [algebra_ark_bn254_g2_proj_infinity: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_infinity" }, 209], [algebra_ark_bn254_g2_proj_neg: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_neg" }, 209], - [algebra_ark_bn254_g2_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_scalar_mul" }, 77_108_001], - [algebra_ark_bn254_g2_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_sub" }, 329_752], - [algebra_ark_bn254_g2_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_to_affine" }, 1_324_072], - [algebra_ark_bn254_multi_pairing_base: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_base" }, 126_522_353], - [algebra_ark_bn254_multi_pairing_per_pair: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_per_pair" }, 68_000_751], - [algebra_ark_bn254_pairing: InternalGas, { 12.. => "algebra.ark_bn254_pairing" }, 209_171_382], + [algebra_ark_bn254_g2_proj_scalar_mul: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_scalar_mul" }, 76_395_801], + [algebra_ark_bn254_g2_proj_sub: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_sub" }, 321_727], + [algebra_ark_bn254_g2_proj_to_affine: InternalGas, { 12.. => "algebra.ark_bn254_g2_proj_to_affine" }, 1_251_909], + [algebra_ark_bn254_multi_pairing_base: InternalGas, { 12.. => "algebra.ark_bn254_multi_pairing_base" }, 127_794_596], + [algebra_ark_bn254_multi_pairing_per_pair: InternalGasPerArg, { 12.. => "algebra.ark_bn254_multi_pairing_per_pair" }, 67_624_587], + [algebra_ark_bn254_pairing: InternalGas, { 12.. => "algebra.ark_bn254_pairing" }, 209_703_839], // BN254 algebra gas parameters end. // Algebra gas parameters begin. diff --git a/crates/aptos-crypto/benches/ark_bn254.rs b/crates/aptos-crypto/benches/ark_bn254.rs index 0d1b9410c3d7f..7a55a72e5aca8 100644 --- a/crates/aptos-crypto/benches/ark_bn254.rs +++ b/crates/aptos-crypto/benches/ark_bn254.rs @@ -16,7 +16,7 @@ use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use ark_std::test_rng; use criterion::{BenchmarkId, Criterion}; use std::ops::{Add, Div, Mul, Neg}; -use crate::bench_utils::{bench_function_add, bench_function_clone, bench_function_deser_comp, bench_function_deser_uncomp, bench_function_div, bench_function_double, bench_function_eq, bench_function_from_u64, bench_function_inv, bench_function_mul, bench_function_neg, bench_function_one, bench_function_pow_u256, bench_function_serialize_uncomp, bench_function_square, bench_function_sub, bench_function_zero}; +use crate::bench_utils::{bench_function_add, bench_function_clone, bench_function_deser_comp, bench_function_deser_uncomp, bench_function_div, bench_function_double, bench_function_eq, bench_function_from_u64, bench_function_inv, bench_function_mul, bench_function_neg, bench_function_pow_u256, bench_function_serialize_uncomp, bench_function_square, bench_function_sub}; mod bench_utils; @@ -57,12 +57,10 @@ fn bench_group(c: &mut Criterion) { group.bench_function("fr_inv", bench_function_inv::); group.bench_function("fr_mul", bench_function_mul::); group.bench_function("fr_neg", bench_function_neg::); - group.bench_function("fr_one", bench_function_one::); group.bench_function("fr_pow_u256", bench_function_pow_u256::); group.bench_function("fr_serialize", bench_function_serialize_uncomp::); group.bench_function("fr_square", bench_function_square::); group.bench_function("fr_sub", bench_function_sub::); - group.bench_function("fr_zero", bench_function_zero::); group.bench_function("fq_add", bench_function_add::); group.bench_function("fq_clone", bench_function_clone::); @@ -74,12 +72,10 @@ fn bench_group(c: &mut Criterion) { group.bench_function("fq_inv", bench_function_inv::); group.bench_function("fq_mul", bench_function_mul::); group.bench_function("fq_neg", bench_function_neg::); - group.bench_function("fq_one", bench_function_one::); group.bench_function("fq_pow_u256", bench_function_pow_u256::); group.bench_function("fq_serialize", bench_function_serialize_uncomp::); group.bench_function("fq_square", bench_function_square::); group.bench_function("fq_sub", bench_function_sub::); - group.bench_function("fq_zero", bench_function_zero::); group.bench_function("fq2_add", bench_function_add::); group.bench_function("fq2_clone", bench_function_clone::); @@ -91,12 +87,10 @@ fn bench_group(c: &mut Criterion) { group.bench_function("fq2_inv", bench_function_inv::); group.bench_function("fq2_mul", bench_function_mul::); group.bench_function("fq2_neg", bench_function_neg::); - group.bench_function("fq2_one", bench_function_one::); group.bench_function("fq2_pow_u256", bench_function_pow_u256::); group.bench_function("fq2_serialize", bench_function_serialize_uncomp::); group.bench_function("fq2_square", bench_function_square::); group.bench_function("fq2_sub", bench_function_sub::); - group.bench_function("fq2_zero", bench_function_zero::); group.bench_function("fq12_add", bench_function_add::); @@ -109,12 +103,10 @@ fn bench_group(c: &mut Criterion) { group.bench_function("fq12_inv", bench_function_inv::); group.bench_function("fq12_mul", bench_function_mul::); group.bench_function("fq12_neg", bench_function_neg::); - group.bench_function("fq12_one", bench_function_one::); group.bench_function("fq12_pow_u256", bench_function_pow_u256::); group.bench_function("fq12_serialize", bench_function_serialize_uncomp::); group.bench_function("fq12_square", bench_function_square::); group.bench_function("fq12_sub", bench_function_sub::); - group.bench_function("fq12_zero", bench_function_zero::); group.bench_function("g1_affine_add", bench_function_add::); group.bench_function("g1_affine_deser_comp", bench_function_deser_comp::); diff --git a/scripts/algebra-gas/update_bn254_algebra_gas_params.py b/scripts/algebra-gas/update_bn254_algebra_gas_params.py index 685ef26fb0572..f892d566f4faf 100755 --- a/scripts/algebra-gas/update_bn254_algebra_gas_params.py +++ b/scripts/algebra-gas/update_bn254_algebra_gas_params.py @@ -45,7 +45,7 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_fr_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fr_serialize') nanoseconds['ark_bn254_fr_square'] = load_bench_ns.main('target/criterion/ark_bn254/fr_square') nanoseconds['ark_bn254_fr_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fr_sub') - nanoseconds['ark_bn254_fr_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fr_zero') + nanoseconds['ark_bn254_fr_zero'] = 1 nanoseconds['ark_bn254_fq_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq_add') nanoseconds['ark_bn254_fq_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq_clone') nanoseconds['ark_bn254_fq_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq_deser') @@ -60,7 +60,7 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_fq_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fq_serialize') nanoseconds['ark_bn254_fq_square'] = load_bench_ns.main('target/criterion/ark_bn254/fq_square') nanoseconds['ark_bn254_fq_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fq_sub') - nanoseconds['ark_bn254_fq_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fq_zero') + nanoseconds['ark_bn254_fq_zero'] = 1 nanoseconds['ark_bn254_fq2_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_add') nanoseconds['ark_bn254_fq2_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_clone') nanoseconds['ark_bn254_fq2_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_deser') @@ -75,7 +75,7 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_fq2_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_serialize') nanoseconds['ark_bn254_fq2_square'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_square') nanoseconds['ark_bn254_fq2_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_sub') - nanoseconds['ark_bn254_fq2_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fq2_zero') + nanoseconds['ark_bn254_fq2_zero'] = 1 nanoseconds['ark_bn254_fq12_add'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_add') nanoseconds['ark_bn254_fq12_clone'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_clone') nanoseconds['ark_bn254_fq12_deser'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_deser') @@ -90,7 +90,7 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_fq12_serialize'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_serialize') nanoseconds['ark_bn254_fq12_square'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_square') nanoseconds['ark_bn254_fq12_sub'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_sub') - nanoseconds['ark_bn254_fq12_zero'] = load_bench_ns.main('target/criterion/ark_bn254/fq12_zero') + nanoseconds['ark_bn254_fq12_zero'] = 1 nanoseconds['ark_bn254_g1_affine_deser_comp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_deser_comp') nanoseconds['ark_bn254_g1_affine_deser_uncomp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_deser_uncomp') nanoseconds['ark_bn254_g1_affine_serialize_comp'] = load_bench_ns.main('target/criterion/ark_bn254/g1_affine_serialize_comp') From fd6f1bdde75af1ee9e3b1b02d166bee10b833e09 Mon Sep 17 00:00:00 2001 From: "zhoujun.ma" Date: Sat, 2 Dec 2023 15:53:18 -0800 Subject: [PATCH 10/11] gas script now also specifies quantity types --- scripts/algebra-gas/update_bn254_algebra_gas_params.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/algebra-gas/update_bn254_algebra_gas_params.py b/scripts/algebra-gas/update_bn254_algebra_gas_params.py index f892d566f4faf..a1eaa359f3848 100755 --- a/scripts/algebra-gas/update_bn254_algebra_gas_params.py +++ b/scripts/algebra-gas/update_bn254_algebra_gas_params.py @@ -7,6 +7,7 @@ ''' import argparse +from collections import defaultdict import fit_linear_model import load_bench_ns import load_bench_datapoints @@ -119,8 +120,12 @@ def get_algebra_lines(gas_per_ns): nanoseconds['ark_bn254_g2_proj_to_affine'] = load_bench_ns.main('target/criterion/ark_bn254/g2_proj_to_affine') nanoseconds['ark_bn254_pairing'] = load_bench_ns.main('target/criterion/ark_bn254/pairing') _,_,nanoseconds['ark_bn254_multi_pairing_per_pair'],nanoseconds['ark_bn254_multi_pairing_base'] = get_bench_ns_linear('target/criterion/ark_bn254/pairing_product') - gas_units = {k:gas_per_ns*v for k,v in nanoseconds.items()} - lines = [f' [algebra_{k}: InternalGas, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(int(v))}],' for k,v in sorted(gas_units.items())] + + quantity_types = defaultdict(lambda: "InternalGas") + quantity_types['ark_bn254_multi_pairing_per_pair'] = 'InternalGasPerArg' + + gas_param_entries = { k:(int(gas_per_ns*v), quantity_types[k]) for k,v in nanoseconds.items()} + lines = [f' [algebra_{k}: {unt}, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(qty)}],' for k,(qty,unt) in sorted(gas_param_entries.items())] return lines def main(gas_per_ns): From c1c6d2ae00997cf3591838a5b51e7b3cab52991d Mon Sep 17 00:00:00 2001 From: "zhoujun.ma" Date: Sat, 2 Dec 2023 16:04:13 -0800 Subject: [PATCH 11/11] update scripts --- .../src/gas_schedule/aptos_framework.rs | 4 ++-- ... => update_bls12381_algebra_gas_params.py} | 19 +++++++++++++------ .../update_bn254_algebra_gas_params.py | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) rename scripts/algebra-gas/{update_algebra_gas_params.py => update_bls12381_algebra_gas_params.py} (89%) diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 572d6ad91c0cf..cc315caf46f7e 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -107,7 +107,7 @@ crate::gas_schedule::macros::define_gas_parameters!( [algebra_ark_bn254_pairing: InternalGas, { 12.. => "algebra.ark_bn254_pairing" }, 209_703_839], // BN254 algebra gas parameters end. - // Algebra gas parameters begin. + // BLS12-381 algebra gas parameters begin. // Generated at time 1680606720.0709136 by `scripts/algebra-gas/update_algebra_gas_params.py` with gas_per_ns=10.23. [algebra_ark_bls12_381_fq12_add: InternalGas, { 8.. => "algebra.ark_bls12_381_fq12_add" }, 36380], [algebra_ark_bls12_381_fq12_clone: InternalGas, { 8.. => "algebra.ark_bls12_381_fq12_clone" }, 4220], @@ -170,7 +170,7 @@ crate::gas_schedule::macros::define_gas_parameters!( [algebra_ark_h2c_bls12381g1_xmd_sha256_sswu_per_msg_byte: InternalGasPerByte, { 8.. => "algebra.ark_h2c_bls12381g1_xmd_sha256_sswu_per_msg_byte" }, 960], [algebra_ark_h2c_bls12381g2_xmd_sha256_sswu_base: InternalGas, { 8.. => "algebra.ark_h2c_bls12381g2_xmd_sha256_sswu_base" }, 135460040], [algebra_ark_h2c_bls12381g2_xmd_sha256_sswu_per_msg_byte: InternalGasPerByte, { 8.. => "algebra.ark_h2c_bls12381g2_xmd_sha256_sswu_per_msg_byte" }, 960], - // Algebra gas parameters end. + // BLS12-381 algebra gas parameters end. [bls12381_base: InternalGas, "bls12381.base", 3000], diff --git a/scripts/algebra-gas/update_algebra_gas_params.py b/scripts/algebra-gas/update_bls12381_algebra_gas_params.py similarity index 89% rename from scripts/algebra-gas/update_algebra_gas_params.py rename to scripts/algebra-gas/update_bls12381_algebra_gas_params.py index 06f3855cfaa03..ccecdcbd090fa 100755 --- a/scripts/algebra-gas/update_algebra_gas_params.py +++ b/scripts/algebra-gas/update_bls12381_algebra_gas_params.py @@ -7,6 +7,7 @@ ''' import argparse +from collections import defaultdict import fit_linear_model import load_bench_ns import load_bench_datapoints @@ -91,24 +92,30 @@ def get_algebra_lines(gas_per_ns): _,_,nanoseconds['ark_bls12_381_multi_pairing_per_pair'],nanoseconds['ark_bls12_381_multi_pairing_base'] = get_bench_ns_linear('target/criterion/ark_bls12_381/pairing_product') _,_,nanoseconds['ark_h2c_bls12381g1_xmd_sha256_sswu_per_msg_byte'],nanoseconds['ark_h2c_bls12381g1_xmd_sha256_sswu_base'] = get_bench_ns_linear('target/criterion/ark_bls12_381/hash_to_g1_proj') _,_,nanoseconds['ark_h2c_bls12381g2_xmd_sha256_sswu_per_msg_byte'],nanoseconds['ark_h2c_bls12381g2_xmd_sha256_sswu_base'] = get_bench_ns_linear('target/criterion/ark_bls12_381/hash_to_g2_proj') - gas_units = {k:gas_per_ns*v for k,v in nanoseconds.items()} - lines = [f' [.algebra.{k}, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(v)} * MUL],' for k,v in sorted(gas_units.items())] + + quantity_types = defaultdict(lambda: "InternalGas") + quantity_types['ark_bls12_381_multi_pairing_per_pair'] = 'InternalGasPerArg' + quantity_types['ark_h2c_bls12381g1_xmd_sha256_sswu_per_msg_byte'] = 'InternalGasPerByte' + quantity_types['ark_h2c_bls12381g2_xmd_sha256_sswu_per_msg_byte'] = 'InternalGasPerByte' + + gas_param_entries = { k:(int(gas_per_ns*v), quantity_types[k]) for k,v in nanoseconds.items()} + lines = [f' [algebra_{k}: {unt}, {{ {TARGET_GAS_VERSION}.. => "algebra.{k}" }}, {prettify_number(qty)}],' for k,(qty,unt) in sorted(gas_param_entries.items())] return lines def main(gas_per_ns): path = Path(PATH_STR) lines = path.read_text().split('\n') striped_lines = [line.strip() for line in lines] - line_id_begin = striped_lines.index('// Algebra gas parameters begin.') - line_id_end = striped_lines.index('// Algebra gas parameters end.') - generator_note_line = f' // Generated at time {time()} by `scripts/algebra-gas/update_algebra_gas_params.py` with gas_per_ns={gas_per_ns}.' + line_id_begin = striped_lines.index('// BLS12-381 algebra gas parameters begin.') + line_id_end = striped_lines.index('// BLS12-381 algebra gas parameters end.') + generator_note_line = f' // Generated at time {time()} by `scripts/algebra-gas/update_bls12381_algebra_gas_params.py` with gas_per_ns={gas_per_ns}.' new_lines = lines[:line_id_begin+1] + [generator_note_line] + get_algebra_lines(gas_per_ns) + lines[line_id_end:] path.write_text('\n'.join(new_lines)) PATH_STR = 'aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs' if __name__=='__main__': parser = argparse.ArgumentParser( - description=f'Generate gas parameters for algebra module in `{PATH_STR}`.') + description=f'Generate gas parameters for BLS12-381 algebra module in `{PATH_STR}`.') parser.add_argument('--gas_per_ns', required=True, type=float) args = parser.parse_args() main(args.gas_per_ns) diff --git a/scripts/algebra-gas/update_bn254_algebra_gas_params.py b/scripts/algebra-gas/update_bn254_algebra_gas_params.py index a1eaa359f3848..80d906f1eda64 100755 --- a/scripts/algebra-gas/update_bn254_algebra_gas_params.py +++ b/scripts/algebra-gas/update_bn254_algebra_gas_params.py @@ -141,7 +141,7 @@ def main(gas_per_ns): PATH_STR = 'aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs' if __name__=='__main__': parser = argparse.ArgumentParser( - description=f'Generate gas parameters for algebra module in `{PATH_STR}`.') + description=f'Generate gas parameters for BN254 algebra module in `{PATH_STR}`.') parser.add_argument('--gas_per_ns', required=True, type=float) args = parser.parse_args() main(args.gas_per_ns)