Skip to content

Commit f7fd5dc

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

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-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

+57
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,63 @@ ExecutionResult blake2bf_execute(const uint8_t* input, [[maybe_unused]] size_t i
383383
return {EVMC_SUCCESS, sizeof(h)};
384384
}
385385

386+
ExecutionResult ecpairing_execute(const uint8_t* input, size_t input_size, uint8_t* output,
387+
[[maybe_unused]] size_t output_size) noexcept
388+
{
389+
assert(output_size >= 32);
390+
391+
const auto pair_size = 192;
392+
393+
if (input_size % pair_size != 0)
394+
return {EVMC_PRECOMPILE_FAILURE, 0};
395+
396+
const auto pair_count = input_size / pair_size;
397+
398+
if (pair_count > 0)
399+
{
400+
auto input_idx = input;
401+
402+
std::vector<evmmax::bn254::Point> vG1(pair_count);
403+
std::vector<evmmax::bn254::ExtPoint> vG2(pair_count);
404+
405+
for (size_t i = 0; i < pair_count; ++i)
406+
{
407+
const evmmax::bn254::Point p = {
408+
intx::be::unsafe::load<intx::uint256>(input_idx),
409+
intx::be::unsafe::load<intx::uint256>(input_idx + 32),
410+
};
411+
412+
const evmmax::bn254::ExtPoint q = {
413+
{intx::be::unsafe::load<intx::uint256>(input_idx + 96),
414+
intx::be::unsafe::load<intx::uint256>(input_idx + 64)},
415+
{intx::be::unsafe::load<intx::uint256>(input_idx + 160),
416+
intx::be::unsafe::load<intx::uint256>(input_idx + 128)},
417+
};
418+
419+
vG1[i] = p;
420+
vG2[i] = q;
421+
422+
input_idx += pair_size;
423+
}
424+
425+
const auto res = evmmax::bn254::pairing(vG2, vG1);
426+
427+
if (res.has_value())
428+
{
429+
intx::be::unsafe::store(output, res.value() ? intx::uint256{1} : intx::uint256{0});
430+
return {EVMC_SUCCESS, 64};
431+
}
432+
else
433+
return {EVMC_PRECOMPILE_FAILURE, 0};
434+
}
435+
else
436+
{
437+
intx::be::unsafe::store(output, intx::uint256{1});
438+
return {EVMC_SUCCESS, 32};
439+
}
440+
}
441+
442+
386443
ExecutionResult point_evaluation_execute(const uint8_t* input, size_t input_size, uint8_t* output,
387444
[[maybe_unused]] size_t output_size) noexcept
388445
{

test/state/precompiles_internal.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ ExecutionResult ecmul_execute(
5353
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
5454
ExecutionResult blake2bf_execute(
5555
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
56+
ExecutionResult ecpairing_execute(
57+
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
5658
ExecutionResult point_evaluation_execute(
5759
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
5860
ExecutionResult bls12_g1add_execute(

0 commit comments

Comments
 (0)