5.13.2 注册商

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

注册你的货币的名称

所提到的命令只能工作,因为您在本地计算机上实例化了令牌JavaScript对象。如果您向某人发送令牌,则由于他们没有相同的对象而无法将其移动,也不会知道在何处寻找合约或调用其功能。事实上,如果您重新启动控制台,这些对象将被删除,您一直在处理的合约将永远丢失。那么如何在干净的机器上实例化合约? 有两种方法,通过向您朋友提供您的合同ABI的引用,我们可以快速开始:

token = eth.contract([{constant:false,inputs:[{name:'receiver',type:'address'},{name:'amount',type:'uint256'}],name:'sendCoin',outputs:[{name:'sufficient',type:'bool'}],type:'function'},{constant:true,inputs:[{name:'',type:'address'}],name:'coinBalanceOf',outputs:[{name:'',type:'uint256'}],type:'function'},{inputs:[{name:'supply',type:'uint256'}],type:'constructor'},{anonymous:false,inputs:[{indexed:false,name:'sender',type:'address'},{indexed:false,name:'receiver',type:'address'},{indexed:false,name:'amount',type:'uint256'}],name:'CoinTransfer',type:'event'}]).at('0x4a4ce7844735c4b6fc66392b200ab6fe007cfca8')

只需替换自己的令牌地址的最后一个地址,那么使用此代码段的任何人都可以立即使用您的合同。当然这只适用于这个具体的合同,所以让我们逐步分析一下,看看如何改进这个代码,这样你就可以在任何地方使用它。

网络中的所有帐户都被其公共地址引用。但地址长,难以写下来,难以记忆和不变。如果您想要以您的名义生成新帐户,或者升级您的合同代码,则最后一个是特别重要的。为了解决这个问题,有一个默认的名称注册商合同,用于将长地址与简短的,人性化的名称相关联。

名称必须仅使用字母数字字符,并且不能包含空格。在未来的版本中,名称注册商可能会实施一个招标过程,以防止名称光占着茅坑,但现在,它是先到先得的原则:只要没有人注册该名称,您可以声明它。

首先,如果你注册一个名字,那么你最终不需要硬编码的地址。选择一个不错的硬币名称,并尝试为自己预留。首先,选择你的名字:

var tokenName = "MyFirstCoin"

接着检查下它是否可用

registrar.addr(tokenName)

如果此函数返回“0x00..”,那么你可以宣布此名称属于你了

registrar.reserve.sendTransaction(tokenName, {from: eth.accounts[0]});

等待先前的交易被确认。等待三十秒钟,然后尝试:

registrar.owner(myName)

如果它返回您的地址,则表示您拥有该名称,并且可以将您选择的名称设置为您想要的任何地址:

registrar.setAddress.sendTransaction(tokenName, token.address, true,{from: eth.accounts[0]});

如果要将其用作个人昵称,可以替换eth.accounts[0] token.address

等待一会儿,让交易被确认,然后测试下:

registrar.addr("MyFirstCoin")

你可以通过简单地输入名字而不是账户来向任何人或者任何合约发送交易:

eth.sendTransaction({from: eth.accounts[0], to: registrar.addr("MyFirstCoin"), value: web3.toWei(1, "ether")})

提示:请勿将registrar.addr同Registrar.owner搞混了。第一个是该名称指向的地址:任何人都可以将名称指向其他任何地方,就像任何人都可以转发到google.com的链接,但只有该名称的所有者可以更改和更新链接。您可以将两者设置为相同的地址。

现在应该返回您的令牌地址,这意味着以前要实例化的代码现在可以使用名称来替换地址。

token = eth.contract([{constant:false,inputs:[{name:'receiver',type:'address'},{name:'amount',type:'uint256'}],name:'sendCoin',outputs:[{name:'sufficient',type:'bool'}],type:'function'},{constant:true,inputs:[{name:'',type:'address'}],name:'coinBalanceOf',outputs:[{name:'',type:'uint256'}],type:'function'},{inputs:[{name:'supply',type:'uint256'}],type:'constructor'},{anonymous:false,inputs:[{indexed:false,name:'sender',type:'address'},{indexed:false,name:'receiver',type:'address'},{indexed:false,name:'amount',type:'uint256'}],name:'CoinTransfer',type:'event'}]).at(registrar.addr("MyFirstCoin"))

这也意味着货币的所有者可以通过将注册商指向新的合同来更新硬币。这当然要求货币持有人信任Registrar.owner(“MyFirstCoin”)设置的所有者

当然,这是一个令人不快的大块代码,只是为了允许他人与合同进行交互。有一些将合同ABI上传到网络的方法正在讨论中,以便所有用户需要的仅仅是合同名称。你可以阅读这些方法,但它们是实验性的,将来肯定会发生变化。