本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon 中的期刊内容 QLDB
重要
终止支持通知:现有客户将能够使用亚马逊,QLDB直到 2025 年 7 月 31 日终止支持。有关更多详细信息,请参阅将亚马逊QLDB账本迁移到亚马逊 Aurora Postgr SQL
在 Amazon 中QLDB,日记是不可变的交易日志,用于存储所有数据更改的完整且可验证的历史记录。该日记账仅限追加,由一组有序和哈希链的数据块组成,其中包含您提交的数据和其他系统元数据。QLDB在交易中将一个链式区块写入日志。
本节介绍了包含样本数据的日记账数据块的示例,并描述了数据块的内容。
数据块示例
日记账数据块包含事务元数据、以及代表事务中提交的文档修订版本条目、和提交这些修订的 PartiQL 语句。
以下是包含示例数据的数据块示例。
注意
数据块示例仅用于参考。显示的哈希值并非实际计算的哈希值。
{ blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, transactionId:"3gtB8Q8dfIMA8lQ5pzHAMo", blockTimestamp:2022-06-08T18:46:46.512Z, blockHash:{{QS5lJt8vRxT30L9OGL5oU1pxFTe+UlEwakYBCrvGQ4A=}}, entriesHash:{{buYYc5kV4rrRtJAsrIQnfnhgkzfQ8BKjI0C2vFnYQEw=}}, previousBlockHash:{{I1UKRIWUgkM1X6042kcoZ/eN1rn0uxhDTc08zw9kZ5I=}}, entriesHashList:[ {{BUCXP6oYgmug2AfPZcAZup2lKolJNTbTuV5RA1VaFpo=}}, {{cTIRkjuULzp/4KaUEsb/S7+TG8FvpFiZHT4tEJGcANc=}}, {{3aktJSMyJ3C5StZv4WIJLu/w3D8mGtduZvP0ldKUaUM=}}, {{GPKIJ1+o8mMZmPj/35ZQXoca2z64MVYMCwqs/g080IM=}} ], transactionInfo:{ statements:[ { statement:"INSERT INTO VehicleRegistration VALUE ?", startTime:2022-06-08T18:46:46.063Z, statementDigest:{{KY2nL6UGUPs5lXCLVXcUaBxcEIop0Jvk4MEjcFVBfwI=}} }, { statement:"SELECT p_id FROM Person p BY p_id WHERE p.FirstName = ? and p.LastName = ?", startTime:2022-06-08T18:46:46.173Z, statementDigest:{{QS2nfB8XBf2ozlDx0nvtsliOYDSmNHMYC3IRH4Uh690=}} }, { statement:"UPDATE VehicleRegistration r SET r.Owners.PrimaryOwner.PersonId = ? WHERE r.VIN = ?", startTime:2022-06-08T18:46:46.278Z, statementDigest:{{nGtIA9Qh0/dwIplOR8J5CTeqyUVtNUQgXfltDUo2Aq4=}} }, { statement:"DELETE FROM DriversLicense l WHERE l.LicenseNumber = ?", startTime:2022-06-08T18:46:46.385Z, statementDigest:{{ka783dcEP58Q9AVQ1m9NOJd3JAmEvXLjzl0OjN1BojQ=}} } ], documents:{ HwVFkn8IMRa0xjze5xcgga:{ tableName:"VehicleRegistration", tableId:"HQZ6cgIMUi204Lq1tT4oaJ", statements:[0,2] }, IiPTRxLGJZa342zHFCFT15:{ tableName:"DriversLicense", tableId:"BvtXEB1JxZg0lJlBAtbtSV", statements:[3] } } }, revisions:[ { hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}} }, { blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}}, data:{ VIN:"1N4AL11D75C109151", LicensePlateNumber:"LEWISR261LL", State:"WA", City:"Seattle", PendingPenaltyTicketAmount:90.25, ValidFromDate:2017-08-21, ValidToDate:2020-05-11, Owners:{ PrimaryOwner:{ PersonId:"3Ax20JIix5J2ulu2rCMvo2" }, SecondaryOwners:[] } }, metadata:{ id:"HwVFkn8IMRa0xjze5xcgga", version:0, txTime:2022-06-08T18:46:46.492Z, txId:"3gtB8Q8dfIMA8lQ5pzHAMo" } }, { blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, hash:{{ZVF/f1uSqd5DIMqzI04CCHaCGFK/J0Jf5AFzSEk0l90=}}, metadata:{ id:"IiPTRxLGJZa342zHFCFT15", version:1, txTime:2022-06-08T18:46:46.492Z, txId:"3gtB8Q8dfIMA8lQ5pzHAMo" } } ] }
在revisions
字段中,某些修订版本对象可能只包含一个 hash
值而不包含其他属性。这是仅供内部使用的系统修订版,不包含用户数据。修订版的哈希值是该日记账完整哈希链的一部分,这是加密验证的必要条件。
数据块内容
日记账数据块包含以下字段:
blockAddress
-
日记账中的数据库位置。地址是一种包含两个字段的 Amazon Ion 结构:即
strandId
和sequenceNo
。例如:
{strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}
transactionId
-
提交数据块的事务唯一 ID。
blockTimestamp
-
数据块提交到日记账的时间戳。
blockHash
-
唯一代表数据块的 256 位哈希值。这是
entriesHash
和previousBlockHash
的串联的哈希值。 entriesHash
-
代表数据块内所有条目的哈希值,包括仅限内部的系统条目。这是 Merkle tree的根哈希,其中叶节点由
entriesHashList
中的所有哈希组成。 previousBlockHash
-
日记账中前一个链式数据块的哈希值。
entriesHashList
-
代表数据块中每个条目的哈希列表。此列表可以包含以下条目哈希:
-
表示
transactionInfo
的 Ion 哈希。该值是通过取整个transactionInfo
结构的 Ion 哈希值计算得出的。 -
Merkle tree 的根哈希,其中叶节点由
revisions
中的所有哈希组成。 -
表示
redactionInfo
的 Ion 哈希。此哈希值仅存在于由编校事务提交的数据块中。它的值是通过取整个redactionInfo
结构的 Ion 哈希值计算得出的。 -
代表仅限内部使用的系统元数据哈希。这些哈希值可能并不存在于所有数据块。
-
transactionInfo
-
一种 Amazon Ion 结构,其中包含有关提交数据块的事务中的语句的信息。此结构具有以下字段:
-
statements
— PartiQL 语句列表以及它们何时开始运行的startTime
。每个语句都有一个statementDigest
哈希,这是计算transactionInfo
结构哈希值所必需的。 -
documents
— 由声明更新的文档IDs。每个文档都包括它所属的tableName
和tableId
,以及更新该文档的每条语句的索引。
-
revisions
-
数据块中提交的文档修订列表。每个修订版本结构都包含所有此版本的所有提交视图字段。
这也可以包括代表仅限内部的系统修订版哈希,这些版本是日记账账完整哈希链的一部分。
已编校的修订版
在 Amazon 中QLDB,DELETE
语句只能通过创建将文档标记为已删除的新修订版来逻辑上删除文档。QLDB还支持数据编辑操作,允许您永久删除表历史记录中非活动的文档修订版本。
编校操作仅删除指定修订版中的用户数据,而日记账序列和文档元数据则保持不变。这样可保持分类账的整体数据完整性。有关编校操作示例的更多信息,请参阅 对文档修订版执行编校。
已编校的修订示例
考虑前面的 数据块示例。在此数据块,假设您编辑了文档 ID 为HwVFkn8IMRa0xjze5xcgga
、版本号为0
的修订版。
编校完成后,修订版中的用户数据(由data
结构表示)将替换为一个新 dataHash
字段。该字段的值是已移除 data
结构的 Ion 哈希。因此,账本保持了其整体数据的完整性,并通过现有的验证API操作保持了密码学上的可验证性。
以下修订示例显示了此次密文的结果,其中突出显示了新dataHash
字段 red italics
.
注意
本文档仅用于参考。显示的哈希值并非实际计算的哈希值。
...
{
blockAddress:{
strandId:"4o5UuzWSW5PIoOGm5jPA6J",
sequenceNo:25
},
hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
dataHash:{{s83jd7sfhsdfhksj7hskjdfjfpIPP/DP2hvionas2d4=}},
metadata:{
id:"HwVFkn8IMRa0xjze5xcgga",
version:0,
txTime:2022-06-08T18:46:46.492Z,
txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
}
}
...
QLDB还会在日记中为已完成的编辑请求添加一个新块。此数据块还包含其他 redactionInfo
条目,其中包含在事务中已编辑的修订的列表,如以下示例所示。
... redactionInfo:{ revisions:[ { blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, tableId:"HQZ6cgIMUi204Lq1tT4oaJ", documentId:"HwVFkn8IMRa0xjze5xcgga", version:0 } ] } ...
示例应用程序
有关使用导出数据验证期刊哈希链的 Java 代码示例,请参阅 GitHub 存储库 a ws-samples/-amazon-qldb-dmv-sample
-
ValidateQldbHashChain.java
-包含从账本导出日记账区块并使用导出的数据验证区块之间的哈希链的教程代码。 -
JournalBlock.java
-包含一个名为的方法 verifyBlockHash()
,该方法演示如何计算区块中的每个哈希分量。此方法由ValidateQldbHashChain.java
中的教程代码调用。
有关如何下载和安装此完整示例应用程序的说明,请参阅 安装 Amazon QLDB Java 示例应用程序。在运行教程代码之前,请确保按照Java 教程中的步骤 1—3 设置示例分类账并向其中加载示例数据。
另请参阅
有关中期刊的更多信息QLDB,请参阅以下主题:
-
从 Amazon 导出日记数据 QLDB — 了解如何将日记账数据导出至 Amazon Simple Storage Service(Amazon S3)。
-
从 Amazon 流式传输日记数据 QLDB— 了解如何将日记账数据流式传输至 Amazon Kinesis Data Streams。
-
在 Amazon 中进行数据验证 QLDB — 了解日记账数据的加密验证。