|
package coordinator
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"math/big"
|
|
"path"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
"github.com/hermeznetwork/hermez-node/common"
|
|
"github.com/hermeznetwork/hermez-node/eth"
|
|
"github.com/hermeznetwork/hermez-node/prover"
|
|
"github.com/hermeznetwork/tracerr"
|
|
)
|
|
|
|
// Status is used to mark the status of the batch
|
|
type Status string
|
|
|
|
const (
|
|
// StatusPending marks the Tx as Pending
|
|
StatusPending Status = "pending"
|
|
// StatusForged marks the batch as forged internally
|
|
StatusForged Status = "forged"
|
|
// StatusProof marks the batch as proof calculated
|
|
StatusProof Status = "proof"
|
|
// StatusSent marks the EthTx as Sent
|
|
StatusSent Status = "sent"
|
|
// StatusMined marks the EthTx as Mined
|
|
StatusMined Status = "mined"
|
|
// StatusFailed marks the EthTx as Failed
|
|
StatusFailed Status = "failed"
|
|
)
|
|
|
|
// Debug information related to the Batch
|
|
type Debug struct {
|
|
// StartTimestamp of is the time of batch start
|
|
StartTimestamp time.Time
|
|
// SendTimestamp the time of batch sent to ethereum
|
|
SendTimestamp time.Time
|
|
// Status of the Batch
|
|
Status Status
|
|
// StartBlockNum is the blockNum when the Batch was started
|
|
StartBlockNum int64
|
|
// MineBlockNum is the blockNum in which the batch was mined
|
|
MineBlockNum int64
|
|
// SendBlockNum is the blockNum when the batch was sent to ethereum
|
|
SendBlockNum int64
|
|
// ResendNum is the number of times the tx has been resent
|
|
ResendNum int
|
|
// LastScheduledL1BatchBlockNum is the blockNum when the last L1Batch
|
|
// was scheduled
|
|
LastScheduledL1BatchBlockNum int64
|
|
// LastL1BatchBlock is the blockNum in which the last L1Batch was
|
|
// synced
|
|
LastL1BatchBlock int64
|
|
// LastL1BatchBlockDelta is the number of blocks after the last L1Batch
|
|
LastL1BatchBlockDelta int64
|
|
// L1BatchBlockScheduleDeadline is the number of blocks after the last
|
|
// L1Batch after which an L1Batch will be scheduled
|
|
L1BatchBlockScheduleDeadline int64
|
|
// StartToMineBlocksDelay is the number of blocks that happen between
|
|
// scheduling a batch and having it mined
|
|
StartToMineBlocksDelay int64
|
|
// StartToSendDelay is the delay between starting a batch and sending
|
|
// it to ethereum, in seconds
|
|
StartToSendDelay float64
|
|
// StartToMineDelay is the delay between starting a batch and having
|
|
// it mined in seconds
|
|
StartToMineDelay float64
|
|
// SendToMineDelay is the delay between sending a batch tx and having
|
|
// it mined in seconds
|
|
SendToMineDelay float64
|
|
}
|
|
|
|
// BatchInfo contans the Batch information
|
|
type BatchInfo struct {
|
|
PipelineNum int
|
|
BatchNum common.BatchNum
|
|
ServerProof prover.Client
|
|
ZKInputs *common.ZKInputs
|
|
Proof *prover.Proof
|
|
PublicInputs []*big.Int
|
|
L1Batch bool
|
|
VerifierIdx uint8
|
|
L1UserTxs []common.L1Tx
|
|
L1CoordTxs []common.L1Tx
|
|
L1CoordinatorTxsAuths [][]byte
|
|
L2Txs []common.L2Tx
|
|
CoordIdxs []common.Idx
|
|
ForgeBatchArgs *eth.RollupForgeBatchArgs
|
|
Auth *bind.TransactOpts `json:"-"`
|
|
EthTx *types.Transaction
|
|
EthTxErr error
|
|
// SendTimestamp the time of batch sent to ethereum
|
|
SendTimestamp time.Time
|
|
Receipt *types.Receipt
|
|
// Fail is true if:
|
|
// - The receipt status is failed
|
|
// - A previous parent batch is failed
|
|
Fail bool
|
|
Debug Debug
|
|
}
|
|
|
|
// DebugStore is a debug function to store the BatchInfo as a json text file in
|
|
// storePath. The filename contains the batchNumber followed by a timestamp of
|
|
// batch start.
|
|
func (b *BatchInfo) DebugStore(storePath string) error {
|
|
batchJSON, err := json.MarshalIndent(b, "", " ")
|
|
if err != nil {
|
|
return tracerr.Wrap(err)
|
|
}
|
|
// nolint reason: hardcoded 1_000_000 is the number of nanoseconds in a
|
|
// millisecond
|
|
//nolint:gomnd
|
|
filename := fmt.Sprintf("%08d-%v.%03d.json", b.BatchNum,
|
|
b.Debug.StartTimestamp.Unix(), b.Debug.StartTimestamp.Nanosecond()/1_000_000)
|
|
// nolint reason: 0640 allows rw to owner and r to group
|
|
//nolint:gosec
|
|
return ioutil.WriteFile(path.Join(storePath, filename), batchJSON, 0640)
|
|
}
|