标记化

代币化是一个过程,其中物理或数字资产由代币表示,代币可以传输,跟踪和存储在区块链上。

通过将资产表示为代币,您可以使用区块链分类账来建立资产的状态和所有权,并使用标准区块链平台功能来转移资产的所有权。

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

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

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

令牌和账户/余额模型

Blockchain App Builder 支持可变和非可变代币。

实物代币具有可互换值。任何数量的可替换令牌与同一类令牌的任何其他相同数量具有相同的值。非实物代币是独一无二的。令牌也可以是整数或小数。小数标记可以根据指定的小数位数细分为较小的部分。

令牌也可以通过行为进行描述。可替换令牌的支持行为包括:mintabletransferabledivisibleholdableburnablerolesminterburnerholder)。非易变标记的支持行为包括:mintabletransferablesingletonindivisibleburnablerolesminterburner)。

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

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

标记标准

Blockchain App Builder 扩展了代币分类框架,ERC-721 标准和 ERC-1155 标准的标准和分类,以定义代币的解剖结构和行为。

ERC-1155 是支持可变代币和非可变代币 (NFT) 的标准。ERC-721 是 NFT 的标准。令牌分类框架是由令牌分类计划 (Token Taxonomy Initiative) 开发的。有关详细信息,请参阅令牌分类框架

下表介绍了区块链应用程序构建器支持的令牌类型:
标准 支持的标记类型
标记分类框架
  • 分数真菌标记
ERC-721
  • 整个不可换代币
ERC-1155
  • 整个可变代币
  • 分数真菌标记
  • 整个不可换代币
  • 分数不可换代币

标记流

由于区块链应用构建器通过扩展输入规范文件语法来支持标记化,因此您可以创建特定于标记的项目,就像使用 CLI 或 Visual Studio Code 创建其他项目一样。

有关使用区块链应用程序构建器创建项目的更多信息,请参阅输入规范文件

标记工作流图表
典型的标记化流遵循以下基本步骤:
  • 确定要使用的令牌标准。
  • 决定要指定的标记行为(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 角色的用户可以将该角色分配给其组织中的其他用户。
Token Minter
分配了 minter 角色的用户是 Token Minter,可以生成标记。
Token Burner
分配有刻录角色的用户是 Token Burner,可以刻录标记。
令牌公证人
分配了公证角色的用户是 Token NotaryToken Notary 在付款人与收款人之间的交易中作为第三方。Token Notary 可以触发从付款人到收款人的令牌转移的完成,也可以将令牌返回到付款人的账户。
Vault Manager
分配有 Vault 角色的用户是 Vault ManagerVault Manager 可以解锁锁锁定的 NFT。Vault 角色仅适用于扩展的 ERC-721 和 ERC-1155 标准。将 Vault 角色分配给用户是锁定 NFT 的先决条件。每个链代码只能向一个用户分配 Vault 角色。
令牌审计员
仅限数字资产版本:扩展的令牌分类框架方法支持 Token Auditor 角色。此角色与 Token Admin 角色类似,但具有只读访问权限。
组织审计员
仅限数字资产版本:扩展的令牌分类框架方法支持 Org Auditor 角色。此角色与 Org Admin 角色类似,但具有只读访问权限。
基于所有权的访问控制支持以下角色:
账户所有者
任何拥有帐户的用户都是 Account Owner
令牌所有者
当前拥有非可换令牌的任何用户都是该令牌的 Token Owner

在某些方法中,还结合了基于角色的访问控制和基于所有权的访问控制。例如,基于角色的访问控制允许具有 minter 角色的用户创建令牌。通过基于所有权的访问控制,不可换名的令牌所有者可以修改令牌的定制属性,但不能修改令牌元数据。当具有 minter 角色的用户创建不可替换令牌 (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 数据库使用多版本并发控制 (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 文档中的 Read-Write set semantics

注意:

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