本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
亞馬遜 QLDB 中的期刊內容
在 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 離子結構:
strandId
和sequenceNo
。例如:
{strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}
transactionId
-
認可區塊之交易的唯一識別碼。
blockTimestamp
-
區塊認可至日誌的時間戳記。
blockHash
-
256 位元雜湊值,唯一表示區塊。這是
entriesHash
和的串連的雜湊值previousBlockHash
。 entriesHash
-
代表區塊內所有項目的雜湊值,包括僅限內部的系統項目。這是默克爾樹的根散列,其中葉節點由中的所有哈希組成
entriesHashList
。 previousBlockHash
-
日誌中上一個鏈接塊的哈希值。
entriesHashList
-
代表塊中每個條目的哈希列表。此清單可以包含下列條目雜湊值:
-
代表的離子哈希值
transactionInfo
。這個值是透過取整個transactionInfo
結構的離子雜湊值來計算。 -
默克爾樹的根散列,其中葉節點由中的所有哈希組成
revisions
。 -
代表的離子哈希值
redactionInfo
。此雜湊只存在於密文交易所認可的區塊中。它的值是通過採取整個redactionInfo
結構的離子散列來計算的。 -
代表僅限內部系統中繼資料的雜湊。這些雜湊可能不存在於所有區塊中。
-
transactionInfo
-
一種 Amazon Ion 結構,其中包含有關提交區塊之交易中陳述式的資訊。此架構包含下列欄位:
-
statements
— PartiQL 陳述式的清單以及它們開始執行的startTime
時間。每個語句都有一個statementDigest
散列,這是計算transactionInfo
結構的散列所需的。 -
documents
— 由陳述式更新的文件 ID。每個文件都包tableId
含它所屬的和,以及每個更新它之陳述式的索引。tableName
-
revisions
-
已在區塊中確認的文件修訂清單。每個修訂版本結構都包含修訂已提交檢視中的所有欄位。
這也可以包括代表作為日誌完整雜湊鏈一部分的僅限內部系統修訂的雜湊。
已修訂修訂
在 Amazon QLDB 中,DELETE
陳述式只會以邏輯方式刪除文件,方法是建立將文件標記為已刪除的新修訂。QLDB 也支援資料編輯作業,可讓您永久刪除表格歷程記錄中非使用中的文件修訂版本。
密文作業只會刪除指定修訂版本中的使用者資料,並保持分錄序列與文件中繼資料不變。這樣可以維護分類帳的整體資料完整性。如需詳細資訊和密文操作範例,請參閱編輯文件修訂版本。
已修訂修訂範例
考慮前面的塊示例。在此區塊中,假設您密文的文件 ID 為HwVFkn8IMRa0xjze5xcgga
且版本號碼為的修訂版本0
。
完成密文之後,修訂版本中的使用者資料 (由結data
構表示) 會被新dataHash
欄位取代。此欄位的值是已移除data
結構的離子雜湊值。因此,分類帳會維護其整體資料完整性,並透過現有的驗證 API 作業維持密碼編譯驗證。
下列修訂版範例顯示此密文的結果,新dataHash
欄位會以紅色斜
體反白顯示。
注意
此修訂版範例僅供參考。顯示的哈希值不是實際計算的哈希值。
...
{
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 儲存庫 aws-Samples/amazon-qldb-dmv-sample-java
-
ValidateQldbHashChain.java
— 包含從分類帳匯出分錄區塊的教學課程程式碼,並使用匯出的資料來驗證區塊之間的雜湊鏈。 -
JournalBlock.java
— 包含名為的方法, verifyBlockHash()
該方法示範如何計算區塊內的每個個別雜湊元件。此方法由中的教學課程程式碼呼叫ValidateQldbHashChain.java
。
如需如何下載和安裝此完整範例應用程式的指示,請參閱安裝亞馬遜 QLDB Java 範例應用程式。在您執行教學課程程式碼之前,請確定遵循中的步驟 1-3Java 教學 來設定範例分類帳,並使用範例資料載入分類帳。
另請參閱
如需 QLDB 分錄內分錄的詳細資訊,請參閱下列主題:
-
從 Amazon QLDB 匯出日誌資料— 了解如何將日誌資料匯出到 Amazon SSimple Storage Service (Amazon S3) torage Service
-
從 Amazon QLDB 串流日誌資料— 了解如何將日誌 Data Streams Data Streams Streams Data Streams StreAmazon Kinesis Data Streams
-
Amazon QLDB 中的數據驗證— 瞭解日誌資料的密碼編譯驗證。