# Flowns 介绍 Flowns 是构建于 Flow 网络的新一代去中心化域名服务,基于 Cadence 智能合约语言,以面向资源的方式实现的域名服务,Flow 中的 [资源模型](https://docs.onflow.org/cadence/language/resources/) 让 Flowns 服务兼具灵活性与扩展性,域名 NFT 资产能够产生更多的使用场景。 > Flowns 不仅仅是一个域名服务,也是开放数字身份/资产的协议 ## 为什么是 Flowns 可读名称与丰富数据的链上身份,是数字世界中不可或缺的基础设施,域名可以成为拥有者的索引和信息载体,将更多的信息和资产存储在链上,成为其自身个性化的表达。在未来区块链应用与数据爆发的趋势中,我们仍然需要一个开放且多样的数字身份服务。 Flowns 定义了一个数据与资产的开放协议,允许任意形式的资源/资产嵌套,域名资产成为由用户与开发者共同参与定义的元资产。 ## Flowns 有哪些特点 ### 更加去中心化的资产所有权 在 Flow 网络中,域名资产完全分布式存储在拥有者的用户账户中,用户可以保留他的域名资产但不使用,即使域名过期,Flowns 也无法在未经授权的情况下,销毁或回收用户账户下的域名资源,这就意味着,用户账户中的域名资源会永远存在。 > 是基于 Flow 网络及加密算法所保护的资产所有权。 用户对域名的定义、管理等操作,都不需要经过 Flowns 的服务,完全发生在用户自己的账户中,通过调用拥有 NFT 资源的 [能力(Capabilities)](https://docs.onflow.org/cadence/language/capability-based-access-control/) 完成域名管理与定制,Flowns 本身只负责域名服务寻址解析和一些元数据规则定义与解析服务。 域名拥有者可以在域名到期后选择任意时间续费,恢复域名服务。在域名到期续费之前,域名资源并不会被回收,只是被 Flowns 服务中标记为停用与可注册状态,一旦有新的用户注册了过期未续费的域名,那么 Flowns 将会为新注册的用户铸造新的域名 NFT,原有的域名资源将会在 Flowns 服务中标记为弃用。 这样既保证了用户资产的分散性,也兼顾了域名服务的延续性。 ### 可组合性 受益于 Cadence 中资源的嵌套能力, Flowns 域名可以成为用户在 Flow 网络中的资产容器,能够接收任何类型的同质化与非同质化代币,且不需要用户在接收资产前初始化收款资源,域名资产能够帮助用户存储资金和其他类型的 NFT 资产,把「主动」接收,变为「被动」。子域名也是以嵌套资源的形式存在域名 NFT 资源中,由用户自己管理维护。 可组合性令人着迷的地方在于,任何第三方开发者和服务方,都可以通过嵌套资源的形式将代表「身份」与「认证」甚至「权益」的 NFT 资产内嵌到域名资源中,作为域名拥有者的权益。我们可以把域名资产看作用户个人的虚拟的无限身份空间,可以容纳任意的数据与资产集合,成为一个真正的个性化数据与资产的载体。 ## 多根域名 Flowns 支持多个根域名,多根域名给域名的使用者与发行者更多的选择,每个根域名都具有自己单独的独立配置,包括接受支付的资金库、域名价格、注册返佣比例、最大域名长度、最小续期时间、禁用字符等等。 也允许不同的根域名接受不同类型的同质化代币作为支付货币,具备面向商业应用的基础。 ## 社区驱动 Flowns 想法诞生于社区,也得到了来自社区的诸多帮助与支持,作为基础设施和公共服务,Flowns 也应当属于社区,我们视所有的域名购买者为社区的成员与支持者,大部分的域名出售费用都将用以建立 DAO 组织基金的方式,通过资助更多社区项目的方式回馈给 FLow 社区。 FLow 的账户模型支持多公钥绑定,所以当 Flowns 服务足够稳定运行时,管理员账号将通过添加多个公钥的形式,成为多签账户。 在未来,管理员账户也将升级为多签账户,逐步将管理权限过渡给社区。 ## 名词解释 在我们开始之前,需要先明确几个概念 ### Resources 资源 资源在 Flow 网络中是所有资产和权限能力的最小单位,我们所熟知的 FLOW 代币,存储在每个持有者账户下的金库(Vault)资源中,NBA Topshot 瞬间也是资源,Flowns 的根域名/域名/子域名/管理员权限等等也是资源。 资源定义了一个资产的属性和它具备的一些能力(Capabilities),能力代表着资源具备哪些接口,能够被外部或内部的人触发从而改变。关于资源和能力的详细介绍,请参考如下资料 [How Cadence and Flow will revolutionize smart contract programming](https://medium.com/coinmonks/how-cadence-and-flow-will-revolutionize-smart-contract-programming-607bd05b49b) [Cadence at a Glance](https://medium.com/@ebner.benjamin/cadence-at-a-glance-4e685c34b544) [Basic Access Control in Cadence](https://joshuahannan.medium.com/basic-access-control-in-cadence-28c5765c6ec0) ### Root domain —— 根域名 与其他域名服务一样,`github.com` 或 `google.com`,甚至多级域名像 `test.google.com`,我们能看到这些域名的后缀都是 `com` 结尾, 同样在 Flowns 中,根域名是所有域名的根。 根域名由管理员账户管理,其权限以资源的形式存在管理员账户中。 ### Domain(NFT) —— 域名 NFT 资源 Domains 智能合约是一个实现了非同质化代币的智能合约,同样在其中定义了子域名的 NFT 资源,域名是通过根域名资源来完成铸造,我们可以在根域名资源中看到注册和续费的函数,域名的发行是通过根域资源名来完成的。 用户可以将域名当做一个普通的 NFT 资产保存或转移,甚至在交易市场交易。 面向资源的模型中,域名资源是完全存储在用户账户下,那么域名资源中包含的一些管理方法,也只能由拥有者有权限调用,域名的信息和域名的子域名的信息都需要用户授权才能添加与修改。 ### Subdomain —— 子域名 与之前的例子一样,`test.google.com` 中 `test` 是 `google.com` 的二级域名(SLD: second-level domain),同样我们也知道`google` 域名的根域名是 `com` 在 Flowns 服务中,如果用户从 Flow 根域名注册了一个新的域名叫做 `user.flow` ,他就拥有了`user.flow` 这个 NFT 的域名资源,同样也可以试用 `user.flow` 来为自己免费铸造子域名,例如 `blog.user.flow` 和 `dev.user.flow` 等等。 ### NameHash -- 名称 hash 为了支持更多字符,Flowns 使用名称哈希使每个域名在 Flowns 中唯一,并且它们都存储在 Domains 合约中具有键值映射的记录。 每一个与域名有关的状态变化,都需要借助哈希作为索引到 Flowns 合同中的特定域记录。 ## 技术架构 如上所述,Flowns 域名服务具有此关系: ``` // ex. dev.user.flow Root domain -> Domain -> subdomain `flow` -> `user` -> `dev` ``` ### Cadence 合约结构 ``` Flowns | -- Admin | -- RootDomainCollection | -- RootDomain Domains | -- Domains.Collection | -- Domains | -- Subdomain ``` 资源嵌套结构如下 : ``` Admin resource -- in admin account | -- server: &RootDomainCollection | -- domains: @{UInt64: RootDomain} | -- server: Domains.Collection (In order to create the Domain.NFT) | -- domainVault: @FungibleToken.Vault (Receive domain rent fee) Domains resource -- in user account | -- Collection: @NonFungibleToken.Collection | -- ownedNFTs: @{UInt64: NonFungibleToken.NFT} as Domains.NFT(Domain) | -- subdomains: @{String: Subdomain} | -- vaults: @{String: FungibleToken.Vault} | -- collections: @{String: NonFungibleToken.Collection} ``` #### FLowns 合约 `Flowns` 合约是 Flowns 的核心合约,他定义了根域名和根域名资源的存储容器 `RootDomainCollection` (这个实现方式和 Flow 中的 NFT 一样,但不是完全标准的 NFT),如果用户想要注册域名,他们需要在指定的根域名下调用一个名为 `registerDomain` 的公有函数。 根域名资源拥有以下核心属性: - vault —— 资产库,用来保管每个根域名的域名注册和续费的收入,可以被管理账户提现,同样也可以切换成任何实现了 `FungibleToken` 同质化代币类型的资产库。 ``` // Root domain create with a vault resource access(account) fun createRootDomain( name: String, nameHash: String, vault: @FungibleToken.Vault ) ``` - prices —— 定价表,是由管理员设置的域名租用价格表,它按照域名字符的长度来设置不同的租用价格(以秒为单位计算),如果某根域名中某个长度的价格没有被设置或者为 0,那么用户就不可以注册或者续费。 ``` // set price with domain name length access(account) fun setPrices(domainId: UInt64, len: Int, price: UFix64) ``` - server —— 服务资源,保管了`Domains.Collection` 域名的集合在根域名资源中,用来在用户注册域名时,调用集合的「铸造」方法。 ``` // only use by Root domain itself, use Domains.Collection to call the mintdomain functions access(self) var server: Capability<&Domains.Collection>? // Domains.mintdomain access(account) fun mintDomain(id: UInt64, name: String, nameHash: String, parentName: String, expiredAt: UFix64, receiver: Capability<&{NonFungibleToken.Receiver}>) ``` **Admin** 资源拥有管理域名资源的以下核心权限 - 初始化根域名集合 - 创建根域名,配置根域名 - 暂停或启用全局注册服务 - 添加域名 NFT 集合资源到根域名资源中 ``` // for admin resource to manage root domains under their account pub fun addCapability(_ cap: Capability<&Flowns.RootDomainCollection>) // init admin server self.server!.borrow() can get the root `RootDomainCollection` reference ``` - 将 DomainsNFT 集合功能作为 `server` 添加到根域名资源中,以便使用 `CollectionPrivate` 创建域名 NFTs ``` // for root domain manage domains, by call rootDomain.addCapability(cap) pub fun addRootDomainCapability(domainId: UInt64, cap: Capability<&Domains.Collection>) // in admin resource's function self.server!.borrow()!.getRootDomain(domainId).addCapability(cap) ``` - 为根域名设置价格 - 切换收款资产库资源,能够让根域名支持任何类型的同质化资产作为费用 ``` // could change the root domain's vault for receive new type of Fungible token access(account) fun changeRootDomainVault(vault: @FungibleToken.Vault) ``` - 更新域名的解析记录 - 铸造域名,直接通过管理员权限铸造域名。 所有有关 Flowns 的管理逻辑都在 Flowns 函数中中定义,同样它也有更多的权限限制。 Flowns 也是用户从根域注册域的公共入口。 #### Domains 合约 Domains 智能合约在 NFT 的基础上进行了一些扩展,重点关注资源和域名的能力,为域名所有者提供域名管理接口和公共数据查询接口。 Domains 智能合约中有三个中心账本属性: - Domains.records —— 域名解析记录 `records` 记录保留名称哈希和 FLow 帐户映射,作为注册表记录,通过域名哈希进行寻址。该记录不能由所有者更改,但当域名 NFT 转移给其他用户时,记录将自动更新。因此,Flowns 总是可以通过域名哈希找到域名所有者。 - Domains.expired —— 域名过期信息 `expired` 过期记录,用来存储域名的有效期,它可以通过 Flowns 合约的注册和续租接口更新。当域名过期时,域名接口的服务会停止。 用户需要在域名过期之前续租,否则他们的域名资产可能被 Flowns 服务标记为废弃。 - Domains.deprecated —— 废弃信息 记录过期未续费且被其他用户注册而导致弃用的域名信息。 当域过期时,所有者可以选择续租或不续租,若域名过期不续租,即使用户保留域名的 NFT 资源,Flowns 也会将域名标记为其他用户可用,这样新用户可以注册过期且未续费的域名。 **NFT(Domains.NFT)** —— 域名 NFT 资源,可以被`Domains.DomainCollection` 资源铸造 域名 NFT 有如下核心属性: - addresses —— 域名拥有者的地址信息,可以由用户定义多链地址 - texts —— 域名自定义元数据信息,存储各种类型的数据 - subdomains —— 嵌套存储域名拥有者创建的子域名 - vaults —— 保存任何类型的同质化代币资产 - 将 FLOW 代币以内嵌资源的形式充值给域名资源 [script ](https://github.com/flowns-org/flow-name-service-contracts/blob/main/cadence/transactions/deposit_domain_vault_with_flow.cdc) - 将内嵌在域名资源中存储的代币提现 [script](https://github.com/flowns-org/flow-name-service-contracts/blob/main/cadence/transactions/withdraw_domain_vault_with_vault_type.cdc) ``` // store any Fungible token with the script // eg. {'A.0ae53cb6e3f42a79.FlowToken.Vault': @FungibleToken.Vault} pub var vaults: @{String: FungibleToken.Vault} ``` - collections —— 保存任意类型的 NFT 集合资源到作为域名的内嵌资源, 甚至域名可以存储 Flowns 域名自己,理论上可以无限循环嵌套,但不建议这么做. - 将 NFT 发送给域名资源 [script](https://github.com/flowns-org/flow-name-service-contracts/blob/main/cadence/transactions/send_nft_to_domain.cdc) - 将域名内嵌的 NFT 资源提现出来 [script](https://github.com/flowns-org/flow-name-service-contracts/blob/main/cadence/transactions/withdraw_nft_from_domain.cdc) ``` // store the nest NFT collection for Domain resource // eg. {'A.f8d6e0586b0a20c7.Domains.Collection': @NonFungibleToken.Collection} pub var collections: @{String: NonFungibleToken.Collection} ``` 另外 Domains 合约还定义了一些域名和子域名记录与元数据的管理方法 - Subdomain —— 子域名以内嵌资源的形式保存在域名资产中,是 `subdomains: @{String: Subdomain}` 这样的属性. 映射的键是子域名的名称哈希。 - `createSubDomain` —— 为域名添加子域名 - `removeSubDomain` —— 移除域名的子域名 - Collection —— `Domains.Collection` 存储域名信息并定义了一些私有函数 - `borrowDomainPrivate` —— 为拥有者借出域名的私有权限 - `mintDomain` -- 为注册用户铸造新的域名 NFT.