百度超级链的克隆与应用一(克隆)

这是我在参加2020年第四届中国区块链开发大赛时,因为采用指定的区块链可以加分,所以当时用的是百度超级链的方案。百度超级链属于联盟链方案,但与其他联盟链方案最大的不同有两个,一个是有币的概念,但不能随意交易;另一个是开发者相对活跃,提供了很多实用的例程。
可惜尽管进了复赛,但因为距离较远,来回费用比较高,再加上自己也没觉得做的东西多好,就放弃了。我将把当时一些资料整理一下,给大家公布一下。 需要强调一点的是,因为当时搜集的资料注释基本就都是中文的,我增加的注释也是中文的,所以也忘了哪个内容是我加的,哪个内容是原来有的,特此声明。
本章主要是对百度超级链进行克隆。

编译

首先是最简单的编译:
在ubuntu18环境下:
apt update
wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
tar -C /usr/local -xzf
go1.13.4.linux-amd64.tar.gz
nano /etc/profile
打开之后添加如下三行:
export GOROOT=/usr/local/goo:p
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/home/ubuntu/go
source /etc/profile
输入go version,看是否是1.13
apt install git
git clone -b v3.8 https://github.com/xuperchain/xuperchain.git
cd xuperchain
make
编译完毕后,
cd ./output
./xchain-cli createChain(创立一个测试链)
nohup ./xchain &(运行上面的测试链)
./xchain-cli status(查看区块链状态,可以反复运行)

创建与查看

一 创建新账号

xchain中,账号分为普通账号和“合约账号”,这里先介绍普通账号的创建,命令如下
创建普通用户, 包含地址,公钥,私钥
./xchain-cli account newkeys –output data/bob
在bob目录下会看到文件address,publickey,privatekey生成

二 查询资源余额

对于普通账号,可使用如下命令查询账号资源余额,其中 -H 参数为xchain服务的地址
./xchain-cli account balance –keys data/keys -H 127.0.0.1:37101

三 转账

转账操作需要提供源账号的私钥目录,也就类似“1.2.4.1”中生成的目录,这里注意到并不需要提供目标账号的任何密钥,只需要提供地址即可
–keys 从此地址 转给 –to地址 –amount 钱
./xchain-cli transfer –to czojZcZ6cHSiDVJ4jFoZMB1PjKnfUiuFQ –amount 10 –keys data/keys/ -H 127.0.0.1:37101

四 查询交易信息

通过以下命令可以查询交易的信息,包括交易状态、交易的源和目标账号、交易的金额、所在的区块(如果已上链)等内容
可查询上一步生成的txid的交易信息
./xchain-cli tx query cbbda2606837c950160e99480049e2aec3e60689a280b68a2d253fdd8a6ce931 -H 127.0.0.1:37101

五 查询block信息

通过blockid可以查询区块的相关信息,包括区块内打包的交易、所在链的高度、前驱/后继区块的id等内容
可查询上一步交易所在的block id信息
./xchain-cli block 0354240c8335e10d8b48d76c0584e29ab604cfdb7b421d973f01a2a49bb67fee -H 127.0.0.1:37101

监管合约

创建监管合约

目前超级链支持的监管合约主要有以下几个:
实名制合约: identity
DApp封禁合约: banned
合规性检查合约: complianceCheck
交易封禁合约: forbidden

一 编译实名合约

实名合约代码路径如下:core/contractsdk/cpp/reserved/identity.cc
实名合约实名的对象是一个具体的ak。
apt install docker.io(原教程里面没写)
cd ./contractsdk/cpp
./build.sh
然后会在build文件夹里面出现很多编译后的结果。

二 创建合约账户

./xchain-cli account new –account 1111111111111111
第一次会提示需要多少fee
然后再运行一次
./xchain-cli account new –account 1111111111111111 –fee 1000

三 转移资源

./xchain-cli transfer –to XC1111111111111111@xuper –amount 100000

四 部署实名合约

通过 -a 的creator参数,可以初始化被实名的ak。
./xchain-cli wasm deploy –account XC1111111111111111@xuper –cname identity -H localhost:37101 identity.wasm -a ‘{“creator”:”addr1″}’
第一次运行显示需要多少gas。然后再运行一次,后面添加 –fee n(n就是多少gas)

合约制作

一 设置环境变量

这些环境变量有助于我们更方便的执行一些命令而不用指定命令的全路径。
export PATH=$HOME/xuperchain/output:$PATH
export XDEV_ROOT=$HOME/xuperchain/core/contractsdk/cpp
启动xuperchain
–vm ixvm参数是选择ixvm合约虚拟机,开发合约过程中使用ixvm虚拟机能加快合约部署
$ cd output

二 首先创建链

$ ./xchain-cli createChain

后台启动xuperchain节点

$ nohup ./xchain –vm ixvm &

三 创建合约账号

合约账号用来进行合约管理,比如合约的权限控制等,要部署合约必须创建合约账号,同时合约账号里面需要有充足的xuper来部署合约。
创建合约账号XC1111111111111111@xuper.
./xchain-cli account new –account 1111111111111111 –fee 2000
./xchain-cli transfer –to XC1111111111111111@xuper –amount 100000000
至此我们完成了所有的准备工作,包括编译xuperchain,创建链,启动节点,创建合约账号,后面我们开始体验怎么编译,部署和调用智能合约。

四 合约工程模板

xdev提供了一个默认的c++合约工程模板
$ xdev init hello-cpp
这个命令创建了一个hello-cpp的合约工程
第一次编译的时间会长一点,因为xdev需要下载编译器镜像,以及编译超级链的标准库。
$ xdev build -o hello.wasm
CC main.cc
LD wasm
编译结果为hello.wasm,后面我们使用这个文件来部署合约
./xchain-cli wasm deploy –account XC1111111111111111@xuper –cname hello –fee 5200000 –runtime c ./hello-cpp/hello.wasm
调用合约
$ ./xchain-cli wasm invoke –method hello –fee 110000 hello
下一篇文章对百度超级链做一些技术上的概述。