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指令申请进行拍卖。
拍卖将分为三个阶段:确定期,随机期,竞拍结束。
在确定期,用户可以通过调用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