in src/main/java/software/amazon/qldb/tutorial/GetBlock.java [101:166]
public static void verifyBlock(String ledgerName, BlockAddress blockAddress) throws Exception {
log.info("Lets verify blocks for ledger with name={}.", ledgerName);
try {
log.info("First, let's get a digest");
GetDigestResult digestResult = GetDigest.getDigest(ledgerName);
BlockAddress tipBlockAddress = Constants.MAPPER.readValue(digestResult.getDigestTipAddress().getIonText(),
BlockAddress.class);
ValueHolder digestTipAddress = digestResult.getDigestTipAddress();
byte[] digestBytes = Verifier.convertByteBufferToByteArray(digestResult.getDigest());
log.info("Got a ledger digest. Digest end address={}, digest={}.",
QldbStringUtils.toUnredactedString(digestTipAddress),
Verifier.toBase64(digestBytes));
GetBlockResult getBlockResult = getBlockWithProof(ledgerName, blockAddress, tipBlockAddress);
JournalBlock block = Constants.MAPPER.readValue(getBlockResult.getBlock().getIonText(), JournalBlock.class);
boolean verified = Verifier.verify(
block.getBlockHash(),
digestBytes,
getBlockResult.getProof().getIonText()
);
if (!verified) {
throw new AssertionError("Block is not verified!");
} else {
log.info("Success! The block is verified.");
}
byte[] alteredDigest = Verifier.flipRandomBit(digestBytes);
log.info("Let's try flipping one bit in the digest and assert that the block is NOT verified. "
+ "The altered digest is: {}.", Verifier.toBase64(alteredDigest));
verified = Verifier.verify(
block.getBlockHash(),
alteredDigest,
getBlockResult.getProof().getIonText()
);
if (verified) {
throw new AssertionError("Expected block to not be verified against altered digest.");
} else {
log.info("Success! As expected flipping a bit in the digest causes verification to fail.");
}
byte[] alteredBlockHash = Verifier.flipRandomBit(block.getBlockHash());
log.info("Let's try flipping one bit in the block's hash and assert that the block is NOT "
+ "verified. The altered block hash is: {}.", Verifier.toBase64(alteredBlockHash));
verified = Verifier.verify(
alteredBlockHash,
digestBytes,
getBlockResult.getProof().getIonText()
);
if (verified) {
throw new AssertionError("Expected altered block hash to not be verified against digest.");
} else {
log.info("Success! As expected flipping a bit in the block hash causes verification to fail.");
}
} catch (Exception e) {
log.error("Failed to verify blocks in the ledger with name={}.", ledgerName, e);
throw e;
}
}