本章节将指导您获取XuperChain的代码并部署一个基础的可用环境,还会展示一些基本操作

1. 环境部署

1.1. 准备环境

XuperChain主要由Golang开发,需要首先准备编译运行的环境

  • 安装go语言编译环境,版本为1.11或更高

  • 安装git

    • 下载地址:git

1.2. 编译XuperChain

  1. $ cd xuperchain
  2. $ make
  • 在output目录得到bin,conf, data 三个文件夹以及一个 control.sh 脚本

注解

make 时,可能出现拉取失败的情况,可以配置GOPROXY解决此问题

$ export GOPROXY=https://goproxy.cn,direct

GOPATH问题报错,不推荐使用go1.11版本之前的版本

GCC版本需要升级到4或5以上

2. 基本操作

在output下,有bin, conf, data三个目录,以及一个control.sh 脚本

各目录的功能如下表:

目录名

功能

output/

节点根目录

├─ bin

可执行文件存放目录

│ ··· ├─ wasm2c

XVM 虚拟机工具,将 WASM 转为 C

│ ··· ├─ xchain

xchain服务的二进制文件

│ ··· ├─ xchain-cli

xchain客户端工具

├─ conf

配置相关目录

│ ··· ├─ xchain.yaml

xchain服务的配置信息(注意端口冲突)

│ ··· ├─ engine.yaml

引擎相关配置

│ ··· ├─ env.yaml

本地环境相关配置,设置key存储路径等

│ ··· ├─ ledger.yaml

存储引擎相关配置,levelDB等

│ ··· ├─ log.yaml

日志相关配置,日志级别,保留时间等

│ ··· ├─ network.yaml

网络相关配置,单机多节点配置时需更改端口等

│ ··· ├─ server.yaml

服务相关配置,如端口,tls等

│ ··· ├─ xchain-cli.yaml

xchain客户端相关配置,交易是否需要配置,交易发送节点等

├─ control.sh

启动脚本

├─ data

数据的存放目录,创世块信息,以及共识和合约的样例

│ ··· ├─ blockchain

账本目录

│ ··· ├─ keys

此节点的地址,具有全局唯一性

│ ··· ├─ netkeys

此节点的网络标识ID,具有全局唯一性

│ ··· └─ config

包括创始的共识,初始的资源数,矿工奖励机制等

├─ logs

程序日志目录

├─ tmp

临时文件夹,目前存储进程pid

2.1. 部署xchain服务

2.1.1. 启动服务

xuper5为我们启动服务提供了方便的脚本,只需要一条命令使用controll.sh即可启动单节点 single 共识的链。

  1. # 启动xuper链
  2. $ bash control.sh start
  3. /home/ubuntu/go/src/github.com/xuperchain/output/bin/xchain
  4. /home/ubuntu/go/src/github.com/xuperchain/output/conf/env.yaml
  5. 2021/08/10 19:26:57 start create chain.bc_name:xuper genesis_conf:./data/genesis/xuper.json env_conf:./conf/env.yaml
  6. 2021/08/10 19:26:57 create ledger succ.bc_name:xuper start xchain. cmd:nohup /home/ubuntu/go/src/github.com/xuperchain/output/bin/xchain startup --conf /home/ubuntu/go/src/github.com/xuperchain/output/conf/env.yaml >/home/ubuntu/go/src/github.com/xuperchain/output/logs/nohup.out 2>&1 &
  7. .start proc succ.
  8. start finish.pid:17242
  9. Done!

这样,我们就成功启动一条链。

control.sh 脚本提供 start | stop | restart | forcestop 四个命令,可以使用bash control.sh help查看

2.1.2. 确认服务状态

按照默认配置,xchain服务会监听37101端口,可以使用如下命令查看xchain服务的运行状态

  1. # check服务运行状况
  2. $ bin/xchain-cli status -H 127.0.0.1:37101
  3. {
  4. "blockchains": [
  5. {
  6. "name": "xuper",
  7. "ledger": {
  8. "rootBlockid": "d93c260ea5639a55e1fcad3df494495efad5c65d46e846b6db3a9194a4212886",
  9. "tipBlockid": "9555ca5af579db67734f27013dfaae48d93e4c3e8adcf6ca8f3dc1adb06d0b6f",
  10. "trunkHeight": 137
  11. },
  12. ....
  13. "9555ca5af579db67734f27013dfaae48d93e4c3e8adcf6ca8f3dc1adb06d0b6f"
  14. ]
  15. }
  16. ],
  17. "peers": null,
  18. "speeds": {}
  19. }

2.2. 基本功能的使用

2.2.1. 创建新账号

xchain中,账号类型分为“普通账号”和“合约账号”。

普通账号有程序离线生成,在本地保存;

合约账号是XuperChain中用于智能合约管理的单元,由普通账户发起交易,在链上生成的一个16位数字的账户,存储在链上。发起合约相关交易,比如合约调用时,需要使用合约账户。

  1. # 创建普通用户, 生成的地址,公钥,私钥在--output 指定位置
  2. $ bin/xchain-cli account newkeys --output data/bob
  3. create account using crypto type default
  4. create account in data/bob
  5. ## 创建合约账号
  6. bin/xchain-cli account new --account 1111111111111111 --fee 2000

在data/bob目录下会看到文件address,publickey,privatekey生成

2.2.2. 查询资源余额

对于普通账号,可使用如下命令查询账号资源余额,其中 -H 参数为xchain服务的地址

  1. # 根据账户存储的路径,查询该账户的余额。--keys为要查询的账户的地址
  2. $ bin/xchain-cli account balance --keys data/keys
  3. 100000000000338000000
  4. # 根据地址查询该账户余额
  5. $ bin/xchain-cli account balance TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY
  6. 100000000000401000000

2.2.3. 转账

转账操作需要提供源账号的私钥目录,也就类似“2.1.1 创建新账号”中生成的目录,这里注意到并不需要提供目标账号的任何密钥,只需要提供地址即可

  1. # --keys 从此地址 转给 --to地址 --amount 金额
  2. $ bin/xchain-cli transfer --to czojZcZ6cHSiDVJ4jFoZMB1PjKnfUiuFQ --amount 10 --keys data/keys/ -H 127.0.0.1:37101
  3. 24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4

命令执行的返回是转账操作的交易id(txid)

2.2.4. 查询交易信息

通过以下命令可以查询交易的信息,包括交易状态、交易的源和目标账号、交易的金额、所在的区块(如果已上链)等内容

  1. 1# 可查询上一步生成的txid的交易信息
  2. 2$ bin/xchain-cli tx query 24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4 -H 127.0.0.1:37101
  3. 3{
  4. 4 "txid": "24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4",
  5. 5 "blockid": "e83eae0750d0f48cc2b45f25d853fb587d124552851bf6693757e0715837b377",
  6. 6 "txInputs": [
  7. 7 {
  8. 8 "refTxid": "2650aa0c0e8088def98093a327b475fa7577fa8e266c5775435f7c022fe0f463",
  9. 9 "refOffset": 0,
  10. 10 "fromAddr": "TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY",
  11. 11 "amount": "1000000"
  12. 12 }
  13. 13 ],
  14. 14 ......
  15. 15 "authRequireSigns": [
  16. 16 {
  17. 17 "publickey": "{\"Curvname\":\"P-256\",\"X\":36505150171354363400464126431978257855318414556425194490762274938603757905292,\"Y\":79656876957602994269528255245092635964473154458596947290316223079846501380076}",
  18. 18 "sign": "30460221009509e35b1341284b5d1f22b48c862ecfe2856056196c5650bc203b8a4ed0d454022100f8d286c63ad8eb3bc605bc08da4ff417aaff3c0433a31039f608bb47a90b1267"
  19. 19 }
  20. 20 ],
  21. 21 "receivedTimestamp": 1628596303271475925,
  22. 22 "modifyBlock": {
  23. 23 "marked": false,
  24. 24 "effectiveHeight": 0,
  25. 25 "effectiveTxid": ""
  26. 26 }
  27. 27}

2.2.5. 查询block信息

通过blockid可以查询区块的相关信息,包括区块内打包的交易、所在链的高度、前驱/后继区块的id等内容

  1. # 可查询上一步交易所在的block id信息
  2. $ bin/xchain-cli block e83eae0750d0f48cc2b45f25d853fb587d124552851bf6693757e0715837b377 -H 127.0.0.1:37101
  3. {
  4. "version": 1,
  5. "blockid": "e83eae0750d0f48cc2b45f25d853fb587d124552851bf6693757e0715837b377",
  6. "preHash": "41c74e22ccea7dcf1db6ba0d7e1eefd6cfbd7bac7659c3d8cd33d2a009201003",
  7. "proposer": "TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY",
  8. "sign": "3044021f349da2d5c238175a6e7df23262eeb122014f0a0040fc4ce109a3ab2c22b2700221009d92198061193fcd47e25c8f5c2b54e1ea2ffb4aaab675384c4d6408ab2b63de",
  9. "pubkey": "{\"Curvname\":\"P-256\",\"X\":36505150171354363400464126431978257855318414556425194490762274938603757905292,\"Y\":79656876957602994269528255245092635964473154458596947290316223079846501380076}",
  10. "merkleRoot": "d22d2423a93911e42f96370167d878f6780fea44fac6a13771c7532e1969c949",
  11. "height": 492,
  12. ......
  13. "txCount": 2,
  14. "merkleTree": [
  15. "4a7e42654cf79d6525f6b6d55673b57a92048ee96de950e962db99b102e048a4",
  16. "24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4",
  17. "d22d2423a93911e42f96370167d878f6780fea44fac6a13771c7532e1969c949"
  18. ],
  19. "inTrunk": true,
  20. "nextHash": "a541ed97789537166bec5778aad7ba0f68e52a04d1073b244ee1ea6cd38d8f63",
  21. "failedTxs": null,
  22. "curTerm": 0,
  23. "curBlockNum": 0,
  24. "justify": {}
  25. }