private void insertRoundToBlockHeader(final int round) { final IbftExtraData extraData = new IbftExtraData( BytesValue.wrap(new byte[32]), Collections.emptyList(), empty(), round, validators); final BlockHeader header = mock(BlockHeader.class); when(header.getExtraData()).thenReturn(extraData.encode()); when(block.getHeader()).thenReturn(header); }
@Test public void recoverProposerAddressFromSeal() { final IbftExtraData ibftExtraData = IbftExtraData.decode(header.getExtraData()); final Address proposerAddress = IbftBlockHashing.recoverProposerAddress(header, ibftExtraData); assertThat(proposerAddress).isEqualTo(PROPOSER_IN_HEADER); }
@Test public void recoverProposerAddressFromSeal() { final CliqueExtraData cliqueExtraData = CliqueExtraData.decode(expectedHeader.getExtraData()); final Address proposerAddress = CliqueBlockHashing.recoverProposerAddress(expectedHeader, cliqueExtraData); assertThat(VALIDATORS_IN_HEADER.contains(proposerAddress)).isTrue(); }
@Test public void createFromJsonNoAllocs() throws Exception { final GenesisState genesisState = GenesisState.fromJson( Resources.toString(GenesisStateTest.class.getResource("genesis2.json"), Charsets.UTF_8), MainnetProtocolSchedule.create()); final BlockHeader header = genesisState.getBlock().getHeader(); assertThat(header.getStateRoot()).isEqualTo(Hash.EMPTY_TRIE_HASH); assertThat(header.getTransactionsRoot()).isEqualTo(Hash.EMPTY_TRIE_HASH); assertThat(header.getReceiptsRoot()).isEqualTo(Hash.EMPTY_TRIE_HASH); assertThat(header.getOmmersHash()).isEqualTo(Hash.EMPTY_LIST_HASH); assertThat(header.getExtraData()).isEqualTo(BytesValue.EMPTY); assertThat(header.getParentHash()).isEqualTo(Hash.ZERO); }
@Test public void readValidatorListFromExtraData() { final CliqueExtraData cliqueExtraData = CliqueExtraData.decode(expectedHeader.getExtraData()); assertThat(cliqueExtraData.getValidators()).isEqualTo(VALIDATORS_IN_HEADER); }
@Test public void readValidatorListFromExtraData() { final IbftExtraData ibftExtraData = IbftExtraData.decode(header.getExtraData()); Assertions.assertThat(ibftExtraData.getValidators()).isEqualTo(VALIDATORS_IN_HEADER); }
@Test public void recoverCommitterAddresses() { final IbftExtraData ibftExtraData = IbftExtraData.decode(header.getExtraData()); final List<Address> committers = IbftBlockHashing.recoverCommitterAddresses(header, ibftExtraData); assertThat(committers).isEqualTo(COMMITTERS_IN_HEADER); }
@Test public void testRecoverCommitterAddresses() { List<Address> actualCommitterAddresses = IbftBlockHashing.recoverCommitterAddresses( HEADER_TO_BE_HASHED, IbftExtraData.decode(HEADER_TO_BE_HASHED.getExtraData())); List<Address> expectedCommitterAddresses = COMMITTERS_KEY_PAIRS .stream() .map(keyPair -> Util.publicKeyToAddress(keyPair.getPublicKey())) .collect(Collectors.toList()); assertThat(actualCommitterAddresses).isEqualTo(expectedCommitterAddresses); }
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()); }
private IbftExtraData createExtraDataWithCommitSeals( final BlockHeader header, final Collection<KeyPair> committerKeyPairs) { final IbftExtraData extraDataInHeader = IbftExtraData.decode(header.getExtraData()); final Hash headerHashForCommitters = IbftBlockHashing.calculateDataHashForCommittedSeal(header, extraDataInHeader); final List<Signature> commitSeals = committerKeyPairs .stream() .map(keys -> SECP256K1.sign(headerHashForCommitters, keys)) .collect(Collectors.toList()); return new IbftExtraData( extraDataInHeader.getVanityData(), commitSeals, extraDataInHeader.getProposerSeal(), extraDataInHeader.getValidators()); }
@Test public void testCalculateDataHashForCommittedSeal() { Hash dataHahsForCommittedSeal = IbftBlockHashing.calculateDataHashForCommittedSeal( HEADER_TO_BE_HASHED, IbftExtraData.decode(HEADER_TO_BE_HASHED.getExtraData())); BlockHeaderBuilder builder = setHeaderFieldsExceptForExtraData(); List<Signature> commitSeals = COMMITTERS_KEY_PAIRS .stream() .map(keyPair -> SECP256K1.sign(dataHahsForCommittedSeal, keyPair)) .collect(Collectors.toList()); IbftExtraData extraDataWithCommitSeals = new IbftExtraData(VANITY_DATA, commitSeals, VOTE, ROUND, VALIDATORS); builder.extraData(extraDataWithCommitSeals.encode()); BlockHeader actualHeader = builder.buildBlockHeader(); assertThat(actualHeader).isEqualTo(HEADER_TO_BE_HASHED); }
@Test public void insufficientCommitSealsFailsValidation() { final KeyPair committerKeyPair = KeyPair.generate(); final Address committerAddress = Address.extract(Hash.hash(committerKeyPair.getPublicKey().getEncodedBytes())); final List<Address> validators = singletonList(committerAddress); final VoteTally voteTally = new VoteTally(validators); final ProtocolContext<IbftContext> context = new ProtocolContext<>(null, null, new IbftContext(voteTally, null)); final BlockHeader header = createProposedBlockHeader(validators, emptyList(), false); // Note that no committer seals are in the header's IBFT extra data. final IbftExtraData headerExtraData = IbftExtraData.decode(header.getExtraData()); assertThat(headerExtraData.getSeals().size()).isEqualTo(0); assertThat(commitSealsValidationRule.validate(header, null, context)).isFalse(); }
@Test public void createFromJsonWithAllocs() throws Exception { final GenesisState genesisState = GenesisState.fromJson( Resources.toString(GenesisStateTest.class.getResource("genesis1.json"), Charsets.UTF_8), MainnetProtocolSchedule.create()); final BlockHeader header = genesisState.getBlock().getHeader(); assertThat(header.getStateRoot()) .isEqualTo( Hash.fromHexString( "0x92683e6af0f8a932e5fe08c870f2ae9d287e39d4518ec544b0be451f1035fd39")); assertThat(header.getTransactionsRoot()).isEqualTo(Hash.EMPTY_TRIE_HASH); assertThat(header.getReceiptsRoot()).isEqualTo(Hash.EMPTY_TRIE_HASH); assertThat(header.getOmmersHash()).isEqualTo(Hash.EMPTY_LIST_HASH); assertThat(header.getExtraData()).isEqualTo(BytesValue.EMPTY); assertThat(header.getParentHash()).isEqualTo(Hash.ZERO); final DefaultMutableWorldState worldState = new DefaultMutableWorldState( new KeyValueStorageWorldStateStorage(new InMemoryKeyValueStorage())); genesisState.writeStateTo(worldState); final Account first = worldState.get(Address.fromHexString("0x0000000000000000000000000000000000000001")); final Account second = worldState.get(Address.fromHexString("0x0000000000000000000000000000000000000002")); assertThat(first).isNotNull(); assertThat(first.getBalance().toLong()).isEqualTo(111111111L); assertThat(second).isNotNull(); assertThat(second.getBalance().toLong()).isEqualTo(222222222L); }
IbftExtraData.decode(capturedBlock.getValue().getHeader().getExtraData()); assertThat(importedExtraData.getSeals()).containsOnly(remoteCommitSeal, localCommitSeal);
payloadArgCaptor.getValue().getPayload().getBlock().getHeader().getExtraData()); assertThat(proposedExtraData.getRound()).isEqualTo(roundIdentifier.getRoundNumber());
@Test public void insufficientCommitSealsFailsValidation() { final BlockHeaderTestFixture builder = new BlockHeaderTestFixture(); builder.number(1); // must NOT be block 0, as that should not contain seals at all final KeyPair proposerKeyPair = KeyPair.generate(); final Address proposerAddress = Address.extract(Hash.hash(proposerKeyPair.getPublicKey().getEncodedBytes())); final List<Address> validators = singletonList(proposerAddress); final VoteTally voteTally = new VoteTally(validators); final ProtocolContext<IbftContext> context = new ProtocolContext<>(null, null, new IbftContext(voteTally, null)); final IbftExtraDataValidationRule extraDataValidationRule = new IbftExtraDataValidationRule(true); final BlockHeader header = createProposedBlockHeader(proposerKeyPair, validators); // Note that no committer seals are in the header's IBFT extra data. final IbftExtraData headerExtraData = IbftExtraData.decode(header.getExtraData()); Assertions.assertThat(headerExtraData.getSeals().size()).isEqualTo(0); assertThat(extraDataValidationRule.validate(header, null, context)).isFalse(); }
final IbftExtraData extraData = IbftExtraData.decode(header.getExtraData()); assertThat(block.getHash()) .isEqualTo(IbftBlockHashing.calculateDataHashForCommittedSeal(header, extraData));