申請新帳戶

Universal Ledger 網路中的新帳戶必須由帳本中已有的特殊權限管理員帳戶建立。這個具備權限的帳戶必須簽署並提交交易,才能建立新帳戶。

本指南說明如何在 Universal Ledger 網路中申請新帳戶。您可以瞭解如何執行下列作業:

  • 使用 Cloud Key Management Service 為新帳戶建立非對稱簽署金鑰。

  • 找出適當權限帳戶的擁有者,請對方為您建立帳戶。

  • 在分類帳中建立帳戶後,請確認帳戶詳細資料。

事前準備

如要完成本指南,您需要下列項目:

  • 啟用 Universal Ledger API 的 Google Cloud 專案。

  • IAM 角色,例如 roles/universalledger.networkViewer,因此您至少可以查詢 Universal Ledger 網路中的帳戶狀態。

  • 啟用 Cloud KMS 的 Google Cloud 專案。

    測試期間,這個專案可以與啟用 Universal Ledger API 的專案相同。

    在實際運作中,建議您採取下列做法:

    • 為 Cloud KMS 資源使用專屬專案,與其他 Google Cloud 資源分開。
    • 為您使用的每個 Universal Ledger 網路,建立獨立的 Google Cloud 專案來管理 Cloud KMS 金鑰。
  • 在啟用 Cloud KMS 的專案或父項資源中,具有 Cloud KMS 管理員 (roles/cloudkms.admin) IAM 角色。

建立非對稱式簽署金鑰

在 Universal Ledger 上運作的每個帳戶都需要非對稱簽署公私金鑰組。私密金鑰用於簽署交易,公開金鑰則會註冊在帳本上,用於識別帳戶和驗證簽章。

請按照下列步驟,使用 Cloud KMS 建立合適的金鑰組,並擷取公開金鑰。只要產生的金鑰和簽章符合 Universal Ledger 需求,您可以使用其他金鑰管理方法,例如搭配 SHA-256 摘要的 ECDSA P-256 金鑰。如要進一步瞭解支援的金鑰格式,請參閱 KeyFormat 參考資料。

  1. 在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

  2. 設定預設專案:

    gcloud config set project KEYS_PROJECT
    

    KEYS_PROJECT 替換為要用於 Cloud KMS 資源的專案 ID。

  3. 如果尚未建立金鑰環來保存金鑰,請使用 gcloud kms keyrings create 指令

    gcloud kms keyrings create KEY_RING \
        --location=KEY_LOCATION
    

    更改下列內容:

    • KEY_RING:要建立的金鑰環名稱,例如 test-gcul-keys。這個名稱僅供您所屬機構使用,不需要記錄在分類帳中。
    • KEY_LOCATION: 金鑰環的 Google Cloud 位置,例如 global
  4. 如要在帳本中使用帳戶,請使用 gcloud kms keys create 指令為每個帳戶建立非對稱簽署金鑰:

    gcloud kms keys create KEY_NAME \
        --keyring=KEY_RING \
        --location=KEY_LOCATION \
        --purpose="asymmetric-signing" \
        --default-algorithm="ec-sign-p256-sha256"
    

    更改下列內容:

    • KEY_NAME:要建立的金鑰名稱,例如 usd-operatoreur-clearinghouse。這個名稱僅供您機構內部使用,不需要記錄在分類帳上。
    • KEY_RING:用於保存金鑰的金鑰環名稱。
    • KEY_LOCATION:金鑰的 Google Cloud 位置。

    這會在 P-256 曲線上建立 ECDSA 金鑰組,並使用 Universal Ledger 支援的 SHA-256 摘要。如需支援格式的清單,請參閱 KeyFormat參考資料。

  5. 使用 gcloud kms keys versions get-public-key 指令擷取金鑰版本的公開金鑰部分:

    gcloud kms keys versions get-public-key KEY_VERSION \
        --key=KEY_NAME \
        --keyring=KEY_RING \
        --location=KEY_LOCATION
    

    更改下列內容:

    • KEY_VERSION:要取得的金鑰版本,新建立的金鑰為 1
    • KEY_NAME:金鑰名稱。
    • KEY_RING:包含金鑰的金鑰環名稱。
    • KEY_LOCATION:金鑰的 Google Cloud 位置。

    這個指令會以 PEM 編碼格式輸出公開金鑰 (KEY_FORMAT_PEM_EC_P256_SHA256),適用於 Universal Ledger API,例如:

    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJ/vWkd5wgakFbVD25k8WM9Ll6We+
    c8RVDS0R4G8xetsmFjfNW/ZxwWeB86IvMjxY8ZsdU9+W7BL5YM6rUB5yCQ==
    -----END PUBLIC KEY-----
    

找出可以建立帳戶的人員

您想建立的帳戶類型,決定了帳本中具有建立權限的特權帳戶。您必須找出該高權限帳戶的擁有者。如要瞭解 Universal Ledger 中的帳戶類型,請參閱重要概念

帳戶類型 檔案建立者: 提交交易
貨幣運算子 平台營運人員 CreateCurrencyOperator
結算中心 貨幣運算子 CreateClearinghouse
客戶經理 貨幣運算子 CreateAccountManager
權杖管理工具 貨幣運算子 CreateTokenManager
使用者帳戶 客戶經理 CreateAccount

確認後,請與有權建立帳戶的特權帳戶擁有者協調,並提供下列詳細資料:

  • 您要建立帳戶的網路名稱。如需支援的地區清單,請參閱「可用網路和地區」。
  • 非對稱簽署金鑰的公開部分,以及對應的KeyFormat。 如果您按照本指南中的 gcloud 指令操作,格式應為 KEY_FORMAT_PEM_EC_P256_SHA256
  • 帳戶註解字串,其中包含要記錄在與新帳戶相關聯的分類帳中的任何相關資訊。這是儲存在帳本中的不透明值,但 Universal Ledger 不會以其他方式解讀。建立後,這個欄位就無法變更,且任何有權存取網路的人都能讀取。
  • 建立帳戶時,填寫要提交的交易所需的任何其他詳細資料。舉例來說,如要建立貨幣運算子,您也需要指定新運算子要管理的 currency

在預覽期間,如果您不確定誰是相關特權帳戶的擁有者,請與 Google 聯絡人聯絡。

確認帳戶已建立

特權帳戶提交的交易在帳本上成功執行並完成後,QueryTransactionState 方法的回應會包含 TransactionCertificate,其中含有 transaction_output 事件,內含新建立帳戶的帳戶 ID。

ID 類似於下列範例:

1:USR:XTS:025sAZ55EqGKF6vpXEpSS8X891nNDEQU9yFQKYkcFzAb6

您可以提交下列 REST 要求,確認新帳戶是否已出現在帳本中:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://universalledger.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/NETWORK_NAME:queryAccount?account_id=ACCOUNT_ID

更改下列內容:

  • PROJECT_ID:已啟用 Universal Ledger API 的專案 ID。
  • LOCATION:要連線的端點位置。
  • NETWORK_NAME:建立帳戶的網路名稱。
  • ACCOUNT_ID:新建立帳戶的 ID。

您會看到類似下方的輸出內容:

{
  "account": {
    "publicKey": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFSi92V2tkNXdnYWtGYlZEMjVrOFdNOUxsNldlKwpjOFJWRFMwUjRHOHhldHNtRmpmTlcvWnh3V2VCODZJdk1qeFk4WnNkVTkrVzdCTDVZTTZyVUI1eUNRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t",
    "roundId": "10962032",
    "comment": "My Test Account",
    "userDetails": {
      "accountManager": {
        "id": "1:ACT:XTS:02f4VSHyPsXeMZmcogbNx7bP4kfn5DYvc7d2K52RYAFd3"
      },
      "tokenManager": {
        "id": "1:TKN:XTS:024fqJS87dJ94ETN9PGhTCGd86btXj9iyWLxGQWgC3dde"
      },
      "roles": [
        "ROLE_PAYER",
        "ROLE_RECEIVER"
      ],
      "accountStatus": "ACCOUNT_STATUS_ACTIVE",
    }
  }
}

後續步驟