简介
本篇我们会学习最基本的账号相关的操作,包括了创建账号和查询,关于账号资源的操作因为必须先部署系统合约,所以我们会留到后面单独写一篇来讲解。
账号介绍
EOS的设计与以往的其他区块链有很大的不同,传统区块链上使用的账号都是直接使用公钥,而EOS使用了最多13位长的简短账号名,并以此扩展出了账号权限的功能。
账号名介绍
传统的公钥账号,可以不用在链上创建账号而直接使用,匿名性也更强,使用起来更有科技感,可惜,缺点也很明显,完全无法靠大脑来记忆,账号只是单密钥对,所以无法扩展权限,只能借助智能合约。为了解决难记忆的问题,人们又设计出了助记词,可惜12个单词的组合,也不够人性。
EOS的账号设计很人性化,最长13位,可以使用24个小写字母和1-5的数字,特殊账号还可使用.
字符,你完全可以创建一个有特定意义的账号名。系统设计还增加了一个短号的竞拍市场,而短号又能创建出短号后缀的特殊靓号。这一系列设计都让账号的可玩性和收藏性增加了,同时更便于记忆。
账号的安全性同样是用了ECC的非对称加密产生的密钥对,默认有owner和active两个内置权限,owner是最高权限,active默认操作权限,在创建时可以配置不同的公钥,也就提升了账号的安全性,我们只让active的私钥触网,即使被盗,我们还可以使用owner权限将active的公钥替换了。传统的区块链账号,一旦私钥被盗,就意味着这个账号已经无法再正常使用了。
但是EOS的账号设计也有比较明显的问题,账号必须通过EOS链来创建,而你要上链,又必须有EOS账号,所以,新用户无法独自完成账号的创建。
资源介绍
EOS账号增加了CPU、NET和RAM的设定,这本身更符合EOS(Enterprise Operation System,企业级操作系统)的设定,这些资源的设定本身都是为了使系统可以维持健康,就像以太坊上有Gas费用,来防止链上的恶意交易并增加交易确认的及时性。EOS中的资源同样增加了恶意交易的代价,保证了全网良性的生态,同时赋予了EOS通证的概念,让持有EOS的人可以获得更大的权益和便利。
内存必须通过市场进行买卖,采用班科(Bancor)算法来保证内存价格符合市场需求。而CPU和Net则是通过EOS抵押,让全网资源的使用代价降低了,而抵押获得的CPU量随全网抵押而波动,符合全网运算能力的要求,3天的赎回期给予全网一定的缓冲期。CPU和Net是可再生资源,在一个窗口期内用完了没事,随着时间推移会慢慢恢复的。
这些设定都是很前卫的,但是仍然存在着无法预期的情况,EOS主网这两年出现过2次重大的CPU资源短缺问题,特别是2019年10月的这次,持续长达5个月的CPU短缺,只因一个交易挖矿的合约,面对这样突然的情况,EOS的主创b1采用了让市场自动调控。加之EOS价值的升高,都使得EOS主网的使用代价越来越高。
补充说明genesis.json
这里要补充一下前面启动节点没提到的一个文件genesis.json文件,这个是创世配置文件,里面的配置都是关于链的基本配置,chainid也是根据此文件生成的,所以这个文件不同,产生出来的就是不同的运行链。EOS程序默认有一套配置,所以你在启动节点时没有指定--genesis-json
同样可以启动成功。下面这个配置就是EOS主链的配置。
{
"initial_timestamp": "2018-06-08T08:08:08.888",
"initial_key": "EOS7EarnUhcyYqmdnPon8rm7mBCTnBoot6o7fE2WzjvEX2TdggbL3",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 200000,
"target_block_cpu_usage_pct": 1000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
}
}
注意到里面有个initial_key了吧,这个就是初始账号eosio的公钥,我们在启动节点时使用的配置文件中有个配置signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
这个就是默认的eosio的owner密钥对,开发环境我们都是使用这个密钥。
我们将启动节点中配置的这个eosio的私钥导入钱包,准备后续我们创建账号使用。
创建账号
EOS创建账号一定需要使用一个已存在的账号来创建,所以,你无论在哪个网络上创建账号,只能让有账号的人帮你创建或者支付一定的费用来帮你创建。EOS主网上目前提供了很多创建账号的渠道,也有很多三方提供了支付创建账号甚至免费创建账号的功能。
如果大家还没有EOS主网的账号,我建议你通过几个主流钱包来获得一个廉价且独特的个人账号,比如TokenPocket。当然,你也可以购买一个特别后缀的短号,当你有账号后,还可以进入EOS的账号市场中进行竞拍来获得靓号。
注意:因为EOS创建账号需要使用已有账号来创建,所以该操作是需要交易签名的,在调用命令前,需要解锁导入了用于创建账号的账号私钥的钱包。
创建系统级账号
在初始启动节点后,我们就可以使用内置的默认账号eosio来创建其他新的账号了,前面在补充说明genesis.json已经导入了eosio的私钥到钱包中。
我们现在可以使用cleos create account
命令来创建系统账号了,系统账号有一个很特别的特点,就是账号资源都是无限的,没有内存限制,CPU和Net都是-1(表示无限)。在开发阶段,这种账号其实非常好用,开发合约的过程中,会大量使用到内存等资源,所以创建系统账号可以很好的用于合约测试。
我们现在创建一个账号astaldo。
cleos create account eosio astaldo EOS6nbWS7ZReiPMdMABoEmVBYanyTMb3GYRQGsTRMCYx9vijWoaS3 EOS6nbWS7ZReiPMdMABoEmVBYanyTMb3GYRQGsTRMCYx9vijWoaS3
其中eosio是用于创建新账号时使用的账号,目前创建的是系统级账号,所以只能使用eosio账号来创建,后面的两个公钥分别是新账号的owner和active的公钥。
创建普通账号
创建普通账号需要先部署系统合约,也就是eosio.system合约,但是这需要很多的配置,并创建好所有系统账号……这块功能可以单独写一篇文章了,所以我会在后面单独写一篇《EOS部署系统合约的完全启动》。
这里我简单提一下如何通过cleos来创建普通账号。需要用到cleos system newaccount
命令,因为部署了系统合约,创建账号的功能会覆盖了程序默认账号创建入口,所以创建系统级账号的方法也就不能直接用了,要更换成这个新命令了。命令有很多参数,我先说明下核心参数,其他的大家可以使用--help
查看帮助。
#基础结构
cleos system newaccount [OPTIONS] creator name OwnerKey [ActiveKey]
creator 指定用于创建账号的EOS账号,也就是用于支付资源开销的账号
name 新账号的账号名
OwnerKey 指定新账号的Owner权限的公钥
ActiveKey 可选,默认和Owner的公钥一致,为了提升安全性,建议设置不同的公钥
OPTIONS 参数有很多,这里重点关注以下几个:—stake-net 创建时为新账号质押的NET
—stake-cpu 创建时为新账号质押的CPU
—buy-ram-kbytes 创建时为新账号购买的内存
—transfer 创建时抵押的资源是否转移给新账号,默认是为他人抵押,可被原账号收回
如果我要使用eosastaldo11创建一个eosastaldo12,可以使用以下命令,这里我使用了jungle网络的节点地址。
cleos -u "http://jungle2.cryptolions.io" system newaccount --stake-net '1 EOS' --stake-cpu '10 EOS' --buy-ram-kbytes 1000 eosastaldo11 eosastaldo22 EOS8h8YD7956jYf99BV6kBit5d9461xaxyTf9HPxmARcnTEnFivY8 EOS7DhW1StAhprCBwpAfgMpmHuN2H3V8t4B45tzQtEYckHRr5CASN
我们为eosastaldo12初始抵押了10EOS的CPU和1EOS的NET,购买了1MB的内存,使用了两个不同的公钥为别作为owner和active。可以看到,创建账号时发生了很多的内联交易,包括了内存的购买、CPU和Net的抵押。
查询账号
账号的基本信息是存在于链上系统表里的,而其他的账号信息,比如EOS余额都是在相应的合约表里的,所以查询的方式都是不同的。
查询账号基本信息
账号的基本信息包含了账号的创建时间、权限分配、资源使用和抵押情况。可以直接通过cleos get account
命令来查看。
我们现在来查询下eosio这个系统账号,cleos get account eosio
。
可以看到在系统级账号的memory是无限的(unlimited),Net和CPU也都是无限的。privileged为true说明了这个是个特权账号。
我们再来查询下EOS主网上的一个账号b1,这个就是大名鼎鼎的EOS创始人的账号。
cleos -u http://eospush.tokenpocket.pro get account b1
可以看到b1的内存太大了有将近32G呢,还有那Net和CPU的抵押,staked
表示抵押的EOS,delegated
他人为其抵押的EOS,used
表示已使用的资源数,available
是目前还可用的资源数,limit
是当前资源的上限。可以说b1的资源都近似于无限了。另外b1的权限下有多个key,这个我们会在权限管理的文章里面详细说明。
查询余额
查询账号余额是需要通过查询合约。EOS上为了更方便的发行Token,所以从EOS的发行就采用了合约的形式,这为所有的Token发行提供了一个官方模板,符合标准Token合约结构的都可以使用cleos的查询余额的命令。
- 标准查询命令
我们首先学习使用标准Token的余额查询命令cleos get currenty balance
,需要指定Token的合约名,账号名和Token的符号。
我们来查询下EOS的主网中b1的EOS余额吧。
cleos -u http://eospush.tokenpocket.pro get currency balance eosio.token b1 EOS
EOS的合约使用的是eosio.token,使用的Token符号就是EOS。我们从图上可以看到,b1的余额有650万还多的EOS,真的是有钱啊。
- 合约查询
合约查询是要以我们了解合约的表结构为前提,我们需要知道合约账号,需要知道表名和scope,还要知道Token的符号,如果不是标准的Token合约的话,我们就需要了解合约代码了,这个我们在后面合约学习的时候再细讲。我们使用合约表查询命令cleos get table
。
我们已知EOS的合约账号是eosio.token,余额存在于accounts表,scope就是账号名。
我们还是来查询EOS主网的b1的EOS余额。
cleos -u http://eospush.tokenpocket.pro get table eosio.token b1 accounts
可以看到返回的默认是json格式的表数据,rows就是数据行,一般只会有一条数据,而且只有一个字段,就是balance。