首先,目标是什么?这样的注册表能实现什么目的? 任何人都应该能够为自己拥有的东西注册一个域名 任何人都不能为自己不拥有的东西注册域名 任何个人或团体不得阻止他人注册域名,也不得强行使用已经注册的域名 注册域名肯定需要一些费用 任何个人或封闭的团体都不应获利 注册表不应依赖于任何特定个人或团体的持续维护或支持 当不再需要某个域名时,应该有一些激励措施来释放该v 一定要有办法可以转移域名 必须有一种有效的方法来读取域名注册表的当前状态并检测更改 必须有一种有效的方法来证明链上和链下域名的所有权 理想情况下,应该有一种方法来嵌套域名注册表来创建域名空间 理想情况下,应该有一种方法来创建许可的域名空间 理想情况下,应该有一种方法来支持完全去中心化的 TailDatabase
用户决定为单例创建一个域名。例如,将域名与存储在 DataLayer 表中的应用程序(“chapp”)相关联。或者将域名与 DID 相关联。
用户编写将域名添加到区块链的请求,其中包括所请求的域名、为保护该域名而持有的 XCH 存款以及为记录该域名的人提供的 XCH 提示。要创建域名,他们需要证明将被命名的单例的所有权。
此后的某个时刻,有人会看到有几个未完成的请求,并将使用链上请求来更新链上注册表,并接受为此提供的提示。
钱包将能够检测注册表单例的更新,查看注册表的更新方式,并将相同的更新应用于注册表的内部副本。
稍后,当用户决定完成该域名时,他们将向链写入另一个请求以删除该域名并收回押金。他们将再次提供拥有单例的证明。他们将再次提供一个提示,即不久之后的某个时刻,有人将执行请求并接受提示。
域名空间,例如“fizpawiz.chia” 许可的域名空间,域名空间管理员可以在其中分配域名 最后,一种完全去中心化的 TailDatabase 方法(!!!)
技术说明:
存款金额:当前预留域名所需的金额。匹配当前因发现区块而奖励的 1/8 代币数量(减半时会减少) 小费金额:支付给实际构建更新域名表的支出的人员的金额。 域名:是一个名称,必须是原子级,可能需要其他限制(参见下面的“开放问题”)。 目标单例:用域名引用的单例。请注意,这些不必是 DID,而可以是任何单例:DataLayer、NFT 等。 Launcher id:每个单例都由用于创建第一代单例的代币 ID 来标识。在单例的世代中,启动器 ID 永远不会改变。 域名记录:域名、目标单例启动器id、充值金额 域名表:域名记录表 域名表默克尔根:当域名表表示为默克尔树时,这是存储在链上的该树的根 操作:“插入”、“删除”或“旋转” 请求硬币:由参与者提交操作请求而创建的币,其中包括域名、要执行的操作和小费金额等。 同级转移:当提交两个请求硬币以实现转移时,一个删除域名,另一个使用不同的单例启动器 ID 再次插入它,然后每个请求硬币将另一个请求硬币视为其同级转移(Tansfer sibling)。 押金退款接收地址:删除域名时押金退款应发送至的地址。 临时硬币:在这种情况下,这是一种临时硬币,需要目标单例的声明才能花费,这是创建有效请求硬币的唯一方法。 操作记录:操作记录将包括域名记录、要执行的操作、传输兄弟代币 ID 以及柯里化到请求代币中的其余参数的哈希值。如果“插入”,则还包括先前和后续记录的表记录(按域名排序)以及每个记录的默克尔路径。如果“删除”,则还包括要删除的表记录的merkle路径。如果“旋转”,则包括两个连续记录的表记录和默克尔路径,其中路径的长度至少相差两倍。 域名注册表单例:托管域名表的单例 执行人:实际构造并提交域名单例花费以更新域名表的参与者。可以是任何人。 执行人接收地址:支付小费的执行人的接收地址。
临时硬币。请求更新域名注册表涉及两种代币:临时硬币和请求硬币。短暂的硬币有一个固定的谜题,域名为单例启动器 ID,这使得它很容易在链上找到。当花费临时币时,解决方案需要目标单例启动器 ID、目标单例 mod 参数、请求的域名、操作(仅限“插入”、“删除”或“旋转”)、转账同级、存款退款接收地址、小费金额 ,当前区块高度和它自己的代币ID。如果操作是“插入”,硬币将验证请求的域名是否有效。如果“插入”,将确认给定区块高度的存款金额是正确的,并且将使用assert_height_absolute来确认给定区块高度不是将来的。它将创建一个条件,以断言来自临时代币的代币 ID、域名单例启动器 ID、请求的域名、操作、转账同级、存款退款接收地址和小费金额的目标单例的谜题公告。这可确保请求者拥有目标单例,并且请求参数不会被恶意农民更改。它将创建一个请求币作为唯一的孩子。临时硬币和请求硬币的硬币金额必须是存款金额(如果“插入”操作)和小费金额的总和。临时币将发出一个assert_ephemeral条件,以确保它在链上记录时始终有一个子代。
请求硬币。请求币将具有域名单例启动器 ID、目标单例启动器 ID、请求域名、操作、转移兄弟、存款退款接收地址、小费金额、当前块高度和祖父母币 ID。它将有两种支出模式:中止 并执行。
中止模式:当请求者选择中止时,请求币将和解决方案中的目标单例mod参数一起使用。它将断言该代币的 ID 的谜题公告,并使用柯里化的启动器 ID 从单例中“中止”,并创建一个带有存款和小费金额的子代币,作为单例可以领取的“支付给单例”代币。
执行模式:当执行者花费请求币执行请求时,该币将接受解决方案中的域名表merkle root。它将发出一个条件,断言其母代币具有短暂的代币谜题,并且其自身的金额是给定小费金额和当前存款金额的总和。它将断言来自该硬币的硬币 ID 的域名单例的谜题公告。它将创建一个带有消息“exec”的谜题公告。如果传输同级不为零,则请求币将断言该币 ID 的并发支出。如果操作是“删除”,则将按照要退款的存款金额创建一个子代币,并将其分配给给定的存款退款接收地址。如果操作是“插入”,则不会创建子硬币。
域名单例。每个域名注册表都是一个单例,并且具有域名表的柯里化根哈希、标准交易 mod 哈希和请求币 mod 哈希。每次支出时,它都会接受执行者公钥、小费总额和解决方案中的操作记录列表。花费币至少需要10条动作记录,所有动作记录必须按域名和动作排序,并且必须是唯一的。它将使用给定的公钥发出整个解决方案的 agg_sig_me 。硬币的价值是所有包含的记录的总存款金额。每代单例的价值都会根据处理的操作中的存款金额进行更新。总小费金额将以代币的形式输出到执行者接收地址,使用给定的公钥和标准交易 mod 哈希值进行计算。
对于每个“插入”记录:拼图将确认给定的先前和后续域名在给定域名之前和之后排序并且与给定域名不匹配。它将确认先前和后续域名记录的哈希值与相应 Merkle 路径的开头匹配,并确认先前和后续 Merkle 路径都正确到达当前 Merkle 根。它将识别merkle路径中最低的公共节点,并根据需要插入一个节点,然后重新计算merkle根。它将创建一个关于请求币的 coinid 的谜题公告。它将断言来自消息“exec”的请求币的谜题公告。
对于每个“删除”记录:拼图将确认给定的默克尔路径存在于默克尔树中,并且要删除的记录不具有零存款金额。它将促使peer删除该节点并重新计算merkle根。它将向 p2_singleton 发送一个 create_coin 作为存款金额,以便该单例的所有者可以收到返回的存款。最后,它将创建请求币的币 id 的谜题公告,并断言消息“exec”的请求币的谜题公告。
对于每个“旋转”记录:拼图将确认给定的域名记录与关联的默克尔路径中的叶子匹配。它还将确认 Merkle 路径正确并且 Merkle 根与当前 Merkle 根匹配。它将找到两条路径中最低的公共节点——这将是枢轴节点。它将确认第一个叶子是枢轴节点左分支的最右子节点,第二个叶子是枢轴节点右分支的最左子节点。它还将确认默克尔路径长度至少相差两倍。它将根据哪条路径较长来确定是否进行左旋转或右旋转,然后从枢轴节点的适当子节点计算新的默克尔根。
嵌套命名空间备用支出模式:为了支持级联域名注册表,域名单例应该具有备用支出模式,该模式在解决方案中接受临时代币的代币 ID、域名单例启动器 ID、请求的域名、转移同级、存款退款接收地址和 小费金额(但不是操作)并发出必要的谜题公告,以方便创建请求硬币以将当前域名注册表添加为另一个注册表中的域名单例。为了避免 DOS 攻击,这种支出模式应该断言临时币的并发支出。请注意,应该无法创建必要的公告来请求从父域名注册表中删除单例。
域名证明替代支出模式:为了支持证明域名与链上的特定单例相关联,另一种替代支出模式应该允许任何人通过包含域名记录和该域名的当前默克尔路径的解决方案来使用域名单例 记录。硬币将验证域名记录哈希值是否为 Merkle 路径中的起始值、Merkle 路径是否有效以及 Merkle 路径以当前根结束。如果是这样,它将创建一个域名和关联的单例启动器 ID 的拼图公告。请注意,Chia 区块链即将推出的单例支出聚合功能将防止其成为域名注册表单例上的 DOS 向量。
需要许可的域名注册表
TailDatabase:
开放性问题:
域名注册表是否应该要求域名由特定字符集中的字符组成?如果是这样,是否会排除某些人群?
我认为我们应该禁止使用某些字符,例如“.”、“@”、“:”、“/”和“!”。可能还有其他一些,比如引号和各种大括号。也许域名注册表应该只允许字母数字?我们如何有效地检查链上的字母数字与符号?特别是在扩展字符集以更加包容全球语言方面?
案例问题可能是个问题。许多人会认为“fizpawiz”和“Fizpawiz”指的是同一个人。有没有一种方法可以有效地检查域名是否全部小写?或者上层,都无所谓。我们只需要确保没有意外或恶意创建的域名仅在大小写上与其他域名不同。对此的一个担忧:如果我没记错的话,一些本地使用非拉丁字母的语言的罗马化将大写和小写字母视为代表母语中的不同字符。因此,忽略大小写奇怪地限制了在这些罗马字母中正确表达域名的能力。我不知道如何解决这个问题。
域名注册表是否应该尝试阻止同一目标单例以多个域名出现?我不这么认为。我认为这个问题不值得解决,因为它需要第二个默克尔树来确保目标单例启动器 ID 的唯一性。
我认为没有任何方法可以防止抢注拼写错误。允许的字符集越大,情况就会变得更糟。这是一个真正令人担忧的问题,但允许任何人审查域名注册是一个滑坡。我想建议,作为一个潜在的解决方案,任何显示域名的用户界面都以单例启动器 ID 的LifeHash为前缀。
出于同样的原因,我认为没有任何方法可以监管冒犯性的域名。防止审查包括忍受你不喜欢的事情。
我认为没有任何方法可以防止域名抢注。一旦有人拥有了这个域名(例如“Microsoft”,由一些不隶属于微软的人拥有),就没有办法把它从他们手中夺走。那挺好的。有时它会非常令人不安。
是否应该有一个过期机制?我会立即说不,因为我们不想在没有通知的情况下拿走人们的东西,而且我们没有办法通知他们。瞭望塔可以提供帮助,但这提供了一个攻击媒介,瞭望塔操作员可以恶意忽略通知来劫持域名。但是,不过期的域名会使顶级域名空间容易受到许多长期被遗忘且永远无法恢复的域名的污染。实际上,这可能还不错。
想法:如果我们创建具有非常高存款要求的顶级域名空间,并立即引入一组具有较高存款要求的较低级别域名空间(例如“did”、“chapp”、“site”、“nft”等),会怎么样?降低存款要求以鼓励人们使用这些域名空间而不是顶级域名空间?
有一种攻击,恶意农民可以从执行者那里窃取小费金额。我不知道解决方法,但只有当恶意农民实际种植名为 singleton update 的区块时,才会发生这种情况。也许这不是问题:小费不太可能很高,因此此类恶意软件流行的动力很小。
最后一个悬而未决的问题:今天讨论的内容,是否应该是一个CHIP(Chia改进提案)?
作者推特