Skip to content

Commit d276b87

Browse files
Jaap van der Plasdzajkowski
authored andcommitted
fix test API for retesteth WIP
1 parent 7e06e1b commit d276b87

File tree

8 files changed

+84
-42
lines changed

8 files changed

+84
-42
lines changed

src/main/scala/io/iohk/ethereum/blockchain/data/GenesisDataLoader.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ class GenesisDataLoader(blockchain: Blockchain, blockchainConfig: BlockchainConf
9090
val initalRootHash = MerklePatriciaTrie.EmptyRootHash
9191

9292
val stateMptRootHash = genesisData.alloc.zipWithIndex.foldLeft(initalRootHash) {
93-
case (rootHash, (((address, AllocAccount(balance)), idx))) =>
93+
case (rootHash, (((address, genesisAccount), idx))) =>
9494
val mpt = MerklePatriciaTrie[Array[Byte], Account](rootHash, storage)
9595
val paddedAddress = address.reverse.padTo(addressLength, "0").reverse.mkString
9696
val stateRoot = mpt
9797
.put(
9898
crypto.kec256(Hex.decode(paddedAddress)),
99-
Account(blockchainConfig.accountStartNonce, UInt256(BigInt(balance)), emptyTrieRootHash, emptyEvmHash)
99+
Account(nonce = genesisAccount.nonce, balance = genesisAccount.balance, codeHash = genesisAccount.code)
100100
)
101101
.getRootHash
102102
stateRoot
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package io.iohk.ethereum.blockchain.data
22

33
import akka.util.ByteString
4+
import io.iohk.ethereum.domain.UInt256
45

5-
case class AllocAccount(balance: String)
6+
case class PrecompiledAccountConfig(name: String)
7+
8+
case class GenesisAccount(
9+
precompiled: Option[PrecompiledAccountConfig],
10+
balance: UInt256,
11+
code: ByteString,
12+
nonce: UInt256,
13+
storage: Map[UInt256, UInt256]
14+
)
615

716
case class GenesisData(
817
nonce: ByteString,
@@ -12,5 +21,5 @@ case class GenesisData(
1221
gasLimit: String,
1322
coinbase: ByteString,
1423
timestamp: String,
15-
alloc: Map[String, AllocAccount]
24+
alloc: Map[String, GenesisAccount]
1625
)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ case class CheckpointResponse(signatures: Seq[ECDSASignature], signers: Seq[Byte
1313
case class BlockResponse(
1414
number: BigInt,
1515
hash: Option[ByteString],
16+
mixHash: Option[ByteString],
1617
parentHash: ByteString,
1718
nonce: Option[ByteString],
1819
sha3Uncles: ByteString,
@@ -82,6 +83,7 @@ object BlockResponse {
8283
BlockResponse(
8384
number = block.header.number,
8485
hash = if (pendingBlock) None else Some(block.header.hash),
86+
mixHash = if (pendingBlock) None else Some(block.header.mixHash),
8587
parentHash = block.header.parentHash,
8688
nonce = if (pendingBlock) None else Some(block.header.nonce),
8789
sha3Uncles = block.header.ommersHash,

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

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

33
import org.json4s.JsonAST.{JArray, JValue}
4+
import org.json4s.native.Serialization.write
5+
import org.json4s.DefaultFormats
6+
import org.json4s.Formats
47

58
//TODO: work on a more elegant solution
69
trait SensitiveInformationToString {
@@ -14,4 +17,9 @@ trait SensitiveInformationToString {
1417
}
1518

1619
case class JsonRpcRequest(jsonrpc: String, method: String, params: Option[JArray], id: Option[JValue])
17-
extends SensitiveInformationToString
20+
extends SensitiveInformationToString {
21+
override def toString(): String = {
22+
implicit val formats: Formats = DefaultFormats
23+
"JsonRpcRequest" + (jsonrpc, method, params.map(write(_)), id.map(write(_))).toString
24+
}
25+
}

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

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,67 @@ import io.iohk.ethereum.jsonrpc.serialization.{JsonEncoder, JsonMethodDecoder}
77
import org.json4s.JsonAST._
88
import org.json4s.JsonDSL._
99
import org.bouncycastle.util.encoders.Hex
10+
import cats.implicits._
11+
import io.iohk.ethereum.blockchain.data.GenesisAccount
1012

1113
import scala.util.Try
14+
import io.iohk.ethereum.domain.UInt256
1215

1316
object TestJsonMethodsImplicits extends JsonMethodsImplicits {
1417

1518
implicit val test_setChainParams = new JsonMethodDecoder[SetChainParamsRequest]
1619
with JsonEncoder[SetChainParamsResponse] {
17-
private def extractAccounts(accountsJson: JValue): Either[JsonRpcError, Map[ByteString, AccountConfig]] = {
18-
val accounts = accountsJson.asInstanceOf[JObject].values.collect { case (key, accObj: Map[_, _]) =>
19-
val rawWei = accObj.asInstanceOf[Map[String, Any]]("wei").asInstanceOf[String]
20-
val wei =
21-
if (rawWei.startsWith("0x")) BigInt(rawWei.replace("0x", ""), 16)
22-
else BigInt(rawWei, 10)
23-
ByteString(Hex.decode(key.replace("0x", ""))) -> AccountConfig(None, wei)
24-
}
25-
Right(accounts)
26-
}
20+
21+
private def extractAccount(accountJson: JValue): Either[JsonRpcError, GenesisAccount] =
22+
for {
23+
storageObject <- Try((accountJson \ "storage").extract[JObject]).toEither.left.map(e =>
24+
InvalidParams(e.toString())
25+
)
26+
storage <- storageObject.obj.traverse {
27+
case (key, JString(value)) =>
28+
Try(UInt256(decode(key)) -> UInt256(decode(value))).toEither.left.map(e => InvalidParams(e.toString()))
29+
case _ => Left(InvalidParams())
30+
}
31+
balance = UInt256(decode((accountJson \ "balance").extract[String]))
32+
code = ByteString(decode((accountJson \ "code").extract[String]))
33+
nonce = UInt256(decode((accountJson \ "nonce").extract[String]))
34+
} yield GenesisAccount(
35+
None,
36+
balance,
37+
code,
38+
nonce,
39+
storage.toMap
40+
)
41+
42+
private def extractAccounts(accountsJson: JValue): Either[JsonRpcError, Map[ByteString, GenesisAccount]] =
43+
for {
44+
mapping <- Try(accountsJson.extract[JObject]).toEither.left.map(e => InvalidParams(e.toString()))
45+
accounts <- mapping.obj.traverse { case (key, value) =>
46+
for {
47+
address <- extractBytes(key)
48+
account <- extractAccount(value)
49+
} yield address -> account
50+
}
51+
} yield accounts.toMap
2752

2853
private def extractBlockchainParams(blockchainParamsJson: JValue): Either[JsonRpcError, BlockchainParams] = {
2954
for {
3055
eIP150ForkBlock <- extractQuantity(blockchainParamsJson \ "EIP150ForkBlock")
3156
eIP158ForkBlock <- extractQuantity(blockchainParamsJson \ "EIP158ForkBlock")
32-
accountStartNonce <- extractQuantity(blockchainParamsJson \ "accountStartNonce")
33-
allowFutureBlocks <- Try((blockchainParamsJson \ "allowFutureBlocks").extract[Boolean]).toEither.left.map(_ =>
34-
InvalidParams()
35-
)
36-
blockReward <- extractQuantity(blockchainParamsJson \ "blockReward")
57+
accountStartNonce <- optionalQuantity(blockchainParamsJson \ "accountStartNonce")
58+
allowFutureBlocks = (blockchainParamsJson \ "allowFutureBlocks").extractOrElse(true)
59+
blockReward <- optionalQuantity(blockchainParamsJson \ "blockReward")
3760
byzantiumForkBlock <- extractQuantity(blockchainParamsJson \ "byzantiumForkBlock")
3861
homesteadForkBlock <- extractQuantity(blockchainParamsJson \ "homesteadForkBlock")
39-
maximumExtraDataSize <- extractQuantity(blockchainParamsJson \ "maximumExtraDataSize")
4062
} yield BlockchainParams(
4163
eIP150ForkBlock,
4264
eIP158ForkBlock,
43-
accountStartNonce,
65+
accountStartNonce.getOrElse(0),
4466
allowFutureBlocks,
45-
blockReward,
67+
blockReward.getOrElse(0),
4668
byzantiumForkBlock,
4769
homesteadForkBlock,
48-
maximumExtraDataSize
70+
0
4971
)
5072
}
5173

@@ -54,7 +76,7 @@ object TestJsonMethodsImplicits extends JsonMethodsImplicits {
5476
author <- extractBytes((genesisJson \ "author").extract[String])
5577
extraData <- extractBytes((genesisJson \ "extraData").extract[String])
5678
gasLimit <- extractQuantity(genesisJson \ "gasLimit")
57-
parentHash <- extractBytes((genesisJson \ "parentHash").extract[String])
79+
parentHash <- extractBytes((genesisJson \ "parentHash").extractOrElse(""))
5880
timestamp <- extractBytes((genesisJson \ "timestamp").extract[String])
5981
} yield GenesisParams(author, extraData, gasLimit, parentHash, timestamp)
6082
}

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

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package io.iohk.ethereum.jsonrpc
33
import akka.actor.ActorRef
44
import akka.util.{ByteString, Timeout}
55
import cats.syntax.functor._
6-
import io.iohk.ethereum.blockchain.data.{AllocAccount, GenesisData, GenesisDataLoader}
6+
import io.iohk.ethereum.blockchain.data.{GenesisAccount, GenesisData, GenesisDataLoader}
77
import io.iohk.ethereum.consensus.ConsensusConfig
88
import io.iohk.ethereum.consensus.blocks._
99
import io.iohk.ethereum.domain.{Address, Block, BlockchainImpl, UInt256}
@@ -35,13 +35,11 @@ object TestService {
3535
homesteadForkBlock: BigInt,
3636
maximumExtraDataSize: BigInt
3737
)
38-
case class PrecompiledAccountConfig(name: String)
39-
case class AccountConfig(precompiled: Option[PrecompiledAccountConfig], wei: BigInt)
4038
case class ChainParams(
4139
genesis: GenesisParams,
4240
blockchainParams: BlockchainParams,
4341
sealEngine: String,
44-
accounts: Map[ByteString, AccountConfig]
42+
accounts: Map[ByteString, GenesisAccount]
4543
)
4644

4745
case class SetChainParamsRequest(chainParams: ChainParams)
@@ -93,7 +91,7 @@ class TestService(
9391
coinbase = request.chainParams.genesis.author,
9492
timestamp = Hex.toHexString(request.chainParams.genesis.timestamp.toArray[Byte]),
9593
alloc = request.chainParams.accounts.map { case (addr, acc) =>
96-
Hex.toHexString(addr.toArray[Byte]) -> AllocAccount(acc.wei.toString)
94+
Hex.toHexString(addr.toArray[Byte]) -> acc
9795
}
9896
)
9997

@@ -150,18 +148,19 @@ class TestService(
150148
implicit val timeout = Timeout(5.seconds)
151149
pendingTransactionsManager
152150
.askFor[PendingTransactionsResponse](PendingTransactionsManager.GetPendingTransactions)
153-
.timeout(timeout.duration)
151+
// .timeout(timeout.duration)
154152
.onErrorRecover { case _ => PendingTransactionsResponse(Nil) }
155-
.flatMap { pendingTxs =>
156-
val pb = consensus.blockGenerator.generateBlock(
157-
parentBlock,
158-
pendingTxs.pendingTransactions.map(_.stx.tx),
159-
etherbase,
160-
Nil,
161-
None
162-
)
163-
Task.now(pb.pendingBlock)
153+
.map { pendingTxs =>
154+
consensus.blockGenerator
155+
.generateBlock(
156+
parentBlock,
157+
pendingTxs.pendingTransactions.map(_.stx.tx),
158+
etherbase,
159+
Nil,
160+
None
161+
)
162+
.pendingBlock
164163
}
165-
.timeout(timeout.duration)
164+
// .timeout(timeout.duration)
166165
}
167166
}

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

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

52+
log.debug("received request {}", request)
53+
5254
val notFoundFn: PartialFunction[JsonRpcRequest, Task[JsonRpcResponse]] = { case _ =>
5355
JsonRpcControllerMetrics.NotFoundMethodsCounter.increment()
5456
Task.now(errorResponse(request, MethodNotFound))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ trait JSONRpcControllerBuilder {
554554
with CheckpointingServiceBuilder
555555
with MantisServiceBuilder =>
556556

557-
private val testService =
557+
private lazy val testService =
558558
if (Config.testmode) Some(this.asInstanceOf[TestServiceBuilder].testService)
559559
else None
560560

0 commit comments

Comments
 (0)