

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon QLDB 中的日誌內容
<a name="journal-contents"></a>

**重要**  
支援終止通知：現有客戶將可以使用 Amazon QLDB，直到 07/31/2025 的支援結束為止。如需詳細資訊，請參閱[將 Amazon QLDB Ledger 遷移至 Amazon Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在 Amazon QLDB 中，*日誌*是不可變的交易日誌，可儲存資料所有變更的完整且可驗證歷史記錄。日誌僅附加，由一組序列化和雜湊鏈結的*區塊*組成，其中包含您的遞交資料和其他系統中繼資料。QLDB 會將一個鏈結區塊寫入交易中的日誌。

本節提供具有範例資料的日誌區塊範例，並說明區塊的內容。

**Topics**
+ [區塊範例](#journal.block-example)
+ [封鎖內容](#journal.block-contents)
+ [已修訂的修訂](#journal.redacted-revisions)
+ [範例應用程式](#journal.sample)
+ [另請參閱](#journal.see-also)

## 區塊範例
<a name="journal.block-example"></a>

日誌區塊包含交易中繼資料，以及代表交易中所遞交文件修訂的項目，以及遞交它們的 [PartiQL](ql-reference.md) 陳述式。

以下是包含範例資料的區塊範例。

**注意**  
此區塊範例僅供參考。顯示的雜湊不是實際計算的雜湊值。

```
{
  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`值，沒有其他屬性。這些是不包含使用者資料的內部限定系統修訂。這些修訂的雜湊是日誌完整雜湊鏈的一部分，這是密碼編譯驗證所需的。

## 封鎖內容
<a name="journal.block-contents"></a>

日誌區塊具有下列欄位：

**`blockAddress`**  
日誌中區塊的位置。地址是具有兩個欄位的 [Amazon Ion](ion.md) 結構： `strandId`和 `sequenceNo`。  
例如：`{strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}`

**`transactionId`**  
遞交區塊之交易的唯一 ID。

**`blockTimestamp`**  
區塊遞交至日誌時的時間戳記。

**`blockHash`**  
唯一代表 區塊的 256 位元雜湊值。這是 `entriesHash`和 串連的雜湊`previousBlockHash`。

**`entriesHash`**  
代表區塊內所有項目的雜湊，包括僅限內部的系統項目。這是 [Merkle 樹狀結構](verification.md#verification.how-it-works.merkle-tree)的根雜湊，其中分葉節點包含 中的所有雜湊`entriesHashList`。

**`previousBlockHash`**  
日誌中上一個鏈結區塊的雜湊。

**`entriesHashList`**  
代表區塊中每個項目的雜湊清單。此清單可包含下列項目雜湊：  
+ 代表 的 Ion 雜湊`transactionInfo`。此值的計算方式是取得整個`transactionInfo`結構的 Ion 雜湊。
+ Merkle 樹的根雜湊，其中分葉節點包含 中的所有雜湊`revisions`。
+ 代表 的 Ion 雜湊`redactionInfo`。此雜湊僅存在於修訂交易所遞交的區塊中。其值的計算方式是取得整個`redactionInfo`結構的 Ion 雜湊。
+ 代表僅限內部系統中繼資料的雜湊。這些雜湊可能不會存在於所有區塊中。

**`transactionInfo`**  
Amazon Ion 結構，其中包含遞交區塊之交易中陳述式的相關資訊。此架構包含下列欄位：  
+ `statements` – PartiQL 陳述式的清單，以及開始執行`startTime`時的 。每個陳述式都有`statementDigest`雜湊，這是計算`transactionInfo`結構雜湊所需的。
+ `documents` – 由 陳述式更新的文件 IDs。每個文件都包含`tableId`其所屬的 `tableName`和 ，以及更新它的每個陳述式的索引。

**`revisions`**  
區塊中遞交的文件修訂清單。每個修訂結構都包含修訂[遞交檢視](working.metadata.md)中的所有欄位。  
這也可以包含雜湊，這些雜湊代表日誌完整雜湊鏈一部分的內部限定系統修訂。

## 已修訂的修訂
<a name="journal.redacted-revisions"></a>

在 Amazon QLDB 中，`DELETE`陳述式只會透過建立新的修訂，將其標示為已刪除，以邏輯方式刪除文件。QLDB 也支援*資料修訂*操作，可讓您永久刪除資料表歷史記錄中的非作用中文件修訂。

編輯操作只會刪除指定修訂中的使用者資料，並使日誌序列和文件中繼資料保持不變。這可維護您分類帳的整體資料完整性。如需詳細資訊和修訂操作的範例，請參閱 [編輯文件修訂](working.redaction.md)。

### 修訂修訂範例
<a name="journal.redacted-revisions.example"></a>

考慮上一個[區塊範例](#journal.block-example)。在此區塊中，假設您修訂了文件 ID 為 `HwVFkn8IMRa0xjze5xcgga`且版本編號為 的修訂`0`。

修訂完成後，修訂中的使用者資料 （由`data`結構表示） 會取代為新的`dataHash`欄位。此欄位的值是已移除`data`結構的 Ion 雜湊。因此，分類帳會維護其整體資料完整性，並透過現有的驗證 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
    }
  ]
}
...
```

## 範例應用程式
<a name="journal.sample"></a>

如需使用匯出資料驗證日誌雜湊鏈的 Java 程式碼範例，請參閱 GitHub 儲存庫 [aws-samples/amazon-qldb-dmv-sample-java](https://github.com/aws-samples/amazon-qldb-dmv-sample-java)。此範例應用程式包含下列類別檔案：
+ [ValidateQldbHashChain.java](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/ValidateQldbHashChain.java) – 包含教學課程程式碼，可從分類帳匯出日誌區塊，並使用匯出的資料來驗證區塊之間的雜湊鏈。
+ [JournalBlock.java](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/qldb/JournalBlock.java) – 包含名為 的方法`verifyBlockHash()`，示範如何計算區塊中的每個個別雜湊元件。此方法由 中的教學課程程式碼呼叫`ValidateQldbHashChain.java`。

如需如何下載和安裝此完整範例應用程式的說明，請參閱 [安裝 Amazon QLDB Java 範例應用程式](sample-app.java.md)。在您執行教學課程程式碼之前，請務必遵循 中的步驟 1–3 [Java 教學課程](getting-started.java.tutorial.md) 來設定範例分類帳，並使用範例資料載入。

## 另請參閱
<a name="journal.see-also"></a>

如需 QLDB 中日誌的詳細資訊，請參閱下列主題：
+ [從 Amazon QLDB 匯出日誌資料](export-journal.md) – 了解如何將日誌資料匯出至 Amazon Simple Storage Service (Amazon S3)。
+ [從 Amazon QLDB 串流日誌資料](streams.md) – 了解如何將日誌資料串流至 Amazon Kinesis Data Streams。
+ [Amazon QLDB 中的資料驗證](verification.md) – 了解日誌資料的密碼編譯驗證。