builtins_common/
bls12_381.rs1mod high_level;
20mod low_level;
21
22pub use gbuiltin_bls381::{
23 Request, Response, ark_bls12_381, ark_ec, ark_ff, ark_scale, ark_serialize,
24};
25pub use high_level::*;
26pub use low_level::Bls12_381OpsLowLevel;
27
28use super::{BuiltinActorError, BuiltinContext};
29use alloc::{vec, vec::Vec};
30use gbuiltin_bls381::{
31 REQUEST_AGGREGATE_G1, REQUEST_FINAL_EXPONENTIATION, REQUEST_MAP_TO_G2AFFINE,
32 REQUEST_MULTI_MILLER_LOOP, REQUEST_MULTI_SCALAR_MULTIPLICATION_G1,
33 REQUEST_MULTI_SCALAR_MULTIPLICATION_G2, REQUEST_PROJECTIVE_MULTIPLICATION_G1,
34 REQUEST_PROJECTIVE_MULTIPLICATION_G2,
35};
36
37pub fn execute_bls12_381_builtins<Gas: BlsOpsGasCost, Ops: Bls12_381Ops>(
42 input: &[u8],
43 context: &mut BuiltinContext,
44) -> Result<Response, BuiltinActorError> {
45 match input.first().copied() {
46 Some(REQUEST_MULTI_MILLER_LOOP) => {
47 high_level::multi_miller_loop::<Gas, Ops>(&input[1..], context)
48 }
49 Some(REQUEST_FINAL_EXPONENTIATION) => {
50 high_level::final_exponentiation::<Gas, Ops>(&input[1..], context)
51 }
52 Some(REQUEST_MULTI_SCALAR_MULTIPLICATION_G1) => high_level::msm::<Gas>(
53 &input[1..],
54 context,
55 Gas::bls12_381_msm_g1,
56 |bases, scalars| Ops::msm_g1(bases, scalars).map(Response::MultiScalarMultiplicationG1),
57 ),
58 Some(REQUEST_MULTI_SCALAR_MULTIPLICATION_G2) => high_level::msm::<Gas>(
59 &input[1..],
60 context,
61 Gas::bls12_381_msm_g2,
62 |bases, scalars| Ops::msm_g2(bases, scalars).map(Response::MultiScalarMultiplicationG2),
63 ),
64 Some(REQUEST_PROJECTIVE_MULTIPLICATION_G1) => high_level::projective_multiplication::<Gas>(
65 &input[1..],
66 context,
67 Gas::bls12_381_mul_projective_g1,
68 |base, scalar| {
69 Ops::projective_mul_g1(base, scalar).map(Response::ProjectiveMultiplicationG1)
70 },
71 ),
72 Some(REQUEST_PROJECTIVE_MULTIPLICATION_G2) => high_level::projective_multiplication::<Gas>(
73 &input[1..],
74 context,
75 Gas::bls12_381_mul_projective_g2,
76 |base, scalar| {
77 Ops::projective_mul_g2(base, scalar).map(Response::ProjectiveMultiplicationG2)
78 },
79 ),
80 Some(REQUEST_AGGREGATE_G1) => high_level::aggregate_g1::<Gas, Ops>(&input[1..], context),
81 Some(REQUEST_MAP_TO_G2AFFINE) => {
82 high_level::map_to_g2affine::<Gas, Ops>(&input[1..], context)
83 }
84 _ => Err(BuiltinActorError::DecodingError),
85 }
86}
87
88pub trait BlsOpsGasCost {
93 fn decode_bytes(len: u32) -> u64;
95 fn bls12_381_multi_miller_loop(count: u32) -> u64;
97 fn bls12_381_final_exponentiation() -> u64;
99 fn bls12_381_msm_g1(count: u32) -> u64;
101 fn bls12_381_msm_g2(count: u32) -> u64;
103 fn bls12_381_mul_projective_g1(count: u32) -> u64;
105 fn bls12_381_mul_projective_g2(count: u32) -> u64;
107 fn bls12_381_aggregate_g1(count: u32) -> u64;
109 fn bls12_381_map_to_g2affine(len: u32) -> u64;
111}
112pub trait Bls12_381Ops {
118 fn multi_miller_loop(g1: Vec<u8>, g2: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
120 fn final_exponentiation(f: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
122 fn msm_g1(bases: Vec<u8>, scalars: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
124 fn msm_g2(bases: Vec<u8>, scalars: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
126 fn projective_mul_g1(base: Vec<u8>, scalar: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
128 fn projective_mul_g2(base: Vec<u8>, scalar: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
130 fn aggregate_g1(points: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
132 fn map_to_g2affine(message: Vec<u8>) -> Result<Vec<u8>, BuiltinActorError>;
134}