Skip to content
This repository has been archived by the owner on Nov 6, 2022. It is now read-only.

Commit

Permalink
Merge pull request #216 from OffchainLabs/decompression-for-testnet-r…
Browse files Browse the repository at this point in the history
…elease

Decompression for testnet release
  • Loading branch information
hkalodner authored Oct 12, 2020
2 parents 370116f + 9cd9d8a commit a16b184
Show file tree
Hide file tree
Showing 29 changed files with 1,020 additions and 141 deletions.
17 changes: 7 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ evmdebug: all
benchmarks: arbos
$(CARGORUN) makebenchmarks

TESTEXES = $(BUILTINDIR)/kvstest.mexe $(STDDIR)/queuetest.mexe $(BUILTINDIR)/arraytest.mexe $(BUILTINDIR)/globaltest.mexe $(STDDIR)/priorityqtest.mexe $(STDDIR)/bytearraytest.mexe $(STDDIR)/keccaktest.mexe $(STDDIR)/sha256test.mexe $(STDDIR)/rlptest.mexe $(STDDIR)/storageMapTest.mexe $(BUILTINDIR)/maptest.mexe minitests/codeloadtest.mexe $(STDDIR)/blstest.mexe
TESTEXES = $(BUILTINDIR)/kvstest.mexe $(STDDIR)/queuetest.mexe $(BUILTINDIR)/arraytest.mexe $(BUILTINDIR)/globaltest.mexe $(STDDIR)/priorityqtest.mexe $(STDDIR)/bytearraytest.mexe $(STDDIR)/keccaktest.mexe $(STDDIR)/sha256test.mexe $(STDDIR)/rlptest.mexe $(STDDIR)/storageMapTest.mexe $(BUILTINDIR)/maptest.mexe minitests/codeloadtest.mexe
BUILTINMAOS = $(BUILTINDIR)/array.mao $(BUILTINDIR)/kvs.mao
STDLIBMAOS = $(STDDIR)/bytearray.mao $(STDDIR)/priorityq.mao $(STDDIR)/random.mao $(STDDIR)/queue.mao $(STDDIR)/keccak.mao $(STDDIR)/sha256.mao $(STDDIR)/bytestream.mao $(STDDIR)/stack.mao $(STDDIR)/rlp.mao $(STDDIR)/storageMap.mao $(STDDIR)/expandingIntArray.mao $(STDDIR)/bls.mao
STDLIBMAOS = $(STDDIR)/bytearray.mao $(STDDIR)/priorityq.mao $(STDDIR)/random.mao $(STDDIR)/queue.mao $(STDDIR)/keccak.mao $(STDDIR)/sha256.mao $(STDDIR)/bytestream.mao $(STDDIR)/stack.mao $(STDDIR)/rlp.mao $(STDDIR)/storageMap.mao $(STDDIR)/expandingIntArray.mao
STDLIB = $(STDLIBMAOS)

all: $(TESTEXES) arbos
Expand All @@ -45,9 +45,6 @@ $(STDDIR)/storageMapTest.mexe: $(BUILTINMAOS) $(STDDIR)/storageMapTest.mini $(ST
$(STDDIR)/bytearraytest.mexe: $(BUILTINMAOS) $(STDDIR)/bytearraytest.mini $(STDLIB)
$(CARGORUN) compile $(STDDIR)/bytearraytest.mini $(STDLIB) -o $(STDDIR)/bytearraytest.mexe

$(STDDIR)/blstest.mexe: $(BUILTINMAOS) $(STDDIR)/blstest.mini $(STDLIB)
$(CARGORUN) compile $(STDDIR)/blstest.mini $(STDLIB) -o $(STDDIR)/blstest.mexe

minitests/codeloadtest.mexe: minitests/codeloadtest.mini
$(CARGORUN) compile minitests/codeloadtest.mini -o minitests/codeloadtest.mexe

Expand Down Expand Up @@ -93,9 +90,6 @@ $(STDDIR)/storageMap.mao: $(STDDIR)/storageMap.mini
$(STDDIR)/expandingIntArray.mao: $(STDDIR)/expandingIntArray.mini
$(CARGORUN) compile $(STDDIR)/expandingIntArray.mini -c -o $(STDDIR)/expandingIntArray.mao

$(STDDIR)/bls.mao: $(STDDIR)/bls.mini
$(CARGORUN) compile $(STDDIR)/bls.mini -c -o $(STDDIR)/bls.mao

$(BUILTINDIR)/maptest.mexe: $(BUILTINMAOS) $(BUILTINDIR)/maptest.mini
$(CARGORUN) compile $(BUILTINDIR)/maptest.mini -o $(BUILTINDIR)/maptest.mexe

Expand All @@ -106,7 +100,7 @@ $(BUILTINDIR)/kvs.mao: $(BUILTINDIR)/kvs.mini
$(CARGORUN) compile $(BUILTINDIR)/kvs.mini -c -o $(BUILTINDIR)/kvs.mao

ARBOSDIR = arb_os
ARBOSAOS = $(ARBOSDIR)/main.mao $(ARBOSDIR)/accounts.mao $(ARBOSDIR)/messages.mao $(ARBOSDIR)/inbox.mao $(ARBOSDIR)/evmCallStack.mao $(ARBOSDIR)/evmOps.mao $(ARBOSDIR)/codeSegment.mao $(ARBOSDIR)/evmlogs.mao $(ARBOSDIR)/errorHandler.mao $(ARBOSDIR)/gasAccounting.mao $(ARBOSDIR)/contractTemplates.mao $(ARBOSDIR)/tokens.mao $(ARBOSDIR)/arbsys.mao $(ARBOSDIR)/messageBatch.mao $(ARBOSDIR)/chainParameters.mao $(ARBOSDIR)/precompiles.mao $(ARBOSDIR)/signedTx.mao $(ARBOSDIR)/output.mao
ARBOSAOS = $(ARBOSDIR)/main.mao $(ARBOSDIR)/accounts.mao $(ARBOSDIR)/messages.mao $(ARBOSDIR)/inbox.mao $(ARBOSDIR)/evmCallStack.mao $(ARBOSDIR)/evmOps.mao $(ARBOSDIR)/codeSegment.mao $(ARBOSDIR)/evmlogs.mao $(ARBOSDIR)/errorHandler.mao $(ARBOSDIR)/gasAccounting.mao $(ARBOSDIR)/contractTemplates.mao $(ARBOSDIR)/tokens.mao $(ARBOSDIR)/arbsys.mao $(ARBOSDIR)/messageBatch.mao $(ARBOSDIR)/chainParameters.mao $(ARBOSDIR)/precompiles.mao $(ARBOSDIR)/signedTx.mao $(ARBOSDIR)/output.mao $(ARBOSDIR)/decompression.mao
ARBOS = $(ARBOSDIR)/arbos.mexe

arbos: $(ARBOS)
Expand Down Expand Up @@ -168,6 +162,9 @@ $(ARBOSDIR)/signedTx.mao: $(ARBOSDIR)/signedTx.mini
$(ARBOSDIR)/output.mao: $(ARBOSDIR)/output.mini
$(CARGORUN) compile $(ARBOSDIR)/output.mini -c -o $(ARBOSDIR)/output.mao

$(ARBOSDIR)/decompression.mao: $(ARBOSDIR)/decompression.mini
$(CARGORUN) compile $(ARBOSDIR)/decompression.mini -c -o $(ARBOSDIR)/decompression.mao

$(ARBOS): $(ARBOSAOS) $(STDLIB) $(BUILTINMAOS)
$(CARGORUN) compile $(ARBOSAOS) $(STDLIB) -o $(ARBOS)

Expand All @@ -181,4 +178,4 @@ compiler:
cargo build

clean:
rm -f $(BUILTINMAOS) $(TESTEXES) $(STDLIBMAOS) $(ARBOSAOS) $(ARBOSDIR)/*.mexe $(ARBOSDIR)/contractTemplates.mini
rm -f $(BUILTINMAOS) $(TESTEXES) $(STDLIBMAOS) $(ARBOSAOS) $(ARBOSDIR)/*.mexe minitests/*.mao $(ARBOSDIR)/contractTemplates.mini
130 changes: 130 additions & 0 deletions arb_os/arbsys.mini
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
//

import type EvmCallFrame;
import type AccountStore;
import type Account;
import type ByteArray;
import type ByteStream;
import type MarshalledBytes;

import impure func evmCallStack_topFrame() -> option<EvmCallFrame>;
Expand All @@ -25,23 +27,41 @@ import func evmCallFrame_getCaller(frame: EvmCallFrame) -> address;
import impure func evmOp_return(memOffset: uint, memNbytes: uint);
import impure func evmOp_revert(memOffset: uint, memNbytes: uint);

import impure func getGlobalAccountStore() -> AccountStore;
import impure func setGlobalAccountStore(acctStore: AccountStore);
import func accountStore_get(acctStore: AccountStore, addr: address) -> Account;
import func accountStore_set(acctStore: AccountStore, addr: address, acct: Account) -> AccountStore;
import func account_getAddress(acct: Account) -> address;
import func account_getNextSeqNum(account: Account) -> uint;
import func account_getStorageCell(account: Account, cell: uint) -> option<uint>;
import func account_deductFromEthBalance(acct: Account, amount: uint) -> option<Account>;

import func bytearray_new(unused: uint) -> ByteArray;
import func bytearray_size(ba: ByteArray) -> uint;
import func bytearray_getByte(ba: ByteArray, offset: uint) -> uint;
import func bytearray_get256(ba: ByteArray, offset: uint) -> uint;
import func bytearray_set256(ba: ByteArray, offset: uint, value: uint) -> ByteArray;
import func bytearray_extract(ba: ByteArray, offset: uint, nbytes: uint) -> ByteArray;
import func bytearray_marshalFull(ba: ByteArray) -> MarshalledBytes;

import func bytestream_new(ba: ByteArray) -> ByteStream;

import impure func inbox_currentBlockNumber() -> uint;
import impure func inbox_currentTimestamp() -> uint;

import impure func queueMessageForSend(msgType: uint, sender: address, data: ByteArray);

import type IndexedAddressTable;
import impure func getGlobalAddressTable() -> IndexedAddressTable;
import impure func setGlobalAddressTable(gat: IndexedAddressTable);
import func addressTable_getByAddressAlloc(iat: IndexedAddressTable, addr: address) -> (IndexedAddressTable, uint);
import func addressTable_getByAddress(iat: IndexedAddressTable, addr: address) -> option<uint>;
import func addressTable_getByIndex(iat: IndexedAddressTable, index: uint) -> address; // returns zero if not in table
import impure func decompressAddress(stream: ByteStream) -> option<(ByteStream, address)>;

import func rlp_encodeUint(val: uint, ba: ByteArray, offset: uint) -> (ByteArray, uint);
import func rlp_encodeAddress(addr: address, ba: ByteArray, offset: uint) -> (ByteArray, uint);


public impure func arbsys_txcall() {
if let Some(topFrame) = evmCallStack_topFrame() {
Expand All @@ -60,6 +80,14 @@ public impure func arbsys_txcall() {
arbsys_getTransactionCount(topFrame, calldata);
} elseif(funcCode == 0xa169625f) {
arbsys_getStorageAt(topFrame, calldata);
} elseif(funcCode == 0x3b199c19) {
arbsys_addressTable_lookupAddress(topFrame, calldata);
} elseif(funcCode == 0x4c352200) {
arbsys_addressTable_lookupIndex(topFrame, calldata);
} elseif(funcCode == 0x9bebbd33) {
arbsys_addressTable_decompress(topFrame, calldata);
} elseif(funcCode == 0x2a890b98) {
arbsys_addressTable_compress(topFrame, calldata);
} else {
// unrecognized function code
evmOp_revert(0, 0);
Expand Down Expand Up @@ -169,3 +197,105 @@ impure func arbsys_getStorageAt(topFrame: EvmCallFrame, calldata: ByteArray) {
evmOp_revert(0, 0);
}
}

impure func arbsys_addressTable_lookupAddress(topFrame: EvmCallFrame, calldata: ByteArray) { //(address, bool) -> uint
// if bool is true, and address not already in table, this allocates space in the table
// if bool is false, and address not already in table, this just returns MAXUINT
if (bytearray_size(calldata) != 68) {
evmOp_revert(0, 0);
}
let addr = address(bytearray_get256(calldata, 4));
let flag = (bytearray_get256(calldata, 4+32) != 0);
let addrTable = getGlobalAddressTable();
let index = 0;
if (flag) {
let (atab, idx) = addressTable_getByAddressAlloc(addrTable, addr);
setGlobalAddressTable(atab);
index = idx;
} else {
if let Some(idx) = addressTable_getByAddress(addrTable, addr) {
index = idx;
} else {
index = ~0;
}
}

let success = evmCallStack_setTopFrameMemory(bytearray_set256(evmCallStack_getTopFrameMemoryOrDie(), 0, index));
if (success) {
evmOp_return(0, 32);
} else {
evmOp_revert(0, 0);
}
}

impure func arbsys_addressTable_lookupIndex(topFrame: EvmCallFrame, calldata: ByteArray) { // (uint) -> address
if (bytearray_size(calldata) != 36) {
evmOp_revert(0, 0);
}
let index = bytearray_get256(calldata, 4);
let addrTable = getGlobalAddressTable();
let addr = addressTable_getByIndex(addrTable, index);

let success = evmCallStack_setTopFrameMemory(bytearray_set256(evmCallStack_getTopFrameMemoryOrDie(), 0, uint(addr)));
if (success) {
evmOp_return(0, 32);
} else {
evmOp_revert(0, 0);
}
}

impure func arbsys_addressTable_decompress(topFrame: EvmCallFrame, calldata: ByteArray) { // (bytes) -> (address, bool)
if (bytearray_size(calldata) < 68) {
evmOp_revert(0, 0);
}
let bytesLen = bytearray_get256(calldata, 36);
if let Some(res) = decompressAddress(bytestream_new(bytearray_extract(calldata, 68, bytesLen))) {
let (_, addr) = res;
let success = evmCallStack_setTopFrameMemory(bytearray_set256(evmCallStack_getTopFrameMemoryOrDie(), 0, uint(addr)));
if (success) {
evmOp_return(0, 32);
} else {
evmOp_revert(0, 0);
}
} else {
// input was too short
evmOp_revert(0, 0);
}
}

impure func arbsys_addressTable_compress(topFrame: EvmCallFrame, calldata: ByteArray) { // (address) -> bytes
if (bytearray_size(calldata) != 36) {
evmOp_revert(0, 0);
}
let addr = address(bytearray_get256(calldata, 4));
let compressedData = bytearray_new(0);
let compressedDataLen = 0;
if let Some(index) = addressTable_getByAddress(getGlobalAddressTable(), addr) {
let (ba, sz) = rlp_encodeUint(index, compressedData, 0);
compressedData = ba;
compressedDataLen = sz;
} else {
let (ba, sz) = rlp_encodeAddress(addr, compressedData, 0);
compressedData = ba;
compressedDataLen = sz;
}
let mem = bytearray_set256(
bytearray_set256(
bytearray_set256(
evmCallStack_getTopFrameMemoryOrDie(),
0,
64
),
32,
compressedDataLen
),
64,
bytearray_get256(compressedData, 0)
);

if (evmCallStack_setTopFrameMemory(mem)) {
evmOp_return(0, 96);
} else {
evmOp_revert(0, 0);
}
}
Loading

0 comments on commit a16b184

Please sign in to comment.