You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuweni.apache.org by to...@apache.org on 2023/05/27 02:20:57 UTC
[incubator-tuweni] 01/01: Support eth_getBlockByNumber from JSONRPC client
This is an automated email from the ASF dual-hosted git repository.
toulmean pushed a commit to branch jsonrpc_ethgetBlockByNumber
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git
commit 0efc5d9c2ea76f6c6dad32a7cdd65adf2ad83412
Author: Antoine Toulme <an...@lunar-ocean.com>
AuthorDate: Fri May 26 19:20:41 2023 -0700
Support eth_getBlockByNumber from JSONRPC client
---
.../org/apache/tuweni/jsonrpc/JSONRPCClient.kt | 26 ++++++++++++++++++++--
.../org/apache/tuweni/jsonrpc/JSONRPCClientTest.kt | 22 +++++++++++++++---
2 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClient.kt b/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClient.kt
index 7c9e20581..4c28abfff 100644
--- a/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClient.kt
+++ b/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClient.kt
@@ -16,6 +16,7 @@
*/
package org.apache.tuweni.jsonrpc
+import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import io.vertx.core.Vertx
import io.vertx.core.buffer.Buffer
@@ -68,7 +69,7 @@ class JSONRPCClient(
val authorizationHeader = "Basic " + Base64.getEncoder()
.encode((basicAuthenticationUsername + ":" + basicAuthenticationPassword).toByteArray())
- suspend fun sendRequest(request: JSONRPCRequest): Deferred<JSONRPCResponse> {
+ fun sendRequest(request: JSONRPCRequest): Deferred<JSONRPCResponse> {
val deferred = CompletableDeferred<JSONRPCResponse>()
val httpRequest = client.postAbs(endpointUrl)
.putHeader("Content-Type", "application/json")
@@ -81,7 +82,6 @@ class JSONRPCClient(
if (response.failed()) {
deferred.completeExceptionally(response.cause())
} else {
- println(response.result().bodyAsString())
val jsonResponse = mapper.readValue(response.result().bodyAsString(), JSONRPCResponse::class.java)
deferred.complete(jsonResponse)
}
@@ -151,6 +151,28 @@ class JSONRPCClient(
}
}
+ /**
+ * Gets block data by block number
+ * @param blockNumber the block number
+ * @param includeTransactions whether to include transactions detail
+ * @return the whole block information as a JSON document.
+ */
+ suspend fun getBlockByBlockNumber(blockNumber: Int, includeTransactions: Boolean): Map<*, *> {
+ val body = JSONRPCRequest(
+ StringOrLong(nextId()),
+ "eth_getBlockByNumber",
+ arrayOf(blockNumber, includeTransactions)
+ )
+ val jsonResponse = sendRequest(body).await()
+ val err = jsonResponse.error
+ if (err != null) {
+ val errorMessage = "Code ${err.code}: ${err.message}"
+ throw ClientRequestException(errorMessage)
+ } else {
+ return jsonResponse.result as Map<*, *>
+ }
+ }
+
override fun close() {
client.close()
}
diff --git a/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClientTest.kt b/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClientTest.kt
index 8c54b1e45..6c892e34a 100644
--- a/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClientTest.kt
+++ b/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/JSONRPCClientTest.kt
@@ -50,7 +50,7 @@ import java.util.concurrent.atomic.AtomicReference
class JSONRPCClientTest {
companion object {
- val handler = AtomicReference<Handler<JSONRPCRequest>>()
+ val handler = AtomicReference<(JSONRPCRequest)->JSONRPCResponse>()
var server: JSONRPCServer? = null
@JvmStatic
@@ -64,8 +64,7 @@ class JSONRPCClientTest {
vertx,
port = 0,
methodHandler = {
- handler.get().handle(it)
- JSONRPCResponse(StringOrLong(3), "")
+ handler.get()(it)
},
coroutineContext = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
)
@@ -119,4 +118,21 @@ class JSONRPCClientTest {
}
}
}
+
+ @Test
+ fun testGetBlockByNumber(@VertxInstance vertx: Vertx) {
+ JSONRPCClient(vertx, "http://localhost:" + server!!.port()).use {
+ val sent = CompletableDeferred<Any>()
+ handler.set { request ->
+ sent.complete(request.params.get(0))
+ JSONRPCResponse(request.id, mapOf(Pair("foo", "bar")))
+ }
+
+ runBlocking {
+ val block = it.getBlockByBlockNumber(32, true)
+ assertEquals(block["foo"], "bar")
+ sent.await()
+ }
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@tuweni.apache.org
For additional commands, e-mail: commits-help@tuweni.apache.org