关于唯链雷神区块链,你可能还不知道的那些事儿(第五篇)- 定制您自己的唯链雷神区块链



  • 关于唯链雷神区块链,你可能还不知道的那些事儿(第五篇)- 定制您自己的唯链雷神区块链

    本文是“关于唯链雷神区块链,你可能还不知道那些事儿”系列文章的第五篇。您可以在文末找到前几篇文章的链接。

    唯链雷神区块链允许用户定制、部署自己的区块链网络。本文主要包括两个部分:第一部分主要对如何进行个性化定制进行介绍,第二部分则会提供部署定制唯链雷神区块链的示例。

    如何定制

    如需定制你自己的唯链雷神区块链,你首先需要生成一个JSON配置文件,并在启动Thor客户端程序的时候将其传递给系统。你可以通过配置文件设置系统全局参数、超级节点名单、链上治理设置、通证(包括VET及VTHO)生成及分配,以及您想要在一开始部署的合约。上述选择会产生你定制的区块链所独有的创世区块。

    雷神区块链的源代码中提供了一个示例配置文件,文件所在位置是/genesis/example.json。以下表格列出了所有可配置文件中调整数值的键值:

    名称 数值类型 描述
    launchTime Unix时间戳(最小单位为秒) 定制化区块链的最早启动时间。
    gasLimit 无符号整数 创世区块的gas上限。
    extraData 字符串 (长度 ≤ 28) 任何你想要放在创世区块中的文字。
    accounts account[] 为创建、分配通证或部署合约而创建的帐户。
    account.address 代表20字节数据的16进制字符串 帐户地址。
    account.balance 无符号整数 VET余额(最小单位为Wei)。
    account.energy 无符号整数 VTHO余额(最小单位为Wei)(可选)。
    account.code 16进制字符串 智能合约EVM编译后执行代码(可选)。
    account.storage 键值对,键和值都为代表32字节数据16进制字符串 智能合约Storage值(可选)。
    authority masternode[] 超级节点清单。
    masternode.masterAddress 代表20字节数据的16进制字符串 超级节点master账户地址。
    masternode.endorsorAddress 代表20字节数据的16进制字符串 超级节点VET抵押账户地址。
    masternode.identity 代表32字节数据的16进制字符串 超级节点身份信息。
    params.rewardRatio 无符号整数 ∈ [0, 1e+18] VTHO奖励比率 = rewardRatio / 1e18.
    params.baseGasPrice 无符号整数 基准gas价格 value.
    params.proposerEndorsement 无符号整数 ( > 0 ) 超级节点最低抵押VET数值。
    params.executorAddress 代表20字节数据的16进制字符串 内置executor合约地址。
    executor.approvers approver[] 授权批准链上治理操作的帐户。例如,在主链上代表唯链基金会的战略决策委员会成员。
    approver.address 代表20字节数据的16进制字符串 Approver账户地址。
    approver.identity 代表32字节数据的16进制字符串 Approver身份信息。

    点击此处查看演示代码,该代码能够生成有效JSON配置文件。

    本地部署

    在生成JSON配置文件后,你就可以部署自己定制的唯链雷神区块链了。你需要至少有两个相互同步的节点。此外,其中至少有一个节点在JSON文件中被设为超级节点。

    如果你拥有一个公网IP地址,你只需执行一下命令来启动Thor客户端

    bin/thor --network

    如果没有的话,你需要使用thor命令的其他选项来完成部署。作为案例展示,我将会分步展示如何在一台计算机上部署由两个本地节点组成的定制化网络。

    符号定义:

    • N1N2:节点名称。
    • < CONFIG_DIR1 >< CONFIG_DIR2 >:存放节点master账户私钥目录。
    • < DATA_DIR1 >< DATA_DIR2 >:存放账本数据目录。
    • < ENODE1 >: N1节点ID的一个子字符串,以"enode://"开头、"@[extip]"结尾。

    步骤一

    假设N1已经被设为超级节点。我们首先通过一下命令得到节点master账户地址:

    thor master-key --config-dir < CONFIG_DIR1 >

    请注意,如果你使用了不同--config-dir值,则主帐户地址会有所不同。

    之后,我们需要在JSON文件中注册主节点N1。在我演示代码中,是通过一下代码实现的:

    const masterAddress1 = '0x929710d206f0e1133f353553353de5bc80c8460b';
    ...
    const endorsor = '0x5e4abda5cced44f70c9d2e1be4fda08c4291945b';
    const _authority: Authority[] = [
        { masterAddress: masterAddress1, endorsorAddress: endorsor, identity: strToHexStr('id1', 64) },
        ...
    ];
    

    我们还需要确保超节点的抵押账户中存有足够资金,(所需最少资金量由params.proposerEndorsement定义)。以下代码创建该抵押账户,并转入所需资金:

    const _accounts: Account[] = [
        {
            address: endorsor,
            balance: 25000000000000000000000000,
            ...
        },
        ...
    ];
    

    请注意,除VET余额外,我还为抵押帐户设置了其他可选数值。设置这些数值只是为了向你展示如何在JSON配置文件中创建合约帐户。

    步骤二

    通过一下命令启动节点N1

    thor --network < JSON_FILE > \
         --config-dir < CONFIG_DIR1 > \
         --data-dir < DATA_DIR1 >
    

    从以上显示信息中我们可以得到< ENODE1 > = enode://5e61...67fb.

    步骤三

    由于节点N1N2在同一台机器上运行,且N1使用默认API门户地址和P2P端口号,我们在启动节点N2时需要通过选项--api-port--p2p-port为它们设置新数值。以下是启动N2的命令:

    thor --network < JSON_FILE > \
         --config-dir  \
         --data-dir < DATA_DIR2 > \
         --api-addr localhost:8670 \
         --p2p-port 11236 \
         --bootnode < ENODE1 >@127.0.0.1:11235
    

    通过选项--bootnode,我们能够将初始连接节点的信息传入系统,从而使得当前节点能够与区块链网络中的其他节点同步。从下方屏幕截图可以看出,节点N1N2成功同步,并产生出新的区块。

    测试

    现在,我定制化雷神区块链已经部署完毕并运行。我们可以使用Connex REPL通过Connex接口与其进行交互。

    在安装Connex REPL之后,我们可以输入以下命令连接节点N2

    connex http://127.0.0.1:8670
    

    你可以通过一下命令来查看创世区块信息。

    thor.genesis
    

    以下命令可以用来查看节点N1的抵押账户余额和所附带的合约代码。

    await thor.account('< ACC_ADDR >').get()
    await thor.account('< ACC_ADDR >').getCode()
    

    您可以将输出值与JSON配置文件中定义的值进行比较。

    文章链接

    关于唯链雷神区块链,你可能还不知道的那些事儿(第一篇)- 交易唯一性

    关于唯链雷神区块链,你可能还不知道的那些事儿(第二篇)- 强制交易依赖性

    关于唯链雷神区块链,你可能还不知道的那些事儿(第三篇)- 指定交易费用代付(VIP-191)

    关于唯链雷神区块链,你可能还不知道的那些事儿(第四篇)- 挖矿获取额外交易Gas单价


Log in to reply