EOS · 2018年8月28日 0

EOS账户和钱包

简介

本文主要讲解在命令行下操作钱包和帐户管理,以及EOSIO组件如何相互交。

包括了如何创建和管理钱包及其密钥,然后使用cleos组件通过区块链进行交互。然后,将学习如何使用cleos创建帐户。后续将介绍一些cleos,keosd以及nodeos之间的相互作用及签署发布到blockchain等内容。

在这之前需要搭建好nodeos基本环境,构建并运行cleos和keosd的副本。对命令行界面的基本了解。

本文内容从官方:账户和钱包教程翻译修改所得。

EOSIO账户和钱包概念概述

钱包可以被认为是公钥-私钥对的加密存储库。这些是签名操作所必需的。钱包及其内容由keosd管理。钱包可以访问cleos。

帐户是存储在区块链中并由可读名称。它可以由个人或多个人授权拥有,具体取决于权限配置。区块链上任何有效交易或推送消息都依赖与一个帐户。

帐户和钱包之间没有固有的关系。帐户不知道钱包,反之亦然(从关系图中可以看到)。相应地,nodeos和keosd之间没有固有的关系。它们的基本功能完全不同。

账户和钱包产生交集的地方是需要签名时,例如签名一个交易。钱包会在本地用加密的方式存储密钥。cleos在keosd和nodeos之间充当一个中介服务,当需要使用钱包中的密钥生成签名时它便会做检索操作。

创建和管理钱包

cleos会自动启动keosd,最终可能会有多个keosd正在运行的实例。

创建钱包

在cleos下使用wallet create命令创建一个默认的钱包:

$ cd /data/eos/build/programs/cleos
$ cleos wallet create --to-console

Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JWhCh94HffNNJKdb523QD8dz52LAN4LNHX8begZicCCprGXiHT"

现在里面有一个名为default的钱包,并返回了这个钱包的密码。

默认情况下,keosd模块将钱包存储在~/eosio-wallet文件夹中,并生成对应的default.wallet。可以使用--wallet-dir参数在命令行上指定钱包数据文件夹的位置。

cleos能够管理多个钱包。每个钱包都受不同钱包密码的保护。使用-n创建一个自定义名称的钱包:

$ cleos wallet create -n nm1024 --to-console

Creating wallet: nm1024
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5KC4AVeEspMmMQYYr3JNcejsWuBX5pnsSJtsQayGF9BkaeJLhRL"

钱包列表

查看现有钱包列表:

$ cleos wallet list

Wallets:
[
  "default",
  "nm1024 *"
]

这里注意看default账号后边没有*,nm1024后有。
这个*意味着相应的钱包已解锁。

钱包的锁定与解锁

锁定指定钱包:

$ cleos wallet lock -n nm1024
Locked: nm1024

$ cleos wallet list
Wallets:
[
  "default",
  "nm1024"
]

解锁一个已命名的钱包需要使用之前生成的密码:

$ cleos wallet unlock -n nm1024 --password PW5KC4AVeEspMmMQYYr3JNcejsWuBX5pnsSJtsQayGF9BkaeJLhRL
Unlocked: nm1024

$ cleos wallet list
Wallets:
[
  "default",
  "nm1024 *"
]

注意:使用wallet命令与'default'钱包交互不需要-n参数

当我们将keosd停止后:

$ pgrep keosd
2158
$ pkill keosd
$ cleos wallet list
Wallets:
[]

打开钱包

可以看到钱包列表了没有之前的两个钱包了。
钱包需要在操作之前打开,包括列出它们。当你关闭keosd时,钱包被锁定了。当keosd重新启动,钱包未打开。运行以下命令打开,然后列出默认钱包。(-n可以指定钱包)

$ cleos wallet open
Opened: default
$ cleos wallet list
Wallets:
[
  "default"
]

$ cleos wallet open -n nm1024
Opened: nm1024
$ cleos wallet list
Wallets:
[
  "default",
  "nm1024"
]

open后的钱包是锁定状态,需要执行之前的unlock解锁。

生成和导入EOSIO密钥

注意:确保使用由cleos命令生成的实际私钥,而不是本教程中生成使用的值!

生成EOSIO密钥

有多种方法可以生成EOSIO密钥对,这里重点介绍该create key命令。
生成两个公钥/私钥对。请注意键的一般格式。

$ cleos create key --to-console
Private key: 5J9RKG4wskhXHt2mf4wwLxV2wC516iES6NMfbk3aph81DHjLhVz
Public key: EOS6hExEUcAJxUao76KDo8JHE6weQhd1jeoBdss48xi43vkq9uBjL

$ cleos create key --to-console
Private key: 5JiaCuvB5qEYARCnw9arZSBFjLxs7vJRKDFh4nw9imnd6Fp1QgH
Public key: EOS56eDHRpSPMHZfjUBxWeoVXCHMWmAQ3YaQLaZNeSmRyFLw45Eem

注意此处生成的公钥前均是EOS开头;使用--file filename参数而不是--to-console,可以将密钥写入本地文件。
这里生成的密钥对,仅仅是一对密钥不具备任何权限。

密钥导入至钱包

现在将私钥导入nnm1024钱包。对于之前生成的两个私钥分别执行一次。(这里需要解锁对应的钱包)

$ cleos wallet import -n nm1024 --private-key 5J9RKG4wskhXHt2mf4wwLxV2wC516iES6NMfbk3aph81DHjLhVz
imported private key for: EOS6hExEUcAJxUao76KDo8JHE6weQhd1jeoBdss48xi43vkq9uBjL

$ cleos wallet import -n nm1024 --private-key 5JiaCuvB5qEYARCnw9arZSBFjLxs7vJRKDFh4nw9imnd6Fp1QgH
imported private key for: EOS56eDHRpSPMHZfjUBxWeoVXCHMWmAQ3YaQLaZNeSmRyFLw45Eem

如果导入成功会在下边提示当前私钥对应的公钥。

通过调用wallet keys查看所有的公钥(不限钱包);wallet private_keys来查看指定的账户加载了哪些密钥,可以看到公钥与私钥(需要钱包密码)。

$ cleos wallet keys
[
  "EOS56eDHRpSPMHZfjUBxWeoVXCHMWmAQ3YaQLaZNeSmRyFLw45Eem",
  "EOS6hExEUcAJxUao76KDo8JHE6weQhd1jeoBdss48xi43vkq9uBjL"
]

$ cleos wallet private_keys -n nm1024 --password PW5KC4AVeEspMmMQYYr3JNcejsWuBX5pnsSJtsQayGF9BkaeJLhRL
[[
    "EOS56eDHRpSPMHZfjUBxWeoVXCHMWmAQ3YaQLaZNeSmRyFLw45Eem",
    "5JiaCuvB5qEYARCnw9arZSBFjLxs7vJRKDFh4nw9imnd6Fp1QgH"
  ],[
    "EOS6hExEUcAJxUao76KDo8JHE6weQhd1jeoBdss48xi43vkq9uBjL",
    "5J9RKG4wskhXHt2mf4wwLxV2wC516iES6NMfbk3aph81DHjLhVz"
  ]
]

钱包文件本身是加密的,因此钱包将在锁定时保护这些键。访问锁定钱包中的密钥需要在创建钱包期间提供给钱包密码。

如果--data-dir在启动eos时未指定参数,则钱包文件将存储在该~/eosio-wallet文件夹中。要养成备份钱包的习惯,防止丢失钱包文件。
在此~/eosio-wallet文件夹中除了钱包文件外,还有keosd配置文件config.ini。

创建一个帐户

eos里边账户和密钥对之间并没有严格的对应关系,比如A账户完全可以和B账户使用相同的的密钥对。

对区块链执行操作需要使用帐户。我们用cleos来请求nodeos创建帐户并在区块链上发布。在这之前需要使用上一篇文章中的命令启动单个节点testnet。有关设置本地环境的更多信息,请参阅EOS单节点启动与配置说明

在这一部分我们需要keosd和nodeos同时运行。目前,keosd和nodeos默认的端口相同(8888端口)。为了简化教程本部分的运行nodeos,我们将keosd端口更改为8899。 我们可以通过两种方式执行此操作(通过cleos连带启动的keosd默认端口为8900):

启动节点

  • 编辑keosd配置文件

之前有提到keosd配置文件是~/eosio-wallet/config.ini,打开并将http-server-address属性更改为:http-server-address = 127.0.0.1:8899

  • 使用命令行参数

在执命令后加参数-http-server-address = 127.0.0.1:8899来启动keosd。

$ pkill keosd
$ keosd --http-server-address=127.0.0.1:8899

启动nodeos组件:

# 在之前我们已经在config.ini中配置好了相关的参数(上篇文章)
$ nodeos

解锁钱包并导入密钥

在这之后我们需要起一个新的终端窗口(保持nodeos的运行,可以使用&),解锁要使用的钱包(当keosd重新启动时它会被锁定)。由于keosd开始侦听端口8899,因此您需要添加--wallet-url命令行参数(如果在配置中修改的则不需要)。

$ cleos --wallet-url=http://127.0.0.1:8899 wallet open -n nm1024
Opened: nm1024

# 这一步需要输入nm1024对应的密码
$ cleos --wallet-url=http://127.0.0.1:8899 wallet unlock -n nm1024
password: Unlocked: nm1024

在本教程中,eosio是授权帐户(参考上篇文章的config.ini介绍)。必须使用与eosio帐户关联的密钥对区块链上执行的操作进行签名。该eosio帐户是用于引导EOSIO节点的特殊帐户。此帐户的密钥可以在nodeos配置文件/root/.local/share/eosio/nodeos/config/config.ini中找到:

# Key=Value pairs in the form <public-key>=<provider-spec>
# Where:
#    <public-key>       is a string form of a vaild EOSIO public key
# 
#    <provider-spec>    is a string in the form <provider-type>:<data>
# 
#    <provider-type>    is KEY, or KEOSD
# 
#    KEY:<data>         is a string form of a valid EOSIO private key which maps to the provided public key
# 
#    KEOSD:<data>       is the URL where keosd is available and the approptiate wallet(s) are unlocked (eosio::producer_plugin)
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

signature-provider就对应了公私钥。

不仅仅是在文件里配置,必须使用命令将此私钥加入wallet中

$ cleos --wallet-url=http://127.0.0.1:8899  wallet import -n nm1024 --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

创建账号

之后就可以开始创建帐户了。先看一下cleos create account命令的结构。

  • authorizing_account(对应下面命令中的eosio) 是为帐户创建提供资金的帐户名称,随后可以换新帐户。
  • new_account 要创建的帐户的名称
  • owner_key 是分配给帐户完全控制权的公钥。(is a public key to be assigned to the owner authority of the account)
  • active_key 是分配给帐户资金的完全访问权限的公钥。( is a public key to be assigned to the active authority of your account, and the second one will be permissioned for the active authority of your account.)
$ cleos create account eosio NEW_ACCOUNT OWNER_KEY ACTIVE_KEY

帐户名称必须符合以下规则:

  • 必须少于13个字符
  • 只能包含以下符号:.12345abcdefghijklmnopqrstuvwxyz

这里创建一个nmaccount账号,并使用在上面的小节生成并导入到钱包中的公钥。在将公钥分配使用之前,它是没有意义的。
拥有owner_key密钥等同于完全控制对应的帐户,而active_key密钥等同于帐户中资金的完全访问权限。

# 示例
$ cleos --wallet-url=http://127.0.0.1:8899 create account eosio nmaccount PUBLIC_KEY_1 PUBLIC_KEY_2

# 实际执行
$ cleos --wallet-url=http://127.0.0.1:8899 create account eosio nmaccount EOS6hExEUcAJxUao76KDo8JHE6weQhd1jeoBdss48xi43vkq9uBjL EOS56eDHRpSPMHZfjUBxWeoVXCHMWmAQ3YaQLaZNeSmRyFLw45Eem

# 将会得到如下的结果
executed transaction: f64421bba15b5b8a27c7736e698cbf4076869db855bdd53a40be595e85f3a346  200 bytes  516 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"nmaccount","owner":{"threshold":1,"keys":[{"key":"EOS6hExEUcAJxUao76KDo8J...
warning: transaction executed locally, but may not be confirmed by the network yet    ] 

出来一个警告,交易在本地执行,可能尚未由网络确认。暂时忽略。

eos系统中创建账号还有一种方式,就是使用eosio.system合约中的newaccount方法;当部署了eosio.system合约,刚才讲解的这种方法便不能创建账号,会提示:

Error 3080001: Account using more than allotted RAM usage
Error Details:
account eosio.ramfee has insufficient ram; needs 2996 bytes has 0 bytes

就需要使用下边的方法将创建账号、购买RAM\CPU\NET放在一个事务种才可以实现:

$ cleos  system newaccount eosio  nm1024 --transfer  EOS57zTJCWoA6viGYi6y8mUKjfatSFZHxwVFmLdWoXpKDEC2Rx9GR EOS57zTJCWoA6viGYi6y8mUKjfatSFZHxwVFmLdWoXpKDEC2Rx9GR --stake-net '50.00 CYB' --stake-cpu '50.00 CYB' --buy-ram '10.0000 CYB'

然而就算你使用了上边的方法可能还是会遇到一堆的问题,具体参见问题汇总。

下一篇将会涉及到发布代币、合约等相关内容。

.
.
.
.
.
.
.
【本文章出自NM1024.com,转载请注明作者出处。】






>>转载请注明原文链接地址:EOS账户和钱包