hyperledger fabric1.0部署實操 一

 

我操做的系統環境是ubuntu16.04,若是你的系統是windows,先安裝一個virtualbox。javascript

1  oracle virtual Box 5.1.26安裝配置

1.1 虛擬機安裝

一、新建{名字:超級帳本1.0;linux;ubuntu桌面版16,0.4  64bit}     --64位須要更改bios以支持虛擬化,事先下好ubuntu鏡像;java

二、份內存2G,建立虛擬硬盤,文件類型選VDI模式,把文件設置爲保存在E盤,分上20G以上;node

三、開始安裝ubuntu,我用到版本是16.4桌面版,選中文簡體,勾選「安裝ubuntu是下載更新」,選擇「其餘選項」,本身手工設置分區;python

四、分區的設置:分給交換分區500m,分給/boot300m,其餘的都分給/根目錄,其中根目錄是主分區,其餘邏輯分區;linux

五、時區選上海,語言默認漢語便可;ios

1.2 共享粘貼板、共享文件夾的設置

1)運行 設備-安裝加強功能git

2)設備-共享粘帖板,選擇雙向github

---重啓系統,加強功能生效golang

3)設備-共享文件夾,點選右側增長按鈕添加共享文件夾,在彈出框設置以下:docker

l 共享文件夾路徑,選「其餘」,而後選擇你本機的共享文件夾(例如個人D:\share);

l 勾選「固定分配」;

mkdir /mnt/share/
sudo mount -t vboxsf share /mnt/share/

1.3 ssh配置

sudo apt-get install openssh-server

2  hyperdeger fabric1.0安裝

登錄你剛裝好的virtualbox,先配置環境:

lsb_release -a  (查詢本身系統的版本號,個人是xenial,下面找源的時候要對應上)
cp /etc/apt/sources.list /etc/apt/sources.list.bak
vim  /etc/apt/sources.list

修改源內容(徹底替換掉就內容):

先清空舊的內容,在命令模式下輸入:

ggdG

而後切換到插入模式拷貝如下內容粘貼過去(輸入i便可切換到輸入模式,按esc鍵切換回命令模式,在命令模式輸入:wq進行保存):

#deb包
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse  
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
##測試版源  
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse  
# 源碼   
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse  
##測試版源  
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse

修改DNS:

sudo vim /etc/resolvconf/resolv.conf.d/base
nameserver 202.96.134.133
nameserver 8.8.8.8
sudo resolvconf -u

更新源:

sudo apt update

安裝crul:

sudo apt install curl

若是git默認沒有安裝也執行安裝:

sudo apt install git

設置git參數:

git config --global http.postBuffer 524288000

2.1 配置docker

從daocloud安裝docker:

curl -sSL https://get.daocloud.io/docker | sh

添加當前用戶到docker:

sudo usermod -aG docker zpc
sudo gpasswd -a zpc docker
newgrp - docker

修改 Docker 服務配置:

sudo vim /etc/default/docker     
添加
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*'"

設置國內Daocloud的Docker加速器地址:

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8d37c888.m.daocloud.io
重啓docker

sudo service docker restart

測試:

docker -v
docker pull hello-world
docker run hello-world

2.2 配置docker-compse

安裝pip:

sudo apt-get install python-pip

修改權限:

su - zpc
sudo chmod +x /usr/local/bin/docker-compose

查看安裝的版本:

docker-compose -v

2.3 安裝配置GO

查看本地源中go的版本
apt-cache madison golang
若是版本低則手動從官網下載安裝(當前是1.9)
wget --no-check-certificate https://studygolang.com/dl/golang/go1.9.2.linux-amd64.tar.gz
##若是此連接地址很差用換這個https://dl.gocn.io/golang/1.9.2/go1.9.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
vi ~/.profile
export PATH=$PATH:/usr/local/go/bin 
export GOROOT=/usr/local/go 
export GOPATH=$HOME/go 
export PATH=$PATH:$HOME/go/bin

source ~/.profile
cd ~
mkdir go

go version

2.4 安裝配置node、npm、cnpm

用nvm安裝node與npm

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
關閉重啓終端
nvm ls-remote
nvm install v9.1.0

cnpm配置:

npm install -g cnpm --registry=https://registry.npm.taobao.org

2.5 下載fabric

mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git      
cd ~/go/src/github.com/hyperledger/fabric
git init
git checkout -b v1.0.0

3 e2e_cli樣例實操

e2e_cli是fabric下面的一個獨立樣例:與e2e_cli同級的還有

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
下載fabric相關鏡像:
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0

啓動fabric

./network_setup.sh up

OK了以後,如下嘗試一些簡單操做:

另行打開一個命令行  

docker exec -it cli bash

查詢A帳戶餘額

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

查詢結果應該有90

把a帳戶的餘額再轉20元給b帳戶

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'

再查詢a帳戶看是否剩下70了

退出cli容器      
exit 
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
關閉fabric
./network_setup.sh down

用node客戶端sdk在節點本地鏈接操做區塊鏈

mkdir ~/nodeTest
cd ~/nodeTest
vi package.json

{ 
     "name": "nodeTest", 
     "version": "1.0.0", 
     "description": "Hyperledger Fabric Node SDK Test Application", 
     "scripts": { 
         "test": "echo \"Error: no test specified\" && exit 1" 
     }, 
     "dependencies": { 
         "fabric-ca-client": "^1.0.0", 
         "fabric-client": "^1.0.0" 
     }, 
     "author": "zpc", 
     "license": "Apache-2.0", 
     "keywords": [ 
         "Hyperledger", 
         "Fabric", 
         "Test", 
         "Application" 
     ] 
}
npm install --registry=https://registry.npm.taobao.org       (走國內淘寶的鏡像)

vi query.js

'use strict';

var hfc = require('fabric-client'); 
var path = require('path'); 
var sdkUtils = require('fabric-client/lib/utils') 
var fs = require('fs'); 
var options = { 
    user_id: 'Admin@org1.example.com', 
    msp_id:'Org1MSP', 
    channel_id: 'mychannel', 
    chaincode_id: 'mycc',  
    network_url: 'grpcs://localhost:7051',//由於啓用了TLS,因此是grpcs,若是沒有啓用TLS,那麼就是grpc 
    privateKeyFolder:'/home/zpc/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore', 
    signedCert:'/home/zpc/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem', 
    tls_cacerts:'/home/zpc/go/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt', 
    server_hostname: "peer0.org1.example.com" 
};

var channel = {}; 
var client = null; 
const getKeyFilesInDir = (dir) => { 
//該函數用於找到keystore目錄下的私鑰文件的路徑 
    var files = fs.readdirSync(dir) 
    var keyFiles = [] 
    files.forEach((file_name) => { 
        let filePath = path.join(dir, file_name) 
        if (file_name.endsWith('_sk')) { 
            keyFiles.push(filePath) 
        } 
    }) 
    return keyFiles 
} 
Promise.resolve().then(() => { 
    console.log("Load privateKey and signedCert"); 
    client = new hfc(); 
    var    createUserOpt = { 
                username: options.user_id, 
                 mspid: options.msp_id, 
                cryptoContent: { privateKey: getKeyFilesInDir(options.privateKeyFolder)[0], 
  signedCert: options.signedCert } 
        } 
//以上代碼指定了當前用戶的私鑰,證書等基本信息 
return sdkUtils.newKeyValueStore({ 
                        path: "/tmp/fabric-client-stateStore/" 
                }).then((store) => { 
                        client.setStateStore(store) 
                         return client.createUser(createUserOpt) 
                 }) 
}).then((user) => { 
    channel = client.newChannel(options.channel_id); 
    
    let data = fs.readFileSync(options.tls_cacerts); 
    let peer = client.newPeer(options.network_url, 
         { 
            pem: Buffer.from(data).toString(), 
             'ssl-target-name-override': options.server_hostname 
        } 
    ); 
    peer.setName("peer0"); 
    //由於啓用了TLS,因此上面的代碼就是指定TLS的CA證書 
    channel.addPeer(peer); 
    return; 
}).then(() => { 
    console.log("Make query"); 
    var transaction_id = client.newTransactionID(); 
    console.log("Assigning transaction_id: ", transaction_id._transaction_id); 
//構造查詢request參數 
    const request = { 
        chaincodeId: options.chaincode_id, 
        txId: transaction_id, 
        fcn: 'query', 
        args: ['a'] 
    }; 
     return channel.queryByChaincode(request); 
}).then((query_responses) => { 
    console.log("returned from query"); 
    if (!query_responses.length) { 
        console.log("No payloads were returned from query"); 
    } else { 
        console.log("Query result count = ", query_responses.length) 
    } 
    if (query_responses[0] instanceof Error) { 
        console.error("error from query = ", query_responses[0]); 
    } 
    console.log("Response is ", query_responses[0].toString());//打印返回的結果 
}).catch((err) => { 
    console.error("Caught Error", err); 
});

node query.js

相關文章
相關標籤/搜索