没办法,公司要搞区块链,又把他捡起了,忘了好久了。
1 基本算法
1.1 PBFT
拜占庭容错算法(Practical Byzantine Fault Tolerance),拜占庭共识算法这篇的推理最为简单,
假设R为安全节点,E为不安全节点,投票数为P
E
=
0
,
P
<
R
,
都
可
以
得
到
结
果
E=0,P<R,都可以得到结果
E=0,P<R,都可以得到结果
R
/
2
同
意
,
R
/
2
反
对
,
P
>
R
/
2
+
E
,
才
可
以
有
结
果
R/2同意,R/2反对,P>R/2+E,才可以有结果
R/2同意,R/2反对,P>R/2+E,才可以有结果
⟹
R
/
2
+
E
<
P
<
R
⟹
R
+
E
<
3
/
2
R
⟹
2
/
3
A
L
L
<
R
⟹
2
E
+
1
<
R
⟹
m
i
n
(
P
)
=
3
E
+
1
\Longrightarrow R/2+E<P<R\Longrightarrow R+E<3/2R\Longrightarrow 2/3ALL<R \Longrightarrow 2E+1<R\Longrightarrow min(P)=3E+1
⟹R/2+E<P<R⟹R+E<3/2R⟹2/3ALL<R⟹2E+1<R⟹min(P)=3E+1
1.2 梅克尔树
小知识:区块链的梅克尔树结构又是什么?,因为每一区块的梅克尔树根都会存在下一个区块的区块头中父区块哈希值,也就意味着下一区块保存了上区块的所有交易,从而保障了区块链的数据安全。
Merkle Tree(梅克尔树)算法解析
1.3 raft
共识算法:Raft
1.4 POW
工作量证明(Proof Of Work,简称POW),这篇文章介绍的是比特币中的工作量。
1.5 Pos
1.6 Gossip
P2P 网络核心技术:Gossip 协议
2 Fabric
2.1 环境准备
- 安装go
Go 安装包下载,执行下面的命令和配置环境变量
sudo tar xf go1.13.5.linux-amd64.tar.gz -C /usr/local
# 配置环境变量,如果SecureCRT中使用vi有问题,则执行 sudo apt install vim,安装vim。
vi ~/.bashrc
# 在最末尾添加
export GOROOT=/usr/local/go
export GOPATH=/home/test/gowork
export PATH=$GOROOT/bin:$PATH
export FABRIC_HOME=/home/test/gowork/src/github.com/hyperledger/fabric/.build
export PATH=$FABRIC_HOME/bin:$PATH
#
# 让环境变量生效
source ~/.bashrc
注意fabric以来go环境,否则就没法执行make cryptogen
等操作。
- 安装docker
参考Ubuntu16.04安装docker-ce(阿里源),
sudo su -
apt-get update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get -y update
apt-get -y install docker-ce
如果想普通用户也可以运行docker,则ubuntu普通用户登录操作docker提示无权限的解决办法
sudo gpasswd -a $USER docker
newgrp docker
# 验证一下docker
docker ps
- 安装docker-compose
HyperLedger Fabric需要用到docker-compose,所以需要提前安装,参考Ubuntu18.04 Hyperledger-Fabric v1.3环境搭建详细教程
sudo pip3 install docker-compose
# 查看docker-compose版本
docker-compose -version
- 安装fabric
参考hyperledger-fabric进行安装根本连不上,Ubuntu18.04 Hyperledger-Fabric v1.3环境搭建详细教程,是安装Fabric1.3,因为现在Fabric2.0并不是发布版本,我这里采用fabric1.4进行搭建。
cd /home/test/gowork
mkdir -p src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout v1.4.0
cd scripts
./bootstrap.sh
接下来就可以看到fabric的安装docker镜像清单。
参考CenOS7安装配置fabric1.4详细流程+fabric1.4的helloWorld,运行示例
cd ~/fabric/scripts/fabric-samples/first-network
# 构建网络,生成配置
./byfn.sh -m generate -c jschannel
# 启动网络
./byfn.sh -m up -c jschannel
# 关闭提供的fabric-samples中的first-network网络
./byfn.sh -m down
- 安装node
参考ubuntu 上安装node.js 的简单方法
sudo apt-get install nodejs
sudo apt-get install npm
- 运行Fabric-samples
参考 Fabric1.4商业票据例子跑通过程
git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples
git checkout release-1.4
# 查看当前版本
git branch -a
# 启动网络
cd ~/gowork/fabric-samples/basic-network
./start.sh
# 查看运行情况
docker ps
输入http://10.101.5.147:5984/_utils/
,可以对区块链使用的CouchDB数据库进行可视化
执行下面的命令,启动监控容器。
cd ~/gowork/fabric-samples/commercial-paper/organization/magnetocorp/configuration/cli
./monitordocker.sh net_basic
其余的过程参考参考Fabric-samples 1.4商业票据教程详细过程(Commercial paper tutorial),这里不再赘述。
cd ~/gowork/fabric-samples/commercial-paper/organization/magnetocorp/configuration/cli
docker-compose -f docker-compose.yml up -d cliMagnetoCorp
# 合约安装
cd ~/gowork/fabric-samples
docker exec cliMagnetoCorp peer chaincode install -n papercontract -v 0 -p /opt/gopath/src/github.com/contract -l node
# 合约初始化
docker exec cliMagnetoCorp peer chaincode instantiate -n papercontract -v 0 -l node -c '{"Args":["org.papernet.commercialpaper:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
执行合约初始化的时候,提示异常,其他人的异常总结,参考常见Fabric错误场景(持续更新)
test@bw147:~/gowork/fabric-samples/basic-network$ docker exec cliMagnetoCorp peer chaincode instantiate -n papercontract -v 0 -l node -c '{"Args":["org.papernet.commercialpaper:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
Error: error getting channel (mychannel) orderer endpoint: error bad proposal response 500: access denied for [GetConfigBlock][mychannel]: Failed to get policy manager for channel [mychannel]
查阅HyperLeger Fabric开发(八)——HyperLeger Fabric链码开发测试,认为这个错误是通道名称必须是myc(创世区块和配置交易的文件名称为myc),否则将报错信息:
造成的。那么创世区的名称是什么呢?再查阅fabric1.4官方
于是我采用是不是因为没有执行git checkout release-1.4
,于是重新执行到docker-compose -f docker-compose.yml up -d cliMagnetoCorp
,提示异常
Starting cliMagnetoCorp ...
ERROR: for cliMagnetoCorp a bytes-like object is required, not 'str'
ERROR: for cliMagnetoCorp a bytes-like object is required, not 'str'
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/docker/api/client.py", line 261, in _raise_for_status
response.raise_for_status()
File "/usr/local/lib/python3.6/dist-packages/requests/models.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http+docker://localhost/v1.22/containers/89a90295095d24a14e90cf72c8153c2892869d30771a8d2bba69277fa8dd9f6a/start
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/compose/service.py", line 625, in start_container
container.start()
File "/usr/local/lib/python3.6/dist-packages/compose/container.py", line 241, in start
return self.client.start(self.id, **options)
File "/usr/local/lib/python3.6/dist-packages/docker/utils/decorators.py", line 19, in wrapped
return f(self, resource_id, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/docker/api/container.py", line 1095, in start
self._raise_for_status(res)
File "/usr/local/lib/python3.6/dist-packages/docker/api/client.py", line 263, in _raise_for_status
raise create_api_error_from_http_exception(e)
File "/usr/local/lib/python3.6/dist-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
raise cls(e, response=response, explanation=explanation)
docker.errors.NotFound: 404 Client Error: Not Found ("b'network 585842a899363043eb2cec3603d38247906cf39a9801bf6bfb63d842f66634dd not found'")
进入/var/lib/docker/containers
将这个目录全部删掉,然后docker stop $(docker ps -a -q)
,我把docker镜像都清理掉,再次重来。在一台电脑运行起来,但是在另外一台机器上却没有那么好命,再次执行到docker-compose -f docker-compose.yml up -d cliMagnetoCorp
提示异常
Pulling cliMagnetoCorp (hyperledger/fabric-tools:)...
latest: Pulling from hyperledger/fabric-tools
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
b5035666b1cd: Pull complete
94c898b5fdef: Downloading [=> ] 2.686MB/116.3MB
94c898b5fdef: Downloading [===> ] 6.995MB/116.3MB
94c898b5fdef: Downloading [====> ] 10.19MB/116.3MB
94c898b5fdef: Downloading [=====> ] 13.96MB/116.3MB
9dc56c5637b5: Downloading [===============================> ] 202.7MB/322.3MB
9dc56c5637b5: Downloading [==========================================> ] 271.9MB/322.3MB
89c4701a4f5f: Download complete
18467825df3e: Verifying Checksum
9dc56c5637b5: Downloading [===========================================> ] 279.4MB/322.3MB
94c898b5fdef: Retrying in 1 second
94c898b5fdef: Pull complete
bee7bd3eb18f: Pull complete
9dc56c5637b5: Extracting [==================================================>] 322.3MB/322.3MB
9dc56c5637b5: Pull complete
31f2b9e8b256: Pull complete
89c4701a4f5f: Pull complete
18467825df3e: Pull complete
Digest: sha256:822418c5ad61473ecfa911dfe4b100264500c504c78def52730106a717be71cb
Status: Downloaded newer image for hyperledger/fabric-tools:latest
Recreating cliMagnetoCorp ... error
ERROR: for cliMagnetoCorp b'open /var/lib/docker/containers/89a90295095d24a14e90cf72c8153c2892869d30771a8d2bba69277fa8dd9f6a/.tmp-config.v2.json864601594: no such file or directory'
ERROR: for cliMagnetoCorp b'open /var/lib/docker/containers/89a90295095d24a14e90cf72c8153c2892869d30771a8d2bba69277fa8dd9f6a/.tmp-config.v2.json864601594: no such file or directory'
通过查找89a90295095d24a14e90cf72c8153c2892869d30771a8d2bba69277fa8dd9f6a
发现/var/lib/docker/image/overlay2/layerdb/mounts/89a90295095d24a14e90cf72c8153c2892869d30771a8d2bba69277fa8dd9f6a
中有这个文件夹,这里先看看docker学习——1,基于overlay2存储驱动的理解和Docker存储驱动之–overlay2
执行docker ps -a
,难道这就是原因吗?容器没有卸载感情,于是再执行docker rm 89a90295095d
就可以了。
接着按照步骤执行
cd ~/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application
cnpm install
# 导入钱包
node addToWallet.js
# 发布商业票据
node issue.js
# 赎回票据
node redeem.js
#
cd ~/gowork/fabric-samples/commercial-paper/organization/digibank/configuration/cli/
docker-compose -f docker-compose.yml up -d cliDigiBank
cd ~/gowork/fabric-samples/commercial-paper/organization/digibank/application
# 导入钱包
node addToWallet.js
# 购买票据
node buy.js
# 赎回票据
node redeem.js
在执行到node issue.js
,异常日志如下,出现这个问题,是因为docker exec cliMagnetoCorp peer chaincode instantiate -n papercontract -v 0 -l node -c '{"Args":["org.papernet.commercialpaper:instantiate"]}' -C mychannel -P "AND ('Org1MSP.member')"
,合约初始化没有成功导致了。
Connect to Fabric gateway.
Use network channel: mychannel.
Use org.papernet.commercialpaper smart contract.
Submit commercial paper issue transaction.
2020-01-08T05:53:52.422Z - warn: [Transaction]: _validatePeerResponses: Received error response from peer: message=make sure the chaincode papercontract has been successfully instantiated and try again: chaincode papercontract not found, stack=Error: make sure the chaincode papercontract has been successfully instantiated and try again: chaincode papercontract not found
at self._endorserClient.processProposal (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_fabric-client@1.4.4@fabric-client/lib/Peer.js:140:36)
at Object.onReceiveStatus (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_grpc@1.21.1@grpc/src/client_interceptors.js:1207:9)
at InterceptingListener._callNext (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_grpc@1.21.1@grpc/src/client_interceptors.js:568:42)
at InterceptingListener.onReceiveStatus (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_grpc@1.21.1@grpc/src/client_interceptors.js:618:8)
at callback (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_grpc@1.21.1@grpc/src/client_interceptors.js:845:24), status=500, , url=grpc://localhost:7051, name=peer0.org1.example.com, grpc.max_receive_message_length=-1, grpc.max_send_message_length=-1, grpc.keepalive_time_ms=120000, grpc.http2.min_time_between_pings_ms=120000, grpc.keepalive_timeout_ms=20000, grpc.http2.max_pings_without_data=0, grpc.keepalive_permit_without_calls=1, name=peer0.org1.example.com, request-timeout=120001, grpc.ssl_target_name_override=peer0.org1.example.com, grpc.default_authority=peer0.org1.example.com, isProposalResponse=true
2020-01-08T05:53:52.423Z - error: [Transaction]: _validatePeerResponses: No valid responses from any peers. 1 peer error responses:
peer=peer0.org1.example.com, status=500, message=make sure the chaincode papercontract has been successfully instantiated and try again: chaincode papercontract not found
Error processing transaction. Error: No valid responses from any peers. 1 peer error responses:
peer=peer0.org1.example.com, status=500, message=make sure the chaincode papercontract has been successfully instantiated and try again: chaincode papercontract not found
Error: No valid responses from any peers. 1 peer error responses:
peer=peer0.org1.example.com, status=500, message=make sure the chaincode papercontract has been successfully instantiated and try again: chaincode papercontract not found
at Transaction._validatePeerResponses (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_fabric-network@1.4.4@fabric-network/lib/transaction.js:227:10)
at Transaction.submit (/home/dengjun/gowork/fabric-samples/commercial-paper/organization/magnetocorp/application/node_modules/_fabric-network@1.4.4@fabric-network/lib/transaction.js:145:33)
at <anonymous>
Disconnect from Fabric gateway.
Issue program complete.
如果成功则,会显示下面的信息。