申请新账号

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 支持的不同保护级别,并选择最符合您安全需求的保护级别。
    • 为 Cloud KMS 资源使用专用项目,与其他 Google Cloud 资源分开。
    • 为您使用的每个 Universal Ledger 网络创建一个单独的 Google Cloud 项目来管理 Cloud KMS 密钥。

    如需了解详情,请参阅Google Cloud 安全性方面的最佳实践和 Cloud KMS 加密和密钥管理深入探究。

  • 已启用 Cloud KMS 的项目或父级资源上的 Cloud KMS Admin (roles/cloudkms.admin) IAM 角色。

创建非对称签名密钥

在通用账本上运行的每个账号都需要一个非对称签名公钥-私钥对。私钥用于为交易签名,公钥则在账本上注册,用于识别您的账号并验证签名。

以下步骤将指导您使用 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-operator 或 eur-clearinghouse。此名称仅供您自己组织使用,无需记录在账簿中。
    • KEY_RING:用于存储密钥的密钥环的名称。
    • KEY_LOCATION:密钥的 Google Cloud 位置。

    这会在 P-256 曲线(具有 Universal Ledger 支持的 SHA-256 摘要)上创建一个 ECDSA 密钥对。如需查看支持的格式列表,请参阅 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 中的账号类型,请参阅关键概念。

账号类型 创建者 提交交易
Currency Operator 平台运营商 CreateCurrencyOperator
Clearinghouse Currency Operator CreateClearinghouse
客户经理 Currency Operator CreateAccountManager
Token Manager Currency Operator CreateTokenManager
用户账号 客户经理 CreateAccount

确定后,您需要与可以创建账号的特权账号所有者协调并分享以下详细信息:

  • 您要在其中创建账号的网络名称。如需查看受支持的区域列表,请参阅Universal Ledger 网络和位置。
  • 非对称签名密钥的公开部分及其对应的 KeyFormat。如果您按照本指南中的 gcloud 命令操作,则格式为 KEY_FORMAT_PEM_EC_P256_SHA256。
  • 一个账号注释字符串,其中包含要在与新账号关联的账簿上记录的所有相关信息。这是一个不透明的值,存储在账簿中,但不会被 Universal Ledger 以其他方式解读。创建后,此字段不可变,并且任何有权访问网络的人都可以读取。
  • 创建账号时,填充要提交的交易所需的任何其他详细信息。例如,如需创建货币运营商,您还需要指定将由要创建的新运营商管理的 currency。

如果您不确定谁是您用例的相关特权账号的所有者,请联系 gcul-help@google.com。

确认您的账号已创建

特权账号提交的交易在账本上成功执行并最终确定后,QueryTransactionState 方法的响应将包含一个 TransactionCertificate,其中包含一个 transaction_output 事件,该事件包含新创建的账号的账号 ID。

该 ID 类似于以下示例:

1:USR:XTS:025sAZ55EqGKF6vpXEpSS8X891nNDEQU9yFQKYkcFzAb6

您可以通过提交以下 REST 请求来确认您的新账号是否存在于账本中:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://universalledger.LOCATION.rep.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",
    }
  }
}

后续步骤