public static void verifyBlock()

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;
        }
    }