From 82ee7c6aa765ff89d4d2693dbcf92a95c21d8f65 Mon Sep 17 00:00:00 2001 From: laisolizq Date: Fri, 23 Oct 2020 17:46:34 +0200 Subject: [PATCH] Add struct get state endpoint --- api/run.sh | 6 +- api/state.go | 17 ++ api/swagger.yml | 353 ++++++++++++++++++++++++++---------------- db/historydb/views.go | 18 +++ eth/auction.go | 16 +- eth/rollup.go | 16 +- eth/wdelayer.go | 13 +- 7 files changed, 290 insertions(+), 149 deletions(-) create mode 100644 api/state.go diff --git a/api/run.sh b/api/run.sh index 048c82a..b90464f 100755 --- a/api/run.sh +++ b/api/run.sh @@ -1,9 +1,9 @@ #!/bin/sh -e USAGE="Available options: - doc Start documentation UI at http://loclahost:8001 and the mock up server at http://loclahost:4010 - mock Start the mock up server at http://loclahost:4010 - editor Start the documentation editor at http://loclahost:8002 + doc Start documentation UI at http://localhost:8001 and the mock up server at http://localhost:4010 + mock Start the mock up server at http://localhost:4010 + editor Start the documentation editor at http://localhost:8002 stop Stop all runing services started using this script help display this message" diff --git a/api/state.go b/api/state.go new file mode 100644 index 0000000..a72dadb --- /dev/null +++ b/api/state.go @@ -0,0 +1,17 @@ +package api + +import ( + "github.com/hermeznetwork/hermez-node/common" + "github.com/hermeznetwork/hermez-node/db/historydb" + "github.com/hermeznetwork/hermez-node/eth" +) + +// Status define status of the network +type Status struct { + Network historydb.Network `json:"network"` + Metrics historydb.Metrics `json:"metrics"` + Rollup eth.RollupVariables `json:"rollup"` + Auction eth.AuctionVariables `json:"auction"` + WithdrawalDelayer eth.WDelayerVariables `json:"withdrawalDelayer"` + RecommendedFee common.RecommendedFee `json:"recommendedFee"` +} diff --git a/api/swagger.yml b/api/swagger.yml index 95b3d0b..5cc0490 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -2177,145 +2177,230 @@ components: $ref: '#/components/schemas/PaginationInfo' State: type: object - description: Gobal statistics of the network. + description: Gobal variables of the network properties: - lastBlock: - allOf: - - $ref: '#/components/schemas/EthBlockNum' - - description: Last synchronized Etherum block. - - example: 3457437 - lastBatch: - allOf: - - $ref: '#/components/schemas/BatchNum' - - description: Last batch that has been forged. - - example: 76523 - currentSlot: - allOf: - - $ref: '#/components/schemas/SlotNum' - - description: Slot where batches are currently being forged. - - example: 2334 - transactionsPerBatch: - type: number - description: Average transactions per batch in the last 24 hours. - example: 2002.7 - batchFrequency: - type: number - description: Average elapsed time between batches in the last 24 hours, in seconds. - example: 8.9 - transactionsPerSecond: - type: number - description: Average transactions per second in the last 24 hours. - example: 302.3 - totalAccounts: - type: integer - description: Number of created accounts. - example: 90473 - totalBJJs: - type: integer - description: Number of different registered BJJs. - example: 23067 - avgTransactionFee: - type: number - description: Average fee percentage paid for L2 transactions in the last 24 hours. - example: 1.54 - nextForgers: - $ref: '#/components/schemas/NextForgers' - recommendedFee: - $ref: '#/components/schemas/RecommendedFee' - governance: + network: type: object - description: Network setings that are updatable by the governance. + description: Gobal statistics of the network properties: - rollup: - type: object - description: Rollup parameters. - properties: - forgeTimeout: - type: integer - description: Time delay between the beggining of a slot and the beggining of the period in which anyone can forge if the auction winner of the slot hasn't forged any batch yet. Time is measured in Ethereum blocks. - example: 5 - feeAddToken: - type: integer - description: fee to pay when registering tokens into the network. - example: 5698 - auction: - type: object - description: Auction parameters. - properties: - bootCoordinator: - allOf: - - $ref: '#/components/schemas/EthereumAddress' - - description: Ethereum address of the boot coordinator. - - example: "0x997dc4262BCDbf85190C01c996b4C06a461d2430" - slotDeadline: - type: integer - description: Number of blocks at the end of a slot in which any coordinator can forge if the winner has not forged one before. - example: 3 - closedAuctionSlots: - type: integer - description: Amount of slots between the current slot and the slot auction that is closed. Example if the value is 2, when slot 10 begins, the auction of the slot 12 gets closed. - example: 2 - openAuctionSlots: - type: integer - description: How many days in advance are auctions opened. - defaultSlotSetBid: - type: array - description: "Initial minimal bid for each auction. Expressed as an array of 6 values. To calculate which value corresponds to each slot: `initialMinimalBidding[slotNum%6]`." - items: + lastBlock: + allOf: + - $ref: '#/components/schemas/EthBlockNum' + - description: Last synchronized Etherum block. + - example: 3457437 + lastBatch: + $ref: '#/components/schemas/Batch' + currentSlot: + allOf: + - $ref: '#/components/schemas/SlotNum' + - description: Slot where batches are currently being forged. + - example: 2334 + nextForgers: + $ref: '#/components/schemas/NextForgers' + additionalProperties: false + require: + - lastBlock + - lastBatch + - currentSlot + - nextForgers + metrics: + type: object + description: Metrics of the network + properties: + transactionsPerBatch: + type: number + description: Average transactions per batch in the last 24 hours. + example: 2002.7 + batchFrequency: + type: number + description: Average elapsed time between batches in the last 24 hours, in seconds. + example: 8.9 + transactionsPerSecond: + type: number + description: Average transactions per second in the last 24 hours. + example: 302.3 + totalAccounts: + type: integer + description: Number of created accounts. + example: 90473 + totalBJJs: + type: integer + description: Number of different registered BJJs. + example: 23067 + avgTransactionFee: + type: number + description: Average fee percentage paid for L2 transactions in the last 24 hours. + example: 1.54 + additionalProperties: false + require: + - transactionsPerBatch + - batchFrequency + - transactionsPerSecond + - totalAccounts + - totalBJJs + - avgTransactionFee + rollup: + type: object + description: Rollup parameters + properties: + forgeL1L2BatchTimeout: + type: integer + description: Max ethereum blocks after the last L1-L2-batch, when exceeds the timeout only L1-L2-batch are allowed. + example: 5 + feeAddToken: + type: integer + description: Fee to pay when registering tokens into the network. + example: 5698 + withdrawalDelay: + type: integer + description: Withdraw delay in seconds + example: 432000 + buckets: + type: array + description: List of buckets state + items: + type: object + properties: + ceilUSD: type: integer - example: [32,0,68,21,55,99] - outbidding: - type: number - description: Minimum outbid over the previous one to consider it valid. - example: 3.64 - donationAddress: - allOf: - - $ref: '#/components/schemas/EthereumAddress' - - description: Ethereum address where the donations will go to. - - example: "0x887dc4262BCDbf85190C01c996b4C06a461d2430" - allocationRatio: - type: array - description: Percentage in which fees will be splitted between donations, governance and burning. The sum of the tree values should be 100. - items: + description: Max USD value + example: 1000 + blockStamp: type: integer - example: [80,10,10] - withdrawalDelayer: - type: object - description: Withdrawal delayer parameters. - properties: - rollupAddress: - allOf: - - $ref: '#/components/schemas/EthereumAddress' - - description: Ethereum address of the rollup smart contract. - - example: "0x777dc4262BCDbf85190C01c996b4C06a461d2430" - governanceAddress: - allOf: - - $ref: '#/components/schemas/EthereumAddress' - - description: Ethereum address of the governance mechanism. - - example: "0x667dc4262BCDbf85190C01c996b4C06a461d2430" - whitheHackerGroupAddress: - allOf: - - $ref: '#/components/schemas/EthereumAddress' - - description: Ethereum Address that can claim the funds in an emergency when the maximum emergency mode time is exceeded. - - example: "0x557dc4262BCDbf85190C01c996b4C06a461d2430" - keeperAddress: - allOf: - - $ref: '#/components/schemas/EthereumAddress' - - description: Ethereum Address that can enable emergency mode and modify the delay to make a withdrawal. - - example: "0x557dc4262BCDbf85190C01c996b4C06a461d2430" - withdrawalDelay: - allOf: - - $ref: '#/components/schemas/EthBlockNum' - - description: The time that anyone needs to wait until a withdrawal of the funds is allowed, in Ethereum blocks. - - example: 539573849 - emergencyModeStartingTime: - type: integer - description: Ethereum block in which the emergency mode will be activated. - example: 10 - emergencyMode: - type: boolean - description: Indicates if emergency mode has been activated. - + description: Last time a withdrawal was added ( or removed if the bucket was full) + example: 4475934 + withdrawals: + type: integer + description: Available withdrawals of the bucket + example: 4 + blockWithdrawalRate: + type: integer + description: Every `blockWithdrawalRate` blocks add 1 withdrawal + example: 8 + maxWithdrawals: + type: integer + description: Max withdrawals the bucket can hold + example: 4 + additionalProperties: false + require: + - ceilUSD + - blockStamp + - withdrawals + - blockWithdrawalRate + - maxWithdrawals + additionalProperties: false + require: + - forgeL1L2BatchTimeout + - feeAddToken + - withdrawalDelay + - buckets + auction: + type: object + description: Auction parameters. + properties: + bootCoordinator: + allOf: + - $ref: '#/components/schemas/EthereumAddress' + - description: Ethereum address of the boot coordinator. + - example: "0x997dc4262BCDbf85190C01c996b4C06a461d2430" + slotDeadline: + type: integer + description: Number of blocks after the beginning of a slot after which any coordinator can forge if the winner has not forged any batch in that slot. + example: 3 + closedAuctionSlots: + type: integer + description: Amount of slots between the current slot and the slot auction that is closed. Example if the value is 2, when slot 10 begins, the auction of the slot 12 gets closed. + example: 2 + openAuctionSlots: + type: integer + description: How many days in advance are auctions opened. + defaultSlotSetBid: + type: array + description: "Initial minimal bid for each auction. Expressed as an array of 6 values. To calculate which value corresponds to each slot: `initialMinimalBidding[slotNum%6]`." + items: + type: integer + example: [32,0,68,21,55,99] + outbidding: + type: number + description: Minimum outbid over the previous one to consider it valid. + example: 3.64 + donationAddress: + allOf: + - $ref: '#/components/schemas/EthereumAddress' + - description: Ethereum address where the donations will go to. + - example: "0x887dc4262BCDbf85190C01c996b4C06a461d2430" + allocationRatio: + type: array + description: Percentage in which fees will be splitted between donations, governance and burning. The sum of the tree values should be 100. + items: + type: integer + example: [80,10,10] + additionalProperties: false + require: + - bootCoordinator + - slotDeadline + - closedAuctionSlots + - openAuctionSlots + - defaultSlotSetBid + - outbidding + - donationAddress + - allocationRatio + withdrawalDelayer: + type: object + description: Withdrawal delayer parameters + properties: + hermezRollupAddress: + allOf: + - $ref: '#/components/schemas/EthereumAddress' + - description: Ethereum address of the rollup smart contract. + - example: "0x777dc4262BCDbf85190C01c996b4C06a461d2430" + hermezGovernanceDAOAddress: + allOf: + - $ref: '#/components/schemas/EthereumAddress' + - description: Ethereum address of the governance DAO. + - example: "0x667dc4262BCDbf85190C01c996b4C06a461d2430" + whiteHackGroupAddress: + allOf: + - $ref: '#/components/schemas/EthereumAddress' + - description: Ethereum Address that can claim the funds in an emergency when the maximum emergency mode time is exceeded. + - example: "0x557dc4262BCDbf85190C01c996b4C06a461d2430" + hermezKeeperAddress: + allOf: + - $ref: '#/components/schemas/EthereumAddress' + - description: Ethereum Address that can enable emergency mode and modify the delay to make a withdrawal. + - example: "0x557dc4262BCDbf85190C01c996b4C06a461d2430" + withdrawalDelay: + allOf: + - $ref: '#/components/schemas/EthBlockNum' + - description: The time that anyone needs to wait until a withdrawal of the funds is allowed, in Ethereum blocks. + - example: 539573849 + emergencyModeStartingTime: + type: integer + description: Ethereum block in which the emergency mode will be activated. + example: 10 + emergencyMode: + type: boolean + description: Indicates if emergency mode has been activated. + example: false + additionalProperties: false + require: + - hermezRollupAddress + - hermezGovernanceDAOAddress + - whiteHackGroupAddress + - hermezKeeperAddress + - withdrawalDelay + - emergencyModeStartingTime + - emergencyMode + recommendedFee: + $ref: '#/components/schemas/RecommendedFee' + additionalProperties: false + require: + - network + - metrics + - rollup + - auction + - withdrawalDelayer + - recomendedFee PaginationInfo: type: object description: Give pagination information diff --git a/db/historydb/views.go b/db/historydb/views.go index 79a177f..892a52d 100644 --- a/db/historydb/views.go +++ b/db/historydb/views.go @@ -154,3 +154,21 @@ type BatchAPI struct { FirstItem int `json:"-" meddler:"first_item"` LastItem int `json:"-" meddler:"last_item"` } + +// Network define status of the network +type Network struct { + LastBlock int64 `json:"lastBlock"` + LastBatch BatchAPI `json:"lastBatch"` + CurrentSlot int64 `json:"currentSlot"` + NextForgers []HistoryCoordinator `json:"nextForgers"` +} + +// Metrics define metrics of the network +type Metrics struct { + TransactionsPerBatch float64 `json:"transactionsPerBatch"` + BatchFrequency float64 `json:"batchFrequency"` + TransactionsPerSecond float64 `json:"transactionsPerSecond"` + TotalAccounts int64 `json:"totalAccounts"` + TotalBJJs int64 `json:"totalBJJs"` + AvgTransactionFee float64 `json:"avgTransactionFee"` +} diff --git a/eth/auction.go b/eth/auction.go index 72ad2bb..259eae5 100644 --- a/eth/auction.go +++ b/eth/auction.go @@ -63,21 +63,21 @@ type Coordinator struct { // AuctionVariables are the variables of the Auction Smart Contract type AuctionVariables struct { // Boot Coordinator Address - DonationAddress ethCommon.Address + DonationAddress ethCommon.Address `json:"donationAddress" meddler:"donation_address"` // Boot Coordinator Address - BootCoordinator ethCommon.Address + BootCoordinator ethCommon.Address `json:"bootCoordinator" meddler:"boot_coordinator"` // The minimum bid value in a series of 6 slots - DefaultSlotSetBid [6]*big.Int + DefaultSlotSetBid [6]*big.Int `json:"defaultSlotSetBid" meddler:"default_slot_set_bid,json"` // Distance (#slots) to the closest slot to which you can bid ( 2 Slots = 2 * 40 Blocks = 20 min ) - ClosedAuctionSlots uint16 + ClosedAuctionSlots uint16 `json:"closedAuctionSlots" meddler:"closed_auction_slots"` // Distance (#slots) to the farthest slot to which you can bid (30 days = 4320 slots ) - OpenAuctionSlots uint16 + OpenAuctionSlots uint16 `json:"openAuctionSlots" meddler:"open_auction_slots"` // How the HEZ tokens deposited by the slot winner are distributed (Burn: 40% - Donation: 40% - HGT: 20%) - AllocationRatio [3]uint16 + AllocationRatio [3]uint16 `json:"allocationRatio" meddler:"allocation_ratio,json"` // Minimum outbid (percentage) over the previous one to consider it valid - Outbidding uint16 + Outbidding uint16 `json:"outbidding" meddler:"outbidding"` // Number of blocks at the end of a slot in which any coordinator can forge if the winner has not forged one before - SlotDeadline uint8 + SlotDeadline uint8 `json:"slotDeadline" meddler:"slot_deadline"` } // AuctionState represents the state of the Rollup in the Smart Contract diff --git a/eth/rollup.go b/eth/rollup.go index eb2afe1..30f0700 100644 --- a/eth/rollup.go +++ b/eth/rollup.go @@ -110,11 +110,21 @@ type RollupPublicConstants struct { WithdrawDelayerContract ethCommon.Address `json:"withdrawDelayerContract"` } +// Bucket are the variables of each Bucket of Rollup Smart Contract +type Bucket struct { + CeilUSD uint64 `json:"ceilUSD"` + BlockStamp uint64 `json:"blockStamp"` + Withdrawals uint64 `json:"withdrawals"` + BlockWithdrawalRate uint64 `json:"blockWithdrawalRate"` + MaxWithdrawals uint64 `json:"maxWithdrawals"` +} + // RollupVariables are the variables of the Rollup Smart Contract type RollupVariables struct { - FeeAddToken *big.Int - ForgeL1L2BatchTimeout int64 - WithdrawalDelay uint64 + FeeAddToken *big.Int `json:"feeAddToken" meddler:"fee_addtoken"` + ForgeL1L2BatchTimeout int64 `json:"forgeL1L2BatchTimeout" meddler:"forge_l1l2_timeout"` + WithdrawalDelay uint64 `json:"withdrawalDelay" meddler:"withdrawal_delay"` + Buckets [RollupConstNumBuckets]Bucket `json:"buckets" meddler:"buckets,json"` } // QueueStruct is the queue of L1Txs for a batch diff --git a/eth/wdelayer.go b/eth/wdelayer.go index 17138f8..0347144 100644 --- a/eth/wdelayer.go +++ b/eth/wdelayer.go @@ -16,7 +16,7 @@ import ( WithdrawalDelayer "github.com/hermeznetwork/hermez-node/eth/contracts/withdrawdelayer" ) -// WDelayerConstants are the constants of the Rollup Smart Contract +// WDelayerConstants are the constants of the Withdrawal Delayer Smart Contract type WDelayerConstants struct { // Max Withdrawal Delay MaxWithdrawalDelay uint64 `json:"maxWithdrawalDelay"` @@ -26,6 +26,17 @@ type WDelayerConstants struct { HermezRollup ethCommon.Address `json:"hermezRollup"` } +// WDelayerVariables are the variables of the Withdrawal Delayer Smart Contract +type WDelayerVariables struct { + HermezRollupAddress ethCommon.Address `json:"hermezRollupAddress" meddler:"rollup_address"` + HermezGovernanceDAOAddress ethCommon.Address `json:"hermezGovernanceDAOAddress" meddler:"govdao_address"` + WhiteHackGroupAddress ethCommon.Address `json:"whiteHackGroupAddress" meddler:"whg_address"` + HermezKeeperAddress ethCommon.Address `json:"hermezKeeperAddress" meddler:"keeper_address"` + WithdrawalDelay uint64 `json:"withdrawalDelay" meddler:"withdrawal_delay"` + EmergencyModeStartingTime uint64 `json:"emergencyModeStartingTime" meddler:"emergency_start_time"` + EmergencyMode bool `json:"emergencyMode" meddler:"emergency_mode"` +} + // DepositState is the state of Deposit type DepositState struct { Amount *big.Int