0x00 前言

其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。

我这里主要对轻钱包开发中会用到的一些功能和接口进行介绍。文末有我对区块链域名系统不成熟的见解,欢迎围观批评并指正。

0x01 域名查询

如果想要竞拍一个域名,那就要先知道这个域名是不是可用的,是不是已经被别人注册走了或者正在竞拍的过程中。

查询域名需要调用NNS系统的getOwnerInfo指令,通过向NNS的域名中心发送该指令,并发送域名的哈希值,域名中心将向其根域名的注册器请求该域名的注册信息。

let data = Common.buildScript(
            scriptaddress,
            "getOwnerInfo",
            ["(hex256)" + domain.toString()]
          );

返回的信息包括域名拥有者,注册器地址,解析器地址和域名的有效期。域名如果已过期,拥有者可以进行续费或者别的用户申请重新开拍。

0x03 充值注册器

用户持有的SGAS无法直接参与域名的竞拍,需要提前将SGAS充值入域名注册器作为竞拍的燃料,之后用户每次进行竞拍,都会直接从用户的竞拍燃料中进行扣取。当然这部分燃料费用户是可以通过getmoneyback命令随时转出的。

let data = Common.buildScript(
        NNS.root.register,
        "getmoneyback",
        ["(addr)" + Wallet.account.address, "(int)" + transcount]
    )

充值的方式是首先调用SGAS的transfer方法,然后调用注册器的setsetmoneyin方法来标记转入操作。 交易构造方法如下:

sb.EmitParamJson([
        "(addr)" + Wallet.account.address,//from
        "(addr)" + addressto,//to
        "(int)" + intv//value
    ]);//参数倒序入
    sb.EmitPushString("transfer");//参数倒序入
    sb.EmitAppCall(DAPP_SGAS);//nep5脚本

    ////这个方法是为了在同一笔交易中转账并充值
    ////当然你也可以分为两笔交易
    ////插入下述两条语句,能得到txid
    sb.EmitSysCall("System.ExecutionEngine.GetScriptContainer");
    sb.EmitSysCall("Neo.Transaction.GetHash");
    //把TXID包进Array里
    sb.EmitPushNumber(Neo.BigInteger.fromString("1"));
    sb.Emit(ThinNeo.OpCode.PACK);
    sb.EmitPushString("setmoneyin");
    sb.EmitAppCall(NNS.root.register);

0x02 竞拍

对于没有被分配或者已经过期的域名,用户可以调用wantbuy指令申请进行拍卖。

拍卖将分为三个阶段:确定期,随机期,竞拍结束。

NNS域名系统之域名竞拍-LMLPHP

在确定期,用户可以通过调用addPrice命令出价竞拍,还可以进行加价以争夺域名所有权。

	 let data = Common.buildScript(
        NNS.root.register,
        "addPrice",
        [
            "(hex160)" + who.toString(),  //用户账户脚本哈希
            "(hex256)" + info.id.toString(), //竞拍id
            "(int)" + amount //加价金额
          ]
    );

为了避免出现恶意竞拍(在竞拍最后期限进行少量加价以夺取所有权),在确定期后,域名还会进入一段随机期,在随机期里,域名竞拍将不定时结束,时间越长,结束的概率越大,以此鼓励用户尽早参与对域名的竞拍。

0x03 结束竞拍

在随机期结束之后,无法再对域名进行加价。竞拍结束,参与竞拍的用户可以调用endSelling指令来结束竞拍,对于域名竞拍的拍的者,会收取所有的竞拍费用,对于其他参与者,则会返回90%的竞拍费用。所有竞拍所得又会以分红的形式全部分发给NNC的持有者。

	let script = Common.buildScript(
        NNS.root.register,
        "endSelling",
        [
            "(hex160)" + who.toString(),
            "(hex256)" + id
        ]
    );

0x04 竞拍查询

每个竞拍都会生成唯一的竞拍id,用户通过这个竞拍id就可以查询到域名竞拍的详情。查询竞拍详情调用的注册器方法是 getSellingDomain。这个命令接收两个参数,第一个是用户的地址,第二个就是竞拍的id。

	let script = Common.buildScript(
        NNS.root.register,
        "getSellingDomain",
        [
            "(hex160)" + who.toString(), //用户账户 脚本哈希
            "(hex256)" + id//竞拍id
        ]
    );

0x05 后记

在写NNS系统原理之后,我想谈谈自己对区块链的域名系统前景的一些思考。其实从大环境来看,先行者ENS走的并不是很顺利,虽然刚刚推出的时候风靡一时,但是随着时间的流失,其热度慢慢已经冷却下来,甚至走向了冰封。天价域名的新闻不再出现,甚至ENS本身也几乎不再被社区提及,纵观个各大交易所,支持ENS的更是没有几家。基于区块链的域名系统整体来说给人一种凉凉的感觉。

我们首先来看现在各种加密货币的主要使用场景,无论是之前的ICO还是现在的交易所挖矿,几乎都不是区块链本身在使能。我们希望中的区块链是承载各种数据记录并使其不可串改。希望中的公链是支撑各种项目应用落地。希望中的代币是推动应用运行的燃料。但是现实是几乎所有的项目在主流币民手里都只是投资的工具,而不是应用的工具。

我不想说哪个更好哪个更坏,每个人都拥有自己手中的加密货币的绝对支配权,想干嘛都无所谓。但是作为投资工具的话,用户的币主要还是在中心化交易所和自己的冷钱包之间进行转换,其所需要交互的地址有限,在这种情况下,区块链域名存在的重要性并不高。这也是现在域名系统很少有人用的主要原因,本来就没几个地址,多转几次帐就记个差不多了。就像上世纪七十年代的网络系统,翻来覆去就那么几个ip,构建一个全球范围内的域名系统实在没必要。

但是区块链不会永远是炒作工具,随着区块链的发展,一定会不断的出现优秀的区块链应用来丰富区块链的场景和生态(比如NEL在支持的区块链游戏开发)。而且这个过程一定是加速进行的,作为web3.0,区块链也一定会走出互联网式的发展轨迹,专业的区块链硬件与算法会不停的被设计和研发,共识的周期会越来越短,于是区块链的适用场景越来越丰富,渐渐融入到我们的生活,而不仅仅是中心化的交易所。

谁都知道google.com,可是谁能说出来google众多ip中的任何一个呢?ipv4且不行,到ipv6呢?那比ipv6更复杂的区块链账户地址呢?

所以,现在根本不是域名系统的寒冬,而是域名系统的初春。

PS:文中代码来自NEL赵奔同学的nel-wallet-vue: https://github.com/NewEconoLab/nel-wallet-vue

04-06 07:13