Commit a6b8a697 authored by Mark Tyneway's avatar Mark Tyneway Committed by GitHub

Merge branch 'develop' into deps/safe-call

parents 7f6ea137 2a7be367
...@@ -6,6 +6,9 @@ import ( ...@@ -6,6 +6,9 @@ import (
"fmt" "fmt"
"io" "io"
"math/big" "math/big"
"net"
"net/http"
_ "net/http/pprof"
"os" "os"
"os/signal" "os/signal"
"sync" "sync"
...@@ -76,6 +79,26 @@ func Main(version string) func(ctx *cli.Context) error { ...@@ -76,6 +79,26 @@ func Main(version string) func(ctx *cli.Context) error {
defer batchSubmitter.Stop() defer batchSubmitter.Stop()
l.Info("Batch Submitter started") l.Info("Batch Submitter started")
if cfg.PprofEnabled {
var srv http.Server
srv.Addr = net.JoinHostPort(cfg.PprofAddr, cfg.PprofPort)
// Start pprof server + register it's shutdown
go func() {
l.Info("pprof server started", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
l.Error("error in pprof server", "err", err)
} else {
l.Info("pprof server shutting down")
}
}()
defer func() {
shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := srv.Shutdown(shutCtx)
l.Info("pprof server shut down", "err", err)
}()
}
interruptChannel := make(chan os.Signal, 1) interruptChannel := make(chan os.Signal, 1)
signal.Notify(interruptChannel, []os.Signal{ signal.Notify(interruptChannel, []os.Signal{
......
...@@ -68,6 +68,11 @@ type Config struct { ...@@ -68,6 +68,11 @@ type Config struct {
// LogTerminal if true, will log to stdout in terminal format. Otherwise the // LogTerminal if true, will log to stdout in terminal format. Otherwise the
// output will be in JSON format. // output will be in JSON format.
LogTerminal bool LogTerminal bool
// Flags for the pprof server
PprofEnabled bool
PprofAddr string
PprofPort string
} }
// NewConfig parses the Config from the provided flags or environment variables. // NewConfig parses the Config from the provided flags or environment variables.
...@@ -88,7 +93,10 @@ func NewConfig(ctx *cli.Context) Config { ...@@ -88,7 +93,10 @@ func NewConfig(ctx *cli.Context) Config {
SequencerHDPath: ctx.GlobalString(flags.SequencerHDPathFlag.Name), SequencerHDPath: ctx.GlobalString(flags.SequencerHDPathFlag.Name),
SequencerBatchInboxAddress: ctx.GlobalString(flags.SequencerBatchInboxAddressFlag.Name), SequencerBatchInboxAddress: ctx.GlobalString(flags.SequencerBatchInboxAddressFlag.Name),
/* Optional Flags */ /* Optional Flags */
LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name), LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name),
LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name), LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name),
PprofEnabled: ctx.GlobalBool(flags.PprofEnabledFlag.Name),
PprofAddr: ctx.GlobalString(flags.PprofAddrFlag.Name),
PprofPort: ctx.GlobalString(flags.PprofPortFlag.Name),
} }
} }
...@@ -113,6 +113,23 @@ var ( ...@@ -113,6 +113,23 @@ var (
"in JSON format.", "in JSON format.",
EnvVar: prefixEnvVar("LOG_TERMINAL"), EnvVar: prefixEnvVar("LOG_TERMINAL"),
} }
PprofEnabledFlag = cli.BoolFlag{
Name: "pprof.enabled",
Usage: "Enable the pprof server",
EnvVar: prefixEnvVar("PPROF_ENABLED"),
}
PprofAddrFlag = cli.StringFlag{
Name: "pprof.addr",
Usage: "pprof listening address",
Value: "0.0.0.0",
EnvVar: prefixEnvVar("PPROF_ADDR"),
}
PprofPortFlag = cli.IntFlag{
Name: "pprof.port",
Usage: "pprof listening port",
Value: 6060,
EnvVar: prefixEnvVar("PPROF_PORT"),
}
) )
var requiredFlags = []cli.Flag{ var requiredFlags = []cli.Flag{
...@@ -134,6 +151,9 @@ var requiredFlags = []cli.Flag{ ...@@ -134,6 +151,9 @@ var requiredFlags = []cli.Flag{
var optionalFlags = []cli.Flag{ var optionalFlags = []cli.Flag{
LogLevelFlag, LogLevelFlag,
LogTerminalFlag, LogTerminalFlag,
PprofEnabledFlag,
PprofAddrFlag,
PprofPortFlag,
} }
// Flags contains the list of configuration options available to the binary. // Flags contains the list of configuration options available to the binary.
......
...@@ -2,9 +2,12 @@ package main ...@@ -2,9 +2,12 @@ package main
import ( import (
"context" "context"
"net"
"net/http"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"time"
"github.com/ethereum-optimism/optimism/op-node/metrics" "github.com/ethereum-optimism/optimism/op-node/metrics"
...@@ -101,6 +104,27 @@ func RollupNodeMain(ctx *cli.Context) error { ...@@ -101,6 +104,27 @@ func RollupNodeMain(ctx *cli.Context) error {
m.RecordUp() m.RecordUp()
log.Info("Rollup node started") log.Info("Rollup node started")
if cfg.Pprof.Enabled {
var srv http.Server
srv.Addr = net.JoinHostPort(cfg.Pprof.ListenAddr, cfg.Pprof.ListenPort)
// Start pprof server + register it's shutdown
go func() {
log.Info("pprof server started", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Error("error in pprof server", "err", err)
} else {
log.Info("pprof server shutting down")
}
}()
defer func() {
shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := srv.Shutdown(shutCtx)
log.Info("pprof server shut down", "err", err)
}()
}
interruptChannel := make(chan os.Signal, 1) interruptChannel := make(chan os.Signal, 1)
signal.Notify(interruptChannel, []os.Signal{ signal.Notify(interruptChannel, []os.Signal{
os.Interrupt, os.Interrupt,
......
...@@ -111,6 +111,23 @@ var ( ...@@ -111,6 +111,23 @@ var (
Value: 7300, Value: 7300,
EnvVar: prefixEnvVar("METRICS_PORT"), EnvVar: prefixEnvVar("METRICS_PORT"),
} }
PprofEnabledFlag = cli.BoolFlag{
Name: "pprof.enabled",
Usage: "Enable the pprof server",
EnvVar: prefixEnvVar("PPROF_ENABLED"),
}
PprofAddrFlag = cli.StringFlag{
Name: "pprof.addr",
Usage: "pprof listening address",
Value: "0.0.0.0",
EnvVar: prefixEnvVar("PPROF_ADDR"),
}
PprofPortFlag = cli.IntFlag{
Name: "pprof.port",
Usage: "pprof listening port",
Value: 6060,
EnvVar: prefixEnvVar("PPROF_PORT"),
}
SnapshotLog = cli.StringFlag{ SnapshotLog = cli.StringFlag{
Name: "snapshotlog.file", Name: "snapshotlog.file",
...@@ -139,6 +156,9 @@ var optionalFlags = append([]cli.Flag{ ...@@ -139,6 +156,9 @@ var optionalFlags = append([]cli.Flag{
MetricsEnabledFlag, MetricsEnabledFlag,
MetricsAddrFlag, MetricsAddrFlag,
MetricsPortFlag, MetricsPortFlag,
PprofEnabledFlag,
PprofAddrFlag,
PprofPortFlag,
SnapshotLog, SnapshotLog,
}, p2pFlags...) }, p2pFlags...)
......
...@@ -28,6 +28,8 @@ type Config struct { ...@@ -28,6 +28,8 @@ type Config struct {
Metrics MetricsConfig Metrics MetricsConfig
Pprof PprofConfig
// Optional // Optional
Tracer Tracer Tracer Tracer
} }
...@@ -59,6 +61,16 @@ func (m MetricsConfig) Check() error { ...@@ -59,6 +61,16 @@ func (m MetricsConfig) Check() error {
return nil return nil
} }
type PprofConfig struct {
Enabled bool
ListenAddr string
ListenPort string
}
func (p PprofConfig) Check() error {
return nil
}
// Check verifies that the given configuration makes sense // Check verifies that the given configuration makes sense
func (cfg *Config) Check() error { func (cfg *Config) Check() error {
if err := cfg.L2.Check(); err != nil { if err := cfg.L2.Check(); err != nil {
...@@ -70,6 +82,9 @@ func (cfg *Config) Check() error { ...@@ -70,6 +82,9 @@ func (cfg *Config) Check() error {
if err := cfg.Metrics.Check(); err != nil { if err := cfg.Metrics.Check(); err != nil {
return fmt.Errorf("metrics config error: %w", err) return fmt.Errorf("metrics config error: %w", err)
} }
if err := cfg.Pprof.Check(); err != nil {
return fmt.Errorf("pprof config error: %w", err)
}
if cfg.P2P != nil { if cfg.P2P != nil {
if err := cfg.P2P.Check(); err != nil { if err := cfg.P2P.Check(); err != nil {
return fmt.Errorf("p2p config error: %w", err) return fmt.Errorf("p2p config error: %w", err)
......
...@@ -68,6 +68,11 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { ...@@ -68,6 +68,11 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) {
ListenAddr: ctx.GlobalString(flags.MetricsAddrFlag.Name), ListenAddr: ctx.GlobalString(flags.MetricsAddrFlag.Name),
ListenPort: ctx.GlobalInt(flags.MetricsPortFlag.Name), ListenPort: ctx.GlobalInt(flags.MetricsPortFlag.Name),
}, },
Pprof: node.PprofConfig{
Enabled: ctx.GlobalBool(flags.PprofEnabledFlag.Name),
ListenAddr: ctx.GlobalString(flags.PprofAddrFlag.Name),
ListenPort: ctx.GlobalString(flags.PprofPortFlag.Name),
},
P2P: p2pConfig, P2P: p2pConfig,
P2PSigner: p2pSignerSetup, P2PSigner: p2pSignerSetup,
} }
......
...@@ -57,6 +57,11 @@ type Config struct { ...@@ -57,6 +57,11 @@ type Config struct {
// LogTerminal if true, will log to stdout in terminal format. Otherwise the // LogTerminal if true, will log to stdout in terminal format. Otherwise the
// output will be in JSON format. // output will be in JSON format.
LogTerminal bool LogTerminal bool
// Flags for the pprof server
PprofEnabled bool
PprofAddr string
PprofPort string
} }
// NewConfig parses the Config from the provided flags or environment variables. // NewConfig parses the Config from the provided flags or environment variables.
...@@ -74,7 +79,10 @@ func NewConfig(ctx *cli.Context) Config { ...@@ -74,7 +79,10 @@ func NewConfig(ctx *cli.Context) Config {
Mnemonic: ctx.GlobalString(flags.MnemonicFlag.Name), Mnemonic: ctx.GlobalString(flags.MnemonicFlag.Name),
L2OutputHDPath: ctx.GlobalString(flags.L2OutputHDPathFlag.Name), L2OutputHDPath: ctx.GlobalString(flags.L2OutputHDPathFlag.Name),
/* Optional Flags */ /* Optional Flags */
LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name), LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name),
LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name), LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name),
PprofEnabled: ctx.GlobalBool(flags.PprofEnabledFlag.Name),
PprofAddr: ctx.GlobalString(flags.PprofAddrFlag.Name),
PprofPort: ctx.GlobalString(flags.PprofPortFlag.Name),
} }
} }
...@@ -95,6 +95,23 @@ var ( ...@@ -95,6 +95,23 @@ var (
"in JSON format.", "in JSON format.",
EnvVar: prefixEnvVar("LOG_TERMINAL"), EnvVar: prefixEnvVar("LOG_TERMINAL"),
} }
PprofEnabledFlag = cli.BoolFlag{
Name: "pprof.enabled",
Usage: "Enable the pprof server",
EnvVar: prefixEnvVar("PPROF_ENABLED"),
}
PprofAddrFlag = cli.StringFlag{
Name: "pprof.addr",
Usage: "pprof listening address",
Value: "0.0.0.0",
EnvVar: prefixEnvVar("PPROF_ADDR"),
}
PprofPortFlag = cli.IntFlag{
Name: "pprof.port",
Usage: "pprof listening port",
Value: 6060,
EnvVar: prefixEnvVar("PPROF_PORT"),
}
) )
var requiredFlags = []cli.Flag{ var requiredFlags = []cli.Flag{
...@@ -113,6 +130,9 @@ var requiredFlags = []cli.Flag{ ...@@ -113,6 +130,9 @@ var requiredFlags = []cli.Flag{
var optionalFlags = []cli.Flag{ var optionalFlags = []cli.Flag{
LogLevelFlag, LogLevelFlag,
LogTerminalFlag, LogTerminalFlag,
PprofEnabledFlag,
PprofAddrFlag,
PprofPortFlag,
} }
// Flags contains the list of configuration options available to the binary. // Flags contains the list of configuration options available to the binary.
......
...@@ -3,6 +3,9 @@ package op_proposer ...@@ -3,6 +3,9 @@ package op_proposer
import ( import (
"context" "context"
"fmt" "fmt"
"net"
"net/http"
_ "net/http/pprof"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
...@@ -68,6 +71,27 @@ func Main(version string) func(ctx *cli.Context) error { ...@@ -68,6 +71,27 @@ func Main(version string) func(ctx *cli.Context) error {
l.Info("L2 Output Submitter started") l.Info("L2 Output Submitter started")
if cfg.PprofEnabled {
var srv http.Server
srv.Addr = net.JoinHostPort(cfg.PprofAddr, cfg.PprofPort)
// Start pprof server + register it's shutdown
go func() {
l.Info("pprof server started", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
l.Error("error in pprof server", "err", err)
} else {
l.Info("pprof server shutting down")
}
}()
defer func() {
shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := srv.Shutdown(shutCtx)
l.Info("pprof server shut down", "err", err)
}()
}
interruptChannel := make(chan os.Signal, 1) interruptChannel := make(chan os.Signal, 1)
signal.Notify(interruptChannel, []os.Signal{ signal.Notify(interruptChannel, []os.Signal{
os.Interrupt, os.Interrupt,
......
...@@ -58,9 +58,9 @@ function wait_up { ...@@ -58,9 +58,9 @@ function wait_up {
mkdir -p ./.devnet mkdir -p ./.devnet
if [ ! -f ./.devnet/rollup.json ]; then if [ ! -f ./.devnet/rollup.json ]; then
GENESIS_TIMESTAMP=$(date +%s | xargs printf "0x%x") L1_GENESIS_TIMESTAMP=$(date +%s | xargs printf "0x%x")
else else
GENESIS_TIMESTAMP=$(jq '.timestamp' < .devnet/genesis-l1.json) L1_GENESIS_TIMESTAMP=$(jq '.timestamp' < .devnet/genesis-l1.json)
fi fi
# Regenerate the L1 genesis file if necessary. The existence of the genesis # Regenerate the L1 genesis file if necessary. The existence of the genesis
...@@ -69,7 +69,7 @@ if [ ! -f ./.devnet/genesis-l1.json ]; then ...@@ -69,7 +69,7 @@ if [ ! -f ./.devnet/genesis-l1.json ]; then
echo "Regenerating L1 genesis." echo "Regenerating L1 genesis."
( (
cd $CONTRACTS_BEDROCK cd $CONTRACTS_BEDROCK
L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP npx hardhat genesis-l1 \ L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP npx hardhat genesis-l1 \
--outfile genesis-l1.json --outfile genesis-l1.json
mv genesis-l1.json ../../.devnet/genesis-l1.json mv genesis-l1.json ../../.devnet/genesis-l1.json
) )
...@@ -89,7 +89,7 @@ if [ ! -d $CONTRACTS_BEDROCK/deployments/$NETWORK ]; then ...@@ -89,7 +89,7 @@ if [ ! -d $CONTRACTS_BEDROCK/deployments/$NETWORK ]; then
( (
echo "Deploying contracts." echo "Deploying contracts."
cd $CONTRACTS_BEDROCK cd $CONTRACTS_BEDROCK
L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP yarn hardhat --network $NETWORK deploy L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP yarn hardhat --network $NETWORK deploy
) )
else else
echo "Contracts already deployed, skipping." echo "Contracts already deployed, skipping."
...@@ -99,7 +99,7 @@ if [ ! -f ./.devnet/genesis-l2.json ]; then ...@@ -99,7 +99,7 @@ if [ ! -f ./.devnet/genesis-l2.json ]; then
( (
echo "Creating L2 genesis file." echo "Creating L2 genesis file."
cd $CONTRACTS_BEDROCK cd $CONTRACTS_BEDROCK
L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP npx hardhat --network $NETWORK genesis-l2 L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP npx hardhat --network $NETWORK genesis-l2
mv genesis.json ../../.devnet/genesis-l2.json mv genesis.json ../../.devnet/genesis-l2.json
echo "Created L2 genesis." echo "Created L2 genesis."
) )
...@@ -120,7 +120,7 @@ if [ ! -f ./.devnet/rollup.json ]; then ...@@ -120,7 +120,7 @@ if [ ! -f ./.devnet/rollup.json ]; then
( (
echo "Building rollup config..." echo "Building rollup config..."
cd $CONTRACTS_BEDROCK cd $CONTRACTS_BEDROCK
L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP npx hardhat --network $NETWORK rollup-config L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP npx hardhat --network $NETWORK rollup-config
mv rollup.json ../../.devnet/rollup.json mv rollup.json ../../.devnet/rollup.json
) )
else else
......
...@@ -63,10 +63,12 @@ services: ...@@ -63,10 +63,12 @@ services:
--metrics.enabled --metrics.enabled
--metrics.addr=0.0.0.0 --metrics.addr=0.0.0.0
--metrics.port=7300 --metrics.port=7300
--pprof.enabled
ports: ports:
- "7545:8545" - "7545:8545"
- "9003:9003" - "9003:9003"
- "7300:7300" - "7300:7300"
- "6060:6060"
volumes: volumes:
- ${PWD}/p2p-sequencer-key.txt:/config/p2p-sequencer-key.txt - ${PWD}/p2p-sequencer-key.txt:/config/p2p-sequencer-key.txt
- ${PWD}/p2p-node-key.txt:/config/p2p-node-key.txt - ${PWD}/p2p-node-key.txt:/config/p2p-node-key.txt
...@@ -82,6 +84,8 @@ services: ...@@ -82,6 +84,8 @@ services:
build: build:
context: ../ context: ../
dockerfile: ./op-proposer/Dockerfile dockerfile: ./op-proposer/Dockerfile
ports:
- "6062:6060"
environment: environment:
L1_ETH_RPC: http://l1:8545 L1_ETH_RPC: http://l1:8545
L2_ETH_RPC: http://l2:8545 L2_ETH_RPC: http://l2:8545
...@@ -94,6 +98,7 @@ services: ...@@ -94,6 +98,7 @@ services:
OUTPUT_SUBMITTER_L2_OUTPUT_HD_PATH: "m/44'/60'/0'/0/1" OUTPUT_SUBMITTER_L2_OUTPUT_HD_PATH: "m/44'/60'/0'/0/1"
OUTPUT_SUBMITTER_LOG_TERMINAL: "true" OUTPUT_SUBMITTER_LOG_TERMINAL: "true"
L2OO_ADDRESS: "${L2OO_ADDRESS}" L2OO_ADDRESS: "${L2OO_ADDRESS}"
OUTPUT_SUBMITTER_PPROF_ENABLED: "true"
op-batcher: op-batcher:
depends_on: depends_on:
...@@ -103,6 +108,8 @@ services: ...@@ -103,6 +108,8 @@ services:
build: build:
context: ../ context: ../
dockerfile: ./op-batcher/Dockerfile dockerfile: ./op-batcher/Dockerfile
ports:
- "6061:6060"
environment: environment:
L1_ETH_RPC: http://l1:8545 L1_ETH_RPC: http://l1:8545
L2_ETH_RPC: http://l2:8545 L2_ETH_RPC: http://l2:8545
...@@ -120,6 +127,7 @@ services: ...@@ -120,6 +127,7 @@ services:
BATCH_SUBMITTER_SEQUENCER_GENESIS_HASH: "${SEQUENCER_GENESIS_HASH}" BATCH_SUBMITTER_SEQUENCER_GENESIS_HASH: "${SEQUENCER_GENESIS_HASH}"
BATCH_SUBMITTER_SEQUENCER_BATCH_INBOX_ADDRESS: "${SEQUENCER_BATCH_INBOX_ADDRESS}" BATCH_SUBMITTER_SEQUENCER_BATCH_INBOX_ADDRESS: "${SEQUENCER_BATCH_INBOX_ADDRESS}"
BATCH_SUBMITTER_LOG_TERMINAL: "true" BATCH_SUBMITTER_LOG_TERMINAL: "true"
BATCH_SUBMITTER_PPROF_ENABLED: "true"
stateviz: stateviz:
build: build:
......
...@@ -135,14 +135,14 @@ OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10686) ...@@ -135,14 +135,14 @@ OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10686)
OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15662) OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15662)
OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15967) OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15967)
OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843) OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnInsufficientGas() (gas: 160749) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnInsufficientGas() (gas: 160743)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnInvalidOutputRootProof() (gas: 81285) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnInvalidOutputRootProof() (gas: 81241)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnRecentWithdrawal() (gas: 53001) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnRecentWithdrawal() (gas: 53001)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnReentrancy() (gas: 205586) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnReentrancy() (gas: 205521)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnReplay() (gas: 278919) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnReplay() (gas: 278941)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnSelfCall() (gas: 50517) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOnSelfCall() (gas: 50539)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOninvalidWithdrawalProof() (gas: 148562) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_revertsOninvalidWithdrawalProof() (gas: 148562)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_succeeds() (gas: 186991) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_succeeds() (gas: 187013)
OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails() (gas: 289662) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails() (gas: 289662)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17341) OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17341)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14199) OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14199)
......
...@@ -275,7 +275,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer { ...@@ -275,7 +275,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer {
event WithdrawalFinalized(bytes32 indexed, bool success); event WithdrawalFinalized(bytes32 indexed, bool success);
// Use a constructor to set the storage vars above, so as to minimize the number of ffi calls. // Use a constructor to set the storage vars above, so as to minimize the number of ffi calls.
constructor() public { constructor() {
super.setUp(); super.setUp();
_defaultTx = Types.WithdrawalTransaction({ _defaultTx = Types.WithdrawalTransaction({
nonce: 0, nonce: 0,
...@@ -425,8 +425,8 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer { ...@@ -425,8 +425,8 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer {
( (
bytes32 stateRoot, bytes32 stateRoot,
bytes32 storageRoot, bytes32 storageRoot,
bytes32 outputRoot, ,
bytes32 withdrawalHash, ,
bytes memory withdrawalProof bytes memory withdrawalProof
) = ffi.getFinalizeWithdrawalTransactionInputs(insufficientGasTx); ) = ffi.getFinalizeWithdrawalTransactionInputs(insufficientGasTx);
Types.OutputRootProof memory outputRootProof = Types.OutputRootProof({ Types.OutputRootProof memory outputRootProof = Types.OutputRootProof({
...@@ -526,12 +526,15 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer { ...@@ -526,12 +526,15 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer {
function test_finalizeWithdrawalTransaction_differential( function test_finalizeWithdrawalTransaction_differential(
address _sender, address _sender,
address _target, address _target,
uint64 _value, uint256 _value,
uint8 _gasLimit, uint256 _gasLimit,
bytes memory _data bytes memory _data
) external { ) external {
// Cannot call the optimism portal // Cannot call the optimism portal
vm.assume(_target != address(op)); vm.assume(_target != address(op));
// Total ETH supply is currently about 120M ETH.
vm.assume(_value < 200_000_000 ether);
vm.assume(_gasLimit < 50_000_000);
uint256 _nonce = messagePasser.nonce(); uint256 _nonce = messagePasser.nonce();
Types.WithdrawalTransaction memory _tx = Types.WithdrawalTransaction({ Types.WithdrawalTransaction memory _tx = Types.WithdrawalTransaction({
nonce: _nonce, nonce: _nonce,
......
...@@ -2,19 +2,20 @@ import { ethers } from 'ethers' ...@@ -2,19 +2,20 @@ import { ethers } from 'ethers'
const { env } = process const { env } = process
const startingTimestamp = const l1GenesisTimestamp =
typeof env.L2OO_STARTING_BLOCK_TIMESTAMP === 'string' typeof env.L1_GENESIS_TIMESTAMP === 'string'
? ethers.BigNumber.from(env.L2OO_STARTING_BLOCK_TIMESTAMP).toNumber() ? ethers.BigNumber.from(env.L1_GENESIS_TIMESTAMP).toNumber()
: Math.floor(Date.now() / 1000) : Math.floor(Date.now() / 1000)
const config = { const config = {
submissionInterval: 6, submissionInterval: 6,
genesisOutput: ethers.constants.HashZero, genesisOutput: ethers.constants.HashZero,
historicalBlocks: 0, historicalBlocks: 0,
l1StartingBlockTag: 'earliest',
startingBlockNumber: 0, startingBlockNumber: 0,
l2BlockTime: 2, l2BlockTime: 2,
startingTimestamp, l1GenesisTimestamp,
sequencerAddress: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', sequencerAddress: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
l2CrossDomainMessengerOwner: ethers.constants.AddressZero, l2CrossDomainMessengerOwner: ethers.constants.AddressZero,
......
import { ethers } from 'ethers' import { ethers } from 'ethers'
const sequencerAddress = '0x6c23a0dcdfc44b7a57bed148de598895e398d984' const sequencerAddress = '0x6c23a0dcdfc44b7a57bed148de598895e398d984'
const startingTimestamp = 1658777882 const l1StartingBlockTag =
'0xafce66a0a2446856112e4069b275ad32b1f4a607888f9c4c59eddf9be81f8670'
const config = { const config = {
submissionInterval: 6, submissionInterval: 6,
...@@ -9,7 +10,7 @@ const config = { ...@@ -9,7 +10,7 @@ const config = {
historicalBlocks: 0, historicalBlocks: 0,
startingBlockNumber: 0, startingBlockNumber: 0,
l2BlockTime: 2, l2BlockTime: 2,
startingTimestamp, l1StartingBlockTag,
sequencerAddress, sequencerAddress,
l2CrossDomainMessengerOwner: ethers.constants.AddressZero, l2CrossDomainMessengerOwner: ethers.constants.AddressZero,
......
...@@ -2,9 +2,9 @@ import { ethers } from 'ethers' ...@@ -2,9 +2,9 @@ import { ethers } from 'ethers'
const { env } = process const { env } = process
const startingTimestamp = const l1GenesisTimestamp =
typeof env.L2OO_STARTING_BLOCK_TIMESTAMP === 'string' typeof env.L1_GENESIS_TIMESTAMP === 'string'
? ethers.BigNumber.from(env.L2OO_STARTING_BLOCK_TIMESTAMP).toNumber() ? ethers.BigNumber.from(env.L1_GENESIS_TIMESTAMP).toNumber()
: Math.floor(Date.now() / 1000) : Math.floor(Date.now() / 1000)
const config = { const config = {
...@@ -12,8 +12,9 @@ const config = { ...@@ -12,8 +12,9 @@ const config = {
genesisOutput: ethers.constants.HashZero, genesisOutput: ethers.constants.HashZero,
historicalBlocks: 0, historicalBlocks: 0,
startingBlockNumber: 0, startingBlockNumber: 0,
l1StartingBlockTag: 'earliest',
l2BlockTime: 2, l2BlockTime: 2,
startingTimestamp, l1GenesisTimestamp,
sequencerAddress: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', sequencerAddress: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
maxSequencerDrift: 10, maxSequencerDrift: 10,
sequencerWindowSize: 4, sequencerWindowSize: 4,
......
...@@ -10,13 +10,10 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -10,13 +10,10 @@ const deployFn: DeployFunction = async (hre) => {
const { deployer } = await hre.getNamedAccounts() const { deployer } = await hre.getNamedAccounts()
const { deployConfig } = hre const { deployConfig } = hre
if ( const l1 = hre.ethers.getDefaultProvider()
typeof deployConfig.startingTimestamp !== 'number' || const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag)
isNaN(deployConfig.startingTimestamp) if (l1StartingBlock === null) {
) { throw new Error(`Cannot fetch block tag ${deployConfig.l1StartingBlockTag}`)
throw new Error(
'Cannot deploy L2OutputOracle without specifying a valid startingTimestamp.'
)
} }
await deploy('L2OutputOracleProxy', { await deploy('L2OutputOracleProxy', {
...@@ -34,7 +31,7 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -34,7 +31,7 @@ const deployFn: DeployFunction = async (hre) => {
deployConfig.genesisOutput, deployConfig.genesisOutput,
deployConfig.historicalBlocks, deployConfig.historicalBlocks,
deployConfig.startingBlockNumber, deployConfig.startingBlockNumber,
deployConfig.startingTimestamp, l1StartingBlock.timestamp,
deployConfig.l2BlockTime, deployConfig.l2BlockTime,
deployConfig.sequencerAddress, deployConfig.sequencerAddress,
deployConfig.outputOracleOwner, deployConfig.outputOracleOwner,
...@@ -84,7 +81,7 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -84,7 +81,7 @@ const deployFn: DeployFunction = async (hre) => {
} }
const startingTimestamp = await L2OutputOracle.STARTING_TIMESTAMP() const startingTimestamp = await L2OutputOracle.STARTING_TIMESTAMP()
if (!startingTimestamp.eq(BigNumber.from(deployConfig.startingTimestamp))) { if (!startingTimestamp.eq(BigNumber.from(l1StartingBlock.timestamp))) {
throw new Error('starting timestamp misconfigured') throw new Error('starting timestamp misconfigured')
} }
const l2BlockTime = await L2OutputOracle.L2_BLOCK_TIME() const l2BlockTime = await L2OutputOracle.L2_BLOCK_TIME()
......
...@@ -74,18 +74,15 @@ const config: HardhatUserConfig = { ...@@ -74,18 +74,15 @@ const config: HardhatUserConfig = {
historicalBlocks: { historicalBlocks: {
type: 'number', type: 'number',
}, },
startingBlockNumber: {
type: 'number',
},
startingTimestamp: {
type: 'number',
},
sequencerAddress: { sequencerAddress: {
type: 'address', type: 'address',
}, },
outputOracleOwner: { outputOracleOwner: {
type: 'address', type: 'address',
}, },
l1StartingBlockTag: {
type: 'string',
},
}, },
external: { external: {
contracts: [ contracts: [
......
...@@ -61,7 +61,7 @@ task('genesis-l1', 'create a genesis config') ...@@ -61,7 +61,7 @@ task('genesis-l1', 'create a genesis config')
} }
} }
const timestamp = hre.deployConfig.startingTimestamp const timestamp = hre.deployConfig.l1GenesisTimestamp
if (timestamp === undefined) { if (timestamp === undefined) {
throw new Error('Must configure starting block timestamp') throw new Error('Must configure starting block timestamp')
} }
......
...@@ -462,8 +462,12 @@ task('genesis-l2', 'create a genesis config') ...@@ -462,8 +462,12 @@ task('genesis-l2', 'create a genesis config')
} }
} }
const portal = await hre.deployments.get('OptimismPortalProxy') const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag)
const l1StartingBlock = await l1.getBlock(portal.receipt.blockHash) if (l1StartingBlock === null) {
throw new Error(
`Cannot fetch block tag ${deployConfig.l1StartingBlockTag}`
)
}
if (l1StartingBlock === null) { if (l1StartingBlock === null) {
console.log(`Unable to fetch L1 starting timestamp`) console.log(`Unable to fetch L1 starting timestamp`)
......
...@@ -23,13 +23,18 @@ task('rollup-config', 'create a genesis config') ...@@ -23,13 +23,18 @@ task('rollup-config', 'create a genesis config')
const l2Genesis = await l2.getBlock('earliest') const l2Genesis = await l2.getBlock('earliest')
const portal = await hre.deployments.get('OptimismPortalProxy') const portal = await hre.deployments.get('OptimismPortalProxy')
const l1StartingBlock = await l1.getBlock(portal.receipt.blockHash) const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag)
if (l1StartingBlock === null) {
throw new Error(
`Cannot fetch block tag ${deployConfig.l1StartingBlockTag}`
)
}
const config: OpNodeConfig = { const config: OpNodeConfig = {
genesis: { genesis: {
l1: { l1: {
hash: portal.receipt.blockHash, hash: l1StartingBlock.hash,
number: portal.receipt.blockNumber, number: l1StartingBlock.number,
}, },
l2: { l2: {
hash: l2Genesis.hash, hash: l2Genesis.hash,
......
...@@ -4,7 +4,5 @@ ...@@ -4,7 +4,5 @@
"rootDir": "./src", "rootDir": "./src",
"outDir": "./dist" "outDir": "./dist"
}, },
"include": [ "include": ["src/**/*"]
"src/**/*"
]
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment