Amazon QLDB (Quantum Ledger Database) - Deep Dive.
Scope:
- The Concept of Amazon QLDB,
- Key Characteristics,
- QLDB (Quantum Ledger Database) Architecture (three main layers),
- QLDB vs Blockchain,
- Querying QLDB Samples,
- Use Cases,
- Strengths,
- Limitations,
- When to Use QLDB or DynamoDB or RDS,
- Integration Patterns,
- Best Practices,
- Insights.
The Concept: Amazon
QLDB
- Amazon QLDB is a fully managed ledger database designed for applications that require:
- Immutability,
- Cryptographic verification (is a process that uses mathematical algorithms to confirm the authenticity, integrity, and origin of data),
- A complete history of data changes.
- Unlike traditional relational or NoSQL databases, QLDB provides a verifiable transaction log (journal) that ensures all changes are recorded in a sequential, immutable, and cryptographically verifiable way.
- Amazon QLDB is not blockchain, but it shares
blockchain-like properties while being centralized and fully managed
by AWS (no
distributed consensus is needed).
Key Characteristics
- Immutable Journal
- Every change is appended to a journal (log-structured storage).
- Historical records cannot be altered or deleted.
- Cryptographic Verification
- Uses a SHA-256 hash chain to ensure integrity.
- twtech can query and verify data cryptographically to
ensure no tampering.
- Transparent History
- Query not only current state but also full historical
state with AS OF queries.
- Useful for auditing and regulatory compliance.
- SQL-Compatible API
- Uses a SQL-like language called PartiQL (open-source, SQL-compatible query
language).
- Lets you query both structured/unstructured data.
- Serverless & Fully Managed
- No infrastructure to manage.
- Scales automatically with demand.
- High durability (journal
is replicated across multiple AZs).
- Strong Consistency & ACID Transactions
- Transactions are atomic, consistent, isolated, and
durable.
- Unlike blockchain (eventually
consistent consensus), QLDB guarantees strong consistency.
QLDB (Quantum Ledger Database) Architecture (three main layers):
- Journal (Immutable Log)
- Append-only. Stores every committed transaction.
- Cryptographically verifiable with SHA-256 hashing.
- Cannot be deleted or modified.
- Ledger State
- Represents the current state of the data.
- Derived from the journal by replaying committed
transactions.
- Queryable via PartiQL.
- Indexing & Query Engine
- Uses PartiQL (SQL-compatible).
- Allows twtech to query not just the current state but
also historical versions.
- Can execute time-travel queries (AS OF, FROM HISTORY).
QLDB vs Blockchain
|
Feature |
QLDB |
Blockchain |
|
|
Consensus |
Centralized (AWS trusted
authority) |
Decentralized, peer-to-peer |
|
|
Immutability |
Append-only journal,
cryptographically verifiable |
Append-only chain,
cryptographically verifiable |
|
|
Trust Model |
Trusted central authority |
Trustless, distributed |
|
|
Performance |
Higher throughput, lower latency |
Slower due to consensus |
|
|
Management |
Fully managed (serverless) |
twtech manages nodes and consensus |
|
|
Use Case |
Internal audit, compliance, supply
chain, finance ledgers |
Multi-party trustless systems (e.g., crypto) |
|
Querying QLDB Samples
- Uses PartiQL (SQL-compatible query Language).:
# Insert:
INSERT
INTO Customers
{'CustomerId': 'C001', 'Name': 'twtech-pat', 'Balance': 1000}
# Update:
UPDATE
Customers
SET
Balance = Balance + 200
WHERE CustomerId = 'C001'
# History Query (time travel):
SELECT *
FROM history(Customers) AS h
WHERE h.data.CustomerId = 'C001'
# Point-in-time query:
SELECT * FROM Customers AS OF '2026-08-01T00:00:00Z'
# Verify Digest:
# bash
aws qldb get-digest --name twtech-Ledger
Use Cases
- Banking systems, payment ledgers, accounting records.
- Track product movement with auditability.
- Land registries, licenses, audit logs.
- Medical record history, consent tracking.
- Immutable salary, bonus, and employment records.
Strengths
- Immutability and verifiability.
- Fully managed (serverless).
- SQL-like querying (easier than blockchain smart contracts).
- Strong consistency and ACID compliance(Atomicity, Consistency, Isolation, and Durability, ensure data is processed accurately, reliably, and without corruption, even during system failures).
- Simple integration with AWS ecosystem (Lambda, API Gateway, Kinesis, etc.).
Limitations
- Centralized — requires trust in AWS (not decentralized like blockchain).
- No native multi-region replication (journal is AZ-redundant, but not cross-region).
- Not suited for extremely high-frequency
trading-like workloads (latency can be
higher than RDS/DynamoDB).
- Query performance not as optimized as DynamoDB for massive scale OLTP.
- No user-defined indexes (only primary key & automatically managed indexes).
When to Use QLDB or
DynamoDB or RDS
- QLDB → When twtech needs:
- Immutability(cannot be altered or tampered with after it is created),
- History,
- Cryptographic verification.
- DynamoDB → When twtech needs:
- High scale,
- Low latency,
- Flexible schema,
- But don’t need audit history.
- RDS → When twtech needs:
- Complex relational queries,
- Joins,
- Transactions,
- But don’t need immutability.
Integration Patterns
- With Lambda →
Process transactions serverlessly.
- With API Gateway → Expose ledger APIs securely.
- With Kinesis or EventBridge → Stream journal changes for downstream analytics.
- With S3 + Athena → Export journal for compliance reporting.
Best Practices
- Use document design carefully (since PartiQL is
document-oriented).
- Implement digest verification regularly for
integrity proof.
- Use indexes wisely to optimize queries.
- Keep history queries targeted (can be slow if
unbounded).
- Export to S3 for analytics instead of heavy OLAP(Oline Analytical Processing) queries on QLDB(Quantum Ledger Database).
Insights:
QLDB hands-on (works locally today)
Scope:
- Spin up a local QLDB endpoint
(LocalStack).
- Create a ledger (CLI), then create a table and index (QLDB Shell).
- Insert & read documents (Node.js SDK).
- Pull a digest + revision proof (CLI) and verify the document cryptographically (Python SDK).
NB:
- QLDB (ledgers) are:
- append-only;
- queries use PartiQL;
- data is Amazon Ion (JSON-like);
- verification uses get-digest
- and get-revision.
Prerequisite:
- Docker (for LocalStack)
- AWS CLI v2
- Node.js 18+ and npm
- Python 3.9+
- QLDB Shell (CLI for running PartiQL)
# Install the shell (macOS example):
brew tap aws/tap
brew install qldb
(See the QLDB Shell repo for other OSes and
usage.)
1)
Start a local QLDB endpoint
- Either with LocalStack CLI or plain Docker:
# simplest: docker
docker run --rm -it -p
4566:4566 -e SERVICES=qldb localstack/localstack
# LocalStack exposes all AWS service
endpoints at: http://localhost:4566.
# Set throwaway AWS creds for
local use:
export
AWS_ACCESS_KEY_ID=twtech-access-key
export
AWS_SECRET_ACCESS_KEY=twtech-secret-access-key
export
AWS_DEFAULT_REGION=us-east-2
NB:
- twtech is passing --endpoint-url:
- http://localhost:4566 to every AWS CLI command below.
2)
Create a ledger (AWS CLI)
aws --endpoint-url
http://localhost:4566 qldb create-ledger \
--name twtech-ledger \
--permissions-mode STANDARD
NB:
QLDB supports STANDARD permissions mode;
historically ALLOW_ALL existed but STANDARD is recommended.
# Check until it’s ACTIVE:
aws --endpoint-url http://localhost:4566
qldb describe-ledger --name twtech-ledger
In historical AWS: same commands, just omit --endpoint-url.
Core CLI options are:
- create-ledger
- describe-ledger
- list-ledgers
- delete-ledger
3) Open
the QLDB Shell and create schema
# Connect the shell to your local
ledger:
qldb --ledger twtech-ledger --region us-east-2 --endpoint
http://localhost:4566
# Run these PartiQL statements:
-- create a table +
index
CREATE TABLE People;
CREATE INDEX ON People (PersonId);
-- insert one row (Ion =
JSON-like)
INSERT INTO People << {'PersonId': 'twtechP1', 'FirstName': 'twtechuser', 'LastName': 'pat'} >>;
-- read it back
SELECT * FROM People WHERE
PersonId = 'twtechP1';
# To get the document ID
and block address (from the committed/system view):
SELECT metadata.id AS
docId, blockAddress
FROM _ql_committed_People
WHERE data.PersonId = 'twtechP1';
twtech needs docId and blockAddress for
verification. (Committed/system views expose metadata like blockAddress,
hash, and metadata.id.)
4)
Programmatic insert & query with the Node.js SDK
# Install the QLDB driver and peers:
mkdir qldb-node
&& cd qldb-node
npm init -y
npm i
amazon-qldb-driver-nodejs @aws-sdk/client-qldb-session ion-js jsbi
# Create app.js:
// app.js
const { QldbDriver } = require("amazon-qldb-driver-nodejs");
// Point the driver at
LocalStack
const driver = new QldbDriver("twtech-ledger", { region: "us-east-2", endpoint: "http://localhost:4566" });
async function main() {
await driver.executeLambda(async (txn) =>
{
await txn.execute("CREATE TABLE IF NOT
EXISTS People");
await txn.execute("CREATE INDEX IF NOT
EXISTS ON People (PersonId)");
await txn.execute("INSERT INTO People
?", { PersonId: "twtechP2", FirstName: "Robert", LastName: "Foncha"
});
const result = await txn.execute("SELECT
* FROM People WHERE PersonId = ?", "twtechP2");
console.log(JSON.stringify(result.getResultList(),
null, 2));
});
await driver.close();
}
main().catch(console.error);
Run it:
node app.js
# Driver quick-start for reference.
5) Get
a ledger digest (CLI)
# This is the cryptographic
“root” twtech will verify against.
# bash
aws --endpoint-url
http://localhost:4566 qldb get-digest \
--name twtech-ledger > digest.json
cat digest.json
# NB
- Digest (base64 bytes) and
DigestTipAddress.IonText (an Ion struct as a string)
6) Get
a revision proof for twtech document (CLI)
# From step 3 twtech gets:
- docId (e.g.,
84MQvUwiL6I3...)
- blockAddress (as IonText)
- twtech Also grab the DigestTipAddress.IonText from digest.json.
# At this point, twtech can request the proof:
aws --endpoint-url
http://localhost:4566 qldb get-revision \
--name twtech-ledger \
--block-address "IonText={ twtech blockAddress IonText
here }" \
--document-id "twtech-document-id-here" \
--digest-tip-address "IonText={ twtech digest tip IonText
here }" \
> revision.json
# - Revision.IonText (the document revision, incl. its hash)
# - Proof.IonText (a list of intermediate hashes)
(Optional)
- twtech can also fetch the whole block plus a proof using get-block similarly with the following commands.
BlockAddress + DigestTipAddress.
7)
Verify the document cryptographically (Python SDK)
Install deps:
python -m venv .venv
&& source .venv/bin/activate
pip install boto3
amazon.ion ionhash
Create verify.py:
import base64, json,
boto3
from amazon.ion.simpleion import loads
# Point boto3 to
LocalStack
qldb = boto3.client("qldb",
region_name="us-east-2",
endpoint_url="http://localhost:4566",
aws_access_key_id="test", aws_secret_access_key="twtech-key")
LEDGER = "twtech-ledger"
def dot(left: bytes,
right: bytes) -> bytes:
# QLDB's Merkle "dot" is SHA-256
of left||right
import hashlib
return hashlib.sha256(left + right).digest()
# Step 1: get a trusted
digest
dg =
qldb.get_digest(Name=twtech-LEDGER)
expected_digest = dg["Digest"] # bytes
digest_tip_addr = dg["DigestTipAddress"] # {IonText: "..."} or {IonBinary: ...}
# Step 2: from revision.json we
already have a proof for a particular doc
rev = json.load(open("revision.json"))
# Parse Ion fields
proof_hashes =
loads(rev["Proof"]["IonText"]) # list of Ion blobs (bytes)
revision_val =
loads(rev["Revision"]["IonText"])
document_hash = revision_val["hash"] # bytes (Ion blob)
# Step 3: walk the proof
to recompute the digest from the revision hash
calculated = twtech-document_hash
for h in proof_hashes:
calculated = dot(calculated, h)
assert calculated ==
expected_digest, "Verification failed"
print("✅ Verified: revision is
anchored in the ledger digest")
Run it:
python verify.py
NB
- This follows the official verification flow:
- get a digest,
- query twtech revision
- proof,
- then fold the revision hash through each proof node and compare to the digest.
8)
(Optional) View full history with PartiQL
# Grab twtech-document ID,
then:
SELECT * FROM
history(People) AS h
WHERE h.metadata.id = 'twtch-doc-id'
ORDER BY
h.metadata.version ASC;
NB:
- Committed and history views surface metadata like metadata.id, blockAddress, hash, etc.
9)
Clean up (local)
- Stop the LocalStack container & Historical AWS cleanup can be done with the following command:
aws qldb delete-ledger --name twtech-ledger
For Older AWS-hosted guides
- The CLI names/syntax above (e.g., create-ledger,
get-digest, get-revision) are the same ones documented in the AWS CLI
reference.
- The Node.js driver quick-start examples map 1:1 to what twtech did; twtech just pointed the driver at http://localhost:4566.
- The QLDB Shell is the easiest way to issue PartiQL(PartiQL - a SQL-compatible query language for Amazon DynamoDB) and inspect committed metadata.
No comments:
Post a Comment