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
ad7a3873
Unverified
Commit
ad7a3873
authored
Apr 20, 2023
by
OptimismBot
Committed by
GitHub
Apr 20, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #5506 from ethereum-optimism/aj/fpp-existing-node
op-program: Handle pre-images that already exist
parents
171b59e2
e57c753c
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
43 additions
and
8 deletions
+43
-8
prefetcher.go
op-program/host/prefetcher/prefetcher.go
+13
-8
prefetcher_test.go
op-program/host/prefetcher/prefetcher_test.go
+22
-0
iface.go
op-program/preimage/iface.go
+8
-0
No files found.
op-program/host/prefetcher/prefetcher.go
View file @
ad7a3873
...
@@ -6,18 +6,17 @@ import (
...
@@ -6,18 +6,17 @@ import (
"fmt"
"fmt"
"strings"
"strings"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-node/eth"
"github.com/ethereum-optimism/optimism/op-program/client/l1"
"github.com/ethereum-optimism/optimism/op-program/client/l1"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/l2"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/client/mpt"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/host/kvstore"
"github.com/ethereum-optimism/optimism/op-program/preimage"
"github.com/ethereum-optimism/optimism/op-program/preimage"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
)
)
type
L1Source
interface
{
type
L1Source
interface
{
...
@@ -33,6 +32,7 @@ type L2Source interface {
...
@@ -33,6 +32,7 @@ type L2Source interface {
}
}
type
Prefetcher
struct
{
type
Prefetcher
struct
{
logger
log
.
Logger
l1Fetcher
L1Source
l1Fetcher
L1Source
l2Fetcher
L2Source
l2Fetcher
L2Source
lastHint
string
lastHint
string
...
@@ -41,6 +41,7 @@ type Prefetcher struct {
...
@@ -41,6 +41,7 @@ type Prefetcher struct {
func
NewPrefetcher
(
logger
log
.
Logger
,
l1Fetcher
L1Source
,
l2Fetcher
L2Source
,
kvStore
kvstore
.
KV
)
*
Prefetcher
{
func
NewPrefetcher
(
logger
log
.
Logger
,
l1Fetcher
L1Source
,
l2Fetcher
L2Source
,
kvStore
kvstore
.
KV
)
*
Prefetcher
{
return
&
Prefetcher
{
return
&
Prefetcher
{
logger
:
logger
,
l1Fetcher
:
NewRetryingL1Source
(
logger
,
l1Fetcher
),
l1Fetcher
:
NewRetryingL1Source
(
logger
,
l1Fetcher
),
l2Fetcher
:
NewRetryingL2Source
(
logger
,
l2Fetcher
),
l2Fetcher
:
NewRetryingL2Source
(
logger
,
l2Fetcher
),
kvStore
:
kvStore
,
kvStore
:
kvStore
,
...
@@ -71,6 +72,7 @@ func (p *Prefetcher) prefetch(ctx context.Context, hint string) error {
...
@@ -71,6 +72,7 @@ func (p *Prefetcher) prefetch(ctx context.Context, hint string) error {
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
p
.
logger
.
Debug
(
"Prefetching"
,
"type"
,
hintType
,
"hash"
,
hash
)
switch
hintType
{
switch
hintType
{
case
l1
.
HintL1BlockHeader
:
case
l1
.
HintL1BlockHeader
:
header
,
err
:=
p
.
l1Fetcher
.
InfoByHash
(
ctx
,
hash
)
header
,
err
:=
p
.
l1Fetcher
.
InfoByHash
(
ctx
,
hash
)
...
@@ -143,8 +145,11 @@ func (p *Prefetcher) storeTransactions(txs types.Transactions) error {
...
@@ -143,8 +145,11 @@ func (p *Prefetcher) storeTransactions(txs types.Transactions) error {
func
(
p
*
Prefetcher
)
storeTrieNodes
(
values
[]
hexutil
.
Bytes
)
error
{
func
(
p
*
Prefetcher
)
storeTrieNodes
(
values
[]
hexutil
.
Bytes
)
error
{
_
,
nodes
:=
mpt
.
WriteTrie
(
values
)
_
,
nodes
:=
mpt
.
WriteTrie
(
values
)
for
_
,
node
:=
range
nodes
{
for
_
,
node
:=
range
nodes
{
err
:=
p
.
kvStore
.
Put
(
preimage
.
Keccak256Key
(
crypto
.
Keccak256Hash
(
node
))
.
PreimageKey
(),
node
)
key
:=
preimage
.
Keccak256Key
(
crypto
.
Keccak256Hash
(
node
))
.
PreimageKey
()
if
err
!=
nil
{
if
err
:=
p
.
kvStore
.
Put
(
key
,
node
);
errors
.
Is
(
err
,
kvstore
.
ErrAlreadyExists
)
{
// It's not uncommon for different tries to contain common nodes (esp for receipts)
continue
}
else
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to store node: %w"
,
err
)
return
fmt
.
Errorf
(
"failed to store node: %w"
,
err
)
}
}
}
}
...
...
op-program/host/prefetcher/prefetcher_test.go
View file @
ad7a3873
...
@@ -129,6 +129,28 @@ func TestFetchL1Receipts(t *testing.T) {
...
@@ -129,6 +129,28 @@ func TestFetchL1Receipts(t *testing.T) {
require
.
EqualValues
(
t
,
hash
,
header
.
Hash
())
require
.
EqualValues
(
t
,
hash
,
header
.
Hash
())
assertReceiptsEqual
(
t
,
receipts
,
actualReceipts
)
assertReceiptsEqual
(
t
,
receipts
,
actualReceipts
)
})
})
// Blocks may have identical RLP receipts for different transactions.
// Check that the node already existing is handled
t
.
Run
(
"CommonTrieNodes"
,
func
(
t
*
testing
.
T
)
{
prefetcher
,
l1Cl
,
_
,
kv
:=
createPrefetcher
(
t
)
l1Cl
.
ExpectInfoByHash
(
hash
,
eth
.
BlockToInfo
(
block
),
nil
)
l1Cl
.
ExpectInfoAndTxsByHash
(
hash
,
eth
.
BlockToInfo
(
block
),
block
.
Transactions
(),
nil
)
l1Cl
.
ExpectFetchReceipts
(
hash
,
eth
.
BlockToInfo
(
block
),
receipts
,
nil
)
defer
l1Cl
.
AssertExpectations
(
t
)
// Pre-store one receipt node (but not the whole trie leading to it)
// This would happen if an identical receipt was in an earlier block
opaqueRcpts
,
err
:=
eth
.
EncodeReceipts
(
receipts
)
require
.
NoError
(
t
,
err
)
_
,
nodes
:=
mpt
.
WriteTrie
(
opaqueRcpts
)
require
.
NoError
(
t
,
kv
.
Put
(
preimage
.
Keccak256Key
(
crypto
.
Keccak256Hash
(
nodes
[
0
]))
.
PreimageKey
(),
nodes
[
0
]))
oracle
:=
l1
.
NewPreimageOracle
(
asOracleFn
(
t
,
prefetcher
),
asHinter
(
t
,
prefetcher
))
header
,
actualReceipts
:=
oracle
.
ReceiptsByBlockHash
(
hash
)
require
.
EqualValues
(
t
,
hash
,
header
.
Hash
())
assertReceiptsEqual
(
t
,
receipts
,
actualReceipts
)
})
}
}
func
TestFetchL2Block
(
t
*
testing
.
T
)
{
func
TestFetchL2Block
(
t
*
testing
.
T
)
{
...
...
op-program/preimage/iface.go
View file @
ad7a3873
...
@@ -55,6 +55,14 @@ func (k Keccak256Key) PreimageKey() (out common.Hash) {
...
@@ -55,6 +55,14 @@ func (k Keccak256Key) PreimageKey() (out common.Hash) {
return
return
}
}
func
(
k
Keccak256Key
)
String
()
string
{
return
common
.
Hash
(
k
)
.
String
()
}
func
(
k
Keccak256Key
)
TerminalString
()
string
{
return
common
.
Hash
(
k
)
.
String
()
}
// Hint is an interface to enable any program type to function as a hint,
// Hint is an interface to enable any program type to function as a hint,
// when passed to the Hinter interface, returning a string representation
// when passed to the Hinter interface, returning a string representation
// of what data the host should prepare pre-images for.
// of what data the host should prepare pre-images for.
...
...
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