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文件夹看有没有出来三个可执行文件。
在这里插入图片描述
如果缺少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成功,出现如下三个可执行文件,此时说明编译成功。
    在这里插入图片描述

启动私链

启动命令:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建议收藏,轻松搞懂区块链

未来已来,只是不均衡地分布在当下 大家好,我是菜农,欢迎来到我的频道。 本文共 5844字,预计阅读 30 分钟 区块链是近些年来最热门的前沿技术,被认为是未来十几年对金融、物联网、医疗等诸多领域产生最大影响的"…

都说区块链可信,到底信了个啥?

‍‍ 题图摄于北京二环路 【前言】不时有朋友向我询问某某区块链项目怎么样。我通常只给他们讲一点:要考察项目中区块链的信任体系。不管项目方说得怎样天马行空,看懂其中的信任机制,就基本可判断其项目的价值。 最近热门词汇层出不穷&#x…

如果你还不懂区块链那就out了(二)--区块链的演化及应用场景

前面我们介绍了很多区块链的知识,可能大家会有以下几个疑问: 1、区块链用于溯源,如果供应链上的参与方自己造假,在中途将实物替换掉,区块链宣称的不可更改不就无效了吗? 答:造假会有相应的惩罚措…

总搞不懂区块链各共识机制的优缺点?来听听这位十多年经验技术老兵的吐血分享吧!

2018区块链技术及应用峰会 (BTA)中国 倒计时5天 2018,想要follow最火的区块链技术?你还差一场严谨纯粹的技术交流会——2018区块链技术及应用峰会(BTA)中国将于2018年3月30-31日登陆北京喜来登长城饭店。追求专业性?你要的这里全都有&#xf…

区块、链和共识

区块、链和共识 💡 区块链的基础数据结构 准备 Hash Hash也称散列、哈希。基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出(更多解释见知乎) 特点是:相同的输入一定得到相同的输出,不同的输…

都2021年了,还不知道什么是区块链就out了 | 从区块链数据结构到应用

序言 在现阶段及后10年都是发展主流的数字化经济的催动下,区块链技术越来越火爆。那么比特币的区块数据结构是如何构成的,区块链有什么特性,我们用区块链能用来做什么?我们一起来探讨下。 区块链诞生背景 2008年11月1日&#xff0…

基于区块链的内容社交平台,他们凭什么说比知乎更吸引人?

本堂茜 渡鸦区块链专栏记者 张杰拥有10多年的软件开发经验和创业经验,自称是“互联网老兵,区块链新秀”。随着互联网的发展,渐渐的他们不再满足于做线下的软件外包项目,更想在互联网方面做。 他们在互联网方面做了很多SAAS服务。例…

在清华讲区块链,高晓松竟这样解读共识与Token

本文仅代表作者观点 作者 | 李画 编辑 | 秦晋 高晓松2019年的第一期《晓说》,在母校清华大学做了以一场没有"诗和远方"全是苟且的演讲:《5G与区块链:文创产业的重要赛道》。他认为,5G与区块链是文创/内容产业在未来最重…

朋友聚会上,当你被cue聊聊区块链时.....

来源 | 白话区块链 责编 | 晋兆雨 头图 | 付费下载于视觉中国 转眼间,又到了一年一度的同学聚会。这次班长牵头,把班上绝多数同学都叫了过来,甚至还请了班主任王老师到场,摆了好几大桌。 一时间觥筹交错,各个都喝得满…

家用2kw风力电机满负荷的发电量有多少

家用风力发电机2kw的一天的满负荷发电量是48度电,3级风发电5级风满负荷发电,电机是永磁发电机,足功率发电,纯铜线圈缠绕,叶片是增强玻璃钢材质的

PyTorch搭建LSTM实现时间序列预测(负荷预测)

目录 I. 前言II. 数据处理III. LSTM模型IV. 训练V. 测试VI. 源码及数据 I. 前言 在上一篇文章深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)中,我详细地解释了如何利用PyTorch来搭建一个LSTM模型,本篇文章的主要目…

TensorFlow搭建LSTM实现时间序列预测(负荷预测)

目录 I. 前言II. 数据处理III. 模型IV. 训练/测试V. 源码及数据 I. 前言 前面已经写过不少时间序列预测的文章: 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)PyTorch搭建LSTM实现时间序列预测(负荷预测&#xf…

TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)

目录 I. 前言II. 数据处理III. LSTM模型IV. 训练/测试V. 源码及数据 I. 前言 在前面的一篇文章TensorFlow搭建LSTM实现时间序列预测(负荷预测)中,我们利用LSTM实现了负荷预测,但我们只是简单利用负荷预测负荷,并没有利…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行预测

一、LSTM描述 长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络…

电力负荷预测数据集

电力负荷预测,用电量以及温度、湿度、风速、降雨等数据,每15min一组,共计13个月 下载链接:https://download.csdn.net/download/ncusz/82632972

Python画用电客户日负荷曲线图

Python版本:Python3.6.2 一、日负荷曲线 摘自百度百科,日负荷曲线是描述一日内负荷随时间变化的曲线。 二、数据处理 数据:申请的爱尔兰开源用户用电数据,txt格式,一个文件将近400M,用写字板打开,很卡。 截…

基于改进粒子群IPSO与LSTM的短期电力负荷预测

短期电力负荷预测是电力系统安全调度、经济运行的重要依据 , 随着电力系统的市场化 , 负荷预测的精度直接影响到电力系统运行的可靠性、经济性和供电质量。LSTM 为短期电力负荷预测提供了一个新的研究方向。本文将LSTM用于短期电力负荷预测 , 提出基于LSTM 的短期电力负荷预测模…

电力负荷预测三篇综述总结

三篇综述链接: 深度学习方法在负荷预测中的应用综述(论文阅读)光伏发电量和用电量的概率预测研究综述(1)光伏发电量和用电量的概率预测研究综述(2)光伏发电量和用电量的概率预测研究综述&#…

记录一次生产服务器CPU400%满负荷处理过程

记录一次生产服务器CPU400%满负荷处理过程 文章目录 记录一次生产服务器CPU400%满负荷处理过程步骤猜测解决方法反思总结 步骤 top命令 31779进程 占 CPU 361% ,通过最后的COMMAND可以判断是java进程 通过jvm的 jsp -l命令 查询 31779进程 是 zipkin-server-2.…

Python 多进程下开多线程满负荷工作

最开始只是有这样一个想法,后来想实现一下 本文只是写一个例子,实现了开多个进程,每个进程下面开多线程,每个进程执行单独一个任务,并行执行,进程下的多线程执行任务,并发执行 import multiprocessing import threading import timedef m_test():for i in range(25):tthreadin…