1. 区块链概述
1.1 分布式账本
区块链的核心是一个分布式账本,记录网络上发生的所有交易。区块链账本通常被描述为去中心化的
,因为它会被复制到许多网络参与者中,每个参与者都在协作
维护账本
信息仅能以追加的方式记录到区块链上,并使用加密技术保证一旦交易到账本中就无法修改,这种不可修改的属性简化了信息的溯源,区块链有时也被称为证明系统。
1.2 智能合约
为了支持以同样的方式更新信息,并实现一整套账本的功能(交易、查询等)
,区块链使用智能合约
来对提供对账本的受控访问。智能合约是在网络中封装和简化信息的关键机制,它还可以被编写为自动执行参与者的特定交易的合约。
1.3 共识
保持账本在整个网络中的同步的过程称为共识
,该过程确保所有账本仅在交易被相应的参与者批准更新,并且当账本更新的时候,所有账本都以相同的顺序更新相同的交易。
1.4 区块链的作用
在传统的业务系统中,对于某段数据的溯源是极其困难的,合同必须手动签署并且提交,而且系统中的每个数据库的信息都是孤立的,这也就意味着单点故障
而在区块链网络中,每个参与者都有自己的账本副本,除了共享账本信息之外,还共享更新账本的过程,与今天使用参与者的私人程序更新其私人账本的系统不同,区块链系统具有的是共享程序来更新共享账本
区块链网络能够减少与处理私人信息相关的时间、成本和风险,同时提高信任和可见性。
2. Hyperledger fabric
2.1 概述
Hyperledger fabric
是Hyperledger
中的区块链项目之一,与其他区块链技术一样,它有一个账本,使用智能合约,是一个参与者管理交易的系统。
Hyperledger fabric
与其他区块链系统不同的地方在于私有
和许可
。
- 与允许未知身份参与网络的开放式网络非许可系统
(例如需要工作量证明之类的协议来验证交易并保护网络)
不同,Hyperledger fabric
网络成员需要从可信赖的成员服务提供者(MSP)
注册 Hyperledger Fabric
提供多种可插拔的选项,账本数据以多种数据形式进行存储,共识机制可以交换替换,并且支持不同的MSP
- 还提供通道的功能,允许一组参与者创建各自的交易账本,这样做的目的是为了不让部分人员知晓自己的交易信息。
2.2 共享账本
Hyperledger fabric
有一个账本子系统,包括两个组件:世界状态
和交易日志
,每个参与者都拥有他们所属的每个网络的账本副本
- 世界状态:描述了在给定时间的账本的状态,它是账本的数据库,交易日志记录世界状态当前值的所有交易,是世界状态更新的历史。
- 账本世界中的世界状态的数据是可替换的。默认情况下,这是
LevelDB
键值存储数据库,交易日志不需要可插拔式的设计,只记录区块链网络使用账本数据前后的值。
2.3 智能合约
使用链码进行编写。当该应用程序需要与账本交互的时候,由区块链外部的应用程序进行调用,在大多数情况下,链码只与账本的数据库、世界状态(例如查询)
交互,而不与日志进行交互。
2.4 隐私
支持私有网络,使用通道技术。从而导致了该网络是相对开放的
2.5 共识
交易必须按照发生的顺序写入账本,即使它们可能位于网络中不同的参与者集合之中。为此,必须建立交易的顺序,而且必须采用一种方法来拒绝错误插入到账本之中。
3. Shell编程
3.1 HelloWorld程序与运行方法
#!/bin/bash
echo "HelloWorld!"
#!
是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,也就是使用哪一种shell
echo
:回显,回声,向窗口输出脚本
- 程序运行方法
chmod +x ./test.sh
./test.sh
或者作为解释器的参数
/bin/sh test.sh
/bin/bash test.sh
3.2 变量
变量名和等号之间不能有空格,规则如下:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线 **_**。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in `ls /etc`
或
for file in $(ls /etc)
以上语句可以将/etc下的文件名循环出来
如果想要使用定义过的变量,只需要在变量名前面加美元符号。
your_name="hahah"
echo $your_name
ehco ${your_name}
只读变量
myUrl="111"
readOnly myUrl
删除变量
myUrl="111"
unset myUrl
echo ${myUrl}
Shell
的三种变量
- 局部变量:定义在脚本或者命令中,仅当在当前
Shell
实例中有效,其他Shell
启动的程序不能访问局部变量 - 环境变量:所有的程序,包括
Shell
启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候Shell
脚本可以定义环境变量 - Shell变量
Shell字符串
- 双引号里可以有变量
- 双引号里可以出现转义字符
your_name="hello"
h1="hello,${your_name}"
h2="hello,$your_name"
echo ${#your_name} #获取字符串的长度
echo ${your_name:1:4}
echo `expr index "$your_name" ho`#查询字符h或者字符o出现的位置,看谁先出现
Shell数组
array_name=(value0 value1 value2 value3)
valuen=${array_name[n]}
echo ${array_name[@]}#获取所有元素
# 取得数组元素的个数
length=${#array_name[@]}
注释
#--------------------------------------------单行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF