XuperChain 百度区块链简易学习帖

百度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文件夹看有没有出来三个可执行文件。
XuperChain 百度区块链简易学习帖_第1张图片
如果缺少xchain、xchain-cli文件,那就说明失败了。根据这两天改这个bug经验,总结有两个原因比较关键:

  1. 和国内网络防火墙有关。官方开发手册给出如下说明:

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

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

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

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

  1. go编译失败,会出现一长串go : could not … permission denied
    此时不妨试试上述安装go目录给出的帖子,按照里面步骤更新一下go。
    如果make成功,出现如下三个可执行文件,此时说明编译成功。
    XuperChain 百度区块链简易学习帖_第2张图片

启动私链

启动命令:

$ bash control.sh start

XuperChain 百度区块链简易学习帖_第3张图片
这样,我们就成功启动一条链。在每次执行代码时都需要先进行启动操作。
control.sh 脚本提供 start | stop | restart | forcestop 四个命令,可以使用bash control.sh help查看。
也可以查看服务运行的状态:

$ bin/xchain-cli status -H 127.0.0.1:37101

XuperChain 百度区块链简易学习帖_第4张图片

基本操作命令

1. 创建普通用户

$ bin/xchain-cli account newkeys --output data/bob

生成的地址,公钥,私钥在–output 指定位置。可以看到在output/data/bob里面已经成功创建普通用户
XuperChain 百度区块链简易学习帖_第5张图片

2. 创建合约账号

$ bin/xchain-cli account new --account 1111111111111111 --fee 2000

XuperChain 百度区块链简易学习帖_第6张图片

3. 查询余额

根据账户存储的路径,查询该账户的余额。–keys为要查询的账户的地址
也可以根据地址查询该账户余额

$ bin/xchain-cli account balance --keys data/keys
$ bin/xchain-cli account balance TeyyPLpp9L7QAcxHangtcHTu7HUZ6iydY

在这里插入图片描述
注明:
两条命令查询的是同一个地址的余额,即目录output/data/keys的,和之前创建的bob无关。
打开keys文件夹,里面有一个address文件,点开即是地址的十六进制代码。
XuperChain 百度区块链简易学习帖_第7张图片
而回顾之前创建合约账号的文本中,记录了合约地址,同为Teyy …iydY:
XuperChain 百度区块链简易学习帖_第8张图片
至于为什么查询到的余额在不停的变化,可认为该合约是个公共合约,很多人在使用此合约进行各种转账操作。
为了验证说法正确性,可以去查询之前创建好的个人账户bob文件夹,文件夹里面同样有一个address文件,点开即是16进制地址,查询此地址的余额,发现是0,验证说法完成。
XuperChain 百度区块链简易学习帖_第9张图片

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

XuperChain 百度区块链简易学习帖_第10张图片

6. 查询block信息

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

$ bin/xchain-cli block txid中得到的blockid -H 127.0.0.1:37101

XuperChain 百度区块链简易学习帖_第11张图片

网络部署(选择性阅读)

1. 创建网络部署环境

部署说明:
第一,如果没有下载tree,返回到根目录下载安装tree

$ sudo apt install tree

第二,在执行如下命令时,需要先返回到xuperchain目录下,因为需要使用make命令编译出testnet,而编译文件makefile在xuperchain目录。

$ make testnet

编译完成后,xuperchain目录得到一个名为testnet的文件夹,输入命令:

$ tree testnet

XuperChain 百度区块链简易学习帖_第12张图片
此时网络配置完成。节点加入网络需要通过网络中一个或者多个种子节点,区块链网络中任何一个节点都可以作为种子节点,通过配置种子节点的网络连接地址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

XuperChain 百度区块链简易学习帖_第13张图片

注意: 如果是部署在同一个节点上,p2p模块端口应该配置不同,同时不要和其他已经被占用的端口冲突

启动命令、查看运行状态命令:

$ bash ./control.sh start
$ ./bin/xchain-cli status -H :37101

XuperChain 百度区块链简易学习帖_第14张图片

注:如果是启动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 中如下图划红线部分,确保合约功能开启。
XuperChain 百度区块链简易学习帖_第15张图片
以counter合约为例来看如何编写一个Solidity合约。counter合约是一个简单的计数器合约,每调用一次合约即计数+1。
为简化操作,在/output/data目录下新建文件夹“shishi”(名字随便取的)。可以去图形化界面操作,比终端上输入命令简单。
XuperChain 百度区块链简易学习帖_第16张图片
在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:表示编译结果输出路径

XuperChain 百度区块链简易学习帖_第17张图片
XuperChain 百度区块链简易学习帖_第18张图片
编译合约完成。

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方法调用语句,则计数不断往上加,结果如下:
在这里插入图片描述

你可能感兴趣的:(硕士学习,1024程序员节)