Fabric 简明使用手册

Preface

“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks(2009年1月3日,财政大臣正处于实施第二轮银行紧急援助的边缘)。”

比特币,C++ 开发。 核心宗旨:去中心化,开放性,自洽性,不可篡改,匿名性

官方网站:https://bitcoin.org/

源码库:https://github.com/bitcoin

创世区块:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

以太坊,开发管理分布式应用的平台,主攻方向 “智能合约”,并为其定制了一种编程语言Solidity。以太坊的核心是以太坊虚拟机(EVM),允许用户按照自己的意愿创建操作。 以太坊给出了Go、Java、Python 等多语言的实现。

官方网站:https://ethereum.org/

源码库:https://github.com/ethereum

The DAO

EVM( 图灵完备的智能合约虚拟机 )

DAPP

Ethereum Classic

HyperLeger,由 Linux 基金会主导。 该项目试图为新一代的事务应用创建一种开放的分布式账本标准,支持许可式区块链。

官方网站:https://www.hyperledger.org/

源码库:https://github.com/hyperledger

PBFT

Concepts

区块:一个区块是一个数据包,其中包含零个或多个交易,前块(“父块”)的散列值,以及可选的其它数据。

创世区块:创世区块指区块链上的第一个区块,用来初始化相应的加密货币。

挖矿:挖矿是反复总计交易,构建区块,并尝试不同的随机数,直到找到一个随机数可以符合工作证明的条件的过程。

分叉:指向同一个父块的2个区块被同时生成的情况,某些部分的矿工看到其中一个区块,其他的矿工则看到另外一个区块。这导致2种区块链同时增长。通常来说,随着在一个链上的矿工得到幸运并且那条链增长的话,所有的矿工都会转到那条链上,数学上分几乎会在4个区块内完结自己。

双重花费:是一个故意的分叉,当一个有着大量挖矿能力的用户发送一个交易来购买产品,在收到产品后又做出另外一个交易把相同量的币发给自己。如果攻击者有超过50%的挖矿能力的话,双重花费最终可以在保证在任何区块深度上成功。低于50%的话,有部分可能性成功。但是它经常在深度2-5上有唯一显著的可能。因此在大多数的加密货币交易所还有金融服务在接受支付之前需要等待6个区块被生产出来(也叫“6次确认”)。

共识机制:区块链中各节点建立信任,对某个提案(Proposal)达成一致的算法。

工作量证明(Proof-of-Work):一种共识机制,该机制是一方(通常称为证明人)出示计算结果,这个结果众所周知是很难计算的但却很容易验证的。通过验证这个结果,任何人都能够确认证明人执行了一定量的计算工作量来产生这个结果。

股权证明机制(Proof of Stake):没有挖矿过程,在创世区块内写明了股权分配比例,之后通过转让、交易的方式(通常就是IPO),逐渐分散到用户手里,并通过“利息”的方式新增货币,实现对节点的奖励。

授权股权证明机制(Delegated Proof of Stake):由被社区选举的可信帐户(受托人,得票数排行前101位)来创建区块。

拜占庭将军问题( Byzantine failures ): Leslie Lamport 1982 年提出用来解释一致性问题的一个虚构模型。在将军总数大于3m ,背叛者为m 或者更少时,忠诚的将军可以达成命令上的一致。

零知识证明: 证明者和验证者之间进行交互,证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。

图灵完备 (Turing-complete):指一个机器或装置能用来模拟图灵机(现代通用计算机的雏形)的功能,图灵完备的机器在可计算性上等价。

Deploy Fabric v0.6

1. Overview

overview

2. Prerequisites

  • Ubuntu/Debian or RHEL/CentOS
  • Docker
  • docker-compose

3. Steps

1. Install Docker

Warning: CentOS6 最高支持Docker版本1.7.1,若需更高版本请升级到CentOS7.
另:推荐升级系统内核

CentOS 6.x 升级CentOS内核:

现有机器上CENTOS版本为CentOS release 6.6 (Final),内核版本2.6.32-504.el6.x86_64

方式1 ( 无aufs模块 ):

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-lt -y
vi /etc/grub.conf —将default设置为0
reboot
uname -r ==>版本为3.10.105-1.el6.elrepo.x86_64

方式2 ( Install aufs ):

cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum install kernel-ml-aufs kernel-ml-aufs-devel
vi /etc/grub.conf —将default设置为0
reboot
uname -r ==>版本为3.10.5-3.el6.x86_64

CentOS 7.x 升级CentOS内核:

现有版本为 3.10.0-514.el7.x86_64

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-lt -y
vi /boot/grub2/grub.cfg
grub2-set-default "centos_version"
grub2-editenv list
reboot
uname -r==>版本为4.4.52-1.el7.elrepo.x86_64

安装Docker

官方脚本:curl -fsSL https://get.docker.com/ | sh
阿里云脚本:curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

建立并加入Docker用户组

sudo groupadd docker
sudo usermod -aG docker $USER

启动Docker

=> CentOS 6:
sudo service docker start

=> CentOS 7:
sudo systemctl enable docker sudo systemctl start docker

验证Docker

docker run hello-world

安装docker-compose

curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

基本Docker命令

显示docker基本信息:docker info
下载镜像:docker pull image_name
列出镜像列表:docker images
删除镜像:docker rmi image_name
开启容器:docker run image_name
进入容器:docker exec -it container_name /bin/bash
查看容器:docker ps -a
修改容器:docker commit container_id new_image_name
删除容器:docker rm name/id
查看logs:docker logs Name/ID
启动停止容器:docker start/stop/restart Name/ID
强制删除所有容器:docker rm -f $(docker ps -aq)
强制删除全部镜像:docker rmi -f $(docker images -q)
从容器里面拷贝文件:docker cp Name:/container_path local_path
保存镜像:docker save image_name -o file_path
加载镜像:docker loan -i file_path
构建镜像:docker build -t image_name Dockerfile_path

2. 获取Fabric镜像

mkdir -p $HOME/hyperledger/docker-compose
cd $HOME/hyperledger/docker-compose
curl https://raw.githubusercontent.com/hyperledger/fabric/v0.6/examples/docker-compose/four-peer-ca.yaml -o four-peer-ca.yaml 2>/dev/null
docker-compose -f xxx.yaml up -d —单机部署
firewall-cmd --zone=public --add-port=2377/tcp --permanent && \
firewall-cmd --zone=public --add-port=7946/tcp --permanent && \
firewall-cmd --zone=public --add-port=7946/udp --permanent && \
firewall-cmd --zone=public --add-port=4789/tcp --permanent && \
firewall-cmd --zone=public --add-port=4789/udp --permanent && \
firewall-cmd --reload
docker swarm init --advertise-addr <MANAGER-IP>—初始化docker集群
docker swarm join ...—加入集群
vim docker-stack.yml —修改启动文件适用于多机部署
docker stack deploy --compose-file docker-stack.yml app_name
docker stack services app_name
docker stack rm app_name —删除app

Deploy Fabric v1.0

1. 概览

overview

2. 构建 Fabric 服务

配置docker:
vim /lib/systemd/system/docker.service 修改成:
ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
--api-cors-header='*' --default-ulimit=nofile=8192:16384 --default-ulimit=nproc=8192:16384
sudo systemctl daemon-reload
sudo systemctl restart docker.service

docker -H Worker_Node_IP:2375 version — 验证

sysctl -w net.ipv4.ip_forward=1

firewall-cmd --zone=public --add-port=2375/tcp --permanent — 打开相应的端口

firewall-cmd --list-ports — 查看开放端口

mkdir -p <my_dev_workspace>/hackfest
cd <my_dev_workspace>/hackfest

curl -L https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sfhackfest/sfhackfest.tar.gz \
-o sfhackfest.tar.gz 2> /dev/null; tar -xvf sfhackfest.tar.gz

docker-compose -f docker-compose-gettingstarted.yml up -d

docker inspect orderer | grep IPAddress

docker exec -it cli bash

more results.txt — 查看节点加入链情况

vim compose.yml — 修改文件适用于多机部署

3. 测试 Fabric 环境

curl -OOOOOO https://raw.githubusercontent.com/hyperledger/fabric-sdk-node/v1.0-alpha/examples/balance-transfer/{config.json,deploy.js,helper.js,invoke.js,query.js,package.json}

npm install

GOPATH=$PWD node deploy.js — 部署chaincode及初始化worldstate

node invoke.js — 发送操作请求

node query.js — 查询账户状态

Marbles: A ChainCode Demo

1. 架构图

marbles

2. 运行实例

git clone http://gopkg.in/ibm-blockchain/marbles.v3

git submodule update --init --recursive

vim config/mycreds.json – 修改配置文件

npm install gulp -g
npm install
gulp marbles

启动成功,即可访问应用。

marbles market

参考资料


Hyperledger Wiki
Fabric 官方文档
Fabric v1.0
Fabric v1.0 架构概览
Fabric 协议
Fabric 术语
Fabric 安装部署
Learn Chaincode
IBM-Blockchain
Swarm 构建
Swarm Compose 样例
Docker Compose Version 3
区块链实用手册
区块链技术指南
区块链开发技术综述
Docker 跨主机通信
Fabric Chaintool
Ebookchain
Bitcoin P2P e-cash paper
Bitcoin 市场
比特币价格走势
Satoshi Nakamoto
Vitalik Buterin