BRC-100 协议
BRC-100 是一种基于序数理论的可扩展的去中心化计算协议。 BRC-100 协议会以下面的方式定义。未来所有的 BRC-100 协议栈都应该使用类似的规范来定义。
1. 摘要
BRC-100 协议是一种基于序数理论的可扩展的去中心化计算协议。
2. 抽象
BRC-100 协议本质上描述了一种带有计算能力和状态的代币。基于 BRC-100 协议部署的代币被称为应用。BRC-100 支持嵌套和继承。嵌套指的是为一个应用创建子应用,以实现应用的模块化和扩展父应用的计算能力。同时,BRC-100 协议支持协议扩展。任何协议都可以从 BRC-100 或其扩展协议继承,以扩展父协议。BRC-100 协议包含三个部分:属性、操作和计算操作。操作不允许扩展以确保所有基于 BRC-100 及其扩展协议的代币互相兼容,属性和计算操作可以由扩展协议扩展。
3. 参数
参数在协议中定义,部署应用时不需要设置。
- extends:继承自哪个协议
- upgradeFrom:哪些协议可以升级到此协议
- openAsChild:否,是否可以由任何人作为子应用部署
- onlyChild:否,是否只能作为子应用部署
- stoppable:是,是否可以停止
4. 操作
本章定义了 BRC-100 协议的操作和操作符。一个操作可能包含多个操作符来表达略微不同的语义。操作和操作符不允许扩展,这意味着所有 BRC-100 协议的扩展协议都不能添加、删除或更改操作和操作符,以确保所有基于 BRC-100 协议及其扩展协议的代币/应用的兼容性。
4.1 部署
部署 BRC-100 协议时,需要使用 deploy 操作符,并设置应用的属性。BRC-100 的属性如下表所示。
属性 | 描述 | 必须? | 可升级? |
---|---|---|---|
p | 协议,不区分大小写 | 是 | 是 |
op | 操作符,不区分大小写 | 是 | 否 |
tick | 代币名称:3-100个字母,“:” 表示子应用,不是一个有效的比特币地址,不区分大小写 | 是 | 否 |
max | 最大供应量,默认无限制 | 否 | 否 |
amt | 与 max 同义 | 否 | 否 |
lim | 最大所有者铸造数量,只能由操作符 “mint2” 使用 cop “om” 铸造给所有者,默认为 0 | 否 | 否 |
adms | 管理员,可以是地址或应用 | 否 | 是 |
tbhp | 交易黑洞百分比,默认为 0 | 否 | 是 |
ttp | 交易税百分比,默认为 0 | 否 | 是 |
tr | 税收接收者 | 否 | 是 |
b3t | 是否支持 burn3 操作,默认不支持 burn3 | 否 | 否 |
ids | 是否已启动 DAO,默认为 false | 否 | 是 |
dvl | DAO 投票限制 | 否 | 是 |
gtl | 治理执行时间锁定,多少小时后3个区块确认,默认为 24小时 | 否 | 是 |
ext | 扩展协议的扩展属性 | 否 | 是 |
4.2 铸造
BRC-100 协议定义了三个铸造操作符:mint/mint2/mint3。协议使用属性 “mma” 来定义可以公开 “mint” 的最大数量,剩余的代币应使用 “mint2” 操作符铸造。属性 “moma” 定义了为代币所有者预留的代币数量,可以由 “mint2” 操作符使用 cop “om” 铸造给所有者,剩余的代币应通过 BRC-100 扩展协议中定义的其他 cop 使用 “mint2” 铸造。如果 “mma” 属性未设置或等于 “max” 属性,则所有代币都可以公开 “mint”,并且没有代币可以由 “mint2” 操作符铸造。“mint3”意味着从应用中铸造余额,不会改变流通供应量。“mint”和“mint2”会增加流通供应量。
4.2.1 mint 操作符
“mint”操作符的意义是公开铸造。任何人都可以进行“mint”,但总数不能超过 “max” 和 “mma” 设置的数量。“mint”不支持计算操作。
示例:
代码语言:javascript复制{
"p": "BRC-100",
"op": "mint",
"tick": "BRC100",
"amt": "1000"
}
4.2.2 mint2/mint3 操作符
mint2/mint3 都是支持计算操作的铸造操作符。用户或应用使用 mint2/mint3 后将获得代币,并且定义在 “from” 属性中的应用的状态将被更新。具体的计算逻辑由 cop(计算操作)属性定义。mint2 和 mint3 的区别在于,除了用于恢复错误燃烧的 “mint2” 代币外,“mint2” 需要 “from” 属性(应用或地址)是代币的管理员,并且会增加流通供应量。而 “mint3” 不需要是管理员,并且不会增加流通供应量。“mint3”会将用户/应用在一个应用中的余额转换为 UTXO,然后用户/应用可以在其他应用中使用该 UTXO。
示例:
- 使用 “mint2” 操作符为所有者铸造代币。
{
"p": "BRC-100",
"op": "mint2",
"tick": "OWNER_RESERVED",
"amt": "1000000",
"cop": "om",
"from": "OWNER_RESERVED"
}
- 在去中心化稳定币协议中,用户在抵押他们的抵押品后可以铸造与美元挂钩的稳定币:“stablecoin:DUSD”。
{
"p": "BRC-108",
"op": "mint2",
"tick": "stablecoin:DUSD",
"amt": "10000",
"cop": "w2",
"from": "stablecoin:DUSD"
}
4.3 燃烧
类似于 mint2/mint3,burn2/burn3 是带有计算操作的操作符。用户使用 burn2/burn3 操作符燃烧代币后,用户的代币余额将减少,并且定义在 “to” 属性中的应用的状态将被更新。具体的计算逻辑由计算操作定义。burn2 和 burn3 的区别在于,burn2 需要 “to” 属性(应用或地址)是代币的管理员,并且会减少流通供应量;而 burn3 不需要是管理员,并且不会减少流通供应量。burn3 只是将燃烧的代币转换为应用的状态,并且状态转换可以通过应用的计算来控制。burn2 和 burn3 的代币可以通过相应的 mint2/mint3 操作符按照 BRC-100 扩展协议定义的具体计算逻辑再次铸造。
示例:
- 使用 burn2 操作符燃烧流动性证书:LP 代币以从 AMM DEX 中移除流动性。
{
"p": "BRC-102",
"op": "burn2",
"tick": "amm_dex:LP_BRC100_BTC",
"amt": "12",
"cop": "remove_liquidity",
"to": "amm_dex:LP_BRC100_BTC"
}
- 使用 “burn3” 操作符为 BRC-100 和 BTC 代币在 AMM DEX 中增加流动性。
{
"p": "BRC-100",
"op": "burn3",
"tick": "BRC100",
"amt": "2000",
"cop": "add_liquidity",
"to": "amm_dex:LP_BRC100_BTC",
"ts": [
{
"p": "BRC-103",
"tick": "bridge:BTC",
"amt": "1"
}
]
}
4.4 转账
转账操作要求用户首先铭刻转账铭文,然后将铭文转移到其他地址。“transfer” 操作符不能用于将代币转移到应用,并且转账不支持计算操作。
示例:
代码语言:javascript复制{
"p": "BRC-100",
"op": "transfer",
"tick": "BRC100",
"amt": "105"
}
5. 计算操作
计算操作符允许应用根据计算逻辑进行状态转换。
5.1 铸造计算操作符:c2/c3
c2/c3 用于在计算逻辑的基础上铸造代币。c2 与 mint2 相关,c3 与 mint3 相关。c2/c3 将更新 rsb2/rsb3 的状态。
5.2 恢复计算操作符:r2/r3
r2/r3 用于恢复因错误地燃烧或使用 burn2/burn3 到应用或用户而丢失的代币,以便通过 mint2/mint3 操作符再次为用户铸造这些代币。“mint2” 和 “r2” 用于恢复错误的 “burn” 和 “burn2”,“mint3” 和 “r3” 用于 “burn3”。常见的错误类型包括:应用不支持的代币/cop、错误的属性/参数、错误的地址等。r2/r3 最终会更新 rsb2/rsb3 状态。
示例:
- 撤销错误发送到桥接应用的 eth 代币。
{
"p": "BRC-103",
"op": "mint3",
"tick": "bridge:eth",
"amt": "20",
"cop": "r3",
"from": "bc1pdkyv4vp507vrvj4x3h4pmlj2jrz235vmex9cz7flkg8mvra2jmzq50ay7c"
}
5.3 执行治理:egov
当子治理应用可以被执行时,使用 egov 通知应用等待时间锁定:gtl,然后执行子治理应用,以更新应用状态。egov 需要与 burn2 配合使用。燃烧一些代币到子治理应用可以完成 egov。
示例:
代码语言:javascript复制{
"p": "BRC-100",
"op": "burn2",
"tick": "amm_dex",
"amt": "1",
"cop": "egov",
"to": "amm_dex:gov1"
}
6. 停止应用
应用和子应用在部署后将开始运行。但在某些特殊情况下,对于可以停止的应用(协议参数 stoppable 为 Yes),如果应用所有者或代币持有人希望停止应用,他可以通过治理协议 BRC-101 创建一个子治理应用来停止应用。停止后,所有 cop 下的 burn2 和 burn3 都不再工作,即应用不能再根据 burn2 和 burn3 的 cop 改变状态。停止的应用可以处理 mint/mint2/mint3 来为用户或应用铸造代币,并且停止的代币仍然可以转账。最后,停止的应用不能重新启动。
- 状态 本章将介绍BRC-100协议内部的状态,BRC-100扩展协议可以使用这些状态来描述应用内部的计算逻辑,也可以定义自己的状态。索引器需要将这些状态展示给用户,以保证状态的公开性和一致性。所有状态都应该用Merkle Tree来存储,并将树的根展示给用户。状态是应用根据用户的操作和计算操作计算出来的结果。状态可以是应用的变量,也可以是本应用或地址内其他应用或用户的余额等。状态可以属于应用、子应用和地址。应用状态与应用属性的区别在于,属性的更新需要通过治理来完成,而状态是由公开的算法和规则计算出来的,不需要治理。BRC-100中的余额分为两种:一种是UTXO余额,与BRC-20类似,由地址持有,包括可用余额、可转让余额和“mint3”余额;另一类是状态机模型引入的状态余额,可以由应用程序或地址持有。BRC-100 协议定义了以下 8 种状态来描述地址和应用程序的 UTXO Balance 和状态余额:
sbom,State Balance for Owner Mint,应用程序状态,表示当前应用程序中,operator:“mint2” 和 cop:“om” 可以铸造给 Owner 的 token 数量。
uba,UTXO Balance of Address,地址状态,表示当前地址所持有的所有 token 的余额。每个 token 的余额有三种状态:可用余额、可转让余额、可挖矿余额。可用余额表示用户可以刻记的余额,也就是可以转移和销毁的余额;可转让余额表示用户已经刻记的可以转移和销毁的余额;可挖矿余额表示可以从该地址挖矿的余额,地址或应用程序可以挖矿的数据通过 rsb3 和 sb3 两个状态来存储。
rsb2,地址状态 mint2 的可恢复状态余额,表示用户可以通过 cop: r2 从当前地址恢复的代币余额。“rsb2”表示用户错误“销毁”或“销毁2”的代币。由于应用程序无法通过计算逻辑处理 cop 或处理失败,“销毁”或“销毁2”的代币存储在地址状态中。用户可以使用 op: mint2 和 cop: r2 将其重新铸造到自己的钱包中。
rsb3,地址状态 mint3 的可恢复状态余额,表示用户可以通过 cop: r3 从当前地址恢复的代币余额。“rsb3”表示用户错误“销毁”的代币。由于应用程序无法通过计算逻辑处理 cop 或处理失败,“销毁”的代币存储在地址状态中。用户可以使用 op: mint3 和 cop: r3 将其重新铸造到自己的钱包中。
sba2,mint2,应用状态的应用程序状态余额,用于表示当前应用程序可以“mint2”的代币总量,等于sb2状态下代币数量的总和。
sba3,mint3,应用状态的应用程序状态余额,用于表示当前应用程序可以“mint3”的token总数,sb3状态中的token数量总和不能大于sba3中的值。
sb2,mint2 的状态余额,应用状态,用于表示地址从当前应用程序中可以 mint2 的代币数量。
sb3,mint3 的状态余额,应用状态,用于表示某个地址可以从当前应用程序中 mint3 的代币数量。
以下为翻译的原文链接:https://docs.brc100.org/brc-100-protocol