Skip to content

Commit 7cd9571

Browse files
committed
Implement bignum system library using intx
1 parent f585c6e commit 7cd9571

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

@@ -162,6 +164,10 @@ class EthereumInterface {
162164
uint32_t eeiCreate(uint32_t valueOffset, uint32_t dataOffset, uint32_t length, uint32_t resultOffset);
163165
void eeiSelfDestruct(uint32_t addressOffset);
164166

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

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

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

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

0 commit comments

Comments
 (0)