Skip to content

Commit c406070

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

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

test/precompiles_bench/precompiles_bench.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ constexpr auto analyze<PrecompileId::ecadd> = ecadd_analyze;
3232
template <>
3333
constexpr auto analyze<PrecompileId::ecmul> = ecmul_analyze;
3434
template <>
35-
[[maybe_unused]] constexpr auto analyze<PrecompileId::ecpairing> = ecpairing_analyze;
35+
constexpr auto analyze<PrecompileId::ecpairing> = ecpairing_analyze;
3636

3737
template <PrecompileId>
3838
const inline std::array inputs{0};
@@ -188,6 +188,8 @@ BENCHMARK_TEMPLATE(precompile, PrecompileId::ecmul, libff);
188188

189189
namespace bench_ecpairing
190190
{
191+
constexpr auto evmmax_cpp = ecpairing_execute;
192+
BENCHMARK_TEMPLATE(precompile, PrecompileId::ecpairing, evmmax_cpp);
191193
#ifdef EVMONE_PRECOMPILES_SILKPRE
192194
constexpr auto libff = silkpre_ecpairing_execute;
193195
BENCHMARK_TEMPLATE(precompile, PrecompileId::ecpairing, libff);

test/state/precompiles.cpp

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

295+
ExecutionResult ecpairing_execute(const uint8_t* input, size_t input_size, uint8_t* output,
296+
[[maybe_unused]] size_t output_size) noexcept
297+
{
298+
assert(output_size >= 32);
299+
300+
const auto pair_size = 192;
301+
302+
if (input_size % pair_size != 0)
303+
return {EVMC_PRECOMPILE_FAILURE, 0};
304+
305+
const auto pair_count = input_size / pair_size;
306+
307+
if (pair_count > 0)
308+
{
309+
auto input_idx = input;
310+
311+
std::vector<evmmax::bn254::Point> vG1(pair_count);
312+
std::vector<evmmax::bn254::ExtPoint> vG2(pair_count);
313+
314+
for (size_t i = 0; i < pair_count; ++i)
315+
{
316+
const evmmax::bn254::Point p = {
317+
intx::be::unsafe::load<intx::uint256>(input_idx),
318+
intx::be::unsafe::load<intx::uint256>(input_idx + 32),
319+
};
320+
321+
const evmmax::bn254::ExtPoint q = {
322+
{intx::be::unsafe::load<intx::uint256>(input_idx + 96),
323+
intx::be::unsafe::load<intx::uint256>(input_idx + 64)},
324+
{intx::be::unsafe::load<intx::uint256>(input_idx + 160),
325+
intx::be::unsafe::load<intx::uint256>(input_idx + 128)},
326+
};
327+
328+
vG1[i] = p;
329+
vG2[i] = q;
330+
331+
input_idx += pair_size;
332+
}
333+
334+
const auto res = evmmax::bn254::pairing(vG2, vG1);
335+
336+
if (res.has_value())
337+
{
338+
intx::be::unsafe::store(output, res.value() ? intx::uint256{1} : intx::uint256{0});
339+
return {EVMC_SUCCESS, 64};
340+
}
341+
else
342+
return {EVMC_PRECOMPILE_FAILURE, 0};
343+
}
344+
else
345+
{
346+
intx::be::unsafe::store(output, intx::uint256{1});
347+
return {EVMC_SUCCESS, 32};
348+
}
349+
}
350+
351+
295352
namespace
296353
{
297354
struct PrecompileTraits

test/state/precompiles_internal.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,6 @@ ExecutionResult ecmul_execute(
4444
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
4545
ExecutionResult blake2bf_execute(
4646
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
47+
ExecutionResult ecpairing_execute(
48+
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
4749
} // namespace evmone::state

0 commit comments

Comments
 (0)