使用区块链应用程序构建器支持令牌化

您可以使用区块链应用程序构建器来管理令牌的完整生命周期。您可以对现有资产进行标记,并自动生成令牌类和方法以用于令牌生命周期管理。

标记化

令牌化是一个过程,物理或数字资产由令牌表示,令牌可以传输,跟踪和存储在区块链上。通过将资产表示为令牌,您可以使用区块链分类账来建立资产的状态和所有权,并使用标准区块链平台功能来转移资产的所有权。

区块链应用程序构建器包括令牌化支持:令牌类和方法自动生成,并提供其他令牌方法,以便开发人员可以为令牌创建复杂的业务逻辑。自动生成的项目包含令牌生命周期类和函数、CRUD 方法和其他令牌 SDK 方法,并支持参数自动验证、编集/解编集和透明持久性功能。可以使用这些控制器方法初始化令牌、控制访问、设置帐户、管理角色以及管理令牌的生命周期。

下图显示了区块链应用程序构建器实施的令牌体系结构,包括令牌 API 和令牌 SDK。令牌体系结构图

自动生成的令牌 API
Blockchain App Builder 自动生成支持令牌和令牌生命周期的方法。您可以使用这些方法初始化令牌、管理角色和账户以及完成其他令牌生命周期任务,而无需进行任何其他编码。
标记 SDK
令牌 SDK 包含可帮助您为令牌应用程序开发复杂业务逻辑的方法。
多版本并发控制 (Multiversion Concurrency Control,MVCC) 优化
令牌链代码的 MVCC 优化可以减少传输、薄荷、刻录和保持操作的错误。

标记和账户/余额模型

区块链应用程序构建器支持可替换和非可替换令牌。可替换令牌具有可互换的值。任何可替换令牌的数量都与同一类令牌的任何其他相等数量具有相同的值。不可替代的代币是独一无二的。令牌也可以是整数或小数。分数标记可以根据指定的小数位数细分为较小的部分。

令牌也可以通过行为来描述。可替换令牌支持的行为包括:mintabletransferabledivisibleholdableburnablerolesminterburnerholder)。对于不可替代的令牌,支持的行为包括:mintabletransferablesingletonindivisibleburnablerolesminterburner)。

标记功能使用账户/余额模型将标记化资产表示为账户中的余额。账户类似于典型的银行账户,存款和转账以及其他州/省转换会影响账户余额。对每个账户的余额进行全局跟踪,以确保事务处理金额有效。还会跟踪暂挂余额(用于可替换令牌)和事务处理历史记录。

任何在任何点拥有令牌或完成令牌相关操作的用户都必须拥有网络上的帐户。每个帐户都由唯一 ID (account_id) 标识。帐户 ID 是通过将实例所有者或登录到实例的用户的用户名或电子邮件 ID (user_id) 与当前网络组织中用户的成员服务提供者 ID (org_id) 相结合来创建的。提供的就绪方法可用于创建账户。由于账户 ID 包括组织 ID,因此可以在多个组织中支持用户。

令牌标准

区块链应用程序构建器扩展了令牌分类框架,ERC-721 标准和 ERC-1155 标准的标准和分类,以定义令牌的解剖和行为。ERC-1155 是同时支持可替换和非可替换令牌 (NFT) 的标准。ERC-721 是 NFT 的标准。令牌分类框架是由令牌分类倡议开发的。有关详细信息,请参阅标记分类框架

下表介绍了 Blockchain App Builder 支持的标记类型:
标准 支持的标记类型
标记分类框架
  • 小数可替换令牌
ERC-721
  • 整个不可替代的标记
ERC-1155
  • 整个可替换令牌
  • 小数可替换令牌
  • 整个不可替代的标记
  • 小数不可替换标记

标记流

由于区块链应用程序构建器通过扩展输入规范文件语法来支持令牌化,因此,您可以使用 CLI 或 Visual Studio Code 来创建特定于令牌的项目,方式与创建其他项目相同。有关更多信息,请参见 Input Specification File

令牌工作流图
典型的标记化流程遵循以下基本步骤:
  • 确定要使用的令牌标准。
  • 决定要指定的标记行为(mintabletransferabledivisibleindivisiblesingletonholdableburnableroles)。
  • 在输入规范文件中定义标记资产及其属性。
  • 从输入规范文件中支架链代码项目。这将创建一个基架项目,包括包含令牌资产定义及其属性的模型,以及包含令牌行为和方法的控制器。
  • 部署并测试链代码项目。
部署基于令牌的项目后,创建令牌和完成生命周期操作的典型流将遵循以下步骤:
  • 将部署令牌链代码,传递到初始化方法的列表中用户将成为链代码的 Token Admin 用户。
  • 令牌化资产已初始化,这将创建 token_id,这是该特定令牌实例的唯一标识符。
  • 必须为将拥有令牌或完成令牌相关操作的每个用户创建帐户。
  • 如果为令牌指定了 roles 行为,则必须先将角色添加到用户,然后用户才能完成与令牌相关的操作。
  • 然后,可以根据为令牌资产指定的行为使用令牌生命周期方法。例如,您可以调用方法来为帐户创建薄荷令牌。

访问控制

标记支持包括访问控制功能,该功能支持基于角色的控制机制和基于所有权的控制机制。通过基于角色的控制,用户可以调用具有关联角色的特定方法,例如 Token AdminToken Minter。通过基于所有权的控制,您可以限制用户访问他们不拥有的资产。通过基于所有权的访问控制,拥有资产的用户可以调用特定方法,例如 Token OwnerAccount Owner。有关方法的访问控制的特定信息,请参见以下主题中介绍的方法的各个条目:
基于角色的访问控制支持以下角色:
令牌管理
部署令牌链代码时,可以分配 Token Admin 用户。Token Admin 用户信息保存在状态数据库中。Token Admin 用户可以为其他用户授予和删除 Token Admin 权限。Token Admin 用户无法删除自己的 Token Admin 特权。Token Admin 用户可以将 Org Admin、minter、Burner 或 notary 角色分配给任何用户。
组织管理员
扩展的标记分类框架方法支持 Org Admin 角色。Token Admin 用户可以将 Org Admin 角色分配给任何用户。Org Admin 用户具有管理权限,但仅在其组织内。他们可以创建帐户或查看帐户余额,但仅限于组织中的用户。Org Admin 具有 minter、burner 或 notary 角色的用户可以将该角色分配给其组织中的其他用户。
标记 Minter
分配有 minter 角色的用户是 Token Minter,可以铸币令牌。
标记燃烧器
分配有刻录程序角色的用户是 Token Burner,可以刻录标记。
令牌公证
分配有公证人角色的用户是 Token NotaryToken Notary 在付款人和收款人之间的事务处理中充当第三方。Token Notary 可以触发从付款人到收款人的令牌传输完成,也可以将令牌返回到付款人的帐户。
Vault Manager
分配有 Vault 角色的用户是 Vault ManagerVault Manager 可以解锁锁锁定的 NFT。保管库角色仅适用于扩展的 ERC-721 和 ERC-1155 标准。将 Vault 角色分配给用户是锁定 NFT 的先决条件。只能为每个链代码分配一个用户 vault 角色。
基于所有权的访问控制支持以下角色:
账户所有者
拥有帐户的任何用户均为 Account Owner
标记所有者
当前拥有不可替换令牌的任何用户都是该令牌的 Token Owner

在某些方法中还结合了基于角色的访问控制和基于所有权的访问控制。例如,基于角色的访问控制允许具有 minter 角色的用户创建令牌。使用基于所有权的访问控制,不可替换的令牌所有者可以修改令牌的定制属性,但不能修改令牌元数据。当具有 minter 角色的用户创建不可替换的令牌 (non-fungible token,NFT) 时,他们成为 NFT 的所有者。作为该 NFT 的所有者,他们可以修改自定义属性(对于艺术品收集令牌,令牌价格是自定义属性)。令牌创建者将 NFT 传输给其他用户后,第二个用户成为所有者,创建令牌的用户不再是令牌的所有者。由于基于所有权的访问控制,新所有者现在可以更新定制属性值,但以前的所有者无法再更新。由于基于角色的访问控制,上一个所有者仍可以铸造 NFT,但新用户不能。

您还可以编写自己的访问控制功能,或者禁用访问控制。控制访问的自动生成的代码如下例所示。

TypeScript:
await this.Ctx.<Token Standard>Auth.checkAuthorization(...)
开始:
auth, err := t.Ctx.<Token Standard>Auth.CheckAuthorization(...)

注意:

要删除自动生成的访问控制功能,请从 TypeScript 或 Go 项目中删除上一行代码。

MVCC 优化

Hyperledger Fabric 数据库使用多版本并发控制 (multi-version concurrency control,MVCC) 来避免双重支出和数据不一致。更新相同状态时,新版本的记录将覆盖旧版本。如果存在更新块中相同密钥的并发请求,则可能会生成 MVCC_READ_CONFLICT 错误。

要减少传输、铸币、刻录和暂挂操作的 MVCC 错误,可以启用令牌链代码的 MVCC 优化。此优化仅适用于 Oracle Blockchain Platform。默认情况下禁用优化。要启用优化,请完成适用的以下步骤。

  • CLI:使用 ochain init 命令指定布尔 -m--enable_mvcc_optimization 参数。默认情况下,该参数设置为 false。要启用优化,请将 -m true 添加到 ochain init 命令行。
  • Visual Studio Code:创建链代码时,请在创建链代码窗口中选择启用 MVCC 优化

要将优化与以前版本的区块链应用程序构建器中创建的链代码一起使用,请完成以下步骤:

  1. 安装最新版本的 Blockchain App Builder 后,请按 Upgrading Chaincode Projects in the CLIUpgrading Chaincode Projects in Visual Studio Code 中所述升级链代码。
  2. 编辑链代码的根文件夹中的 .ochain.json 文件,将 enableMvccOptimization 设置为 true
  3. 同步链代码,这将添加优化并在链代码的根文件夹中创建两个新文件夹:statedbtokens。有关同步的更多信息,请参见 Synchronize Specification File Changes With Generated Source CodeSynchronize Specification File Changes With Generated Source Code

解决 MVCC_READ_CONFLICT 错误的其他方法,包括生成此错误时请求客户端应用程序重试请求,或者在将并发请求发送到区块链网络之前使用队列捕获这些请求。有关更多信息,请参见 Hyperledger Fabric 文档中的读写集语义

注意:

MVCC 优化不适用于包含 Oracle Blockchain Platform 和 Hyperledger Fabric 对等节点的混合网络,也不适用于在本地 Hyperledger Fabric 网络上进行测试。不要在混合网络上启用 MVCC 优化,因为这可能会导致对等节点之间不一致。