我操做的系統環境是ubuntu16.04,若是你的系統是windows,先安裝一個virtualbox。javascript
一、新建{名字:超級帳本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)運行 設備-安裝加強功能git
2)設備-共享粘帖板,選擇雙向github
---重啓系統,加強功能生效golang
3)設備-共享文件夾,點選右側增長按鈕添加共享文件夾,在彈出框設置以下:docker
l 共享文件夾路徑,選「其餘」,而後選擇你本機的共享文件夾(例如個人D:\share);
l 勾選「固定分配」;
mkdir /mnt/share/ sudo mount -t vboxsf share /mnt/share/
sudo apt-get install openssh-server
登錄你剛裝好的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
從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
安裝pip:
sudo apt-get install python-pip
修改權限:
su - zpc sudo chmod +x /usr/local/bin/docker-compose
查看安裝的版本:
docker-compose -v
查看本地源中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
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
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