Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
01ea8d95
Commit
01ea8d95
authored
Jan 19, 2022
by
Mark Tyneway
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
l2geth: eip2929 test
parent
b819c3f9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
115 additions
and
0 deletions
+115
-0
runtime_test.go
l2geth/core/vm/runtime/runtime_test.go
+115
-0
No files found.
l2geth/core/vm/runtime/runtime_test.go
View file @
01ea8d95
...
@@ -17,12 +17,15 @@
...
@@ -17,12 +17,15 @@
package
runtime
package
runtime
import
(
import
(
"fmt"
"math/big"
"math/big"
"os"
"strings"
"strings"
"testing"
"testing"
"github.com/ethereum-optimism/optimism/l2geth/accounts/abi"
"github.com/ethereum-optimism/optimism/l2geth/accounts/abi"
"github.com/ethereum-optimism/optimism/l2geth/common"
"github.com/ethereum-optimism/optimism/l2geth/common"
"github.com/ethereum-optimism/optimism/l2geth/core/asm"
"github.com/ethereum-optimism/optimism/l2geth/core/rawdb"
"github.com/ethereum-optimism/optimism/l2geth/core/rawdb"
"github.com/ethereum-optimism/optimism/l2geth/core/state"
"github.com/ethereum-optimism/optimism/l2geth/core/state"
"github.com/ethereum-optimism/optimism/l2geth/core/vm"
"github.com/ethereum-optimism/optimism/l2geth/core/vm"
...
@@ -203,3 +206,115 @@ func BenchmarkEVM_CREATE2_1200(bench *testing.B) {
...
@@ -203,3 +206,115 @@ func BenchmarkEVM_CREATE2_1200(bench *testing.B) {
// initcode size 1200K, repeatedly calls CREATE2 and then modifies the mem contents
// initcode size 1200K, repeatedly calls CREATE2 and then modifies the mem contents
benchmarkEVM_Create
(
bench
,
"5b5862124f80600080f5600152600056"
)
benchmarkEVM_Create
(
bench
,
"5b5862124f80600080f5600152600056"
)
}
}
// TestEip2929Cases contains various testcases that are used for
// EIP-2929 about gas repricings
func
TestEip2929Cases
(
t
*
testing
.
T
)
{
id
:=
1
prettyPrint
:=
func
(
comment
string
,
code
[]
byte
)
{
instrs
:=
make
([]
string
,
0
)
it
:=
asm
.
NewInstructionIterator
(
code
)
for
it
.
Next
()
{
if
it
.
Arg
()
!=
nil
&&
0
<
len
(
it
.
Arg
())
{
instrs
=
append
(
instrs
,
fmt
.
Sprintf
(
"%v 0x%x"
,
it
.
Op
(),
it
.
Arg
()))
}
else
{
instrs
=
append
(
instrs
,
fmt
.
Sprintf
(
"%v"
,
it
.
Op
()))
}
}
ops
:=
strings
.
Join
(
instrs
,
", "
)
fmt
.
Printf
(
"### Case %d
\n\n
"
,
id
)
id
++
fmt
.
Printf
(
"%v
\n\n
Bytecode:
\n
```
\n
0x%x
\n
```
\n
Operations:
\n
```
\n
%v
\n
```
\n\n
"
,
comment
,
code
,
ops
)
Execute
(
code
,
nil
,
&
Config
{
EVMConfig
:
vm
.
Config
{
Debug
:
true
,
Tracer
:
vm
.
NewMarkdownLogger
(
nil
,
os
.
Stdout
),
ExtraEips
:
[]
int
{
2929
},
},
})
}
{
// First eip testcase
code
:=
[]
byte
{
// Three checks against a precompile
byte
(
vm
.
PUSH1
),
1
,
byte
(
vm
.
EXTCODEHASH
),
byte
(
vm
.
POP
),
byte
(
vm
.
PUSH1
),
2
,
byte
(
vm
.
EXTCODESIZE
),
byte
(
vm
.
POP
),
byte
(
vm
.
PUSH1
),
3
,
byte
(
vm
.
BALANCE
),
byte
(
vm
.
POP
),
// Three checks against a non-precompile
byte
(
vm
.
PUSH1
),
0xf1
,
byte
(
vm
.
EXTCODEHASH
),
byte
(
vm
.
POP
),
byte
(
vm
.
PUSH1
),
0xf2
,
byte
(
vm
.
EXTCODESIZE
),
byte
(
vm
.
POP
),
byte
(
vm
.
PUSH1
),
0xf3
,
byte
(
vm
.
BALANCE
),
byte
(
vm
.
POP
),
// Same three checks (should be cheaper)
byte
(
vm
.
PUSH1
),
0xf2
,
byte
(
vm
.
EXTCODEHASH
),
byte
(
vm
.
POP
),
byte
(
vm
.
PUSH1
),
0xf3
,
byte
(
vm
.
EXTCODESIZE
),
byte
(
vm
.
POP
),
byte
(
vm
.
PUSH1
),
0xf1
,
byte
(
vm
.
BALANCE
),
byte
(
vm
.
POP
),
// Check the origin, and the 'this'
byte
(
vm
.
ORIGIN
),
byte
(
vm
.
BALANCE
),
byte
(
vm
.
POP
),
byte
(
vm
.
ADDRESS
),
byte
(
vm
.
BALANCE
),
byte
(
vm
.
POP
),
byte
(
vm
.
STOP
),
}
prettyPrint
(
"This checks `EXT`(codehash,codesize,balance) of precompiles, which should be `100`, "
+
"and later checks the same operations twice against some non-precompiles. "
+
"Those are cheaper second time they are accessed. Lastly, it checks the `BALANCE` of `origin` and `this`."
,
code
)
}
{
// EXTCODECOPY
code
:=
[]
byte
{
// extcodecopy( 0xff,0,0,0,0)
byte
(
vm
.
PUSH1
),
0x00
,
byte
(
vm
.
PUSH1
),
0x00
,
byte
(
vm
.
PUSH1
),
0x00
,
//length, codeoffset, memoffset
byte
(
vm
.
PUSH1
),
0xff
,
byte
(
vm
.
EXTCODECOPY
),
// extcodecopy( 0xff,0,0,0,0)
byte
(
vm
.
PUSH1
),
0x00
,
byte
(
vm
.
PUSH1
),
0x00
,
byte
(
vm
.
PUSH1
),
0x00
,
//length, codeoffset, memoffset
byte
(
vm
.
PUSH1
),
0xff
,
byte
(
vm
.
EXTCODECOPY
),
// extcodecopy( this,0,0,0,0)
byte
(
vm
.
PUSH1
),
0x00
,
byte
(
vm
.
PUSH1
),
0x00
,
byte
(
vm
.
PUSH1
),
0x00
,
//length, codeoffset, memoffset
byte
(
vm
.
ADDRESS
),
byte
(
vm
.
EXTCODECOPY
),
byte
(
vm
.
STOP
),
}
prettyPrint
(
"This checks `extcodecopy( 0xff,0,0,0,0)` twice, (should be expensive first time), "
+
"and then does `extcodecopy( this,0,0,0,0)`."
,
code
)
}
{
// SLOAD + SSTORE
code
:=
[]
byte
{
// Add slot `0x1` to access list
byte
(
vm
.
PUSH1
),
0x01
,
byte
(
vm
.
SLOAD
),
byte
(
vm
.
POP
),
// SLOAD( 0x1) (add to access list)
// Write to `0x1` which is already in access list
byte
(
vm
.
PUSH1
),
0x11
,
byte
(
vm
.
PUSH1
),
0x01
,
byte
(
vm
.
SSTORE
),
// SSTORE( loc: 0x01, val: 0x11)
// Write to `0x2` which is not in access list
byte
(
vm
.
PUSH1
),
0x11
,
byte
(
vm
.
PUSH1
),
0x02
,
byte
(
vm
.
SSTORE
),
// SSTORE( loc: 0x02, val: 0x11)
// Write again to `0x2`
byte
(
vm
.
PUSH1
),
0x11
,
byte
(
vm
.
PUSH1
),
0x02
,
byte
(
vm
.
SSTORE
),
// SSTORE( loc: 0x02, val: 0x11)
// Read slot in access list (0x2)
byte
(
vm
.
PUSH1
),
0x02
,
byte
(
vm
.
SLOAD
),
// SLOAD( 0x2)
// Read slot in access list (0x1)
byte
(
vm
.
PUSH1
),
0x01
,
byte
(
vm
.
SLOAD
),
// SLOAD( 0x1)
}
prettyPrint
(
"This checks `sload( 0x1)` followed by `sstore(loc: 0x01, val:0x11)`, then 'naked' sstore:"
+
"`sstore(loc: 0x02, val:0x11)` twice, and `sload(0x2)`, `sload(0x1)`. "
,
code
)
}
{
// Call variants
code
:=
[]
byte
{
// identity precompile
byte
(
vm
.
PUSH1
),
0x0
,
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
PUSH1
),
0x04
,
byte
(
vm
.
PUSH1
),
0x0
,
byte
(
vm
.
CALL
),
byte
(
vm
.
POP
),
// random account - call 1
byte
(
vm
.
PUSH1
),
0x0
,
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
PUSH1
),
0xff
,
byte
(
vm
.
PUSH1
),
0x0
,
byte
(
vm
.
CALL
),
byte
(
vm
.
POP
),
// random account - call 2
byte
(
vm
.
PUSH1
),
0x0
,
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
DUP1
),
byte
(
vm
.
PUSH1
),
0xff
,
byte
(
vm
.
PUSH1
),
0x0
,
byte
(
vm
.
STATICCALL
),
byte
(
vm
.
POP
),
}
prettyPrint
(
"This calls the `identity`-precompile (cheap), then calls an account (expensive) and `staticcall`s the same"
+
"account (cheap)"
,
code
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment