区块链考试实操总结
1.决策树流程
1.1 全球开源平台
1.2 数字藏品平台
1.3 供应链金融下应收账款融资
2.纠错题
2.1 电子结婚证
2.2 区块链宠物
3.操作员实操题
3.1 根据题目要求,手动和使用工具创建区块链账户,并能够获取和续期相关证书
3.2 区块链监控、通信配置文件、数据存储设置方法
根据题目要求,完成常用区块链系统监控的方法;补全FISCO BCOS节点的通信设置的配置文件;典型区块链技术的数据存储设置方法。
3.3 SimpleStorage合约补全
本例中提供了SimpleStorage合约在remix进行单元操作的SimpleStorageTest合约,请在SimpleStorageTest合约中,补充操作代码,完成操作。
4.运维案例题
4.1 完成fisco bcos联盟链搭建和依赖安装和搭链,补充脚本内容
搭建FISCO BCOS环境
1、单群组FISCO BCOS联盟链的搭建
本节以搭建单群组FISCO BCOS链为例,使用开发部署工具build_chain.sh脚本在本地搭建一条4节点的FISCO BCOS链。
- 环境安装
## macos环境安装依赖 brew install openssl curl ##ubuntu环境安装依赖 sydo apt install -y openssl curl ##centos环境安装依赖 sudo yum install -y openssl openssl-devel
- 下载build_chain.sh脚本
curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master/tools/build_chain.sh && chmod u+x build_chain.sh
- 搭建联盟链
bash build_chain.sh -1 "127.0.0.1:4" -p 30300,20200,8584 ## 其中-p指定起始端口,p2p_port用于节点之间的交互,channel_port用于sdk访问,jsonrpc_port用于控制台访问。
- 启动联盟链
bash nodes/127.0.0.1/shatr_all.sh
- 检查是否启动成功
ps -ef |grep -v grep | grep fisco-bcos
5. Solidity编程基础
5.1 Solidity基础语法、变量类型、运算符
Truffle是一个以太坊智能合约开发框架,利用它可以方便地生成项目模板、编译合约、部署合约到区块链、测试合约等。
5.1.1 基础语法
Solidity源文件可以包含任意数量的合约定义、import和pragma
1.pragma语法
第一行是pragma指令,他告诉我们源代码是为Solidity Version某个版本编写的。
pragma指令只对自己的源文件起作用,如果把文件B导入文件A,文件B的pragma将不会自动应用于文件A。
pragma solidity ^0.4.0 意思是不能用低于0.4.0版本的编译器,也不能用0.5.0版本以及以上的版本。
这里的^表示不超过0.5.0版本。
若要0.4.0 到0.4.22版本,可如下编写:
pragma solidity >=0.4.0 <0.4.22
2.Contract/智能合约
智能合约是位于以太坊区块链上特定地址的代码(函数)和数据(状态)的集合。
3.uint storedData
这行代码,声明了一个名为storedData的状态变量,类型为uint。set和get函数可用于修改或检索变量的值。
4.导入文件
Solidity支持与javaScript非常相似的导入语句
import “fileName”;
import * as symbolName from “fileName”;
import “./X”; 从当前目录导入文件X
5.1.2 数据类型
Solidity中,变量类型有以下几大类:
1.值类型
int(m):有符号整数
uint(m):无符号整数
m关键字取值为8~256 为8的倍数 不写默认为256
2.地址类型
address 大小为20个字节值,包含42个字符
3.引用类型
是将数据的位置(内存地址)存储在堆[6]内存上的变量,题目不直接共享数据
Solidity 中引用类型的示例包括字符串、结构、数组和映射。
string 字符序列,支持使用单引号’'和双引号""的字符串文字。
struct 结构,是一种引用数据类型,可以用于创建其他数据类型的结构。结构可以包含值类型和引用类型,包括其他结构,但不能包含其自身的结构。
[] 数组 [1]指定大小为1,例如string[1],uint[1]
mapping(key => value) 映射,键值对数据结构,其功能类似于 Python 中的字典和 JavaScript 中的哈希表或对象。其中
key
可以是除引用类型以外的任何数据类型,并且value
可以是值类型和引用类型。不能用Solidity保留关键字作为变量名,例如break或boolean变量名无效
不应该以数字开头,必须以字母或下划线开头
变量名区分大小写
5.1.3 运算符
Solidity支持以下类型运算符
- 算术运算符
加 +
减 -
乘法 *
除法 /
求余 %
乘方 ** (只支持无符号的整数)
- 比较运算符
“>”:大于,只支持左右两边操作数是数值类型。
= : 大于等于,只支持左右两边操作数是数值类型。
< : 小于,只支持左右两边操作数是数值类型。
<= : 小于等于,只支持左右两边操作数是数值类型。
== : 等于,比较两个操作数是否相等,支持数值类型,字符串,定长字节数组。
!= : 不等于,比较两个操作数是否相等,支持数值类型,字符串,定长字节数组。
- 逻辑(或关系)运算符
&& :与,前后两个表达式必须都是 true 才返回 true,否则返回 false。
|| :或,只要两个表达式中有一个是 true,就可以返回 true,否则返回 false。
! :非,也叫取反运算符,只需要一个操作数,如果操作数为 true,则返回 false;如果操作数为 false,则返回 true。
- 位运算符
左移运算符 << 右移运算符 >>
按位与 & 当两位同时为 1 时才返回 1。
^ :按位异或。当两位相同时返回 0,不相同时返回 1。
| :按位或。只要有一位为 1 即可返回 1。
赋值运算符(=)
条件(或三元)运算符
int32 a = x > y ? x : y;
5.2 代码调试
5.2.1 Assert方法
assert(bool condition)-----如果不满足条件,则此方法调用将导致无效的操作码,并对状态所做的任何更改都将被还原。此方法用于内部错误。
assert.equal(actual, expected, message)
: 这个方法用于断言actual
的值与expected
的值相等。如果断言失败,将抛出一个错误,并显示指定的message
作为错误信息。这是一种常用的方法,用于验证合约的返回值是否符合预期。示例代码:
assert.equal(myVariable, 10, "myVariable应该等于10");
assert.notEqual(actual, expected, message)
: 与assert.equal
相反,这个方法用于断言actual
的值与expected
的值不相等。如果断言失败,将抛出一个错误,并显示指定的message
作为错误信息。这在验证两个值不应相等的情况下非常有用。示例代码:
assert.notEqual(myVariable, 0, "myVariable不应该等于0");
assert.isTrue(value, message)
: 这个方法用于断言value
为真。如果断言失败,将抛出一个错误,并显示指定的message
作为错误信息。通过使用这个方法,您可以验证布尔值为真的情况。示例代码:
assert.isTrue(isValid, "isValid应该为真");
assert.isFalse(value, message)
: 与assert.isTrue
相反,这个方法用于断言value
为假。如果断言失败,将抛出一个错误,并显示指定的message
作为错误信息。您可以使用这个方法来验证布尔值为假的情况。示例代码:
assert.isFalse(isInvalid, "isInvalid应该为假");
5.2.2 require方法
- require(bool condition)-----如果不满足条件,此方法调用将恢复为原始状态。此方法用于输出或外部组件中的错误。
- require(布尔条件,字符串存储消息)-----如果不满足条件,则此方法调用恢复为原始状态。–此方法将用于输入或外部组件中的错误。它提供了提供自定义消息的选项。
5.2.3 revert方法
revert()-----此方法中止执行并将所有对状态所做的更改还原到状态。
revert(字符串存储原因)-----此方法中止执行并将任何所做的更改还原到状态。它提供了提供自定义消息的选项。
6.测试相关
6.1 区块链系统测试方法
6.1.1 功能测试
- 黑盒测试
- 白盒测试:
- 优先选用自动化测试工具来进行静态结构分析
- 以静态分析的结果作为依据,用代码检查和动态测试的方式对静态分析结果进行进一步确认,提供测试效率和准确性
- 使用多种覆盖率标准衡量代码的覆盖率
6.1.2 性能测试
- 负载测试
- 并发测试
- 稳定性测试
6.1.3 安全测试
- 使用安全扫描工具对系统进行扫码操作
- 对难以实现自动化检测漏洞进行以下手工检测,如通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性
- 利用模拟黑客攻击的方式,来评估计算机网络系统安全性能的方式
6.1.4 可靠性测试
- 使用系统不允许用户输入异常值作为测试输入测试系统的容错性
- 在系统中植入故障,测试系统容错性和成熟性
- 在一定负载下,长时间大容量运行某种业务,测试系统稳定性
- 在一段时间内持续使用超过系统规格的负载进行测试,验证系统可靠性
6.1.5 合规性测试
- 收集和分类区块链相关法律,法规,标准和规范,建立合规知识库
- 梳理知识库库文件的控制点,建立合规控制矩阵
- 根据控制点建立评鉴指标体系和控制方法
- 采用访谈、调查、检查、观察、自动化工具等方法开展合规性测试
6.2 区块链系统功能测试介绍
- 去中心化:是区块链最根本的性质,也是区块链区别于其他分布式账本的最重要因素。
- 防篡改:区块链采用了链式数据结构,如果某个节点篡改了一个区块的数据,该区块与前后区块之间的链接就会被打破,区块链就不再完整
- 去信任:指的是在区块链中,一个节点无需信任任何其他节点,在假设其他节点都是不合作、不可信的前提下,最终仍可以根据共识机制从区块链中获取可信的数据。
- 开放性:区块链的数据全部存储在每一个节点中,除了交易各方的私人信息被加密存储外,区块链的数据对所有节点公开,任何人都可以通过公开接口查询区块链数据,因此整个系统的信息保持高度透明,数据的完整性也易于验证。
- 隐私性:加密
- 自动执行:无需人为干预
- 简化运维
7.区块链应用操作
7.1手动创建账户
7.1.1 安装openssl
//不同的操作系统命令略有不同,在Ubuntu系统上安装openssl命令是: sudo apt install -y openssl //centos系统上安装命令是: sudo yum install -y openssl // 执行命令,检查openssl是否正确安装 openssl version
7.1.2 选择非对称密码
//在生成公私钥对前,需指定相应的加密算法和算法曲线。需选择ECDSA算法作为非对称加密算法,选择曲线secp256k1作为算法曲线,生成相关的参数文件 openssl ecparam -out secp256k1.param -name secp256k1 // 查看生成的参数文件 cat secp256k1
7.1.3 生成账户私钥
//生成明文形式保存的私钥user.pem(文件名可以指定,此处为示例) openssl genpkey -paramfile secp256k1.param -out user.pem //查看生成的私钥文件 cat user.pem
7.1.4 生成账户公钥
//生成公钥文件,假设使用user.public.pem作为文件名 openssl ec -in user.pem -pubout -out user.public.pem //查看生成的公钥文件 cat user.public.pem
7.1.5 加密保存账户私钥
//生成加密保存的账户私钥文件(假设文件名为user.p12),执行期间需输入密码,用于加密私钥文件 openssl pkcs12 -export -name key -nocerts -inkey user.pem -out user.p12 //查看p12文件,检查是否与原密钥文件相同 openssl pkcs12 -in user.p12 -nodes
7.2 使用工具创建账户
7.2.1 安装openssl
//与手动创建账户一样。在Ubuntu系统上安装openssl命令是 sudo apt install -y openssl //centos系统安装命令是 sudo yum install -y openssl
7.2.2 下载工具
//下载账户生成工具get_account.sh https://raw.githubusercontent.com/FISCO-BCOS/console/master/tools/get_account.sh && chmod u+x get_account.sh //下载国密账户生成工具get_gm_account.sh https://ram.githubusercontent.com/FISCO-BCOS/console/master/tools/get_gm_account.sh && chmod u+x get_gm_account.sh
7.2.3 检查工具
//检查get_account.sh脚本,执行指令 bash get_account.sh -h // 检查get_gm_account.sh脚本,执行指令 bash get_gm_account.sh -h
7.2.4 创建账户
//用get_account.sh 脚本创建账户 bash get_account.sh //用get_gm_account.sh脚本创建账户 bash get_gm_account.sh
7.2.5 创建私钥被加密的账户
//用get_account.sh脚本创建账户,并输入保护私钥的密码 bash get_account.sh -p //用get_gm_account.sh脚本创建国密版账户,并输入保护私钥的密码 bash get_gm_account.sh -p
7.2.6 获取账户地址
//使用get_account.sh直接从私钥文件中直接获取账户地址 bash get_account.sh -k accounts/xxxxx.pem //使用get_gm_account.sh直接从国密的私钥文件中直接获取账户地址 bash get_gm_account.sh -k accounts_gm/xxxx.pem
7.2.7 获取私钥被加密的账户地址
//使用get_account.sh直接从p12私钥文件中直接获取账户地址,需要输入正确的私钥保护密码 bash get_account.sh -P accounts/xxxx.p12 //使用get_gm_account.sh直接从p12私钥文件中直接获取账户地址,需要输入正确的私钥保护密码 bash get_gm_account.sh -P accounts_gm/xxxx.p12
7.3 应用业务操作
1.启动控制台
./start.sh ./start.sh groupID ./start.sh groupID -pem pemName ./start.sh groupID -p12 p12Name
2.生成公私钥
./get_account.sh
3.查询区块序号
[group:1] getBlockNumber
4.按照区块序号查询区块数据
[group:1]getBlockByNumber
5.按交易哈希值查询交易数据
getTransactionByHash XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7.4 区块应用运维
7.4.1 区块链应用部署基本流程
区块链应用部署流程一般包括:区块链网络搭建,智能合约编译与部署,部署调用区块链的服务端项目接口,部署区块链用户使用的前端项目,测试网络部署结果
智能合约编译和部署:编译合约—》部署合约—》测试合约—》撰写报告
部署服务端接口项目:准备环境—》部署项目—》测试结果—》撰写报告
部署客户端项目:准备环境—》测试项目—》测试结果—》撰写报告
安装并启动Console控制台
安装Console的依赖内容,在centos平台运行以下命令
sudo yum install -y java java-devel
在ubuntu平台运行以下命令
sudo apt install -y default-jdk
接下来安装console工具
拷贝控制台配置文件:
cp -n console/conf/config-example.toml console/config/config.toml
配置控制台证书
cp -r nodes/127.0.0.1/sdk/* console/conf
在启动控制台之前通过命令确认区块链节点是否已经启动,使用以下命令并观察输出
ps -ef | grep -v grep | grep fisco-bcos
确定节点已经启动后,使用如下命令启动并进入控制台
cd ~/fisco/console && bash start.sh
sudo yum install -y java java-devel
在ubuntu平台运行以下命令
sudo apt install -y default-jdk
接下来安装console工具
拷贝控制台配置文件:
cp -n console/conf/config-example.toml console/config/config.toml
配置控制台证书
cp -r nodes/127.0.0.1/sdk/* console/conf
在启动控制台之前通过命令确认区块链节点是否已经启动,使用以下命令并观察输出
ps -ef | grep -v grep | grep fisco-bcos
确定节点已经启动后,使用如下命令启动并进入控制台
cd ~/fisco/console && bash start.sh