5.11 注册服务

优质
小牛编辑
119浏览
2023-12-01

注册服务

Frontier带有一些非常基本的基础层服务,也包括了大部分的注册商(registrar)。注册商由3个部分组成。

  • GlobalRegistrar将名称(字符串)关联到帐户(地址)。
  • HashReg将散列关联到哈希(将任何对象映射到“内容”哈希)。
  • UrlHint将内容哈希值关联到提示内容的位置。只有在内容存储不是内容寻址的情况下才需要,否则内容哈希已经是内容地址。如果使用它,则从URL获取的内容应该哈希到内容哈希。为了检查内容的真实性,可以检查是否验证。

创建和部署GlobalRegistrar,HashReg和UrlHint

如果注册商的合约在blockchain中不是硬编码的(在撰写本文时不是),则注册商需要在每条链上至少部署一次。 如果你在主链上,主要全球注册商的地址在最新的客户端上是硬编码的,因此你不需要做任何事情。如果你想改变这个或者你是在一个私人链条上,你需要至少部署这些合同一次:

primary = eth.accounts[0];

globalRegistrarAddr = admin.setGlobalRegistrar("", primary);
hashRegAddr = admin.setHashReg("", primary);
urlHintAddr = admin.setUrlHint("", primary);

你需要挖矿或等到txs被确认。在新地址上初始化注册商,并检查其他注册商名称是否使用了正确的地址:

registrar = GlobalRegistrar.at(globalRegistrarAddr);
primary == registrar.owner("HashReg");
primary == registrar.owner("UrlHint");
hashRegAddr == registrar.addr("HashReg");
urlHintAddr registrar.addr("UrlHint");

以下代码返回正确的编码:

eth.getCode(registrar.address);
eth.getCode(registrar.addr("HashReg"));
eth.getCode(registrar.addr("UrlHint"));

从第二次起,在同一个链路以及其他节点上,您只需使用GlobalRegistrars地址进行初始化,其余的则通过它进行处理。

primary = eth.accounts[0];
globalRegistrarAddr = "0x225178b4829bbe7c9f8a6d2e3d9d87b66ed57d4f"

// set the global registrar address
admin.setGlobalRegistrar(globalRegistrarAddr)
// set HashReg address via globalRegistrar
hashRegAddr = admin.setHashReg()
// set UrlHint address via globalRegistrar
urlHintAddr = admin.setUrlHint()

// (re)sets the registrar variable to a GlobalRegistrar contract instance
registrar = GlobalRegistrar.at(globalRegistrarAddr);

如果这是成功的,如果注册商返回地址,您应该可以使用以下命令进行检查:

registrar.owner("HashReg");
registrar.owner("UrlHint");
registrar.addr("HashReg");
registrar.addr("UrlHint");

下面代码会返回正确编码:

eth.getCode(registrar.address);
eth.getCode(registrar.addr("HashReg"));
eth.getCode(registrar.addr("UrlHint"));

使用注册商服务

可以在合约和dapps之间提供有用的接口。

全球注册商

要保留名称,请注册一个帐号,您需要以下内容:

registrar.reserve.sendTransaction(name, {from:primary})
registrar.setAddress.sendTransaction (name, address, true, {from: primary})

你需要等待交易被确认(当在私链上,你可以强制执行),你可以查询注册商用来检查:

registrar.owner(name)
registrar.addr(name)

HashReg和UrlHint

HashReg和UrlHint可以与以下abis一起使用:

hashRegAbi = '[{"constant":false,"inputs":[],"name":"setowner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_key","type":"uint256"},{"name":"_content","type":"uint256"}],"name":"register","outputs":[],"type":"function"}]'
urlHintAbi = '[{"constant":false,"inputs":[{"name":"_hash","type":"uint256"},{"name":"idx","type":"uint8"},{"name":"_url","type":"uint256"}],"name":"register","outputs":[],"type":"function"}]'

设置合同实例:

hashReg = eth.contract(hashRegAbi).at(registrar.addr("HashReg")));
urlHint = eth.contract(UrlHintAbi).at(registrar.addr("UrlHint")));

将内容哈希与密钥哈希相关联:

hashReg.register.sendTransaction(keyhash, contenthash, {from:primary})

将网址与内容哈希相关联:

urlHint.register.sendTransaction(contenthash, url, {from:primary})

检查决议:

contenthash = hashReg._hash(keyhash);
url = urlHint._url(contenthash);