美文网首页HiBlock区块链社区
区块链100讲:EOS环境搭建入门(私链节点-钱包-密钥-账号)

区块链100讲:EOS环境搭建入门(私链节点-钱包-密钥-账号)

作者: 宇宙永恒 | 来源:发表于2018-07-17 00:34 被阅读6次
    image

    1

    摘要

    【本文目标】

    通过本文实践,能在已编译的EOS V1.0.5版本环境上,完成私链节点启动,钱包创建,密钥导入和账号创建等内容。

    【前置条件】

    你已完成了EOS编译,编译测试成功。未完成的可参考如何在UBUNTU虚拟机上编译EOS完成环境搭建?(附代码)完成相关配置。

    【技术收获】
    1)EOS的节点,钱包,密钥,账号的概念和理解
    2)EOS钱包/账号的建立和遇到的问题分析及解决方法

    【说明】

    EOS版本还没有稳定下来,即使完成了V1.0.2版本环境搭建的人,到V1.0.5时还是摔在了坑里。辉哥通过踩坑分析给大家提供尽可能多的知识和解决思路,大家在V1.0.5以后的版本部署可参考文章和以错误关键字搜索官网的issue网址(https://github.com/EOSIO/eos/issues)获取更多知识。

    2

    EOSIO总体框架

    EOSIO有多个程序模块组成,经常会用到的有以下三个模块:

    下图是上面三个工具的关系:

    image

    另外,还有智能合约的编译工具eosiocpp

    3

    EOS系统中钱包,密钥对,账号,智能合约的关系

    相对其他区块链公链,EOS系统的组合关系比较自由,也带来了理解上的困难。辉哥结合自己的理解,以中国大地上人们最关系的房子为例,做比喻介绍。

    1) 钱包是土豪房东

    土豪可以有很多的房子和各种开门的钥匙。上海这个城市有很多个土豪房东,所以一个节点可以创建多个钱包。

    cleos wallet create ${参数}

    2)钥匙用来打开房东门的。

    钥匙分为私钥和公钥。公钥是别人可以看到的,例如下面图片是土豪家的橙色钥匙包,是专门用来存放仁恒滨江的大平层房子钥匙的,私钥是钥匙包里面实际开门的钥匙。

    你拿到钥匙包没有用的,你得拿到钥匙盒里面的私钥才可以打开土豪家房子大门。

    土豪房东可以把很多的房子配成一样的锁,用一对公钥/私钥来开门,也可以不同的房子不同的钥匙。

    cleos wallet import ${参数} 私钥

    3) 账户是房子

    房东可以给多个房子配一对钥匙(钥匙包和钥匙),也可以不同房子配不同钥匙。

    另外,一个房子可以用2把钥匙打开,一把是owner钥匙对,一把是active钥匙对。

    房子的owner钥匙地址表示为房东的公钥,表示主人产权归属,用它对应的私钥可以打开房子,这个钥匙包是房东连小姨子也不会给的;

    房子的active钥匙对表示为房客的公钥,表示该用户的私钥可以打开房子,房子出租后,房东就把这个钥匙包给租客了;

    cleos create account 节点 账户名 Owner的公钥 Active的公钥。

    4

    搭建实操

    搭建实操的流程图如下。

    image

    4. 1 启动私链

    1) 启动keosd

    keosd --http-server-address=127.0.0.1:8900

    命令行界面钱包程序为 keosd,位于 eos/build/programs/keosd 路径下,用于存储交易签名的私钥。keosd在本地节点上运行,并将私钥保存在本地节点上。

    默认情况下,keosd会在目录 ~/eosio-wallet 中生成一个基础的配置文件 config.ini。该配置文件中的wallet-dir指定了钱包文件存放目录。

    另外,在运行命令行钱包时,可通过配置命令行参数 --config-dir指定config.ini配置文件的目录。该配置文件中保存用于接入http链接的服务器配置http-server-address参数,以及其他用于资源共享的配置参数。

    默认情况下,keosd将钱包文件保存在 ~/eosio-wallet 目录下,钱包文件名为:<wallet-name>.wallet。例如,默认钱包文件名为 default.wallet。当建立了其他钱包后,在该目录下会分别建立每个钱包文件,例如当建立了一个名称为"duncanwang"的钱包,会生成一个钱包文件duncanwang.wallet。钱包文件可以通过命令行参数--data-dir存放在指定的目录中。

    【预警】从V1.0.5开始,发现要先运行keosd后在运行nodeos才可以创建钱包。

    成功输出结果如下:

    image image

    (复制代码点击“阅读原文”)

    2) 启动私链

    在新的命令行窗口输入以下命令。

    cd ~/eos/build/programs/nodeos
    ./nodeos -e -p eosio --plugin eosio::wallet_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --replay-blockchain

    在启动nodeos时,需要添加参数eosio::wallet_plugin,否则的话,每次节点重启,之前创建的钱包,账号都不会加载进来。

    --replay-blockchain表示清除数据库内链的状态,重新运行,它会导致重新启动时先读取之前的区块进行加载。

    【注意】 节点关闭后,钱包将会被加锁。重新启动nodeos后,需要使用unlock命令解锁钱包。

    例如:

    duncanwang@duncanwang:~/eos$ cleos wallet unlock -n duncanwang

    password: Unlocked: duncanwang

    输入nodes -help可以看到所有参数的帮助说明。

    image image image image image image image image image image image image image image image image image image image

    4.2 创建钱包

    cleos wallet create -n duncanwang

    创建duncanwang钱包成功,输出结果如下:

    duncanwang@duncanwang:~/eos$ cleos wallet create -n duncanwang
    
    Creating wallet: duncanwang
    
    Save password to use in the future to unlock this wallet.
    
    Without password imported keys will not be retrievable.
    
    "PW5JMZdES2Cds5LsPRUBRo2THEXpbFSM17Xmcd2XWG7XBd49wveTo"
    

    【结果确认】

    duncanwang@duncanwang:~$ cleos wallet list
    
    Wallets:
    
    [
    
      "duncanwang *"
    
    ]
    

    duanwang钱包已存在了,*表示该账号已解锁。

    【问题1】 创建钱包重名,但是cleos wallet list看不到

    duncanwang@duncanwang:~$ cleos wallet create -n duncanwang

    Error 3120001: Wallet already exists
    Try to use different wallet name.

    【解决方法】

    这个主要是运行的命令中没有导入钱包--plugin eosio::wallet_plugin这个参数,导致已创建钱包未加载,但是目录下存在已创建的钱包文件。

    ./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --replay-blockchain

    ~/eosio-wallet 目录下删除文件duncanwang.wallet即可重新创建。

    【问题2】重启节点后,cleos wallet list发现已创建的钱包等不存在。

    duncanwang@duncanwang:~$ cleos wallet list
    
    Wallets:
    
    [
    ]
    

    【解决方法1】

    运行./nodeos命令时要带参数--plugin eosio::wallet_plugin

    【解决方法2】

    后来发现这种方法有时也是不可行,cleos wallet list没有看到钱包。
    采用命令'cleos wallet open -n duncanwang'打开钱包后,就正常加载进来了。

    【问题3】创建钱包时提示keosd已运行,并且无法连接

    duncanwang@duncanwang:~$ cleos wallet create -n duncanwang
    
    "/usr/local/bin/keosd" launched
    
    Unable to connect to keosd, if keosd is running please kill the process and try again.
    

    【解决方法】

    需要输入以下命令把keosd重启下。

    ps -ef | grep keosd
    kill -9 pid
    keosd --http-server-address=127.0.0.1:8900

    操作实例如下:

    duncanwang@duncanwang:~$ ps -ef | grep keosd
    
    duncanw+  2439     1  0 07:14 pts/1    00:00:00 /usr/local/bin/keosd --http-server-address=::1:8900
    
    duncanw+  2441  2389  0 07:16 pts/1    00:00:00 grep --color=auto keosd
    
    duncanwang@duncanwang:~$ kill -9 2439
    

    4.3 钱包导入系统账号私钥

    1) 找到eosio的系统账号的默认公钥/私钥对

    找到配置文件,例如以下地址,~/.local/share/eosio/nodeosconfig 的 config.ini,默认的私钥/公钥是一样的。

    signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

    2),钱包导入系统账号私钥

    > cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n duncanwang
    
    duncanwang@duncanwang:~/eos$ cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n duncanwang
    
    imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
    

    3),查看系统账号信息

    以下命令可以查看eosio系统账号的密钥和资源占用情况。

    > cleos get account eosio
    
    duncanwang@duncanwang:~/eos/build$ cleos get account eosio
    
    privileged: true
    
    permissions:
    
          owner     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
    
            active     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
    
    memory:
    
          quota:       unlimited  used:     60.75 KiB
    
      net bandwidth:
    
          used:               unlimited
    
         available:          unlimited
    
         limit:              unlimited
    
    cpu bandwidth:
    
         used:               unlimited
    
         available:          unlimited
    
         limit:              unlimited
    

    4.4 加载Bios合约

    现在我们有一个钱包,并且加载了eosio帐户的密钥,我们可以设置一个默认的系统合约。为了开发的目的,可以使用默认的eosio.bios合约。通过此合约,您可以直接控制其他帐户的资源分配,并调用其他特权API。在公开区块链中,这个系统合约将管理其他账户的 token 抵押和解抵押操作,以为合约执行预留CPU、网络活动带宽,以及预留内存。

    eosio.bios合约可以在你的EOSIO源代码文件夹中找到:contracts/eosio.bios。下面的命令序列,都假定是在EOSIO源代码的根目录执行。但是您可以通过指定完整路径,从任意位置执行这个命令:${EOSIO_SOURCE}/build/contracts/eosio.bios。

    这个命令序列的结果是,cleos发起一个包含两个操作(actions)的交易(transaction):eosio::setcode和eosio::setabi。

    代码定义了合约如何运行,abi描述了参数如何在二进制和json表示之间进行转换。虽然abi在技术上是可选的,但为了便于使用,所有的EOSIO工具都依赖于它。

    输入命令:

    cleos set contract eosio build/contracts/eosio.bios -p eosio

    输出结果,表示本地执行成功。

    duncanwang@duncanwang:~/eos$ cleos set contract eosio build/contracts/eosio.bios -p eosio
    
    Reading WAST/WASM from build/contracts/eosio.bios/eosio.bios.wasm...Using already assembled WASM...
    
    Publishing contract...
    
    executed transaction: f4c1cc4e953710645a4849eb41cf92d9d3881c756b227323a3ade221e3807fbb  3720 bytes  12685 us
    
    #         eosio <= eosio::setcode               {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001621260037f7e7f0060057f7e7e7e7e...
    
    #         eosio <= eosio::setabi                {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e30050c6163636f756e745f6e616d65046e616d650f7065...
    
    warning: transaction executed locally, but may not be confirmed by the network yet
    

    4.5 创建并导入新的密钥对

    1)创建新的密钥对

    cleos create key

    创建密钥对的输出结果。

    duncanwang@duncanwang:~/eos$ cleos create key
    
    Private key: 5JZQmnt6ZtEzUADswgKgBwMp9qAwTSNM9JFHPRFu1FjrLjj49g7
    
    Public key: EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
    

    2) 导入新的私钥

    cleos wallet import 5JZQmnt6ZtEzUADswgKgBwMp9qAwTSNM9JFHPRFu1FjrLjj49g7 -n duncanwang

    输出结果如下:

    duncanwang@duncanwang:~/eos$ cleos wallet import 5JZQmnt6ZtEzUADswgKgBwMp9qAwTSNM9JFHPRFu1FjrLjj49g7 -n duncanwang
    
    imported private key for: EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
    

    3)查看确认密钥对是否导入成功

    cleos wallet keys

    用于查看钱包的密钥对情况。

    【输出结果】

    duncanwang@duncanwang:~/eos$ cleos wallet keys
    
    [ 
    
     "EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1", 
    
     "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
    
    ]
    

    4.6 创建新账号

    创建账号的命令:

    cleos create account eosio {new_account} ownerkey {active_key}

    其中eosio是超级用户,需要靠超级用户来创建其它的新用户,eosio后面就是你的新用户的用户名.

    除了新的账号之外,命令后面还有两个key:

    • Owner key

    • Active key

    Owner key是什么意思呢?Owner key表示分配给新账号的一个Owner认证的公钥。Active key是分配给新账号一个Active认证的一个公钥。

    至于这两个认证,我后面会给详细介绍,这是两个主要的权限。我创建一个账号,如果这个账号要有Owner的权限和Active的权限,就必须要用这两个key才能实现。

    我们来总结一下刚才的操作,我们刚才操作是调用cleos create account创建了一个账号,这个账号的命名规则遵守下边两个规则:

    • 小于13个字符;

    • 仅包含这些字符:.12345abcdefghijklmnopqrstuvwxyz

    另外,刚才给大家说到Owner key和Active key的概念。Owner key的概念就是你账号的所有控制权限,你只要有了Owner key,你可以对这个账号的任何东西做任何的事儿,这是它的所有控制权。

    而Active key只掌握了你的账号资金的访问权限,也就是你如果有了Active这个权限的话,你可以对这个账号的资金进行转移,但是你不能转移这个账号的所有权,或者不能做超过这个Active权限其它的权利。

    如果简单的理解,Owner key就是对这个账号的最高权限,Active只是用来转移资金而已。这也是与以太坊智能合约开发的一个区别,以太坊账号的权限其实没有这么细分,它就只有一个账号,我只要有这个账号的公钥和私钥,我就可以做任何事情。

    具体操作如下。

    cleos create account eosio wangdenghui1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1

    【错误现象】

    duncanwang@duncanwang:~/eos$ cleos create account eosio wangdenghui1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
    
    Error 3050000: action exception
    

    【解决方案-查询账号】

    查询发现该账号已存在,之前辉哥创建过,忘记了。

    duncanwang@duncanwang:~/eos$ cleos get accounts EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
    
    {
    
      "account_names": [
    
        "wangdenghui1" 
    
     ]
    
    }
    
    > cleos create account eosio boss EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
    

    创建成功输出结果:

    duncanwang@duncanwang:~/eos$ cleos create account eosio boss EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1 EOS6EHAzvrpQ4wo1BPcAk86X6aGDARZgqTcAq1mJRF1SxEYgNGWN1
    
    executed transaction: cb6801fe82816f94b447cbfb903ae8e9477f5c99920322d679a9c8c04347e536  200 bytes  367 us
    
    #         eosio <= eosio::newaccount            {"creator":"eosio","name":"boss","owner":{"threshold":1,"keys":[{"key":"EOS6EHAzvrpQ4wo1BPcAk86X6aGD...
    
    warning: transaction executed locally, but may not be confirmed by the network yet
    

    4.6 总结

    至此,基于私链环境搭建和准备工作已经完毕,接下来就可以在上面运行"Hello World"智能合约了。

    5

    参考文档

    1)eoshackathon/eos_dapp_development_cn 古千峰Githubhttps://github.com/eoshackathon/eos_dapp_development_cn

    2) github官网https://github.com/EOSIO/eos/wiki

    3)本地环境https://github.com/EOSIO/eos/wiki/Local-Environment

    本文作者:HiBlock区块链技术布道群-辉哥

    原文发布于简书

    原文链接:https://www.jianshu.com/p/533f849489b1

    加微信baobaotalk_com,加入技术布道群

    线上课程推荐

    【线上课程】4节课8小时培训,《白话区块链》作者蒋勇教你快速掌握区块链智能合约开发

    image

    线下活动推荐

    技术工坊|(分享+实践)1天学会区块链Dapp+代币开发(西安)

    image

    相关文章

      网友评论

        本文标题:区块链100讲:EOS环境搭建入门(私链节点-钱包-密钥-账号)

        本文链接:https://www.haomeiwen.com/subject/tlbipftx.html