日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hyperledger v1.0.5 区块链入门

發(fā)布時(shí)間:2023/12/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hyperledger v1.0.5 区块链入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

hyperledger v1.0.5 區(qū)塊鏈入門

本文作者最近在找工作,有意向致電 13113668890

Mr.?Neo Chen?(陳景峯),?netkiller, BG7NYT


中國(guó)廣東省深圳市龍華新區(qū)民治街道溪山美地
518131
+86?13113668890

<netkiller@msn.com>

版權(quán) ? 2018 http://netkiller.github.io

版權(quán)聲明

轉(zhuǎn)載請(qǐng)與作者聯(lián)系,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必標(biāo)明文章原始出處和作者信息及本聲明。

http://www.netkiller.cn
http://netkiller.github.io
http://netkiller.sourceforge.net
微信訂閱號(hào) netkiller-ebook (微信掃描二維碼)
QQ:13721218 請(qǐng)注明“讀者”
QQ群:128659835 請(qǐng)注明“讀者”

?

2018-02-06

摘要

本文采用碎片化寫作,原文會(huì)不定期更新,請(qǐng)盡量閱讀原文。

http://www.netkiller.cn/journal/hyperledger.html

目錄

  • 1. what-做什么
  • 2. how-怎么做
    • 2.1. 依賴工具
    • 2.2. 安裝Docker
    • 2.3. 安裝 Node.js 環(huán)境
    • 2.4. 安裝 hyperledger 1.0.4
    • 2.5. 手工安裝 hyperledger v 1.0.5 開發(fā)環(huán)境
      • 2.5.1. 登錄 docker
      • 2.5.2. Docker 安裝
      • 2.5.3. 編譯安裝
    • 2.6. 啟動(dòng) docker 虛擬機(jī)
    • 2.7. 管理 hyperledger
      • 2.7.1. CouchDB 管理界面
    • 2.8. 部署 chaincode
      • 2.8.1. channel 管理
        • 2.8.1.1. 列出 channel
        • 2.8.1.2. 創(chuàng)建 Channel
        • 2.8.1.3. 加入 Channel
      • 2.8.2. 部署連
      • 2.8.3. 測(cè)試
  • 3. fabric-samples
    • 3.1. fabcar
      • 3.1.1. 智能合約
      • 3.1.2. 創(chuàng)建記錄
      • 3.1.3. 查詢單條記錄
      • 3.1.4. 修改汽車所有者
    • 3.2. balance-transfer
  • 4. Hyperledger Composer
  • 5. Restful 接口
    • 5.1. 注冊(cè)
    • 5.2.?
  • 6. Hyperledger Fabric Client SDK for Node.js
    • 6.1. package.json
  • 7. fabric-sdk-java
    • 7.1. Maven
  • 8. FAQ
    • 8.1.?
    • 8.2. 卸載 hyperledger 環(huán)境

1.?what-做什么

區(qū)塊鏈技術(shù)發(fā)展至今,形成了公有鏈、聯(lián)盟鏈和邦鏈三種種主流技術(shù)平臺(tái)。

公有鏈: 面向大眾,用戶可以匿名參與,非常方便,賬本數(shù)據(jù)也公開,加上強(qiáng)大的智能合約,因此公有鏈極大地促進(jìn)了區(qū)塊鏈概念和技術(shù)的普及,比如比特幣、Ethereum平臺(tái)等。

聯(lián)盟鏈: 考慮到商業(yè)應(yīng)用對(duì)安全、隱私、監(jiān)管、審計(jì)、性能的需求,提高準(zhǔn)入門檻,增加了安全、隱私、可監(jiān)管審計(jì)等商業(yè)特性,是區(qū)塊鏈技術(shù)在商業(yè)領(lǐng)域的應(yīng)用探索。

邦鏈:暫時(shí)資料比較少。

概念

通道( Channel ):通道是構(gòu)建在 Hyperledger Fabric 區(qū)塊鏈網(wǎng)絡(luò)上的私有區(qū)塊鏈,實(shí)現(xiàn)了數(shù)據(jù)的隔離和保密。通道中的 Chaincode 和交易只有加入該通道的節(jié)點(diǎn)( Peer )可見。同一個(gè)節(jié)點(diǎn)可以加入多個(gè)通道,并為每個(gè)通道內(nèi)容維護(hù)一個(gè)賬本。每一個(gè)通道即為一條邏輯上的區(qū)塊鏈。可以按照業(yè)務(wù)來(lái)劃分通道,也可以按照行政職能和隱私策略來(lái)劃分通道。

節(jié)點(diǎn)( Peer ): 維護(hù)賬本的網(wǎng)絡(luò)節(jié)點(diǎn),通常區(qū)塊鏈網(wǎng)絡(luò)架構(gòu)中存在多種角色,如 endorser 和 committer 。

排序服務(wù)或共識(shí)服務(wù)( Order Services ) : 提供排序服務(wù)或共識(shí)服務(wù)的網(wǎng)絡(luò)節(jié)點(diǎn),完成交易的排序和區(qū)塊打包等工作,支持可插拔的共識(shí)組件,當(dāng)前生產(chǎn)環(huán)境下使用 Kafka 進(jìn)行交易排序。

分布式賬本( Distribute Ledger ) :由網(wǎng)絡(luò)中若干去中心化節(jié)點(diǎn)共同維護(hù)的數(shù)據(jù)賬本。

組織( Org ) :聯(lián)盟鏈中按照 訪問(wèn)和使用賬本的網(wǎng)絡(luò)節(jié)點(diǎn),一個(gè)聯(lián)盟(或者一個(gè)區(qū)塊鏈網(wǎng)絡(luò))有多個(gè)組織(成員),一個(gè)組織內(nèi)可以有多個(gè)節(jié)點(diǎn)( Peer ),每個(gè)節(jié)點(diǎn)參與賬本和世界狀態(tài)維護(hù)。

智能合約( Smart Contract ) :根據(jù)特定條件自動(dòng)執(zhí)行的合約程序。智能合約是區(qū)塊鏈的重要特征,是用戶與區(qū)塊鏈進(jìn)行交互,利用區(qū)塊鏈實(shí)現(xiàn)業(yè)務(wù)邏輯的重要途徑。

鏈碼( Chaincode ):鏈碼是 Hyperledger Fabric 對(duì)智能合約的一種實(shí)現(xiàn)方式,是運(yùn)行于 Hyperledger Fabric 網(wǎng)絡(luò)之上一段應(yīng)用程序代碼,也是用戶與 Hyperledger Fabric 交互的唯一途徑。

鏈( Chain ):一個(gè)鏈即是一個(gè)由若干區(qū)塊通過(guò)特定指向鏈接、摘要算法或加密算法錨定組成的數(shù)據(jù)集合。

2.?how-怎么做

+---------------------------------+ | SDK | +---------------------------------+ | golang | nodejs | python | java | +---------------------------------+ |V +---------------------------------+ | fabric-ca : | +---------------------------------+| | +-------------------+ +-------------------+ | Peer | | Peer | +-------------------+ +-------------------+ | |V V +-------------------+ +-------------------+ | Orderer | | Orderer | +-------------------+ +-------------------+| |+-------------------+| Couchdb |+-------------------+

2.1.?依賴工具

yum -y install epel-release yum install -y git yum install -y golang

2.2.?安裝Docker

curl -s https://raw.githubusercontent.com/oscm/shell/master/virtualization/docker/docker.centos7.ce.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/virtualization/docker/registry-mirror.sh | bash or curl -fsSL https://get.docker.com/ | sh 創(chuàng)建2個(gè)docker網(wǎng)絡(luò),如下: docker network create fabric_noops docker network create fabric_pbft

安裝 docker-compose

curl -s https://raw.githubusercontent.com/oscm/shell/master/virtualization/docker/docker-compose.sh | bash

2.3.?安裝 Node.js 環(huán)境

?

yum install -y nodejs npm install

2.4.?安裝 hyperledger 1.0.4

運(yùn)行后 hyperledger 相關(guān)鏡像被安裝到 Docker 中

cd /usr/local/src curl -s https://raw.githubusercontent.com/hyperledger/fabric/release/scripts/bootstrap-1.0.4.sh | bash

由于上面腳本會(huì)安裝所有節(jié)點(diǎn),速度較慢,作者建議你參考下一章節(jié),手工安裝所需最低配置節(jié)點(diǎn)。

2.5.?手工安裝 hyperledger v 1.0.5 開發(fā)環(huán)境

對(duì)于開發(fā)環(huán)境,最小化的環(huán)境,包括 1 個(gè) peer 節(jié)點(diǎn)、1 個(gè) Orderer 節(jié)點(diǎn)、1 個(gè) CA 節(jié)點(diǎn)。

準(zhǔn)備一個(gè)服務(wù)器或者虛擬機(jī),安裝 CentOS 操作系統(tǒng)。

如果你是在已有的Docker上安裝,建議你刪除所有容器后在安裝。以免出現(xiàn)沖突等情況。

docker stop $(docker ps -q) && docker rm $(docker ps -aq)

2.5.1.?登錄 docker

[root@localhost ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: netkiller Password: Login Succeeded

2.5.2.?Docker 安裝

docker pull hyperledger/fabric-baseimage:latest \&& docker pull hyperledger/fabric-membersrvc:latest \&& docker pull hyperledger/fabric-peer:latest \&& docker pull hyperledger/fabric-orderer:latest \&& docker pull hyperledger/fabric-ca:latest \&& docker pull hyperledger/blockchain-explorer:latest

安裝會(huì)出現(xiàn)下面問(wèn)題

[root@localhost ~]# docker search fabric-peer | grep hyperledger/fabric-peer hyperledger/fabric-peer Fabric Peer docker image for Hyperledger Pro… 69[root@localhost ~]# docker pull hyperledger/fabric-peer:latest Error response from daemon: manifest for hyperledger/fabric-peer:latest not found

可以 search 到的鏡像 pull 不了,原因是 fabric-peer:latest,latest 不存在,你需要指定版本號(hào)。

docker pull hyperledger/fabric-membersrvc:latest \ && docker pull hyperledger/fabric-peer:x86_64-1.0.5 \ && docker pull hyperledger/fabric-orderer:x86_64-1.0.5 \ && docker pull hyperledger/fabric-couchdb:x86_64-1.0.5 \ && docker pull hyperledger/fabric-ca:x86_64-1.0.5 \ && docker pull hyperledger/fabric-tools:x86_64-1.0.5docker tag hyperledger/fabric-peer:x86_64-1.0.5 hyperledger/fabric-peer \ && docker tag hyperledger/fabric-orderer:x86_64-1.0.5 hyperledger/fabric-orderer \ && docker tag hyperledger/fabric-couchdb:x86_64-1.0.5 hyperledger/fabric-couchdb \ && docker tag hyperledger/fabric-ca:x86_64-1.0.5 hyperledger/fabric-ca \ && docker tag hyperledger/fabric-tools:x86_64-1.0.5 hyperledger/fabric-tools

查看鏡像

[root@localhost src]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-orderer latest 368c78b6f03b 2 months ago 151MB hyperledger/fabric-orderer x86_64-1.0.5 368c78b6f03b 2 months ago 151MB hyperledger/fabric-peer latest c2ab022f0bdb 2 months ago 154MB hyperledger/fabric-peer x86_64-1.0.5 c2ab022f0bdb 2 months ago 154MB hyperledger/fabric-membersrvc latest b3654d32e4f9 15 months ago 1.42GB

2.5.3.?編譯安裝

git config --global core.autocrlf false $ git clone https://github.com/hyperledger/fabric.git $ make docker $ git clone https://github.com/hyperledger/fabric-ca.git $ make docker cd fabric/devenv vagrant box add hyperledger/fabric-baseimage centos7.box vagrant upyum -y install epel-release yum -y install git yum -y install golang yum -y install python-pip pip install --upgrade backports.ssl_match_hostname pip install docker-composedocker-compose -version

2.6.?啟動(dòng) docker 虛擬機(jī)

這里我們最小化啟動(dòng),需要四個(gè)節(jié)點(diǎn),分別是 ca, peer, order, couchdb。

創(chuàng)建文件 docker-compose.yml

[root@localhost ~]# mkdir -p docker [root@localhost ~]# cd docker [root@localhost docker]# vim docker-compose.yml # # Copyright IBM Corp All Rights Reserved # # SPDX-License-Identifier: Apache-2.0 # version: '2'networks:basic:services:ca.example.com:image: hyperledger/fabric-caenvironment:- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server- FABRIC_CA_SERVER_CA_NAME=ca.example.com- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_skports:- "7054:7054"command: sh -c 'fabric-ca-server start -b admin:adminpw -d'volumes:- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-configcontainer_name: ca.example.comnetworks:- basicorderer.example.com:container_name: orderer.example.comimage: hyperledger/fabric-ordererenvironment:- ORDERER_GENERAL_LOGLEVEL=debug- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0- ORDERER_GENERAL_GENESISMETHOD=file- ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/genesis.block- ORDERER_GENERAL_LOCALMSPID=OrdererMSP- ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/mspworking_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderercommand: ordererports:- 7050:7050volumes:- ./config/:/etc/hyperledger/configtx- ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/msp/orderer- ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peerOrg1networks:- basicpeer0.org1.example.com:container_name: peer0.org1.example.comimage: hyperledger/fabric-peerenvironment:- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock- CORE_PEER_ID=peer0.org1.example.com- CORE_LOGGING_PEER=debug- CORE_CHAINCODE_LOGGING_LEVEL=DEBUG- CORE_PEER_LOCALMSPID=Org1MSP- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/- CORE_PEER_ADDRESS=peer0.org1.example.com:7051# # the following setting starts chaincode containers on the same# # bridge network as the peers# # https://docs.docker.com/compose/networking/- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_basic- CORE_LEDGER_STATE_STATEDATABASE=CouchDB- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD# provide the credentials for ledger to connect to CouchDB. The username and password must# match the username and password set for the associated CouchDB.- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=working_dir: /opt/gopath/src/github.com/hyperledger/fabriccommand: peer node start# command: peer node start --peer-chaincodedev=trueports:- 7051:7051- 7053:7053volumes:- /var/run/:/host/var/run/- ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/msp/peer- ./crypto-config/peerOrganizations/org1.example.com/users:/etc/hyperledger/msp/users- ./config:/etc/hyperledger/configtxdepends_on:- orderer.example.com- couchdbnetworks:- basiccouchdb:container_name: couchdbimage: hyperledger/fabric-couchdb# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.environment:- COUCHDB_USER=- COUCHDB_PASSWORD=ports:- 5984:5984networks:- basiccli:container_name: cliimage: hyperledger/fabric-toolstty: trueenvironment:- GOPATH=/opt/gopath- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock- CORE_LOGGING_LEVEL=DEBUG- CORE_PEER_ID=cli- CORE_PEER_ADDRESS=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSP- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp- CORE_CHAINCODE_KEEPALIVE=10working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peercommand: /bin/bashvolumes:- /var/run/:/host/var/run/- ./../chaincode/:/opt/gopath/src/github.com/- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/networks:- basic#depends_on:# - orderer.example.com# - peer0.org1.example.com# - couchdb

啟動(dòng) Docker

[root@localhost docker]# docker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb

查看進(jìn)程

[root@localhost docker]# docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------------------------- ca.example.com sh -c fabric-ca-server sta ... Up 0.0.0.0:7054->7054/tcp cli /bin/bash Up couchdb tini -- /docker-entrypoint ... Up 4369/tcp, 0.0.0.0:5984->5984/tcp, 9100/tcp orderer.example.com orderer Up 0.0.0.0:7050->7050/tcp peer0.org1.example.com peer node start Up 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp ?

2.7.?管理 hyperledger

2.7.1.?CouchDB 管理界面

[root@localhost fabcar]# curl http://localhost:5984 {"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

http://localhost:5984/_utils/

2.8.?部署 chaincode

2.8.1.?channel 管理

Hyperledger Fabric Channel 可以理解為 vlan (交換機(jī)術(shù)語(yǔ)) 用來(lái)實(shí)現(xiàn)區(qū)塊隔離。

2.8.1.1.?列出 channel

root@595ec455c0ff:/opt/gopath/src/github.com/hyperledger/fabric# peer channel list 2018-02-07 03:24:41.151 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-07 03:24:41.152 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-07 03:24:41.154 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized 2018-02-07 03:24:41.155 UTC [msp/identity] Sign -> DEBU 004 Sign: plaintext: 0A85070A5B08031A0B08F9E2E9D30510...631A0D0A0B4765744368616E6E656C73 2018-02-07 03:24:41.156 UTC [msp/identity] Sign -> DEBU 005 Sign: digest: 238CBAB61A0524954DC3C511588EB8FC1F886E636A8800131EBE16FB95FB0C9A 2018-02-07 03:24:41.167 UTC [channelCmd] list -> INFO 006 Channels peers has joined to: 2018-02-07 03:24:41.167 UTC [channelCmd] list -> INFO 007 mychannel 2018-02-07 03:24:41.167 UTC [main] main -> INFO 008 Exiting.....

2.8.1.2.?創(chuàng)建 Channel

CORE_PEER_LOCALMSPID=Org1MSP CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx

2.8.1.3.?加入 Channel

CORE_PEER_LOCALMSPID=Org1MSP CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp peer0.org1.example.com peer channel join -b mychannel.block

2.8.2.?部署連

[root@localhost docker]# docker-compose exec peer0.org1.example.com bash root@dcb09db1cbc8:/go/src/github.com/hyperledger/fabric#

安裝合約

CORE_PEER_LOCALMSPID=Org1MSP CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp peer chaincode install -n fabcar -v 1.0 -p github.com/fabcar

實(shí)例化合約

CORE_PEER_LOCALMSPID=Org1MSP CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fabcar -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"

初始化合約

CORE_PEER_LOCALMSPID=Org1MSP CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '{"function":"initLedger","Args":[""]}'

2.8.3.?測(cè)試

root@595ec455c0ff:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '{"function":"queryCar","Args":["CAR9"]}' 2018-02-07 04:44:03.451 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-07 04:44:03.451 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-07 04:44:03.454 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-02-07 04:44:03.455 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-02-07 04:44:03.456 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A97070A6908031A0C089388EAD30510...0A0871756572794361720A0443415239 2018-02-07 04:44:03.456 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: 28C28E7387383CC89E298B29932853964A5D26E4AA358C1242D62ACCAF121BFB 2018-02-07 04:44:03.495 UTC [msp/identity] Sign -> DEBU 007 Sign: plaintext: 0A97070A6908031A0C089388EAD30510...F7BBABB41F274432D5C6985A78D8E949 2018-02-07 04:44:03.495 UTC [msp/identity] Sign -> DEBU 008 Sign: digest: BC6559CACFFC49B5B053B050B7634D1D4D920CAC3F228ED6F38EBFF6A760D7C1 2018-02-07 04:44:03.504 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU 009 ESCC invoke result: version:1 response:<status:200 message:"OK" payload:"{\"colour\":\"brown\",\"make\":\"Holden\",\"model\":\"Barina\",\"owner\":\"Shotaro\"}" > payload:"\n \245\036\265\326\362rL\341\234\326\267\3452\360\277]\220\017C\212\206\311\034\344P\022\034(\364\026-_\022\215\001\n0\022\026\n\006fabcar\022\014\n\n\n\004CAR9\022\002\010\005\022\026\n\004lscc\022\016\n\014\n\006fabcar\022\002\010\001\032J\010\310\001\032E{\"colour\":\"brown\",\"make\":\"Holden\",\"model\":\"Barina\",\"owner\":\"Shotaro\"}\"\r\022\006fabcar\032\0031.0" endorsement:<endorser:"\n\007Org1MSP\022\200\006-----BEGIN -----\nMIICGjCCAcCgAwIBAgIRAPlwF/rUZUP9mqN4wSml4iswCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHihxW6ks3B2+5XdbAVq3CBgxRRRZ22x\nzzpqnD86nKkz7fBElBuhlXl2K6rTxyY2OBOB0ts8keqZ93xueRGymrajTTBLMA4G\nA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIEI5qg3Ndtru\nuLoM2nAYUdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQD4j0Rn\ne1rrd0FSCzsR6u+IuuPK5dI/kR/bh7+VLf0TNgIgCfUtkJvfvzVEwZLFoFyjoHtr\ntvwzNUS1U0hEqIaDeo4=\n-----END -----\n" signature:"0E\002!\000\2657\267\025<v\010\014sC\261U\207H\251\021KJw#\2322C\031<\346=\207\222\343\263\025\002 So\272|v\027xM\026\225\003bx\312\277n\367\273\253\264\037'D2\325\306\230Zx\330\351I" > 2018-02-07 04:44:03.509 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00a Chaincode invoke successful. result: status:200 payload:"{\"colour\":\"brown\",\"make\":\"Holden\",\"model\":\"Barina\",\"owner\":\"Shotaro\"}" 2018-02-07 04:44:03.510 UTC [main] main -> INFO 00b Exiting.....

3.?fabric-samples

安裝 fabric-samples

git clone https://github.com/hyperledger/fabric-samples.git cd fabric-samples

fabric-samples 包含了很多例子,我們只運(yùn)行幾個(gè)常用的例子。

3.1.?fabcar

cd fabric-samples/fabcar

啟動(dòng)

[root@localhost fabcar]# ./startFabric.sh # don't rewrite paths for Windows Git Bash users export MSYS_NO_PATHCONV=1docker-compose -f docker-compose.yml down Stopping peer0.org1.example.com ... done Stopping couchdb ... done Stopping orderer.example.com ... done Stopping ca.example.com ... done Removing peer0.org1.example.com ... done Removing couchdb ... done Removing orderer.example.com ... done Removing ca.example.com ... done Removing network net_basicdocker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb Creating network "net_basic" with the default driver Creating couchdb Creating orderer.example.com Creating ca.example.com Creating peer0.org1.example.com# wait for Hyperledger Fabric to start # incase of errors when running later commands, issue export FABRIC_START_TIMEOUT=<larger number> export FABRIC_START_TIMEOUT=10 #echo ${FABRIC_START_TIMEOUT} sleep ${FABRIC_START_TIMEOUT}# Create the channel docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx 2018-02-06 04:27:38.822 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-06 04:27:38.822 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-06 04:27:38.825 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized 2018-02-06 04:27:38.825 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP 2018-02-06 04:27:38.825 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity 2018-02-06 04:27:38.826 UTC [msp] GetLocalMSP -> DEBU 006 Returning existing local MSP 2018-02-06 04:27:38.826 UTC [msp] GetDefaultSigningIdentity -> DEBU 007 Obtaining default signing identity 2018-02-06 04:27:38.826 UTC [msp/identity] Sign -> DEBU 008 Sign: plaintext: 0A88060A074F7267314D535012FC052D...53616D706C65436F6E736F727469756D 2018-02-06 04:27:38.826 UTC [msp/identity] Sign -> DEBU 009 Sign: digest: D2F2DB3135CE892465FB7B6C2C89A6C566EC6E0081034AF00AF62014ED098E10 2018-02-06 04:27:38.827 UTC [msp] GetLocalMSP -> DEBU 00a Returning existing local MSP 2018-02-06 04:27:38.827 UTC [msp] GetDefaultSigningIdentity -> DEBU 00b Obtaining default signing identity 2018-02-06 04:27:38.827 UTC [msp] GetLocalMSP -> DEBU 00c Returning existing local MSP 2018-02-06 04:27:38.827 UTC [msp] GetDefaultSigningIdentity -> DEBU 00d Obtaining default signing identity 2018-02-06 04:27:38.827 UTC [msp/identity] Sign -> DEBU 00e Sign: plaintext: 0ABF060A1508021A0608BADDE4D30522...4447D0A2A449E39255165BEE40760F3E 2018-02-06 04:27:38.827 UTC [msp/identity] Sign -> DEBU 00f Sign: digest: BE32EAB1C6CE6A2C7F79FED4D1C646702EE07A3D64014B5EE2B77F8B35E9CF5F 2018-02-06 04:27:38.935 UTC [msp] GetLocalMSP -> DEBU 010 Returning existing local MSP 2018-02-06 04:27:38.935 UTC [msp] GetDefaultSigningIdentity -> DEBU 011 Obtaining default signing identity 2018-02-06 04:27:38.935 UTC [msp] GetLocalMSP -> DEBU 012 Returning existing local MSP 2018-02-06 04:27:38.935 UTC [msp] GetDefaultSigningIdentity -> DEBU 013 Obtaining default signing identity 2018-02-06 04:27:38.935 UTC [msp/identity] Sign -> DEBU 014 Sign: plaintext: 0ABF060A1508021A0608BADDE4D30522...96444BF5E3AA12080A021A0012021A00 2018-02-06 04:27:38.936 UTC [msp/identity] Sign -> DEBU 015 Sign: digest: 11D42E8978C507DC0C33304B81E089DB5DAB72967A153BD52932C5A4054C3D4B 2018-02-06 04:27:38.937 UTC [channelCmd] readBlock -> DEBU 016 Got status: &{NOT_FOUND} 2018-02-06 04:27:38.937 UTC [msp] GetLocalMSP -> DEBU 017 Returning existing local MSP 2018-02-06 04:27:38.937 UTC [msp] GetDefaultSigningIdentity -> DEBU 018 Obtaining default signing identity 2018-02-06 04:27:38.939 UTC [channelCmd] InitCmdFactory -> INFO 019 Endorser and orderer connections initialized 2018-02-06 04:27:39.139 UTC [msp] GetLocalMSP -> DEBU 01a Returning existing local MSP 2018-02-06 04:27:39.139 UTC [msp] GetDefaultSigningIdentity -> DEBU 01b Obtaining default signing identity 2018-02-06 04:27:39.140 UTC [msp] GetLocalMSP -> DEBU 01c Returning existing local MSP 2018-02-06 04:27:39.140 UTC [msp] GetDefaultSigningIdentity -> DEBU 01d Obtaining default signing identity 2018-02-06 04:27:39.140 UTC [msp/identity] Sign -> DEBU 01e Sign: plaintext: 0ABF060A1508021A0608BBDDE4D30522...75CF3E958E8612080A021A0012021A00 2018-02-06 04:27:39.140 UTC [msp/identity] Sign -> DEBU 01f Sign: digest: 26B8D88C16CF0DC0573F9BB9A69EC1BF1FEA8C12D052F832B3DB7B2A10D2CA6D 2018-02-06 04:27:39.145 UTC [channelCmd] readBlock -> DEBU 020 Received block: 0 2018-02-06 04:27:39.146 UTC [main] main -> INFO 021 Exiting..... # Join peer0.org1.example.com to the channel. docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block 2018-02-06 04:27:39.465 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-06 04:27:39.465 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-06 04:27:39.467 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized 2018-02-06 04:27:39.468 UTC [msp/identity] Sign -> DEBU 004 Sign: plaintext: 0A86070A5C08011A0C08BBDDE4D30510...2A0C0B6B1D4B1A080A000A000A000A00 2018-02-06 04:27:39.468 UTC [msp/identity] Sign -> DEBU 005 Sign: digest: 455E4221B3AE6DD1238BF5C8893970131846C096F1465D4CA89385AF3C7C0B2F 2018-02-06 04:27:39.991 UTC [channelCmd] executeJoin -> INFO 006 Peer joined the channel! 2018-02-06 04:27:39.991 UTC [main] main -> INFO 007 Exiting..... Creating cli 2018-02-06 04:27:46.123 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-06 04:27:46.123 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-06 04:27:46.123 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-02-06 04:27:46.123 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-02-06 04:27:47.513 UTC [golang-platform] getCodeFromFS -> DEBU 005 getCodeFromFS github.com/fabcar 2018-02-06 04:27:48.448 UTC [golang-platform] func1 -> DEBU 006 Discarding GOROOT package bytes 2018-02-06 04:27:48.449 UTC [golang-platform] func1 -> DEBU 007 Discarding GOROOT package encoding/json 2018-02-06 04:27:48.449 UTC [golang-platform] func1 -> DEBU 008 Discarding GOROOT package fmt 2018-02-06 04:27:48.449 UTC [golang-platform] func1 -> DEBU 009 Discarding provided package github.com/hyperledger/fabric/core/chaincode/shim 2018-02-06 04:27:48.449 UTC [golang-platform] func1 -> DEBU 00a Discarding provided package github.com/hyperledger/fabric/protos/peer 2018-02-06 04:27:48.449 UTC [golang-platform] func1 -> DEBU 00b Discarding GOROOT package strconv 2018-02-06 04:27:48.449 UTC [golang-platform] GetDeploymentPayload -> DEBU 00c done 2018-02-06 04:27:48.458 UTC [msp/identity] Sign -> DEBU 00d Sign: plaintext: 0A86070A5C08031A0C08C4DDE4D30510...939FFF060000FFFF9C08DC0700200000 2018-02-06 04:27:48.459 UTC [msp/identity] Sign -> DEBU 00e Sign: digest: 881EE9535C8EC4371B72CE38BC52BD950864D1CA50F1F64B707EC7492B38AC75 2018-02-06 04:27:48.512 UTC [chaincodeCmd] install -> DEBU 00f Installed remotely response:<status:200 payload:"OK" > 2018-02-06 04:27:48.512 UTC [main] main -> INFO 010 Exiting..... 2018-02-06 04:27:48.845 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-06 04:27:48.845 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-06 04:27:48.847 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-02-06 04:27:48.848 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-02-06 04:27:48.849 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A91070A6708031A0C08C4DDE4D30510...324D53500A04657363630A0476736363 2018-02-06 04:27:48.849 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: 7279142B6DCADB92F178A42EB4812C9103108F2AEE8F40F8AD0125D3E13AEC25 2018-02-06 04:28:51.790 UTC [msp/identity] Sign -> DEBU 007 Sign: plaintext: 0A91070A6708031A0C08C4DDE4D30510...33975E7D10605FC261528FBDEEC0A9A8 2018-02-06 04:28:51.790 UTC [msp/identity] Sign -> DEBU 008 Sign: digest: 6A3D493ACD5E447FAD3D91C518CD60C45D0DB8E20D5DCFB70B45DA7572C666C0 2018-02-06 04:28:51.885 UTC [main] main -> INFO 009 Exiting..... 2018-02-06 04:29:02.974 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP 2018-02-06 04:29:02.974 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity 2018-02-06 04:29:02.976 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc 2018-02-06 04:29:02.976 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc 2018-02-06 04:29:02.977 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A93070A6908031A0C088EDEE4D30510...1A0E0A0A696E69744C65646765720A00 2018-02-06 04:29:02.977 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: F5979DA908E3058B28762469FEECB498F506FB2A7D62F01ED56C5CCE3354D5CE 2018-02-06 04:29:03.103 UTC [msp/identity] Sign -> DEBU 007 Sign: plaintext: 0A93070A6908031A0C088EDEE4D30510...EEB1365266BC4EF15DDAB42DD4202559 2018-02-06 04:29:03.103 UTC [msp/identity] Sign -> DEBU 008 Sign: digest: 027F185369407246B34B7247E6B83E08078761FFA13C43F508CD7257BBF5BC7B 2018-02-06 04:29:03.113 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU 009 ESCC invoke result: version:1 response:<status:200 message:"OK" > payload:"\n e\350\256\026\2161o\374\224\311\210g\322\001\234\332Vt\026+\204\034\013\310;\371\234\353\030`:\360\022\267\006\n\240\006\022\205\006\n\006fabcar\022\372\005\032J\n\004CAR0\032B{\"make\":\"Toyota\",\"model\":\"Prius\",\"colour\":\"blue\",\"owner\":\"Tomoko\"}\032G\n\004CAR1\032?{\"make\":\"Ford\",\"model\":\"Mustang\",\"colour\":\"red\",\"owner\":\"Brad\"}\032N\n\004CAR2\032F{\"make\":\"Hyundai\",\"model\":\"Tucson\",\"colour\":\"green\",\"owner\":\"Jin Soo\"}\032N\n\004CAR3\032F{\"make\":\"Volkswagen\",\"model\":\"Passat\",\"colour\":\"yellow\",\"owner\":\"Max\"}\032G\n\004CAR4\032?{\"make\":\"Tesla\",\"model\":\"S\",\"colour\":\"black\",\"owner\":\"Adriana\"}\032K\n\004CAR5\032C{\"make\":\"Peugeot\",\"model\":\"205\",\"colour\":\"purple\",\"owner\":\"Michel\"}\032H\n\004CAR6\032@{\"make\":\"Chery\",\"model\":\"S22L\",\"colour\":\"white\",\"owner\":\"Aarav\"}\032H\n\004CAR7\032@{\"make\":\"Fiat\",\"model\":\"Punto\",\"colour\":\"violet\",\"owner\":\"Pari\"}\032J\n\004CAR8\032B{\"make\":\"Tata\",\"model\":\"Nano\",\"colour\":\"indigo\",\"owner\":\"Valeria\"}\032M\n\004CAR9\032E{\"make\":\"Holden\",\"model\":\"Barina\",\"colour\":\"brown\",\"owner\":\"Shotaro\"}\022\026\n\004lscc\022\016\n\014\n\006fabcar\022\002\010\001\032\003\010\310\001\"\r\022\006fabcar\032\0031.0" endorsement:<endorser:"\n\007Org1MSP\022\200\006-----BEGIN -----\nMIICGjCCAcCgAwIBAgIRAPlwF/rUZUP9mqN4wSml4iswCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHihxW6ks3B2+5XdbAVq3CBgxRRRZ22x\nzzpqnD86nKkz7fBElBuhlXl2K6rTxyY2OBOB0ts8keqZ93xueRGymrajTTBLMA4G\nA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIEI5qg3Ndtru\nuLoM2nAYUdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQD4j0Rn\ne1rrd0FSCzsR6u+IuuPK5dI/kR/bh7+VLf0TNgIgCfUtkJvfvzVEwZLFoFyjoHtr\ntvwzNUS1U0hEqIaDeo4=\n-----END -----\n" signature:"0E\002!\000\271u\265\3621\223\255|\353h\003\364g\363\3474\310>\032\351\225\326\306z\356\324\013\366\235\334J\237\002 ^>\200AhmDWh\261\301\204Ye\346\345\356\2616Rf\274N\361]\332\264-\324 %Y" > 2018-02-06 04:29:03.113 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00a Chaincode invoke successful. result: status:200 2018-02-06 04:29:03.113 UTC [main] main -> INFO 00b Exiting.....Total setup execution time : 136 secs ...Start by installing required packages run 'npm install' Then run 'node enrollAdmin.js', then 'node registerUser'The 'node invoke.js' will fail until it has been updated with valid arguments The 'node query.js' may be run at anytime once the user has been registered

至此 hyperledger 開發(fā)環(huán)境已經(jīng)啟動(dòng)完畢

?

node enrollAdmin.js node registerUser.js node invoke.js node query.js [root@localhost fabcar]# node enrollAdmin.jsStore path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded admin from persistence Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"9995fba0ac327e43983b07d09a50423de8cb510176484566abfce0cb86e5f594","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB8TCCAZegAwIBAgIUNH9h0PUYxF1vpUqzEXKRfVc2a7YwCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgwMjA2MDQ0NTAwWhcNMTkwMjA2MDQ0\nNTAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBEhyVSI9Dl7S2fIYQdiJAB2zeXR9aHIQSVSG7auK3y3yVvABOQPA/Kyn2iMAl4rr\nky/0FYY5B+lxYLLSype/2zKjbDBqMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E\nAjAAMB0GA1UdDgQWBBRotEXOHR/h1ZLwHV/eAUT80bIQFTArBgNVHSMEJDAigCBC\nOaoNzXba7ri6DNpwGFHRRQTTGq0bLd3brGpXNl5JfDAKBggqhkjOPQQDAgNIADBF\nAiEAnBH8WJvb24o2eC5VmMvtQMoB8NDBTpdq5RNyVJx97HcCIBhWMM6R7crkL8M7\n3wmZ1lNNkAJmpRoes7cNxO/ak5Xy\n-----END CERTIFICATE-----\n"}}}[root@localhost fabcar]# node registerUser.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded admin from persistence Successfully registered user1 - secret:ZjzLwIaVjEAV Successfully enrolled member user "user1" User1 was successfully registered and enrolled and is ready to intreact with the fabric network[root@localhost fabcar]# node query.js Store path:/root/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"}}]

invoke.js 腳本會(huì)出現(xiàn)下面錯(cuò)誤

[root@localhost fabcar]# node invoke.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Assigning transaction_id: 424c946e96d43005e4b815f56fa43bd58d1370404f6713b3ce267928d4499b78 error: [client-utils.js]: sendPeersProposal - Promise is rejected: Error: 2 UNKNOWN: chaincode error (status: 500, message: Invalid Smart Contract function name.)at new createStatusError (/root/fabric-samples/fabcar/node_modules/grpc/src/client.js:65:15)at /root/fabric-samples/fabcar/node_modules/grpc/src/client.js:568:15 Transaction proposal was bad Failed to send Proposal or receive valid response. Response null or status is not 200. exiting... Failed to invoke successfully :: Error: Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...

這里出錯(cuò),是因?yàn)闆](méi)有提供相關(guān)的調(diào)用方法和參數(shù),暫時(shí)不去糾結(jié),繼續(xù)做實(shí)驗(yàn)。

3.1.1.?智能合約

[root@localhost fabric-samples]# cat chaincode/fabcar/fabcar.go /** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* distributed with this work for additional information* regarding copyright ownership. The ASF licenses this file* to you under the Apache License, Version 2.0 (the* "License"); you may not use this file except in compliance* with the License. You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing,* software distributed under the License is distributed on an* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY* KIND, either express or implied. See the License for the* specific language governing permissions and limitations* under the License.*//** The sample smart contract for documentation topic:* Writing Your First Blockchain Application*/package main/* Imports* 4 utility libraries for formatting, handling bytes, reading and writing JSON, and string manipulation* 2 specific Hyperledger Fabric specific libraries for Smart Contracts*/ import ("bytes""encoding/json""fmt""strconv""github.com/hyperledger/fabric/core/chaincode/shim"sc "github.com/hyperledger/fabric/protos/peer" )// Define the Smart Contract structure type SmartContract struct { }// Define the car structure, with 4 properties. Structure tags are used by encoding/json library type Car struct {Make string `json:"make"`Model string `json:"model"`Colour string `json:"colour"`Owner string `json:"owner"` }/** The Init method is called when the Smart Contract "fabcar" is instantiated by the blockchain network* Best practice is to have any Ledger initialization in separate function -- see initLedger()*/ func (s *SmartContract) Init(APIstub shim.ChaincodeStubInterface) sc.Response {return shim.Success(nil) }/** The Invoke method is called as a result of an application request to run the Smart Contract "fabcar"* The calling application program has also specified the particular smart contract function to be called, with arguments*/ func (s *SmartContract) Invoke(APIstub shim.ChaincodeStubInterface) sc.Response {// Retrieve the requested Smart Contract function and argumentsfunction, args := APIstub.GetFunctionAndParameters()// Route to the appropriate handler function to interact with the ledger appropriatelyif function == "queryCar" {return s.queryCar(APIstub, args)} else if function == "initLedger" {return s.initLedger(APIstub)} else if function == "createCar" {return s.createCar(APIstub, args)} else if function == "queryAllCars" {return s.queryAllCars(APIstub)} else if function == "changeCarOwner" {return s.changeCarOwner(APIstub, args)}return shim.Error("Invalid Smart Contract function name.") }func (s *SmartContract) queryCar(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {if len(args) != 1 {return shim.Error("Incorrect number of arguments. Expecting 1")}carAsBytes, _ := APIstub.GetState(args[0])return shim.Success(carAsBytes) }func (s *SmartContract) initLedger(APIstub shim.ChaincodeStubInterface) sc.Response {cars := []Car{Car{Make: "Toyota", Model: "Prius", Colour: "blue", Owner: "Tomoko"},Car{Make: "Ford", Model: "Mustang", Colour: "red", Owner: "Brad"},Car{Make: "Hyundai", Model: "Tucson", Colour: "green", Owner: "Jin Soo"},Car{Make: "Volkswagen", Model: "Passat", Colour: "yellow", Owner: "Max"},Car{Make: "Tesla", Model: "S", Colour: "black", Owner: "Adriana"},Car{Make: "Peugeot", Model: "205", Colour: "purple", Owner: "Michel"},Car{Make: "Chery", Model: "S22L", Colour: "white", Owner: "Aarav"},Car{Make: "Fiat", Model: "Punto", Colour: "violet", Owner: "Pari"},Car{Make: "Tata", Model: "Nano", Colour: "indigo", Owner: "Valeria"},Car{Make: "Holden", Model: "Barina", Colour: "brown", Owner: "Shotaro"},}i := 0for i < len(cars) {fmt.Println("i is ", i)carAsBytes, _ := json.Marshal(cars[i])APIstub.PutState("CAR"+strconv.Itoa(i), carAsBytes)fmt.Println("Added", cars[i])i = i + 1}return shim.Success(nil) }func (s *SmartContract) createCar(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {if len(args) != 5 {return shim.Error("Incorrect number of arguments. Expecting 5")}var car = Car{Make: args[1], Model: args[2], Colour: args[3], Owner: args[4]}carAsBytes, _ := json.Marshal(car)APIstub.PutState(args[0], carAsBytes)return shim.Success(nil) }func (s *SmartContract) queryAllCars(APIstub shim.ChaincodeStubInterface) sc.Response {startKey := "CAR0"endKey := "CAR999"resultsIterator, err := APIstub.GetStateByRange(startKey, endKey)if err != nil {return shim.Error(err.Error())}defer resultsIterator.Close()// buffer is a JSON array containing QueryResultsvar buffer bytes.Bufferbuffer.WriteString("[")bArrayMemberAlreadyWritten := falsefor resultsIterator.HasNext() {queryResponse, err := resultsIterator.Next()if err != nil {return shim.Error(err.Error())}// Add a comma before array members, suppress it for the first array memberif bArrayMemberAlreadyWritten == true {buffer.WriteString(",")}buffer.WriteString("{\"Key\":")buffer.WriteString("\"")buffer.WriteString(queryResponse.Key)buffer.WriteString("\"")buffer.WriteString(", \"Record\":")// Record is a JSON object, so we write as-isbuffer.WriteString(string(queryResponse.Value))buffer.WriteString("}")bArrayMemberAlreadyWritten = true}buffer.WriteString("]")fmt.Printf("- queryAllCars:\n%s\n", buffer.String())return shim.Success(buffer.Bytes()) }func (s *SmartContract) changeCarOwner(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {if len(args) != 2 {return shim.Error("Incorrect number of arguments. Expecting 2")}carAsBytes, _ := APIstub.GetState(args[0])car := Car{}json.Unmarshal(carAsBytes, &car)car.Owner = args[1]carAsBytes, _ = json.Marshal(car)APIstub.PutState(args[0], carAsBytes)return shim.Success(nil) }// The main function is only relevant in unit test mode. Only included here for completeness. func main() {// Create a new Smart Contracterr := shim.Start(new(SmartContract))if err != nil {fmt.Printf("Error creating new Smart Contract: %s", err)} }

3.1.2.?創(chuàng)建記錄

[root@localhost fabcar]# cp invoke.js createCar.js [root@localhost fabcar]# vim createCar.js var request = {//targets: let default to the peer assigned to the clientchaincodeId: 'fabcar',fcn: '',args: [''],chainId: 'mychannel',txId: tx_id};

改為

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

運(yùn)行結(jié)果

[root@localhost fabcar]# node createCar.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Assigning transaction_id: 907d35d7c5debf952f28135b2c341797acdb7ef1f1389607fb04891a27e8ba19 Transaction proposal was good Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK" info: [EventHub.js]: _connect - options {} The transaction has been committed on peer localhost:7053 Send transaction promise and event listener promise have completed Successfully sent transaction to the orderer. Successfully committed the change to the ledger by the peer

3.1.3.?查詢單條記錄

查找 CAR5 這條記錄的數(shù)據(jù)。

[root@localhost fabcar]# node queryOne.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Query has completed, checking results Response is {"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"} [root@localhost fabcar]# cat queryOne.js 'use strict'; /* * Copyright IBM Corp All Rights Reserved * * SPDX-License-Identifier: Apache-2.0 */ /** Chaincode query*/var Fabric_Client = require('fabric-client'); var path = require('path'); var util = require('util'); var os = require('os');// var fabric_client = new Fabric_Client();// setup the fabric network var channel = fabric_client.newChannel('mychannel'); var peer = fabric_client.newPeer('grpc://localhost:7051'); channel.addPeer(peer);// var member_user = null; var store_path = path.join(__dirname, 'hfc-key-store'); console.log('Store path:'+store_path); var tx_id = null;// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting Fabric_Client.newDefaultKeyValueStore({ path: store_path }).then((state_store) => {// assign the store to the fabric clientfabric_client.setStateStore(state_store);var crypto_suite = Fabric_Client.newCryptoSuite();// use the same location for the state store (where the users' certificate are kept)// and the crypto store (where the users' keys are kept)var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});crypto_suite.setCryptoKeyStore(crypto_store);fabric_client.setCryptoSuite(crypto_suite);// get the enrolled user from persistence, this user will sign all requestsreturn fabric_client.getUserContext('user1', true); }).then((user_from_store) => {if (user_from_store && user_from_store.isEnrolled()) {console.log('Successfully loaded user1 from persistence');member_user = user_from_store;} else {throw new Error('Failed to get user1.... run registerUser.js');}// queryCar chaincode function - requires 1 argument, ex: args: ['CAR4'],// queryAllCars chaincode function - requires no arguments , ex: args: [''],const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryCar',args: ['CAR10']};// send the query proposal to the peerreturn channel.queryByChaincode(request); }).then((query_responses) => {console.log("Query has completed, checking results");// query_responses could have more than one results if there multiple peers were used as targetsif (query_responses && query_responses.length == 1) {if (query_responses[0] instanceof Error) {console.error("error from query = ", query_responses[0]);} else {console.log("Response is ", query_responses[0].toString());}} else {console.log("No payloads were returned from query");} }).catch((err) => {console.error('Failed to query successfully :: ' + err); });

運(yùn)行結(jié)果

[root@localhost fabcar]# node queryOne.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Query has completed, checking results Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}

3.1.4.?修改汽車所有者

[root@localhost fabcar]# cp invoke.js changeCarOwner.js [root@localhost fabcar]# vim changeCarOwner.js var request = {//targets: let default to the peer assigned to the clientchaincodeId: 'fabcar',fcn: '',args: [''],chainId: 'mychannel',txId: tx_id};

修改為

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

運(yùn)行結(jié)果

[root@localhost fabcar]# node changeCarOwner.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Assigning transaction_id: b183a7bac6161ff7c7e9974e20bb1a72b2ac5f11ab698a2ae4f63cfdbc33a735 Transaction proposal was good Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK" info: [EventHub.js]: _connect - options {} The transaction has been committed on peer localhost:7053 Send transaction promise and event listener promise have completed Successfully sent transaction to the orderer. Successfully committed the change to the ledger by the peer[root@localhost fabcar]# node queryOne.js Store path:/root/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Query has completed, checking results Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Neo"}

現(xiàn)在我們可以看到 所有者已經(jīng)改為 Neo

3.2.?balance-transfer

[root@localhost fabric-samples]# cd balance-transfer/ [root@localhost balance-transfer]# ./runApp.sh Stopping peer0.org1.example.com ... done Stopping peer0.org2.example.com ... done Stopping peer1.org2.example.com ... done Stopping peer1.org1.example.com ... done Stopping ca_peerOrg1 ... done Stopping orderer.example.com ... done Stopping ca_peerOrg2 ... done Removing peer0.org1.example.com ... done Removing peer0.org2.example.com ... done Removing peer1.org2.example.com ... done Removing peer1.org1.example.com ... done Removing ca_peerOrg1 ... done Removing orderer.example.com ... done Removing ca_peerOrg2 ... done Removing network artifacts_default========== No containers available for deletion ==================== No images available for deletion ===========Creating network "artifacts_default" with the default driver Creating ca_peerOrg2 Creating orderer.example.com Creating ca_peerOrg1 Creating peer1.org2.example.com Creating peer0.org2.example.com Creating peer0.org1.example.com Creating peer1.org1.example.com /root/fabric-samples/balance-transfer============== node modules installed already =============[2018-02-06 09:14:54.916] [DEBUG] Helper - [crypto_ecdsa_aes]: constructor, keySize: 256 [2018-02-06 09:14:54.921] [DEBUG] Helper - [crypto_ecdsa_aes]: Hash algorithm: SHA2, hash output size: 256 [2018-02-06 09:14:55.046] [DEBUG] Helper - [utils.CryptoKeyStore]: CryptoKeyStore, constructor - start [2018-02-06 09:14:55.048] [DEBUG] Helper - [utils.CryptoKeyStore]: constructor, no super class specified, using config: fabric-client/lib/impl/FileKeyValueStore.js [2018-02-06 09:14:55.056] [DEBUG] Helper - [crypto_ecdsa_aes]: constructor, keySize: 256 [2018-02-06 09:14:55.056] [DEBUG] Helper - [crypto_ecdsa_aes]: Hash algorithm: SHA2, hash output size: 256 [2018-02-06 09:14:55.057] [DEBUG] Helper - [utils.CryptoKeyStore]: CryptoKeyStore, constructor - start [2018-02-06 09:14:55.057] [DEBUG] Helper - [utils.CryptoKeyStore]: constructor, no super class specified, using config: fabric-client/lib/impl/FileKeyValueStore.js [2018-02-06 09:14:55.082] [INFO] SampleWebApp - ****************** SERVER STARTED ************************ [2018-02-06 09:14:55.082] [INFO] SampleWebApp - ************** http://localhost:4000 ******************

安裝 jq 工具

yum install -y jq

API 測(cè)試結(jié)果

[root@localhost balance-transfer]# ./testAPIs.sh POST request Enroll on Org1 ...{"success":true,"secret":"uXlJIPvBgLbh","message":"Jim enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTc5NjMwMDUsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE1MTc5MjcwMDV9.pBqwAVac32NIA_x5S163h9_lRfIHMx4shX05D0geO5k"}ORG1 token is eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTc5NjMwMDUsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE1MTc5MjcwMDV9.pBqwAVac32NIA_x5S163h9_lRfIHMx4shX05D0geO5kPOST request Enroll on Org2 ...{"success":true,"secret":"kXcltqsAoiDf","message":"Barry enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTc5NjMwMDcsInVzZXJuYW1lIjoiQmFycnkiLCJvcmdOYW1lIjoib3JnMiIsImlhdCI6MTUxNzkyNzAwN30.ePexFJ2r9WoYNma5iKomJu3anEvg3PTgBEqI6K-s6F0"}ORG2 token is eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTc5NjMwMDcsInVzZXJuYW1lIjoiQmFycnkiLCJvcmdOYW1lIjoib3JnMiIsImlhdCI6MTUxNzkyNzAwN30.ePexFJ2r9WoYNma5iKomJu3anEvg3PTgBEqI6K-s6F0POST request Create channel ...{"success":true,"message":"Channel 'mychannel' created Successfully"}POST request Join channel on Org1{"success":true,"message":"Successfully joined peers in organization org1 to the channel 'mychannel'"}POST request Join channel on Org2{"success":true,"message":"Successfully joined peers in organization org2 to the channel 'mychannel'"}POST Install chaincode on Org1Successfully Installed chaincode on organization org1POST Install chaincode on Org2Successfully Installed chaincode on organization org2POST instantiate chaincode on peer1 of Org1Failed to order the transaction. Error code: undefinedPOST invoke chaincode on peers of Org1 and Org2Transacton ID is Failed to order the transaction. Error code: undefinedGET query chaincode on peer1 of Org1a now has Error: 2 UNKNOWN: could not find chaincode with name 'mycc' - make sure the chaincode mycc has been successfully instantiated and try again after the moveGET query Block by blockNumberError: 2 UNKNOWN: chaincode error (status: 500, message: Failed to get block number 1, error Entry not found in index)at new createStatusError (/root/fabric-samples/balance-transfer/node_modules/grpc/src/client.js:65:15)at /root/fabric-samples/balance-transfer/node_modules/grpc/src/client.js:568:15GET query Transaction by TransactionIDError: 2 UNKNOWN: chaincode error (status: 500, message: Failed to get transaction with id Failed, error Entry not found in index)at new createStatusError (/root/fabric-samples/balance-transfer/node_modules/grpc/src/client.js:65:15)at /root/fabric-samples/balance-transfer/node_modules/grpc/src/client.js:568:15GET query ChainInfo{"height":{"low":1,"high":0,"unsigned":true},"currentBlockHash":{"buffer":{"type":"Buffer","data":[8,1,18,32,180,19,234,224,76,239,188,107,147,219,120,185,108,73,201,120,81,0,242,221,32,3,94,175,16,200,181,113,100,97,129,57]},"offset":4,"markedOffset":-1,"limit":36,"littleEndian":true,"noAssert":false},"previousBlockHash":{"buffer":{"type":"Buffer","data":[]},"offset":0,"markedOffset":-1,"limit":0,"littleEndian":false,"noAssert":false}}GET query Installed chaincodes["name: mycc, version: v0, path: github.com/example_cc"]GET query Instantiated chaincodes[]GET query Channels{"channels":[{"channel_id":"mychannel"}]}Total execution time : 364 secs ...

上面 ERROR 可能是因?yàn)?hyperledger v1.0.5 版本的緣故。此時(shí)的 fabric-samples 僅僅支持 v1.0.0。

4.?Hyperledger Composer

Build Blockchain applications and business networks your way

https://hyperledger.github.io/composer/

5.?Restful 接口

5.1.?注冊(cè)

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d ' {"enrollId": "jim","enrollSecret": "6avZQLwcUe9b"}' http://localhost:7050/registrar

5.2.?

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d ' {"jsonrpc": "2.0","method": "deploy","params": {"type": 1,"chaincodeID":{"name": "mycc"},"ctorMsg": {"function":"init","args":[]},"secureContext": "jim"},"id": 1}' http://localhost:7050/chaincode

6.?Hyperledger Fabric Client SDK for Node.js

6.1.?package.json

[root@localhost fabcar]# cat package.json {"name": "fabcar","version": "1.0.0","description": "Hyperledger Fabric Car Sample Application","main": "fabcar.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"dependencies": {"fabric-ca-client": "^1.0.2","fabric-client": "^1.0.2","grpc": "^1.6.0"},"author": "Anthony O'Dowd","license": "Apache-2.0","keywords": ["Hyperledger","Fabric","Car","Sample","Application"] }

7.?fabric-sdk-java

7.1.?Maven

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.netkiller</groupId><artifactId>fabric-sdk-java</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.hyperledger.fabric-sdk-java/fabric-sdk-java --><dependency><groupId>org.hyperledger.fabric-sdk-java</groupId><artifactId>fabric-sdk-java</artifactId><version>1.0.1</version></dependency></dependencies> </project>

8.?FAQ

8.1.?

ERROR: manifest for hyperledger/fabric-orderer:latest not found ERROR: manifest for hyperledger/fabric-couchdb:latest not found ERROR: manifest for hyperledger/fabric-ca:latest not found ERROR: manifest for hyperledger/fabric-tools:latest not found

解決方案

docker pull hyperledger/fabric-membersrvc:latest \ && docker pull hyperledger/fabric-peer:x86_64-1.0.5 \ && docker pull hyperledger/fabric-orderer:x86_64-1.0.5 \ && docker pull hyperledger/fabric-couchdb:x86_64-1.0.5 \ && docker pull hyperledger/fabric-ca:x86_64-1.0.5 \ && docker pull hyperledger/fabric-tools:x86_64-1.0.5docker tag hyperledger/fabric-peer:x86_64-1.0.5 hyperledger/fabric-peer \ && docker tag hyperledger/fabric-orderer:x86_64-1.0.5 hyperledger/fabric-orderer \ && docker tag hyperledger/fabric-couchdb:x86_64-1.0.5 hyperledger/fabric-couchdb \ && docker tag hyperledger/fabric-ca:x86_64-1.0.5 hyperledger/fabric-ca \ && docker tag hyperledger/fabric-tools:x86_64-1.0.5 hyperledger/fabric-tools

8.2.?卸載 hyperledger 環(huán)境

docker rmi -f $(docker images -q)

?

?

轉(zhuǎn)載于:https://my.oschina.net/neochen/blog/1619560

總結(jié)

以上是生活随笔為你收集整理的hyperledger v1.0.5 区块链入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产成人福利在线观看 | a视频在线观看 | 国产91九色蝌蚪 | 亚洲国产丝袜在线观看 | 亚洲综合少妇 | 久久久精品一区二区三区 | 国产成人久久av免费高清密臂 | 久久久福利视频 | 一区二区中文字幕在线观看 | 国产流白浆高潮在线观看 | 一区二区三区国产欧美 | 中文字幕亚洲欧美日韩2019 | 日韩美av在线 | 福利一区在线视频 | 国产精品99久久免费黑人 | 国内精品中文字幕 | 免费视频一区二区 | 97人人网 | 国产视频不卡 | 黄色特级片| 97超碰网 | 男女激情麻豆 | 狂野欧美激情性xxxx | 国产一区成人 | 黄色字幕网 | 午夜三级在线 | 国产三级视频在线 | 黄色一级大片在线免费看国产一 | 香蕉在线视频观看 | 在线观看91久久久久久 | 国产精品小视频网站 | 国产中年夫妇高潮精品视频 | 天堂av免费看 | 免费高清在线视频一区· | 中文字幕高清免费日韩视频在线 | 国产麻豆精品免费视频 | 69国产成人综合久久精品欧美 | 天天躁日日躁狠狠躁 | 99热这里只有精品在线观看 | a黄色影院 | 久久久久免费看 | 亚洲精品国产精品99久久 | 中文字幕丝袜一区二区 | 开心婷婷色 | 激情电影影院 | av 在线观看 | 中文字幕一区在线观看视频 | 在线影院av| 久久亚洲欧美日韩精品专区 | 91高清在线 | 激情av在线播放 | 久久视频在线看 | 天天干天天操天天 | 欧美aa在线 | 天堂av最新网址 | 毛片网站观看 | 深爱激情丁香 | 欧美视频在线观看免费网址 | 亚洲视频 一区 | 国产片网站 | 成av在线 | 欧美成人在线网站 | 国产精品日韩在线 | 日韩剧情 | 日韩高清免费无专码区 | 18女毛片| 激情电影影院 | 五月天天av | 日黄网站| 日韩性色 | 综合婷婷久久 | 在线有码中文字幕 | 国产免费视频在线 | 91精品国产91久久久久久三级 | 中文视频一区二区 | 91精品爽啪蜜夜国产在线播放 | 麻豆传媒电影在线观看 | 91黄色免费网站 | 欧美在线aa | 久久香蕉电影网 | 一区二区丝袜 | 久久国产热视频 | 久久久久麻豆v国产 | 日日夜夜狠狠干 | www.av免费观看 | 最近日本字幕mv免费观看在线 | av在线超碰 | 成人一级免费视频 | 日韩三级精品 | 欧美久久久久久久久久久 | 国产精品爽爽久久久久久蜜臀 | 日韩手机在线观看 | 日韩一区二区在线免费观看 | 婷婷五天天在线视频 | 91免费视频网站在线观看 | 九九免费在线观看 | 成人三级网址 | 婷婷色在线视频 | 成年人在线免费看视频 | 国产精品久久久久久久久久久免费 | 在线视频观看亚洲 | 99精品在线免费观看 | 粉嫩av一区二区三区免费 | 欧美专区国产专区 | 日韩av午夜 | 欧美一级久久久 | 久久成人精品电影 | 在线 欧美 日韩 | 在线国产视频一区 | 日韩中文字幕免费视频 | 久久久免费精品国产一区二区 | 五月天狠狠操 | 欧美激情视频在线免费观看 | www178ccom视频在线 | 九九九九九九精品 | 国产午夜麻豆影院在线观看 | 久久成电影 | 91中文字幕网 | 成人在线视频一区 | 欧美一区二区三区免费看 | 在线天堂中文www视软件 | 看av免费| 中文字幕高清免费日韩视频在线 | 国产系列精品av | 伊人中文网 | 国产精品久久久久久久久久久久久久 | 久久撸在线视频 | 国产女人40精品一区毛片视频 | 亚洲精品xx| 综合久久久久久久久 | av在线免费在线观看 | 91在线免费观看国产 | 亚洲最大在线视频 | a黄色片在线观看 | 免费观看一级特黄欧美大片 | 激情久久婷婷 | www.久草.com| 中文字幕第| 日韩91在线 | 中文字幕在线播放第一页 | 国产a级精品 | 亚洲传媒在线 | 亚洲男男gaygay无套同网址 | 一区二区三区国产精品 | 中文字幕在线免费 | 久久久免费看片 | 国产成人亚洲在线观看 | 青青河边草免费 | 久久精品专区 | 黄色国产在线观看 | 亚洲欧美999 | 日本久久精 | 在线免费观看的av | 国产九色视频在线观看 | 免费亚洲黄色 | 亚洲国产精品一区二区久久hs | 日韩精品久久久久久久电影竹菊 | 色妞色视频一区二区三区四区 | 免费在线观看的av网站 | 国产96在线视频 | 久操视频在线免费看 | 国产精品久99| 97香蕉久久国产在线观看 | 亚洲精品久久久久中文字幕二区 | 韩国精品一区二区三区六区色诱 | 国产97视频在线 | 曰韩精品 | 欧美日韩国产在线一区 | 天堂va在线观看 | 92精品国产成人观看免费 | 99久久www | 国产免费黄视频在线观看 | 九九免费在线观看 | 国产精久久久久久妇女av | 日韩欧美专区 | 亚洲视频在线播放 | 中文字幕一区二区三区乱码在线 | 在线观看www视频 | 久草在线观看资源 | 丁香六月中文字幕 | av在线专区 | 国产成人精品久久久久 | 在线va视频 | 国产一级特黄毛片在线毛片 | 国产精品国产三级国产不产一地 | 久草视频看看 | 黄色亚洲大片免费在线观看 | 国产一二三区av | 国产日韩欧美综合在线 | 日韩中文字幕第一页 | 97**国产露脸精品国产 | 日本三级吹潮在线 | 美女黄频在线观看 | 国产午夜视频在线观看 | 国产成人精品av在线观 | 91久久国产露脸精品国产闺蜜 | 中文字幕丝袜一区二区 | 国产美女免费观看 | 成人黄色大片 | 亚洲视频电影在线 | 久久夜色网 | 国产高清免费av | 久久少妇免费视频 | 日韩伦理一区二区三区av在线 | 91片在线观看 | 国产精品一区二区三区视频免费 | 欧美久久久一区二区三区 | 啪啪凸凸| 欧美精品久久久久久久久免 | 99热这里有精品 | 99精品国产在热久久下载 | 国产三级午夜理伦三级 | 黄色三级免费网址 | 女人魂免费观看 | 色噜噜日韩精品欧美一区二区 | 国产午夜精品福利视频 | 日韩aⅴ视频 | 日韩精品无码一区二区三区 | 91免费高清在线观看 | 婷婷亚洲最大 | av在线a | 中文字幕免费成人 | 在线观看色网站 | 亚洲精品中文在线观看 | 91视频高清免费 | 九九视频免费在线观看 | 免费视频成人 | av福利第一导航 | 色综合久久久久久久久五月 | 国产精品入口麻豆 | 精品电影一区二区 | 国产精品一区二区 91 | 97免费中文视频在线观看 | 91亚洲精品久久久蜜桃借种 | 欧美成人在线免费观看 | 欧美日韩在线精品 | 99欧美| 日韩高清一二区 | 日韩精品一区二区三区第95 | 日韩影视在线观看 | 久草在线观看视频免费 | 久久看毛片 | 天天综合成人网 | 三级黄色三级 | 超碰人人草人人 | 国产第一福利 | 亚洲精品tv| 欧美性生活大片 | 蜜臀av夜夜澡人人爽人人 | 久久99精品久久只有精品 | 美女视频黄色免费 | 69国产盗摄一区二区三区五区 | 色综合久| 精品欧美乱码久久久久久 | 国产一区二区在线免费视频 | 久久精品中文 | 韩国av免费看 | 欧美日韩不卡在线视频 | 久久精品久久99精品久久 | 国产在线精 | 玖玖999 | 人人超碰免费 | 精品综合久久久 | 国产美女精品视频 | 精品一区二区在线免费观看 | 亚洲午夜在线视频 | www.天天操| 色94色欧美 | 成全免费观看视频 | 丰满少妇一级片 | 日韩综合在线观看 | 国产97色| 日韩免费在线视频观看 | 久久婷婷激情 | 在线91视频 | 激情综合亚洲精品 | 婷婷色在线资源 | 超级碰碰碰免费视频 | av在线看片 | 国产精品综合久久久久 | 午夜精品成人一区二区三区 | 成人免费在线视频 | 久久精品这里热有精品 | www.操.com| av性网站| 亚洲精品一区二区三区新线路 | 99热免费在线 | 黄色大片日本免费大片 | 国产视频1区2区3区 久久夜视频 | 国产精品中文字幕在线播放 | 国产视频97| 九九热久久免费视频 | 日日夜夜91 | 国产午夜精品av一区二区 | 国产在线看一区 | 亚洲黄色软件 | 在线成人一区 | 精品国产免费久久 | 天天操天天干天天综合网 | 97人人模人人爽人人喊网 | 日本电影黄色 | 插综合网 | 日韩一区二区免费视频 | 日本黄色免费看 | 日韩高清一二区 | 久久夜靖品 | 天天干天天做 | 国产精品99视频 | 香蕉影视在线观看 | 97超碰国产精品女人人人爽 | 欧美一级片在线观看视频 | 国产免费xvideos视频入口 | 黄色三级视频片 | 国产色在线 | 天天操夜 | avav片| 国产精品电影一区二区 | 国产精品久久嫩一区二区免费 | 日韩三级视频在线观看 | 激情视频免费在线 | 天堂va在线高清一区 | 中文字幕亚洲精品在线观看 | 免费看成人 | 国产免费视频在线 | 在线观看一区视频 | 日韩黄色影院 | 成人av免费在线观看 | 91精品视频观看 | 在线国产99| 欧美日韩免费观看一区=区三区 | 在线观看精品黄av片免费 | 黄色精品在线看 | 日韩电影一区二区三区在线观看 | 国产精品成人久久久久 | 成人av影院在线观看 | 美女黄频网站 | 国产成人福利片 | av在线短片 | 久草在线视频看看 | 亚洲精品乱码久久久久久蜜桃欧美 | 五月婷婷香蕉 | 午夜精品久久久久久久99热影院 | 久草久草在线观看 | 久草.com | 一区二区三区在线视频观看58 | 亚洲一区二区三区在线看 | www.亚洲精品视频 | 色综合久久88色综合天天免费 | 人人揉人人揉人人揉人人揉97 | 日韩资源在线 | 亚洲国产中文字幕在线 | 日韩久久在线 | 国产在线中文 | 最近更新好看的中文字幕 | 久久99精品久久久久婷婷 | 婷婷色在线 | 美女网站在线 | www日韩高清| 中文字幕一区二区三区四区久久 | 伊人影院99 | 99热这里只有精品国产首页 | 色婷婷一 | 在线观看爱爱视频 | 天天视频亚洲 | 免费av试看 | 天天干天天干天天干天天干天天干天天干 | 香蕉视频国产在线观看 | 91视频麻豆| 精品久久久久久亚洲 | 永久免费看av| 日韩区欧美久久久无人区 | 黄色小说视频在线 | 国产精品毛片久久久久久 | 久久这里只有精品视频99 | 亚洲成人精品在线观看 | 伊人亚洲综合 | 亚洲欧美在线视频免费 | 免费三级黄色片 | 日韩精品一区在线播放 | www.国产视频 | 亚洲免费精品视频 | 久草视频国产 | 69国产精品视频免费观看 | 欧美日韩在线观看一区 | 成人免费大片黄在线播放 | 亚洲专区免费观看 | 丁香激情综合久久伊人久久 | 正在播放一区二区 | 狠狠干美女 | 日韩精品视频在线观看免费 | av成人免费在线 | 中文字幕在线精品 | 日韩免费电影 | 青青河边草免费观看完整版高清 | 日韩| www黄色 | 国产日韩精品一区二区在线观看播放 | 97成人精品视频在线播放 | a视频在线看 | 中文字幕最新精品 | 激情影院在线 | 欧美日韩免费一区 | 91人人澡| 国偷自产视频一区二区久 | 国产精品男女视频 | 精精国产xxxx视频在线播放 | 在线免费观看视频你懂的 | a√资源在线 | 日韩网站在线观看 | 349k.cc看片app | 久久这里只有精品久久 | 国产艹b视频 | 麻豆视频国产 | 片黄色毛片黄色毛片 | 国产精品婷婷午夜在线观看 | 99精品在线免费 | 最近中文国产在线视频 | 国产精品99久久久久人中文网介绍 | 成全免费观看视频 | 日韩精品一区二区三区免费视频观看 | 国产精品久久久久影院日本 | 麻豆传媒视频在线播放 | 天天插天天狠 | 久久国产热视频 | 中文字幕免费一区 | 天天操天天射天天插 | av电影一区二区 | 国产精品片 | 日韩最新中文字幕 | 国产色一区 | 黄色av免费看| 伊人五月| 亚洲一区二区三区四区在线视频 | 天天干夜夜干 | 黄色a视频免费 | 国产又粗又猛又黄又爽视频 | 亚洲精品一区二区网址 | 免费在线观看av网站 | 国产黄色在线看 | 在线观看色视频 | 成年人精品 | 国产成人久久久久 | 亚洲精品色视频 | 欧美aa一级 | 国产原创在线观看 | 91污污| 毛片一区二区 | 99精品在线免费观看 | 狠狠色丁香婷婷综合久小说久 | 色视频网页 | 96视频免费在线观看 | 亚洲另类人人澡 | 亚洲国产综合在线 | 夜夜躁日日躁狠狠久久av | 黄在线免费观看 | www.午夜| 中文字幕国语官网在线视频 | 国产一区二区三区免费在线 | 欧美精品少妇xxxxx喷水 | 日韩国产精品久久久久久亚洲 | 99视频在线精品 | www.久久91| 中文字幕第 | 久久成人精品视频 | 日韩欧美在线高清 | 天天在线操 | 激情动态| 亚洲 成人 一区 | 九九九九色| 久久99精品久久只有精品 | 久久久99久久| 日韩在线视频观看免费 | 狠狠亚洲 | av理论电影 | 日韩在线在线 | 9992tv成人免费看片 | 一二三精品视频 | 韩日成人av | 狠狠狠色丁香婷婷综合激情 | 久久精品网站视频 | 久久黄色影视 | 中文字幕资源在线观看 | 久久久久北条麻妃免费看 | 伊人中文网 | 欧美成人理伦片 | 亚洲精选在线 | 日韩在线观看免费 | av在线精品 | 91自拍视频在线观看 | 亚洲精品99久久久久久 | 97精品视频在线播放 | 国产高清在线免费视频 | 国产精品成人一区二区三区吃奶 | 99re8这里有精品热视频免费 | 国产一区黄色 | 国产99一区视频免费 | 最新动作电影 | 亚洲第一中文字幕 | 中文字幕在线日 | 久草在线网址 | 精品在线视频一区 | 国产精品日韩欧美一区二区 | 国产免费视频一区二区裸体 | 亚洲久在线 | 日韩av免费大片 | 欧美在线视频一区二区三区 | 亚洲资源在线 | 看污网站| 欧美一级日韩免费不卡 | 五月婷婷另类国产 | 91.dizhi永久地址最新 | 日韩欧美成人网 | 一级黄色片在线免费看 | 亚洲一区在线看 | 国产日韩欧美视频在线观看 | 国产精品久久久久久久久大全 | 综合网五月天 | 久草手机视频 | 国产一区二区三区网站 | 欧美成年网站 | 亚州中文av| 亚洲午夜久久久综合37日本 | 中文字幕乱码在线播放 | 99久久www免费 | 操操操日日日干干干 | 五月婷婷六月丁香 | 国产乱码精品一区二区三区介绍 | 国产精品视频app | 日韩av一区二区三区在线观看 | 在线观看韩国av | 精品国产乱码久久久久 | 久久天堂网站 | 成人中文字幕+乱码+中文字幕 | 色综合天天综合 | 欧美日韩二区在线 | 亚洲精品tv久久久久久久久久 | 日韩理论电影网 | 午夜精品久久久99热福利 | 综合在线亚洲 | 麻豆免费在线播放 | 国产啊v在线 | 国产一级在线 | 欧美日韩久久不卡 | 国产成人精品一区二区在线 | 色久av| 亚洲成人频道 | 国产高清在线观看av | 日韩在线视频二区 | 免费网站观看www在线观看 | 国产精品原创视频 | 香蕉影院在线观看 | 麻豆视频网址 | 久操久 | 久久av影视 | 日韩av三区| 国产成人久久精品77777综合 | 91免费视频黄 | 色噜噜在线观看 | 成人av在线网 | 亚洲精品在线电影 | 国产精品丝袜在线 | 久久爱影视i | 久久影院亚洲 | 日韩欧美在线第一页 | 色人久久 | 久久影院中文字幕 | 中文字幕 国产视频 | 黄色免费av| 一区二区免费不卡在线 | 久精品视频 | 日产乱码一二三区别免费 | 天天综合网国产 | 亚洲天天在线日亚洲洲精 | 午夜视频在线瓜伦 | 亚洲精品在线国产 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 久久精品影片 | 亚洲精品国产精品国产 | 国产精品国产三级国产专区53 | 免费电影播放 | 91成版人在线观看入口 | 国内精品久久久久影院一蜜桃 | 久久永久视频 | 午夜av日韩 | 夜夜爽www| 97热在线观看 | 天天操天天色综合 | 欧美淫aaa免费观看 日韩激情免费视频 | 亚洲精品免费在线视频 | 在线你懂的视频 | 国产999久久久 | 精品国产一区二区久久 | 在线观看岛国 | 爱情影院aqdy鲁丝片二区 | 99久久精品无码一区二区毛片 | 成人精品久久久 | 香蕉手机在线 | 亚洲,播放 | 欧美网站黄色 | 一本一本久久a久久精品综合妖精 | 久久精品之 | 久久久久国产一区二区三区 | 欧美va在线观看 | 天天色天天搞 | 就要干b | 在线国产一区二区 | 国产成a人亚洲精v品在线观看 | 国产日韩精品一区二区三区在线 | 天天操天天添 | 伊人影院在线观看 | 欧美一区二区三区在线播放 | 成人a视频在线观看 | 五月天九九 | 韩国av电影在线观看 | 四虎www | 欧美色精品天天在线观看视频 | 国产这里只有精品 | 91精品国产91| 亚洲天天在线日亚洲洲精 | 美女黄频视频大全 | 国产高清日韩欧美 | 99久视频 | 男女免费av| 色老板在线视频 | 免费色av| 91成人精品 | 91毛片在线观看 | 特级毛片网 | 狠狠综合 | 亚洲精品综合在线观看 | 亚洲成a人片在线www | 2022中文字幕在线观看 | 91香蕉视频720p | 美女视频黄免费的 | 国产剧情久久 | 日韩有码在线播放 | 99精品一区 | 91av国产视频| 中文在线免费一区三区 | 久久九九精品久久 | 国产拍揄自揄精品视频麻豆 | 欧美美女一级片 | 天天激情在线 | av在线网站大全 | 国产成人福利在线观看 | aaa亚洲精品一二三区 | av在观看| 狠狠撸电影 | 日韩精品一区在线观看 | 亚洲精品国产精品国产 | 精品久久网站 | 99免费视频 | 韩国av电影在线观看 | 国产精品久久久久免费观看 | 亚洲爱爱视频 | 一区二区三区高清不卡 | 成人av影视观看 | 国产一二区免费视频 | 国产探花在线看 | 亚洲日本va中文字幕 | 色婷婷综合久久久久 | 国产视频在线观看一区 | 天天干com | 午夜视频福利 | 亚洲国产三级 | 欧美一级免费高清 | 日韩手机在线 | 中文字幕欧美日韩va免费视频 | 久草在线视频网 | 国内精品久久久久影院优 | 亚洲精品99久久久久中文字幕 | 亚洲九九九在线观看 | 亚洲成人免费在线观看 | 岛国av在线 | 亚洲午夜精品一区二区三区电影院 | 久久99热精品这里久久精品 | 国产精品免费不卡 | 99久久免费看 | 日韩精品中文字幕久久臀 | 国产免费资源 | 超碰人人在 | 午夜电影久久 | 免费av一级电影 | 中文字幕91视频 | 视频一区二区三区视频 | av理论电影 | 91九色蝌蚪视频网站 | 成人在线播放免费观看 | 97在线观视频免费观看 | 日韩精品一区在线观看 | 成年人国产视频 | 成人午夜av电影 | 国产日韩在线播放 | 久久精品视频网站 | 亚洲天堂网在线观看视频 | 成年人在线观看免费视频 | 免费看一级特黄a大片 | 韩日精品在线观看 | 亚洲视频免费在线看 | 国产精品久久久久一区 | 字幕网在线观看 | 久久99国产精品久久99 | 啪啪精品| 粉嫩高清一区二区三区 | 中文在线a∨在线 | 国产精品久久影院 | 99久久99热这里只有精品 | 人人澡人摸人人添学生av | 久草精品在线播放 | 一区二区久久久久 | av日韩精品| 国产黄色免费观看 | 亚洲精品视频久久 | 最新av免费在线 | 成人免费观看网站 | 久久官网 | 国产精品美女久久久久久久 | 五月的婷婷| 最近中文国产在线视频 | 丁香色天天| 成年人免费看的视频 | 在线精品视频免费观看 | 中文字幕在线影院 | 三级av在线 | 免费黄色网址网站 | 欧美先锋影音 | 婷婷激情5月天 | 日本中文字幕系列 | 国产中文视频 | 日韩一区精品 | 少妇bbw搡bbbb搡bbb | 青青草久草在线 | 婷色| 欧美激情精品久久久久久 | 精品国产一区二区三区久久久久久 | 国产精品av在线免费观看 | 欧美激情综合色综合啪啪五月 | 狠狠色狠狠色合久久伊人 | 黄色一级大片在线观看 | 国产一区在线精品 | 99精品视频在线观看视频 | 精品视频久久久久久 | 久久国产一区二区三区 | 成人av一区二区在线观看 | 色欧美88888久久久久久影院 | 欧美成人h版| 成人在线免费视频 | 亚洲九九 | 嫩草av影院 | 日韩av黄 | 激情自拍av | 国产日韩精品一区二区三区在线 | 日韩中文字幕在线 | 国产亚洲婷婷免费 | 婷婷在线色 | 97视频入口免费观看 | 久久综合综合久久综合 | 丝袜美腿在线视频 | 天天操夜夜想 | 日韩免费久久 | 久久免费的精品国产v∧ | 国产欧美在线一区二区三区 | 天堂在线视频中文网 | 一级欧美黄 | 麻豆影视在线观看 | 国产精品中文字幕av | 久久乐九色婷婷综合色狠狠182 | 久草在线视频网站 | 国产99久久久精品 | 国产中文字幕在线播放 | 九九免费观看视频 | 中文视频一区二区 | 在线电影 一区 | 成人在线视频在线观看 | 亚洲日韩欧美一区二区在线 | 亚洲高清av | 天天爽夜夜爽精品视频婷婷 | 在线观看中文字幕一区 | 97精品一区 | 四虎海外影库www4hu | 久久久蜜桃 | 伊在线视频| 97成人精品视频在线播放 | 中文字幕在线观看视频免费 | 久久99亚洲网美利坚合众国 | www色 | 国产一级大片在线观看 | 亚洲精品在线看 | 久久激情视频 久久 | 99色| 国产麻豆精品95视频 | 国内精品久久久久影院男同志 | 中文字幕一区2区3区 | 日韩久久精品一区二区 | 少妇bbw揉bbb欧美 | 国产盗摄精品一区二区 | 国产欧美久久久精品影院 | 久久国产精品99久久久久 | 精品国产电影一区 | 日韩欧美精品在线观看视频 | 热久久免费视频 | 国产极品尤物在线 | 欧美日韩国产一区二区三区在线观看 | 午夜视频日本 | 天天操天天干天天操天天干 | 狠狠操夜夜 | 国产黄在线播放 | 特级西西444www大精品视频免费看 | 国产人成精品一区二区三 | 91九色视频网站 | 久久少妇免费视频 | 69国产盗摄一区二区三区五区 | 2024av在线播放 | 深爱婷婷久久综合 | 精品美女在线观看 | 丁香激情五月 | 免费看av片网站 | 91欧美日韩国产 | 狠狠干综合 | 一区 二区电影免费在线观看 | 色噜噜狠狠狠狠色综合久不 | 一区二区三区av在线 | 婷婷综合亚洲 | 99久e精品热线免费 99国产精品久久久久久久久久 | 日韩乱理 | 超碰在线最新地址 | 久久狠狠亚洲综合 | 欧美男同视频网站 | 韩日精品在线 | 中文字幕在线视频国产 | 亚洲人在线视频 | 国产精品中文字幕av | 9免费视频 | 国产精品欧美日韩在线观看 | 国产精品婷婷午夜在线观看 | av中文字幕网址 | 日韩在线观看av | 又色又爽又黄高潮的免费视频 | 日韩精品一区二区三区第95 | 精品国产乱码久久久久久1区2匹 | 国产精品免费一区二区 | 久久国产精品99久久久久久丝袜 | 最近中文字幕视频网 | 在线电影日韩 | 天天操夜操 | 草久在线视频 | 亚洲国产精品一区二区久久hs | 91成人午夜 | 成人久久久久久久久久 | 精品无人国产偷自产在线 | 久久精品精品 | 免费国产在线精品 | bayu135国产精品视频 | 中文字幕国产 | 成人av中文字幕在线观看 | 综合久久久久久久 | 亚洲一级久久 | 亚洲天堂网视频在线观看 | av日韩国产 | 婷婷在线网站 | 97超碰人 | 久久久精品在线观看 | 毛片永久新网址首页 | 天天操天天舔天天爽 | 久在线观看 | 97色涩 | 久久开心激情 | 亚洲天堂在线观看完整版 | h网站免费在线观看 | 亚洲电影成人 | 久久人91精品久久久久久不卡 | 片黄色毛片黄色毛片 | 国产精品久久久久久久久毛片 | 日韩欧美在线一区二区 | 欧美一区二区三区在线视频观看 | www.色婷婷.com| 摸bbb搡bbb搡bbbb| 精品视频99 | 国产一级做a爱片久久毛片a | 美女视频永久黄网站免费观看国产 | 中文字幕电影网 | 日日摸日日爽 | 69xx视频 | 激情网第四色 | 97福利社 | 美女免费黄视频网站 | 国产精品理论片 | 国产资源站 | 日韩av快播电影网 | 成人a级大片 | 婷婷综合成人 | 久久精品久久国产 | 国产99久久99热这里精品5 | 日韩在线免费视频观看 | 国产性天天综合网 | www日韩精品 | 国产裸体无遮挡 | 亚洲精品影视 | 欧美aⅴ在线观看 | 色综合久久久久综合99 | 国产伦理久久 | 在线观看激情av | 91麻豆文化传媒在线观看 | 天堂av网站 | 日韩a级免费视频 | 一区二区网| 99产精品成人啪免费网站 | 五月香视频在线观看 | 精品国产乱码久久久久久浪潮 | 四虎影视精品永久在线观看 | 在线中文字幕网站 | 中文字幕日韩无 | 国产尤物在线视频 | 国产第一页福利影院 | 成人超碰在线 | 国产亚洲成av片在线观看 | 在线视频a | 亚洲欧洲视频 | 久久精品二区 | 天堂在线视频中文网 | 高清av免费看 | 六月丁香婷婷在线 | 婷婷在线视频 | 国产成人精品久久久久蜜臀 | 中文字幕黄网 | 午夜视频在线观看一区二区三区 | 天天插天天射 | 超碰97人人干| 中文字幕免费看 | 亚洲欧洲av在线 | 美女免费网站 | 国产拍揄自揄精品视频麻豆 | 热精品 | 久久狠狠一本精品综合网 | 中文字幕丰满人伦在线 | 青青五月天 | 91精品国产乱码久久桃 | 丁香激情五月婷婷 | 国产一区精品在线观看 | 久久久天天操 | 91成人在线网站 | 日日夜夜亚洲 | 日韩欧美一区二区三区黑寡妇 | 中文在线a∨在线 | 免费久久网 | 欧美日韩国产在线观看 | 日韩免费大片 | 日韩高清免费在线 | 国产福利不卡视频 | 中文字幕在线影院 | 久久久久成人精品免费播放动漫 | 综合网av | 最新亚洲视频 | 亚洲黄色激情小说 | 四川妇女搡bbbb搡bbbb搡 | 四虎在线视频免费观看 | 久章操 | 麻豆小视频在线观看 | 免费观看国产成人 | 高清国产午夜精品久久久久久 | 日韩欧美国产免费播放 | 人人爽人人澡 | 日韩av电影国产 | 久久美女精品 | 在线亚洲高清视频 | 久久久香蕉视频 | 国内视频| 97视频免费在线 | 欧美日韩大片在线观看 | 99精品99| 成人国产在线 | 日本成人中文字幕在线观看 | 久久成人国产精品一区二区 | 精品国产一区二区三区免费 | 亚洲国产成人高清精品 | 国产精品18久久久久vr手机版特色 | 黄色在线成人 | 日韩av午夜在线观看 | 久久狠狠一本精品综合网 | 中文字幕日韩国产 | 国产黄色片在线 | 综合激情av | 免费色av | 久久久精品在线观看 | av一级一片 | 视频在线精品 | 精品a在线 | 91 中文字幕 | 日本三级久久久 | 人人爱人人射 | 九九免费视频 | 亚洲激情综合网 | 久久久三级视频 | 欧美日韩久久不卡 | 日韩免费电影 | 亚洲精品高清视频 | 免费在线一区二区三区 | 国产精品系列在线播放 |