mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 03:16:45 +01:00
Merge pull request #407 from hermeznetwork/fix/api-coordinator
Add bootCoord to coord table, get coord by forgerAddr
This commit is contained in:
@@ -100,7 +100,6 @@ func NewAPI(
|
|||||||
server.GET("/tokens", a.getTokens)
|
server.GET("/tokens", a.getTokens)
|
||||||
server.GET("/tokens/:id", a.getToken)
|
server.GET("/tokens/:id", a.getToken)
|
||||||
server.GET("/coordinators", a.getCoordinators)
|
server.GET("/coordinators", a.getCoordinators)
|
||||||
server.GET("/coordinators/:bidderAddr", a.getCoordinator)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return a, nil
|
return a, nil
|
||||||
|
|||||||
@@ -7,29 +7,17 @@ import (
|
|||||||
"github.com/hermeznetwork/hermez-node/db/historydb"
|
"github.com/hermeznetwork/hermez-node/db/historydb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *API) getCoordinator(c *gin.Context) {
|
func (a *API) getCoordinators(c *gin.Context) {
|
||||||
// Get bidderAddr
|
bidderAddr, err := parseQueryEthAddr("bidderAddr", c)
|
||||||
const name = "bidderAddr"
|
|
||||||
bidderAddr, err := parseParamEthAddr(name, c)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
retBadReq(err, c)
|
retBadReq(err, c)
|
||||||
return
|
return
|
||||||
} else if bidderAddr == nil {
|
|
||||||
retBadReq(ErrNillBidderAddr, c)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
forgerAddr, err := parseQueryEthAddr("forgerAddr", c)
|
||||||
coordinator, err := a.h.GetCoordinatorAPI(*bidderAddr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
retSQLErr(err, c)
|
retBadReq(err, c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, coordinator)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *API) getCoordinators(c *gin.Context) {
|
|
||||||
// Pagination
|
// Pagination
|
||||||
fromItem, order, limit, err := parsePagination(c)
|
fromItem, order, limit, err := parsePagination(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -38,7 +26,7 @@ func (a *API) getCoordinators(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch coordinators from historyDB
|
// Fetch coordinators from historyDB
|
||||||
coordinators, pendingItems, err := a.h.GetCoordinatorsAPI(fromItem, limit, order)
|
coordinators, pendingItems, err := a.h.GetCoordinatorsAPI(bidderAddr, forgerAddr, fromItem, limit, order)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
retSQLErr(err, c)
|
retSQLErr(err, c)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -68,20 +68,31 @@ func TestGetCoordinators(t *testing.T) {
|
|||||||
}
|
}
|
||||||
assertCoordinators(t, reversedCoordinators, fetchedCoordinators)
|
assertCoordinators(t, reversedCoordinators, fetchedCoordinators)
|
||||||
|
|
||||||
// Test GetCoordinator
|
for _, filteredCoord := range tc.coordinators {
|
||||||
for _, coord := range tc.coordinators {
|
// By bidder
|
||||||
path = fmt.Sprintf("%s/%s", endpoint, coord.Forger.String())
|
fetchedCoordinators = []historydb.CoordinatorAPI{}
|
||||||
fetchedCoordinator := historydb.CoordinatorAPI{}
|
err = doGoodReqPaginated(
|
||||||
assert.NoError(t, doGoodReq("GET", path, nil, &fetchedCoordinator))
|
fmt.Sprintf(path+"&bidderAddr=%s", filteredCoord.Bidder.String()),
|
||||||
assertCoordinator(t, coord, fetchedCoordinator)
|
historydb.OrderAsc, &testCoordinatorsResponse{}, appendIter,
|
||||||
|
)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assertCoordinators(t, []historydb.CoordinatorAPI{filteredCoord}, fetchedCoordinators)
|
||||||
|
// By forger
|
||||||
|
fetchedCoordinators = []historydb.CoordinatorAPI{}
|
||||||
|
err = doGoodReqPaginated(
|
||||||
|
fmt.Sprintf(path+"&forgerAddr=%s", filteredCoord.Forger.String()),
|
||||||
|
historydb.OrderAsc, &testCoordinatorsResponse{}, appendIter,
|
||||||
|
)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assertCoordinators(t, []historydb.CoordinatorAPI{filteredCoord}, fetchedCoordinators)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 400
|
// 400
|
||||||
path = fmt.Sprintf("%s/0x001", endpoint)
|
path = fmt.Sprintf("%s?bidderAddr=0x001", endpoint)
|
||||||
err = doBadReq("GET", path, nil, 400)
|
err = doBadReq("GET", path, nil, 400)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
// 404
|
// 404
|
||||||
path = fmt.Sprintf("%s/0xaa942cfcd25ad4d90a62358b0dd84f33b398262a", endpoint)
|
path = fmt.Sprintf("%s?bidderAddr=0xaa942cfcd25ad4d90a62358b0dd84f33b398262a", endpoint)
|
||||||
err = doBadReq("GET", path, nil, 404)
|
err = doBadReq("GET", path, nil, 404)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -406,14 +406,6 @@ func parseQueryEthAddr(name string, c querier) (*ethCommon.Address, error) {
|
|||||||
return parseEthAddr(addrStr)
|
return parseEthAddr(addrStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseParamEthAddr(name string, c paramer) (*ethCommon.Address, error) {
|
|
||||||
addrStr := c.Param(name)
|
|
||||||
if addrStr == "" {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return parseEthAddr(addrStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseEthAddr(ethAddrStr string) (*ethCommon.Address, error) {
|
func parseEthAddr(ethAddrStr string) (*ethCommon.Address, error) {
|
||||||
var addr ethCommon.Address
|
var addr ethCommon.Address
|
||||||
err := addr.UnmarshalText([]byte(ethAddrStr))
|
err := addr.UnmarshalText([]byte(ethAddrStr))
|
||||||
|
|||||||
@@ -1144,6 +1144,18 @@ paths:
|
|||||||
description: Get information about coordinators.
|
description: Get information about coordinators.
|
||||||
operationId: getCoordinators
|
operationId: getCoordinators
|
||||||
parameters:
|
parameters:
|
||||||
|
- name: forgerAddr
|
||||||
|
in: query
|
||||||
|
required: false
|
||||||
|
description: Get coordinators by it's forger address.
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/EthereumAddress'
|
||||||
|
- name: bidderAddr
|
||||||
|
in: query
|
||||||
|
required: false
|
||||||
|
description: Get coordinators by it's bidder address.
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/EthereumAddress'
|
||||||
- name: fromItem
|
- name: fromItem
|
||||||
in: query
|
in: query
|
||||||
required: false
|
required: false
|
||||||
@@ -1187,45 +1199,6 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/Error500'
|
$ref: '#/components/schemas/Error500'
|
||||||
'/coordinators/{bidderAddr}':
|
|
||||||
get:
|
|
||||||
tags:
|
|
||||||
- Hermez status
|
|
||||||
summary: Get the information of a coordinator.
|
|
||||||
description: Get the information of a coordinator.
|
|
||||||
operationId: getCoordinator
|
|
||||||
parameters:
|
|
||||||
- name: bidderAddr
|
|
||||||
in: path
|
|
||||||
description: Coordinator identifier
|
|
||||||
required: true
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/EthereumAddress'
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: Successful operation.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/Coordinator'
|
|
||||||
'400':
|
|
||||||
description: Bad request.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/Error400'
|
|
||||||
'404':
|
|
||||||
description: Not found.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/Error404'
|
|
||||||
'500':
|
|
||||||
description: Internal server error.
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/Error500'
|
|
||||||
components:
|
components:
|
||||||
schemas:
|
schemas:
|
||||||
ItemId:
|
ItemId:
|
||||||
|
|||||||
@@ -1621,15 +1621,38 @@ func (hdb *HistoryDB) GetCoordinatorAPI(bidderAddr ethCommon.Address) (*Coordina
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetCoordinatorsAPI returns a list of coordinators from the DB and pagination info
|
// GetCoordinatorsAPI returns a list of coordinators from the DB and pagination info
|
||||||
func (hdb *HistoryDB) GetCoordinatorsAPI(fromItem, limit *uint, order string) ([]CoordinatorAPI, uint64, error) {
|
func (hdb *HistoryDB) GetCoordinatorsAPI(
|
||||||
|
bidderAddr, forgerAddr *ethCommon.Address,
|
||||||
|
fromItem, limit *uint, order string,
|
||||||
|
) ([]CoordinatorAPI, uint64, error) {
|
||||||
var query string
|
var query string
|
||||||
var args []interface{}
|
var args []interface{}
|
||||||
queryStr := `SELECT coordinator.*,
|
queryStr := `SELECT coordinator.*,
|
||||||
COUNT(*) OVER() AS total_items
|
COUNT(*) OVER() AS total_items
|
||||||
FROM coordinator `
|
FROM coordinator `
|
||||||
// Apply filters
|
// Apply filters
|
||||||
if fromItem != nil {
|
nextIsAnd := false
|
||||||
|
if bidderAddr != nil {
|
||||||
|
queryStr += "WHERE bidder_addr = ? "
|
||||||
|
nextIsAnd = true
|
||||||
|
args = append(args, bidderAddr)
|
||||||
|
}
|
||||||
|
if forgerAddr != nil {
|
||||||
|
if nextIsAnd {
|
||||||
|
queryStr += "AND "
|
||||||
|
} else {
|
||||||
queryStr += "WHERE "
|
queryStr += "WHERE "
|
||||||
|
}
|
||||||
|
queryStr += "forger_addr = ? "
|
||||||
|
nextIsAnd = true
|
||||||
|
args = append(args, forgerAddr)
|
||||||
|
}
|
||||||
|
if fromItem != nil {
|
||||||
|
if nextIsAnd {
|
||||||
|
queryStr += "AND "
|
||||||
|
} else {
|
||||||
|
queryStr += "WHERE "
|
||||||
|
}
|
||||||
if order == OrderAsc {
|
if order == OrderAsc {
|
||||||
queryStr += "coordinator.item_id >= ? "
|
queryStr += "coordinator.item_id >= ? "
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -358,12 +358,14 @@ func (s *Synchronizer) init() error {
|
|||||||
}
|
}
|
||||||
lastBlock := &common.Block{}
|
lastBlock := &common.Block{}
|
||||||
lastSavedBlock, err := s.historyDB.GetLastBlock()
|
lastSavedBlock, err := s.historyDB.GetLastBlock()
|
||||||
if err != nil && tracerr.Unwrap(err) != sql.ErrNoRows {
|
// `s.historyDB.GetLastBlock()` will never return `sql.ErrNoRows`
|
||||||
|
// because we always have the default block 0 in the DB
|
||||||
|
if err != nil {
|
||||||
return tracerr.Wrap(err)
|
return tracerr.Wrap(err)
|
||||||
}
|
}
|
||||||
// If there's no block in the DB (or we only have the default block 0),
|
// If we only have the default block 0,
|
||||||
// make sure that the stateDB is clean
|
// make sure that the stateDB is clean
|
||||||
if tracerr.Unwrap(err) == sql.ErrNoRows || lastSavedBlock.Num == 0 {
|
if lastSavedBlock.Num == 0 {
|
||||||
if err := s.stateDB.Reset(0); err != nil {
|
if err := s.stateDB.Reset(0); err != nil {
|
||||||
return tracerr.Wrap(err)
|
return tracerr.Wrap(err)
|
||||||
}
|
}
|
||||||
@@ -624,6 +626,14 @@ func (s *Synchronizer) resetState(block *common.Block) error {
|
|||||||
s.vars.Rollup = *vars.Rollup.Copy()
|
s.vars.Rollup = *vars.Rollup.Copy()
|
||||||
s.vars.Auction = *vars.Auction.Copy()
|
s.vars.Auction = *vars.Auction.Copy()
|
||||||
s.vars.WDelayer = *vars.WDelayer.Copy()
|
s.vars.WDelayer = *vars.WDelayer.Copy()
|
||||||
|
// Add initial boot coordinator to HistoryDB
|
||||||
|
if err := s.historyDB.AddCoordinators([]common.Coordinator{{
|
||||||
|
Forger: s.initVars.Auction.BootCoordinator,
|
||||||
|
URL: s.initVars.Auction.BootCoordinatorURL,
|
||||||
|
EthBlockNum: s.initVars.Auction.EthBlockNum,
|
||||||
|
}}); err != nil {
|
||||||
|
return tracerr.Wrap(err)
|
||||||
|
}
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return tracerr.Wrap(err)
|
return tracerr.Wrap(err)
|
||||||
} else {
|
} else {
|
||||||
@@ -1035,6 +1045,12 @@ func (s *Synchronizer) auctionSync(ethBlock *common.Block) (*common.AuctionData,
|
|||||||
s.vars.Auction.BootCoordinator = evt.NewBootCoordinator
|
s.vars.Auction.BootCoordinator = evt.NewBootCoordinator
|
||||||
s.vars.Auction.BootCoordinatorURL = evt.NewBootCoordinatorURL
|
s.vars.Auction.BootCoordinatorURL = evt.NewBootCoordinatorURL
|
||||||
varsUpdate = true
|
varsUpdate = true
|
||||||
|
// Add new boot coordinator
|
||||||
|
auctionData.Coordinators = append(auctionData.Coordinators, common.Coordinator{
|
||||||
|
Forger: evt.NewBootCoordinator,
|
||||||
|
URL: evt.NewBootCoordinatorURL,
|
||||||
|
EthBlockNum: blockNum,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
for _, evt := range auctionEvents.NewOpenAuctionSlots {
|
for _, evt := range auctionEvents.NewOpenAuctionSlots {
|
||||||
s.vars.Auction.OpenAuctionSlots = evt.NewOpenAuctionSlots
|
s.vars.Auction.OpenAuctionSlots = evt.NewOpenAuctionSlots
|
||||||
|
|||||||
Reference in New Issue
Block a user