Hyperledger -超级账本 学习报告
一、什么是区块链?
区块链的基本原理,基本组件包括:
交易:对账本状态的改变;
区块:记录交易和状态,是对当前账本状态的一次确认;
链:状态变化的日志记录。
把区块链作为一个状态机,则每次交易就是试图改变一次状态,每次生成区块就是参与者对于其中包括的所有交易改变状态的结果确认。
目前区块链的三种发展项目:
分类:
公开(public)链:任何人都可以参与使用和维护,典型的如比特币区块链,信息是完全公开的。
引入许可机制后,产生私有(private)链和联盟链(consortium),
私有链:集中管理者进行限制,只能得到内部少数人可以使用,信息不公开。
联盟链:介于公开链和私有链之间,由若干组织一起合作维护一条区块链,该区块链的使用必须是有权限的管理,相关信息会得到保护,典型如银联组织。
二、什么是hyperledger?
2015 年 12 月,Linux 基金 会牵头,联合 30 家初始成员共同 宣告 了Hyperledger 项目的成立。
该项目的出现,实际上宣布区块链技术已经不单纯是一个开源技术了,已经正式被主流机构和市场认可;同时,Hyperledger 首次提出和实现的完备权限管理、创新的一致性算法和可拔插的框架,对于区块链相关技术和产业的发展都将产生深远的影响。
目前有fabric和sawtooth Lake两个子项目。
fabric:包括 fabric 和 fabric-api,目标是区块链的基础核心平台,支持 pbft 等新的共识机制,支持权限管理,最早由 IBM 和 DAH 发起。
sawtooth Lake:包括 arcade、core、dev-tools、validator、mktplace 等。是 Intel 主要贡献和主导的区块链平台,支持全新的共识机制 Proof of Elapsed Time(PoET)。
三、hyperledger fabric 项目的安装部署。
系统:Linux最新版,eg.ubuntu16.04就可以 ,官网可下。
①安装docker
ubuntu 高级版本自带安装包,执行命令
# apt-get -y install docker.io
#sudo docker version //查看版本
②安装docker-compose
首先,安装 pip
# sudo aptitude install python-pip
安装 docker-compose
# sudo pip install docker-compose
③下载相关docker镜像,并进行配置。镜像地址https://hub.docker.com/r/yeasy/hyperledger
当然也可以到Github官方下载。
# docker pull yeasy/hyperledger:latest
# docker tag yeasy/hyperledger:latest hyperledger/fabric-baseimage:latest
# docker pull yeasy/hyperledger-peer:latest
# docker pull yeasy/hyperledger-membersrvc:latest
④使用 PBFT 模式
PBFT 是经典的分布式一致性算法,也是 hyperledger 目前最推荐的算法,该算法至少需要 4个节点。
首先,下载 compose 文件。
# git clone https://github.com/yeasy/docker-compose-files
此时目录下多了一个docker-compose-files文件夹。
(1)采用CLI测试
手动启动docker-daemon
#service docker stop
#sudo docker daemon --api-cors-header="*" -H tcp://0.0.0.0:2375 -H unix:///var/run/do
cker.sock
进入 hyperledger 项目,启动集群。
# cd docker-compose-files/hyperledger
# docker-compose up
此时生成四个节点,vp0,vp1,vp2,vp3。
进入节点vp0
#docker exec -it vp0 bash
部署两个账户a,b分别分配100和200.
#peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/
chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
返回CORE_CHAINCODE_ID_NAME(一串地址),
以如下形式:
a5389f7dfb9efae379900a41db1503fea2199fe400272b61ac5fe7bd0c6b97cf10ce3aa8dd00cd7626ce02f18accc7e5f2059dae6eb0786838042958352b89fb
查询账户余额
#peer chaincode query -n CORE_CHAINCODE_ID_NAME -c '{"Function": "query", "Args": ["a"]}'
应当返回100
进行交易
peer chaincode invoke -n CORE_CHAINCODE_ID_NAME -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'
交易进行后 a减少10,b增加10。
可再次查询验证交易结果。
(2)Post rest测试
注:POST测试可采用postman谷歌浏览器插件或各种在线POST工具进行,此处将采用curl工具,在Linux窗口进行POST操作。
手动启动docker-daemon
#service docker stop
#sudo docker daemon --api-cors-header="*" -H tcp://0.0.0.0:2375 -H unix:///var/run/do
cker.sock
打开hyperledger项目,启动pbft集群,生成节点
#docker-compose -f docker-compose-with-membersrvc.yml up
1、进行Rest 测试,登录用户Jim
#curl -H "Content-Type: application/json" -X POST --data '{"enrollId": "jim","enrollSecret": "6avZQLwcUe9b"}' http://localhost:5000/registrar
显示如下
2、chaincode部署
curl -H "Content-Type: application/json" -X POST --data '{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID":{
"path":"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
},
"ctorMsg": {
"function":"init",
"args":["a", "1000", "b", "2000"]
},
"secureContext": "jim"
},
"id": 1
}' http://localhost:5000/chaincode
Response如下
{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "28bb2b2316171a706bb2810ec35d095f430877bf443f1061ef0f60bbe753ed440700a
5312c16390d3b30199fe9465c3b75d5944358caae01ca81ef28128a1bfb"
},
"id": 1
}
3、chaincode调用
转账,invoke调用
#curl -H "Content-Type: application/json" -X POST --data '{
"jsonrpc": "2.0",
"method": "invoke",
"params": {
"type": 1,
"chaincodeID":{
"name":"28bb2b2316171a706bb2810ec35d095f430877bf443f1061ef0f60bbe753ed440700
a5312c16390d3b30199fe9465c3b75d5944358caae01ca81ef28128a1bfb"
},
"ctorMsg": {
"function":"invoke",
"args":["a", "b", "100"]
},
"secureContext": "jim"
},
"id": 3
}' http://localhost:5000/chaincode
Response如下:
{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "509b7500-96da-4411-8464-e24c61d5477d"
},
"id": 3
}
3、chaincode查询
调用query
curl -H "Content-Type: application/json" -X POST --data '{
"jsonrpc": "2.0",
"method": "query",
"params": {
"type": 1,
"chaincodeID":{
"name":"28bb2b2316171a706bb2810ec35d095f430877bf443f1061ef0f60bbe753ed440700a5312c16390d3b30199fe9465c3b75d5944358caae01ca81ef28128a1bfb"
},
"ctorMsg": {
"function":"query",
"args":["a"]
},
"secureContext": "jim"
},
"id": 5
}' http://localhost:5000/chaincode
返回
4、区块信息查询
URL
GET localhost:5000/chain/blocks/2
#curl http://localhost:5000/chain/blocks/2
(3)python客户端交互
利用Python客户端与hyperledger进行交互
1、安装python
#pip install hyperledger --upgrade
2、进入python客户端
#python
>>>from hyperledger.client import Client
>>>c = Client(base_url="http://localhost:5000")
>>>c.peer_list()//返回区块链节点组成的网络信息
返回如下:
>>> c.block_get('2') //获取区块信息
>>>c.chain_list() //获取当前blockchain状态
>>>
具体API使用见 https://github.com/yeasy/hyperledger-py/blob/master/docs/api.md