@@ -215,10 +215,20 @@ PrecompileAnalysis bls12_g2msm_analyze(bytes_view input, evmc_revision) noexcept
215215 return {bls_msm_cost (input.size () / 288 , BLS12_G2MUL_PRECOMPILE_GAS ), 256 };
216216}
217217
218- PrecompileAnalysis bls12_pairing_check_analyze (bytes_view, evmc_revision) noexcept
218+ PrecompileAnalysis bls12_pairing_check_analyze (bytes_view input , evmc_revision) noexcept
219219{
220- // TODO: Implement
221- return {GasCostMax, 0 };
220+ static constexpr auto PAIR_SIZE = 384 ;
221+
222+ if (input.empty () || input.size () % PAIR_SIZE != 0 )
223+ return {GasCostMax, 0 };
224+
225+ const auto npairs = static_cast <int64_t >(input.size ()) / PAIR_SIZE ;
226+
227+ static constexpr auto BLS12_PAIRING_CHECK_BASE_FEE_PRECOMPILE_GAS = 65000 ;
228+ static constexpr auto BLS12_PAIRING_CHECK_FEE_PRECOMPILE_GAS = 43000 ;
229+ return {BLS12_PAIRING_CHECK_BASE_FEE_PRECOMPILE_GAS +
230+ BLS12_PAIRING_CHECK_FEE_PRECOMPILE_GAS * npairs,
231+ 32 };
222232}
223233
224234PrecompileAnalysis bls12_map_fp_to_g1_analyze (bytes_view, evmc_revision) noexcept
@@ -456,9 +466,18 @@ ExecutionResult bls12_g2msm_execute(const uint8_t* input, size_t input_size, uin
456466 return {EVMC_SUCCESS , 256 };
457467}
458468
459- ExecutionResult bls12_pairing_check_execute (const uint8_t *, size_t , uint8_t *, size_t ) noexcept
469+ ExecutionResult bls12_pairing_check_execute (const uint8_t * input, size_t input_size,
470+ uint8_t * output, [[maybe_unused]] size_t output_size) noexcept
460471{
461- return {EVMC_PRECOMPILE_FAILURE , 0 };
472+ if (input_size % 384 != 0 )
473+ return {EVMC_PRECOMPILE_FAILURE , 0 };
474+
475+ assert (output_size == 32 );
476+
477+ if (!crypto::bls::pairing_check (output, input, input_size))
478+ return {EVMC_PRECOMPILE_FAILURE , 0 };
479+
480+ return {EVMC_SUCCESS , 32 };
462481}
463482
464483ExecutionResult bls12_map_fp_to_g1_execute (const uint8_t * input, size_t input_size, uint8_t * output,
0 commit comments