Skip to content

Commit b06aea2

Browse files
authored
Merge pull request #628 from lochjin/dev1.2
chaininfo support from start block to end block
2 parents caf89d4 + 683c379 commit b06aea2

File tree

2 files changed

+109
-37
lines changed

2 files changed

+109
-37
lines changed

node/api.go

+99-35
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ func (api *PublicBlockChainAPI) GetDatabaseInfo() (interface{}, error) {
237237
return ret, nil
238238
}
239239

240-
func (api *PublicBlockChainAPI) GetChainInfo(lastCount int) (interface{}, error) {
240+
func (api *PublicBlockChainAPI) GetChainInfo(lastCount int, start *int64, end *int64) (interface{}, error) {
241241
if !api.node.GetPeerServer().IsCurrent() {
242242
return nil, fmt.Errorf("Busy, try again later")
243243
}
@@ -246,54 +246,118 @@ func (api *PublicBlockChainAPI) GetChainInfo(lastCount int) (interface{}, error)
246246
count = lastCount
247247
}
248248
md := api.node.GetBlockChain().BlockDAG()
249+
var startBlock meerdag.IBlock
250+
var endBlock meerdag.IBlock
251+
var info *json.ChainInfoResult
249252
mainTip := md.GetMainChainTip()
250-
var start meerdag.IBlock
251-
var blockNode *blockchain.BlockNode
252-
info := json.ChainInfoResult{Count: 0, End: fmt.Sprintf("%s (order:%d)", mainTip.GetHash().String(), mainTip.GetOrder())}
253253
totalTxs := 0
254254
emptyBlocks := 0
255-
err := md.Foreach(mainTip, uint(count), meerdag.All, func(block meerdag.IBlock) (bool, error) {
256-
if block.GetID() <= 0 {
257-
return true, nil
255+
startOrder := uint(0)
256+
if start != nil {
257+
startOrder = uint(*start)
258+
}
259+
endOrder := uint(0)
260+
if end != nil {
261+
endOrder = uint(*end)
262+
}
263+
if startOrder > 0 {
264+
if endOrder > 0 {
265+
endBlock = md.GetBlockByOrder(endOrder)
266+
if endBlock == nil {
267+
return nil, fmt.Errorf("No end block by order:%d", endOrder)
268+
}
269+
} else {
270+
endOrder = mainTip.GetOrder()
258271
}
259-
blockNode = api.node.GetBlockChain().GetBlockNode(block)
260-
if blockNode == nil {
272+
if startOrder >= endOrder {
273+
return nil, fmt.Errorf("Invalid start block by order:%d", startOrder)
274+
}
275+
startBlock = md.GetBlockByOrder(startOrder)
276+
if startBlock == nil {
277+
return nil, fmt.Errorf("No start block by order:%d", startOrder)
278+
}
279+
280+
info = &json.ChainInfoResult{Count: 0}
281+
var block meerdag.IBlock
282+
for i := startOrder + 1; i <= endOrder; i++ {
283+
block = md.GetBlockByOrder(i)
284+
if block == nil {
285+
return nil, fmt.Errorf("No block by order:%d", i)
286+
}
287+
blockNode := api.node.GetBlockChain().GetBlockNode(block)
288+
if blockNode == nil {
289+
return true, nil
290+
}
291+
info.Count++
292+
totalTxs += blockNode.GetPriority()
293+
if blockNode.GetPriority() <= 1 {
294+
emptyBlocks++
295+
}
296+
if endBlock != nil {
297+
continue
298+
}
299+
if info.Count >= uint64(count) {
300+
endBlock = block
301+
break
302+
}
303+
}
304+
} else {
305+
endBlock = mainTip
306+
info = &json.ChainInfoResult{Count: 0}
307+
var blockNode *blockchain.BlockNode
308+
err := md.Foreach(endBlock, uint(count), meerdag.All, func(block meerdag.IBlock) (bool, error) {
309+
if block.GetID() <= 0 {
310+
return true, nil
311+
}
312+
blockNode = api.node.GetBlockChain().GetBlockNode(block)
313+
if blockNode == nil {
314+
return true, nil
315+
}
316+
info.Count++
317+
totalTxs += blockNode.GetPriority()
318+
if blockNode.GetPriority() <= 1 {
319+
emptyBlocks++
320+
}
321+
startBlock = block
261322
return true, nil
323+
})
324+
if err != nil {
325+
return nil, err
326+
}
327+
if blockNode != nil {
328+
totalTxs -= blockNode.GetPriority()
329+
if totalTxs < 0 {
330+
totalTxs = 0
331+
}
332+
if blockNode.GetPriority() <= 1 {
333+
emptyBlocks--
334+
}
335+
}
336+
endNode := api.node.GetBlockChain().GetBlockNode(endBlock)
337+
if endNode == nil {
338+
return nil, fmt.Errorf("No block:%s", endBlock.GetHash().String())
262339
}
263-
info.Count++
264-
totalTxs += blockNode.GetPriority()
265-
if blockNode.GetPriority() <= 1 {
340+
totalTxs += endNode.GetPriority()
341+
if endNode.GetPriority() <= 1 {
266342
emptyBlocks++
267343
}
268-
start = block
269-
return true, nil
270-
})
271-
if err != nil {
272-
return nil, err
273344
}
345+
274346
if info.Count <= 0 {
275347
return nil, fmt.Errorf("No blocks")
276348
}
277-
totalTxs -= blockNode.GetPriority()
278-
if totalTxs < 0 {
279-
totalTxs = 0
280-
}
281-
if blockNode.GetPriority() <= 1 {
282-
emptyBlocks--
283-
}
284-
info.Start = fmt.Sprintf("%s (order:%d)", start.GetHash().String(), start.GetOrder())
285-
startNode := api.node.GetBlockChain().GetBlockHeader(start)
349+
350+
info.Start = fmt.Sprintf("%s (order:%d)", startBlock.GetHash().String(), startBlock.GetOrder())
351+
info.End = fmt.Sprintf("%s (order:%d)", endBlock.GetHash().String(), endBlock.GetOrder())
352+
startNode := api.node.GetBlockChain().GetBlockHeader(startBlock)
286353
if startNode == nil {
287-
return nil, fmt.Errorf("No block:%s", start.GetHash().String())
354+
return nil, fmt.Errorf("No block:%s", startBlock.GetHash().String())
288355
}
289-
endNode := api.node.GetBlockChain().GetBlockNode(mainTip)
356+
endNode := api.node.GetBlockChain().GetBlockNode(endBlock)
290357
if endNode == nil {
291-
return nil, fmt.Errorf("No block:%s", mainTip.GetHash().String())
292-
}
293-
totalTxs += endNode.GetPriority()
294-
if endNode.GetPriority() <= 1 {
295-
emptyBlocks++
358+
return nil, fmt.Errorf("No block:%s", endBlock.GetHash().String())
296359
}
360+
297361
totalTime := endNode.GetTimestamp() - startNode.Timestamp.Unix()
298362
if totalTime < 0 {
299363
totalTime = 0
@@ -304,7 +368,7 @@ func (api *PublicBlockChainAPI) GetChainInfo(lastCount int) (interface{}, error)
304368
info.BlocksPerSecond = float64(info.Count) / float64(totalTime)
305369
info.TxsPerSecond = float64(totalTxs) / float64(totalTime)
306370

307-
totalHeight := int64(mainTip.GetHeight()) - int64(start.GetHeight())
371+
totalHeight := int64(endBlock.GetHeight()) - int64(startBlock.GetHeight())
308372
if totalHeight < 0 {
309373
totalHeight = 0
310374
}
@@ -315,7 +379,7 @@ func (api *PublicBlockChainAPI) GetChainInfo(lastCount int) (interface{}, error)
315379
}
316380
info.EmptyBlockRate = fmt.Sprintf("%d%%", uint64(emptyBlocks*100)/info.Count)
317381
info.ProcessQueueSize = int32(api.node.GetBlockChain().ProcessQueueSize())
318-
return info, nil
382+
return *info, nil
319383
}
320384

321385
type PrivateBlockChainAPI struct {

script/cli.sh

+10-2
Original file line numberDiff line numberDiff line change
@@ -745,10 +745,18 @@ function dag_info(){
745745

746746
function chain_info(){
747747
local count=$1
748+
local start=$2
749+
local end=$3
748750
if [ "$count" == "" ]; then
749751
count=0
750752
fi
751-
local data='{"jsonrpc":"2.0","method":"getChainInfo","params":['$count'],"id":1}'
753+
if [ "$start" == "" ]; then
754+
start=0
755+
fi
756+
if [ "$end" == "" ]; then
757+
end=0
758+
fi
759+
local data='{"jsonrpc":"2.0","method":"getChainInfo","params":['$count','$start','$end'],"id":1}'
752760
get_result "$data"
753761
}
754762

@@ -854,7 +862,7 @@ function usage(){
854862
echo " getaddresses <private key>"
855863
echo " modules"
856864
echo " daginfo"
857-
echo " chaininfo"
865+
echo " chaininfo <count> <start> <end>"
858866
echo " dbinfo"
859867
echo " config"
860868
echo "block :"

0 commit comments

Comments
 (0)