Hyperledger Fabric開發環境與運行環境的搭建:項目約定共同遵照的 基本原則 爲:重視模塊化設計,包括交易、合同、一致性、身份、存儲等技術場景;代碼可讀性,保障新功能和模塊均可以很容易添加和擴展;演化路線,隨着需求的深刻和更多的應用場景,不斷增長和演化新的項目。python
執行代碼以下:git
curl -sSL https://get.daocloud.io/docker | sh
安裝完成後,查看安裝狀況:github
docker -v
查看docker的安裝目錄算法
whereis docker
修改docker服務配置(/usr/bin/docker 文件)docker
vi /usr/bin/docker
把如下配置文件複製到服務配置文件裏:json
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*'"
重啓docker服務vim
sudo service docker restart
先安裝python-pip,具體安裝步奏以下:api
1.首先安裝epel擴展源:瀏覽器
sudo yum -y install epel-release
2.而後安裝python-pip緩存
sudo yum -y install python-pip
3.安裝完成後,清除如下緩存 cache
sudo yum clean all
下面開始安裝docker-compose
1.安裝docker-compose:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2.查看安裝狀況:
配置如下docker鏡像加速,目的是下載鏡像速度更快:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://860eaa91.m.daocloud.io
重啓docker服務:
sudo service docker restart
docker pull hyperledger/fabric-peer:x86_64-0.6.1-preview \ && docker pull hyperledger/fabric-membersrvc:x86_64-0.6.1-preview \ && docker pull yeasy/blockchain-explorer:latest \ && docker tag hyperledger/fabric-peer:x86_64-0.6.1-preview hyperledger/fabric-peer \ && docker tag hyperledger/fabric-peer:x86_64-0.6.1-preview hyperledger/fabric-baseimage \ && docker tag hyperledger/fabric-membersrvc:x86_64-0.6.1-preview hyperledger/fabric-membersrvc
下載完成後,查看下載鏡像
1.安裝依賴包:
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
2.下載git源碼並解壓安裝:
$ wget https://github.com/git/git/archive/v2.3.0.zip $ unzip v2.3.0.zip $ cd git-2.3.0
3.編譯安裝:
make prefix=/usr/local/git all sudo make prefix=/usr/local/git install
4.修改環境變量:
sudo vim /etc/profile 而後在文件的最後一行,添加下面的內容,而後保存退出。 export PATH=/usr/local/git/bin:$PATH
5.使用source命令當即保存:
source /etc/profile
6.查看版本
git version
PBFT 是經典的分佈式一致性算法,也是 hyperledger 目前最推薦的算法,該算法至少須要 4 個節點。
1.首先,下載 Compose 模板文件。
git clone https://github.com/yeasy/docker-compose-files
2.查看下載狀況:
3.進入 hyperledger/0.6/pbft 目錄,查看包括若干模板文件
如下節點能夠快速啓動的詳細狀況:
4-peers.yml: 啓動 4 個 PBFT peer 節點。
4-peers-with-membersrvc.yml: 啓動 4 個 PBFT peer 節點 + 1 個 CA 節點,並啓用 CA 功能。
4-peers-with-explorer.yml: 啓動 4 個 PBFT peer 節點 + 1 個 Blockchain-explorer,能夠經過 Web 界面監控集羣狀態。
4-peers-with-membersrvc-explorer.yml: 啓動 4 個 PBFT peer 節點 + 1 個 CA 節點 + 1 個 Blockchain-explorer,並啓用 CA 功能。
4.快速啓動一個 4 個 PBFT 節點+1 個 CA 節點 + 1 個 Blockchain-explorer,並啓用 CA 功能的集羣:
docker-compose -f 4-peers-with-membersrvc-explorer.yml up
集羣啓動後,進入一個 VP 節點。以 pbft 模式爲例,節點名稱爲 pbft_vp0_1
docker exec -it pbft_vp0_1 bash
部署example02
peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
記錄到環境變量 CC_ID 中。
CC_ID="ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539"
查詢 chaincode
peer chaincode query -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'
調用 chaincode
peer chaincode invoke -n ${CC_ID} -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'
再次查詢a的值
peer chaincode query -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'
到此已經完成超級帳本的 轉帳的實例,每轉一次,都會記錄一個塊。
當啓用了權限管理後,首先須要登陸,例如之內置帳戶 jim 帳戶登陸。
登陸 vp0,並執行登陸命令。
docker exec -it pbft_vp0_1 bash
用內置jim帳戶登陸
peer network login jim
內置密碼爲:
6avZQLwcUe9b
登陸狀況以下圖:
登陸成功後,如下爲具體操做。
首先部署交易資產
peer chaincode deploy -u jim -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'
說明:部署時給a,b各初始值100 200
部署以後會產生一個name 值爲:
name:"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539"
把name值 賦給變量 CC_ID
CC_ID=ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
查詢下賦值結果:
echo ${CC_ID}
重要說明:部署成功後,會建立docker容器,建立docker容器會有延遲,因此有時查詢不出來,等建立好了,在查詢就能夠啦。
能夠看到建立了不少容器,以下圖:
下面我們來執行查詢操做試試,查下a的值:
peer chaincode query -u jim -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'
查下b的值:
peer chaincode query -u jim -n ${CC_ID} -c '{"Function": "query", "Args": ["b"]}'
下面我們來執行下 轉帳操做:
如:a向b轉帳10元
peer chaincode invoke -u jim -n ${CC_ID} -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'
轉帳成功後,我們來執行下查詢 a和b的值是多少:
peer chaincode query -u jim -n ${CC_ID} -c '{"Function": "query", "Args": ["b"]}'
peer chaincode query -u jim -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'
權限管理能正確 轉帳查詢。
下面使用REST方式我們來執行下查詢:
CC_ID=ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539
用這個CC_ID來作查詢
POST HOST:7050/chaincode
Request:
{ "jsonrpc": "2.0", "method": "query", "params": { "type": 1, "chaincodeID":{ "name":"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" }, "ctorMsg": { "function":"query", "args":["a"] }, "secureContext": "jim" }, "id": 3 }
查詢a的值爲:
Request:
{ "jsonrpc": "2.0", "method": "query", "params": { "type": 1, "chaincodeID":{ "name":"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" }, "ctorMsg": { "function":"query", "args":["b"] }, "secureContext": "jim" }, "id": 3 }
查詢b的值爲:
這時,a是145,b是155
下面再執行如下 a向b轉帳35
{ "jsonrpc": "2.0", "method": "invoke", "params": { "type": 1, "chaincodeID":{ "name":"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" }, "ctorMsg": { "function":"invoke", "args":["a","b","35"] }, "secureContext": "jim" }, "id": 3 }
如圖:
下面執行 查詢 a,和 b的值,請求參數 如上,直接上圖啦。
a的值爲 120
b的值爲180
下面查詢如下區塊信息:
GET HOST:7050/chain/blocks/2
Response:
{ "transactions": [ { "type": 2, "chaincodeID": "EoABNzhjYTMyZmMxMjlmMDExMjllMDEwYzM3YTc4ZDU2ODhiODEyNjY1NWI5NDU2MTNkMjFiMmM2MGJjYjNlMTFkYTFjZGViYTljMjM1NjNjMzhmYTQ3MTc3YWYwZGU2ZTNkOTRmNjc4MWQzMDlhMzBlN2QxOTBhNjU1NWU3YWU0ZWY=", "payload": "Cp0BCAESgwESgAE3OGNhMzJmYzEyOWYwMTEyOWUwMTBjMzdhNzhkNTY4OGI4MTI2NjU1Yjk0NTYxM2QyMWIyYzYwYmNiM2UxMWRhMWNkZWJhOWMyMzU2M2MzOGZhNDcxNzdhZjBkZTZlM2Q5NGY2NzgxZDMwOWEzMGU3ZDE5MGE2NTU1ZTdhZTRlZhoTCgZpbnZva2UKAWEKAWIKAzEwMA==", "txid": "8616608f-9762-44cc-bc09-ef93b88eb770", "timestamp": { "seconds": 1484792805, "nanos": 467224609 }, "nonce": "QTKtub7Nu/JJFXV5LhjcDYsxIViB27YF", "cert": "MIICQTCCAeegAwIBAgIQW9A+u+4IT7CRRcHJPxU1ZjAKBggqhkjOPQQDAzAxMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLSHlwZXJsZWRnZXIxDDAKBgNVBAMTA3RjYTAeFw0xNzAxMTkwMjI0MjBaFw0xNzA0MTkwMjI0MjBaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtIeXBlcmxlZGdlcjEgMB4GA1UEAxMXVHJhbnNhY3Rpb24gQ2VydGlmaWNhdGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQylvGqiwlIwjfef1J0o+2lBPEs0PQc90mooN/iQeJesX3Gw7hvX51NQ0R9Azhs3HzqwDT6/0oUJ5881BGCGufjo4HMMIHJMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMA0GA1UdDgQGBAQBAgMEMA8GA1UdIwQIMAaABAECAwQwTQYGKgMEBQYHAQH/BEArLNyVnxK3ZTvPvUStqnu90Soz7fkorQD0znFSKd32vwi8nVzKPLKuziDfULFQskeHV7UAVL28xjKPXjpa4tOUMDoGBioDBAUGCAQwdCe6zf7KXUkQavqTErscZyXjnx3YI1QbmuNIiYXptTkzhPCI+tKPa5nMxwlBbqbNMAoGCCqGSM49BAMDA0gAMEUCIQC/tJPRxcPq4l4F3hWoLT6OWO5f1A9HG1aPyurduM4oowIgbTibDjL98J7Dt7fw3TBCMVBSDska9FwlddqdSE/3bWA=", "signature": "MEUCIQCTxcHIu3kL5AuTOS11tnV4wp35pDtdQ7QCfXMr9txPBAIgH64AARCnRinLNN7V69ha75sdVqOKn/OPKYDWHxofsFM=" } ], "stateHash": "zHYqtOW0tZ9g1jbfaWgXB9udEETDocwet6HcsonKEJ9ncYZaCjLNAJS4Fao9W6AQR6FOkZR7FR7bvmocjtF00w==", "previousBlockHash": "Q3b82oFuJu0God7J4QGllDlAA4iW7cwu2yg6/oNnNQCAwYJXs/4WFgKXo75FGfdmvmeDputIQMdjc4vmrvkw8w==", "consensusMetadata": "CAI=", "nonHashData": { "localLedgerCommitTimestamp": { "seconds": 1484794929, "nanos": 31349065 }, "chaincodeEvents": [ {} ] } }
如圖:
到這裏 REST請求完成。以上是權限管理的具體操做。
下面咱們來看下節點的端口,以下圖:
這時咱們在谷歌瀏覽器裏就能夠訪問啦,
HOST:9090
訪問正常頁面爲:
查詢的具體的信息,以下圖:
查看交易詳情,以下圖:
到此,整個Hyperledger Fabric超級帳本環境已經部署完成。