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 参考文档。
-
在 Google Cloud 控制台中,激活 Cloud Shell。
设置默认项目:
gcloud config set project KEYS_PROJECT将
KEYS_PROJECT替换为要用于 Cloud KMS 资源的项目的 ID。如果您还没有密钥环,请使用
gcloud kms keyrings create命令创建一个密钥环来存放密钥:gcloud kms keyrings create KEY_RING \ --location=KEY_LOCATION替换以下内容:
KEY_RING:要创建的密钥环的名称,例如test-gcul-keys。此名称仅用于满足您自己的组织需求,无需记录在账本中。KEY_LOCATION:密钥环的 Google Cloud 位置,例如global。
对于您要在账本上使用的每个账号,请使用
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参考文档。使用
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",
}
}
}