Skip to content

Commit cf5e5f4

Browse files
Jaap van der Plasdzajkowski
authored andcommitted
add some logging, wait for importBlock before continuing, don't omit null fields in JSON response, add coinbase field to BlockResponse
1 parent 34b3ac5 commit cf5e5f4

File tree

8 files changed

+47
-25
lines changed

8 files changed

+47
-25
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ trait BaseBlockResponse {
3030
def timestamp: BigInt
3131
def transactions: Either[Seq[ByteString], Seq[TransactionResponse]]
3232
def uncles: Seq[ByteString]
33+
def coinbase: Option[ByteString]
3334
}
3435

3536
case class EthBlockResponse(
@@ -52,7 +53,8 @@ case class EthBlockResponse(
5253
gasUsed: BigInt,
5354
timestamp: BigInt,
5455
transactions: Either[Seq[ByteString], Seq[TransactionResponse]],
55-
uncles: Seq[ByteString]
56+
uncles: Seq[ByteString],
57+
coinbase: Option[ByteString]
5658
) extends BaseBlockResponse
5759

5860
//scalastyle:off method.length
@@ -81,7 +83,8 @@ case class BlockResponse(
8183
transactions: Either[Seq[ByteString], Seq[TransactionResponse]],
8284
uncles: Seq[ByteString],
8385
signature: String,
84-
signer: String
86+
signer: String,
87+
coinbase: Option[ByteString]
8588
) extends BaseBlockResponse {
8689
val chainWeight: Option[ChainWeight] = for {
8790
lcn <- lastCheckpointNumber
@@ -97,7 +100,8 @@ object BlockResponse {
97100
block: Block,
98101
weight: Option[ChainWeight] = None,
99102
fullTxs: Boolean = false,
100-
pendingBlock: Boolean = false
103+
pendingBlock: Boolean = false,
104+
coinbase: Option[ByteString] = None
101105
): BlockResponse = {
102106
val transactions =
103107
if (fullTxs)
@@ -129,9 +133,9 @@ object BlockResponse {
129133
BlockResponse(
130134
number = block.header.number,
131135
hash = if (pendingBlock) None else Some(block.header.hash),
132-
mixHash = if (pendingBlock) None else Some(block.header.mixHash),
136+
mixHash = if (block.header.mixHash.isEmpty) None else Some(block.header.mixHash),
133137
parentHash = block.header.parentHash,
134-
nonce = if (pendingBlock) None else Some(block.header.nonce),
138+
nonce = if (block.header.nonce.isEmpty) None else Some(block.header.nonce),
135139
sha3Uncles = block.header.ommersHash,
136140
logsBloom = block.header.logsBloom,
137141
transactionsRoot = block.header.transactionsRoot,
@@ -151,7 +155,8 @@ object BlockResponse {
151155
transactions = transactions,
152156
uncles = block.body.uncleNodesList.map(_.hash),
153157
signature = signatureStr,
154-
signer = signerStr
158+
signer = signerStr,
159+
coinbase = None
155160
)
156161
}
157162

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ trait SensitiveInformationToString {
1818

1919
case class JsonRpcRequest(jsonrpc: String, method: String, params: Option[JArray], id: Option[JValue])
2020
extends SensitiveInformationToString {
21-
override def toString(): String = {
21+
22+
def inspect: String = {
2223
implicit val formats: Formats = DefaultFormats
2324
"JsonRpcRequest" + (jsonrpc, method, params.map(write(_)), id.map(write(_))).toString
2425
}
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package io.iohk.ethereum.jsonrpc
22

3+
import org.json4s.native.Serialization.write
34
import org.json4s.JsonAST.JValue
5+
import org.json4s.DefaultFormats
6+
import org.json4s.Formats
47

5-
case class JsonRpcResponse(jsonrpc: String, result: Option[JValue], error: Option[JsonRpcError], id: JValue)
8+
case class JsonRpcResponse(jsonrpc: String, result: Option[JValue], error: Option[JsonRpcError], id: JValue) {
9+
def inspect: String = {
10+
implicit val formats: Formats = DefaultFormats
11+
"JsonRpcResponse" + (jsonrpc, result.map(write(_)), error.map(write(_))).toString
12+
}
13+
}

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,16 +135,17 @@ class TestService(
135135

136136
def mineBlocks(request: MineBlocksRequest): ServiceResponse[MineBlocksResponse] = {
137137
def mineBlock(): Task[Unit] = {
138-
getBlockForMining(blockchain.getBestBlock().get).map { blockForMining =>
139-
val res = testLedgerWrapper.ledger.importBlock(blockForMining.block)
140-
log.info("Block mining result: " + res)
141-
pendingTransactionsManager ! PendingTransactionsManager.ClearPendingTransactions
142-
consensus.blockTimestamp += 1
143-
}
138+
getBlockForMining(blockchain.getBestBlock().get)
139+
.flatMap(blockForMining => testLedgerWrapper.ledger.importBlock(blockForMining.block))
140+
.map { res =>
141+
log.info("Block mining result: " + res)
142+
pendingTransactionsManager ! PendingTransactionsManager.ClearPendingTransactions
143+
consensus.blockTimestamp += 1
144+
}
144145
}
145146

146-
def doNTimesF(n: Int)(fn: Task[Unit]): Task[Unit] = fn.flatMap { res =>
147-
if (n <= 1) Task.now(res)
147+
def doNTimesF(n: Int)(fn: Task[Unit]): Task[Unit] = fn.flatMap { _ =>
148+
if (n <= 1) Task.unit
148149
else doNTimesF(n - 1)(fn)
149150
}
150151

@@ -194,7 +195,7 @@ class TestService(
194195
implicit val timeout = Timeout(5.seconds)
195196
pendingTransactionsManager
196197
.askFor[PendingTransactionsResponse](PendingTransactionsManager.GetPendingTransactions)
197-
// .timeout(timeout.duration)
198+
.timeout(timeout.duration)
198199
.onErrorRecover { case _ => PendingTransactionsResponse(Nil) }
199200
.map { pendingTxs =>
200201
consensus.blockGenerator
@@ -207,7 +208,7 @@ class TestService(
207208
)
208209
.pendingBlock
209210
}
210-
// .timeout(timeout.duration)
211+
.timeout(timeout.duration)
211212
}
212213

213214
def getAccountsInRange(request: AccountsInRangeRequest): ServiceResponse[AccountsInRangeResponse] = ???

src/main/scala/io/iohk/ethereum/jsonrpc/serialization/JsonSerializers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.json4s.{CustomSerializer, DefaultFormats, Formats, JNull, JString}
88

99
object JsonSerializers {
1010
implicit val formats: Formats =
11-
DefaultFormats + UnformattedDataJsonSerializer + QuantitiesSerializer + OptionNoneToJNullSerializer + AddressJsonSerializer
11+
DefaultFormats.preservingEmptyValues + UnformattedDataJsonSerializer + QuantitiesSerializer + OptionNoneToJNullSerializer + AddressJsonSerializer
1212

1313
object UnformattedDataJsonSerializer
1414
extends CustomSerializer[ByteString](_ =>

src/main/scala/io/iohk/ethereum/jsonrpc/server/controllers/JsonRpcBaseController.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ trait JsonRpcBaseController {
4949
def handleRequest(request: JsonRpcRequest): Task[JsonRpcResponse] = {
5050
val startTimeNanos = System.nanoTime()
5151

52-
log.debug("received request {}", request)
52+
log.debug(s"received request ${request.inspect}")
5353

5454
val notFoundFn: PartialFunction[JsonRpcRequest, Task[JsonRpcResponse]] = { case _ =>
5555
JsonRpcControllerMetrics.NotFoundMethodsCounter.increment()
@@ -76,6 +76,7 @@ trait JsonRpcBaseController {
7676
JsonRpcControllerMetrics.recordMethodTime(request.method, time)
7777
}
7878
}
79+
.flatTap { response => Task { log.debug(s"sending response ${response.inspect}") } }
7980
.onErrorRecoverWith { case t: Throwable =>
8081
JsonRpcControllerMetrics.MethodsExceptionCounter.increment()
8182
log.error(s"Error serving request: ${request.toStringWithSensitiveInformation}", t)

src/main/scala/io/iohk/ethereum/nodebuilder/NodeBuilder.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,8 @@ trait TestServiceBuilder {
368368
}
369369

370370
trait TestEthBlockServiceBuilder extends EthBlocksServiceBuilder {
371-
self: BlockchainBuilder with TestLedgerBuilder =>
372-
override lazy val ethBlocksService = new TestEthBlockServiceWrapper(blockchain, ledger)
371+
self: BlockchainBuilder with TestLedgerBuilder with ConsensusBuilder =>
372+
override lazy val ethBlocksService = new TestEthBlockServiceWrapper(blockchain, ledger, consensus)
373373
}
374374

375375
trait EthProofServiceBuilder {

src/main/scala/io/iohk/ethereum/testmode/TestEthBlockServiceWrapper.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import io.iohk.ethereum.jsonrpc.EthBlocksService.{BlockByBlockHashResponse, Bloc
55
import io.iohk.ethereum.jsonrpc.{BaseBlockResponse, EthBlockResponse, EthBlocksService, ServiceResponse}
66
import io.iohk.ethereum.ledger.Ledger
77
import io.iohk.ethereum.utils.Logger
8+
import io.iohk.ethereum.consensus.Consensus
9+
import akka.util.ByteString
810

9-
class TestEthBlockServiceWrapper(blockchain: Blockchain, ledger: Ledger)
11+
class TestEthBlockServiceWrapper(blockchain: Blockchain, ledger: Ledger, consensus: Consensus)
1012
extends EthBlocksService(blockchain, ledger)
1113
with Logger {
1214

@@ -41,7 +43,10 @@ class TestEthBlockServiceWrapper(blockchain: Blockchain, ledger: Ledger)
4143
.map(
4244
_.map(blockByBlockResponse =>
4345
BlockByNumberResponse(
44-
blockByBlockResponse.blockResponse.map(response => toEthResponse(response))
46+
blockByBlockResponse.blockResponse
47+
.map(response =>
48+
toEthResponse(response).copy(coinbase = Some(ByteString(consensus.config.generic.coinbase.toArray)))
49+
)
4550
)
4651
)
4752
)
@@ -66,6 +71,7 @@ class TestEthBlockServiceWrapper(blockchain: Blockchain, ledger: Ledger)
6671
response.gasUsed,
6772
response.timestamp,
6873
response.transactions,
69-
response.uncles
74+
response.uncles,
75+
response.coinbase
7076
)
7177
}

0 commit comments

Comments
 (0)