fabric核心概念


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

文章作者: 穿山甲
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 穿山甲 !
  目录