Skip to content

Commit be36244

Browse files
committed
Implement bignum system library using intx
1 parent 98944df commit be36244

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/eei.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,4 +845,35 @@ void WasmEngine::collectBenchmarkingData()
845845
}
846846
return ret;
847847
}
848+
849+
intx::uint256 EthereumInterface::loadBignum256(uint32_t srcOffset)
850+
{
851+
uint8_t data[32];
852+
loadMemory(srcOffset, data, 32);
853+
// FIXME: change this to little endian?
854+
return intx::be::uint256(data);
855+
}
856+
857+
void EthereumInterface::storeBignum256(intx::uint256 const& src, uint32_t dstOffset)
858+
{
859+
uint8_t data[32];
860+
// FIXME: change this to little endian?
861+
intx::be::store(data, src);
862+
storeMemory(data, dstOffset, 32);
863+
}
864+
865+
void EthereumInterface::mul256(uint32_t aOffset, uint32_t bOffset, uint32_t retOffset)
866+
{
867+
storeBignum256(loadBignum256(aOffset) * loadBignum256(bOffset), retOffset);
868+
}
869+
870+
void EthereumInterface::umulmod256(uint32_t aOffset, uint32_t bOffset, uint32_t modOffset, uint32_t retOffset)
871+
{
872+
using intx::uint512;
873+
auto a = loadBignum256(aOffset);
874+
auto b = loadBignum256(bOffset);
875+
auto mod = loadBignum256(modOffset);
876+
auto ret = mod != 0 ? ((uint512{a} * uint512{b}) % uint512{mod}).lo : 0;
877+
storeBignum256(ret, retOffset);
878+
}
848879
}

src/eei.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include <evmc/evmc.h>
2424
#include <evmc/evmc.hpp>
2525

26+
#include <intx/intx.hpp>
27+
2628
#include "exceptions.h"
2729
#include "helpers.h"
2830

@@ -163,6 +165,10 @@ class EthereumInterface {
163165
uint32_t eeiCreate(uint32_t valueOffset, uint32_t dataOffset, uint32_t length, uint32_t resultOffset);
164166
void eeiSelfDestruct(uint32_t addressOffset);
165167

168+
// Bignum system library
169+
void mul256(uint32_t aOffset, uint32_t bOffset, uint32_t retOffset);
170+
void umulmod256(uint32_t aOffset, uint32_t bOffset, uint32_t modOffset, uint32_t retOffset);
171+
166172
private:
167173
void eeiRevertOrFinish(bool revert, uint32_t offset, uint32_t size);
168174

@@ -191,6 +197,9 @@ class EthereumInterface {
191197
evmc_uint256be loadUint128(uint32_t srcOffset);
192198
void storeUint128(evmc_uint256be const& src, uint32_t dstOffset);
193199

200+
intx::uint256 loadBignum256(uint32_t srcOffset);
201+
void storeBignum256(intx::uint256 const& src, uint32_t dstOffset);
202+
194203
inline int64_t maxCallGas(int64_t gas) { return gas - (gas / 64); }
195204

196205
/* Checks for overflow and safely charges gas for variable length data copies */

0 commit comments

Comments
 (0)