Skip to content

Commit bdcd3c0

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

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};
@@ -185,6 +185,8 @@ BENCHMARK_TEMPLATE(precompile, PrecompileId::ecmul, libff);
185185

186186
namespace bench_ecpairing
187187
{
188+
constexpr auto evmmax_cpp = ecpairing_execute;
189+
BENCHMARK_TEMPLATE(precompile, PrecompileId::ecpairing, evmmax_cpp);
188190
#ifdef EVMONE_PRECOMPILES_SILKPRE
189191
constexpr auto libff = silkpre_ecpairing_execute;
190192
BENCHMARK_TEMPLATE(precompile, PrecompileId::ecpairing, libff);

test/state/precompiles.cpp

+57
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,63 @@ ExecutionResult identity_execute(const uint8_t* input, size_t input_size, uint8_
240240
return {EVMC_SUCCESS, input_size};
241241
}
242242

243+
ExecutionResult ecpairing_execute(const uint8_t* input, size_t input_size, uint8_t* output,
244+
[[maybe_unused]] size_t output_size) noexcept
245+
{
246+
assert(output_size >= 32);
247+
248+
const auto pair_size = 192;
249+
250+
if (input_size % pair_size != 0)
251+
return {EVMC_PRECOMPILE_FAILURE, 0};
252+
253+
const auto pair_count = input_size / pair_size;
254+
255+
if (pair_count > 0)
256+
{
257+
auto input_idx = input;
258+
259+
std::vector<evmmax::bn254::Point> vG1(pair_count);
260+
std::vector<evmmax::bn254::ExtPoint> vG2(pair_count);
261+
262+
for (size_t i = 0; i < pair_count; ++i)
263+
{
264+
const evmmax::bn254::Point p = {
265+
intx::be::unsafe::load<intx::uint256>(input_idx),
266+
intx::be::unsafe::load<intx::uint256>(input_idx + 32),
267+
};
268+
269+
const evmmax::bn254::ExtPoint q = {
270+
{intx::be::unsafe::load<intx::uint256>(input_idx + 96),
271+
intx::be::unsafe::load<intx::uint256>(input_idx + 64)},
272+
{intx::be::unsafe::load<intx::uint256>(input_idx + 160),
273+
intx::be::unsafe::load<intx::uint256>(input_idx + 128)},
274+
};
275+
276+
vG1[i] = p;
277+
vG2[i] = q;
278+
279+
input_idx += pair_size;
280+
}
281+
282+
const auto res = evmmax::bn254::pairing(vG2, vG1);
283+
284+
if (res.has_value())
285+
{
286+
intx::be::unsafe::store(output, res.value() ? intx::uint256{1} : intx::uint256{0});
287+
return {EVMC_SUCCESS, 64};
288+
}
289+
else
290+
return {EVMC_PRECOMPILE_FAILURE, 0};
291+
}
292+
else
293+
{
294+
intx::be::unsafe::store(output, intx::uint256{1});
295+
return {EVMC_SUCCESS, 32};
296+
}
297+
}
298+
299+
243300
namespace
244301
{
245302
struct PrecompileTraits

test/state/precompiles_internal.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ ExecutionResult ecadd_execute(
3838
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
3939
ExecutionResult ecmul_execute(
4040
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
41+
ExecutionResult ecpairing_execute(
42+
const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept;
4143
} // namespace evmone::state

0 commit comments

Comments
 (0)