申请新账号

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 资源分开。
    • 创建一个单独的 Google Cloud 项目,用于管理您使用的每个 Universal Ledger 网络的 Cloud KMS 密钥。
  • 在启用了 Cloud KMS 的项目或父级资源上具有 Cloud KMS Admin (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 曲线(具有 SHA-256 摘要)上创建一个 ECDSA 密钥对,通用账本支持此密钥对。如需查看支持的格式列表,请参阅 the 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",
    }
  }
}

后续步骤