# 如何搭建私有链

# 1. 下载最新节点程序

最新程序 (opens new window)

curl 'https://raw.githubusercontent.com/gxchain/gxb-core/dev_master/script/gxchain_private_net_install.sh' | bash

# 2. 生成ECC密钥对

# 通过cli_wallet来生成一对公私钥

./programs/cli_wallet/cli_wallet --suggest-brain-key
{
  "brain_priv_key": "SHAP CASCADE AIRLIKE WRINKLE CUNETTE FROWNY MISREAD MOIST HANDSET COLOVE EMOTION UNSPAN SEAWARD HAGGIS TEENTY NARRAS",
  "wif_priv_key": "5J2FpCq3UmvcodkCCofXSNvHYTodufbPajwpoEFAh2TJf27EuL3",
  "pub_key": "GXC75UwALPEFECfHLjHyNSxCk1j7XzSvApQiXKEbanWgr7yvXXbdG"
}

字段解释

  • brain_priv_key: 助记词,是私钥的原始文本,通过助记词可以还原出私钥
  • wif_priv_key: 私钥,在程序中使用
  • pub_key: 公钥,用于链上账户注册

接下来将讲解如何使用以上私钥,并会说明如何定义你自己的创世文件。

# 3. 生成创世文件genesis.json

运行这条命令来创建一个名为my-genesis.json的初始文件:

./programs/witness_node/witness_node --create-genesis-json my-genesis.json

my-genesis.json这个文件将会存储在你私钥文件夹的根目录下,运行此命令后,所有见证人节点都会自行完成命令。

如果你想要自定义初始设定,打开my-genesis.json,你可以做以下的修改:

  • 修改初始文件中账户, 以及账户名和公钥
  • 区块链资产和初次分发(包含核心资产)
  • 私链参数的最初基准(包括费用)
  • 初始见证人的账户签名秘钥

# 4. 启动私链

运行以下命令:

./programs/witness_node/witness_node --data-dir data --genesis-json my-genesis.json

--data-dir 指定了区块输出目录为./data文件夹 --genesis-json 指定了启动节点的初始参数来自my-genesis.json

查看日志:

tail -f data/logs/witness.log

当这条信息出现时:

3501235ms th_a main.cpp:165 main] Started witness node on a chain with 0 blocks.
3501235ms th_a main.cpp:166 main] Chain ID is 8b7bd36a146a03d0e5d0a971e286098f41230b209d96f92465cd62bd64294824

注意

请注意你的Chain ID会和上述例子中的ID不同。请记录下你的Chain ID,在之后你将会用到它

初始化已经完成,按ctrl-c 关闭见证人节点

至此,你完成了:

  • 创建了一条属于你自己的链,并启动了第一个节点
  • 这个节点的初始化数据来自于my-genisis.json
  • 只要其他的节点使用my-genisis.json, 并在启动参数中指定你的Chain ID, 即可加入你的私有区块链网络

关闭节点后,我们观察到,在data目录下生成了一个新文件config.ini,所有的启动参数,都可以在data/config.ini中进行配置

# 5. 配置见证人

用文本编辑器打开刚生成的data/config.ini, 做如下设置, 必要时请不要注释这些代码:

rpc-endpoint = 127.0.0.1:11011
genesis-json = my-genesis.json
enable-stale-production = true

data/config.ini中定位以下语句:

# ID of witness controlled by this node (e.g. "1.6.5", quotes are required, may specify multiple times)

并添加如下词条:

witness-id = "1.6.1"
witness-id = "1.6.2"
witness-id = "1.6.3"
witness-id = "1.6.4"
witness-id = "1.6.5"
witness-id = "1.6.6"
witness-id = "1.6.7"
witness-id = "1.6.8"
witness-id = "1.6.9"
witness-id = "1.6.10"
witness-id = "1.6.11"

上述列表授权了见证人节点用见证人ID来生成区块

再来定位下一行配置

# Tuple of [PublicKey, WIF private key] (may specify multiple times)
private-key = ["GXC6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"]

提示

  • 正常情况下,每个见证人的节点不同
  • 但在私有链中,我们会先设定成全体见证人在同一个节点生产区块
  • 这些见证人ID的私钥(用来签署区块)已经在data/config.ini中提供:

# 6. 开始生产区块

通过以下步骤,你可以生产基于你私链的第一个区块了,在见证人节点中运行以下命令:

./programs/witness_node/witness_node --data-dir data

之后私链的区块将开始生成,你会看到如下指示:

********************************
*                              *
*   ------- NEW CHAIN ------   *
*   - Welcome to Graphene! -   *
*   ------------------------   *
*                              *
********************************

之后data/log/witness.log文件会有更多成功生成区块的日志生成:

2322793ms th_a  main.cpp:176     main    ] Started witness node on a chain with 0 blocks.
2322794ms th_a  main.cpp:177     main    ] Chain ID is 8b7bd36a146a03d0e5d0a971e286098f41230b209d96f92465cd62bd64294824
2324613ms th_a  witness.cpp:185  block_production_loo ] Generated block #1 with timestamp 2016-01-21T22:38:40 at time 2016-01-21T22:39:40
2344604ms th_a  witness.cpp:185  block_production_loo ] Generated block #2 with timestamp 2016-01-21T22:39:00 at time 2016-01-21T22:39:45
2349616ms th_a  witness.cpp:185  block_production_loo ] Generated block #3 with timestamp 2016-01-21T22:39:05 at time 2016-01-21T22:39:50
2354605ms th_a  witness.cpp:185  block_production_loo ] Generated block #4 with timestamp 2016-01-21T22:39:10 at time 2016-01-21T22:39:55

如果witness.log无日志生成,可以将日志打印打控制台,可以修改data/config.ini文件如下,然后重新启动witness_node

[logger.default]
level=debug
appenders=stderr

# 7. 客户端(cli_wallet)用法

现在可以将客户端和你的私链的见证人节点相关联。先确保你的见证人节点在运行状态,在另外一个CMD中运行以下命令:

./programs/cli_wallet/cli_wallet --wallet-file=my-wallet.json --chain-id 8b7bd36a146a03d0e5d0a971e286098f41230b209d96f92465cd62bd64294824 -sws://127.0.0.1:11011

提示

  • 请确保用你自己私链的区块链ID替代上述ID8b7bd36a146a03d0e5d0a971e286098f41230b209d96f92465cd62bd64294824
  • 如果看到set_password提示,意味着你的客户端(cli_wallet)已经成功连接到见证人节点(witness_node)。

# 1) 创建一个新钱包

首先你需要为你的钱包创建一个新的密码。这个密码被用于加密所有钱包的私钥。在教程中我们使用如下密码:supersecret

但你可以使用字母和数字的组合来创建属于你的密码。通过以下命令来创建你的密码::

>>> set_password supersecret

现在你可以解锁你新建的钱包了:

locked >>> unlock supersecret

# 2) 申领初始余额

资产账户包含在钱包账户中, 要向你的钱包中添加钱包账户, 你需要知道账户名以及账户的私钥。 在例子中,我们将通过import_key命令向现有钱包中导入my-genesis.json中初始化的nathan帐户:

unlocked >>> import_key nathan 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

提示

  • nathan在初始文件中会被用于定义账户名, 如果你修改过my-genesies.json 文件,你可以填入一个不同的名字。并且,请注意5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3是定义在config.ini内的私钥

现在我们已经将私钥导入进钱包, my-genesis.json中初始化的余额,需要通过import_balance命令来申领,无需申明费用:

unlocked >>> import_balance nathan ["5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"] true

你可以通过以下命令来检视你的账户:

unlocked >>> get_account nathan

用以下命令获取账户余额:

unlocked >>> list_account_balances nathan

# 3) 创建账户

现在我们讲创建一个新的账户alpha ,这样我们可以在 nathanalpha两个账户中来回转账了。

通常我们用一个已有账户来创建新账户,因为登记员需要缴纳注册费用。 并且,登记员的账户需要进入Also, there is the requirement lifetime member (LTM)状态。因此我们必须在创建新账户前,先将账户nathan升级到LTM状态, 使用upgrade_account命令来升级账户:

unlocked >>> upgrade_account nathan GXC true

返回的信息中,在membership_expiration_date边上你会发现2106-02-07T06:28:15。 如果你看到1970-01-01T00:00:00,说明之前的操作出现了错误,nathan没能成功升级。

成功升级后,我们可以通过nathan来注册新账户,但首先我们需要拥有新账户的公钥。通过使用suggest_brain_key命令来完成:

unlocked >>> suggest_brain_key

然后调用register_account / register_account2接口创建新帐户

unlocked >>> register_account alpha GXC6vQtDEgHSickqe9itW8fbFyUrKZK5xsg4FRHzQZ7hStaWqEKhZ GXC6vQtDEgHSickqe9itW8fbFyUrKZK5xsg4FRHzQZ7hStaWqEKhZ nathan nathan 10 true

至此,帐户alpha创建成功。你可以调用transfer3接口向alpha转帐

unlocked >>>  transfer3 nathan alpha 100 GXC "" GXC true

查看帐户alpha的余额

unlocked >>> list_account_balances alpha