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
ffc13a2a
Unverified
Commit
ffc13a2a
authored
Sep 13, 2023
by
mergify[bot]
Committed by
GitHub
Sep 13, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into aj/list-games-with-claims
parents
1b934e05
402a4710
Changes
5
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
269 additions
and
308 deletions
+269
-308
blocks.go
indexer/database/blocks.go
+0
-65
mocks.go
indexer/database/mocks.go
+0
-21
etl_e2e_test.go
indexer/e2e_tests/etl_e2e_test.go
+0
-39
20230523_create_schema.sql
indexer/migrations/20230523_create_schema.sql
+20
-41
pnpm-lock.yaml
pnpm-lock.yaml
+249
-142
No files found.
indexer/database/blocks.go
View file @
ffc13a2a
...
...
@@ -7,8 +7,6 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/google/uuid"
"gorm.io/gorm"
)
...
...
@@ -44,25 +42,6 @@ type L2BlockHeader struct {
BlockHeader
`gorm:"embedded"`
}
type
LegacyStateBatch
struct
{
// `default:0` is added since gorm would interepret 0 as NULL
// violating the primary key constraint.
Index
uint64
`gorm:"primaryKey;default:0"`
Root
common
.
Hash
`gorm:"serializer:bytes"`
Size
uint64
PrevTotal
uint64
L1ContractEventGUID
uuid
.
UUID
}
type
OutputProposal
struct
{
OutputRoot
common
.
Hash
`gorm:"primaryKey;serializer:bytes"`
L2OutputIndex
*
big
.
Int
`gorm:"serializer:u256"`
L2BlockNumber
*
big
.
Int
`gorm:"serializer:u256"`
L1ContractEventGUID
uuid
.
UUID
}
type
BlocksView
interface
{
L1BlockHeader
(
common
.
Hash
)
(
*
L1BlockHeader
,
error
)
L1BlockHeaderWithFilter
(
BlockHeader
)
(
*
L1BlockHeader
,
error
)
...
...
@@ -72,9 +51,6 @@ type BlocksView interface {
L2BlockHeaderWithFilter
(
BlockHeader
)
(
*
L2BlockHeader
,
error
)
L2LatestBlockHeader
()
(
*
L2BlockHeader
,
error
)
LatestCheckpointedOutput
()
(
*
OutputProposal
,
error
)
OutputProposal
(
index
*
big
.
Int
)
(
*
OutputProposal
,
error
)
LatestEpoch
()
(
*
Epoch
,
error
)
}
...
...
@@ -83,9 +59,6 @@ type BlocksDB interface {
StoreL1BlockHeaders
([]
L1BlockHeader
)
error
StoreL2BlockHeaders
([]
L2BlockHeader
)
error
StoreLegacyStateBatches
([]
LegacyStateBatch
)
error
StoreOutputProposals
([]
OutputProposal
)
error
}
/**
...
...
@@ -107,16 +80,6 @@ func (db *blocksDB) StoreL1BlockHeaders(headers []L1BlockHeader) error {
return
result
.
Error
}
func
(
db
*
blocksDB
)
StoreLegacyStateBatches
(
stateBatches
[]
LegacyStateBatch
)
error
{
result
:=
db
.
gorm
.
CreateInBatches
(
stateBatches
,
batchInsertSize
)
return
result
.
Error
}
func
(
db
*
blocksDB
)
StoreOutputProposals
(
outputs
[]
OutputProposal
)
error
{
result
:=
db
.
gorm
.
CreateInBatches
(
outputs
,
batchInsertSize
)
return
result
.
Error
}
func
(
db
*
blocksDB
)
L1BlockHeader
(
hash
common
.
Hash
)
(
*
L1BlockHeader
,
error
)
{
return
db
.
L1BlockHeaderWithFilter
(
BlockHeader
{
Hash
:
hash
})
}
...
...
@@ -148,34 +111,6 @@ func (db *blocksDB) L1LatestBlockHeader() (*L1BlockHeader, error) {
return
&
l1Header
,
nil
}
func
(
db
*
blocksDB
)
LatestCheckpointedOutput
()
(
*
OutputProposal
,
error
)
{
var
outputProposal
OutputProposal
result
:=
db
.
gorm
.
Order
(
"l2_output_index DESC"
)
.
Take
(
&
outputProposal
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
&
outputProposal
,
nil
}
func
(
db
*
blocksDB
)
OutputProposal
(
index
*
big
.
Int
)
(
*
OutputProposal
,
error
)
{
var
outputProposal
OutputProposal
result
:=
db
.
gorm
.
Where
(
&
OutputProposal
{
L2OutputIndex
:
index
})
.
Take
(
&
outputProposal
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
}
return
nil
,
result
.
Error
}
return
&
outputProposal
,
nil
}
// L2
func
(
db
*
blocksDB
)
StoreL2BlockHeaders
(
headers
[]
L2BlockHeader
)
error
{
...
...
indexer/database/mocks.go
View file @
ffc13a2a
package
database
import
(
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/mock"
...
...
@@ -53,16 +51,6 @@ func (m *MockBlocksView) L2LatestBlockHeader() (*L2BlockHeader, error) {
return
args
.
Get
(
0
)
.
(
*
L2BlockHeader
),
args
.
Error
(
1
)
}
func
(
m
*
MockBlocksView
)
LatestCheckpointedOutput
()
(
*
OutputProposal
,
error
)
{
args
:=
m
.
Called
()
return
args
.
Get
(
0
)
.
(
*
OutputProposal
),
args
.
Error
(
1
)
}
func
(
m
*
MockBlocksView
)
OutputProposal
(
index
*
big
.
Int
)
(
*
OutputProposal
,
error
)
{
args
:=
m
.
Called
()
return
args
.
Get
(
0
)
.
(
*
OutputProposal
),
args
.
Error
(
1
)
}
func
(
m
*
MockBlocksView
)
LatestEpoch
()
(
*
Epoch
,
error
)
{
args
:=
m
.
Called
()
return
args
.
Get
(
0
)
.
(
*
Epoch
),
args
.
Error
(
1
)
...
...
@@ -82,15 +70,6 @@ func (m *MockBlocksDB) StoreL2BlockHeaders(headers []L2BlockHeader) error {
return
args
.
Error
(
1
)
}
func
(
m
*
MockBlocksDB
)
StoreLegacyStateBatches
(
headers
[]
LegacyStateBatch
)
error
{
args
:=
m
.
Called
(
headers
)
return
args
.
Error
(
1
)
}
func
(
m
*
MockBlocksDB
)
StoreOutputProposals
(
headers
[]
OutputProposal
)
error
{
args
:=
m
.
Called
(
headers
)
return
args
.
Error
(
1
)
}
// MockDB is a mock database that can be used for testing
type
MockDB
struct
{
MockBlocks
*
MockBlocksDB
...
...
indexer/e2e_tests/etl_e2e_test.go
View file @
ffc13a2a
...
...
@@ -71,45 +71,6 @@ func TestE2EETL(t *testing.T) {
}
})
/*
TODO: ADD THIS BACK IN WHEN THESE MARKERS ARE INDEXED
t.Run("indexes L2 checkpoints", func(t *testing.T) {
latestOutput, err := testSuite.DB.Blocks.LatestCheckpointedOutput()
require.NoError(t, err)
require.NotNil(t, latestOutput)
require.GreaterOrEqual(t, latestOutput.L2BlockNumber.Int.Uint64(), uint64(9))
l2EthClient, err := node.DialEthClient(testSuite.OpSys.EthInstances["sequencer"].HTTPEndpoint())
require.NoError(t, err)
submissionInterval := testSuite.OpCfg.DeployConfig.L2OutputOracleSubmissionInterval
numOutputs := latestOutput.L2BlockNumber.Int.Uint64() / submissionInterval
for i := int64(0); i < int64(numOutputs); i++ {
blockNumber := big.NewInt((i + 1) * int64(submissionInterval))
output, err := testSuite.DB.Blocks.OutputProposal(big.NewInt(i))
require.NoError(t, err)
require.NotNil(t, output)
require.Equal(t, i, output.L2OutputIndex.Int.Int64())
require.Equal(t, blockNumber, output.L2BlockNumber.Int)
require.NotEmpty(t, output.L1ContractEventGUID)
// we may as well check the integrity of the output root
l2Block, err := testSuite.L2Client.BlockByNumber(context.Background(), blockNumber)
require.NoError(t, err)
messagePasserStorageHash, err := l2EthClient.StorageHash(predeploys.L2ToL1MessagePasserAddr, blockNumber)
require.NoError(t, err)
// construct and check output root
outputRootPreImage := [128]byte{} // 4 words (first 32 are zero for version 0)
copy(outputRootPreImage[32:64], l2Block.Root().Bytes()) // state root
copy(outputRootPreImage[64:96], messagePasserStorageHash.Bytes()) // message passer storage root
copy(outputRootPreImage[96:128], l2Block.Hash().Bytes()) // block hash
require.Equal(t, crypto.Keccak256Hash(outputRootPreImage[:]), output.OutputRoot)
}
})
*/
t
.
Run
(
"indexes L1 blocks with accompanying contract event"
,
func
(
t
*
testing
.
T
)
{
l1Contracts
:=
[]
common
.
Address
{}
testSuite
.
OpCfg
.
L1Deployments
.
ForEach
(
func
(
name
string
,
addr
common
.
Address
)
{
l1Contracts
=
append
(
l1Contracts
,
addr
)
})
...
...
indexer/migrations/20230523_create_schema.sql
View file @
ffc13a2a
...
...
@@ -77,51 +77,10 @@ CREATE INDEX IF NOT EXISTS l2_contract_events_block_hash ON l2_contract_events(b
CREATE
INDEX
IF
NOT
EXISTS
l2_contract_events_event_signature
ON
l2_contract_events
(
event_signature
);
CREATE
INDEX
IF
NOT
EXISTS
l2_contract_events_contract_address
ON
l2_contract_events
(
contract_address
);
-- Tables that index finalization markers for L2 blocks.
CREATE
TABLE
IF
NOT
EXISTS
legacy_state_batches
(
index
INTEGER
PRIMARY
KEY
,
root
VARCHAR
NOT
NULL
UNIQUE
,
size
INTEGER
NOT
NULL
,
prev_total
INTEGER
NOT
NULL
,
state_batch_appended_guid
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l1_contract_events
(
guid
)
ON
DELETE
CASCADE
);
CREATE
TABLE
IF
NOT
EXISTS
output_proposals
(
output_root
VARCHAR
PRIMARY
KEY
,
l2_output_index
UINT256
NOT
NULL
UNIQUE
,
l2_block_number
UINT256
NOT
NULL
UNIQUE
,
output_proposed_guid
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l1_contract_events
(
guid
)
ON
DELETE
CASCADE
);
/**
* BRIDGING DATA
*/
-- Bridged L1/L2 Tokens
CREATE
TABLE
IF
NOT
EXISTS
l1_bridged_tokens
(
address
VARCHAR
PRIMARY
KEY
,
bridge_address
VARCHAR
NOT
NULL
,
name
VARCHAR
NOT
NULL
,
symbol
VARCHAR
NOT
NULL
,
decimals
INTEGER
NOT
NULL
CHECK
(
decimals
>=
0
AND
decimals
<=
18
)
);
CREATE
TABLE
IF
NOT
EXISTS
l2_bridged_tokens
(
address
VARCHAR
PRIMARY
KEY
,
bridge_address
VARCHAR
NOT
NULL
,
-- L1-L2 relationship is 1 to many so this is not necessarily unique
l1_token_address
VARCHAR
REFERENCES
l1_bridged_tokens
(
address
)
ON
DELETE
CASCADE
,
name
VARCHAR
NOT
NULL
,
symbol
VARCHAR
NOT
NULL
,
decimals
INTEGER
NOT
NULL
CHECK
(
decimals
>=
0
AND
decimals
<=
18
)
);
-- OptimismPortal/L2ToL1MessagePasser
CREATE
TABLE
IF
NOT
EXISTS
l1_transaction_deposits
(
source_hash
VARCHAR
PRIMARY
KEY
,
...
...
@@ -204,6 +163,26 @@ CREATE INDEX IF NOT EXISTS l2_bridge_messages_transaction_withdrawal_hash ON l2_
CREATE
INDEX
IF
NOT
EXISTS
l2_bridge_messages_from_address
ON
l2_bridge_messages
(
from_address
);
-- StandardBridge
CREATE
TABLE
IF
NOT
EXISTS
l1_bridged_tokens
(
address
VARCHAR
PRIMARY
KEY
,
bridge_address
VARCHAR
NOT
NULL
,
name
VARCHAR
NOT
NULL
,
symbol
VARCHAR
NOT
NULL
,
decimals
INTEGER
NOT
NULL
CHECK
(
decimals
>=
0
AND
decimals
<=
18
)
);
CREATE
TABLE
IF
NOT
EXISTS
l2_bridged_tokens
(
address
VARCHAR
PRIMARY
KEY
,
bridge_address
VARCHAR
NOT
NULL
,
-- L1-L2 relationship is 1 to many so this is not necessarily unique
l1_token_address
VARCHAR
REFERENCES
l1_bridged_tokens
(
address
)
ON
DELETE
CASCADE
,
name
VARCHAR
NOT
NULL
,
symbol
VARCHAR
NOT
NULL
,
decimals
INTEGER
NOT
NULL
CHECK
(
decimals
>=
0
AND
decimals
<=
18
)
);
CREATE
TABLE
IF
NOT
EXISTS
l1_bridge_deposits
(
transaction_source_hash
VARCHAR
PRIMARY
KEY
REFERENCES
l1_transaction_deposits
(
source_hash
)
ON
DELETE
CASCADE
,
cross_domain_message_hash
VARCHAR
NOT
NULL
UNIQUE
REFERENCES
l1_bridge_messages
(
message_hash
)
ON
DELETE
CASCADE
,
...
...
pnpm-lock.yaml
View file @
ffc13a2a
This diff is collapsed.
Click to expand it.
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