1. 程式人生 > >hyperedger +fabric 區塊鏈實踐

hyperedger +fabric 區塊鏈實踐

---------------------------------------------------------------------------------------------
[版權申明:本文系作者原創,轉載請註明出處] 
文章出處:https://blog.csdn.net/sdksdk0/article/details/82222792

作者:朱培      ID:sdksdk0     
--------------------------------------------------------------------------------------------

一、Fabric開發基礎必備

 hash:相同的資料內容,會生成相同的hash值。

區塊:區塊有區塊的編號、交易資料、時間戳等來生成一系列的雜湊值

挖礦:去計算一個隨機數、滿足我們hash值的一個隨機數。   

安裝nodejs環境:

下載安裝

windows安裝NodeJS

npm  install  blockchain-cli  -g

安裝完成後直接輸入  blockchain  進入

輸入內容,從創世區塊開始,例如我這裡輸入bc

挖礦,通過 mine 這個命令

例如:   mime   "ab 100"

可以通過創世區塊的名稱  我這邊是  bc來檢視區塊,目前一共兩個區塊了。當前區塊的  pre  Hash就是上一個區塊的雜湊值。

挖礦的時候回有競爭的問題,類似於在猜某個數字,猜中表示為挖礦成功,然後廣播給各個節點,然後再驗證是否正確,如果正確,就設定為下一個區塊。假設有100個人,如果兩個人同時猜對了,就會出現兩個分叉的問題,礦池與礦池之間的競爭,

hash值的4個前導0,是有效雜湊的最低要求,所需的前導0的數量為難度。

pragma solidity ^0.413;

contract Ballot {

    struct Voter {

        uint weight;

        bool voted;

        uint8 vote;

        address delegate;

    }

    struct Proposal {

        uint voteCount;

    }

    address chairperson;

    mapping(address => Voter) voters;

    Proposal[] proposals;

    /// Create a new ballot with $(_numProposals) different proposals.

    function Ballot(uint8 _numProposals) public {

        chairperson = msg.sender;

        voters[chairperson].weight = 1;

        proposals.length = _numProposals;

    }

    /// Give $(toVoter) the right to vote on this ballot.

    /// May only be called by $(chairperson).

    function giveRightToVote(address toVoter) public {

        if (msg.sender != chairperson || voters[toVoter].voted) return;

        voters[toVoter].weight = 1;

    }

    /// Delegate your vote to the voter $(to).

    function delegate(address to) public {

        Voter storage sender = voters[msg.sender]; // assigns reference

        if (sender.voted) return;

        while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender)

            to = voters[to].delegate;

        if (to == msg.sender) return;

        sender.voted = true;

        sender.delegate = to;

        Voter storage delegateTo = voters[to];

        if (delegateTo.voted)

            proposals[delegateTo.vote].voteCount += sender.weight;

        else

            delegateTo.weight += sender.weight;

    }

    /// Give a single vote to proposal $(toProposal).

    function vote(uint8 toProposal) public {

        Voter storage sender = voters[msg.sender];

        if (sender.voted || toProposal >= proposals.length) return;

        sender.voted = true;

        sender.vote = toProposal;

        proposals[toProposal].voteCount += sender.weight;

    }

    function winningProposal() public constant returns (uint8 _winningProposal) {

        uint256 winningVoteCount = 0;

        for (uint8 prop = 0; prop < proposals.length; prop++)

            if (proposals[prop].voteCount > winningVoteCount) {

                winningVoteCount = proposals[prop].voteCount;

                _winningProposal = prop;

            }

    }

}

metamask  以太坊錢包:

下載好之後,在谷歌瀏覽器中新增擴充套件外掛;metamask_extension_4_3_0_0.crx

獲得測試幣的方法:

pragma solidity ^0.4.13;

contract Apple {

    uint price;

    uint size;

    function Apple() public{

        price = 11000;

        size = 15;

    }

    function getSize() constant  returns(uint){

        return size;

    }

}

二、Hyperledger

區塊是一組有序的交易集合,在通道中經過加密後與前序區塊連線。

Instancetiate  -例項化

Invoke - 呼叫

Leading Peer  -主導節點

三、hyperedger  fabric  centos 環境搭建

1、安裝cURL

檢視版本: curl  --version

2、安裝docker 和docker compose

yum install –y  docker gcc gcc-c++

首先安裝epel擴充套件源:

sudo yum -y install epel-release

然後安裝python-pip

sudo yum -y install python-pip

pip install docker-compose

docker-compose  --version   #查詢版本

yum -y install nodejs npm --enablerepo=epel  #使用epel源安裝nodejs及npm

驗證npm安裝:

npm install [email protected]

檢視npm版本:

npm -v

3、go語言

yum  install go

4、Nodejs執行環境

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash

vim ~/.bashrc

export NVM_DIR="/root/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

source  ~/.bashrc

nvm install 6.9.5

5、安裝git

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.編譯安裝:

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

映象安裝

1、下載Hyperledger的simple demo

cd 到這個目錄中

2、平臺特定二進位制檔案安裝:

curl  -sSL https:goo.gl/byy2Qj | bash -s 1.0.5

離線地址:

選擇:linux-amd64-1.1.0/進行下載

將這個檔案解壓到fabric-samples中的bin目錄下

3、啟動檔案配置

這個時候還需要一個init.sh

註釋掉這兩行內容:

echo "===> Downloading platform binaries"

curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | tar xz

4、賦權:

chmod -R 777 init.sh

5、執行:

  ./init.sh 1.0.5

這個時候會安裝映象

-----------------------

備用網址:

wget https://github.com/hyperledger/fabric-samples/archive/release-1.0.zip

---------------------------------

在fabric-samples資料夾中

$    cd first-network/

先把所有網路關閉掉:

./byfn.sh -m down  

然後再開始

$   ./byfn.sh -m generate

生成初始的區塊:

.$   ../bin/cryptogen generate --config=./crypto-config.yaml

$   export  FABRIC_CFG_PATH=$PWD

../bin/configtxgen  -profile TwoOrgsOrdererGenesis -outputBlock  ./channel-artifacts/genesis.block

生成應用通道的配置資訊

$   export CHANNEL_NAME=mychannel

$   ../bin/configtxgen -profile  TwoOrgsChannel   -outputCreateChannelTx ./channel-artifacts/channel.tx  -channelID $CHANNEL_NAME

生成錨節點配置更新檔案

$   ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate  ./channel-artifacts/Org1MSPanchors.tx  -channelID $CHANNEL_NAME   -asOrg Org1MSP

$   ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate  ./channel-artifacts/Org2MSPanchors.tx  -channelID $CHANNEL_NAME   -asOrg Org2MSP

操作網路

編輯docker-compose-cli.yaml ,註釋command命令

 # command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'

在命令列執行:

$   CHANNEL_NAME=$CHANNER_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d 

建立和加入通道

進入docker容器

$    docker exec -it cli bash

進入docker中建立通道:

$   export CHANNEL_NAME=mychannel

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

加入通道

peer channel join -b mychannel.block

鏈碼:

peer chaincode install -n mycc -v 1.0 -p    github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

例項化鏈碼

peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --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 $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"

查詢:

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

現操作A轉賬給B 10 塊錢

peer chaincode invoke -o orderer.example.com:7050  --tls  $CORE_PEER_TLS_ENABLED   --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 $CHANNEL_NAME -n mycc    -c '{"Args":["invoke","a","b","10"]}'

查詢 a 賬戶的金額

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

遇到的問題:

在阿里的伺服器(CentOS 7.3、CentOS 7.2、Ubuntu 16)執行first-network報錯

執行cli容器的script.sh時候,建立渠道時cli控制檯錯誤摘要:

新增這樣一行:

- GODEBUG=netdns=go

1

你刪除的映象可能被其他容器使用,可以試試這條命令:

[email protected]:~# sudo docker rmi -f 1dd

docker rm$(docker ps -a -q)

docker rmi $(docker images -q)

四、nodejs  sdk和fabice合約互動。

1、在fabric-samples-release-1.0/fabcar目錄下執行:   npm  install  進行安裝node_modules,安裝好之後就會有很多檔案出現。

2、殺掉活躍的相關容器

docker  rm -f $(docker ps -aq)

3、清理快取的網路

docker network prune

4、刪除fabcar智慧合約的底層鏈碼影象,如果是第一次執行這個專案可以不執行(可以通過 docker  images來查詢需要刪除的映象)

docker rmi dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9

5、啟動網路

./startFabric.sh node

6、註冊管理員使用者

node  enrollAdmin.js

註冊user1 使用者

node registerUser.js

查詢賬目

node query.js

執行結果:

Store path:/Users/fujinliang/fabric/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Query has completed, checking results
Response is [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

查詢某一個的賬目

修改 query.js , 可以查詢key為CAR4 的記錄

const request = {
//targets : --- letting this default to the peers assigned to the channel
chaincodeId: 'fabcar',
fcn: 'queryCar',
args: ['CAR4']
};

執行 node query.js

Response is {"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}

更新賬目

修改 invoke.js, 新增一條資料

var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: 'createCar',
args: ['CAR10', 'Chevy', 'Volt', 'Red', 'Nick'],
chainId: 'mychannel',
txId: tx_id
};

執行 node invoke.js,可以新增一條資料進入賬目

修改 query.js

const request = {
//targets : --- letting this default to the peers assigned to the channel
chaincodeId: 'fabcar',
fcn: 'queryCar',
args: ['CAR10']
};

執行 node query.js ,

Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}

修改 invoke.js, 修改CAR10的擁有者為 Dave

var request = {
//targets: let default to the peer assigned to the client
chaincodeId: 'fabcar',
fcn: 'changeCarOwner',
args: ['CAR10', 'Dave'],
chainId: 'mychannel',
txId: tx_id
};

執行 node invoke.js, 再執行 node query.js , 執行結果:

Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Dave"}

五、鏈碼開發環境搭建:

1、鏈碼存放:  將chaincode002 複製到fabric-samples/chaincode目錄下

2、開啟3個終端

終端1:啟動網路

cd chaincode-docker-devmode/

docker-compose -f  docker-compose-simple.yaml up

遇到的問題:啟動時報錯:

Error: Invalid channel create transaction : mismatched channel ID mycc != myc

解決方案:

修改chaincode-docker-devmode目錄下的scripts.sh

將裡面的myc   換成mycc

終端2:編譯且啟動鏈碼

docker exec -it chaincode bash

cd chaincode002

go build

CORE_PEER_ADDRESS=peer:7051 CORE_CHAINCODE_ID_NAME=myccc:0 ./chaincode002

終端3: 操作鏈碼

docker exec -it cli bash

安裝鏈碼

peer  chaincode install -p chaincodedev/chaincode/chaincode002  -n  myccc  -v 0

例項化鏈碼

peer chaincode  instantiate  -n  mycc -v 0 -c '{"Args":["str","helloworld"]}'  -C mycc

相關推薦

hyperedger +fabric 區塊實踐

--------------------------------------------------------------------------------------------- [版權申明:本文系作者原創,轉載請註明出處]  文章出處:https://blog.cs

澳門中國鉆石與寶石交易所攜手數秦,探索鉆石行業區塊實踐

近日 擴大 影響力 華麗 公眾 帶來 圖片 平臺 印象 近日,數秦科技與萬邦聯合有限公司(以下簡稱:萬邦聯合)成立合資公司,萬邦聯合為澳門中國鉆石與寶石交易所(以下簡稱:澳鉆所)控股公司,雙方將共同為鉆石這一古老的奢侈品帶來美好的改變。 在公眾的印象中,鉆石的情感價值往往被

區塊實踐分享:銀行跨行開戶

本實踐以基於區塊鏈身份共享的銀行賬戶跨行開戶Demo的部署為例進行講解。且是基於華為雲的區塊鏈服務,部署區塊鏈網路與應用,供您參考。 一、關於Demo 業務場景: 基於一家銀行的賬戶以及已有的KYC資訊背書,免KYC過程開通另外一個銀行的賬戶。 主要訴求: 使用者身份等資訊需要加密,避免暴力破解;提供基於

郝振亞:工業網際網路領域邊緣計算與區塊實踐

隨著智慧製造與工業網際網路的不斷髮展,工業網際網路領域與其它新興技術體系是否可以挖掘出更多的有效結合方式,區塊鏈在實體經濟建設過程中如何體現其特有價值,區塊鏈的BaaS服務形態,怎樣才能更靈活的服務多種專案需求,上海億喆網路公司試圖通過工業網際網路領域的實際案例瞭解,為以上問題找到一些有價值的思考方向和解答

區塊 建立Hyperledger Fabric區塊網路

fabric-samples-1.4.0 開發搭建 一、環境安裝前準備: (1)首先安裝基本工具 yum install git yum install curl yum -y install epel-release yum install python-pip pip ins

NodeJS區塊實踐(1)Nodejs搭建簡易區塊

區塊鏈的目的之一是讓我們所需要的“有價值”的資訊得以儲存且不可更改,這些資訊都儲存在一個叫做“區塊(block)”的結構中。以比特幣為例,被認為是有價值的資訊是“交易”,所有的交易儲存在區塊中,通過區塊的hash、時間戳等實現資訊的可追溯以及不可更改性。 我們這裡首先實現的

澳門中國鑽石與寶石交易所攜手數秦,探索鑽石行業區塊實踐

近日,數秦科技與萬邦聯合有限公司(以下簡稱:萬邦聯合)成立合資公司,萬邦聯合為澳門中國鑽石與寶石交易所(以下簡稱:澳鑽所)控股公司,雙方將共同為鑽石這一古老的奢侈品帶來美好的改變。 在公眾的印象中,鑽石的情感價值往往被放在首位,代表著永恆不變與忠貞不渝。事實上,鑽石具有穩定

區塊實踐|區塊+數字版權:“權利”的遊戲

數字版權,一直是區塊鏈落地的“香餑餑”。它有著天然的優勢:原生就在線上,不存在線上線下自有閉環。 版權的定義,也是在進入數字化時代後有了更多的擴充。 除了傳統的複製權、發行權、資訊網路傳播權,數字版權還增加了包括未經作者允許其他人不得隨意接觸作品的接觸權,集傳

區塊實踐(二) 以太坊Geth入門操作

進入Geth 命令列模式 在上一篇文章中,我們說到,我們可以用下面命令,建立一個新的私有鏈 geth --datadir "./" --nodiscover console 2>>geth.log 進入命令列模式,其中引數 –datadi

Fabric--區塊應用開發

區塊鏈應用開發 簡介 數字貨幣曾是區塊鏈技術的唯一應用場景 對智慧合約的支援突破了場景限制, 豐富了區塊鏈應用的適用範圍, 可以支援多行業、大規模的商業應用 區塊鏈應用 區塊鏈應用: 一般由若干部署在區塊鏈網路中的智慧合約, 以及呼叫這些智慧

使用Hyperledger Composer將業務網路部署到單個組織的Hyperledger Fabric區塊

前言 Hyperledger Composer官方一直在維護更新中,寫作本文時最新release版本為0.16,從0.15的更新帶來了新的特性:card,也就是對使用者身份的封裝。如果你在以前的版本中使用過composer,你對身份並不會陌生,例如部

BitKeep與清華大學區塊實踐隊進行區塊技術及行業交流

針對區塊鏈技術現階段的技術瓶頸以及技術迭代方向展開討論,技術負責人Kevin表示,區塊鏈的核心是兩層技術,一是分散式資料庫技術;一是密碼學。前者對交易資料進行跨中心同步;後者主要涉及隱私和DESM加密演算法,在區塊鏈領域中,大家會面臨很多技術上的瓶頸,比如資料傳輸時效。針對這

區塊實踐(一) 以太坊網路+geth搭建私有網路實戰

一、乙太網網路 理解以太坊 PrivateNetwork 先要理解以太坊的兩種官方網路, 目前以太坊官方提供了兩種網 生產環境網路 測試網路 TestNet ** 1 以太坊生產網路 以太坊的生產網路顧名思義,也就是產生真正有價值的 的以太幣的網路

區塊100講:Hyperledger Fabric 區塊多機部署

區塊鏈技術可以應用在很多領域,未來最有可能先在這些領域落地。 區塊鏈技術是利用塊鏈式資料結構來驗證與儲存資料、利用分散式節點共識演算法來生成和更新資料、利用密碼學的方式保證資料傳輸和訪問的安全、利用由自動化指令碼程式碼組成的智慧合約來程式設計和操作資料的一

Fabric區塊kafka共識入門

Hyperledger Fabric推薦Kafa用於生產環境。Kafa是一個分散式、具有水平伸縮能力、崩潰容錯能力 的日誌系統。在

Hyperledger Fabric區塊工具configtxgen配置configtx.yaml

哪些 層級 說明 nco config cast batch ipa con configtx.yaml是Hyperledger Fabric區塊鏈網絡運維工具configtxgen用於生成通道創世塊或通道交易的配置文件,configtx.yaml的內容直接決定了所生成的創

002-主流區塊技術特點及Fabric V0.6版本特點

集中 擴展 http per 推出 全部 -1 維護 進行 一、主流區塊鏈技術特點    二、Hyperledger的fabric V0.6總體架構:    對應的0.6版本的運行時架構:    0.6版本的架構特點是:  結構簡單: 應用-成員管理-Peer的

實戰:區塊hyperledger fabric 初體驗 - 3: 碼實例安裝、實例化、調用及代碼

區塊鏈 hyperledger fabric blockchain 本文鏈碼實例為Fabric 官方實例examples/chaincode/go/chaincode_example02,實現簡單的轉賬功能進入到cli容器裏面$ docker exec -it fabric-cli bash1

區塊之Hyperledger(超級賬本)Fabric v1.0 的環境搭建(更新)

mirror linu stat iyu wget glob 保存 url oba 參考鏈接:https://blog.csdn.net/so5418418/article/details/78355868 https://blog.csdn.net/wgh101539

區塊技術系列(3)- Fabric基礎架構原理

多看 技術分享 發的 size 開源項目 初始 排序。 創建 生成 前言 對於區塊鏈方面多技術,我還是建議大家多看英文文檔,多利用Google來搜索技術文章。 怎麽搭建自己專屬V-P-N來訪問Google,請看我之前發的文章: 新人如何快速搭建自己的個人網站以及自己專屬