Skip to content

Commit 5447833

Browse files
rodiazetchfast
andcommitted
evmmax: Benchmark ate pairing
Co-authored-by: Paweł Bylica <[email protected]>
1 parent 7c953a1 commit 5447833

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

test/precompiles_bench/precompiles_bench.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ BENCHMARK_TEMPLATE(precompile, PrecompileId::ecmul, libff);
206206

207207
namespace bench_ecpairing
208208
{
209+
constexpr auto evmmax_cpp = ecpairing_execute;
210+
BENCHMARK_TEMPLATE(precompile, PrecompileId::ecpairing, evmmax_cpp);
209211
#ifdef EVMONE_PRECOMPILES_SILKPRE
210212
constexpr auto libff = silkpre_ecpairing_execute;
211213
BENCHMARK_TEMPLATE(precompile, PrecompileId::ecpairing, libff);

test/state/precompiles.cpp

+49
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,55 @@ ExecutionResult ecmul_execute(const uint8_t* input, size_t input_size, uint8_t*
348348
return {EVMC_PRECOMPILE_FAILURE, 0};
349349
}
350350

351+
ExecutionResult ecpairing_execute(const uint8_t* input, size_t input_size, uint8_t* output,
352+
[[maybe_unused]] size_t output_size) noexcept
353+
{
354+
assert(output_size >= 32);
355+
356+
static constexpr size_t PAIR_SIZE = 192;
357+
358+
if (input_size % PAIR_SIZE != 0)
359+
return {EVMC_PRECOMPILE_FAILURE, 0};
360+
361+
if (const auto n_pairs = input_size / PAIR_SIZE; n_pairs > 0)
362+
{
363+
std::vector<std::pair<evmmax::bn254::Point, evmmax::bn254::ExtPoint>> pairs;
364+
pairs.reserve(n_pairs);
365+
auto input_idx = input;
366+
for (size_t i = 0; i < n_pairs; ++i)
367+
{
368+
const evmmax::bn254::Point p{
369+
intx::be::unsafe::load<intx::uint256>(input_idx),
370+
intx::be::unsafe::load<intx::uint256>(input_idx + 32),
371+
};
372+
373+
const evmmax::bn254::ExtPoint q{
374+
{intx::be::unsafe::load<intx::uint256>(input_idx + 96),
375+
intx::be::unsafe::load<intx::uint256>(input_idx + 64)},
376+
{intx::be::unsafe::load<intx::uint256>(input_idx + 160),
377+
intx::be::unsafe::load<intx::uint256>(input_idx + 128)},
378+
};
379+
pairs.emplace_back(p, q);
380+
input_idx += PAIR_SIZE;
381+
}
382+
383+
const auto res = evmmax::bn254::pairing_check(pairs);
384+
385+
if (res.has_value())
386+
{
387+
intx::be::unsafe::store(output, res.value() ? intx::uint256{1} : intx::uint256{0});
388+
return {EVMC_SUCCESS, 64};
389+
}
390+
else
391+
return {EVMC_PRECOMPILE_FAILURE, 0};
392+
}
393+
else
394+
{
395+
intx::be::unsafe::store(output, intx::uint256{1});
396+
return {EVMC_SUCCESS, 32};
397+
}
398+
}
399+
351400
ExecutionResult identity_execute(const uint8_t* input, size_t input_size, uint8_t* output,
352401
[[maybe_unused]] size_t output_size) noexcept
353402
{

test/state/precompiles_internal.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ ExecutionResult ecmul_execute(
5151
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
5252
ExecutionResult blake2bf_execute(
5353
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
54+
ExecutionResult ecpairing_execute(
55+
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
5456
ExecutionResult point_evaluation_execute(
5557
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
5658
ExecutionResult bls12_g1add_execute(

0 commit comments

Comments
 (0)