引言
本文章是基于xuperchain官方技术文档整理,并把环境部署遇到的问题以及有些命令和它的输出的具体含义整理进去,方便大家更方便地去理解和解决问题!!!,如果想更深入了解xuperchain,可以阅读[xuperchain官方技术文档]
目录
文章目录
1.1. 准备环境
XuperChain主要由Golang开发,需要首先准备编译运行的环境
- 安装go语言编译环境
$ sudo apt update
$ sudo apt install golang
- 安装git
$ sudo apt update
$ sudo apt install git
1.2. 编译XuperChain
-
切换root用户,在/目录创建工作目录
su - root mkdir blockchain cd blockchain
-
使用git下载源码到本地
git clone https://github.com/xuperchain/xuperchain.git
-
执行命令
$ cd xuperchain
$ git checkout -b v5.1.0 v5.1.0
$ make
- 在output目录得到bin,conf, data 三个文件夹以及一个 control.sh 脚本
注解
1.make 时,可能出现拉取失败的情况,可以配置GOPROXY解决此问题
$ export GOPROXY=https://goproxy.cn,direct
GOPATH问题报错,不推荐使用go1.11版本之前的版本
GCC版本需要升级到4或5以上
2.make编译报错如下时:
Environment variable XVM_BUILD_MAIN not set
make[1]: *** [Makefile:36: guard-XVM_BUILD_MAIN] Error 1
make[1]: *** Waiting for unfinished jobs…
g++ -I. -Isrc -MMD -MP -std=c++11 -c src/tools/wasm2c.cc -o build/src/tools/wasm2c.cc.o
make[1]: Leaving directory ‘/root/xuperchain/.compile_cache/xvm/xvm/compile/wabt’
complie xvm failed
make: *** [Makefile:24: xvm] Error 1这里的问题就是在xuperchain/auto/build_xvm.sh脚本内没设置guard-XVM_BUILD_MAIN变量
解决办法:
vim auto/build_xvm.sh
加入export XVM_BUILD_MAIN=0
3.Go模块下载超时的问题
go: github.com/ChainSafe/go-schnorrkel@v0.0.0-20200626160457-b38283118816: Get “https://proxy.golang.org/github.com/%21chain%21safe/go-schnorrkel/@v/v0.0.0-20200626160457-b38283118816.mod”: dial tcp 142.251.43.17:443: i/o timeout
go build -o /xuperchain/output/bin/xchain-cli -ldflags “-X main.Version=heads/v5.1.0 -X main.BuildTime=2023-06-15-19:26:37 -X main.CommitID=e235881” /xuperchain/cmd/client/main.go
go: github.com/ChainSafe/go-schnorrkel@v0.0.0-20200626160457-b38283118816: Get “https://proxy.golang.org/github.com/%21chain%21safe/go-schnorrkel/@v/v0.0.0-20200626160457-b38283118816.mod”: dial tcp 172.217.163.49:443: i/o timeout
go: downloading github.com/golang/protobuf v1.4.2
go: downloading github.com/manifoldco/promptui v0.7.0
go: downloading github.com/xuperchain/burrow v0.30.6-0.20210115120720-3da1be35a1e2
go: downloading github.com/spf13/cobra v1.0.0
go: downloading github.com/spf13/viper v1.6.2
go: downloading github.com/xuperchain/crypto v0.0.0-20201028025054-4d560674bcd6
go: downloading github.com/xuperchain/xupercore v0.0.0-20210608021245-b15f81dd9ecf
go: downloading google.golang.org/grpc v1.33.1
go: downloading github.com/grpc-ecosystem/grpc-gateway v1.16.0
go: downloading google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
go: github.com/ChainSafe/go-schnorrkel@v0.0.0-20200626160457-b38283118816: Get “https://proxy.golang.org/github.com/%21chain%21safe/go-schnorrkel/@v/v0.0.0-20200626160457-b38283118816.mod”: dial tcp 172.217.163.49:443: i/o timeout
compile done!这里的错误信息显示在下载
github.com/ChainSafe/go-schnorrkel@v0.0.0-20200626160457-b38283118816
模块时发生了连接超时解决办法:
配置代理以解决Go模块下载的问题
设置
GOPROXY
环境变量为https://goproxy.cn
,这将使用国内镜像源作为代理vim /etc/profile
加入export GOPROXY=https://goproxy.cn
source /etc/profile
make编译完成后,在output下,有bin, conf, data三个目录,以及一个control.sh 脚本
各目录的功能如下表:
目录名 | 功能 |
---|---|
output/ | 节点根目录 |
├─ bin | 可执行文件存放目录 |
│ ··· ├─ wasm2c | XVM 虚拟机工具,将 WASM 转为 C |
│ ··· ├─ xchain | xchain服务的二进制文件 |
│ ··· ├─ xchain-cli | xchain客户端工具,用于与XuperChain区块链进行交互的命令行工具 |
├─ conf | 配置相关目录 |
│ ··· ├─ contract.yaml | 合约配置相关 |
│ ··· ├─ 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,具有全局唯一性 |
│ ··· └─ genesis | 包括创始的共识,初始的资源数,矿工奖励机制等 |
├─ logs | 程序日志目录(启动链之后生成) |
├─ tmp | 临时文件夹,目前存储进程pid(启动链之后生成) |
**
**
XuperChain命令和选项解析:
**
XuperChain(一个高性能、可扩展的区块链底层引擎)的命令行工具xchain-cli的帮助文档。以下是主要的命令和选项:
account:操作账户或地址,如余额查询、新建账户等。
acl:操作访问控制列表(ACL)。
block:操作区块。
consensus:共识模块命令,如状态查询、调用等。
contract:操作合约命令,如查询。
evm:操作EVM合约,如部署、升级、调用、查询等。
governToken:管理代币,如初始化、转账、查询等。
help:获取任何命令的帮助信息。
multisig:使用多签名操作命令,如检查、生成、发送、签名、获取等。
native:操作原生合约,如部署、升级、调用、查询等。
netURL:操作网络URL,如生成、获取、预览、转换等。
proposal:提案命令,如发起提案、投票、解冻、查询等。
status:获取当前XuperChain服务器状态的命令。
tdpos:与TDPOS相关的命令,如查询候选节点、检查结果、提名记录等。
transfer:操作转账交易,如在账户或公钥之间转移代币。
tx:操作交易命令,如查询。
utxo:操作UTXO,如列表、合并、拆分等。
vote:操作投票命令。
wasm:与WASM相关的命令,如部署、调用、查询等。
watch:观察区块事件。
可选标志: -C, --conf string:客户端配置文件(默认为"./conf/xchain-cli.yaml")。 --crypto string:加密类型(默认为"default")。 -h, --help:xchain-cli的帮助信息。 -H, --host string:服务器节点IP和端口(默认为"127.0.0.1:37101")。 --keys string:密钥目录(默认为"./data/keys")。 --name string:区块链名称(默认为"xuper")。 -v, --version:xchain-cli的版本信息。
要获取有关特定命令的更多信息,请使用"xchain-cli [command] --help"。
**
2.1. 部署xchain服务
2.1.1. 启动服务
xuper5为我们启动服务提供了方便的脚本,只需要一条命令使用controll.sh即可启动单节点 single 共识的链。
# 启动xuper链
$ bash control.sh start
/xuperchain/output/bin/xchain
/xuperchain/output/conf/env.yaml
2023/06/15 19:39:41 start create chain.bc_name:xuper genesis_conf:./data/genesis/xuper.json env_conf:./conf/env.yaml
2023/06/15 19:39:41 create ledger succ.bc_name:xuper
start xchain. cmd:nohup /xuperchain/output/bin/xchain startup --conf /xuperchain/output/conf/env.yaml >/xuperchain/output/logs/nohup.out 2>&1 &
.start proc succ.
start finish.pid:16259
Done!
运行bash control.sh start命令成功启动了XuperChain节点。以下是命令执行输出的解释:
/xuperchain/output/bin/xchain 表示已经编译好的可执行文件路径。/xuperchain/output/conf/env.yaml 是配置文件的路径。
2023/06/15 19:39:41 start create chain.bc_name:xuper genesis_conf:./data/genesis/xuper.json env_conf:./conf/env.yaml 表示正在创建一个名为"xuper"的区块链,并使用位于./data/genesis/xuper.json的创世配置和位于./conf/env.yaml的环境配置。
2023/06/15 19:39:41 create ledger succ.bc_name:xuper 表示成功创建了名为"xuper"的账本。
start xchain. cmd:nohup /xuperchain/output/bin/xchain startup --conf /xuperchain/output/conf/env.yaml >/xuperchain/output/logs/nohup.out 2>&1 & 表示启动xchain节点的命令,将日志输出到/xuperchain/output/logs/nohup.out文件中。
.start proc succ. 表示启动进程成功。
start finish.pid:16259 表示启动过程已完成,进程ID为16259。
Done! 表示整个启动过程已完成。
通过这些输出,可以确认XuperChain节点已成功启动。
这样,我们就成功启动一条链。
control.sh 脚本提供 start | stop | restart | forcestop 四个命令,可以使用bash control.sh help查看
2.1.2. 确认服务状态
按照默认配置,xchain服务会监听37101端口,可以使用如下命令查看xchain服务的运行状态
# check服务运行状况
$ bin/xchain-cli status -H 127.0.0.1:37101
{
"blockchains": [
{
"name": "xuper",
"ledger": {
"rootBlockid": "d93c260ea5639a55e1fcad3df494495efad5c65d46e846b6db3a9194a4212886",
"tipBlockid": "9555ca5af579db67734f27013dfaae48d93e4c3e8adcf6ca8f3dc1adb06d0b6f",
"trunkHeight": 137
},
....
"9555ca5af579db67734f27013dfaae48d93e4c3e8adcf6ca8f3dc1adb06d0b6f"
]
}
],
"peers": null,
"speeds": {}
}
2.2. 基本功能的使用
2.2.1. 创建新账号
xchain中,账号类型分为“普通账号”和“合约账号”。
普通账号由程序离线生成,在本地保存;
合约账号是XuperChain中用于智能合约管理的单元,由普通账户发起交易,在链上生成的一个16位数字的账户,存储在链上。发起合约相关交易,比如合约调用时,需要使用合约账户。
# 创建普通用户, 生成的地址,公钥,私钥在--output 指定位置
$ bin/xchain-cli account newkeys --output data/bob
create account using crypto type default
create account in data/bob
# xuperchain 也支持国密算法,关于xuperchain中的密码学,可在 `密码学基础<../design_documents/crypto.html>` 了解更多
$ bin/xchain-cli account newkeys --output data/alice --crypto gm
create account using crypto type gm
create account in data/alice
## 创建合约账号
bin/xchain-cli account new --account 1111111111111111 --fee 2000
contract response:
{
"pm": {
"rule": 1,
"acceptValue": 1.0
},
"aksWeight": {
"TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY": 1.0
}
}
The gas you cousume is: 1000
The fee you pay is: 2000
Tx id: b4c588a52e0d35a9388f0583a58c3adc0865b1fee1d5242268e66b9f3daae3c1
account name: XC1111111111111111@xuper
执行命令bin/xchain-cli account new --account 1111111111111111 --fee 2000时,发生了以下操作和结果
在data/bob目录下会看到文件address,publickey,privatekey生成
2.2.2. 查询资源余额
对于普通账号,可使用如下命令查询账号资源余额,其中 -H 参数为xchain服务的地址
# 根据账户存储的路径,查询该账户的余额。--keys为要查询的账户的地址,如 bob:--keys data/bob
$ bin/xchain-cli account balance --keys data/bob -H 127.0.0.1:37101
100000000000338000000
# 根据地址查询该账户余额
$ bin/xchain-cli account balance TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY -H 127.0.0.1:37101
100000000000401000000
# 查询合约账户余额
$ bin/xchain-cli account balance XC1111111111111111@xuper -H 127.0.0.1:37101
0
2.2.3. 转账
转账操作需要提供源账号的私钥目录,也就类似“2.1.1 创建新账号”中生成的目录,这里注意到并不需要提供目标账号的任何密钥,只需要提供地址即可
# --keys 从此地址 转给 --to地址 --amount 金额
$ bin/xchain-cli transfer --to czojZcZ6cHSiDVJ4jFoZMB1PjKnfUiuFQ --amount 10 --keys data/keys/ -H 127.0.0.1:37101
24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4
命令执行的返回是转账操作的交易id(txid) … note:
转账操作如果不加参数 --keys,即未指定扣款账户,将会默认扣除 data/keys 下账户的资源,该账户是默认生成的,创建链时会预分配一些资源
给到该账户,具体可以参考 data/genesis/xuper.json
2.2.4. 查询交易信息
通过以下命令可以查询交易的信息,包括交易状态、交易的源和目标账号、交易的金额、所在的区块(如果已上链)等内容
# 可查询上一步生成的txid的交易信息
$ bin/xchain-cli tx query 24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4 -H 127.0.0.1:37101
{
"txid": "24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4",
"blockid": "e83eae0750d0f48cc2b45f25d853fb587d124552851bf6693757e0715837b377",
"txInputs": [
{
"refTxid": "2650aa0c0e8088def98093a327b475fa7577fa8e266c5775435f7c022fe0f463",
"refOffset": 0,
"fromAddr": "TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY",
"amount": "1000000"
}
],
......
"authRequireSigns": [
{
"publickey": "{\"Curvname\":\"P-256\",\"X\":36505150171354363400464126431978257855318414556425194490762274938603757905292,\"Y\":79656876957602994269528255245092635964473154458596947290316223079846501380076}",
"sign": "30460221009509e35b1341284b5d1f22b48c862ecfe2856056196c5650bc203b8a4ed0d454022100f8d286c63ad8eb3bc605bc08da4ff417aaff3c0433a31039f608bb47a90b1267"
}
],
"receivedTimestamp": 1628596303271475925,
"modifyBlock": {
"marked": false,
"effectiveHeight": 0,
"effectiveTxid": ""
}
}
2.2.5. 查询block信息
通过blockid可以查询区块的相关信息,包括区块内打包的交易、所在链的高度、前驱/后继区块的id等内容
# 可查询上一步交易所在的block id信息
$ bin/xchain-cli block e83eae0750d0f48cc2b45f25d853fb587d124552851bf6693757e0715837b377 -H 127.0.0.1:37101
{
"version": 1,
"blockid": "e83eae0750d0f48cc2b45f25d853fb587d124552851bf6693757e0715837b377",
"preHash": "41c74e22ccea7dcf1db6ba0d7e1eefd6cfbd7bac7659c3d8cd33d2a009201003",
"proposer": "TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY",
"sign": "3044021f349da2d5c238175a6e7df23262eeb122014f0a0040fc4ce109a3ab2c22b2700221009d92198061193fcd47e25c8f5c2b54e1ea2ffb4aaab675384c4d6408ab2b63de",
"pubkey": "{\"Curvname\":\"P-256\",\"X\":36505150171354363400464126431978257855318414556425194490762274938603757905292,\"Y\":79656876957602994269528255245092635964473154458596947290316223079846501380076}",
"merkleRoot": "d22d2423a93911e42f96370167d878f6780fea44fac6a13771c7532e1969c949",
"height": 492,
......
"txCount": 2,
"merkleTree": [
"4a7e42654cf79d6525f6b6d55673b57a92048ee96de950e962db99b102e048a4",
"24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4",
"d22d2423a93911e42f96370167d878f6780fea44fac6a13771c7532e1969c949"
],
"inTrunk": true,
"nextHash": "a541ed97789537166bec5778aad7ba0f68e52a04d1073b244ee1ea6cd38d8f63",
"failedTxs": null,
"curTerm": 0,
"curBlockNum": 0,
"justify": {}
}
6b6d55673b57a92048ee96de950e962db99b102e048a4",
"24d53ea6e61ede8dc4fe65a04fd30da17c079a359e700738f8795dfddc55ffb4",
"d22d2423a93911e42f96370167d878f6780fea44fac6a13771c7532e1969c949"
],
"inTrunk": true,
"nextHash": "a541ed97789537166bec5778aad7ba0f68e52a04d1073b244ee1ea6cd38d8f63",
"failedTxs": null,
"curTerm": 0,
"curBlockNum": 0,
"justify": {}
}