mirror of
https://github.com/scroll-tech/scroll.git
synced 2026-01-14 16:37:56 -05:00
199 lines
8.2 KiB
Go
199 lines
8.2 KiB
Go
package orm
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
"github.com/scroll-tech/go-ethereum/common"
|
|
"github.com/scroll-tech/go-ethereum/core/types"
|
|
)
|
|
|
|
// MsgStatus represents current layer1 transaction processing status
|
|
type MsgStatus int
|
|
|
|
const (
|
|
// MsgUndefined : undefined msg status
|
|
MsgUndefined MsgStatus = iota
|
|
|
|
// MsgPending represents the from_layer message status is pending
|
|
MsgPending
|
|
|
|
// MsgSubmitted represents the from_layer message status is submitted
|
|
MsgSubmitted
|
|
|
|
// MsgConfirmed represents the from_layer message status is confirmed
|
|
MsgConfirmed
|
|
|
|
// MsgFailed represents the from_layer message status is failed
|
|
MsgFailed
|
|
|
|
// MsgExpired represents the from_layer message status is expired
|
|
MsgExpired
|
|
)
|
|
|
|
// L1Message is structure of stored layer1 bridge message
|
|
type L1Message struct {
|
|
Nonce uint64 `json:"nonce" db:"nonce"`
|
|
MsgHash string `json:"msg_hash" db:"msg_hash"`
|
|
Height uint64 `json:"height" db:"height"`
|
|
Sender string `json:"sender" db:"sender"`
|
|
Value string `json:"value" db:"value"`
|
|
Fee string `json:"fee" db:"fee"`
|
|
GasLimit uint64 `json:"gas_limit" db:"gas_limit"`
|
|
Deadline uint64 `json:"deadline" db:"deadline"`
|
|
Target string `json:"target" db:"target"`
|
|
Calldata string `json:"calldata" db:"calldata"`
|
|
Layer1Hash string `json:"layer1_hash" db:"layer1_hash"`
|
|
Layer2Hash string `json:"layer2_hash" db:"layer2_hash"`
|
|
Status MsgStatus `json:"status" db:"status"`
|
|
}
|
|
|
|
// L2Message is structure of stored layer2 bridge message
|
|
type L2Message struct {
|
|
Nonce uint64 `json:"nonce" db:"nonce"`
|
|
MsgHash string `json:"msg_hash" db:"msg_hash"`
|
|
Height uint64 `json:"height" db:"height"`
|
|
Sender string `json:"sender" db:"sender"`
|
|
Value string `json:"value" db:"value"`
|
|
Fee string `json:"fee" db:"fee"`
|
|
GasLimit uint64 `json:"gas_limit" db:"gas_limit"`
|
|
Deadline uint64 `json:"deadline" db:"deadline"`
|
|
Target string `json:"target" db:"target"`
|
|
Calldata string `json:"calldata" db:"calldata"`
|
|
Layer2Hash string `json:"layer2_hash" db:"layer2_hash"`
|
|
Layer1Hash string `json:"layer1_hash" db:"layer1_hash"`
|
|
Status MsgStatus `json:"status" db:"status"`
|
|
}
|
|
|
|
// BlockInfo is structure of stored `block_trace` without `trace`
|
|
type BlockInfo struct {
|
|
Number uint64 `json:"number" db:"number"`
|
|
Hash string `json:"hash" db:"hash"`
|
|
ParentHash string `json:"parent_hash" db:"parent_hash"`
|
|
BatchID sql.NullString `json:"batch_id" db:"batch_id"`
|
|
TxNum uint64 `json:"tx_num" db:"tx_num"`
|
|
GasUsed uint64 `json:"gas_used" db:"gas_used"`
|
|
BlockTimestamp uint64 `json:"block_timestamp" db:"block_timestamp"`
|
|
}
|
|
|
|
// RollerProveStatus is the roller prove status of a block batch (session)
|
|
type RollerProveStatus int32
|
|
|
|
const (
|
|
// RollerAssigned indicates roller assigned but has not submitted proof
|
|
RollerAssigned RollerProveStatus = iota
|
|
// RollerProofValid indicates roller has submitted valid proof
|
|
RollerProofValid
|
|
// RollerProofInvalid indicates roller has submitted invalid proof
|
|
RollerProofInvalid
|
|
)
|
|
|
|
func (s RollerProveStatus) String() string {
|
|
switch s {
|
|
case RollerAssigned:
|
|
return "RollerAssigned"
|
|
case RollerProofValid:
|
|
return "RollerProofValid"
|
|
case RollerProofInvalid:
|
|
return "RollerProofInvalid"
|
|
default:
|
|
return fmt.Sprintf("Bad Value: %d", int32(s))
|
|
}
|
|
}
|
|
|
|
// RollerStatus is the roller name and roller prove status
|
|
type RollerStatus struct {
|
|
PublicKey string `json:"public_key"`
|
|
Name string `json:"name"`
|
|
Status RollerProveStatus `json:"status"`
|
|
}
|
|
|
|
// SessionInfo is assigned rollers info of a block batch (session)
|
|
type SessionInfo struct {
|
|
ID string `json:"id"`
|
|
Rollers map[string]*RollerStatus `json:"rollers"`
|
|
StartTimestamp int64 `json:"start_timestamp"`
|
|
}
|
|
|
|
// BlockTraceOrm block_trace operation interface
|
|
type BlockTraceOrm interface {
|
|
Exist(number uint64) (bool, error)
|
|
GetBlockTracesLatestHeight() (int64, error)
|
|
GetBlockTraces(fields map[string]interface{}, args ...string) ([]*types.BlockTrace, error)
|
|
GetBlockInfos(fields map[string]interface{}, args ...string) ([]*BlockInfo, error)
|
|
// GetUnbatchedBlocks add `GetUnbatchedBlocks` because `GetBlockInfos` cannot support query "batch_id is NULL"
|
|
GetUnbatchedBlocks(fields map[string]interface{}, args ...string) ([]*BlockInfo, error)
|
|
GetHashByNumber(number uint64) (*common.Hash, error)
|
|
DeleteTracesByBatchID(batchID string) error
|
|
InsertBlockTraces(blockTraces []*types.BlockTrace) error
|
|
SetBatchIDForBlocksInDBTx(dbTx *sqlx.Tx, numbers []uint64, batchID string) error
|
|
}
|
|
|
|
// SessionInfoOrm sessions info operation inte
|
|
type SessionInfoOrm interface {
|
|
GetSessionInfosByIDs(ids []string) ([]*SessionInfo, error)
|
|
SetSessionInfo(rollersInfo *SessionInfo) error
|
|
}
|
|
|
|
// BlockBatchOrm block_batch operation interface
|
|
type BlockBatchOrm interface {
|
|
GetBlockBatches(fields map[string]interface{}, args ...string) ([]*BlockBatch, error)
|
|
GetProvingStatusByID(id string) (ProvingStatus, error)
|
|
GetVerifiedProofAndInstanceByID(id string) ([]byte, []byte, error)
|
|
UpdateProofByID(ctx context.Context, id string, proof, instanceCommitments []byte, proofTimeSec uint64) error
|
|
UpdateProvingStatus(id string, status ProvingStatus) error
|
|
ResetProvingStatusFor(before ProvingStatus) error
|
|
NewBatchInDBTx(dbTx *sqlx.Tx, startBlock *BlockInfo, endBlock *BlockInfo, parentHash string, totalTxNum uint64, gasUsed uint64) (string, error)
|
|
BatchRecordExist(id string) (bool, error)
|
|
GetBatchesByRollupStatus(status RollupStatus, limit uint64) ([]string, error)
|
|
GetPendingBatches(limit uint64) ([]string, error)
|
|
GetCommittedBatches(limit uint64) ([]string, error)
|
|
GetRollupStatus(id string) (RollupStatus, error)
|
|
GetRollupStatusByIDList(ids []string) ([]RollupStatus, error)
|
|
GetLatestFinalizedBatch() (*BlockBatch, error)
|
|
UpdateRollupStatus(ctx context.Context, id string, status RollupStatus) error
|
|
UpdateCommitTxHashAndRollupStatus(ctx context.Context, id string, commitTxHash string, status RollupStatus) error
|
|
UpdateFinalizeTxHashAndRollupStatus(ctx context.Context, id string, finalizeTxHash string, status RollupStatus) error
|
|
GetAssignedBatchIDs() ([]string, error)
|
|
UpdateSkippedBatches() (int64, error)
|
|
|
|
GetCommitTxHash(id string) (sql.NullString, error) // for unit tests only
|
|
GetFinalizeTxHash(id string) (sql.NullString, error) // for unit tests only
|
|
}
|
|
|
|
// L1MessageOrm is layer1 message db interface
|
|
type L1MessageOrm interface {
|
|
GetL1MessageByNonce(nonce uint64) (*L1Message, error)
|
|
GetL1MessageByMsgHash(msgHash string) (*L1Message, error)
|
|
GetL1MessagesByStatus(status MsgStatus, limit uint64) ([]*L1Message, error)
|
|
GetL1ProcessedNonce() (int64, error)
|
|
GetL1Messages(fields map[string]interface{}, args ...string) ([]*L1Message, error)
|
|
SaveL1Messages(ctx context.Context, messages []*L1Message) error
|
|
UpdateLayer2Hash(ctx context.Context, msgHash string, layer2Hash string) error
|
|
UpdateLayer1Status(ctx context.Context, msgHash string, status MsgStatus) error
|
|
UpdateLayer1StatusAndLayer2Hash(ctx context.Context, msgHash string, status MsgStatus, layer2Hash string) error
|
|
GetLayer1LatestWatchedHeight() (int64, error)
|
|
|
|
GetRelayL1MessageTxHash(nonce uint64) (sql.NullString, error) // for unit tests only
|
|
}
|
|
|
|
// L2MessageOrm is layer2 message db interface
|
|
type L2MessageOrm interface {
|
|
GetL2MessageByNonce(nonce uint64) (*L2Message, error)
|
|
GetL2MessageByMsgHash(msgHash string) (*L2Message, error)
|
|
MessageProofExist(nonce uint64) (bool, error)
|
|
GetMessageProofByNonce(nonce uint64) (string, error)
|
|
GetL2Messages(fields map[string]interface{}, args ...string) ([]*L2Message, error)
|
|
GetL2ProcessedNonce() (int64, error)
|
|
SaveL2Messages(ctx context.Context, messages []*L2Message) error
|
|
UpdateLayer1Hash(ctx context.Context, msgHash string, layer1Hash string) error
|
|
UpdateLayer2Status(ctx context.Context, msgHash string, status MsgStatus) error
|
|
UpdateLayer2StatusAndLayer1Hash(ctx context.Context, msgHash string, status MsgStatus, layer1Hash string) error
|
|
UpdateMessageProof(ctx context.Context, nonce uint64, proof string) error
|
|
GetLayer2LatestWatchedHeight() (int64, error)
|
|
|
|
GetRelayL2MessageTxHash(nonce uint64) (sql.NullString, error) // for unit tests only
|
|
}
|