From a2287c761e04b6eea6159f106130596b9ce1a063 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 12 Apr 2024 15:12:49 +0800 Subject: [PATCH 1/3] feat(rpc): remove `WaitL1Origin()` method --- bindings/.githead | 2 +- bindings/gen_assignment_hook.go | 30 ++++++++++ bindings/gen_guardian_prover.go | 8 +++ bindings/gen_lib_proposing.go | 7 +++ bindings/gen_lib_verifying.go | 11 ++++ bindings/gen_taiko_l1.go | 56 ------------------- pkg/rpc/methods.go | 43 +++++++------- pkg/rpc/utils.go | 23 +++----- prover/event_handler/block_proposed.go | 4 +- .../guardian_prover.go | 2 +- prover/proof_submitter/proof_submitter.go | 29 ++++------ 11 files changed, 102 insertions(+), 113 deletions(-) diff --git a/bindings/.githead b/bindings/.githead index c971e4a82..3750f94a7 100644 --- a/bindings/.githead +++ b/bindings/.githead @@ -1 +1 @@ -03d610d8a94e4f1ef52b4c3e5656ed9081b8585f +90640735616c2fe36179cb69243740f9b6c4ab29 diff --git a/bindings/gen_assignment_hook.go b/bindings/gen_assignment_hook.go index 8a83785a1..e7d483a69 100644 --- a/bindings/gen_assignment_hook.go +++ b/bindings/gen_assignment_hook.go @@ -41,6 +41,36 @@ type AssignmentHookProverAssignment struct { Signature []byte } +// TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlock struct { + MetaHash [32]byte + AssignedProver common.Address + LivenessBond *big.Int + BlockId uint64 + ProposedAt uint64 + ProposedIn uint64 + NextTransitionId uint32 + VerifiedTransitionId uint32 +} + +// TaikoDataBlockMetadata is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockMetadata struct { + L1Hash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + DepositsHash [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + L1Height uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Sender common.Address +} + // TaikoDataTierFee is an auto generated low-level Go binding around an user-defined struct. type TaikoDataTierFee struct { Tier uint16 diff --git a/bindings/gen_guardian_prover.go b/bindings/gen_guardian_prover.go index cdcb9578a..e6132458d 100644 --- a/bindings/gen_guardian_prover.go +++ b/bindings/gen_guardian_prover.go @@ -35,6 +35,14 @@ type TaikoDataTierProof struct { Data []byte } +// TaikoDataTransition is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataTransition struct { + ParentHash [32]byte + BlockHash [32]byte + StateRoot [32]byte + Graffiti [32]byte +} + // GuardianProverMetaData contains all meta data concerning the GuardianProver contract. var GuardianProverMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"approved_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"guardianIds\",\"inputs\":[{\"name\":\"guardian\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardians\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isApproved\",\"inputs\":[{\"name\":\"_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGuardians\",\"inputs\":[{\"name\":\"_newGuardians\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_minGuardians\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approved\",\"inputs\":[{\"name\":\"operationId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"approvalBits\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minGuardiansReached\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardianApproval\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"proofData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardiansUpdated\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"guardians\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", diff --git a/bindings/gen_lib_proposing.go b/bindings/gen_lib_proposing.go index 3e35789ee..006ef7150 100644 --- a/bindings/gen_lib_proposing.go +++ b/bindings/gen_lib_proposing.go @@ -29,6 +29,13 @@ var ( _ = abi.ConvertType ) +// TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataEthDeposit struct { + Recipient common.Address + Amount *big.Int + Id uint64 +} + // LibProposingMetaData contains all meta data concerning the LibProposing contract. var LibProposingMetaData = &bind.MetaData{ ABI: "[{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", diff --git a/bindings/gen_lib_verifying.go b/bindings/gen_lib_verifying.go index b69d8478c..c3280d1b5 100644 --- a/bindings/gen_lib_verifying.go +++ b/bindings/gen_lib_verifying.go @@ -29,6 +29,17 @@ var ( _ = abi.ConvertType ) +// TaikoDataSlotB is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataSlotB struct { + NumBlocks uint64 + LastVerifiedBlockId uint64 + ProvingPaused bool + ReservedB1 uint8 + ReservedB2 uint16 + ReservedB3 uint32 + LastUnpausedAt uint64 +} + // LibVerifyingMetaData contains all meta data concerning the LibVerifying contract. var LibVerifyingMetaData = &bind.MetaData{ ABI: "[{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", diff --git a/bindings/gen_taiko_l1.go b/bindings/gen_taiko_l1.go index d089cbc83..60f958381 100644 --- a/bindings/gen_taiko_l1.go +++ b/bindings/gen_taiko_l1.go @@ -29,36 +29,6 @@ var ( _ = abi.ConvertType ) -// TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataBlock struct { - MetaHash [32]byte - AssignedProver common.Address - LivenessBond *big.Int - BlockId uint64 - ProposedAt uint64 - ProposedIn uint64 - NextTransitionId uint32 - VerifiedTransitionId uint32 -} - -// TaikoDataBlockMetadata is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataBlockMetadata struct { - L1Hash [32]byte - Difficulty [32]byte - BlobHash [32]byte - ExtraData [32]byte - DepositsHash [32]byte - Coinbase common.Address - Id uint64 - GasLimit uint32 - Timestamp uint64 - L1Height uint64 - MinTier uint16 - BlobUsed bool - ParentMetaHash [32]byte - Sender common.Address -} - // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { ChainId uint64 @@ -70,13 +40,6 @@ type TaikoDataConfig struct { BlockSyncThreshold uint8 } -// TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataEthDeposit struct { - Recipient common.Address - Amount *big.Int - Id uint64 -} - // TaikoDataSlotA is an auto generated low-level Go binding around an user-defined struct. type TaikoDataSlotA struct { GenesisHeight uint64 @@ -85,25 +48,6 @@ type TaikoDataSlotA struct { LastSynecdAt uint64 } -// TaikoDataSlotB is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataSlotB struct { - NumBlocks uint64 - LastVerifiedBlockId uint64 - ProvingPaused bool - ReservedB1 uint8 - ReservedB2 uint16 - ReservedB3 uint32 - LastUnpausedAt uint64 -} - -// TaikoDataTransition is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataTransition struct { - ParentHash [32]byte - BlockHash [32]byte - StateRoot [32]byte - Graffiti [32]byte -} - // TaikoDataTransitionState is an auto generated low-level Go binding around an user-defined struct. type TaikoDataTransitionState struct { Key [32]byte diff --git a/pkg/rpc/methods.go b/pkg/rpc/methods.go index 74a986b45..c609d4959 100644 --- a/pkg/rpc/methods.go +++ b/pkg/rpc/methods.go @@ -12,7 +12,6 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/miner" @@ -24,10 +23,10 @@ import ( var ( // errSyncing is returned when the L2 execution engine is syncing. - errSyncing = errors.New("syncing") - errEmptyTiersList = errors.New("empty proof tiers list in protocol") - waitL1OriginPollingInterval = 3 * time.Second - defaultWaitL1OriginTimeout = 3 * time.Minute + errSyncing = errors.New("syncing") + errEmptyTiersList = errors.New("empty proof tiers list in protocol") + rpcPollingInterval = 3 * time.Second + defaultWaitTimeout = 3 * time.Minute ) // ensureGenesisMatched fetches the L2 genesis block from TaikoL1 contract, @@ -203,45 +202,47 @@ func (c *Client) L2ParentByBlockID(ctx context.Context, blockID *big.Int) (*type return c.L2.HeaderByHash(ctxWithTimeout, parentHash) } -// WaitL1Origin keeps waiting until the L1Origin with given block ID appears on the L2 execution engine. -func (c *Client) WaitL1Origin(ctx context.Context, blockID *big.Int) (*rawdb.L1Origin, error) { +func (c *Client) WaitL2Header(ctx context.Context, blockID *big.Int) (*types.Header, error) { var ( - l1Origin *rawdb.L1Origin - err error + ctxWithTimeout = ctx + cancel context.CancelFunc + header *types.Header + err error ) - ticker := time.NewTicker(waitL1OriginPollingInterval) + ticker := time.NewTicker(rpcPollingInterval) defer ticker.Stop() - var ( - ctxWithTimeout = ctx - cancel context.CancelFunc - ) if _, ok := ctx.Deadline(); !ok { - ctxWithTimeout, cancel = context.WithTimeout(ctx, defaultWaitL1OriginTimeout) + ctxWithTimeout, cancel = context.WithTimeout(ctx, defaultWaitTimeout) defer cancel() } - log.Debug("Start fetching L1Origin from L2 execution engine", "blockID", blockID) + log.Debug("Start fetching block header from L2 execution engine", "blockID", blockID) + for ; true; <-ticker.C { if ctxWithTimeout.Err() != nil { return nil, ctxWithTimeout.Err() } - l1Origin, err = c.L2.L1OriginByID(ctxWithTimeout, blockID) + header, err = c.L2.HeaderByNumber(ctxWithTimeout, blockID) if err != nil { - log.Debug("L1Origin from L2 execution engine not found, keep retrying", "blockID", blockID, "error", err) + log.Debug( + "Fetch block header from L2 execution engine not found, keep retrying", + "blockID", blockID, + "error", err, + ) continue } - if l1Origin == nil { + if header == nil { continue } - return l1Origin, nil + return header, nil } - return nil, fmt.Errorf("failed to fetch L1Origin from L2 execution engine, blockID: %d", blockID) + return nil, fmt.Errorf("failed to fetch block header from L2 execution engine, blockID: %d", blockID) } // GetPoolContent fetches the transactions list from L2 execution engine's transactions pool with given diff --git a/pkg/rpc/utils.go b/pkg/rpc/utils.go index c84a6e997..5771d3d38 100644 --- a/pkg/rpc/utils.go +++ b/pkg/rpc/utils.go @@ -119,7 +119,10 @@ func GetBlockProofStatus( defer cancel() // Get the local L2 parent header. - var parent *types.Header + var ( + parent *types.Header + err error + ) if id.Cmp(common.Big1) == 0 { header, err := cli.L2.HeaderByNumber(ctxWithTimeout, common.Big0) if err != nil { @@ -128,12 +131,7 @@ func GetBlockProofStatus( parent = header } else { - parentL1Origin, err := cli.WaitL1Origin(ctxWithTimeout, new(big.Int).Sub(id, common.Big1)) - if err != nil { - return nil, err - } - - if parent, err = cli.L2.HeaderByHash(ctxWithTimeout, parentL1Origin.L2BlockHash); err != nil { + if parent, err = cli.L2.HeaderByNumber(ctxWithTimeout, new(big.Int).Sub(id, common.Big1)); err != nil { return nil, err } } @@ -153,20 +151,15 @@ func GetBlockProofStatus( return &BlockProofStatus{IsSubmitted: false, ParentHeader: parent}, nil } - l1Origin, err := cli.WaitL1Origin(ctxWithTimeout, id) - if err != nil { - return nil, err - } - - header, err := cli.L2.HeaderByHash(ctxWithTimeout, l1Origin.L2BlockHash) + header, err := cli.WaitL2Header(ctxWithTimeout, id) if err != nil { return nil, err } - if l1Origin.L2BlockHash != transition.BlockHash || transition.StateRoot != header.Root { + if header.Hash() != transition.BlockHash || transition.StateRoot != header.Root { log.Info( "Different block hash or state root detected, try submitting a contest", - "localBlockHash", common.BytesToHash(l1Origin.L2BlockHash[:]), + "localBlockHash", header.Hash(), "protocolTransitionBlockHash", common.BytesToHash(transition.BlockHash[:]), "localStateRoot", header.Root, "protocolTransitionStateRoot", common.BytesToHash(transition.StateRoot[:]), diff --git a/prover/event_handler/block_proposed.go b/prover/event_handler/block_proposed.go index 83a68f8d4..b7ea8fde7 100644 --- a/prover/event_handler/block_proposed.go +++ b/prover/event_handler/block_proposed.go @@ -93,8 +93,8 @@ func (h *BlockProposedEventHandler) Handle( } // Wait for the corresponding L2 block being mined in node. - if _, err := h.rpc.WaitL1Origin(ctx, e.BlockId); err != nil { - return fmt.Errorf("failed to wait L1Origin (eventID %d): %w", e.BlockId, err) + if _, err := h.rpc.WaitL2Header(ctx, e.BlockId); err != nil { + return fmt.Errorf("failed to wait L2 header (eventID %d): %w", e.BlockId, err) } // Check if the L1 chain has reorged at first. diff --git a/prover/guardian_prover_heartbeater/guardian_prover.go b/prover/guardian_prover_heartbeater/guardian_prover.go index fb66fbcbb..eb9ca627b 100644 --- a/prover/guardian_prover_heartbeater/guardian_prover.go +++ b/prover/guardian_prover_heartbeater/guardian_prover.go @@ -197,7 +197,7 @@ func (s *GuardianProverHeartBeater) signBlock(ctx context.Context, blockID *big. "eventBlockID", blockID.Uint64(), ) - if _, err := s.rpc.WaitL1Origin(ctx, blockID); err != nil { + if _, err := s.rpc.WaitL2Header(ctx, blockID); err != nil { return nil, nil, err } diff --git a/prover/proof_submitter/proof_submitter.go b/prover/proof_submitter/proof_submitter.go index e905af3a6..9085d881a 100644 --- a/prover/proof_submitter/proof_submitter.go +++ b/prover/proof_submitter/proof_submitter.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-client/bindings" @@ -65,24 +66,18 @@ func NewProofSubmitter( // RequestProof implements the Submitter interface. func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error { - l1Origin, err := s.rpc.WaitL1Origin(ctx, event.BlockId) + header, err := s.rpc.WaitL2Header(ctx, event.BlockId) if err != nil { - return fmt.Errorf("failed to fetch l1Origin, blockID: %d, error: %w", event.BlockId, err) + return fmt.Errorf("failed to fetch l2 Header, blockID: %d, error: %w", event.BlockId, err) } - // Get the header of the block to prove from L2 execution engine. - block, err := s.rpc.L2.BlockByHash(ctx, l1Origin.L2BlockHash) - if err != nil { - return fmt.Errorf("failed to get the current L2 block by hash (%s): %w", l1Origin.L2BlockHash, err) - } - - if block.Transactions().Len() == 0 { + if header.TxHash == types.EmptyTxsHash { return errors.New("no transaction in block") } - parent, err := s.rpc.L2.BlockByHash(ctx, block.ParentHash()) + parent, err := s.rpc.L2.BlockByHash(ctx, header.ParentHash) if err != nil { - return fmt.Errorf("failed to get the L2 parent block by hash (%s): %w", block.ParentHash(), err) + return fmt.Errorf("failed to get the L2 parent block by hash (%s): %w", header.ParentHash, err) } blockInfo, err := s.rpc.GetL2BlockInfo(ctx, event.BlockId) @@ -92,17 +87,17 @@ func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.Taiko // Request proof. opts := &proofProducer.ProofRequestOptions{ - BlockID: block.Number(), + BlockID: header.Number, ProverAddress: s.proverAddress, ProposeBlockTxHash: event.Raw.TxHash, TaikoL2: s.taikoL2Address, MetaHash: blockInfo.MetaHash, - BlockHash: block.Hash(), - ParentHash: block.ParentHash(), - StateRoot: block.Root(), + BlockHash: header.Hash(), + ParentHash: header.ParentHash, + StateRoot: header.Root, EventL1Hash: event.Raw.BlockHash, Graffiti: common.Bytes2Hex(s.graffiti[:]), - GasUsed: block.GasUsed(), + GasUsed: header.GasUsed, ParentGasUsed: parent.GasUsed(), } @@ -112,7 +107,7 @@ func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.Taiko opts, event.BlockId, &event.Meta, - block.Header(), + header, ) if err != nil { return fmt.Errorf("failed to request proof (id: %d): %w", event.BlockId, err) From e14d645707def7aec9d3cc154c734a9e680c3472 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 12 Apr 2024 15:13:41 +0800 Subject: [PATCH 2/3] feat(rpc): remove `WaitL1Origin()` method --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 1b1491c56..653f942d6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -2,7 +2,7 @@ name: "Push docker image to GCR" on: push: - branches: [main] + branches: [main,remove-wait-l1-origin] tags: - "v*" From d2df16a51f8057897da673471617cde9afb33e50 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 12 Apr 2024 15:13:46 +0800 Subject: [PATCH 3/3] feat(rpc): remove `WaitL1Origin()` method --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 653f942d6..1b1491c56 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -2,7 +2,7 @@ name: "Push docker image to GCR" on: push: - branches: [main,remove-wait-l1-origin] + branches: [main] tags: - "v*"