Skip to content

Commit 08dc7e7

Browse files
committed
Turn off subtree reputation
1 parent 880d3d1 commit 08dc7e7

File tree

7 files changed

+144
-45
lines changed

7 files changed

+144
-45
lines changed

services/blockvalidation/Server.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ func (u *Server) processBlockFoundChannel(ctx context.Context, blockFound proces
815815

816816
if shouldConsiderCatchup {
817817
// Fetch the block to classify it before deciding on catchup
818-
block, err := u.fetchSingleBlock(ctx, blockFound.hash, blockFound.baseURL)
818+
block, err := u.fetchSingleBlock(ctx, blockFound.hash, blockFound.peerID, blockFound.baseURL)
819819
if err != nil {
820820
if blockFound.errCh != nil {
821821
blockFound.errCh <- err
@@ -1209,7 +1209,7 @@ func (u *Server) processBlockFound(ctx context.Context, hash *chainhash.Hash, ba
12091209
if len(useBlock) > 0 {
12101210
block = useBlock[0]
12111211
} else {
1212-
block, err = u.fetchSingleBlock(ctx, hash, baseURL)
1212+
block, err = u.fetchSingleBlock(ctx, hash, peerID, baseURL)
12131213
if err != nil {
12141214
return err
12151215
}
@@ -1481,7 +1481,7 @@ func (u *Server) addBlockToPriorityQueue(ctx context.Context, blockFound process
14811481
}
14821482

14831483
// Fetch the block to classify it
1484-
block, err := u.fetchSingleBlock(ctx, blockFound.hash, blockFound.baseURL)
1484+
block, err := u.fetchSingleBlock(ctx, blockFound.hash, blockFound.peerID, blockFound.baseURL)
14851485
if err != nil {
14861486
u.logger.Errorf("[addBlockToPriorityQueue] Failed to fetch block %s: %v", blockFound.hash.String(), err)
14871487
if blockFound.errCh != nil {

services/blockvalidation/get_blocks.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -646,12 +646,13 @@ func (u *Server) fetchBlocksBatch(ctx context.Context, hash *chainhash.Hash, n u
646646
// Parameters:
647647
// - ctx: Context for cancellation and tracing
648648
// - hash: Block hash to fetch
649+
// - peerID: Peer ID for reputation tracking
649650
// - baseURL: Peer URL to fetch from
650651
//
651652
// Returns:
652653
// - *model.Block: The fetched block
653654
// - error: If request fails or block is invalid
654-
func (u *Server) fetchSingleBlock(ctx context.Context, hash *chainhash.Hash, baseURL string) (*model.Block, error) {
655+
func (u *Server) fetchSingleBlock(ctx context.Context, hash *chainhash.Hash, peerID string, baseURL string) (*model.Block, error) {
655656
ctx, _, deferFn := tracing.Tracer("blockvalidation").Start(ctx, "fetchSingleBlock",
656657
tracing.WithParentStat(u.stats),
657658
)
@@ -673,8 +674,8 @@ func (u *Server) fetchSingleBlock(ctx context.Context, hash *chainhash.Hash, bas
673674
}
674675

675676
// Report successful block fetch to improve peer reputation
676-
if u.p2pClient != nil {
677-
if err := u.p2pClient.ReportValidBlock(ctx, hash.String()); err != nil {
677+
if u.p2pClient != nil && peerID != "" {
678+
if err := u.p2pClient.ReportValidBlock(ctx, peerID, hash.String()); err != nil {
678679
u.logger.Warnf("[fetchSingleBlock][%s] failed to report valid block: %v", hash.String(), err)
679680
}
680681
}

services/blockvalidation/get_blocks_test.go

Lines changed: 85 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ func TestFetchBlocksConcurrently_CurrentImplementation(t *testing.T) {
521521
)
522522

523523
// Call fetchSingleBlock
524-
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "http://test-peer")
524+
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "test-peer-id", "http://test-peer")
525525
require.NoError(t, err)
526526
require.NotNil(t, fetchedBlock)
527527
assert.Equal(t, targetHash, fetchedBlock.Header.Hash())
@@ -679,7 +679,7 @@ func TestFetchBlocksConcurrently_EdgeCases(t *testing.T) {
679679
)
680680

681681
// Call fetchSingleBlock
682-
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "http://test-peer")
682+
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "test-peer-id", "http://test-peer")
683683
require.NoError(t, err)
684684
require.NotNil(t, fetchedBlock)
685685
assert.Equal(t, targetHash, fetchedBlock.Header.Hash())
@@ -802,7 +802,7 @@ func TestFetchSingleBlock_CurrentBehavior(t *testing.T) {
802802
)
803803

804804
// Call fetchSingleBlock
805-
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "http://test-peer")
805+
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "test-peer-id", "http://test-peer")
806806
require.NoError(t, err)
807807
require.NotNil(t, fetchedBlock)
808808
assert.Equal(t, targetHash, fetchedBlock.Header.Hash())
@@ -826,7 +826,7 @@ func TestFetchSingleBlock_CurrentBehavior(t *testing.T) {
826826
)
827827

828828
// Call fetchSingleBlock - should return error
829-
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "http://test-peer")
829+
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "test-peer-id", "http://test-peer")
830830
require.Error(t, err)
831831
assert.Contains(t, err.Error(), "failed to get block from peer")
832832
require.Nil(t, fetchedBlock)
@@ -850,7 +850,7 @@ func TestFetchSingleBlock_CurrentBehavior(t *testing.T) {
850850
)
851851

852852
// Call fetchSingleBlock - should return error
853-
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "http://test-peer")
853+
fetchedBlock, err := suite.Server.fetchSingleBlock(suite.Ctx, targetHash, "test-peer-id", "http://test-peer")
854854
require.Error(t, err)
855855
assert.Contains(t, err.Error(), "failed to create block from bytes")
856856
require.Nil(t, fetchedBlock)
@@ -1541,7 +1541,7 @@ func TestSubtreeFunctions(t *testing.T) {
15411541
testBlock := &model.Block{
15421542
Height: 100,
15431543
}
1544-
err = suite.Server.fetchAndStoreSubtreeAndSubtreeData(suite.Ctx, testBlock, subtreeHash, "http://test-peer", "test-peer-id")
1544+
err = suite.Server.fetchAndStoreSubtreeAndSubtreeData(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
15451545
assert.NoError(t, err)
15461546

15471547
// Verify both were stored in subtreeStore
@@ -1592,7 +1592,11 @@ func TestSubtreeFunctions(t *testing.T) {
15921592
testBlock := &model.Block{
15931593
Height: 100,
15941594
}
1595+
<<<<<<< HEAD
15951596
err := suite.Server.fetchAndStoreSubtreeAndSubtreeData(suite.Ctx, testBlock, subtreeHash, "http://test-peer", "test-peer-id")
1597+
=======
1598+
err := suite.Server.fetchAndStoreSubtreeAndSubtreeData(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
1599+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
15961600
assert.Error(t, err)
15971601
assert.Contains(t, err.Error(), "failed to fetch subtree from")
15981602
})
@@ -1631,7 +1635,11 @@ func TestSubtreeFunctions(t *testing.T) {
16311635
testBlock := &model.Block{
16321636
Height: 100,
16331637
}
1638+
<<<<<<< HEAD
16341639
err := suite.Server.fetchAndStoreSubtreeAndSubtreeData(suite.Ctx, testBlock, subtreeHash, "http://test-peer", "test-peer-id")
1640+
=======
1641+
err := suite.Server.fetchAndStoreSubtreeAndSubtreeData(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
1642+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
16351643
assert.Error(t, err)
16361644
assert.Contains(t, err.Error(), "failed to fetch subtree data from")
16371645
})
@@ -1645,7 +1653,11 @@ func TestSubtreeFunctions(t *testing.T) {
16451653
Subtrees: []*chainhash.Hash{}, // Empty subtrees
16461654
}
16471655

1656+
<<<<<<< HEAD
16481657
err := suite.Server.fetchSubtreeDataForBlock(suite.Ctx, block, "http://test-peer", "test-peer-id")
1658+
=======
1659+
err := suite.Server.fetchSubtreeDataForBlock(suite.Ctx, block, "test-peer-id", "http://test-peer")
1660+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
16491661
assert.NoError(t, err) // Should return early with no error
16501662
})
16511663

@@ -1670,7 +1682,11 @@ func TestSubtreeFunctions(t *testing.T) {
16701682
fmt.Sprintf("http://test-peer/subtree/%s", subtreeHash.String()),
16711683
httpmock.NewStringResponder(500, "Internal Server Error"))
16721684

1685+
<<<<<<< HEAD
16731686
err := suite.Server.fetchSubtreeDataForBlock(suite.Ctx, block, "http://test-peer", "test-peer-id")
1687+
=======
1688+
err := suite.Server.fetchSubtreeDataForBlock(suite.Ctx, block, "test-peer-id", "http://test-peer")
1689+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
16741690
assert.Error(t, err)
16751691
assert.Contains(t, err.Error(), "Failed to fetch subtree data for block")
16761692
})
@@ -1705,7 +1721,11 @@ func TestSubtreeFunctions(t *testing.T) {
17051721
fmt.Sprintf("http://test-peer/subtree_data/%s", subtreeHash.String()),
17061722
httpmock.NewStringResponder(404, "Not Found"))
17071723

1724+
<<<<<<< HEAD
17081725
err := suite.Server.fetchSubtreeDataForBlock(suite.Ctx, block, "http://test-peer", "test-peer-id")
1726+
=======
1727+
err := suite.Server.fetchSubtreeDataForBlock(suite.Ctx, block, "test-peer-id", "http://test-peer")
1728+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
17091729
assert.Error(t, err)
17101730
assert.Contains(t, err.Error(), "Failed to fetch subtree data for block")
17111731
})
@@ -1824,7 +1844,11 @@ func TestFetchSubtreeDataForBlock(t *testing.T) {
18241844
Subtrees: []*chainhash.Hash{}, // Empty subtrees
18251845
}
18261846

1847+
<<<<<<< HEAD
18271848
err := server.fetchSubtreeDataForBlock(ctx, block, baseURL, "test-peer-id")
1849+
=======
1850+
err := server.fetchSubtreeDataForBlock(ctx, block, "test-peer-id", baseURL)
1851+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
18281852
assert.NoError(t, err)
18291853
})
18301854

@@ -1851,7 +1875,11 @@ func TestFetchSubtreeDataForBlock(t *testing.T) {
18511875
httpmock.RegisterResponder("GET", subtreeDataURL,
18521876
httpmock.NewBytesResponder(200, subtreeDataBytes))
18531877

1878+
<<<<<<< HEAD
18541879
err := server.fetchSubtreeDataForBlock(ctx, block, baseURL, "test-peer-id")
1880+
=======
1881+
err := server.fetchSubtreeDataForBlock(ctx, block, "test-peer-id", baseURL)
1882+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
18551883
assert.NoError(t, err)
18561884
})
18571885

@@ -1884,7 +1912,11 @@ func TestFetchSubtreeDataForBlock(t *testing.T) {
18841912
httpmock.NewBytesResponder(200, subtreeDataBytes))
18851913
}
18861914

1915+
<<<<<<< HEAD
18871916
err := server.fetchSubtreeDataForBlock(ctx, block, baseURL, "test-peer-id")
1917+
=======
1918+
err := server.fetchSubtreeDataForBlock(ctx, block, "test-peer-id", baseURL)
1919+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
18881920
assert.NoError(t, err)
18891921
})
18901922

@@ -1899,7 +1931,11 @@ func TestFetchSubtreeDataForBlock(t *testing.T) {
18991931
httpmock.RegisterResponder("GET", subtreeURL,
19001932
httpmock.NewErrorResponder(errors.NewNetworkError("subtree fetch error")))
19011933

1934+
<<<<<<< HEAD
19021935
err := server.fetchSubtreeDataForBlock(ctx, block, baseURL, "test-peer-id")
1936+
=======
1937+
err := server.fetchSubtreeDataForBlock(ctx, block, "test-peer-id", baseURL)
1938+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
19031939
assert.Error(t, err)
19041940
assert.Contains(t, err.Error(), "Failed to fetch subtree data for block")
19051941
})
@@ -1938,7 +1974,11 @@ func TestFetchSubtreeDataForBlock(t *testing.T) {
19381974
cancelCtx, cancel := context.WithCancel(ctx)
19391975
cancel() // Cancel immediately
19401976

1977+
<<<<<<< HEAD
19411978
err := server.fetchSubtreeDataForBlock(cancelCtx, block, baseURL, "test-peer-id")
1979+
=======
1980+
err := server.fetchSubtreeDataForBlock(cancelCtx, block, "test-peer-id", baseURL)
1981+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
19421982
assert.Error(t, err)
19431983
// Check for either context canceled or the wrapped error containing context cancellation
19441984
assert.True(t,
@@ -2016,7 +2056,11 @@ func TestFetchAndStoreSubtreeData(t *testing.T) {
20162056
testBlock := &model.Block{
20172057
Height: 100,
20182058
}
2059+
<<<<<<< HEAD
20192060
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, baseURL, "test-peer-id")
2061+
=======
2062+
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, "test-peer-id", baseURL)
2063+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
20202064
assert.NoError(t, err)
20212065
})
20222066

@@ -2049,7 +2093,11 @@ func TestFetchAndStoreSubtreeData(t *testing.T) {
20492093
testBlock := &model.Block{
20502094
Height: 100,
20512095
}
2096+
<<<<<<< HEAD
20522097
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, baseURL, "test-peer-id")
2098+
=======
2099+
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, "test-peer-id", baseURL)
2100+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
20532101
assert.Error(t, err)
20542102
assert.Contains(t, err.Error(), "failed to fetch subtree")
20552103
})
@@ -2091,7 +2139,11 @@ func TestFetchAndStoreSubtreeData(t *testing.T) {
20912139
testBlock := &model.Block{
20922140
Height: 100,
20932141
}
2142+
<<<<<<< HEAD
20942143
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, baseURL, "test-peer-id")
2144+
=======
2145+
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, "test-peer-id", baseURL)
2146+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
20952147
assert.Error(t, err)
20962148
assert.Contains(t, err.Error(), "failed to fetch subtree data from")
20972149
})
@@ -2145,7 +2197,11 @@ func TestFetchAndStoreSubtreeData(t *testing.T) {
21452197
testBlock := &model.Block{
21462198
Height: 100,
21472199
}
2200+
<<<<<<< HEAD
21482201
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, baseURL, "test-peer-id")
2202+
=======
2203+
err := server.fetchAndStoreSubtreeAndSubtreeData(ctx, testBlock, subtreeHash, "test-peer-id", baseURL)
2204+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
21492205
assert.Error(t, err)
21502206
})
21512207

@@ -2196,7 +2252,11 @@ func TestFetchAndStoreSubtreeData(t *testing.T) {
21962252
testBlock := &model.Block{
21972253
Height: 100,
21982254
}
2255+
<<<<<<< HEAD
21992256
err := server.fetchAndStoreSubtreeAndSubtreeData(cancelCtx, testBlock, subtreeHash, baseURL, "test-peer-id")
2257+
=======
2258+
err := server.fetchAndStoreSubtreeAndSubtreeData(cancelCtx, testBlock, subtreeHash, "test-peer-id", baseURL)
2259+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
22002260
assert.Error(t, err)
22012261
// Check for either context canceled or the wrapped error containing context cancellation
22022262
assert.True(t,
@@ -2479,7 +2539,11 @@ func TestBlockWorker(t *testing.T) {
24792539
wg.Add(1)
24802540
go func() {
24812541
defer wg.Done()
2542+
<<<<<<< HEAD
24822543
_ = server.blockWorker(ctx, 1, workQueue, resultQueue, baseURL, "test-peer-id", blockUpTo)
2544+
=======
2545+
_ = server.blockWorker(ctx, 1, workQueue, resultQueue, "test-peer-id", baseURL, blockUpTo)
2546+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
24832547
}()
24842548

24852549
// Wait for worker to finish
@@ -2526,7 +2590,11 @@ func TestBlockWorker(t *testing.T) {
25262590
wg.Add(1)
25272591
go func() {
25282592
defer wg.Done()
2593+
<<<<<<< HEAD
25292594
_ = server.blockWorker(ctx, 1, workQueue, resultQueue, baseURL, "test-peer-id", blockUpTo)
2595+
=======
2596+
_ = server.blockWorker(ctx, 1, workQueue, resultQueue, "test-peer-id", baseURL, blockUpTo)
2597+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
25302598
}()
25312599

25322600
// Wait for worker to finish
@@ -2553,7 +2621,11 @@ func TestBlockWorker(t *testing.T) {
25532621
wg.Add(1)
25542622
go func() {
25552623
defer wg.Done()
2624+
<<<<<<< HEAD
25562625
_ = server.blockWorker(ctx, 1, workQueue, resultQueue, baseURL, "test-peer-id", blockUpTo)
2626+
=======
2627+
_ = server.blockWorker(ctx, 1, workQueue, resultQueue, "test-peer-id", baseURL, blockUpTo)
2628+
>>>>>>> 9908d4bc2 (Turn off subtree reputation)
25572629
}()
25582630

25592631
// Wait for worker to finish
@@ -2798,7 +2870,7 @@ func TestFetchSingleBlock_ImprovedErrorHandling(t *testing.T) {
27982870
httpmock.NewBytesResponder(200, []byte("invalid_block_data")),
27992871
)
28002872

2801-
block, err := server.fetchSingleBlock(context.Background(), hash, "http://test-peer")
2873+
block, err := server.fetchSingleBlock(context.Background(), hash, "test-peer-id", "http://test-peer")
28022874

28032875
// Should fail with better error context
28042876
assert.Error(t, err)
@@ -2851,7 +2923,7 @@ func TestFetchAndStoreSubtree(t *testing.T) {
28512923
}
28522924

28532925
// Fetch the subtree (should load from store, not network)
2854-
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, &subtreeHash, "http://test-peer")
2926+
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, &subtreeHash, "test-peer-id", "http://test-peer")
28552927

28562928
assert.NoError(t, err)
28572929
assert.NotNil(t, result)
@@ -2889,7 +2961,7 @@ func TestFetchAndStoreSubtree(t *testing.T) {
28892961
Height: 100,
28902962
}
28912963

2892-
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "http://test-peer")
2964+
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
28932965

28942966
assert.NoError(t, err)
28952967
assert.NotNil(t, result)
@@ -2931,7 +3003,7 @@ func TestFetchAndStoreSubtree(t *testing.T) {
29313003
Height: 100,
29323004
}
29333005

2934-
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "http://test-peer")
3006+
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
29353007

29363008
assert.NoError(t, err)
29373009
assert.NotNil(t, result)
@@ -2956,7 +3028,7 @@ func TestFetchAndStoreSubtree(t *testing.T) {
29563028
Height: 100,
29573029
}
29583030

2959-
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "http://test-peer")
3031+
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
29603032

29613033
assert.Error(t, err)
29623034
assert.Nil(t, result)
@@ -2983,7 +3055,7 @@ func TestFetchAndStoreSubtree(t *testing.T) {
29833055
Height: 100,
29843056
}
29853057

2986-
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "http://test-peer")
3058+
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
29873059

29883060
assert.Error(t, err)
29893061
assert.Nil(t, result)
@@ -3005,7 +3077,7 @@ func TestFetchAndStoreSubtree(t *testing.T) {
30053077
Height: 100,
30063078
}
30073079

3008-
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "http://test-peer")
3080+
result, err := suite.Server.fetchAndStoreSubtree(suite.Ctx, testBlock, subtreeHash, "test-peer-id", "http://test-peer")
30093081

30103082
assert.Error(t, err)
30113083
assert.Nil(t, result)

services/p2p/Interface.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,9 @@ type ClientI interface {
112112

113113
// ReportValidSubtree reports that a subtree was successfully fetched and validated from a peer.
114114
// This increases the peer's reputation score for providing valid data.
115-
// The subtreeHash is used to identify which peer provided the subtree.
116-
ReportValidSubtree(ctx context.Context, subtreeHash string) error
115+
ReportValidSubtree(ctx context.Context, peerID string, subtreeHash string) error
117116

118117
// ReportValidBlock reports that a block was successfully received and validated from a peer.
119118
// This increases the peer's reputation score for providing valid blocks.
120-
// The blockHash is used to identify which peer provided the block.
121-
ReportValidBlock(ctx context.Context, blockHash string) error
119+
ReportValidBlock(ctx context.Context, peerID string, blockHash string) error
122120
}

0 commit comments

Comments
 (0)