文章目录
一、环境准备
1. 安装golang-1.16.x
-
安装众多需要的包
yum update -y && yum install -y git gcc-c++ wget make vim
-
获取golang安装包,当前是1.16版本(2021-07-20)
wget https://studygolang.com/dl/golang/go1.16.6.linux-amd64.tar.gz
建议不要使用最新版本,因为会发生go语言示例合约部署失败,需要安装go1.13.x版本,以下命令使用go1.13.x,输入记录未作修改,仍使用1.16版本
wget https://golang.google.cn/dl/go1.13.14.linux-amd64.tar.gz
结果:。。。 Saving to: ‘go1.16.6.linux-amd64.tar.gz’ 100%[===================================================================================================================================================>] 129,049,323 11.8MB/s in 9.2s 。。。
查看当前文件目录
[root@localhost ~]# ll total 126032 drwxr-xr-x. 2 root root 6 Jul 20 09:49 blockdata -rw-r--r--. 1 root root 129049323 Jul 13 06:21 go1.16.6.linux-amd64.tar.gz -rw-r--r--. 1 root root 1088 Jul 20 09:51 initblockdata.json
-
解压golang安装包,并设置环境
# 逐条执行 # 将go的安装包解压至/usr/local tar -C /usr/local -zxf go1.16.6.linux-amd64.tar.gz # 设置环境变量 echo "export GOROOT=/usr/local/go" >> /etc/profile # 设置环境变量 echo "export PATH=/usr/local/go/bin:$PATH" >> /etc/profile # 使环境变量生效 source /etc/profile
结果:
/usr/local/
目录下,有了go目录[root@localhost ~]# ll /usr/local/ total 0 drwxr-xr-x. 2 root root 6 Apr 11 2018 bin drwxr-xr-x. 2 root root 6 Apr 11 2018 etc drwxr-xr-x. 2 root root 6 Apr 11 2018 games drwxr-xr-x. 10 root root 272 Jul 13 04:01 go drwxr-xr-x. 2 root root 6 Apr 11 2018 include drwxr-xr-x. 2 root root 6 Apr 11 2018 lib drwxr-xr-x. 2 root root 6 Apr 11 2018 lib64 drwxr-xr-x. 2 root root 6 Apr 11 2018 libexec drwxr-xr-x. 2 root root 6 Apr 11 2018 sbin drwxr-xr-x. 5 root root 49 Jul 19 11:02 share drwxr-xr-x. 2 root root 6 Apr 11 2018 src
在
/etc/profile
文件中,末尾出现如下内容:export GOROOT=/usr/local/go export PATH=/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
-
使设置的环境变量生效
source /etc/profile
-
验证生效
go version
设置编译时下载go依赖包的全局代理
go env -w GOPROXY=https://goproxy.cn
输出如下内容:
[root@localhost ~]# go version go version go1.16.6 linux/amd64
二、 安装百度超级链
注意:官方开源文档版本落后
2.1 下载百度超级链的源码,本次使用v3.6版本
以下命令在/root/tools
目录下执行。
git clone https://github.com/xuperchain/xuperchain.git
进入文件夹:
cd xuperchain
列出源码的所有分支:
git branch -a
切换到v3.6的分支:
git checkout -b v3.6
接着编译v3.6版本的百度超级链源码:
make
编译后的目录结构:
build.sh
CONTRIBUTING_CN.md
CONTRIBUTING.md
core
Dockerfile
event_client
front
go.mod
go.sum
LICENSE
Makefile
output
README.md
vendor
visual
2.2 基本的命令
以下命令,在/root/tools/xuperchain/output
目录下执行:
注意:新版的超级链output目录结构有变动,在以下命令中添加对应output目录下的bin目录
# 1.在启动超级链之前,要先创建xuper链,创世区块
./xchain-cli createChain
# 2.启动链服务
nohup ./xchain &
# 3. 查看超级链的运行状态
./xchain-cli status -H 127.0.0.1:37101
# 4. 创建新的普通账户
# 创建普通用户, 包含地址,公钥,私钥
./xchain-cli account newkeys --output data/bob
# 在bob目录下会看到文件address,publickey,privatekey生成
# 5. 查看普通账户的address,publickey,privatekey
head data/commonAcc/** && echo
# 5.1 查看commonAcc这个账户的余额
./xchain-cli account balance --keys data/commonAcc -H 127.0.0.1:37101
输入: 0
# 6. 查询超级链的资源余额
./xchain-cli account balance --keys data/keys -H 127.0.0.1:37101
输出: 100000000000222000000 # 钱的数额会不断增加
# 7. 从源账户 转账 给目标账户
# --keys 从此地址 转给 --to地址 --amount 钱
./xchain-cli transfer --to SiT5HPVJqATtePfBCkyt6TsPQibjBZhYx --amount 10 --keys data/keys/ -H 127.0.0.1:37101
# 8. 查看转账交易详情
./xchain-cli tx query 0b79a1315220e590d8832fa1a8b3d88a74b540284d197246e65e3c59d605d817
# 9. 查看这笔交易的区块的详情
./xchain-cli block d5eb4550cf8821fdd311ded9794b002fe068deb86925f0abe3851204a0cbc1ae -H 127.0.0.1:37101
# 10. 创建合约账户
./xchain-cli account new --account 1111111111111111 --fee 1000
# 11. 向合约账户转账钱币,用以后续合约部署的手续费
./xchain-cli transfer --to XC1111111111111111@xuper --amount 100000000000 --keys data/keys -H 127.0.0.1:37101
# 12. 查询合约账户的acl(访问控制权限)
./xchain-cli acl query --account XC1111111111111111@xuper --host 14.215.179.74:37101
# 13. 部署合约,native表示--如果本地搭建 XuperChain 环境,在部署、调用 native 合约之前,请先查看`conf/xchain.yaml` 中native一节,确保native合约功能开启
./xchain-cli native deploy --account XC1111111111111111@xuper --fee 15587517 --runtime go -a '{"creator":"XC1111111111111111@xuper"}' --cname golangcounter ../core/contractsdk/go/example/counter/counter
三、超级链编译c++合约,需要docker容器
3.1 docker容器内 安装docker
-
方式一:在docker容器内,按照菜鸟教程-docker教程的命令安装docker。
缺点:- 1.在docker容器中再次安装docker,造成容器臃肿;
- 2.经过安装测试,发现在启动容器内的docker服务时,会报错,如下:
[root@06f8fa078a20 output]# systemctl start docker
Job for docker.service failed because the control process exited with error code.
See “systemctl status docker.service” and “journalctl -xe” for details.
未解决 -
方式二:通过宿主机的docker.sock,相当于将宿主机的docker指令映射到容器内
参考博客:https://www.cnblogs.com/kingsonfu/p/11578073.html
3.2 编译C++合约与部署到本地链
可以参考官方开源文档,实测可以部署完成。
四、超级链编译go示例合约,并部署
在编译go语言合约时,出现了一些问题:
…500-50501-contract invoke failed+waiting native code start timeout…
经过查询官方git仓库的提问后,发现使用go1.13版本可以解决该问题,所以make
百度超级链源码,与编译go示例合约,建议使用go1.13.x版本。
4.1 具体的编译go合约与部署上链
根据官方开源文档中使用以下命令部署合约:
./xchain-cli native deploy --account XC1111111111111111@xuper --fee 15587517 --runtime go -a '{"creator":"XC1111111111111111@xuper"}' --cname golangcounter ../core/contractsdk/go/example/counter/counter
但是,在v3.6版本中./xchain-cli native deploy
命令中,猜测历经版本迭代,已经缺少了很多的参数,如--account
,--runtime
等,所以要使用另一种构建go合约为wasm格式的合约,然后在部署上链的操作
编译go合约源码
GOOS=js GOARCH=wasm go build -o counter.wasm
输出的是counter.wasm 合约
然后,上链命令:
./xchain-cli wasm deploy --account XC1111111111111111@xuper --fee 15587517 --runtime go -a '{"creator":"XC1111111111111111@xuper"}' --cname golangcounter ../core/contractsdk/go/example/counter/counter.wasm
上链耗时几分钟,等待一会即可。
4.2 验证合约部署成功:
# 1.调用 合约中的方法,使用合约的别称 golang,计数加1
./xchain-cli wasm invoke --method Increase -a '{"key":"test"}' golangcounter --fee 1000000
# 2. 输出合约调用次数
./xchain-cli wasm query --method Get -a '{"key":"test"}' golangcounter
输出:contract response: 1