Merge pull request #210 from hermeznetwork/feature/api-config-const

Add config endpoint
This commit is contained in:
Eduard S
2020-10-21 13:30:00 +02:00
committed by GitHub
8 changed files with 261 additions and 91 deletions

View File

@@ -10,6 +10,7 @@ import (
) )
var h *historydb.HistoryDB var h *historydb.HistoryDB
var cg *configAPI
// var s *statedb.StateDB // Not 100% sure if this is needed // var s *statedb.StateDB // Not 100% sure if this is needed
// var l2 *l2db.L2DB // var l2 *l2db.L2DB
@@ -21,6 +22,7 @@ func SetAPIEndpoints(
hdb *historydb.HistoryDB, hdb *historydb.HistoryDB,
sdb *statedb.StateDB, sdb *statedb.StateDB,
l2db *l2db.L2DB, l2db *l2db.L2DB,
config *configAPI,
) error { ) error {
// Check input // Check input
// TODO: is stateDB only needed for explorer endpoints or for both? // TODO: is stateDB only needed for explorer endpoints or for both?
@@ -32,6 +34,7 @@ func SetAPIEndpoints(
} }
h = hdb h = hdb
cg = config
// s = sdb // s = sdb
// l2 = l2db // l2 = l2db

View File

@@ -24,6 +24,7 @@ import (
"github.com/hermeznetwork/hermez-node/db/historydb" "github.com/hermeznetwork/hermez-node/db/historydb"
"github.com/hermeznetwork/hermez-node/db/l2db" "github.com/hermeznetwork/hermez-node/db/l2db"
"github.com/hermeznetwork/hermez-node/db/statedb" "github.com/hermeznetwork/hermez-node/db/statedb"
"github.com/hermeznetwork/hermez-node/eth"
"github.com/hermeznetwork/hermez-node/log" "github.com/hermeznetwork/hermez-node/log"
"github.com/hermeznetwork/hermez-node/test" "github.com/hermeznetwork/hermez-node/test"
"github.com/iden3/go-iden3-crypto/babyjub" "github.com/iden3/go-iden3-crypto/babyjub"
@@ -130,6 +131,7 @@ func (tx *wrappedL2) L2() *common.L2Tx {
} }
var tc testCommon var tc testCommon
var config configAPI
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
// Init swagger // Init swagger
@@ -164,6 +166,48 @@ func TestMain(m *testing.M) {
l2DB := l2db.NewL2DB(database, 10, 100, 24*time.Hour) l2DB := l2db.NewL2DB(database, 10, 100, 24*time.Hour)
test.CleanL2DB(l2DB.DB()) test.CleanL2DB(l2DB.DB())
config.RollupConstants.ExchangeMultiplier = eth.RollupConstExchangeMultiplier
config.RollupConstants.ExitIdx = eth.RollupConstExitIDx
config.RollupConstants.ReservedIdx = eth.RollupConstReservedIDx
config.RollupConstants.LimitLoadAmount, _ = new(big.Int).SetString("340282366920938463463374607431768211456", 10)
config.RollupConstants.LimitL2TransferAmount, _ = new(big.Int).SetString("6277101735386680763835789423207666416102355444464034512896", 10)
config.RollupConstants.LimitTokens = eth.RollupConstLimitTokens
config.RollupConstants.L1CoordinatorTotalBytes = eth.RollupConstL1CoordinatorTotalBytes
config.RollupConstants.L1UserTotalBytes = eth.RollupConstL1UserTotalBytes
config.RollupConstants.MaxL1UserTx = eth.RollupConstMaxL1UserTx
config.RollupConstants.MaxL1Tx = eth.RollupConstMaxL1Tx
config.RollupConstants.InputSHAConstantBytes = eth.RollupConstInputSHAConstantBytes
config.RollupConstants.NumBuckets = eth.RollupConstNumBuckets
config.RollupConstants.MaxWithdrawalDelay = eth.RollupConstMaxWithdrawalDelay
var rollupPublicConstants eth.RollupPublicConstants
rollupPublicConstants.AbsoluteMaxL1L2BatchTimeout = 240
rollupPublicConstants.HermezAuctionContract = ethCommon.HexToAddress("0x500D1d6A4c7D8Ae28240b47c8FCde034D827fD5e")
rollupPublicConstants.HermezGovernanceDAOAddress = ethCommon.HexToAddress("0xeAD9C93b79Ae7C1591b1FB5323BD777E86e150d4")
rollupPublicConstants.SafetyAddress = ethCommon.HexToAddress("0xE5904695748fe4A84b40b3fc79De2277660BD1D3")
rollupPublicConstants.TokenHEZ = ethCommon.HexToAddress("0xf784709d2317D872237C4bC22f867d1BAe2913AB")
rollupPublicConstants.WithdrawDelayerContract = ethCommon.HexToAddress("0xD6C850aeBFDC46D7F4c207e445cC0d6B0919BDBe")
var verifier eth.RollupVerifierStruct
verifier.MaxTx = 512
verifier.NLevels = 32
rollupPublicConstants.Verifiers = append(rollupPublicConstants.Verifiers, verifier)
var auctionConstants eth.AuctionConstants
auctionConstants.BlocksPerSlot = 40
auctionConstants.GenesisBlockNum = 100
auctionConstants.GovernanceAddress = ethCommon.HexToAddress("0xeAD9C93b79Ae7C1591b1FB5323BD777E86e150d4")
auctionConstants.InitialMinimalBidding, _ = new(big.Int).SetString("10000000000000000000", 10)
auctionConstants.HermezRollup = ethCommon.HexToAddress("0xEa960515F8b4C237730F028cBAcF0a28E7F45dE0")
auctionConstants.TokenHEZ = ethCommon.HexToAddress("0xf784709d2317D872237C4bC22f867d1BAe2913AB")
var wdelayerConstants eth.WDelayerConstants
wdelayerConstants.HermezRollup = ethCommon.HexToAddress("0xEa960515F8b4C237730F028cBAcF0a28E7F45dE0")
wdelayerConstants.MaxEmergencyModeTime = uint64(1000000)
wdelayerConstants.MaxWithdrawalDelay = uint64(10000000)
config.RollupConstants.PublicConstants = rollupPublicConstants
config.AuctionConstants = auctionConstants
config.WDelayerConstants = wdelayerConstants
// Init API // Init API
api := gin.Default() api := gin.Default()
if err := SetAPIEndpoints( if err := SetAPIEndpoints(
@@ -173,6 +217,7 @@ func TestMain(m *testing.M) {
hdb, hdb,
sdb, sdb,
l2DB, l2DB,
&config,
); err != nil { ); err != nil {
panic(err) panic(err)
} }
@@ -996,6 +1041,14 @@ func assertTokensAPIs(t *testing.T, expected, actual []tokenAPI) {
} }
} }
func TestGetConfig(t *testing.T) {
endpoint := apiURL + "config"
var configTest configAPI
assert.NoError(t, doGoodReq("GET", endpoint, nil, &configTest))
assert.Equal(t, config, configTest)
assert.Equal(t, cg, &configTest)
}
func doGoodReqPaginated( func doGoodReqPaginated(
path, order string, path, order string,
iterStruct db.Paginationer, iterStruct db.Paginationer,

View File

@@ -2,6 +2,7 @@ package api
import ( import (
"encoding/base64" "encoding/base64"
"math/big"
"strconv" "strconv"
"time" "time"
@@ -9,6 +10,7 @@ import (
"github.com/hermeznetwork/hermez-node/common" "github.com/hermeznetwork/hermez-node/common"
"github.com/hermeznetwork/hermez-node/db" "github.com/hermeznetwork/hermez-node/db"
"github.com/hermeznetwork/hermez-node/db/historydb" "github.com/hermeznetwork/hermez-node/db/historydb"
"github.com/hermeznetwork/hermez-node/eth"
"github.com/iden3/go-iden3-crypto/babyjub" "github.com/iden3/go-iden3-crypto/babyjub"
"github.com/iden3/go-merkletree" "github.com/iden3/go-merkletree"
) )
@@ -248,3 +250,29 @@ func tokensToAPI(dbTokens []historydb.TokenRead) []tokenAPI {
} }
return apiTokens return apiTokens
} }
// Config
type rollupConstants struct {
PublicConstants eth.RollupPublicConstants `json:"publicConstants"`
MaxFeeIdxCoordinator int `json:"maxFeeIdxCoordinator"`
ReservedIdx int `json:"reservedIdx"`
ExitIdx int `json:"exitIdx"`
LimitLoadAmount *big.Int `json:"limitLoadAmount"`
LimitL2TransferAmount *big.Int `json:"limitL2TransferAmount"`
LimitTokens int `json:"limitTokens"`
L1CoordinatorTotalBytes int `json:"l1CoordinatorTotalBytes"`
L1UserTotalBytes int `json:"l1UserTotalBytes"`
MaxL1UserTx int `json:"maxL1UserTx"`
MaxL1Tx int `json:"maxL1Tx"`
InputSHAConstantBytes int `json:"inputSHAConstantBytes"`
NumBuckets int `json:"numBuckets"`
MaxWithdrawalDelay int `json:"maxWithdrawalDelay"`
ExchangeMultiplier int `json:"exchangeMultiplier"`
}
type configAPI struct {
RollupConstants rollupConstants `json:"hermez"`
AuctionConstants eth.AuctionConstants `json:"auction"`
WDelayerConstants eth.WDelayerConstants `json:"withdrawalDelayer"`
}

View File

@@ -198,7 +198,7 @@ func getState(c *gin.Context) {
} }
func getConfig(c *gin.Context) { func getConfig(c *gin.Context) {
c.JSON(http.StatusOK, cg)
} }
func getTokens(c *gin.Context) { func getTokens(c *gin.Context) {

View File

@@ -2330,104 +2330,175 @@ components:
type: object type: object
description: Constant configuration of the Hermez smart contract. description: Constant configuration of the Hermez smart contract.
properties: properties:
HEZTokenAddress: publicConstants:
allOf: type: object
- $ref: '#/components/schemas/EthereumAddress' description: Public Hermez smart contract constants
- description: Ethereum address of the HEZ token. properties:
- example: "0x444dc4262BCDbf85190C01c996b4C06a461d2430" tokenHEZ:
maxTxVerifiers: allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the HEZ token.
- example: "0x444dc4262BCDbf85190C01c996b4C06a461d2430"
absoluteMaxL1L2BatchTimeout:
type: integer
description: L1L2 Batch Timeout
example: 240
verifiers:
type: array
description: List of verifiers struct
items:
type: object
properties:
maxTx:
type: integer
description: Maximum rollup transactions in a batch
example: 512
nlevels:
type: integer
description: Number of levels of the circuit
example: 32
required:
- maxTx
- nlevels
additionalProperties: false
hermezAuctionContract:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the auction smart contract.
- example: "0x111dc4262BCDbf85190C01c996b4C06a461d2430"
hermezGovernanceDAOAddress:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the governanceDAO.
- example: "0x222dc4262BCDbf85190C01c996b4C06a461d2430"
safetyAddress:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the safety.
- example: "0x333dc4262BCDbf85190C01c996b4C06a461d2430"
withdrawDelayerContract:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the withdraw delayer contracts.
- example: "0x444dc4262BCDbf85190C01c996b4C06a461d2430"
required:
- tokenHEZ
- absoluteMaxL1L2BatchTimeout
- verifiers
- hermezAuctionContract
- hermezGovernanceDAOAddress
- safetyAddress
- withdrawDelayerContract
additionalProperties: false
maxFeeIdxCoordinator:
type: integer type: integer
description: Maximum transactions of the verifiers. description: is the maximum number of tokens the coordinator can use to collect fees.
example: 100 example: 64
maxLoadAmount: reservedIdx:
type: integer type: integer
description: Maximum load amount (L1 to L2) allowed. description: First 256 indexes reserved, first user index will be the 256.
example: 321 example: 255
maxAmount: exitIdx:
type: integer
description: Maximum amount (L2 to L2) allowed.
example: 837
maxTokens:
type: integer
description: Maximum number of different tokens that can be registered in the network.
example: 4294967295
reservedAccountIndex:
type: integer
description: First user index. Bellow this number the indexes are reserved for the protocol.
example: 256
lastAccountIndex:
type: integer
description: Biggest account index that can be registered.
example: 4294967295
exitAccountIndex:
type: integer type: integer
description: Account index used to indicate that a transaction is an `exit` or `force exit`. description: Account index used to indicate that a transaction is an `exit` or `force exit`.
example: 1 example: 1
L1CoordinatorBytes: limitLoadAmount:
type: integer
description: Maximum load amount (L1 to L2) allowed.
example: 321
limitL2TransferAmount:
type: integer
description: Maximum amount (L2 to L2) allowed.
example: 837
limitTokens:
type: integer
description: Maximum number of different tokens that can be registered in the network.
example: 4294967295
l1CoordinatorTotalBytes:
type: integer type: integer
description: Number of bytes that a L1 coordinator transaction has ([4 bytes] token + [32 bytes] babyjub + [65 bytes] compressedSignature). description: Number of bytes that a L1 coordinator transaction has ([4 bytes] token + [32 bytes] babyjub + [65 bytes] compressedSignature).
example: 23 example: 101
L1UserBytes: l1UserTotalBytes:
type: integer type: integer
description: Number of bytes that a L2 transaction has ([4 bytes] fromIdx + [4 bytes] toIdx + [2 bytes] amountFloat16 + [1 bytes] fee). description: Number of bytes that a L1 user transaction has ([20 bytes] fromEthAddr + [32 bytes] fromBjj-compressed + [6 bytes] fromIdx + [2 bytes] loadAmountFloat16 + [2 bytes] amountFloat16 + [4 bytes] tokenId + [6 bytes] toIdx).
example: 32 example: 72
L2Bytes: maxL1UserTx:
type: integer type: integer
description: Number of bytes that a L2 transaction has ([4 bytes] fromIdx + [4 bytes] toIdx + [2 bytes] amountFloat16 + [1 bytes] fee). description: Maximum L1-user transactions allowed to be queued in a batch.
example: 33 example: 128
maxL1Transactions: maxL1Tx:
type: integer type: integer
description: Maximum L1 transactions allowed to be queued in a batch. description: Maximum L1 transactions allowed to be queued in a batch.
example: 128 example: 256
maxL1UserTransactions: inputSHAConstantBytes:
type: integer type: integer
description: Maximum L1 transactions allowed to be queued in a batch by users (anyone who is not a coordinator). description: Input SHA constant bytes
example: 32 example: 18542
RField: numBuckets:
allOf:
- $ref: '#/components/schemas/BigInt'
- description: Modulus zkSNARK.
withdrawManager:
type: object
description: Constant configuration of the withdraw manager smart contract.
properties:
noLimit:
type: integer
description: Reserved bucket index when the token value is 0 USD.
example: 0
amountOfBuckets:
type: integer type: integer
description: Number of buckets description: Number of buckets
example: 5
maxWithdrawalDelay: maxWithdrawalDelay:
type: integer type: integer
description: Maximum delay to withdraw tokens. Time is measured in Ethereum blocks. description: Maximum delay to withdraw tokens. Time is measured in seconds.
example: 2 * 7 * 24 * 60 * 60
exchangeMultiplier:
type: integer
description: exchange multiplier
example: 1e14
required:
- publicConstants
- reservedIdx
- exitIdx
- limitLoadAmount
- limitL2TransferAmount
- limitTokens
- l1CoordinatorTotalBytes
- l1UserTotalBytes
- maxL1UserTx
- maxL1Tx
- inputSHAConstantBytes
- numBuckets
- maxWithdrawalDelay
- exchangeMultiplier
additionalProperties: false
auction: auction:
type: object type: object
description: Constant configuration of the auction smart contract. description: Constant configuration of the auction smart contract.
properties: properties:
HEZTokenAddress:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the HEZ token.
- example: "0x333dc4262BCDbf85190C01c996b4C06a461d2430"
rollupAddress:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the rollup smart contract.
- example: "0x222dc4262BCDbf85190C01c996b4C06a461d2430"
genesisBlockNum:
allOf:
- $ref: '#/components/schemas/EthBlockNum'
- description: Ethereum block number in which the smart contract starts operating.
delayGenesis:
type: integer
description: Time delay between `genesisBlockNum` and the beginning of the first block. Time is measured in Ethereum blocks.
blocksPerSlot: blocksPerSlot:
type: integer type: integer
description: Blocks per slot. description: Blocks per slot.
initialMinimalBidding: initialMinimalBidding:
type: integer type: integer
description: Minimum bid when no one has bid yet. description: Minimum bid when no one has bid yet.
genesisBlockNum:
allOf:
- $ref: '#/components/schemas/EthBlockNum'
- description: Ethereum block number in which the smart contract starts operating.
tokenHEZ:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the HEZ token.
- example: "0x333dc4262BCDbf85190C01c996b4C06a461d2430"
hermezRollup:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the rollup smart contract.
- example: "0x222dc4262BCDbf85190C01c996b4C06a461d2430"
governanceAddress:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the governance.
- example: "0x444dc4262BCDbf85190C01c996b4C06a461d2430"
required:
- blocksPerSlot
- initialMinimalBidding
- genesisBlockNum
- tokenHEZ
- hermezRollup
- governanceAddress
additionalProperties: false
withdrawalDelayer: withdrawalDelayer:
type: object type: object
description: Constant configuration of the withdrawal delayer smart contract. description: Constant configuration of the withdrawal delayer smart contract.
@@ -2440,6 +2511,21 @@ components:
type: integer type: integer
description: Maximum amount of time in which the contract can be in emergency mode. Time is measured in Ethereum blocks. description: Maximum amount of time in which the contract can be in emergency mode. Time is measured in Ethereum blocks.
example: 2000 example: 2000
hermezRollup:
allOf:
- $ref: '#/components/schemas/EthereumAddress'
- description: Ethereum address of the rollup smart contract.
- example: "0x222dc4262BCDbf85190C01c996b4C06a461d2430"
required:
- maxWithdrawalDelay
- maxEmergencyModeTime
- hermezRollup
additionalProperties: false
required:
- hermez
- auction
- withdrawalDelayer
additionalProperties: false
Error: Error:
type: object type: object
description: Error response. description: Error response.

View File

@@ -22,18 +22,18 @@ import (
// AuctionConstants are the constants of the Rollup Smart Contract // AuctionConstants are the constants of the Rollup Smart Contract
type AuctionConstants struct { type AuctionConstants struct {
// Blocks per slot // Blocks per slot
BlocksPerSlot uint8 BlocksPerSlot uint8 `json:"blocksPerSlot"`
// Minimum bid when no one has bid yet // Minimum bid when no one has bid yet
InitialMinimalBidding *big.Int InitialMinimalBidding *big.Int `json:"initialMinimalBidding"`
// First block where the first slot begins // First block where the first slot begins
GenesisBlockNum int64 GenesisBlockNum int64 `json:"genesisBlockNum"`
// ERC777 token with which the bids will be made // ERC777 token with which the bids will be made
TokenHEZ ethCommon.Address TokenHEZ ethCommon.Address `json:"tokenHEZ"`
// HermezRollup smartcontract address // HermezRollup smartcontract address
HermezRollup ethCommon.Address HermezRollup ethCommon.Address `json:"hermezRollup"`
// Hermez Governanze Token smartcontract address who controls some parameters and collects HEZ fee // Hermez Governanze Token smartcontract address who controls some parameters and collects HEZ fee
// Only for test // Only for test
GovernanceAddress ethCommon.Address GovernanceAddress ethCommon.Address `json:"governanceAddress"`
} }
// SlotState is the state of a slot // SlotState is the state of a slot

View File

@@ -101,13 +101,13 @@ var (
// RollupPublicConstants are the constants of the Rollup Smart Contract // RollupPublicConstants are the constants of the Rollup Smart Contract
type RollupPublicConstants struct { type RollupPublicConstants struct {
AbsoluteMaxL1L2BatchTimeout int64 AbsoluteMaxL1L2BatchTimeout int64 `json:"absoluteMaxL1L2BatchTimeout"`
TokenHEZ ethCommon.Address TokenHEZ ethCommon.Address `json:"tokenHEZ"`
Verifiers []RollupVerifierStruct Verifiers []RollupVerifierStruct `json:"verifiers"`
HermezAuctionContract ethCommon.Address HermezAuctionContract ethCommon.Address `json:"hermezAuctionContract"`
HermezGovernanceDAOAddress ethCommon.Address HermezGovernanceDAOAddress ethCommon.Address `json:"hermezGovernanceDAOAddress"`
SafetyAddress ethCommon.Address SafetyAddress ethCommon.Address `json:"safetyAddress"`
WithdrawDelayerContract ethCommon.Address WithdrawDelayerContract ethCommon.Address `json:"withdrawDelayerContract"`
} }
// RollupVariables are the variables of the Rollup Smart Contract // RollupVariables are the variables of the Rollup Smart Contract
@@ -133,8 +133,8 @@ func NewQueueStruct() *QueueStruct {
// RollupVerifierStruct is the information about verifiers of the Rollup Smart Contract // RollupVerifierStruct is the information about verifiers of the Rollup Smart Contract
type RollupVerifierStruct struct { type RollupVerifierStruct struct {
MaxTx int64 MaxTx int64 `json:"maxTx"`
NLevels int64 NLevels int64 `json:"nlevels"`
} }
// RollupState represents the state of the Rollup in the Smart Contract // RollupState represents the state of the Rollup in the Smart Contract

View File

@@ -19,11 +19,11 @@ import (
// WDelayerConstants are the constants of the Rollup Smart Contract // WDelayerConstants are the constants of the Rollup Smart Contract
type WDelayerConstants struct { type WDelayerConstants struct {
// Max Withdrawal Delay // Max Withdrawal Delay
MaxWithdrawalDelay uint64 MaxWithdrawalDelay uint64 `json:"maxWithdrawalDelay"`
// Max Emergency mode time // Max Emergency mode time
MaxEmergencyModeTime uint64 MaxEmergencyModeTime uint64 `json:"maxEmergencyModeTime"`
// HermezRollup smartcontract address // HermezRollup smartcontract address
HermezRollup ethCommon.Address HermezRollup ethCommon.Address `json:"hermezRollup"`
} }
// DepositState is the state of Deposit // DepositState is the state of Deposit