百度XuperChain基于Ubuntu系统从零开始到部署简单合约
- 环境配置
- go语言安装
- git安装
- 客户端安装
- 启动私链
- 基本操作命令
- 1. 创建普通用户
- 2. 创建合约账号
- 3. 查询余额
- 4. 转账
- 5. 查询交易信息
- 6. 查询block信息
- 网络部署(选择性阅读)
- 1. 创建网络部署环境
- 2. 配置种子节点netURL、运行节点
- 编写一个Solidity合约
- 1. 提前准备
- 2. 编译合约
- 3. 部署合约
- 4. 调用合约
环境配置
目前 XuperChain 节点主要运行在linux和mac上,windows不能运行 XuperChain 节点。
go语言安装
ubuntu16.04下 通过apt-get install 安装go 默认版本为1.6。但百度区块链要求安装go版本为1.11或更高。如果不想做从官网下载go压缩包并解压、配置环境变量这些繁琐流程。可以尝试这篇帖子: link
帖子中详细介绍了直接将默认1.6低版本的升级为高版本go。
git安装
详情见百度区块链开发手册:link
$ sudo apt install git
客户端安装
使用git下载源码到本地:
$ git clone https://github.com/xuperchain/xuperchain.git
git完后当前目录有一个文件夹叫xuperchain。这个时候我们可以make一下了,输入命令
$ cd xuperchain
$ make
这里make一般出大问题。make完后一定要去xuperchain/output/bin文件夹看有没有出来三个可执行文件。
如果缺少xchain、xchain-cli文件,那就说明失败了。根据这两天改这个bug经验,总结有两个原因比较关键:
- 和国内网络防火墙有关。官方开发手册给出如下说明:
make 时,可能出现拉取失败的情况,可以配置GOPROXY解决此问题
$ export GOPROXY=https://goproxy.cn,direct
GOPATH问题报错,不推荐使用go1.11版本之前的版本
GCC版本需要升级到4或5以上
- go编译失败,会出现一长串go : could not … permission denied
此时不妨试试上述安装go目录给出的帖子,按照里面步骤更新一下go。
如果make成功,出现如下三个可执行文件,此时说明编译成功。
启动私链
启动命令:
$ bash control.sh start
这样,我们就成功启动一条链。在每次执行代码时都需要先进行启动操作。
control.sh 脚本提供 start | stop | restart | forcestop 四个命令,可以使用bash control.sh help查看。
也可以查看服务运行的状态:
$ bin/xchain-cli status -H 127.0.0.1:37101
基本操作命令
1. 创建普通用户
$ bin/xchain-cli account newkeys --output data/bob
生成的地址,公钥,私钥在–output 指定位置。可以看到在output/data/bob里面已经成功创建普通用户
2. 创建合约账号
$ bin/xchain-cli account new --account 1111111111111111 --fee 2000
3. 查询余额
根据账户存储的路径,查询该账户的余额。–keys为要查询的账户的地址
也可以根据地址查询该账户余额
$ bin/xchain-cli account balance --keys data/keys
$ bin/xchain-cli account balance TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY
注明:
两条命令查询的是同一个地址的余额,即目录output/data/keys的,和之前创建的bob无关。
打开keys文件夹,里面有一个address文件,点开即是地址的十六进制代码。
而回顾之前创建合约账号的文本中,记录了合约地址,同为Teyy …iydY:
至于为什么查询到的余额在不停的变化,可认为该合约是个公共合约,很多人在使用此合约进行各种转账操作。
为了验证说法正确性,可以去查询之前创建好的个人账户bob文件夹,文件夹里面同样有一个address文件,点开即是16进制地址,查询此地址的余额,发现是0,验证说法完成。
4. 转账
转账操作需要提供源账号的私钥目录,并不需要提供目标账号的任何密钥,只需要提供地址即可。
–keys 从此地址 转给 --to地址 --amount 金额
命令执行后,返回一个交易id(txid)。
$ bin/xchain-cli transfer --to czojZcZ6cHSiDVJ4jFoZMB1PjKnfUiuFQ --amount 10 --keys data/keys/ -H 127.0.0.1:37101
可以先查询此命令中地址czoj…iuFQ地址余额,为0。完成转账交易后,再次查询地址余额,说明转账交易完成。
5. 查询交易信息
根据上述转账操作得到的交易id c0ae…69e2,输入命令得到交易信息。
$ bin/xchain-cli tx query 交易id -H 127.0.0.1:37101
6. 查询block信息
通过上述查询txid可得到blockid的值,继而可以查询区块的相关信息,包括区块内打包的交易、所在链的高度、前驱/后继区块的id等内容。
$ bin/xchain-cli block txid中得到的blockid -H 127.0.0.1:37101
网络部署(选择性阅读)
1. 创建网络部署环境
部署说明:
第一,如果没有下载tree,返回到根目录下载安装tree
$ sudo apt install tree
第二,在执行如下命令时,需要先返回到xuperchain目录下,因为需要使用make命令编译出testnet,而编译文件makefile在xuperchain目录。
$ make testnet
编译完成后,xuperchain目录得到一个名为testnet的文件夹,输入命令:
$ tree testnet
此时网络配置完成。节点加入网络需要通过网络中一个或者多个种子节点,区块链网络中任何一个节点都可以作为种子节点,通过配置种子节点的网络连接地址netURL可以加入网络。
2. 配置种子节点netURL、运行节点
以node1为例。进入目录testnet/node1,输入命令查看node1节点连接地址netURL。
$ cd testnet/node1
$ ./bin/xchain-cli netURL preview
可以看到ip地址为127.0.0.1。实际使用时,需要将ip配置节点的真实ip,port配置成如下模板:
/ip4/{{ip地址}}/tcp/{{port配置}}/p2p/Qmf2HeHe4sspGkfRCTq6257Vm3UHzvh2TeQJHHvHzzuFw6
如果想给节点分配一个新的网络连接地址,可以使用如下命令:
$ cd node1
$ ./bin/xchain-cli netURL gen
使用cat命令可以查看p2p网络配置
$ cat conf/network.yaml
注意: 如果是部署在同一个节点上,p2p模块端口应该配置不同,同时不要和其他已经被占用的端口冲突
启动命令、查看运行状态命令:
$ bash ./control.sh start
$ ./bin/xchain-cli status -H :37101
注:如果是启动node2,则端口写37102;node3则写37103。
常见问题:
1、端口冲突:注意如果在一台机器上部署多个节点,各个节点的RPC监听端口以及p2p监听端口都需要设置地不相同,避免冲突;2、不同节点公私钥和netURL冲突:注意网络中不同节点./data/keys下的文件和./data/netkeys下的内容都应该不一样,这两个文件夹是节点在网络中的唯一标识,每个节点需要独自生成,否则网络启动异常;
3、启动时连接种子节点失败:注意要先将种子节点启动,再起动其他节点,否则会因为加入网络失败而启动失败;
编写一个Solidity合约
1. 提前准备
选择最为主流的Solidity语言来编译合约。Solidity是官方推出的编译语言。
用以下命令查看是否安装好solc 用于编译sol文件。
$ solc --version
如果显示没有安装,则使用如下命令安装:
$ sudo apt-get install solc
合约默认处于关闭状态,在部署、调用合约之前,请先查看 conf/contract.yaml 中如下图划红线部分,确保合约功能开启。
以counter合约为例来看如何编写一个Solidity合约。counter合约是一个简单的计数器合约,每调用一次合约即计数+1。
为简化操作,在/output/data目录下新建文件夹“shishi”(名字随便取的)。可以去图形化界面操作,比终端上输入命令简单。
在shishi文件夹里新建一个文本文档,重命名为Counter.sol
双击打开此文本文档,复制粘贴如下代码:
pragma solidity >=0.0.0;contract Counter {address owner;mapping (string => uint256) values;constructor() public{owner = msg.sender;}function increase(string memory key) public payable{values[key] = values[key] + 1;}function get(string memory key) view public returns (uint) {return values[key];}function getOwner() view public returns (address) {return owner;}}
保存后退出。
2. 编译合约
在当前目录新打开一个终端,通过solc编译合约源码,输入命令:
$ solc --bin --abi Counter.sol -o .
目录中出现两个文件,合约二进制文件和abi文件分别存放在当前目录下,Counter.bin和Counter.abi
–bin :表示需要生成合约二进制文件
–abi :表示需要生成合约abi文件,用于合约方法以及参数编解码
-o:表示编译结果输出路径
编译合约完成。
3. 部署合约
返回到output目录。部署合约前需要先向合约账户中转账,合约没有余额的话无法执行合约,也无法调用合约中函数,错误如图所示:(显示utxo error,即交易池中没有余额,不能执行命令。)
查询合约余额,为0
用如下命令给合约账户充值:
$ bin/xchain-cli transfer --to XC1111111111111111@xuper --amount 100000000
返回一个tx id,说明转账操作成功。合约账户有余额后即可部署合约了,用如下命令部署合约:
$ bin/xchain-cli evm deploy --account XC1111111111111111@xuper --cname counterevm --fee 5200000 Counter.bin --abi Counter.abi
合约部署完成。
4. 调用合约
接下来调用合约,合约中increase方法每调用一次,计数器加1。 调用合约get方法即可返回合约中的计数数值。命令如下:
# 合约increase方法调用
$ bin/xchain-cli evm invoke --method increase -a '{"key":"stones"}' counterevm --fee 22787517 --abi Counter.abi
# 合约get方法调用
$ bin/xchain-cli evm query --method get -a '{"key":"stones"}' counterevm --abi Counter.abi
通过上面运行截图可得到,执行第一句increase方法调用语句后,返回汽油费:支付费用和tx id,说明调用成功;执行第二局get方法调用语句后,看到返回的数字“1”,说明计数器合约成功执行。如果重复increase方法调用语句,则计数不断往上加,结果如下: