自行建構用戶端

本指南提供相關建議,確保 Universal Ledger 用戶端實作項目能安全可靠地與網路互動。您可以瞭解如何執行下列作業:

  • 利用網路拓撲實現高可用性。
  • 提交交易並瞭解執行結果。
  • 實作輪詢、逾時和重試策略。

網路拓撲和高可用性

通用帳本網路是由多個驗證器組成,這些驗證器分布在多個區域和地區,因此可確保整個網路的高可用性。

  • 區域故障:如果 Cloud 區域內的單一驗證器發生故障,同一區域內的其他驗證器會繼續處理要求,不會受到影響。

  • 區域中斷:如果整個區域無法使用,其他區域的驗證器仍可運作。如要繼續提交交易,用戶可以安全地回溯,並嘗試透過其他端點重新提交交易。

交易執行特性

  • 不可分割的執行作業:交易不是完全成功就是完全失敗。 系統絕不會執行部分交易,例如因餘額不足而只轉移部分要求金額。這包括交易鏈,可讓您將多個任意交易合併為單一原子序列。

  • 不會自動重試:網路會嘗試執行提交的交易一次。如果執行失敗,帳本不會自動將交易排入佇列或重試。

  • 冪等重新提交:每筆提交的交易都會根據確切的序列化酬載 (包括序號和傳送者) 產生專屬交易 ID。多次提交完全相同的酬載會產生相同的交易 ID。帳本可確保交易最多執行一次,因此如果其中一個端點無法使用,可安全地將相同交易酬載重新提交至其他端點。

    詳情請參閱 SubmitTransactionRequest 參考頁面。

延遲、輪詢和重試策略

提交交易時,驗證器會先快速檢查,確保簽章和序號有效。如果成功,通用帳本 API 會立即傳回 SubmitTransactionResponse,包括指派的交易 ID。

大多數交易會在 3 秒內完成。如要檢查交易狀態,請使用提供的交易 ID 輪詢 QueryTransactionState 方法。

  • 如果交易狀態仍為 PENDING,請使用指數輪詢策略再次擷取狀態。例如,以 3 秒、9 秒、27 秒和 60 秒為間隔查詢。

  • 如果 QueryTransactionState 傳回 NOT_FOUND,請重新提交交易。

交易嘗試FINALIZED後,回應也會包含 TransactionCertificate,其中包含各種詳細資料,例如:

  • 交易完成時的輪次 ID。
  • 執行狀態 (正常或失敗)。
  • 交易事件,包括任何交易輸出內容。

逾時通訊協定

萬一交易在 60 秒後仍處於 PENDING 或 NOT_FOUND 狀態,請假設為您提供要求的驗證器無法跟上網路中其他驗證器。請完成下列步驟:

  1. 在其他網路區域中選取其他端點。
  2. 重新提交完全相同的簽署交易酬載。
  3. 請傳送電子郵件至 gcul-help@google.com 回報問題,以便 Universal Ledger 團隊進行調查。

檢查交易狀態時,如果多次提交相同酬載,回應可能會包含多則 TransactionAttempt 訊息。最多只會有一筆交易嘗試以「OK」交易狀態完成,並顯示在 TransactionEffects 中,其他嘗試則會處於待處理狀態或失敗狀態。這是預期行為;帳本已成功執行其中一項交易提交作業,並正確拒絕或最終會拒絕重複提交的作業。

網路一致性

  • 完成的交易:一旦某個驗證器將交易回報為完成,同一網路上的所有其他驗證器最終都會處理該交易,並產生完全相同的結果。提交 QueryAccountRequest 時,請使用交易完成時的輪次 ID,因為該 ID 位於 TransactionCertificate中, 所有已同步的驗證器都會產生相同的結果。

  • 未完成的交易:交易會在網路上非同步傳播,因此不同驗證器回報的交易完成狀態可能有所不同。

    驗證器從中斷狀態恢復或發生同步延遲時,可能會暫時將最終交易回報為 PENDING 或 NOT_FOUND。驗證器趕上進度後,交易狀態就會解決。

用戶端責任和錯誤處理

  • 交易追蹤:用戶端應用程式必須追蹤所有已提交交易的狀態,直到交易完成為止。

  • 錯誤處理:如果交易失敗,請擷取並檢查 TransactionCertificate 中包含的失敗詳細資料,以觸發適當的商家層級補救措施。

後續步驟