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);