private void assertBlockResultMatchesBlock(final JsonObject result, final Block block) { final BlockHeader header = block.getHeader(); assertThat(Hash.fromHexString(result.getString("parentHash"))) .isEqualTo(header.getParentHash()); assertThat(Hash.fromHexString(result.getString("sha3Uncles"))) .isEqualTo(header.getOmmersHash()); assertThat(Hash.fromHexString(result.getString("transactionsRoot"))) .isEqualTo(header.getTransactionsRoot()); assertThat(Hash.fromHexString(result.getString("stateRoot"))).isEqualTo(header.getStateRoot()); assertThat(Hash.fromHexString(result.getString("receiptsRoot"))) .isEqualTo(header.getReceiptsRoot()); assertThat(Address.fromHexString(result.getString("miner"))).isEqualTo(header.getCoinbase()); assertThat(UInt256.fromHexString(result.getString("difficulty"))) .isEqualTo(header.getDifficulty()); assertThat(BytesValue.fromHexString(result.getString("extraData"))) .isEqualTo(header.getExtraData()); assertThat(hexStringToInt(result.getString("size"))).isEqualTo(block.calculateSize()); assertThat(Long.decode(result.getString("gasLimit"))).isEqualTo(header.getGasLimit()); assertThat(Long.decode(result.getString("gasUsed"))).isEqualTo(header.getGasUsed()); assertThat(Long.decode(result.getString("timestamp"))).isEqualTo(header.getTimestamp()); assertThat(Long.decode(result.getString("number"))).isEqualTo(header.getNumber()); // Nonce is a data field and should represent 8 bytes exactly final String nonceResult = result.getString("nonce").toLowerCase(); assertThat(nonceResult.length() == 18 && nonceResult.startsWith("0x")).isTrue(); assertThat(Long.parseUnsignedLong(nonceResult.substring(2), 16)).isEqualTo(header.getNonce()); assertThat(Hash.fromHexString(result.getString("hash"))).isEqualTo(header.getHash()); assertThat(LogsBloomFilter.fromHexString(result.getString("logsBloom"))) .isEqualTo(header.getLogsBloom()); }
@Test public void headerNewerThanCurrentSystemFailsValidation() { final long acceptableClockDrift = 5; final TimestampBoundedByFutureParameter uut00 = new TimestampBoundedByFutureParameter(acceptableClockDrift); final TimestampMoreRecentThanParent uut01 = new TimestampMoreRecentThanParent(10); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); // Create Parent Header @ 'now' headerBuilder.timestamp( TimeUnit.SECONDS.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS)); final BlockHeader parent = headerBuilder.buildHeader(); // Create header for validation with a timestamp in the future (1 second too far away) headerBuilder.timestamp(parent.getTimestamp() + acceptableClockDrift + 1); final BlockHeader header = headerBuilder.buildHeader(); assertThat(uut00.validate(header, parent)).isFalse(); assertThat(uut01.validate(header, parent)).isFalse(); }
@Test public void headerTimestampSufficientlyFarIntoFutureVadidatesSuccessfully() { final TimestampBoundedByFutureParameter uut00 = new TimestampBoundedByFutureParameter(0); final TimestampMoreRecentThanParent uut01 = new TimestampMoreRecentThanParent(10); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); // Note: This is 10 seconds after Unix epoch (i.e. long way in the past.) headerBuilder.timestamp(10); final BlockHeader parent = headerBuilder.buildHeader(); headerBuilder.timestamp(parent.getTimestamp() + 11); final BlockHeader header = headerBuilder.buildHeader(); assertThat(uut00.validate(header, parent)).isTrue(); assertThat(uut01.validate(header, parent)).isTrue(); }
@Test public void futureHeadersAreValidIfTimestampWithinTolerance() { final long acceptableClockDrift = 5; final TimestampBoundedByFutureParameter uut00 = new TimestampBoundedByFutureParameter(acceptableClockDrift); final TimestampMoreRecentThanParent uut01 = new TimestampMoreRecentThanParent(10); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); // Create Parent Header @ 'now' headerBuilder.timestamp( TimeUnit.SECONDS.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS)); final BlockHeader parent = headerBuilder.buildHeader(); // Create header for validation with a timestamp in the future (1 second too far away) // (-1) to prevent spurious failures headerBuilder.timestamp(parent.getTimestamp() + acceptableClockDrift - 1); final BlockHeader header = headerBuilder.buildHeader(); assertThat(uut00.validate(header, parent)).isTrue(); assertThat(uut01.validate(header, parent)).isFalse(); } }
@Test public void headerTimestampTooCloseToParentFailsValidation() { final TimestampBoundedByFutureParameter uut00 = new TimestampBoundedByFutureParameter(0); final TimestampMoreRecentThanParent uut01 = new TimestampMoreRecentThanParent(10); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); // Note: This is 10 seconds after Unix epoch (i.e. long way in the past.) headerBuilder.timestamp(10); final BlockHeader parent = headerBuilder.buildHeader(); headerBuilder.timestamp(parent.getTimestamp() + 1); final BlockHeader header = headerBuilder.buildHeader(); assertThat(uut00.validate(header, parent)).isTrue(); assertThat(uut01.validate(header, parent)).isFalse(); }
@Test public void headerTimestampIsBehindParentFailsValidation() { final TimestampBoundedByFutureParameter uut00 = new TimestampBoundedByFutureParameter(0); final TimestampMoreRecentThanParent uut01 = new TimestampMoreRecentThanParent(10); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); // Note: This is 100 seconds after Unix epoch (i.e. long way in the past.) headerBuilder.timestamp(100); final BlockHeader parent = headerBuilder.buildHeader(); headerBuilder.timestamp(parent.getTimestamp() - 11); final BlockHeader header = headerBuilder.buildHeader(); assertThat(uut00.validate(header, parent)).isTrue(); assertThat(uut01.validate(header, parent)).isFalse(); }