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
912a3fa3
Commit
912a3fa3
authored
Aug 13, 2023
by
Will Cory
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix(indexer): Fix config usage make config deps more explicit
parent
db0e18c9
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
98 additions
and
74 deletions
+98
-74
cli.go
indexer/cli/cli.go
+17
-6
config.go
indexer/config/config.go
+39
-10
config_test.go
indexer/config/config_test.go
+4
-1
db.go
indexer/database/db.go
+11
-1
setup.go
indexer/e2e_tests/setup.go
+13
-5
indexer.go
indexer/indexer.go
+7
-20
l1_processor.go
indexer/processor/l1_processor.go
+7
-31
No files found.
indexer/cli/cli.go
View file @
912a3fa3
...
...
@@ -6,6 +6,7 @@ import (
"github.com/ethereum-optimism/optimism/indexer"
"github.com/ethereum-optimism/optimism/indexer/config"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum-optimism/optimism/op-service/opio"
...
...
@@ -23,17 +24,28 @@ type Cli struct {
}
func
runIndexer
(
ctx
*
cli
.
Context
)
error
{
logger
:=
log
.
NewLogger
(
log
.
ReadCLIConfig
(
ctx
))
logger
:=
log
.
NewLogger
(
log
.
CLIConfig
{
Level
:
"warn"
,
Color
:
false
,
Format
:
"terminal"
,
})
configPath
:=
ctx
.
String
(
ConfigFlag
.
Name
)
cfg
,
err
:=
config
.
LoadConfig
(
configPath
)
cfg
,
err
:=
config
.
LoadConfig
(
logger
,
configPath
)
if
err
!=
nil
{
logger
.
Error
(
"failed to load config"
,
"err"
,
err
)
return
err
}
cfg
.
Logger
=
logger
indexer
,
err
:=
indexer
.
NewIndexer
(
cfg
)
logger
=
log
.
NewLogger
(
cfg
.
Logger
)
db
,
err
:=
database
.
NewDB
(
cfg
.
DB
)
if
err
!=
nil
{
return
err
}
indexer
,
err
:=
indexer
.
NewIndexer
(
cfg
.
Chain
,
cfg
.
RPCs
,
db
,
logger
)
if
err
!=
nil
{
return
err
}
...
...
@@ -51,13 +63,12 @@ func runApi(ctx *cli.Context) error {
logger
:=
log
.
NewLogger
(
log
.
ReadCLIConfig
(
ctx
))
configPath
:=
ctx
.
String
(
ConfigFlag
.
Name
)
cfg
,
err
:=
config
.
LoadConfig
(
configPath
)
cfg
,
err
:=
config
.
LoadConfig
(
logger
,
configPath
)
if
err
!=
nil
{
logger
.
Error
(
"failed to load config"
,
"err"
,
err
)
return
err
}
cfg
.
Logger
=
logger
fmt
.
Println
(
cfg
)
// finish me
...
...
indexer/config/config.go
View file @
912a3fa3
...
...
@@ -2,11 +2,13 @@ package config
import
(
"os"
"reflect"
"github.com/BurntSushi/toml"
"github.com/ethereum-optimism/optimism/indexer/processor"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum/go-ethereum/common"
geth_log
"github.com/ethereum/go-ethereum/log"
"github.com/joho/godotenv"
)
...
...
@@ -17,14 +19,41 @@ type Config struct {
DB
DBConfig
API
APIConfig
Metrics
MetricsConfig
Logger
log
.
Logger
`toml:"-"`
Logger
log
.
CLIConfig
}
// fetch this via onchain config from RPCsConfig and remove from config in future
type
L1Contracts
struct
{
OptimismPortal
common
.
Address
L2OutputOracle
common
.
Address
L1CrossDomainMessenger
common
.
Address
L1StandardBridge
common
.
Address
L1ERC721Bridge
common
.
Address
// Some more contracts -- ProxyAdmin, SystemConfig, etcc
// Ignore the auxiliary contracts?
// Legacy contracts? We'll add this in to index the legacy chain.
// Remove afterwards?
}
func
(
c
L1Contracts
)
ToSlice
()
[]
common
.
Address
{
fields
:=
reflect
.
VisibleFields
(
reflect
.
TypeOf
(
c
))
v
:=
reflect
.
ValueOf
(
c
)
contracts
:=
make
([]
common
.
Address
,
len
(
fields
))
for
i
,
field
:=
range
fields
{
contracts
[
i
]
=
(
v
.
FieldByName
(
field
.
Name
)
.
Interface
())
.
(
common
.
Address
)
}
return
contracts
}
// ChainConfig configures of the chain being indexed
type
ChainConfig
struct
{
// Configure known chains with the l2 chain id
Preset
int
L1Contracts
processor
.
L1Contracts
L1Contracts
L1Contracts
}
// RPCsConfig configures the RPC urls
...
...
@@ -55,12 +84,12 @@ type MetricsConfig struct {
}
// LoadConfig loads the `indexer.toml` config file from a given path
func
LoadConfig
(
path
string
)
(
Config
,
error
)
{
func
LoadConfig
(
logger
geth_log
.
Logger
,
path
string
)
(
Config
,
error
)
{
if
err
:=
godotenv
.
Load
();
err
!=
nil
{
log
.
Warn
(
"Unable to load .env file"
,
err
)
log
.
Info
(
"Continuing without .env file"
)
log
ger
.
Warn
(
"Unable to load .env file"
,
err
)
log
ger
.
Info
(
"Continuing without .env file"
)
}
else
{
log
.
Info
(
"Loaded .env file"
)
log
ger
.
Info
(
"Loaded .env file"
)
}
var
conf
Config
...
...
@@ -76,11 +105,11 @@ func LoadConfig(path string) (Config, error) {
// Decode the TOML data.
if
_
,
err
:=
toml
.
Decode
(
string
(
data
),
&
conf
);
err
!=
nil
{
log
.
Info
(
"Failed to decode config file"
,
"message"
,
err
)
log
ger
.
Info
(
"Failed to decode config file"
,
"message"
,
err
)
return
conf
,
err
}
log
.
Debug
(
"Loaded config file"
,
conf
)
log
ger
.
Debug
(
"Loaded config file"
,
conf
)
return
conf
,
nil
}
indexer/config/config_test.go
View file @
912a3fa3
...
...
@@ -4,10 +4,13 @@ import (
"os"
"testing"
"github.com/ethereum-optimism/optimism/op-node/testlog"
"github.com/ethereum/go-ethereum/log"
"github.com/stretchr/testify/require"
)
func
TestLoadConfig
(
t
*
testing
.
T
)
{
logger
:=
testlog
.
Logger
(
t
,
log
.
LvlInfo
)
tmpfile
,
err
:=
os
.
CreateTemp
(
""
,
"test.toml"
)
require
.
NoError
(
t
,
err
)
defer
os
.
Remove
(
tmpfile
.
Name
())
...
...
@@ -45,7 +48,7 @@ func TestLoadConfig(t *testing.T) {
err
=
tmpfile
.
Close
()
require
.
NoError
(
t
,
err
)
conf
,
err
:=
LoadConfig
(
tmpfile
.
Name
())
conf
,
err
:=
LoadConfig
(
logger
,
tmpfile
.
Name
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
conf
.
Chain
.
Preset
,
1234
)
...
...
indexer/database/db.go
View file @
912a3fa3
...
...
@@ -2,6 +2,9 @@
package
database
import
(
"fmt"
"github.com/ethereum-optimism/optimism/indexer/config"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
...
...
@@ -17,7 +20,14 @@ type DB struct {
BridgeTransactions
BridgeTransactionsDB
}
func
NewDB
(
dsn
string
)
(
*
DB
,
error
)
{
func
NewDB
(
dbConfig
config
.
DBConfig
)
(
*
DB
,
error
)
{
dsn
:=
fmt
.
Sprintf
(
"host=%s port=%d dbname=%s sslmode=disable"
,
dbConfig
.
Host
,
dbConfig
.
Port
,
dbConfig
.
Name
)
if
dbConfig
.
User
!=
""
{
dsn
+=
fmt
.
Sprintf
(
" user=%s"
,
dbConfig
.
User
)
}
if
dbConfig
.
Password
!=
""
{
dsn
+=
fmt
.
Sprintf
(
" password=%s"
,
dbConfig
.
Password
)
}
gorm
,
err
:=
gorm
.
Open
(
postgres
.
Open
(
dsn
),
&
gorm
.
Config
{
// The indexer will explicitly manage the transaction
// flow processing blocks
...
...
indexer/e2e_tests/setup.go
View file @
912a3fa3
...
...
@@ -13,10 +13,10 @@ import (
"github.com/ethereum-optimism/optimism/indexer"
"github.com/ethereum-optimism/optimism/indexer/config"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/processor"
op_e2e
"github.com/ethereum-optimism/optimism/op-e2e"
"github.com/ethereum-optimism/optimism/op-node/testlog"
op_log
"github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
...
...
@@ -59,7 +59,10 @@ func createE2ETestSuite(t *testing.T) E2ETestSuite {
// Indexer Configuration and Start
indexerCfg
:=
config
.
Config
{
Logger
:
logger
,
Logger
:
op_log
.
CLIConfig
{
Level
:
"warn"
,
},
DB
:
config
.
DBConfig
{
Host
:
"127.0.0.1"
,
Port
:
5432
,
...
...
@@ -71,7 +74,7 @@ func createE2ETestSuite(t *testing.T) E2ETestSuite {
L2RPC
:
opSys
.
Nodes
[
"sequencer"
]
.
HTTPEndpoint
(),
},
Chain
:
config
.
ChainConfig
{
L1Contracts
:
processor
.
L1Contracts
{
L1Contracts
:
config
.
L1Contracts
{
OptimismPortal
:
opCfg
.
L1Deployments
.
OptimismPortalProxy
,
L2OutputOracle
:
opCfg
.
L1Deployments
.
L2OutputOracleProxy
,
L1CrossDomainMessenger
:
opCfg
.
L1Deployments
.
L1CrossDomainMessengerProxy
,
...
...
@@ -81,9 +84,14 @@ func createE2ETestSuite(t *testing.T) E2ETestSuite {
},
}
db
,
err
:=
database
.
NewDB
(
fmt
.
Sprintf
(
"postgres://%s@localhost:5432/%s?sslmode=disable"
,
dbUser
,
dbName
)
)
db
,
err
:=
database
.
NewDB
(
indexerCfg
.
DB
)
require
.
NoError
(
t
,
err
)
indexer
,
err
:=
indexer
.
NewIndexer
(
indexerCfg
)
indexer
,
err
:=
indexer
.
NewIndexer
(
indexerCfg
.
Chain
,
indexerCfg
.
RPCs
,
db
,
logger
,
)
require
.
NoError
(
t
,
err
)
indexerStoppedCh
:=
make
(
chan
interface
{},
1
)
...
...
indexer/indexer.go
View file @
912a3fa3
...
...
@@ -24,44 +24,31 @@ type Indexer struct {
}
// NewIndexer initializes an instance of the Indexer
func
NewIndexer
(
cfg
config
.
Config
)
(
*
Indexer
,
error
)
{
dsn
:=
fmt
.
Sprintf
(
"host=%s port=%d dbname=%s sslmode=disable"
,
cfg
.
DB
.
Host
,
cfg
.
DB
.
Port
,
cfg
.
DB
.
Name
)
if
cfg
.
DB
.
User
!=
""
{
dsn
+=
fmt
.
Sprintf
(
" user=%s"
,
cfg
.
DB
.
User
)
}
if
cfg
.
DB
.
Password
!=
""
{
dsn
+=
fmt
.
Sprintf
(
" password=%s"
,
cfg
.
DB
.
Password
)
}
db
,
err
:=
database
.
NewDB
(
dsn
)
if
err
!=
nil
{
return
nil
,
err
}
l1Contracts
:=
cfg
.
Chain
.
L1Contracts
l1EthClient
,
err
:=
node
.
DialEthClient
(
cfg
.
RPCs
.
L1RPC
)
func
NewIndexer
(
chainConfig
config
.
ChainConfig
,
rpcsConfig
config
.
RPCsConfig
,
db
*
database
.
DB
,
logger
log
.
Logger
)
(
*
Indexer
,
error
)
{
l1Contracts
:=
chainConfig
.
L1Contracts
l1EthClient
,
err
:=
node
.
DialEthClient
(
rpcsConfig
.
L1RPC
)
if
err
!=
nil
{
return
nil
,
err
}
l1Processor
,
err
:=
processor
.
NewL1Processor
(
cfg
.
L
ogger
,
l1EthClient
,
db
,
l1Contracts
)
l1Processor
,
err
:=
processor
.
NewL1Processor
(
l
ogger
,
l1EthClient
,
db
,
l1Contracts
)
if
err
!=
nil
{
return
nil
,
err
}
// L2Processor (predeploys). Although most likely the right setting, make this configurable?
l2Contracts
:=
processor
.
L2ContractPredeploys
()
l2EthClient
,
err
:=
node
.
DialEthClient
(
cfg
.
RPCs
.
L2RPC
)
l2EthClient
,
err
:=
node
.
DialEthClient
(
rpcsConfig
.
L2RPC
)
if
err
!=
nil
{
return
nil
,
err
}
l2Processor
,
err
:=
processor
.
NewL2Processor
(
cfg
.
L
ogger
,
l2EthClient
,
db
,
l2Contracts
)
l2Processor
,
err
:=
processor
.
NewL2Processor
(
l
ogger
,
l2EthClient
,
db
,
l2Contracts
)
if
err
!=
nil
{
return
nil
,
err
}
indexer
:=
&
Indexer
{
db
:
db
,
log
:
cfg
.
L
ogger
,
log
:
l
ogger
,
L1Processor
:
l1Processor
,
L2Processor
:
l2Processor
,
}
...
...
indexer/processor/l1_processor.go
View file @
912a3fa3
...
...
@@ -6,8 +6,8 @@ import (
"errors"
"fmt"
"math/big"
"reflect"
"github.com/ethereum-optimism/optimism/indexer/config"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/indexer/node"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
...
...
@@ -23,32 +23,6 @@ import (
"github.com/ethereum/go-ethereum/log"
)
type
L1Contracts
struct
{
OptimismPortal
common
.
Address
L2OutputOracle
common
.
Address
L1CrossDomainMessenger
common
.
Address
L1StandardBridge
common
.
Address
L1ERC721Bridge
common
.
Address
// Some more contracts -- ProxyAdmin, SystemConfig, etcc
// Ignore the auxiliary contracts?
// Legacy contracts? We'll add this in to index the legacy chain.
// Remove afterwards?
}
func
(
c
L1Contracts
)
ToSlice
()
[]
common
.
Address
{
fields
:=
reflect
.
VisibleFields
(
reflect
.
TypeOf
(
c
))
v
:=
reflect
.
ValueOf
(
c
)
contracts
:=
make
([]
common
.
Address
,
len
(
fields
))
for
i
,
field
:=
range
fields
{
contracts
[
i
]
=
(
v
.
FieldByName
(
field
.
Name
)
.
Interface
())
.
(
common
.
Address
)
}
return
contracts
}
type
checkpointAbi
struct
{
l2OutputOracle
*
abi
.
ABI
legacyStateCommitmentChain
*
abi
.
ABI
...
...
@@ -58,7 +32,7 @@ type L1Processor struct {
processor
}
func
NewL1Processor
(
logger
log
.
Logger
,
ethClient
node
.
EthClient
,
db
*
database
.
DB
,
l1Contracts
L1Contracts
)
(
*
L1Processor
,
error
)
{
func
NewL1Processor
(
logger
log
.
Logger
,
ethClient
node
.
EthClient
,
db
*
database
.
DB
,
l1Contracts
config
.
L1Contracts
)
(
*
L1Processor
,
error
)
{
l1ProcessLog
:=
logger
.
New
(
"processor"
,
"l1"
)
l1ProcessLog
.
Info
(
"initializing processor"
)
...
...
@@ -107,7 +81,7 @@ func NewL1Processor(logger log.Logger, ethClient node.EthClient, db *database.DB
return
l1Processor
,
nil
}
func
l1ProcessFn
(
processLog
log
.
Logger
,
ethClient
node
.
EthClient
,
l1Contracts
L1Contracts
,
checkpointAbi
checkpointAbi
)
ProcessFn
{
func
l1ProcessFn
(
processLog
log
.
Logger
,
ethClient
node
.
EthClient
,
l1Contracts
config
.
L1Contracts
,
checkpointAbi
checkpointAbi
)
ProcessFn
{
rawEthClient
:=
ethclient
.
NewClient
(
ethClient
.
RawRpcClient
())
contractAddrs
:=
l1Contracts
.
ToSlice
()
...
...
@@ -261,7 +235,7 @@ func l1ProcessFn(processLog log.Logger, ethClient node.EthClient, l1Contracts L1
}
}
func
l1ProcessContractEventsBridgeTransactions
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
l1Contracts
L1Contracts
,
events
*
ProcessedContractEvents
)
error
{
func
l1ProcessContractEventsBridgeTransactions
(
processLog
log
.
Logger
,
db
*
database
.
DB
,
l1Contracts
config
.
L1Contracts
,
events
*
ProcessedContractEvents
)
error
{
// (1) Process New Deposits
portalDeposits
,
err
:=
OptimismPortalTransactionDepositEvents
(
events
)
if
err
!=
nil
{
...
...
@@ -294,6 +268,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
TransactionSourceHash
:
depositTx
.
SourceHash
,
Tx
:
transactionDeposits
[
i
]
.
Tx
,
TokenPair
:
database
.
TokenPair
{
// TODO index eth token if it doesn't exist
L1TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
L2TokenAddress
:
predeploys
.
LegacyERC20ETHAddr
,
},
...
...
@@ -492,7 +467,8 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
deposits
[
i
]
=
&
database
.
L1BridgeDeposit
{
TransactionSourceHash
:
depositTx
.
SourceHash
,
CrossDomainMessengerNonce
:
&
database
.
U256
{
Int
:
initiatedBridgeEvent
.
CrossDomainMessengerNonce
},
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
// TODO index the tokens pairs if they don't exist
TokenPair
:
database
.
TokenPair
{
L1TokenAddress
:
initiatedBridgeEvent
.
LocalToken
,
L2TokenAddress
:
initiatedBridgeEvent
.
RemoteToken
},
Tx
:
database
.
Transaction
{
FromAddress
:
initiatedBridgeEvent
.
From
,
ToAddress
:
initiatedBridgeEvent
.
To
,
...
...
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