package historydb
|
|
|
|
import (
|
|
"time"
|
|
|
|
ethCommon "github.com/ethereum/go-ethereum/common"
|
|
"github.com/hermeznetwork/hermez-node/common"
|
|
"github.com/hermeznetwork/tracerr"
|
|
"github.com/russross/meddler"
|
|
)
|
|
|
|
const (
|
|
createAccountExtraFeePercentage float64 = 2
|
|
createAccountInternalExtraFeePercentage float64 = 2.5
|
|
)
|
|
|
|
type Period struct {
|
|
SlotNum int64 `json:"slotNum"`
|
|
FromBlock int64 `json:"fromBlock"`
|
|
ToBlock int64 `json:"toBlock"`
|
|
FromTimestamp time.Time `json:"fromTimestamp"`
|
|
ToTimestamp time.Time `json:"toTimestamp"`
|
|
}
|
|
|
|
type NextForgerAPI struct {
|
|
Coordinator CoordinatorAPI `json:"coordinator"`
|
|
Period Period `json:"period"`
|
|
}
|
|
|
|
type NetworkAPI struct {
|
|
LastEthBlock int64 `json:"lastEthereumBlock"`
|
|
LastSyncBlock int64 `json:"lastSynchedBlock"`
|
|
LastBatch *BatchAPI `json:"lastBatch"`
|
|
CurrentSlot int64 `json:"currentSlot"`
|
|
NextForgers []NextForgerAPI `json:"nextForgers"`
|
|
}
|
|
|
|
// NodePublicConfig is the configuration of the node that is exposed via API
|
|
type NodePublicConfig struct {
|
|
// ForgeDelay in seconds
|
|
ForgeDelay float64 `json:"forgeDelay"`
|
|
}
|
|
|
|
type StateAPI struct {
|
|
// NodePublicConfig is the configuration of the node that is exposed via API
|
|
NodePublicConfig NodePublicConfig `json:"nodeConfig"`
|
|
Network NetworkAPI `json:"network"`
|
|
Metrics MetricsAPI `json:"metrics"`
|
|
Rollup RollupVariablesAPI `json:"rollup"`
|
|
Auction AuctionVariablesAPI `json:"auction"`
|
|
WithdrawalDelayer common.WDelayerVariables `json:"withdrawalDelayer"`
|
|
RecommendedFee common.RecommendedFee `json:"recommendedFee"`
|
|
}
|
|
|
|
type Constants struct {
|
|
// RollupConstants common.RollupConstants
|
|
// AuctionConstants common.AuctionConstants
|
|
// WDelayerConstants common.WDelayerConstants
|
|
common.SCConsts
|
|
ChainID uint16
|
|
HermezAddress ethCommon.Address
|
|
}
|
|
|
|
type NodeConfig struct {
|
|
MaxPoolTxs uint32 `meddler:"max_pool_txs"`
|
|
MinFeeUSD float64 `meddler:"min_fee"`
|
|
}
|
|
|
|
type NodeInfo struct {
|
|
ItemID int `meddler:"item_id,pk"`
|
|
APIState *StateAPI `meddler:"state,json"`
|
|
NodeConfig *NodeConfig `meddler:"config,json"`
|
|
Constants *Constants `meddler:"constants,json"`
|
|
}
|
|
|
|
func (hdb *HistoryDB) GetNodeInfo() (*NodeInfo, error) {
|
|
ni := &NodeInfo{}
|
|
err := meddler.QueryRow(
|
|
hdb.dbRead, ni, `SELECT * FROM node_info WHERE item_id = 1;`,
|
|
)
|
|
return ni, tracerr.Wrap(err)
|
|
}
|
|
|
|
func (hdb *HistoryDB) GetConstants() (*Constants, error) {
|
|
var nodeInfo NodeInfo
|
|
err := meddler.QueryRow(
|
|
hdb.dbRead, &nodeInfo,
|
|
"SELECT constants FROM node_info WHERE item_id = 1;",
|
|
)
|
|
return nodeInfo.Constants, tracerr.Wrap(err)
|
|
}
|
|
|
|
func (hdb *HistoryDB) SetConstants(constants *Constants) error {
|
|
_constants := struct {
|
|
Constants *Constants `meddler:"constants,json"`
|
|
}{constants}
|
|
values, err := meddler.Default.Values(&_constants, false)
|
|
if err != nil {
|
|
return tracerr.Wrap(err)
|
|
}
|
|
_, err = hdb.dbWrite.Exec(
|
|
"UPDATE node_info SET constants = $1 WHERE item_id = 1;",
|
|
values[0],
|
|
)
|
|
return tracerr.Wrap(err)
|
|
}
|
|
|
|
func (hdb *HistoryDB) GetStateInternalAPI() (*StateAPI, error) {
|
|
return hdb.getStateAPI(hdb.dbRead)
|
|
}
|
|
|
|
func (hdb *HistoryDB) getStateAPI(d meddler.DB) (*StateAPI, error) {
|
|
var nodeInfo NodeInfo
|
|
err := meddler.QueryRow(
|
|
d, &nodeInfo,
|
|
"SELECT state FROM node_info WHERE item_id = 1;",
|
|
)
|
|
return nodeInfo.APIState, tracerr.Wrap(err)
|
|
}
|
|
|
|
func (hdb *HistoryDB) SetAPIState(apiState *StateAPI) error {
|
|
_apiState := struct {
|
|
APIState *StateAPI `meddler:"state,json"`
|
|
}{apiState}
|
|
values, err := meddler.Default.Values(&_apiState, false)
|
|
if err != nil {
|
|
return tracerr.Wrap(err)
|
|
}
|
|
_, err = hdb.dbWrite.Exec(
|
|
"UPDATE node_info SET state = $1 WHERE item_id = 1;",
|
|
values[0],
|
|
)
|
|
return tracerr.Wrap(err)
|
|
}
|
|
|
|
func (hdb *HistoryDB) GetNodeConfig() (*NodeConfig, error) {
|
|
var nodeInfo NodeInfo
|
|
err := meddler.QueryRow(
|
|
hdb.dbRead, &nodeInfo,
|
|
"SELECT config FROM node_info WHERE item_id = 1;",
|
|
)
|
|
return nodeInfo.NodeConfig, tracerr.Wrap(err)
|
|
}
|
|
|
|
func (hdb *HistoryDB) SetNodeConfig(nodeConfig *NodeConfig) error {
|
|
_nodeConfig := struct {
|
|
NodeConfig *NodeConfig `meddler:"config,json"`
|
|
}{nodeConfig}
|
|
values, err := meddler.Default.Values(&_nodeConfig, false)
|
|
if err != nil {
|
|
return tracerr.Wrap(err)
|
|
}
|
|
_, err = hdb.dbWrite.Exec(
|
|
"UPDATE config SET state = $1 WHERE item_id = 1;",
|
|
values[0],
|
|
)
|
|
return tracerr.Wrap(err)
|
|
}
|
|
|
|
// func (hdb *HistoryDB) SetInitialNodeInfo(maxPoolTxs uint32, minFeeUSD float64, constants *Constants) error {
|
|
// ni := &NodeInfo{
|
|
// MaxPoolTxs: &maxPoolTxs,
|
|
// MinFeeUSD: &minFeeUSD,
|
|
// Constants: constants,
|
|
// }
|
|
// return tracerr.Wrap(meddler.Insert(hdb.dbWrite, "node_info", ni))
|
|
// }
|
|
|
|
// apiSlotToBigInts converts from [6]*apitypes.BigIntStr to [6]*big.Int
|
|
// func apiSlotToBigInts(defaultSlotSetBid [6]*apitypes.BigIntStr) ([6]*big.Int, error) {
|
|
// var slots [6]*big.Int
|
|
//
|
|
// for i, slot := range defaultSlotSetBid {
|
|
// bigInt, ok := new(big.Int).SetString(string(*slot), 10)
|
|
// if !ok {
|
|
// return slots, tracerr.Wrap(fmt.Errorf("can't convert %T into big.Int", slot))
|
|
// }
|
|
// slots[i] = bigInt
|
|
// }
|
|
//
|
|
// return slots, nil
|
|
// }
|
|
|
|
// func (hdb *HistoryDB) updateNodeInfo(setUpdatedNodeInfo func(*sqlx.Tx, *NodeInfo) error) error {
|
|
// // Create a SQL transaction or read and update atomicaly
|
|
// txn, err := hdb.dbWrite.Beginx()
|
|
// if err != nil {
|
|
// return tracerr.Wrap(err)
|
|
// }
|
|
// defer func() {
|
|
// if err != nil {
|
|
// db.Rollback(txn)
|
|
// }
|
|
// }()
|
|
// // Read current node info
|
|
// ni := &NodeInfo{}
|
|
// if err := meddler.QueryRow(
|
|
// txn, ni, "SELECT * FROM node_info;",
|
|
// ); err != nil {
|
|
// return tracerr.Wrap(err)
|
|
// }
|
|
// // Update NodeInfo struct
|
|
// if err := setUpdatedNodeInfo(txn, ni); err != nil {
|
|
// return tracerr.Wrap(err)
|
|
// }
|
|
// // Update NodeInfo at DB
|
|
// if _, err := txn.Exec("DELETE FROM node_info;"); err != nil {
|
|
// return tracerr.Wrap(err)
|
|
// }
|
|
// if err := meddler.Insert(txn, "node_info", ni); err != nil {
|
|
// return tracerr.Wrap(err)
|
|
// }
|
|
// // Commit NodeInfo update
|
|
// return tracerr.Wrap(txn.Commit())
|
|
// }
|