-
Notifications
You must be signed in to change notification settings - Fork 75
/
BlockHeaderSpec.scala
75 lines (65 loc) · 5.48 KB
/
BlockHeaderSpec.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package io.iohk.ethereum.domain
import akka.util.ByteString
import io.iohk.ethereum.domain.BlockHeader._
import io.iohk.ethereum.ObjectGenerators
import org.scalatest.{FreeSpec, Matchers}
import org.bouncycastle.util.encoders.Hex
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks
class BlockHeaderSpec extends FreeSpec with Matchers with ScalaCheckPropertyChecks with ObjectGenerators {
"Block header encoding" - {
"without nonce should be compatible with EthereumJ blocks" in new TestSetup {
//Expected values obtained using EthereumJ
val obtainedBlock1EncodedWithoutNonce = Hex.toHexString(BlockHeader.getEncodedWithoutNonce(block1))
val expectedBlock1EncodedWithoutNonce = "f901e6a0d882d5c210bab4cb7ef0b9f3dc2130cb680959afcd9a8f9bf83ee6f13e2f9da3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495f484419881c6e9b6de7fb3f8ad03763bd49a89a0634a2b20c9e02afdda7157afe384306c5acc4fb9c09b45dc0203c0fbb2fed0e6a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830f1a4c148407d85e8f8084589e0ab998d783010507846765746887676f312e372e33856c696e7578"
assert(obtainedBlock1EncodedWithoutNonce == expectedBlock1EncodedWithoutNonce)
val obtainedBlock2EncodedWithoutNonce = Hex.toHexString(BlockHeader.getEncodedWithoutNonce(block2))
val expectedBlock2EncodedWithoutNonce = "f901e6a0677a5fb51d52321b03552e3c667f602cc489d15fc1d7824445aee6d94a9db2e7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479495f484419881c6e9b6de7fb3f8ad03763bd49a89a0cddeeb071e2f69ad765406fb7c96c0cd42ddfc6ec54535822b564906f9e38e44a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830f1869138407da55238084589e0ab898d783010507846765746887676f312e372e33856c696e7578"
assert(obtainedBlock2EncodedWithoutNonce == expectedBlock2EncodedWithoutNonce)
}
"should be symmetric with decoding" in {
forAll(blockHeaderGen) { blockHeader =>
val encoded: Array[Byte] = blockHeader.toBytes
val decoded = encoded.toBlockHeader
decoded shouldBe blockHeader
}
}
}
trait TestSetup {
val block1 = BlockHeader(
parentHash = ByteString(Hex.decode("d882d5c210bab4cb7ef0b9f3dc2130cb680959afcd9a8f9bf83ee6f13e2f9da3")),
ommersHash = ByteString(Hex.decode("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347")),
beneficiary = ByteString(Hex.decode("95f484419881c6e9b6de7fb3f8ad03763bd49a89")),
stateRoot = ByteString(Hex.decode("634a2b20c9e02afdda7157afe384306c5acc4fb9c09b45dc0203c0fbb2fed0e6")),
transactionsRoot = ByteString(Hex.decode("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")),
receiptsRoot = ByteString(Hex.decode("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")),
logsBloom = ByteString(Hex.decode("00" * 256)),
difficulty = BigInt("989772"),
number = 20,
gasLimit = 131620495,
gasUsed = 0,
unixTimestamp = 1486752441,
extraData = ByteString(Hex.decode("d783010507846765746887676f312e372e33856c696e7578")),
mixHash = ByteString(Hex.decode("6bc729364c9b682cfa923ba9480367ebdfa2a9bca2a652fe975e8d5958f696dd")),
nonce = ByteString(Hex.decode("797a8f3a494f937b")),
treasuryOptOut = None
)
val block2 = BlockHeader(
parentHash = ByteString(Hex.decode("677a5fb51d52321b03552e3c667f602cc489d15fc1d7824445aee6d94a9db2e7")),
ommersHash = ByteString(Hex.decode("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347")),
beneficiary = ByteString(Hex.decode("95f484419881c6e9b6de7fb3f8ad03763bd49a89")),
stateRoot = ByteString(Hex.decode("cddeeb071e2f69ad765406fb7c96c0cd42ddfc6ec54535822b564906f9e38e44")),
transactionsRoot = ByteString(Hex.decode("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")),
receiptsRoot = ByteString(Hex.decode("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")),
logsBloom = ByteString(Hex.decode("00" * 256)),
difficulty = BigInt("989289"),
number = 19,
gasLimit = 131749155,
gasUsed = 0,
unixTimestamp = 1486752440,
extraData = ByteString(Hex.decode("d783010507846765746887676f312e372e33856c696e7578")),
mixHash = ByteString(Hex.decode("7f9ac1ddeafff0f926ed9887b8cf7d50c3f919d902e618b957022c46c8b404a6")),
nonce = ByteString(Hex.decode("3fc7bc671f7cee70")),
treasuryOptOut = None
)
}
}