Skip to content

Commit

Permalink
Implement bignum system library using intx
Browse files Browse the repository at this point in the history
  • Loading branch information
axic committed Apr 26, 2019
1 parent f4e9579 commit 035de45
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/eei.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -849,4 +849,35 @@ void WasmEngine::collectBenchmarkingData()
}
return ret;
}

intx::uint256 EthereumInterface::loadBignum256(uint32_t srcOffset)
{
uint8_t data[32];
loadMemory(srcOffset, data, 32);
// FIXME: change this to little endian?
return intx::be::uint256(data);
}

void EthereumInterface::storeBignum256(intx::uint256 const& src, uint32_t dstOffset)
{
uint8_t data[32];
// FIXME: change this to little endian?
intx::be::store(data, src);
storeMemory(data, dstOffset, 32);
}

void EthereumInterface::mul256(uint32_t aOffset, uint32_t bOffset, uint32_t retOffset)
{
storeBignum256(loadBignum256(aOffset) * loadBignum256(bOffset), retOffset);
}

void EthereumInterface::umulmod256(uint32_t aOffset, uint32_t bOffset, uint32_t modOffset, uint32_t retOffset)
{
using intx::uint512;
auto a = loadBignum256(aOffset);
auto b = loadBignum256(bOffset);
auto mod = loadBignum256(modOffset);
auto ret = mod != 0 ? ((uint512{a} * uint512{b}) % uint512{mod}).lo : 0;
storeBignum256(ret, retOffset);
}
}
9 changes: 9 additions & 0 deletions src/eei.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include <evmc/evmc.h>
#include <evmc/evmc.hpp>

#include <intx/intx.hpp>

#include "exceptions.h"

namespace hera {
Expand Down Expand Up @@ -160,6 +162,10 @@ class EthereumInterface {
uint32_t eeiCreate(uint32_t valueOffset, uint32_t dataOffset, uint32_t length, uint32_t resultOffset);
void eeiSelfDestruct(uint32_t addressOffset);

// Bignum system library
void mul256(uint32_t aOffset, uint32_t bOffset, uint32_t retOffset);
void umulmod256(uint32_t aOffset, uint32_t bOffset, uint32_t modOffset, uint32_t retOffset);

private:
void eeiRevertOrFinish(bool revert, uint32_t offset, uint32_t size);

Expand Down Expand Up @@ -188,6 +194,9 @@ class EthereumInterface {
evmc_uint256be loadUint128(uint32_t srcOffset);
void storeUint128(evmc_uint256be const& src, uint32_t dstOffset);

intx::uint256 loadBignum256(uint32_t srcOffset);
void storeBignum256(intx::uint256 const& src, uint32_t dstOffset);

inline int64_t maxCallGas(int64_t gas) { return gas - (gas / 64); }

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

0 comments on commit 035de45

Please sign in to comment.