Skip to content

Commit

Permalink
Merge branch 'evm-equivalence-yul-new' into vv-optimize-gas-manager-new
Browse files Browse the repository at this point in the history
  • Loading branch information
0xVolosnikov committed Sep 11, 2024
2 parents eed9402 + 361d19a commit 36a98c0
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 30 deletions.
4 changes: 2 additions & 2 deletions system-contracts/SystemContractsHashes.json
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@
"contractName": "EvmInterpreter",
"bytecodePath": "contracts-preprocessed/artifacts/EvmInterpreter.yul.zbin",
"sourceCodePath": "contracts-preprocessed/EvmInterpreter.yul",
"bytecodeHash": "0x01000ccb740e2345754450eda583f59b31a346920a22f968dfcfc63feae303ee",
"sourceCodeHash": "0xfc91734d4d37538b19c94be0da51364edd4f6664f0fee383cc2e3b5eeb95336a"
"bytecodeHash": "0x01000cef160515b2631803991c1d49b6b44492406197fb6dc22a8cf05cebd5d5",
"sourceCodeHash": "0x6c1e3d4c2f94342792df4fc671a0929fbb2d5aba1b5e388c70f4dc1ee96cfa74"
},
{
"contractName": "CodeOracle",
Expand Down
52 changes: 34 additions & 18 deletions system-contracts/contracts/EvmInterpreter.yul
Original file line number Diff line number Diff line change
Expand Up @@ -346,16 +346,22 @@ object "EVMInterpreter" {
function _fetchDeployedCodeLen(addr) -> codeLen {
let codeHash := _getRawCodeHash(addr)

switch shr(248, codeHash)
mstore(0, codeHash)

let success := staticcall(gas(), CODE_ORACLE_SYSTEM_CONTRACT(), 0, 32, 0, 0)

switch iszero(success)
case 1 {
// EraVM
let codeLengthInWords := and(shr(224, codeHash), 0xffff)
codeLen := shl(5, codeLengthInWords) // codeLengthInWords * 32
// The code oracle call can only fail in the case where the contract
// we are querying is the current one executing and it has not yet been
// deployed, i.e., if someone calls codesize (or extcodesize(address()))
// inside the constructor. In that case, code length is zero.
codeLen := 0
}
case 2 {
// EVM
let codeLengthInBytes := and(shr(224, codeHash), 0xffff)
codeLen := codeLengthInBytes
default {
// The first word is the true length of the bytecode
returndatacopy(0, 0, 32)
codeLen := mload(0)
}
}

Expand Down Expand Up @@ -2040,7 +2046,9 @@ object "EVMInterpreter" {
evmGasLeft := chargeGas(evmGasLeft, 2500)
}

sp := pushStackItemWithoutCheck(sp, _fetchDeployedCodeLen(addr))
switch _isEVM(addr)
case 0 { sp := pushStackItemWithoutCheck(sp, extcodesize(addr)) }
default { sp := pushStackItemWithoutCheck(sp, _fetchDeployedCodeLen(addr)) }
ip := add(ip, 1)
}
case 0x3C { // OP_EXTCODECOPY
Expand Down Expand Up @@ -3320,16 +3328,22 @@ object "EVMInterpreter" {
function _fetchDeployedCodeLen(addr) -> codeLen {
let codeHash := _getRawCodeHash(addr)

switch shr(248, codeHash)
mstore(0, codeHash)

let success := staticcall(gas(), CODE_ORACLE_SYSTEM_CONTRACT(), 0, 32, 0, 0)

switch iszero(success)
case 1 {
// EraVM
let codeLengthInWords := and(shr(224, codeHash), 0xffff)
codeLen := shl(5, codeLengthInWords) // codeLengthInWords * 32
// The code oracle call can only fail in the case where the contract
// we are querying is the current one executing and it has not yet been
// deployed, i.e., if someone calls codesize (or extcodesize(address()))
// inside the constructor. In that case, code length is zero.
codeLen := 0
}
case 2 {
// EVM
let codeLengthInBytes := and(shr(224, codeHash), 0xffff)
codeLen := codeLengthInBytes
default {
// The first word is the true length of the bytecode
returndatacopy(0, 0, 32)
codeLen := mload(0)
}
}

Expand Down Expand Up @@ -5014,7 +5028,9 @@ object "EVMInterpreter" {
evmGasLeft := chargeGas(evmGasLeft, 2500)
}

sp := pushStackItemWithoutCheck(sp, _fetchDeployedCodeLen(addr))
switch _isEVM(addr)
case 0 { sp := pushStackItemWithoutCheck(sp, extcodesize(addr)) }
default { sp := pushStackItemWithoutCheck(sp, _fetchDeployedCodeLen(addr)) }
ip := add(ip, 1)
}
case 0x3C { // OP_EXTCODECOPY
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,16 +264,22 @@ function _fetchDeployedCodeWithDest(addr, _offset, _len, dest) -> codeLen {
function _fetchDeployedCodeLen(addr) -> codeLen {
let codeHash := _getRawCodeHash(addr)

switch shr(248, codeHash)
mstore(0, codeHash)

let success := staticcall(gas(), CODE_ORACLE_SYSTEM_CONTRACT(), 0, 32, 0, 0)

switch iszero(success)
case 1 {
// EraVM
let codeLengthInWords := and(shr(224, codeHash), 0xffff)
codeLen := shl(5, codeLengthInWords) // codeLengthInWords * 32
}
case 2 {
// EVM
let codeLengthInBytes := and(shr(224, codeHash), 0xffff)
codeLen := codeLengthInBytes
// The code oracle call can only fail in the case where the contract
// we are querying is the current one executing and it has not yet been
// deployed, i.e., if someone calls codesize (or extcodesize(address()))
// inside the constructor. In that case, code length is zero.
codeLen := 0
}
default {
// The first word is the true length of the bytecode
returndatacopy(0, 0, 32)
codeLen := mload(0)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,9 @@ for { } true { } {
evmGasLeft := chargeGas(evmGasLeft, 2500)
}

sp := pushStackItemWithoutCheck(sp, _fetchDeployedCodeLen(addr))
switch _isEVM(addr)
case 0 { sp := pushStackItemWithoutCheck(sp, extcodesize(addr)) }
default { sp := pushStackItemWithoutCheck(sp, _fetchDeployedCodeLen(addr)) }
ip := add(ip, 1)
}
case 0x3C { // OP_EXTCODECOPY
Expand Down

0 comments on commit 36a98c0

Please sign in to comment.