# 核心概念

## **命名空间**

命名空间是 BNS 的顶级域（例如 .btc、.id）。它们具有以下生命周期：

* **预下单（Preorder）：** 提交带盐哈希的命名空间并附带燃烧支付
* **揭示（Reveal）：** 实际的命名空间被揭示，同时提供定价信息和所有命名空间属性

<details>

<summary>揭示期间会发生什么？</summary>

在揭示期间，创建者会设置： `寿命` （名称在到期前可以存在的时长，0 表示无需续期）， `命名空间导入` 主体，以及完整的 `定价函数` （16 个桶、基数、系数、非字母折扣、无元音折扣）。这些是定义命名空间行为的关键参数，永久生效。

命名空间定价可以通过 `namespace-update-price`更新，并且可以被永久冻结（通过 `namespace-freeze-price`）。一旦冻结，定价函数将无法更改。这些是重要的治理决策。

此外，名称可以在上线前通过 `name-import`导入。这允许命名空间创建者在向公众开放注册之前预先填充名称（例如用于迁移或保留名称）。

</details>

* **上线（Launch）：** 命名空间变为活动状态，允许注册名称

#### **非托管与托管命名空间**

BNS-V2 支持两种类型的命名空间： **非托管** 和 **托管**.

非托管命名空间允许任何人在其内注册名称，但须遵守命名空间的定价规则。这些命名空间以去中心化方式运行，对名称注册和管理的限制最少。

另一方面，托管命名空间引入了额外的控制和定制层。此类命名空间由指定的管理者监督，管理者拥有特殊的权限和职责。托管命名空间可以为名称注册、定价、转移和续期实施自定义规则。这使得可以用于特定社区创建命名空间、实施额外的验证流程或强制执行特定命名约定等用例。

非托管与托管命名空间的主要区别在于治理和灵活性。非托管命名空间提供更开放、不受限制的环境，而托管命名空间则提供更强的控制能力并能针对特定需求或用例定制命名空间。

#### 创建托管命名空间

托管命名空间是本版本 BNSv2 的重要更新之一。为了允许对命名空间进行更大程度的控制和灵活性，“托管”命名空间由单一主体控制（几乎总是一个 *合约* 主体）。要获得预期行为，设置该合约主体时必须非常小心——如果设置不正确，可能会永久失去对命名空间的控制。

创建托管命名空间时需要做出的几个重要决策包括：

* 管理者合约是否 *会* 需要被更改？
* 你的铸造流程将如何工作？
* 管理者是否可以转移 *任何* 名称？
* 你的名称会可交易吗？
* 你的命名空间是否需要元数据？

这些是必须考虑以使托管命名空间具有前瞻性的关键决策。对于第一个问题，几乎可以确定你 *将会* 需要更新或移除管理者合约，因此管理者合约必须包含对 'mng-manager-transfer' 函数的访问权限。如果初始的管理者合约不包含该函数，将不可能将命名空间更新或移交给新的管理者合约。

托管命名空间在名称注册时不需要燃烧 STX。 `mng-name-register` 函数在预下单时设置 `stx-burned: u0` 。定价完全由管理者合约处理（可以是免费、代币门控、通过管理者自己的逻辑基于 STX 等）。这是与非托管命名空间的根本区别。

接着，托管命名空间中的铸造流程可高度定制。总体而言，托管命名空间可以使用相同的两条名称注册路径：两步法 / mng-name-preorder + mng-name-register，或一步法 / fast-claim。托管合约 **必须** 能够访问其中一个或两个函数以在命名空间中成功铸造名称；此外，铸造流程可以高度定制以支持：免费铸造、代币门控铸造、可变定价、sip-10 代币支持等。

铸造完成后，你必须特别注意实现三项标准 sip-09 市场函数：上架、下架与购买。托管命名空间 *默认* 并非可交易，它们 *必须* 在 BNSv2 中将包含对上架、下架与购买函数的包装调用，因为这些函数会特别检查 'contract-caller'（即托管合约）。

最后，是否允许托管命名空间合约 *本身* 转移任何名称是一个关键决策。几乎可以确定你 **不** 会想允许这一点，因为这会允许合约将任何名称转移给任何主体；然而，有些用例需要更细粒度的控制。

托管命名空间的名称不会过期。其 `mng-name-register` 函数在预下单时设置 `renewal-height: u0`，意味着没有自动续期要求。管理者控制完整生命周期。

***

## **名称**

名称是命名空间内的单个标识符（例如 alice.btc）。它们具有以下属性：

* 在其命名空间内唯一
* 以 NFT 形式表示
* 可以被转移和续期
* 与 zonefile 关联，zonefile 在单独的 `zonefile-resolver` 合约

中存储与名称相关的附加信息。

```
一个 BNS 名称有两个组成部分：
```

\<name>.\<namespace>

```
alice.id
```

* `示例：` alice
* `→ 名称` id

→ 命名空间

***

## 命名空间定义名称注册的规则和定价。

所有权

名称归 Stacks 主体所有。

* 所有权允许持有者：
* 更新记录
* 将名称设置为主名称
* 将名称上架出售于内置市场
* 转移该名称
* 续期该名称

配置解析数据

***

## 所有权完全由智能合约逻辑强制执行。

Zonefile（区域文件）

每个名称都可以存储结构化记录。zonefile JSON 支持：所有者地址、BTC 地址、简介、网站、头像、名称、位置、社交链接（X、Telegram 等）、多链地址（BTC 支付、BTC 序数、ETH 等）、任意键值元数据和子域定义。

* 这些记录可能包括：
* 地址映射
* 文本元数据
* 特定应用的数据

个人资料信息（Profile）
