Skip to content

Commit 48b39b5

Browse files
author
Jaap van der Plas
committed
[ETCM-797] add debug endpoint to request a specific block (by number) from connected peers
1 parent d91a129 commit 48b39b5

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed
Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
package io.iohk.ethereum.jsonrpc
22

3-
import io.iohk.ethereum.jsonrpc.DebugService.{ListPeersInfoRequest, ListPeersInfoResponse}
3+
import io.circe.Json.JNumber
4+
import io.iohk.ethereum.jsonrpc.DebugService.{
5+
GetSpecificBlockRequest,
6+
GetSpecificBlockResponse,
7+
ListPeersInfoRequest,
8+
ListPeersInfoResponse
9+
}
10+
import io.iohk.ethereum.jsonrpc.JsonRpcError.{InvalidParams, ParseError}
411
import io.iohk.ethereum.jsonrpc.serialization.JsonMethodDecoder.NoParamsMethodDecoder
512
import io.iohk.ethereum.jsonrpc.serialization.{JsonEncoder, JsonMethodCodec}
6-
import org.json4s.JsonAST.{JArray, JString, JValue}
13+
import org.json4s.JsonAST._
714

815
object DebugJsonMethodsImplicits extends JsonMethodsImplicits {
916

@@ -12,4 +19,19 @@ object DebugJsonMethodsImplicits extends JsonMethodsImplicits {
1219
def encodeJson(t: ListPeersInfoResponse): JValue =
1320
JArray(t.peers.map(a => JString(a.toString)))
1421
}
22+
23+
implicit val debug_getSpecificBlockRequest: JsonMethodCodec[GetSpecificBlockRequest, GetSpecificBlockResponse] =
24+
new JsonMethodCodec[GetSpecificBlockRequest, GetSpecificBlockResponse] {
25+
override def decodeJson(
26+
params: Option[JArray]
27+
): Either[JsonRpcError, GetSpecificBlockRequest] =
28+
params match {
29+
case Some(JArray(JInt(blockNumber) :: Nil)) =>
30+
Right(GetSpecificBlockRequest(blockNumber.bigInteger))
31+
case _ =>
32+
Left(InvalidParams())
33+
}
34+
35+
override def encodeJson(t: GetSpecificBlockResponse): JValue = JBool(true)
36+
}
1537
}

src/main/scala/io/iohk/ethereum/jsonrpc/DebugService.scala

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,24 @@ package io.iohk.ethereum.jsonrpc
33
import akka.actor.ActorRef
44
import akka.util.Timeout
55
import io.iohk.ethereum.jsonrpc.AkkaTaskOps._
6-
import io.iohk.ethereum.jsonrpc.DebugService.{ListPeersInfoRequest, ListPeersInfoResponse}
76
import io.iohk.ethereum.network.EtcPeerManagerActor.{PeerInfo, PeerInfoResponse}
87
import io.iohk.ethereum.network.PeerManagerActor.Peers
98
import io.iohk.ethereum.network.{EtcPeerManagerActor, Peer, PeerActor, PeerId, PeerManagerActor}
9+
import io.iohk.ethereum.network.p2p.messages.PV62.GetBlockHeaders
1010
import monix.eval.Task
1111

1212
import scala.concurrent.duration._
1313

1414
object DebugService {
1515
case class ListPeersInfoRequest()
1616
case class ListPeersInfoResponse(peers: List[PeerInfo])
17+
18+
case class GetSpecificBlockRequest(number: BigInt)
19+
case class GetSpecificBlockResponse()
1720
}
1821

1922
class DebugService(peerManager: ActorRef, etcPeerManager: ActorRef) {
23+
import DebugService._
2024

2125
def listPeersInfo(getPeersInfoRequest: ListPeersInfoRequest): ServiceResponse[ListPeersInfoResponse] = {
2226
for {
@@ -41,4 +45,24 @@ class DebugService(peerManager: ActorRef, etcPeerManager: ActorRef) {
4145
.askFor[PeerInfoResponse](EtcPeerManagerActor.PeerInfoRequest(peer))
4246
.map(resp => resp.peerInfo)
4347
}
48+
49+
def getSpecificBlock(req: GetSpecificBlockRequest): ServiceResponse[GetSpecificBlockResponse] =
50+
for {
51+
ids <- getPeerIds
52+
peers <- Task.traverse(ids)(id => getPeerInfo(id).map(id -> _))
53+
eligiblePeers = peers.collect {
54+
case (id, Some(peerInfo)) if peerInfo.maxBlockNumber >= req.number => id
55+
}
56+
_ <- Task.now {
57+
eligiblePeers.foreach { peerId =>
58+
peerManager.tell(
59+
PeerManagerActor.SendMessage(
60+
GetBlockHeaders(Left(req.number - 1), 2, 0, false),
61+
peerId
62+
),
63+
peerManager
64+
)
65+
}
66+
}
67+
} yield Right(GetSpecificBlockResponse())
4468
}

src/main/scala/io/iohk/ethereum/jsonrpc/JsonRpcController.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.iohk.ethereum.jsonrpc
22

33
import io.iohk.ethereum.jsonrpc.CheckpointingService._
4-
import io.iohk.ethereum.jsonrpc.DebugService.{ListPeersInfoRequest, ListPeersInfoResponse}
4+
import io.iohk.ethereum.jsonrpc.DebugService._
55
import io.iohk.ethereum.jsonrpc.EthBlocksService._
66
import io.iohk.ethereum.jsonrpc.EthInfoService._
77
import io.iohk.ethereum.jsonrpc.EthTxService._
@@ -227,6 +227,8 @@ case class JsonRpcController(
227227
private def handleDebugRequest: PartialFunction[JsonRpcRequest, Task[JsonRpcResponse]] = {
228228
case req @ JsonRpcRequest(_, "debug_listPeersInfo", _, _) =>
229229
handle[ListPeersInfoRequest, ListPeersInfoResponse](debugService.listPeersInfo, req)
230+
case req @ JsonRpcRequest(_, "debug_getSpecificBlock", _, _) =>
231+
handle[GetSpecificBlockRequest, GetSpecificBlockResponse](debugService.getSpecificBlock, req)
230232
}
231233

232234
private def handleTestRequest: PartialFunction[JsonRpcRequest, Task[JsonRpcResponse]] = {

0 commit comments

Comments
 (0)