免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Spring Boot集成Hyperledger Fabric構(gòu)建慈善信用區(qū)塊鏈

Spring Boot集成Hyperledger Fabric構(gòu)建慈善信用區(qū)塊鏈 簡介面向高校畢業(yè)設(shè)計與課程設(shè)計的慈善救助信用區(qū)塊鏈系統(tǒng)基于Springboot與Hyperledger Fabric框架構(gòu)建完整覆蓋慈善項目發(fā)布、信用評估、救助審批、善款追溯等核心流程結(jié)合區(qū)塊鏈不可篡改特性解決傳統(tǒng)慈善信息不透明、監(jiān)管追溯困難等痛點并利用Springboot提供穩(wěn)定易用的后端服務(wù)接口。壓縮包共206個文件以Java后端源碼、Vue前端頁面為主同時配齊Fabric聯(lián)盟鏈運行所需的pem/crt證書、key私鑰、yaml配置及Go語言鏈碼整體約3.37MB目錄結(jié)構(gòu)清晰便于按模塊定位學習。目前已有36人學習下載適合計算機、信息管理等專業(yè)學生作為畢業(yè)設(shè)計、課程設(shè)計或項目初期演示使用。源碼已經(jīng)過嚴格測試可正常運行隨包附帶設(shè)計文檔與報告可支撐快速理解系統(tǒng)架構(gòu)現(xiàn)有代碼也方便二次改造作為區(qū)塊鏈技術(shù)落地實踐的入門參考十分合適。1. 慈善救助上鏈為什么用Springboot對接Hyperledger Fabric而不是自己搭一條公鏈如果你接過慈善類的Web項目大概率做過一套“捐款登記救助名單”的CRUD一個MySQL表存捐款人一個表存受助人再一個表存審批記錄。這套東西最大的問題是救助人和他的救助歷史分散在多個機構(gòu)、多個數(shù)據(jù)庫里A機構(gòu)給他發(fā)過助學金B(yǎng)機構(gòu)不知道他之前有沒有逾期還款、有沒有重復(fù)申請全靠人工去查。所以課設(shè)題目里出現(xiàn)“信用區(qū)塊鏈”不是噱頭是要解決“救助記錄不可篡改、跨機構(gòu)可查、重復(fù)救助可識別”這個真問題。Springboot結(jié)合Hyperledger Fabric的慈善救助信用區(qū)塊鏈系統(tǒng)思路就是讓Spring Boot繼續(xù)負責Web接口、文件上傳、權(quán)限攔截這些老本行把資產(chǎn)和審批記錄挪到底層Fabric鏈上用鏈碼把救助申請、審核、放款、還款這幾個動作變成狀態(tài)流轉(zhuǎn)。這套路適合兩類人一類是做區(qū)塊鏈課設(shè)但不想從零寫共識的另一類是已經(jīng)有Spring Boot經(jīng)驗、想低成本把區(qū)塊鏈模塊接進來的。下面我按自己做過的方案把網(wǎng)絡(luò)、鏈碼、Java集成和踩坑一條線講完。2. 先把Fabric聯(lián)盟鏈跑起來用fabric-samples的test-network搭一個最小可用網(wǎng)絡(luò)Fabric 2.x 的開發(fā)和部署路徑已經(jīng)很固定官方維護的 fabric-samples 倉庫里帶了一個 test-network 腳本能一鍵起兩組織、兩 peer、一個排序節(jié)點、兩個 CA 的最小聯(lián)盟鏈。課設(shè)階段不建議自己手寫編排文件test-network 足夠讓你理解節(jié)點關(guān)系而且刪了可以一鍵重置省掉我早期用 docker-compose 手工拼配置時的那種玄學排錯時間。2.1 啟動命令與容器清單確認orderer、peer、CA、CouchDB都活著先確認本機有 Docker 和 Docker Compose然后把 fabric-samples 克隆下來進入 test-network 目錄執(zhí)行cd fabric-samples/test-network ./network.sh down ./network.sh up createChannel -c reliefchannel -ca -s couchdb第一行 down 是為了清掉上次殘留的容器和卷避免端口占用。第二行拆開看up 是拉起整個網(wǎng)絡(luò)createChannel 表示啟動后立刻創(chuàng)建通道-c reliefchannel 把通道名從默認的 mychannel 改成業(yè)務(wù)名-ca 表示啟動獨立的 CA 容器否則腳本會用 cryptogen 直接生成組織證書放目錄里少兩個容器但沒法演示證書簽發(fā)流程-s couchdb 是把 peer 的狀態(tài)數(shù)據(jù)庫從默認的 LevelDB 切成 CouchDB這個選項直接決定后面能不能做富查詢。啟動成功后在另一個終端執(zhí)行 docker ps應(yīng)該能看見這些容器peer0.org1.example.com peer0.org2.example.com orderer.example.com ca_org1 ca_org2 couchdb0 couchdb1這里的關(guān)鍵點每個 peer 旁邊掛了一個 CouchDB 容器排序節(jié)點只有一個CA 有兩個。這個拓撲對應(yīng)的是 Fabric 最常見的最小配置——兩個組織共同維護一條通道任何交易要上鏈必須同時得到兩個組織 peer 的背書。檢查容器狀態(tài)時如果發(fā)現(xiàn)某個 peer 反復(fù)重啟用 docker logs peer0.org1.example.com 看輸出多半是證書目錄掛載路徑寫錯。2.2 用CLI手工調(diào)用一次鏈碼驗證背書流程而不是直接寫Java拿到一個剛啟動的 Fabric 網(wǎng)絡(luò)我先不急著寫 Java而是用 peer CLI 手工部署一個官方示例鏈碼并調(diào)用一次。這樣做的原因是如果 CLI 這層都不通后面 Java 報錯時你根本分不清是網(wǎng)絡(luò)問題還是 SDK 問題。export PATH${PWD}/../bin:$PATH export FABRIC_CFG_PATH${PWD}/../config export CORE_PEER_TLS_ENABLEDtrue export CORE_PEER_LOCALMSPIDOrg1MSP export CORE_PEER_TLS_ROOTCERT_FILE${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH${PWD}/organizations/peerOrganizations/org1.example.com/users/Adminorg1.example.com/msp export CORE_PEER_ADDRESSlocalhost:7051這組環(huán)境變量的含義PATH 要指向 fabric-samples/bin 下的 peer 二進制FABRIC_CFG_PATH 指向 core.yaml 所在目錄CORE_PEER_LOCALMSPID 聲明你當前以哪個組織身份操作MSPCONFIGPATH 指向該組織管理員的私鑰和證書目錄CORE_PEER_ADDRESS 是 peer0.org1 的 gRPC 地址。每次換組織操作只需要把 MSPID、TLS 根證書、MSP 路徑、peer 地址四個變量一起換。接著部署鏈碼這里先用官方 Java 鏈碼示例驗證鏈路./network.sh deployCC -ccn relief -ccp ../asset-transfer-basic/chaincode-java/ -ccl java部署成功會看到 Chaincode code package identifier 之類的輸出。然后查詢一次peer chaincode query -C reliefchannel -n relief -c {Args:[GetAllAssets]}如果返回一個空數(shù)組 []說明查詢路徑通。再提交一筆peer chaincode invoke -C reliefchannel -n relief -c {Args:[CreateAsset,1,red,100,org1,alice]}這里 invoke 和 query 的本質(zhì)區(qū)別invoke 走完整的背書、排序、出塊流程返回的是交易是否提交成功query 只在一個 peer 上做本地讀不產(chǎn)生區(qū)塊。你能看到 invoke 的輸出里有鏈碼返回的 payload底層邏輯還是異步上塊不要被控制臺的即時返回誤導(dǎo)。把這層調(diào)通以后Java 集成里的坑就少了一半。2.3 頻道與排序參數(shù)-ca 和 -s couchdb 到底改變了什么很多人跑通了腳本但對兩個參數(shù)一知半解。先說 -ca。不帶它時網(wǎng)絡(luò)啟動速度更快但證書是用 cryptogen 一次性生成后靜態(tài)落盤的你拿不到證書簽發(fā)過程的 CA 容器。帶了 -ca每個組織會啟動一個 fabric-ca-server后續(xù)你可以用 CA 的 REST 接口為新的用戶動態(tài)簽發(fā)證書而不用重新 down 網(wǎng)絡(luò)。課設(shè)里如果要做“新增用戶并授予權(quán)限”的演示務(wù)必帶這個參數(shù)。再說 -s couchdb。LevelDB 是嵌入在 peer 進程里的查詢只能按 key 來做精確匹配。CouchDB 是一個獨立的文檔數(shù)據(jù)庫peer 把世界狀態(tài)同步給它你可以用 JSON 選擇器做富查詢比如“查所有狀態(tài)為 APPLIED 的救助單”。代價是多兩個容器、多占大概 1GB 內(nèi)存每個 CouchDB 容器約 400MB。如果你的電腦只有 8GB 內(nèi)存又是課設(shè)演示寧可用默認 LevelDB 只做 key 查詢也別讓 CouchDB 把機器拖卡。啟動完成后驗證通道情況一條命令能看到通道內(nèi)最新區(qū)塊高度peer channel getinfo -c reliefchannel輸出里的 blockchainHeight 初始是 1只有創(chuàng)世塊。后面每成功提交一筆交易這個數(shù)字就會上漲。這也是驗收時向評委展示“鏈上確實在記賬”最直接的證據(jù)。3. 鏈碼設(shè)計把救助申請、審核、放款、還款寫成可追溯的狀態(tài)機Fabric 里鏈碼是業(yè)務(wù)邏輯的核心Spring Boot 只是殼。慈善救助的信用問題拆到鏈上本質(zhì)是一筆救助資金的完整生命周期申請、核驗、審批、放款、還款或者核銷。如果只把結(jié)構(gòu)化數(shù)據(jù)塞進 Fabric 當數(shù)據(jù)庫用那不如用 MySQL。鏈碼的價值在于兩件事一是狀態(tài)流轉(zhuǎn)必須經(jīng)過顯式調(diào)用且留有簽名背書二是歷史不可篡改每一步都有交易ID和時間戳。3.1 資產(chǎn)結(jié)構(gòu)為什么用救助編號做復(fù)合鍵而不是只用UUID救助資產(chǎn)我用 Go 寫結(jié)構(gòu)體長這樣type ReliefApplication struct { ApplicationId string json:applicationId ApplicantName string json:applicantName ApplicantIDCard string json:applicantIdCard ReliefType string json:reliefType Amount float64 json:amount Status string json:status ApplyOrg string json:applyOrg ApprovedOrg string json:approvedOrg CreatedAt string json:createdAt UpdatedAt string json:updatedAt }我先講清楚為什么主鍵不用 UUID 字符串。Fabric 世界狀態(tài)是 KV 存儲key 決定了查詢效率。使用 UUID 做主鍵查一個受助人過往所有救助記錄時必須做全量掃描然后過濾效率很低也繞過了 CouchDB 的索引進而在演示時給自己挖坑。常見做法是用復(fù)合鍵或者帶業(yè)務(wù)含義的鍵例如applicantKey, err : ctx.GetStub().CreateCompositeKey(relief, []string{ applicantIDCard, applicationId, })CreateCompositeKey 是 Fabric 鏈碼提供的工具函數(shù)第一個參數(shù)是類型前綴后面是拼接字段。生成出來的 key 形如 “relief\uff000xId\uff00app001”。這樣做的直接好處查一個受助人的全部救助記錄時可以用 GetStateByPartialCompositeKey 按前綴掃描天然支持范圍查詢而且不需要 CouchDB 索引就能跑通。申請人身份證號是敏感字段存儲時可以做哈希后作為第二維度但課設(shè)階段為了演示可讀性通常直接用脫敏后的編號。3.2 核心狀態(tài)流轉(zhuǎn)從申請到還款的5個狀態(tài)與權(quán)限校驗狀態(tài)機是信用系統(tǒng)的骨干。我設(shè)計了五個狀態(tài)APPLIED → VERIFIED → APPROVED → DISBURSED → REPAID ↘ → OVERDUEAPPLIED 是受助人或社區(qū)專員提交救助申請VERIFIED 是核驗人員確認身份和家庭收入信息APPROVED 是審批人決定救助金額和救助方式DISBURSED 是資金已經(jīng)發(fā)放REPAID 是借款人完成還款或公益救助完成核銷。如果約定還款期限到期仍未還款狀態(tài)置為 OVERDUE這筆記錄進入受助人的負面信用檔案。為什么一定要有 VERIFIED 這個中間狀態(tài)傳統(tǒng) CRUD 里核驗只是把某個字段改成 true但在區(qū)塊鏈語境下每一步都代表一個獨立的組織或角色在交易上簽名。核驗人、審批人、放款人可以是不同組織背書策略才能體現(xiàn)“多方共治”。如果一個人提交完申請就把狀態(tài)直接改成 APPROVED那這條鏈和單機數(shù)據(jù)庫沒有區(qū)別評委一問“你憑什么證明審批人是真實機構(gòu)“就會卡住。鏈碼里對每個狀態(tài)變更做權(quán)限校驗核心代碼func (s *SmartContract) ApproveApplication(ctx contractapi.TransactionContextInterface, applicationId string) error { application, err : s.readApplication(ctx, applicationId) if err ! nil { return fmt.Errorf(讀取救助單失敗: %v, err) } if application.Status ! VERIFIED { return fmt.Errorf(救助單狀態(tài)不是 VERIFIED當前狀態(tài): %s, application.Status) } clientMSPID, err : ctx.GetClientIdentity().GetMSPID() if err ! nil { return fmt.Errorf(獲取調(diào)用者身份失敗: %v, err) } if clientMSPID ! Org1MSP { return fmt.Errorf(只有審批機構(gòu) Org1MSP 可以執(zhí)行審批操作) } application.Status APPROVED application.ApprovedOrg clientMSPID application.UpdatedAt time.Now().Format(time.RFC3339) key, err : ctx.GetStub().CreateCompositeKey(relief, []string{ application.ApplicantIDCard, application.ApplicationId, }) if err ! nil { return err } applicationBytes, err : json.Marshal(application) if err ! nil { return err } return ctx.GetStub().PutState(key, applicationBytes) }這段邏輯有三層意思。第一層狀態(tài)校驗放在入?yún)⑿r炛?、寫庫之前防止并發(fā)提交時把已審批的單子再次審批。第二層GetMSPID 判斷調(diào)用者屬于哪個組織這里寫死 Org1MSP 只是示例實際課設(shè)建議把可執(zhí)行審批的 MSP 列表做成通道參數(shù)或鏈碼初始化參數(shù)不要硬編碼在方法里否則評審老師問“換個組織怎么辦”你不好答。第三層寫狀態(tài)時重新生成復(fù)合鍵再 PutState因為從世界狀態(tài)讀出來的應(yīng)用對象本身不攜帶 key 信息如果你用原始 key 寫入會有冗余。3.3 CouchDB富查詢與歷史溯源給評委演示“這個人的救助記錄沒法改”前面說 CouchDB 的意義在于富查詢。鏈碼里如果直接調(diào) GetStateByRange只能按 key 順序掃沒法按狀態(tài)過濾。用 CouchDB 的話可以先在鏈碼包里聲明索引。在鏈碼目錄下創(chuàng)建 META-INF/statedb/couchdb/indexes/statusIndex.json{ index: { fields: [status, updatedAt] }, ddoc: statusIndexDoc, name: statusIndex, type: json }這個設(shè)計文檔會在鏈碼部署時自動安裝到 CouchDB。注意 ddoc 和 name 是唯一標識修改索引時如果改了名字舊的設(shè)計文檔會殘留。索引字段順序有講究status 放前面用于等值過濾updatedAt 放后面用于排序反過來會讓排序無法利用索引。部署鏈碼后鏈碼內(nèi)用 JSON 選擇器做富查詢func (s *SmartContract) QueryByStatus(ctx contractapi.TransactionContextInterface, status string) ([]*ReliefApplication, error) { queryString : fmt.Sprintf({selector:{status:%s}}, status) resultsIterator, err : ctx.GetStub().GetQueryResult(queryString) if err ! nil { return nil, err } defer resultsIterator.Close() var applications []*ReliefApplication for resultsIterator.HasNext() { queryResponse, err : resultsIterator.Next() if err ! nil { return nil, err } var application ReliefApplication err json.Unmarshal(queryResponse.Value, application) if err ! nil { return nil, err } applications append(applications, application) } return applications, nil }GetQueryResult 是鏈碼 SDK 里專門給 CouchDB 用的接口LevelDB 模式下調(diào)用它會直接報錯。這就是為什么我在第 2 章反復(fù)強調(diào)啟動網(wǎng)絡(luò)要帶 -s couchdb。歷史溯源是區(qū)塊鏈課設(shè)里最有說服力的演示點。核心調(diào)用是 GetHistoryForKey鏈碼側(cè)把它暴露成一個查詢接口func (s *SmartContract) GetReliefHistory(ctx contractapi.TransactionContextInterface, applicationId string) ([]interface{}, error) { key, err : ctx.GetStub().CreateCompositeKey(relief, []string{ applicantIDFromQuery, applicationId, }) if err ! nil { return nil, err } historyIterator, err : ctx.GetStub().GetHistoryForKey(key) if err ! nil { return nil, err } defer historyIterator.Close() var history []interface{} for historyIterator.HasNext() { response, err : historyIterator.Next() if err ! nil { return nil, err } var value map[string]interface{} if len(response.Value) 0 { err json.Unmarshal(response.Value, value) if err ! nil { return nil, err } } history append(history, map[string]interface{}{ txId: response.TxId, timestamp: response.Timestamp, value: value, isDelete: response.IsDelete, }) } return history, nil }返回結(jié)果里每一項都帶著交易ID和背書時間戳。演示時你可以先做一次 UPDATE再拉歷史就能看到同一條 key 下出現(xiàn)兩個版本的 world state。你可以當場把歷史里的舊值修改掉——試試看鏈碼不會允許直接改以前的版本因為每個版本都綁定著哈希鏈上的區(qū)塊。這就是”不可篡改“的直觀證明。4. Springboot集成Fabric網(wǎng)關(guān)Java側(cè)連接、提交與查詢的最小工程網(wǎng)絡(luò)和鏈碼通了接下來就是把 Spring Boot 項目接進 Fabric。這一步的痛點是 Spring Boot 開發(fā)者普遍對 Fabric 的連接模型不熟一看 connection.yaml 和 wallet 目錄就懵。其實可以把它類比成數(shù)據(jù)庫連接connection.yaml 是數(shù)據(jù)源配置wallet 是賬號密碼Contract 對象是 MappersubmitTransaction 是寫操作evaluateTransaction 是讀操作。4.1 依賴與選型fabric-gateway-java的版本和包體積控制Java 對接 Fabric 有兩條路fabric-sdk-java 和 fabric-gateway-java。sdk-java 是老一代方案API 復(fù)雜需要手動管理 HFClient、Channel、Peer 對象課設(shè)代碼會顯得很臃腫。我推薦用官方 Gateway API依賴就一個dependency groupIdorg.hyperledger.fabric/groupId artifactIdfabric-gateway-java/artifactId version2.2.0/version /dependency這個包會傳遞依賴 gRPC 和 protobuf。需要說明的是fabric-gateway-java 2.2 對應(yīng) Fabric 2.4 及以上版本的 Gateway 服務(wù)跑通 test-network 沒有問題。如果你的 Fabric 網(wǎng)絡(luò)是 2.2 LTS 老版本別硬上 2.2 的 gateway-java去用 1.4 版的 fabric-gateway-java它走的是舊的 gRPC 通道兼容性更好。這里版本匹配是個典型翻車點后面避坑章節(jié)細說。我提一個工程組織的建議不要在主啟動類里直接寫連接邏輯單獨建一個 fabric 子包里面放 config、service 兩層。這樣后面換網(wǎng)絡(luò)配置、加鏈碼方法都不用碰 Controller。4.2 connection.yaml與錢包目錄證書放哪、MSP怎么配先看配置文件。在 test-network 目錄里其實已經(jīng)生成了 connection profile路徑是fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.yaml這份文件可以直接復(fù)制到 Spring Boot 的 resources 目錄里但默認生成的還包含了 orderer 地址、CA 地址、兩個 peer 的 gRPC URL。我通常會把不相關(guān)的 peer 條目刪掉只留下 org1 的節(jié)點避免 Java 端在 discovery 時選到跨組織節(jié)點導(dǎo)致超時。精簡后的 connection-org1.yaml 關(guān)鍵部分name: ReliefNetwork-org1 version: 1.0.0 client: organization: Org1 connection: timeout: peer: endorser: 120 channels: reliefchannel: peers: peer0.org1.example.com: endorsingPeer: true chaincodeQuery: true ledgerQuery: true eventSource: true organizations: Org1: mspid: Org1MSP peers: - peer0.org1.example.com peers: peer0.org1.example.com: url: grpcs://localhost:7051 tlsCACerts: path: ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt注意這里的 path 是相對路徑網(wǎng)關(guān)加載時會以 yaml 文件所在目錄為基準。如果你把連接文件放到 resources/fabric/ 下證書路徑就得寫 resources/fabric/crypto-config/... 相對路徑經(jīng)常踩坑我后面會給一個更穩(wěn)的做法在 Java 里用 ClassPathResource 讀證書拼絕對路徑再填進配置。實際上更常見的做法是標準連接文件路徑使用 fabric-samples 里的絕對路徑或者把 organizations 目錄拷貝進工程。然后是錢包目錄。Fabric 網(wǎng)關(guān)的 wallet 是一個文件夾里面存用戶的身份材料。課設(shè)最省事的方式是在 test-network 啟動后把 Adminorg1.example.com 的私鑰和證書拷出來mkdir -p wallet/adminOrg1/msp/keystore mkdir -p wallet/adminOrg1/msp/signcerts cp organizations/peerOrganizations/org1.example.com/users/Adminorg1.example.com/msp/keystore/*_sk wallet/adminOrg1/msp/keystore/ cp organizations/peerOrganizations/org1.example.com/users/Adminorg1.example.com/msp/signcerts/cert.pem wallet/adminOrg1/msp/signcerts/也可以借助 Java 側(cè)工具直接從 org 目錄加載身份并寫入 walletPath walletPath Paths.get(wallet); Wallet wallet Wallets.newFileSystemWallet(walletPath); Path identityDirectory Paths.get(crypto-config/peerOrganizations/org1.example.com/users/Adminorg1.example.com/msp); Identity identity X509Identity.newIdentity(Org1MSP, certificate, privateKey); wallet.put(admin, identity);這段邏輯說明Wallets.newFileSystemWallet 會創(chuàng)建或打開一個本地錢包目錄put 方法將身份寫入錢包第一個參數(shù)是用戶名標識后續(xù) gateway 構(gòu)造時只要用這個名字就能找到身份材料。4.3 把鏈碼調(diào)用封裝成ServicesubmitTransaction和evaluateTransaction的分工Java 側(cè)的核心配置類長這樣Configuration public class FabricGatewayConfig { Bean(destroyMethod close) public Gateway gateway() throws Exception { Path walletPath Paths.get(wallet); Wallet wallet Wallets.newFileSystemWallet(walletPath); Path networkConfigPath Paths.get(src/main/resources/connection-org1.yaml); Gateway.Builder builder Gateway.createBuilder() .identity(wallet, admin) .networkConfig(networkConfigPath) .discovery(true); return builder.connect(); } Bean public Network network(Gateway gateway) { return gateway.getNetwork(reliefchannel); } Bean public Contract contract(Network network) { return network.getContract(relief); } }這個配置類集中了兩處容易錯的地方。第一Gateway bean 標注了 destroyMethod close否則 Spring 容器關(guān)閉時連接不會釋放開發(fā)環(huán)境熱重啟會積累一堆 gRPC 連接導(dǎo)致端口耗盡。第二networkConfigPath 這里用的是相對路徑依賴你啟動 Spring Boot 時的工作目錄是項目根目錄。更穩(wěn)的寫法是用 classpath: 前綴讀 resources 下的文件然后轉(zhuǎn)成 Path。至于證書文件路徑在 yaml 里寫的相對路徑是相對于 yaml 文件所在目錄這個規(guī)則容易和 Java 的類路徑概念混淆。Service 層按讀寫分離封裝Service public class ReliefChaincodeService { private final Contract contract; public ReliefChaincodeService(Contract contract) { this.contract contract; } public String submitApplication(String appId, String name, String idCard, String reliefType, BigDecimal amount) throws Exception { byte[] result contract.submitTransaction( SubmitApplication, appId, name, idCard, reliefType, amount.toPlainString() ); return new String(result, StandardCharsets.UTF_8); } public String queryApplication(String appId) throws Exception { byte[] result contract.evaluateTransaction(QueryApplication, appId); return new String(result, StandardCharsets.UTF_8); } public String queryHistory(String appId) throws Exception { byte[] result contract.evaluateTransaction(GetReliefHistory, appId); return new String(result, StandardCharsets.UTF_8); } }兩條方法路的底層動作不同。submitTransaction 會把交易提案發(fā)給所有需要背書的 peer收集背書結(jié)果再發(fā)給排序節(jié)點出塊等待區(qū)塊提交確認后才返回。所以它在鏈碼返回結(jié)果的同時也保證世界狀態(tài)已經(jīng)寫入。evaluateTransaction 只發(fā)到一個 peer 做本地查詢不會產(chǎn)生交易響應(yīng)速度更快但結(jié)果可能不是所有 peer 里最新的——在 Fabric 里同一通道的 peer 最終會一致但查詢瞬間可能有短暫滯后。做演示查詢用 evaluate寫業(yè)務(wù)數(shù)據(jù)必須走 submit。還有一步值得演示事件監(jiān)聽。放款動作是資金流動的關(guān)鍵節(jié)點可以在 Spring Boot 啟動時注冊一個監(jiān)聽器contract.addContractListener( charity-listener, new ContractEventListener() { Override public void received(ContractEvent event) { String eventName event.getName(); byte[] payload event.getPayload(); if (DisburseEvent.equals(eventName)) { log.info(收到放款事件: {}, new String(payload, StandardCharsets.UTF_8)); } } } );事件監(jiān)聽讓 Java 后端不必頻繁輪詢鏈上狀態(tài)鏈碼在狀態(tài)變更時 emit 一個事件后端收到后可以去更新自己的本地 MySQL 匯總表。這套機制在答辯時提出來能讓評委看到你理解了 Fabric 的異步模型而不是只會同步調(diào)用。5. 慈善救助信用系統(tǒng)的5個高頻坑證書路徑、背書超時、冪等與索引這一章是血淚經(jīng)驗。我在同一個課設(shè)框架下幫人排查過的坑集中在連接、超時、重啟、編碼、索引五個點上。每一條都是先給現(xiàn)象再講原因最后說解決。5.1 連不上peer報錯說MSP not found其實證書路徑錯了現(xiàn)象啟動 Spring Boot 后調(diào)用鏈碼控制臺拋出類似 “failed to load MSP: msp not found” 或者 “no valid peers at the requested channel” 的異常。新人第一反應(yīng)是網(wǎng)絡(luò)沒起或者通道名寫錯反復(fù)重啟 Docker問題依舊。原因Fabric 網(wǎng)關(guān)從 wallet 里加載身份時要求目錄結(jié)構(gòu)嚴格匹配 MSP 標準。最常見的錯誤是把私鑰和證書放反了或者證書目錄叫 cacerts 而不是 signcerts。另外 connection.yaml 里的 tlsCACerts.path 指向的文件必須是 peer 的 TLS CA 證書如果你誤指向了組織管理員自己的簽名證書gRPC 握手時 TLS 校驗直接失敗。解決回到錢包目錄用 find 命令確認結(jié)構(gòu)find wallet/adminOrg1 -type f正常輸出應(yīng)該包含 keystore/xxx_sk 和 signcerts/cert.pem 兩類文件。如果 multi 證書鏈很長用 openssl x509 -in cert.pem -noout -text 查看簽發(fā)者確認是 CA 簽發(fā)的身份證書而不是 tls 證書。順便把 connection.yaml 的 tlsCACerts 路徑改成 test-network 里 peer 節(jié)點自己的 ca.crt 絕對路徑一勞永逸。5.2 提交交易超時不是網(wǎng)絡(luò)慢是背書策略沒湊夠兩個組織現(xiàn)象evaluateTransaction 秒回改成都 submitTransaction 后經(jīng)常等十幾秒然后報 “Transaction timed out” 或者 “ENDORSEMENT_FAILURE”。原因Fabric 默認的背書策略是 AND(Org1MSP, Org2MSP)也就是說一筆交易必須同時拿到兩個組織的 peer 背書。如果你的 connection.yaml 里只配了 Org1 的節(jié)點網(wǎng)關(guān)自動 discovery 也找不到 Org2 的 peer——因為 Org2 的連接信息不在這個 profile 里。解決最省事的做法是在網(wǎng)絡(luò)層面把鏈碼背書策略改成只需 Org1 一個組織./network.sh deployCC -ccn relief -ccp ./chaincode/relief-go -ccl go -ccp ../chaincode/relief-go -ccep OR(Org1MSP.member)重新部署后背書只需 Org1 的 peer。這個參數(shù)就是 chaincode endorsement policy 的簡寫形式完整寫法則是一串 JSON 策略。課設(shè)階段為了演示順暢我會把鏈碼策略改成 OR并在報告里說明這是為了簡化演示生產(chǎn)環(huán)境應(yīng)當是 AND。另一個隱藏因素排序節(jié)點出塊超時。如果一個區(qū)塊里交易太少orderer 會等 BatchTimeout默認 2 秒后才出塊所以你會感覺提交后總有一兩秒的停頓這不是 Bug是設(shè)計如此。5.3 重啟Fabric后Java端連不上orderer地址變了現(xiàn)象第一次啟動后一切正常把網(wǎng)絡(luò) down 掉再 upJava 端調(diào)用 submitTransaction 就報 “failed to connect to orderer” 或者連接被拒。原因test-network 每次 up 后用相同的容器名和映射端口理論上不應(yīng)該有問題。但如果之前手工改過 docker-compose 文件、或者舊容器沒有完全清理orderer 的 Raft 節(jié)點 ID 和端口映射會發(fā)生漂移。更常見的是你通道配置文件里記錄的 orderer 端點地址和當前容器實際監(jiān)聽的地址不一致。解決強制徹底清理不要用 down 再用 updocker rm -f $(docker ps -aq) docker volume prune -f ./network.sh up createChannel -c reliefchannel -ca -s couchdb ./network.sh deployCC -ccn relief -ccp ../chaincode/relief-go -ccl go如果這樣還連不上在容器里直接驗證 orderer 端口docker exec orderer.example.com sh -c nc -zv localhost 7050再確認 Java 端連接的 host 是不是 localhost:7050。新版 test-network 中 orderer 對外端口是 7050 沒錯但如果你用自己的 compose 文件覆蓋過端口可能改成 8050 之類這時候 connection.yaml 里的 orderer url 要同步改。5.4 中文數(shù)據(jù)存進去顯示亂碼全鏈路UTF-8現(xiàn)象用 Postman 往 Spring Boot 提交一條含中文姓名的救助申請鏈碼返回成功但從 CouchDB 查出來顯示 \u5f20\u4e09 或者直接亂碼。原因Fabric 的 protobuf 序列化和 gRPC 傳輸都按字節(jié)流處理本身不關(guān)心字符集。亂碼幾乎總是發(fā)生在 Java 應(yīng)用層要么是 new String(result) 用了平臺默認字符集要么是 Spring Boot 的 CharacterEncodingFilter 被改成了其他編碼。解決所有鏈碼返回值解碼統(tǒng)一顯式指定 UTF-8我在第 4 章的 Service 代碼里已經(jīng)寫成了 new String(result, StandardCharsets.UTF_8)這是唯一正確寫法。另外檢查 Spring Boot 配置server: servlet: encoding: charset: UTF-8 enabled: true force: trueforce: true 會將請求和響應(yīng)都強制按 UTF-8 處理。鏈碼側(cè) Go 語言默認就是 UTF-8 字符串處理一般不用額外改。這個坑十次里有八次出在 Java 側(cè)別去折騰鏈碼。5.5 富查詢報錯no usable indexCouchDB設(shè)計文檔沒裝進去現(xiàn)象鏈碼里用 GetQueryResult 查詢狀態(tài)為 APPLIED 的救助單返回錯誤 “no usable index exists for this query”。原因這條報錯的直接原因是 CouchDB 沒有匹配的索引。索引沒裝進去的原因通常是鏈碼包里的 META-INF 目錄結(jié)構(gòu)不對。Fabric 部署鏈碼時只會把鏈碼打包路徑下固定位置的索引文件裝入 CouchDB位置錯了它不報錯只是靜默忽略。解決先檢查目錄結(jié)構(gòu)正確格式chaincode/relief-go/ ├── go.mod ├── go.sum ├── relief.go └── META-INF/ └── statedb/ └── couchdb/ └── indexes/ └── statusIndex.jsonMETA-INF 必須放在鏈碼源碼目錄的根下不能放在子模塊里。確認后重新打包部署./network.sh deployCC -ccn relief -ccp ./chaincode/relief-go -ccl go部署成功后進 CouchDB 容器手動驗證curl -s http://admin:adminpwlocalhost:5984/reliefchannel_relief/_index返回結(jié)果里應(yīng)該能看到 statusIndexDoc。如果這條命令連不上檢查 CouchDB 的端口映射和用戶名密碼test-network 默認是 admin/adminpw。索引生效后再跑富查詢就不會報錯了。6. 答辯驗收怎么演示種子數(shù)據(jù)、區(qū)塊高度與信用閉環(huán)話術(shù)課設(shè)做到最后演示順序比功能代碼更重要。我的建議是一條黃金路線先證明鏈在動再證明數(shù)據(jù)改不了最后把”信用“兩個字講成閉環(huán)。6.1 演示順序從區(qū)塊高度到單筆追溯的黃金路線第一步控制臺執(zhí)行 peer channel getinfo -c reliefchannel展示區(qū)塊鏈高度。第二步調(diào)用 Spring Boot 提交一筆救助申請再重復(fù)第一步高度遞增。這一步同時證明鏈和業(yè)務(wù)系統(tǒng)是真實打通的。第三步調(diào)用歷史溯源接口展示同一筆救助單從 APPLIED 到 DISBURSED 的每一次變更每一條記錄都帶 txId 和 timestamp。第四步用富查詢按狀態(tài)篩選 VERIFIED 的申請證明跨機構(gòu)的數(shù)據(jù)檢索能力。第五步如果時間充裕展示事件監(jiān)聽日志后端自動捕獲了鏈碼發(fā)出的 DisburseEvent。6.2 把“信用”講成閉環(huán)評委追問時你遞出去的證據(jù)鏈評委大概率會追問三個方向。第一“怎么證明數(shù)據(jù)沒被改”——回答是哈希鏈和背書簽名每個 peer 都存著一份完整賬本改一個區(qū)塊會導(dǎo)致后續(xù)所有區(qū)塊哈希失配。第二“信用表現(xiàn)在哪里”——回答是救助記錄形成信用檔案同一申請人再次申請時歷史狀態(tài)里的逾期記錄會被自動提取審批機構(gòu)據(jù)此決策。第三“為什么不用 MySQL”——回答是 MySQL 的修改不留痕跨機構(gòu)數(shù)據(jù)不互信Fabric 的多組織背書模型就是為此設(shè)計的。演示時提前準備一份帶有兩三條歷史記錄的受助人數(shù)據(jù)配合查詢接口現(xiàn)場展示比背概念有力得多。提示課設(shè)源碼包里的報告如果寫了性能測試數(shù)據(jù)答辯時不要主動報 TPS 數(shù)字。Fabric 的定位是可信任協(xié)作不是高并發(fā)記賬把重點放在一致性、審計和權(quán)限模型上。我自己的習慣是每次演示前先在空白環(huán)境走一遍第 2 章的啟動命令確認容器清單完整、鏈碼部署成功后才開始演示。不然現(xiàn)場虛擬機關(guān)機后再開機經(jīng)常因為端口占用或容器沒正常啟動而翻車。這一段流程熟練到閉眼能敲答辯的底氣就有一半了。另外一個建議是把鏈碼里的關(guān)鍵校驗邏輯打印到日志里啟動 Spring Boot 時開啟 DEBUG 級別的 fabric 日志出問題直接搜 gRPC 調(diào)用棧比猜快很多。Fabric 這套東西真正難的不是寫代碼是把“多方不信任但需要協(xié)作”的業(yè)務(wù)模型講清楚。希望這篇文章能讓你少走我踩過的那些彎路把精力留在業(yè)務(wù)邏輯和演示效果上希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
在线观看欧美| 成人视频婷婷| 超碰网站在线观看| 一本色道久久88加勒比| 可以直接看的av| 国产一二三四五六七八视频| 夜夜天天久久婷婷| 久久久思思热| 色五月激情| 色99综合色88| 久久精品一区二区三区四区| 天天日日夜夜| 亚洲婷婷免费| 综合五月婷婷| 99视频在线| 婷婷激情社区| 天天舔天天摸天天透| 色婷婷亚洲| 青青操成人福利| 久热无码| 国产精品美女久久久久AV超清| 色九九九九| 久久机只有这里精品| 91操熟女| 激情五月天久久丁香| 色涩影院六月丁香| 超碰激情五月| 激情图片久久| 99视频35精品视频在线观看| 99热e| av免费在线观看0| wWw色五月| 激情图片99| 996黄色片| 欧美性猛交XXXX乱大交极品| 怡红院AV亚洲一区二区三区H| 99免费在线| www.色五月| 色婷婷丁香五月综合| 久热这里这里有精品| 久久99网站| 久久一级片| 丁香婷婷影院| 婷婷五月中文字幕| 91婷婷丁香| www,色婷婷| 欧美啪啪9| AV免费在线网站| 日本三级日本黄色| Www99热| 操婷婷久久| 日本玖玖在线| 日本色色网站| 亚洲av网站| 激情综合网址| 五月情丁香色| 婷婷五月天激情综合深爱激情| 春色激情第四色| 97精品人人A片免费看| 99综合网| 婷婷桃色网| 丁香五月婷婷影视先锋| 天天干,天天操,天天射| 激情五月天久久丁香| 五月婷婷深深的爱| 丁香五月婷婷在线视频| 日亚二欧美| 丁香 久久| 人妻激情综合| 99久久国产宗和精品1上映| 国产肥白大熟妇BBBB视频| 97色婷婷| 久久狠婷婷| 色婷婷五月天偷拍| 五月天激情综合网站| 国产永久一二一起草| 天天拍天天做视频| 国产精品日日躁夜夜躁| 精品一二三区久久AAA片| 五月天开心网| 亚洲无码免费看| 五月天婷婷綜合院| 蜜乳A√| 26UUU欧美| 久婷久婷| 新激情婷婷| 97碰成超视频免费视频| 久久久久久久久久久-久五月天婷婷| 色噜噜丁香| 伊人大蕉香| 婷婷五月天影院| 五月激情丁香久久综合网| 欧美色色色| 久久婷婷视频| 天海翼中文字幕高| 97人妻碰碰碰久| 婷婷 激情 五月| 五月丁香欧美在线| 超碰免费人人| 婷婷五月天涩涩| 婷婷综合在线网| 99热999| 五月丁香啪啪综合| 激情五月婷婷中文字幕| 91色五月| 激情婷婷五月综合| 狠狠色噜噜狠狠色噜噜噜999| 天天色色婷婷| 一区二区三区视频| 婷婷丁香六月天激情四射网| 色婷婷五月六月丁香综合视频| 久久久婷丁香五月| 九九综合精品| 9 9热这里有精品| 亚洲九区| 久久久免费精彩视频| 色色网站| 久久WW| 天天插天天插天天日| 婷婷香五月综合激情| 丁香婷婷性久久| 久久99视频| 日韩熟女啪啪视频| 国产精品五月丁香| 狠狠色综合网| 婷婷午夜综合| 丁香六月久| 99热97| 色99视| 欧美丁香婷婷天天操| www.亭亭五月天| 九九这里都是精品| a在线免费v| 五月在在观看| 人人摸人人干| 91性高潮久久久久久久久| 丁香六月激情蜜桃| 国产成人AV| 国产免费一区二区三区三州老师F1F1.CC | 99色嘟嘟精品网站| 丁香五月天婷婷久久| 激情图片久久| 久久狠婷婷| 婷婷色日本| 99久久9| 九九re视频在线视频| 日日夜夜狠狠婷婷色| 日日夜夜天天| 欧美日韩五月婷婷| 色狠狠婷婷| 伊人久久婷婷| 久鲁鲁色网| 丁香五月欧美激情| 国产av基地| 丁香激情综合| 色约约视频一区二区三区四区五区| 超碰三级秋霞| 噜噜噜久久| 六月婷基地| 亚洲丁香五月| 97久久超视频| 狠狠色色| 91精品综合久久婷婷九色| 婷婷香五月综合激情| 色婷婷综合视频| www.开心激情| 日韩AV无码影片| 激情五月伊人婷婷| 丁香五月激情网| 99成人在线观看| 色色色国产| 欧美叉叉叉BBB网站| WWW99热| 人人操AV| 激情婷婷丁香五月天| www.天天干| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 91色噜噜狠狠狠狠色综合| 性爱网六月丁香| 六月婷婷亚洲| 爱狠射| 婷婷五月18永久免费视频| 五月天久久色| 99成人免费热视频| 99热999| 色色网站免费| 9久国产精品| 丁香九月综合激情| 天天爽成人综合网站| 中文字幕黄色片| 久久婷婷国产| 亚洲热热视频| 人人看人人摸人人| 《久久综合九色综合97婷婷| 超碰人人操人人干| 亚洲第一色色色色| 99@久久@99精品视频| 激情网婷婷婷| 任你操精品免费| 99色网站| 婷婷5月天激情综合| 国产一区二区三区影院| 九九无码视屏| 日本啪啪天堂| www.夜夜爱.com| 99在线精品视频在线观看| 淫荡A片| 大香蕉99| 激情合网婷婷| 超碰在线综合| 91啪啪视频| 激情五月婷婷色综合| 日本AAAAAAAAAAAAAA片| 五月激情综合性爱| 五月天丁香成人社| 新激情五月开心五月婷婷五月丁香五月| 中文字幕中文有码在线| 99精品一二三四视频| 欧美精品999| 五月丁香啪| 美女激情婷婷| 91久久综合亚洲鲁鲁五月天| 日本人妻伦在线中文字幕| 婷婷五月色网| 激情AV| 国产看真人毛片爱做A片| 99热精国产这里只有精品| 夜色爱爱亚洲| 天天操天天插| 九九精品在线观看视频6| 好色婷婷| 黄网在线免费观| 丁香五月天论坛| 婷婷99狠狠| 久久激丁香| 丁香六月婷婷久久综合| 777精品成人a v久久| 五月丁香最新| 丰满人妻妇伦又伦精品国产| 久久东京热婷婷五月| 天天日夜夜高潮| 爱狠射| 中文字幕AV网址| 五月色丁香国产在线视频| 99久久精彩视频| 开心五月激情网| 久久综合丁香激情五月| 五月激情另类| 久久婷婷啪啪视频| 精品99视频| 韩国真做片在线观看| 五月天啪啪啪| 色综合色色色色色| 丁香五月六月久久综合| 色九月婷婷综合| 欲求不满的人妻| 国产日韩欧美性生活| 丁香五月激情啪啪啪| 国产这里只有精品| 91玖玖| 婷婷色五月综合| 玖玖在线资源视频| 日日噜人人人做人| 久久 婷婷 五月天| 五月亭亭欧美女人| 激情熟女网| 国产精产国品一二三在观看| 99视频精品| 九九综合精品| 亚洲无码黄色| 国内久久久精品99| 天堂在线婷婷| 8050一级网| 大香蕉五月天婷婷| 五月丁香免费看| 这里精品| 色五月丁香网| 久久精品视频在这里有| 国产精品A片| 九月丁香婷婷综合激情| 99精品热视频只有精品10| 91九色精品| 五月天久久小说| 国产日韩精品SUV| 五月天综合婷婷| 激情综合激情综合| 99热这里只有精品8| xfplayav在线| 婷婷色网站| 婷婷舔| 日日爱678| 99男人天堂| 日韩天堂久久| 人人性久久| 久操人| 97超喷视频在线观看| 欧美丁香六月激情视频| 五月天a婷婷伊人| 五月丁香婷婷综合在线| 五月激情婷婷开心五月| 影音先锋 婷婷| 九九视频这里只有精品在线播放 | 七七色色综合| 极品少妇婷婷五月| 91碰在线| 六月婷婷无码| 五月天激情无码高清| 色青青视频| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | www.婷婷六月天| 啪啪综合网| 人人干av| 青草视频在线播放| 在线综合啪| 97sese婷婷| 中文网婷婷字幕婷| 9久久精品视频| 天天日夜夜欢| 婷婷综合另类小说| 先锋男人99资源| 丁香五月婷婷色五月| 丁香亚洲婷婷五月| 五月天色丁香| 五月色婷婷综合| 日本三级日本三级99| 人人草人人舔| 婷婷狠狠青青| 97艹| 亚洲色五月天在线| 婷婷五月天小说网| 久99| 99免费视频精品| 五月丁香欧美在线| 91久久精品无码一区二区三区| 丁香久久| 久久怡红院| 久爱综合| 九色91视频| 丁香五月婷婷久久久| 人色五月天婷婷| 骚货艹网站视频| 精品99在线观看| 天天插综合| 欧美顶级少妇做爰HD| 曰本久久女| 天天搞天天色综合| 亚洲综合色丁香五月天| 天天综合色丁香| 亚洲视频99| 婷婷五月天av| 婷婷性爱视频在线| 天天综合.com| 91日本在线观看| 亚洲乱码日产精品BD| 96精品国产综合久久久久久| 色情性爱视频网址| 久久婷婷五月天蜜桃| 97碰久久| 99热黄| 99久久婷婷国产综合| 五月天激情Av| 97人人超| 99久高清视频| 激情丁香五月激情婷婷| 日本一级一片免费视频| 免費观看aV在线网址| 欧美色婷婷| 五月丁香婷婷三级| 色综合五月天| 激情九月婷婷| 99视频在线观看网址| 涩涩五月天| 婷婷五月丁香超碰| 九九Y精品热播| 在线五月婷婷小电影| 色色亚洲视频| 偷拍丁香九月激情| 天天干夜夜操A片| 激情综合五月| 久草视频大香蕉99| 亚洲综合色丁香五月天| 九月丁香婷婷| 大香网伊人久久综合| 99热久草| 色情终和网| www.狠狠| 激情五月婷婷综合| 婷婷网影院| 五月丁香久久丝袜啪啪| 成人精品视频99在线观看免费| 色日本综合| 开心五月丁香婷婷| 噼里啪啦在线观看免费完整版视频 | 亚洲 六月 综合| www.婷婷六月天| 99毛片| 丁香五月天av| 99视频在线9| 思思99热在线| 五月丁香香蕉| 色综合色综合婷婷热| 五月激情影院| 激情啪啪五月天| 人人草人人爱手机视频看看| 五月天久久色| 操逼123网| 曰韩少妇内射免费播放| 99热欧| 91婷婷| 99热日| 日本在线va| 免费色婷婷| 爱婷婷久久视频| 欧美性猛交 XXXX 乱大交| 开心五月婷婷激情| 99色热视频在线| 婷婷五月天网址| 日韩精品一区二区刘| 日日操天天爽| 玖玖爱导航| 丁香六月欧美| AV成人在线播放| 九九视频在线观看| 26uuu丁香婷婷五月| 日韩色五月| 婷婷久久精品| 99综合免费视频| 丁香婷色| 五月丁香六月综合激情| 激情综合网之激情五月| 久99999热视频在线观看免费| 精品视频99看在线视频| 老美AA片| 色播播五月| 婷婷丁香视频| 91ncom.色| 丁香成人五月天| 亚洲色网络| 久婷婷五月激情| h在线看免费版在线看| jiujiu无码五区| 51精品国自产在线| 五月丁香六月欧美综合网站| 爱久综合| 99在线精品免费视频| 丁香婷婷啪啪啪| 亚洲中文字幕翔田千里| 99人妻碰碰碰久久久久视| 亚洲婷婷久久综合| 天天日日夜夜| 婷婷激情5月| 欧美,日韩成人在线| 狠狠干无码| 在线观看av网站| 色五月涩涩婷婷| 色播六月| 任你干aa| 99久久婷婷国产综合| 五月天国产成人| 色婷婷在线电影| 色色色免费视频| 一本色道久久88加勒比—| 99精品热| 天堂婷婷五月色| 亚洲正能量欧美| 丁香五月开心亚洲| 亚洲五月婷婷在线| 日韩国产在线免费观看| 五月婷婷天天色| 啪啪啪丁香五月| 超碰人人91| 九九九九毛片| 偷拍99在线视频观看| 久热69| 欧洲亚洲免费视频9| 婷婷天天五月天| 成人五月天丁香| 日日夜夜青青草| 久久精品噜噜噜成人A∨色欲| 欧美丁香婷婷五月| 天天日天天干天天插天天射| 97操操| 337久久| 婷婷中文字幕| 色五月婷婷很很操| 欧美综合丁香网| 任你搞网站| 超碰婷婷色| 91日本在线观看| 五月丁香激情六月| 天天射夜夜爽| 欧美视频五区| 97色一二三| 色色热| 丁香五月婷婷AV在线| 99热国内| 亚洲色涩视频| 婷婷少妇激情| 丁香六月激情国产| 99热久久这里只有精品| 在线观看中文字幕| 激情啪啪五月| av性爱网站| 99re在线视频精品,这里只有精品18,| 天天综合色丁香| 五月天大香蕉av| 99精品网| 色色五月天丁香| 欧美色色网| 五月婷婷综合色啪首页| 激情五月天婷婷免费观看| 丁香婷婷色情| 亚洲精品网址| 欧美婷婷综合| 婷婷五月天黄色小说| 欧美激情五月天在线观看| 久久人人九九| 99超级碰碰| 91猫咪国产在线播放| 久久人人做人人妻人人玩精品va| 这里只有精品视频免费在线观看| 五月丁香六月激情综合| 中文AV网| 激情综合丁| 五月丁香在线婷婷蜜桃| 六月婷婷无码观看| 亚洲成色综合网站免费观看| 7月婷婷六月丁香| AV在线免费网站| 亚州综合色| 丁香五月 无码| 五月丁香在线观看国产| 免费91久久精品| 色天堂婷婷| 99热在线观看| 国产乱妇乱子在线播视频播放网站 | 五月丁香青草综合啪啪| 国内精品玖玖| 成人性爱无码| 五月丁香婷婷综合视频| 九色无码| 色色色国产| 成人五月天丁香婷| 日本超碰在线| 中文字幕永久在线| 久久激情网| 色域五月婷婷丁香| 九九热只有精品| 91九色精品熟女内射| 玖玖综合色| 久久久久婷婷| 五月综合视频| 强辱丰满人妻HD中文字幕| 熟女少妇内射日韩亚洲| 精品人妻伦一二三区久久| 国产日产亚系列精品版优势| 久婷婷视平| 五月婷精品| 日本高清综合网五月丁香| 深爱激情综合网| 五月婷婷在线视频观看| 婷婷五月亚洲综合| www.婷婷.com| 国产毛多水多女人A片| 内射干少妇亚洲69XXX| 久九男女天堂| 久久久久久久久久久久63| 啪啪东京热| 91久久五月天| 婷婷五月天激情网址| 五月天婷婷自拍图片在线观看| 欧美天天综合网站上去吧| 五六月丁香激情视频| 日日狠狠久久偷偷四色综合免费| 久久99热免费最新版| 丁香花五月天激情| 大香蕉啪啪啪| 日本波多野结衣视频| 99久久高清视频| 五月婷婷亚洲| 狠狠五月天婷婷| 亚洲色婷婷五月| 久久激情天堂| 美女五月天| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 五月天色色色| 在线观看视频1区| 婷婷激情五月天小说| 日韩成人精品中文字幕| 麻豆五月丁香婷婷| 97色片| 青青久在线视频免费观看| 黄色成人AV在线| 激情丁香五月综合| 99无码免费视频| 五月天激情视频网站| 成人AV中文字幕| 97在线视频观看| 一本九九色| 五月婷婷色色| 性爱电影科技贸易有限公司| 97精品在线| 伊人高清无码| 亚洲国产成人综合| 啪啪亚洲综合| 狠狠综合| www.婷婷,com| 丁香六月婷婷姐网| 天天操天天插| 婷婷刺激综合| 开心五月丁香婷婷| 大香蕉久久| 激情五月婷婷色色| 99热精品少| www.日本91| 亚洲网综合在线| 色婷婷香蕉| 午夜做爱影院| 亚洲第一成人无码A片| 色爱99| 丁香五月在线伊人| 婷婷五月天影院| www.久久99精品| 婷婷色激情网| 色九月婷婷丁香| 超碰亚洲欧美| 色五月无码| 色狠狠色噜噜AV天堂五区消防| 天天天天干| av色婷婷| 久久美女五月天| 五月日韩中文字幕| 五月天开心激情网色欲无码| 96精品久久久久久久久| 狠狠爱五月婷婷综合六月| 激情五月天婷婷免费观看| 99精品无码| 婷婷色色欧美综合网| 狠狠色狠狠干| 九九色热| 色色免费网站| 亚韩在线视频| 天天插天天射天天干| 丁香六月天堂| 99热在线极品极品| 26UUU精品一区二区Com| 国产婷婷色综合AV蜜臀AV| 99激情网| 99热99精品| 久久一级片| 激情五月丁香六月综合AVXXXX| 色色色色欧美| 深爱五月中文字幕| 久久久天堂国产精品女人| 色色亚洲无码| 99热精品在线| 人人舔人人色人人高潮| 婷婷丁香六月| 亚洲综合网激情小说| 色五月婷婷色| 色婷婷五月基地在线| 婷婷五月天视频| 五月开心婷婷极品激情| 99无码精品| www久久99com| 少妇人妻偷人精品无码视频新浪| 2020夜夜操天天爽| 丁香五月开心七月| 国产一二三四五六七八视频| 婷婷色狠狠| www.99成人视频| 99久久五月婷婷| 五月在线| www.日韩国产| 丁香五月色情| 欧美熟女99| 五月天开心网| www.色婷婷。com| av大片在线| 五月激情丁香| 99热 在线播放| 狠狠搞狠狠操| 99精品一二三四视频| 日本一道久久| 五月激情视频| 少妇熟女视频一区二区三区| 天天爽天天爽夜夜爽| 久久婷婷免费| 天天日天天舔| 97人妻碰碰碰久久香蕉| 99啪啪视频| 久久婷婷五月激情网站| 9 1大香蕉| 久草性爱| 99热精在线九九久久保| 天天色中文字幕女优AV| 丁香五月天啪啪| 亚洲第一黄网| 97色干在线观看| 丁香五月天在线观看| 色综合九九色综合88| 激情开心五月天| 中文字幕色色色| 久久99久久久| 五月丁香六月婷综合成人综合| www.久久66| 色综合女人99| 99亚洲综合| 北条麻妃伊人| 五月丁香精品| 五月丁香在线偷拍视频| 久久图色4| 任你艹| 丁香婷婷成人网| 色婷五月| 色九月综合| 五月丁香免费视频| 五月激情丁香久久综合网| 91主播在线| 26uuu欧美日本| 亚洲综合婷婷六月丁香五月| 五月丁香性爱| 97碰碰久久| 超碰免费在线| 99操逼| 日日操夜夜爽白洁| 黄色录像网点| 九九视频这里只有精品| SESE无码AV| 天天综合网、天天综合色| 日本熟妇乱妇熟色A片蜜桃| 日本久久精品18| a v色婷婷| 欧美日韩123| 碰超亚洲| 激情四射五月天| 综合伊人久久| 日日肏夜夜干| 第四色五月激情网| 六月丁香色色| 99情色五月天| 五月丁香六月婷| 九色无码| 久热网在线视频| 婷婷五月成年人| 五月丁香黄色| 99精品女人天堂| 又大又粗九一在线| 五月婷婷成人| 影音先锋一区二区三区| 人人草人| 久久免费视频62| 免费精品66| 五月婷婷久久久| 亚洲久艹| 丁香婷婷浪潮AV久久综合| 九九精品亚洲| 五月久视频| 激情婷婷六月| 日本不卡高字幕在线2019| 日本三级大片| 亚洲99在线| 狠狠狠色激情综合适合| 性99网站| 国产熟女日日骚五月丁香爱| 青青夜夜狠狠夜夜狠狠| 97色在线视频| 99日本精品视频热| 久久伦乱| 玖玖99精品视频| 91精品久| 色五月色开心开心五月| 97超级碰| 99热10在线高清播放| 国产精品久久久久久久久久免费| 深爱激情丁香| 婷婷金品综合视频| 思思久久99| 久久五月丁香| 在线看片av| 色综合久久99色| 五月婷婷丁香五月婷婷丁香| 无码色| 激情五月婷婷五月丁香五月开心五月| dingxiangtingtingliuyue| 视频这里只有精品16| 涩涩涩婷婷| 亚洲、热| 五月激情综合深爱| 色久五月天| 99er精品视频| 五月婷婷色情| 狠狠干综合网| 日本婷色| 另类综合激情| 超碰在线99| 99久久99久久综合| 欧美交换配乱吟粗大25P| 欧美黑人巨大性生话| 最近中文字幕在线中文视频| 江苏少妇性BBB搡BBB爽爽爽| 以及AA大片看看| 91九九热| 久久精品夜色噜噜亚洲a∨| 爆乳熟女一区二区三区爆乳 | 玖玖福利视频资源| 婷婷五月天免费视频在线观看| 色婷婷激情五月天在线观看| 丁香六月婷婷综合| 超级碰 久久9| 五月激情天| 99色爱| 六月婷婷青青青视频| 岛国操B不卡在线| 激情综合网五月| 五月丁香六月在线欧美| 99re99在线看| 亚洲另类久久| 欧美五月婷婷| av在线资源| 狠狠干狠狠干| 五月婷婷丁香综合,亚洲天堂| 艹天天射| 99色色热热| 色色日韩无码| 五月天狠狠| jiZZdr| 色综合久久久无码中文字幕999| Caoub青青超碰 | 婷婷日韩| 婷婷丁香五另类网站| 亚洲综合激| 99热日韩| 婷婷五月情| 香蕉婷婷五月| 日韩AV在线免费观看| 欧洲激情网站| 色色 9| 精品人人操| 五月丁香六月片| 五月丁香综合中文| 99在线观看视频精品| 婷婷丁香激情综合色情| 亚洲操逼网| 99久久五月婷婷| 91久操| www色中色综合| 九九热99热| 婷婷五月花| 丁香视频| 色五月天综合| 久久丝袜婷婷| 99色免费观看全部| 婷婷精品免费久久| 婷婷五月天激情综合网| 精品成人久久久久久久_一二三四视| 九九在线热九九在线热99热| 日本欧特黄色刺激一区影视久精品无码| 久草五月| 99热这里只有精品86| 色色a| 色综合综合综合| 99色在线观看| 亚洲这里只有精品| 欧美私人家庭影院| 五月综合丁香婷婷| 开心激情网五月| 色色色99| 伊人玖玖精品| 亚洲综合色棒| 欧美性生交A片免费看| 香蕉久久六月| 这里只有精品视频99| 超碰在线99| 九九99男女视频在线观看| 精品少妇蜜臀91| 26uuu成人网| 4399在线观看免费高清黄色视频| 九九九九九九九热| 日本狠狠干| 色色免费网站| 国产欧美va| 色婷婷五月综合激情中文字幕| 天天操夜夜爽天天操| 五月婷婷啪啪综合网| 五月婷婷香蕉| 欧美va国产va| 99热这里都是精品| 日韩人妻在线观看| 狠狠操狠狠操| 国产亚洲99久久精品熟| 亚洲五月天伊人| 五月婷婷中文| 97人人看| 九九热re99re6在线精品| 五月丁香激情综合网官网| 亚洲综合丁香五月| 丁香激情五月天| 午夜成人天堂久久无码日韩久久| 丁香婷婷久久老熟女综合网| 中文字幕人妻熟女在线| 《诡秘之主》在线观看| 任你爽免费视频| 色九九九九| 日本毛片内射| 五月天婷婷无码视频| 激情文学综合婷婷五月天丁香花| 亭亭丁香aV| 五月丁香激情啪啪| 夜夜夜天天操| 无码色色色| 97色婷婷| 五月婷丁香| 欧亚洲在线高清视频| 碰碰91| 综合久久影院| 日韩啪啪网| 人人操插| 玖玖婷婷五月天| 97干视频在线| 日本综合色色| 成人AV在线电影| 涩五月婷婷| 色色色婷婷五月| 99自拍视频| 色一情一乱一乱一区91Av| 丁香六月啪| 色色激情网| 久久九九网| 丁香五月天在线观看视频| 99热这里只有精品免费| 九九sese| 国产肥白大熟妇BBBB视频| 五月激情偷拍婷婷| 99综合五月免费视频色婷婷| 99热这里只有精品国产首页| 操逼综合网| av在线免费网站 | 久久婷婷五月天| 天天插天天日天天爽| 婷婷五月天色播| 综合xx网| 影音先锋男人av资源站| www.com五月天| 狠狠综合久久综合| 色情五月天丁香社区| 91人妻人人做人碰人人爽九色| 97人人干| 久久五月天色婷婷| 国精产品一区一区三区免费视频| 激情九九这里只有精品| 婷婷伊人綜合| 五月天婷婷丁香| 五月激情网五月综合网| 无码字幕中文| 97色色视频| 色五月婷色彩免播放器| 香蕉人妻AV久久久久天天| 丁香六月婷婷综合在线| 婷婷五月天午夜激情影院| 九九色综合九九色| 激情纯色婷婷五月天在线不卡视频| 五月天丁香色色| 99看片| 五月丁香婷婷爱激情综合网| 一级AV片| 26uuu国产| 那里有AV网址| 亚洲天堂AV综合网| 久热成人| 激情丁香五月激情婷婷| 特级操b片| 亚洲1区| 婷婷久久亚洲| 国产成人网| 久草五月丁香婷婷综合| ww久久| 精品色色网| 午夜]香婷婷深深爱| 久久98| 五月天激情美女久久| 天天操中文字幕| 婷婷中文字暮| 久草大| 狠狠色综合图片| 538任你爽| 激情五月婷婷色播网| 91视频一起草| 亚洲综合色婷| 99精品在线播放| 亚州精品久久久久AV无码| 成年人夜夜喷水| www,婷婷,com| 色播五月天激情| 色婷婷成人| 99久久国产成人精品| 色五月大| 国产午夜成人免费看片无遮挡| 五月婷婷激情综合| 婷婷丁香五另类网站| 久草性爱| wuyuedingxiang| 日韩aaa| 天天爽天天摸| 精a品a视a频| 麻豆精品| 丁香五月婷婷图片综合| 99热只有这里有精品| 99爱免费视频在线观看| 综合激情五月天| 人妻六月天| 少妇大叫太大太粗太爽了A片 | 在线成人国产| 噼里啪啦在线观看免费完整版视频| 噜噜狠狠色| 成年人99热| 色久婷婷五月| 婷婷五月天激情综合| 九九在线91| 日韩AV中文在线观看| 九月色婷婷| 狠狠色成人影片| 俺去啦综合网| 丁香六月婷婷高清| 国产资源在线视频| 国产精品18久久久| 亚洲超碰在线| 影音先锋噜一噜| 日本五月天激情| 激情五月天色婷婷| 就爱干 在线| 亚洲中文丁香| 99久久精彩视频。| 色五月婷婷在线| 久久伊人婷| 99色免费在线观看| 婷婷综合中文字幕| 亚洲妇女熟BBW| 色色色婷婷五月天| 五月天伊人| 欧州色色| 婷色成人| 丁香色啪综合| 思思热思在线精品视频| 亚洲综合在线伊人婷| 激情综合啪啪| 中文字幕婷婷| 草一草avb| 色色丁香五月天| 影视av久久久噜噜噜噜噜三级| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 偷偷操99| 99亚洲精品| 亭亭玉月丁香| 人妻久久人妻久久第一区| 天天情色综合网| 日日爽天天| 国语精品探花| 深爱五月日韩| 五月婷婷综合精品| 婷婷射婷婷舔| 夜夜骑天天玩天天日| 久久久久人妻精选| 99色免费视频| 拳交大逼| 成人开心五月天| 成人免费高清在线播放| 婷婷成人五月天| 综合99综合久久久久久久| av国产精品偷| 99在线热| 永久的网站AAAA| 欧洲激情五月天婷婷| 丁香六月亚洲| 亚洲另类婷婷五月综合| 婷婷精品性性性性性性性| 日本五月天一页| 欧美色色色色色| AV在线观看网站| 天天色色天天| www.狠狠操| 久综合4| 婷婷色基地在线看 | 婷婷欧美激情综合| 欧美99热| 久久这里在精品视频| 婷婷激情啪啪| 婷婷五月天综合久久| 丁香婷婷五月综合| 人妻久久久久久久| 强壮的公次次弄得我高潮A片日本 | 亚洲熟妇AV乱码在线观看| 天堂网操| 色婷婷88| 激情桃色网 | 色99色| 久久xx| m色激情网| 婷婷五月天激情小说| 五月婷婷亚洲| 丰满少妇乱A片无码| 五月丁香婷婷激情图片| 婷婷五月天最新网址| 久久婷婷成人| 丁香五月婷婷动漫| 天天射天天射一道本日本社区 | 五月天激情综合网| 99热综合| 日本成人内射| 东京热免费视频网站| 亚洲五月丁香综合网| 狠狠狠狠狠操| 第四色五月婷婷| 欧美性爱五月天| 99干在线视频| 热九九在线| www,av好吊操| 九月婷婷久久| 日韩欧美成人网| 综合久久影院| 狠狠色五月| 超碰免费人妻| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 婷婷涩五月| 嫩草AV久久伊人妇女超级A| 男人天堂 久久| 国产成人VA| 天天综合网在线| 五月天综合| 亚洲综合成人网站| Se.婷婷五月天| 亚洲视色| 亚洲欧洲中文日韩久久AV乱码| 9热在线视频| 亚洲精品国产成人AV在线| 天天谢天天操| 婷婷伊人网| 国产亚洲网站在线| 久热这里精品免费| www色五月| 五月天婷婷网站| 天天天久久久| 色婷婷五月综合| 中文字幕网伦射乱中文| 婷婷涩五月| 久久成人综合五月天| 色五月首页| 超碰狠狠干99| 九九九九毛片| 天天久| 九九99精品视频在线观看| 日本一级大片| 丁香五月天激情综合网| 天天噜噜| 色噜噜五月丁香婷婷| 亚洲综合五月天综合| 九九色综合九九色| 日韩AAA| 丁香六月啪啪啪| 特黄三级又爽又粗又大| 激情五月开心五月在线视频| 五月天婷婷爱| 九九热视频精品999| 色五月婷婷激情综合网| 国产精品色婷婷久久久精品| 99热97美女| 婷婷五月天激情小说| 99精品小视频| AA片在线观看视频在线播放 | 亚洲精品久久久久久久久久吃药| 五月天播播| 91九色精品| 综合五月网| 丁香色色五月| 97色伦另类图片小说视频 | 五月天久久综合| 激情六月婷婷| 亚洲一区二区 成人网站戴套| 色色综合无码| 色五月综合| 亚洲无码猫咪| 丁香五月23111| 国产精品18久久久| 狠狠色丁香久久久婷| 婷婷综合精品| 色色色色色色色色色色色色色色,网站| 久一这里有精品国产| 99色在线| 六月99天天婷婷激情综合| 情色婷婷五月天| 五月丁香婷婷啪啪综合| 这里只有精品2| www.爱婷婷.com| 激情综合色播| 色婷婷综合电影| 色色网站免费| 97五月天| 五月天成人在线精品| 五月丁香综合网| 天天草婷婷五月| www.夜夜| 婷婷五月天va| 国产精产国品一二三在观看| 五月天激情小说电影| 精品夜夜澡人妻无码AV| 丁香五月婷婷呀| 能看的av网站| 亚洲激情网站无码| 极品少妇高潮啪啪AV无码| 开心婷婷五月花| 成人国产欧美大片一区| 在线视频你懂得| 日韩成人综合网| 六月综和久久| 五月天大香蕉av| 五月天伊人手机在线播放AV| 亚洲V国产V欧美V久久久久久| 玖操97| 欧美日韩成人h| 色五月天成人| 六月婷婷七月丁香| 日韩另类在线观看| 色情丁香五月婷婷精品| 精品婷婷| 91精品电影18T| 久久久99精品免费观看| 久久久精品人妻录| 亚洲婷婷综合视频| 国产乱妇乱子伦| 色色丁香五月| AV在线观看网站| 99爱免费在线观看| 91无码一区人妻A片蜜| 噜噜网免费视频| 91丨九色丨熟女丰满| 99热综合| 婷婷丁香五月天小说| 久久五月丁香综合| 97精品自拍视频| 99啪啪| 国产AV熟妇人震精品一品二区| 丁香婷婷色五月天| 五月天婷婷久草丁香| 久热超碰| 亚洲 在线 性爱 | 久久99这里只有精品视频| 中文字幕第四色.999| 亚洲精品国产成人AV在线| 干婷婷五月天| 婷婷激情97| 91九色精品女同系列| 丁香五月婷婷88在线| 97ai婷婷| 久久99热这里只有精品| 综合色五月天| www.五月天色色色| 六月婷婷五月丁香| 综合热无码| 亚洲av无码精品色午夜| 综合五月婷婷| 综合激情深爱| 97操碰视频| 久久99久久99久久99| 色五月激情| 五月婷婷丁香在线视频| 亚欧州精品视频|