Nodeos 使用之本地多节点测试网络

英文版原文

Goal
本节介绍如何设置在单个主机上运行的多节点区块链配置。这称为 单主机、多节点testnet。我们将在您的本地计算机上设置两个节点,并让它们相互通信。本节中的示例依赖于三个命令行应用程序:nodeoskeosdcleos。下图描述了所需的testnet配置。

Before you begin

  • 开始本章节前 安装 EOSIO .
  • 假设 nodeos, cleos, 和 keosd 都可以正常访问. 如果EOSIO是通过脚本构建的,确保运行安装脚本 Install Script.
  • 明确如何通过 Nodeos options 选项启用/禁用功能.

Steps

  1. Start the Wallet Manager

    在第一个终端窗口中,启动钱包管理应用程序,keosd

    keosd --http-server-address 127.0.0.1:8899
    

    如果成功,keosd将显示一些信息,如下:

    2493323ms thread-0   wallet_plugin.cpp:39          plugin_initialize    ] initializing wallet plugin
    2493323ms thread-0   http_plugin.cpp:141           plugin_initialize    ] host: 127.0.0.1 port: 8899
    2493323ms thread-0   http_plugin.cpp:144           plugin_initialize    ] configured http to listen on 127.0.0.1:8899
    2493323ms thread-0   http_plugin.cpp:213           plugin_startup       ] start listening for http requests
    2493324ms thread-0   wallet_api_plugin.cpp:70      plugin_startup       ] starting wallet_api_plugin
    

    第二行指出钱包在127.0.0.1:8899进行监听。这表明keosd已正确启动,并且正在正确的端口上侦听。如果在“启动wallet_api_plugin”之前看到任何其他信息,或者看到一些错误报告,则需要诊断该问题并重新启动。

    keosd正常运行时,不要关闭当前窗口,然后移动到下一个终端窗口。

  2. Create a Default Wallet

    在下一个终端窗口中,使用命令行实用程序cleos创建默认钱包。

    cleos --wallet-url http://127.0.0.1:8899  wallet create --to-console
    

    cleos将指出它创建了“默认”钱包,并为将来的钱包访问提供密码。如消息所述,请确保保留此密码以备之后使用。以下是此输出的示例:

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

    keosd将在其窗口中生成一些状态输出。我们将继续使用第二个窗口执行后续的cleos命令。

  3. Loading the EOSIO Key

    在上述步骤中启动的私有区块链是使用默认的初始密钥创建的,该密钥必须加载到钱包中。

    cleos --wallet-url http://127.0.0.1:8899 wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
    
    imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
    
  4. Start the First Producer Node

    我们现在可以启动第一个生产者节点。在第三个终端窗口中运行:

    nodeos --enable-stale-production --producer-name eosio --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin
    

    这将创建一个特殊的生产者,称为“bios”生产者。假设到目前为止一切都已正确执行,您应该会看到nodeos进程报告块创建的输出。

  5. Start the Second Producer Node

    以下命令假设您是从运行本教程的eos\build目录运行本教程的./eosio_build.sh版本以构建EOSIO二进制文件。

    若要启动其他节点,必须首先加载eosio.bios合约。此合约使您能够直接控制其他帐户的资源分配,并访问其他特权API调用。返回到第二个终端窗口并运行以下命令以加载合约:

    cleos --wallet-url http://127.0.0.1:8899 set contract eosio build/contracts/eosio.bios
    

    我们将创建一个帐户成为生产者,使用帐户名inita。要创建帐户,我们需要生成与帐户关联的密钥,并将这些密钥导入我们的钱包。

    运行create key命令:

    cleos create key
    

    注意
    下面的命令行指令使用下面显示的私钥/公钥。为了能够直接剪切和粘贴本教程中的命令行指令,请使用这些key,而不是从cleos create key命令生成的key。如果仍要使用新生成的key,则需要在随后的命令中将key值替换为你自己的key值。

    这将报告新生成的公钥和私钥对,它们看起来类似于以下内容。

    Private key: 5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr
    Public key: EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg
    

    现在将私钥部分导入您的钱包。如果成功,将报告匹配的公钥。这应该与先前生成的公钥匹配:

    cleos --wallet-url http://127.0.0.1:8899 wallet import 5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr
    
    imported private key for: EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg
    

    创建我们将用来成为生产商的inita帐户。create account命令需要两个公钥,一个用于帐户的所有者密钥,另一个用于帐户的活动密钥。在本例中,新创建的公钥将作为所有者密钥和活动密钥使用两次。create命令的输出示例如下:

    cleos --wallet-url http://127.0.0.1:8899 create account eosio inita EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg
    
    executed transaction: d1ea511977803d2d88f46deb554f5b6cce355b9cc3174bec0da45fc16fe9d5f3  352 bytes  102400 cycles
    #         eosio <= eosio::newaccount            {"creator":"eosio","name":"inita","owner":{"threshold":1,"keys":[{"key":"EOS6hMjoWRF2L8x9YpeqtUEcsDK...

    我们现在有一个帐户,可以为它分配一个合约,使它能够做有意义的工作。在其他教程中,该帐户已用于建立简单的合约。在这种情况下,帐户将被指定为块生成器。

    在第四个终端窗口中,启动第二个nodeos实例。注意,这个命令行比我们在上面创建第一个生产者时使用的命令行要长得多。这是避免与第一个nodeos实例冲突所必需的。幸运的是,您可以剪切并粘贴此命令行并调整关键点:

    nodeos --producer-name inita --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --http-server-address 127.0.0.1:8889 --p2p-listen-endpoint 127.0.0.1:9877 --p2p-peer-address 127.0.0.1:9876 --config-dir node2 --data-dir node2 --private-key [\"EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg\",\"5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr\"]
    

    这个新节点的输出将显示一个小活动,但将停止报告,直到本教程的最后一步,当inita帐户注册为producer帐户并被激活。下面是一个新启动节点的输出示例。您的输出可能看起来有点不同,这取决于您输入这些命令所花费的时间。此外,本例仅是最后几行输出:

    2393147ms thread-0   producer_plugin.cpp:176       plugin_startup       ] producer plugin:  plugin_startup() end
    2393157ms thread-0   net_plugin.cpp:1271           start_sync           ] Catching up with chain, our last req is 0, theirs is 8249 peer dhcp15.ociweb.com:9876 - 295f5fd
    2393158ms thread-0   chain_controller.cpp:1402     validate_block_heade ] head_block_time 2018-03-01T12:00:00.000, next_block 2018-04-05T22:31:08.500, block_interval 500
    2393158ms thread-0   chain_controller.cpp:1404     validate_block_heade ] Did not produce block within block_interval 500ms, took 3061868500ms)
    2393512ms thread-0   producer_plugin.cpp:241       block_production_loo ] Not producing block because production is disabled until we receive a recent block (see: --enable-stale-production)
    2395680ms thread-0   net_plugin.cpp:1385           recv_notice          ] sync_manager got last irreversible block notice
    2395680ms thread-0   net_plugin.cpp:1271           start_sync           ] Catching up with chain, our last req is 8248, theirs is 8255 peer dhcp15.ociweb.com:9876 - 295f5fd
    2396002ms thread-0   producer_plugin.cpp:226       block_production_loo ] Previous result occurred 5 times
    2396002ms thread-0   producer_plugin.cpp:244       block_production_loo ] Not producing block because it isn't my turn, its eosio
    

    此时,第二个节点是一个空闲的生产者。要将其转换为活动生产者,inita需要注册为bios节点的生产者,bios节点需要执行更新生产者计划的操作。

    cleos --wallet-url http://127.0.0.1:8899 push action eosio setprods "{ \"schedule\": [{\"producer_name\": \"inita\",\"block_signing_key\": \"EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg\"}]}" -p eosio@active
    
    executed transaction: 2cff4d96814752aefaf9908a7650e867dab74af02253ae7d34672abb9c58235a  272 bytes  105472 cycles
    #         eosio <= eosio::setprods              {"version":1,"producers":[{"producer_name":"inita","block_signing_key":"EOS6hMjoWRF2L8x9YpeqtUEcsDKA...
    

    恭喜,您现在已经配置了一个双节点testnet!您可以看到原始节点不再生成块,而是正在接收它们。您可以通过对每个节点运行get info指令来验证这一点。

  6. Get Nodes Info

    获取第一个节点的信息:

    cleos get info
    

    这将生成类似于以下内容的输出:

    {
      "server_version": "223565e8",
      "head_block_num": 11412,
      "last_irreversible_block_num": 11411,
      "head_block_id": "00002c94daf7dff456cd940bd585c4d9b38e520e356d295d3531144329c8b6c3",
      "head_block_time": "2018-04-06T00:06:14",
      "head_block_producer": "inita"
    }
    

    现在对于第二个节点:

    cleos --url http://127.0.0.1:8889 get info
    

    这将生成类似于以下内容的输出:

    {
      "server_version": "223565e8",
      "head_block_num": 11438,
      "last_irreversible_block_num": 11437,
      "head_block_id": "00002cae32697444fa9a2964e4db85b5e8fd4c8b51529a0c13e38587c1bf3c6f",
      "head_block_time": "2018-04-06T00:06:27",
      "head_block_producer": "inita"
    }
    

    在后面的教程中,我们将探讨如何使用更高级的工具来运行多主机、多节点的testnet。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 irvin.em@live.com。

文章标题:Nodeos 使用之本地多节点测试网络

文章字数:2k

本文作者:dino

发布时间:2020-06-05, 11:22:32

最后更新:2020-06-05, 16:19:35

原始链接:https://blog.walkbc.com/2020/06/05/EOS-Nodeos-Usage-Local-Nulti-Node-Testnet/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

QQ交流群:273078549

目录