Skip to main content

规则(子领域及DMINT)

子领域和 NFT 物品的铸造规则概述(通过 DMINT 即去中心化铸造方式)。

子领域和 NFT 物品可以在遵守父领域所有者或 NFT 容器创建者所制定的 rules 规则下,通过DMINT(去中心化铸造)方式被铸造(或称为“认领”)。

NFT 物品/子领域的认领可以单独通过工作量证明(Bitwork)完成;也可以通过向指定的一组输出地址支付一定数量的聪,或支付 ARC20 代币来实现;或者通过结合这两种方式,即要求完成工作量证明同时向指定地址支付(聪或 ARC20 代币)来认领 NFT 物品/子领域。

规则数据结构格式

dmint(针对容器的规则设置)部分和领域的 subrealms 部分中,规则设置是一致的,采用相同的语法和语义结构。

为了展示规则的应用,我们将从构建简单的示例开始,并逐步增加其复杂度。

warning

警告:所采用的正则表达式标准遵循 Python 3.9 版本。这意味着所有的正则表达式模式都会在“完整字符串模式”下进行匹配——即匹配过程始终从字符串的开头到结尾,无论是否使用了 ^$

示例 1:铸造申领仅需完成 Bitwork 工作量证明

此示例要求通过在承诺交易中完成 Bitwork 工作量证明(bitworkc)来铸造申领,即需要在交易中展示一定的计算工作。模式 "p": ".*" 表示可以匹配任何子领域名称或任何 dmint 项目ID。此时,唯一的“支付”要求是在承诺交易时使用 "bitworkc": "1234" 进行必要的计算工作以完成铸造。

{
"rules": [
{
"p": ".*",
"bitworkc": "1234"
}
]
}

示例 2:铸造申领需同时完成 Bitworkc 和 Bitworkr 工作量证明

此示例要求通过在承诺交易中完成 Bitwork 工作量证明(bitworkc)来铸造申领,并且在揭示交易中也需要完成额外的 Bitwork 工作量证明(bitworkr)。模式 "p": "." 表示可以匹配任何子领域名称或任何 dmint 项目ID。所需的“支付”形式是项目在承诺交易时必须通过 "bitworkc": "1234" 完成相应的计算工作来进行铸造。此外,揭示交易还必须满足 "bitworkr": "8888.10" 的工作量证明要求,这意味着交易的哈希值需要以 "8888.*" 开头,并且其第五个十六进制字符需要大于或等于 "a"(即十六进制的10)。

{
"rules": [
{
"p": ".*",
"bitworkc": "1234",
"bitworkr": "8888.10"
}
]
}

示例 3:根据项目名称设置不同的 Bitworkc 难度

在这个示例中,我们规定如果项目名称以数字 "0" 开头,或者名称以 .gif 结尾,那么所需的 Bitwork 难度将会增加大约 16 倍(这意味着将需要 16 倍的 CPU/GPU 计算能力来完成挖矿)。

{
"rules": [
{
"p": "^0|\.gif$",
"bitworkc": "77777"
},
{
"p": ".*",
"bitworkc": "7777"
}
]
}

示例 4:申领项目需要向指定地址支付

为了启用“付费申领”功能,请利用 "o"(输出脚本)字段来指定成功申领所必须支付的输出目标。

{
"rules": [
{
"p": ".*",
"o": {
"5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4": {
"v": 1000
}
},
}
]
}

上述规则意味着,为了成功认领,必须向输出脚本 5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4 支付至少 1000 satoshis。该脚本解码后对应的地址为 bc1p49mrdne5j2j5dktkupflvx6s0z8027ssk2yg2f6mvzand8nzjrjqschm45

注意:使用命令行工具命令 yarn cli script-address <script> 来解码脚本并获取相应的地址。要进行逆操作,即为一个地址获取其输出脚本,使用命令 yarn cli address-script <address>

选择使用十六进制编码的输出脚本是因为项目可能要求用户在区块链上发布 OP_RETURN 形式的消息,而非进行实际的支付操作。此外,这种做法对未来的地址类型具有更高的灵活性。

示例 5:申领项目需要向多个地址支付

为了启用“付费申领”,使用 "o"(输出脚本)字段来明确成功申领所必须支付的输出目标。在以下示例中,为了申领名称以 "000\d" 开头的项目(即:项目 00000009),需要向输出脚本 5120bd5ba4e806e8cf69eff55af83c9b910f82d1978bfac53ce48554ce291dd22bec(对应的地址为bc1ph4d6f6qxar8knml4tturexu3p7pdr9utltzneey92n8zj8wj90kqshxyqa)支付 5,000聪,并同时向输出脚本 5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4(对应的地址为 bc1p49mrdne5j2j5dktkupflvx6s0z8027ssk2yg2f6mvzand8nzjrjqschm45)支付1,000聪。

{
"rules": [
{
"p": "^000\d$",
"o": {
"5120bd5ba4e806e8cf69eff55af83c9b910f82d1978bfac53ce48554ce291dd22bec": {
"v": 5000
}
},
"p": ".*",
"o": {
"5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4": {
"v": 1000
}
}
}
]
}

示例 6:申领项目需使用特定的 ARC20 代币进行支付

为了启用“付费申领”,使用 "o"(输出脚本)字段来明确成功申领所必须支付的输出目标。在以下示例中,为了申领名称以 "000\d" 开头的项目(即:项目 00000009),需要使用特定的 ARC20 代币进行支付。该代币的id为 2112003789d572f764ff91b273266997e3a1153e017dc8a4fca020eaff324301i0,并且需向输出脚本 5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4(对应的地址为 bc1p49mrdne5j2j5dktkupflvx6s0z8027ssk2yg2f6mvzand8nzjrjqschm45)支付 1,000 个该 ARC20 代币。

{
"rules": [
{
"p": ".*",
"o": {
"5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4": {
"id": "2112003789d572f764ff91b273266997e3a1153e017dc8a4fca020eaff324301i0",
"v": 1000
}
}
}
]
}

示例 7:申领项目需要完成 Bitworkc 挖矿和使用特定 ARC20 代币进行支付

此示例综合了之前的示例,要求除了使用特定的 ARC20 代币进行支付外,还需要完成 Bitworkc(承诺交易的ID)的挖矿工作。

{
"rules": [
{
"p": ".*",
"o": {
"5120a97636cf3492a546d976e053f61b50788ef57a10b28885275b60bb369e6290e4": {
"id": "2112003789d572f764ff91b273266997e3a1153e017dc8a4fca020eaff324301i0",
"v": 1000
}
},
"bitworkc": "7878"
}
]
}

在最初的申领候选人之后进行支付的时机

当支付规则要求至少向一个地址进行支付时,申领铸造的用户必须等待 4 个区块的确认,以确保他们成为子领域或 NFT 物品的首要候选人。之后,他们将有额外的 11 个区块的时间来根据支付规则完成支付,并需要附上一个 OP_RETURN 收据,表明他们正在申领和支付的 atomical id

这种分步进行的流程是为了防止在支付过程中出现恶意行为。如果直接进行支付,恶意的 NFT 集合可能会通过快速支付的方式抢在合法支付者之前,从而诱导用户失去他们的项目。因此,采用候选人系统确保只有一个用户具有首要的候选资格和支付权利。如果用户在其最初提交的交易之后的 15 个区块内未能完成支付并在区块链上确认,那么另一个用户将有机会成为领先的候选人,发起他们的支付,并获得项目的所有权。

tip

我们强烈建议钱包和服务提供商设置的矿工费率至少比当前比特币网络的平均费率高 50% 到 100%,以确保支付能够及时被确认,而不是在 15 个区块后被延迟。