Skip to content

Commit 72c533c

Browse files
committed
precompiles: Optionally use silkpre as implementation
1 parent c9b0e0b commit 72c533c

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed

test/state/CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,9 @@ if(EVMONE_PRECOMPILES_SILKPRE)
4848

4949
target_link_libraries(evmone-state PRIVATE silkpre)
5050
target_compile_definitions(evmone-state PRIVATE EVMONE_PRECOMPILES_SILKPRE=1)
51+
target_sources(
52+
evmone-state PRIVATE
53+
precompiles_silkpre.hpp
54+
precompiles_silkpre.cpp
55+
)
5156
endif()

test/state/precompiles.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
#include <limits>
1212
#include <unordered_map>
1313

14+
#ifdef EVMONE_PRECOMPILES_SILKPRE
15+
#include "precompiles_silkpre.hpp"
16+
#endif
17+
1418
namespace evmone::state
1519
{
1620
using namespace evmc::literals;
@@ -172,6 +176,16 @@ inline constexpr auto traits = []() noexcept {
172176
{ecpairing_analyze, dummy_execute<PrecompileId::ecpairing>},
173177
{blake2bf_analyze, dummy_execute<PrecompileId::blake2bf>},
174178
}};
179+
#ifdef EVMONE_PRECOMPILES_SILKPRE
180+
tbl[static_cast<size_t>(PrecompileId::ecrecover)].execute = silkpre_ecrecover_execute;
181+
tbl[static_cast<size_t>(PrecompileId::sha256)].execute = silkpre_sha256_execute;
182+
tbl[static_cast<size_t>(PrecompileId::ripemd160)].execute = silkpre_ripemd160_execute;
183+
tbl[static_cast<size_t>(PrecompileId::expmod)].execute = silkpre_expmod_execute;
184+
tbl[static_cast<size_t>(PrecompileId::ecadd)].execute = silkpre_ecadd_execute;
185+
tbl[static_cast<size_t>(PrecompileId::ecmul)].execute = silkpre_ecmul_execute;
186+
tbl[static_cast<size_t>(PrecompileId::ecpairing)].execute = silkpre_ecpairing_execute;
187+
tbl[static_cast<size_t>(PrecompileId::blake2bf)].execute = silkpre_blake2bf_execute;
188+
#endif
175189
return tbl;
176190
}();
177191
} // namespace

test/state/precompiles_silkpre.cpp

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// evmone: Fast Ethereum Virtual Machine implementation
2+
// Copyright 2022 The evmone Authors.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
#include "precompiles_silkpre.hpp"
6+
#include <silkpre/precompile.h>
7+
#include <cassert>
8+
#include <cstring>
9+
10+
namespace evmone::state
11+
{
12+
namespace
13+
{
14+
ExecutionResult execute(const uint8_t* input, size_t input_size, uint8_t* output_buf,
15+
[[maybe_unused]] size_t max_output_size, PrecompileId id) noexcept
16+
{
17+
const auto index = static_cast<size_t>(id) - 1;
18+
const auto [output, output_size] = kSilkpreContracts[index].run(input, input_size);
19+
if (output == nullptr)
20+
return {EVMC_PRECOMPILE_FAILURE, 0};
21+
assert(output_size <= max_output_size);
22+
std::memcpy(output_buf, output, output_size);
23+
std::free(output);
24+
return {EVMC_SUCCESS, output_size};
25+
}
26+
} // namespace
27+
28+
ExecutionResult silkpre_ecrecover_execute(
29+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
30+
{
31+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::ecrecover);
32+
}
33+
34+
ExecutionResult silkpre_sha256_execute(
35+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
36+
{
37+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::sha256);
38+
}
39+
40+
ExecutionResult silkpre_ripemd160_execute(
41+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
42+
{
43+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::ripemd160);
44+
}
45+
46+
ExecutionResult silkpre_expmod_execute(
47+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
48+
{
49+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::expmod);
50+
}
51+
52+
ExecutionResult silkpre_ecadd_execute(
53+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
54+
{
55+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::ecadd);
56+
}
57+
58+
ExecutionResult silkpre_ecmul_execute(
59+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
60+
{
61+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::ecmul);
62+
}
63+
64+
65+
ExecutionResult silkpre_ecpairing_execute(
66+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
67+
{
68+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::ecpairing);
69+
}
70+
71+
ExecutionResult silkpre_blake2bf_execute(
72+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept
73+
{
74+
return execute(input, input_size, output_buf, max_output_size, PrecompileId::blake2bf);
75+
}
76+
} // namespace evmone::state

test/state/precompiles_silkpre.hpp

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// evmone: Fast Ethereum Virtual Machine implementation
2+
// Copyright 2022 The evmone Authors.
3+
// SPDX-License-Identifier: Apache-2.0
4+
#pragma once
5+
6+
#include "precompiles.hpp"
7+
8+
namespace evmone::state
9+
{
10+
ExecutionResult silkpre_ecrecover_execute(
11+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
12+
13+
ExecutionResult silkpre_sha256_execute(
14+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
15+
16+
ExecutionResult silkpre_ripemd160_execute(
17+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
18+
19+
ExecutionResult silkpre_expmod_execute(
20+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
21+
22+
ExecutionResult silkpre_ecadd_execute(
23+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
24+
25+
ExecutionResult silkpre_ecmul_execute(
26+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
27+
28+
ExecutionResult silkpre_ecpairing_execute(
29+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
30+
31+
ExecutionResult silkpre_blake2bf_execute(
32+
const uint8_t* input, size_t input_size, uint8_t* output_buf, size_t max_output_size) noexcept;
33+
} // namespace evmone::state

0 commit comments

Comments
 (0)