美文网首页blockstackblockstack-Trans
naming-How to use BNS-BNS Subdom

naming-How to use BNS-BNS Subdom

作者: 空乱木 | 来源:发表于2019-08-06 13:30 被阅读0次

    FROM :https://docs.blockstack.org/core/naming/subdomains.html

    本节解释BNS子域名,并提供使用它们的方法的说明。包括以下主题:

    子域名的概述
    --- 子域名的生命周期
    --- 解析子域名
    ------ 查找子域名的公钥和区域文件(引用)
    ------ 查询子域名的事务历史记录(引用)
    ------ 查找给定公钥散列所拥有的名称和子域名列表(引用)
    --- 子域名的创建和管理
    --- 子域名注册

    子域名的概述

    BNS名称是强拥有的,因为其私钥的所有者可以生成更新其区域文件散列和所有者的有效事务。然而,这是以要求名称所有者为区块链中的基础事务付费为代价的。此外,这种方法将BNS名称注册和操作的速率限制为底层区块链的事务带宽。

    BNS通过子域名克服了这一点。BNS子域名是BNS名称的一种类型,其状态和所有者存储在区块链之外,但是其存在和操作历史被锚定到区块链。在解析BNS Names部分的示例表中,名称cicero.res_publica.id和podsaveamerica.verified.podcast是子域名。

    与链上对应的域名一样,子域名具有全局惟一性、强所有权和可读性。BNS提供它们自己的名称、状态和公钥。

    与链上名称不同,子域名可以创建和管理得很便宜,因为它们是批量广播到BNS网络的。一个区块链事务最多可以发送120个子域名操作。

    这是通过在Atlas网络中存储子域名记录来实现的。链上名称所有者通过将子域名操作编码为DNS区域文件中的TXT记录来广播子域名操作。要传播区域文件,名称所有者使用NAME_UPDATE事务设置新的区域文件散列,并通过Atlas复制区域文件。然后,这将复制它包含的所有子域名操作,并将子域操名作集锚定到链上事务。BNS节点的一致规则确保只存储来自有效NAME_UPDATE事务的有效子域名操作。

    例如,名称verified.podcast曾经编写过区域文件散列247121450ca0e9af45e85a82e61cd525cd7ba023,它是以下区域文件的散列:

    curl -sL https://core.blockstack.org/v1/names/verified.podcast/zonefile/247121450ca0e9af45e85a82e61cd525cd7ba023 | jq -r '.zonefile'
    ORIGIN verified.podcastTTL 3600
    1yeardaily TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAxeWVhcmRhaWx5CiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMXllYXJkYWlseS9oZWFkLmpzb24iCg=="
    2dopequeens TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAyZG9wZXF1ZWVucwokVFRMIDM2MDAKX2h0dHAuX3RjcCBVUkkgMTAgMSAiaHR0cHM6Ly9waC5kb3Rwb2RjYXN0LmNvLzJkb3BlcXVlZW5zL2hlYWQuanNvbiIK"
    10happier TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAxMGhhcHBpZXIKJFRUTCAzNjAwCl9odHRwLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vcGguZG90cG9kY2FzdC5jby8xMGhhcHBpZXIvaGVhZC5qc29uIgo="
    31thoughts TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzMXRob3VnaHRzCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMzF0aG91Z2h0cy9oZWFkLmpzb24iCg=="
    359 TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzNTkKJFRUTCAzNjAwCl9odHRwLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vcGguZG90cG9kY2FzdC5jby8zNTkvaGVhZC5qc29uIgo="
    30for30 TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzMGZvcjMwCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMzBmb3IzMC9oZWFkLmpzb24iCg=="
    onea TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiBvbmVhCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vb25lYS9oZWFkLmpzb24iCg=="
    10minuteteacher TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAxMG1pbnV0ZXRlYWNoZXIKJFRUTCAzNjAwCl9odHRwLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vcGguZG90cG9kY2FzdC5jby8xMG1pbnV0ZXRlYWNoZXIvaGVhZC5qc29uIgo="
    36questionsthepodcastmusical TXT "owner=1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH" "seqn=0" "parts=1" "zf0=JE9SSUdJTiAzNnF1ZXN0aW9uc3RoZXBvZGNhc3RtdXNpY2FsCiRUVEwgMzYwMApfaHR0cC5fdGNwIFVSSSAxMCAxICJodHRwczovL3BoLmRvdHBvZGNhc3QuY28vMzZxdWVzdGlvbnN0aGVwb2RjYXN0bXVzaWNhbC9oZWFkLmpzb24iCg=="
    _http._tcp URI 10 1 "https://dotpodcast.co/"

    此区域文件中的每个TXT记录都对子域名创建进行编码。例如,1yeardaily.verified.podcast解析为:

    curl https://core.blockstack.org/v1/names/1yeardaily.verified.podcast
    {
    "address": "1MwPD6dH4fE3gQ9mCov81L1DEQWT7E85qH",
    "blockchain": "bitcoin",
    "last_txid":
    "d87a22ebab3455b7399bfef8a41791935f94bc97aee55967edd5a87f22cce339",
    "status": "registered_subdomain",
    "zonefile_hash": "e7acc97fd42c48ed94fd4d41f674eddbee5557e3",
    "zonefile_txt": " ORIGIN 1yeardaily\n$TTL 3600\n_http._tcp URI 10 1 "https://ph.dotpodcast.co/1yeardaily/head.json"\n"
    }

    此信息是从用于验证podcast的区域文件中的一年每日TXT资源记录中提取的。

    子域名的生命周期

    请注意,1yeardaily.verified.podcast与verified.podcast具有不同的公钥散列(地址)。BNS节点只会在1yeardaily.verified.podcast处理后续的子域名操作。如果包含这个地址私钥的签名。verified.podcast不能生成更新;只有1yeardaily.verified.podcast可以做到这一点。

    子域名及其操作的生命周期如图2所示。


    Screen Shot 2019-08-06 at 12.32.24 PM.png

    图2:与链上名称操作相关的子域名生存期。一个新的
    子域名操作只有在后面有一个“sequence=”号时才会被接受,
    以及事务主体上的“sig=”中的有效签名。“sig="字段
    包括公钥和签名,并且公钥必须散列到
    前一个子域操作的“addr=”字段。

    子域名创建和子域名传输事务
    “cicero.res_publica.id"由"res_public .id"的所有者广播。
    然而,任何链上的名字(在本例中 例如 :“jude.id”)。可以广播子域
    名“cicero.res_publica.id”的更新。

    子域名操作按序号排序,从0开始。每个新的子域名操作必须包括:

    • 下一个序列号
    • 散列到前一个子域事务地址的公钥
    • 来自整个子域名操作上对应私钥的签名。

    如果发现两个正确签名但冲突的子域名操作(即它们具有相同的序列号),则接受区块链历史中较早发生的操作。无效的子域名操作将被忽略。

    结合起来,这将确保BNS节点与具有给定子域名操作的所有区域文件一起能够确定它所经历的状态转换的有效序列,并确定子域名的当前区域文件和公钥散列。

    解析子域名

    开发人员与子域名的交互方式与与名称的交互方式相同。使用BNS API,开发人员可以:
    查找子域的公钥和区域文件(引用)
    curl https://core.blockstack.org/v1/names/aaron.personal.id
    {
    "address": "1PwztPFd1s2STMv4Ntq6UPBdYgHSBr5pdF",
    "blockchain": "bitcoin",
    "last_txid": "85e8273b0a38d3e9f0af7b4b72faf0907de9f4616afc101caac13e7bbc832394",
    "status": "registered_subdomain",
    "zonefile_hash": "a6dda6b74ffecf85f4a162627d8df59577243813",
    "zonefile_txt": " ORIGIN aaron.personal.id\n$TTL 3600\n_https._tcp URI 10 1 "https://gaia.blockstack.org/hub/1PwztPFd1s2STMv4Ntq6UPBdYgHSBr5pdF/profile.json"\n"
    }

    查询子域的事务历史记录(引用)

    curl https://core.blockstack.org/v1/names/aaron.personal.id/history
    {
    "509981": [
    {
    "address": "1PwztPFd1s2STMv4Ntq6UPBdYgHSBr5pdF",
    "block_number": 509981,
    "domain": "personal.id",
    "name": "aaron.personal.id",
    "sequence": 0,
    "txid": "85e8273b0a38d3e9f0af7b4b72faf0907de9f4616afc101caac13e7bbc832394",
    "value_hash": "a6dda6b74ffecf85f4a162627d8df59577243813",
    "zonefile": "JE9SSUdJTiBhYXJvbi5wZXJzb25hbC5pZAokVFRMIDM2MDAKX2h0dHBzLl90Y3AgVVJJIDEwIDEgImh0dHBzOi8vZ2FpYS5ibG9ja3N0YWNrLm9yZy9odWIvMVB3enRQRmQxczJTVE12NE50cTZVUEJkWWdIU0JyNXBkRi9wcm9maWxlLmpzb24iCg=="
    }
    ]
    }

    查找给定公钥散列所拥有的名称和子域列表(引用)

    $ curl https://core.blockstack.org/v1/addresses/bitcoin/1PwztPFd1s2STMv4Ntq6UPBdYgHSBr5pdF
    {
    "names": [
    "aaron.personal.id"
    ]
    }

    子域名的创建和管理

    与链上名称不同,子域名所有者需要链上名称所有者的帮助来传播子域操作。特别是:

    • 子域名创建事务只能由共享其后缀的链上名称的所有者处理。例如,只有rres_publica.id的所有者可以广播以.res_publica.id结尾的子域名的子域名创建事务。

    • 子域名传输事务只能由创建它的链上名称的所有者广播。例如,cicero.res_publica.id的所有者需要res_publica.id的所有者。广播子域名传输事务以更改cicero.res_publica.id的公钥。

    • 为了发送子域名创建或子域名传输,必须在Atlas网络中显示链上名称所有者的所有区域文件。这允许BNS节点在处理新区域文件时证明不存在任何冲突的子域名创建和子域名传输操作。

    • 任何链上的名称所有者都可以广播子域名更新事务,但是子域名所有者需要找到一个愿意合作的人。例如,verified.podcast的所有者可以广播cicero.res_publica.id所有者创建的子域名更新事务。

    也就是说,要创建子域名,子域名所有者为其所需的名称生成子域名创建操作,并将其提供给链上的名称所有者。链上名称所有者然后使用Atlas将其广播到所有其他BNS节点。

    创建后,子域名所有者可以使用任何链上的名称所有者来广播子域名更新操作。为此,它们生成并签署必要的子域名操作,并将其交给链上的名称所有者,后者将其与其他子域名操作打包到DNS区域文件中,并将所有操作发送到Atlas网络上。

    如果子域名所有者希望更改子域名的地址,则需要签署子域名转移操作,并将其交给创建子域名的链上名称所有者。然后,他们将其打包到一个区域文件中并进行广播。

    子域名注册

    由于子域名很便宜,开发人员可能倾向于代表他们的应用程序运行子域名注册器。例如,personal.id用于注册Blockstack应用程序用户,而不需要他们花费任何比特币。

    我们提供了BNS子域名注册器的参考实现,以帮助开发人员广播子域名操作。用户仍然拥有他们的子域名;注册器只是为开发人员提供了一种方便的方法,让他们可以在特定的应用程序上下文中注册和管理这些应用程序。有关如何使用子域名注册器的详细信息,请参阅有关运行子域名注册器的教程

    相关文章

      网友评论

        本文标题:naming-How to use BNS-BNS Subdom

        本文链接:https://www.haomeiwen.com/subject/igkidctx.html