免费国产精品自在自线-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
返回資訊列表
成人在线视频一区| 久草久青福利| 日韩精品AV一区二区三区| 插插插色综合网| 色综久久久| 日日噜狠狠| www.丁香五月| 五月天五月婷五月激情网| 超级碰碰碰91| 9色免费网| 艳妇野外情欲放荡HD| 九九精品综合| 97精品在线| 丁香5月啪啪| 色婷婷久久综| 欧美色色色色色色色色色色| 一起草av在线观看| 大香蕉懂9| 在线看片h站| 无码操B| 天天爽天天日天天舔| www色婷婷久久综合久色| 婷婷五月丁香香蕉| 婷婷五月丁香花综合| 久99久视频精品| 婷婷色色网| 丁香五月欧美| av亚洲国产小电影| 人妻第九页| 婷婷成人视频| 一点色成人网| 超碰97在线操| 丁香五月很很肏| 丰满少妇猛烈A片免费看观看| 99久久九九| 五月天伊人| 美女丁香五婷婷| 五月综合激情视频| 婷婷五月综合亚洲| 欧洲综合视频| 激情网五月天| 日本黄色一级| 在线91日韩| 久久久久久久,99精品视频| 日本人妻A片成人免费看片| 欧美99热| 99re热视频这里只精品| 超级碰碰碰久久网站视频| 成人无码髙潮喷水A片| 五月婷婷综合激情| 五月婷视频| 精品一二三区久久AAA片| 日本天天操| 久久婷婷亚洲| 婷婷五月综合性爱| 亚洲人妻电影| 婷婷五月亚洲激情| 国产,欧美,日韩,性爱| 99热这里只有精品2024| 欧美性丁香色色五月天干干| 99re思思久久| 夜色五月天| 九月色婷婷综合亚洲| 婷婷丁香婷婷97| 91欧美日韩| 99免费在线视频| 亚洲综合草草| 婷婷综合五月色播| 色哟哟精品| 激情丁香五月天| 超碰狠狠操| 97热91| 久久密臀婷婷| 女性自慰系列第五页| 成人必爱视| 亚洲五月天综合| 青青草原99热| 五月丁香影视| 丁香五月综合首页| 色婷婷丁香五月天在线视频| 亚洲婷婷欧美婷婷| 天天干人人奸97| 久久丁香婷婷五月| 五月天五月色| www.天天日| 亚洲国产精品SUV| 影音先锋男人AV资源站| 六月丁香啪| 亚洲精品国产精品乱码不99| 中文av网| 五月婷婷丁香啪啪| 97婷婷五月| 天堂久久精品| 成人网站高清无码| 亭亭五月天黑人2014| 蜜臀99精品| 亚洲另类在线观看| 精品激情| 日本激情91| 国产成人精品一区二三区熟女在线 | 九九99久久| 99精品视频在线观看| 午夜日韩久久久网站| av九九| av网站中文| 色域五月婷婷丁香| 五月综合丁| 婷婷五月天影视| 久久久久激情| 婷婷欧美激情综合| 天天插天天爱| 4438全国最大视频成人网站在线观看| 色插综合网| 五月丁香色综合| 成人片黄网站色大片免费毛片| 国产小网站| 99热这里只有精品69| 久久xxxx| 99久久婷婷| 99热这里全是精品| 91亚洲视频| 色婷婷婷婷成人网| 无码免费人妻A片AAA毛片西瓜 | 五月五婷婷| 婷婷爱五月| 美女网黄| 99婷婷| 久热AⅤ| 日逼免费视频| www,婷婷,com| 激情小说 五月天| 影音先锋女人AA鲁色资源| 91人人网| 激情婷婷| 婷婷五月天777| 丁香花色色网| 亚洲激情亚洲激情 | 五月婷婷激情综合| 丁香婷婷偷拍| 色五月婷婷777| 99免费成人网| 国产av一区二区三区| 日日天天天| 婷婷亚洲综合| 激情五月激情综合网一级丸片| 99精色| 成人 在线 日韩| 亚洲六月婷婷| 激情视频网址| 26uuu国产| 久久五月天婷婷视频| 久九色| 亚洲人妻av| 超碰av在线| 色婷婷亚洲婷婷| 久久婷婷五月综合| www,欧美干干干干干干| 日本在线观看99| 久色五月| 久久婷网| 91婷婷| 思思99精品视频在线观看| 五月丁香| 欧美日韩国产成人在线| 狠狠干五月天| 开心六月丁香五月婷婷| 亚洲精级| 九九热只有精品| 色很很96| a免费在线| 99∨VTV| 久久伦乱| 99热这里只有精品9| 青青操avbb| 超碰97在线操| 久久人操| 婷婷五月天六月| 久久九九囯产| 亚洲激情在线| 99爱视频| 思思久久思思| 五月丁香免费看| 超碰三级秋霞| 另类图片五月天激情| 婷婷五月在线视频| 思思热精品免费视频| 婷婷久久在线| 成人无码精品1区2区3区免费看| 骚货艹网站视频| 久久9999| 久综合4| 五月色色激情网| 婷婷综合色图| 丁香婷婷老司机久操| WWW.99热| 色播五月婷婷| 五月天婷婷色小说| 99er日韩| 色婷婷五月综合在线| 婷婷亚洲综合| 久久网日本| 久久久99精品| 色99亚洲| 九九色图| 色吧五月婷婷| www.99情趣网| 欧美性色五月天| 97久人人| 色婷婷无吗| 欧美激情综合| 成人网址在线观看| 久久久久久久久人妻| 五月丁香激情综合| 激情视频综合| 国产三级在线播放| 婷婷99狠狠躁天天久久久九九九| 婷婷五月激情丁香| 在线色色| 激情五月天啪啪| 六月香五月婷| 婷婷五月天深爱| 丁香五月色情| 九九五月天| 99热久久日本| 2022人人操人人看| 91日本在线观看| 91青娱乐青青草| 激情五月天天| 一本色道久久综合狠狠躁一二三| 五月激情天| 九九热婷婷| 26uuu欧美亚洲日韩| 人妻人人操| 激情国产综合| 99精品超在线播放| 开心五月婷婷婷美女| 婷婷五月天大香蕉在线视频观看| 狠狠色综合久久久久| 国产偷人爽久久久久久老妇APP| 99热最新精品| 99视频内射三四| 99玖玖免费视频| 天天草比天天爽| 在热视频精品| www.激情五月| 婷婷综合色图| 成人在线99| 亚洲中文字幕av| 伊人激情综合网| 人人摸人人干| 人人爱国产| 亚洲最大在线| 91操人视频| 99热综合网| 色色日本| 99在线视频观看| 久久综合婷婷激情| 亚洲有码在线视频| 亚洲激情视频在线观看| 成人羞羞啪啪 全 视频| 天天情色五月天| 日日肏天天操| 免费观看的av| 丁香五月天婷婷激情| 色婷婷久久| 26uuu亚洲| 丁香五月六月综合激情| 婷婷色色综合| 色婷婷色| 五月天激情播播网| 五月丁香婷爱在线| 久久久网站| 综合久久婷婷| 丁香五月婷婷影院| 丁香五月六月久久综合| 天天日日综合| 五月丁香啪啪综合| 丁香婷婷激情网站| 大香蕉久久久久| 色情·com| 伊人久久婷婷五月天激情四射| 天天舔天天摸天天透| 野战毛片三一3| 中文AV在线播放| 99热这里只有精品99| 亚洲网综合在线| 九九超日本| 亚洲精品成人| 色狠久| 色玖玖爱| 在线播放 精品| 国产色视频网站2| 国产在线黄色| www,av好吊操| 99只有精品| 北条麻妃伊人| 大香蕉久久伊人婷婷五月丁香| 婷婷五月免费在线| 婷婷五月天堂| 五月香蕉网| 天天色天天搡| 亚洲无码99| 天天爱天天操| 丁香久月婷| 玖玖在线资源视频| 超碰成人在线观看| 午夜福利8055| 色丁香久综合在线久综合在线观看| 荷兰av一级| 日韩中文字幕| 日木狠狠干| 。久久久久久久久久久久久久人妻| 色色色国产| 亚洲操女| 就爱啪啪婷婷| 久久九色| 日本综合色图| 婷婷五月天影院| 国内久久婷婷| 色色色色色色97| 丁香婷婷网| 欧美日韩中国| 丁香婷婷激情网站| 丁香五月综合网| 桃色五月婷婷| 操人91| 天天操天天插天天射| 成年AAAA色情| 丁香婷婷久久 | 九九www| 婷婷五月天色综合翘| 成人 视频免费观看网站| 五月丁香综合色婷婷| 天天天久久久| 五月天婷婷基地| 性爱网五月天| 九九色影视| 免费超碰在线| 久久这里有精品| 久久久久久久久久久-久五月天婷婷| 婷婷色五月丁香六月欧美啪| 色色色国产| 另类国产区| 第四色婷婷丁香五月| 99色热| 九九热这里只有精品首页| 人妻激情在线| 国产熟女一区二区三区五月婷| 五月婷婷激情五月| 日韩AV片| 99综合| 狠狠色丁香五月婷巨| 久久婷婷综| 久久9精品视频| 丁香五月婷婷网| 五月婷中文娱乐综合| 日日操天天| 丁香五月激情综合久久| 可以免费观看的av| 久久久激情视频| 狠狠99| 啪啪六月婷婷| 九九热视频精品| 异能之下短剧免费观看全集| 国产亚洲精品AAAAAAA片| 激情色中文| 丁香六月综合激情| 99re思思热这里| 熟惀91九色在线| 激情色情五月天| 99热人人艹| 99操逼| 激情綜合網址| www五月| 亚洲天堂亚洲色色色| 国产又粗又大又爽又黄| 婷婷精品综合| 色五月婷婷av| 亚洲视频一区| 日亚二欧美| 激情六月丁香| 日韩在线看AV| 久草大| 婷婷天堂综合| 婷婷五月丁香色色| 欧美99热| 亚洲小视频| aaa9区免费在线观看| 色婷丁香| 丁香五月六月激情久久| 欧洲亚洲免费视频9| 91超级碰碰碰| 狠狠色综合网| 爱草视频在线观看| 日本一级特黄大片AAAAA级| 99性色| 久久深爱激情网| 五夜丁香| av一级棒av| 99精品视频网| 天天综合色综合| 中文在线成人| 2018夜夜草| 99熟女啪啪视频| 2020久久婷婷五月| 丁香五月婷婷激情四射| 伊人爱爱日本| 五月婷在线| 激情综合网五月天| 伊人六月无码视频| 99自拍视频在线观看| WWW.亚洲无码| 丁香五月影院| 色欲丁香| 天天干,天天日| 777久久综合视频| 9久久网| 国产毛多水多女人A片| 高清无码入口| 天天天天天天噜| 99re这里只有精品99| 天天久久九九| 婷婷综合性爱网| 99色在线观看| 伊人网碰碰| 五月天黄色激情小说| 五月丁香综合啪啪| 久久久jd| 97精品自拍视频| 超碰婷婷色| 色色色热| 亚洲va成人va成人va在线观看| 丁香五月成人av| 99精品7| 99色精品视频| 婷婷视频网| 色九九综合热99| 大香蕉久久伊人网| 激情综合五月丁香六月婷婷| 99人妻碰碰久久久禁片| 四LLL少妇BBBB槡BBBB| 中文字幕AV在线| 人人干人人看| 色久丁香五| 久久这里只有精品1| 伊人成人宗合网| 国产1区2区3区在线观| 夜色综合网| 九月婷婷在线观看| 色婷婷文字幕| 影音先锋 一区| 四季日韩AV无码综合| 无码一区精品一区视频| 激情综合网激情五月婷婷| 人妻丰满精品一区二区A片| 久久久精品人妻| 五月天另类小说| 五月丁香婷婷色色| 夜夜躁爽日日| 被男人添B超爽视频| 五月天激情网图片| 嫩草AV久久伊人妇女超级A| 天天干电影| 久色激情| 亚洲成人影视在线| 亚洲成人av在线观看| 5Www色5夜| 性爱五月婷| 丁香五月综合激情久久潮喷| 99视频在线观看视频| 黄色AAAAAAA| 婷婷色六月| 婷婷五月丁香色综合| 成人在线综合| 激情综合网丁香| 狠色狠色狠狠色综合网| 99er视频在线| 激情五月天啪啪| www九九| 五月天色社区| 色婷婷8| av超碰在线| www.sebowuyue| 丁香五婷婷| 亚洲综合成人网| 色色色精品无码区| 亚洲色在线观看| 久久九九@| 综合色播| 日本少妇AA一级特黄大片| 91久久久久久久久久| 91偷拍视频| 婷婷五月天在线综合导航| 丁香六月天婷婷开心综合| 丁香五月成人社区| 成人片在线播放| 四虎99热在线观看网站| 成人网站免费在线播放| 手机AVAV天堂看网| 91丨九色丨熟女丰满| 婷婷五月天激情网| 5五月综合网亚洲| 色婷婷亚洲婷婷| 99爱免费视频在线观看| 成人五月丁香社区| 黄急一级视频| 九九综合久久| 五月天婷婷激情小说电影| 另类天堂| 热99一二三| 天天操夜夜啊| 午夜婷婷久久| 五月美女婷婷风骚| 人妻操逼视频。| 色五狠狠| 中字幕视频在线永久在线观看免费| 激情五月天色色色| 天天色五月| 色婷婷综合亚洲| 黄色视频网站在线播放| 婷婷色婷婷亚洲成人| 欧美日韩AAAA| 九九综合影音先锋| 麻豆科斗777| 五月丁香五月婷婷| 亚洲精级| 内射丰满人妻| 超碰99热| 婷婷色播婷婷| www.色婷婷.com| 99精品久久久久久| 色五月丁香婷婷综合| 婷婷综合五月| 五月丁香自拍| 丁香五月婷婷五月| 九九九九中文字幕| 丁香欧美| 青草视频在线播放| 99在线爽| 97精品综合久久| 日韩操逼大片| 99九无网码| 九月婷婷在线观看| 99免费热视频| WWW.五月com| 色亭亭五月天网扯| 成人无码精品1区2区3区免费看| 情色五月天网站| 婷香五月激情视频| 婷综合六月| 色操b| 国产偷人爽久久久久久老妇APP| 色狠狠五月天| 五月丁香六月色| 五月丁香久久综合| 99热在线播放| 天天做天天爱天天日| 九九九九这里只有精品| 久热久色| 天天干一干| 婷婷丁香五月天综合网| 九九9久九9国产视频| 99热这里只有精品98| 狠狠狠狠狠| 久久五月天合网| 天天日夜夜| 五月丁香婷婷在线综合蜜桃| 99ER热精品视频| 丁香六月婷婷综合激情欧美 | 国产综合久久久777777| 99热这里只有精品8| 成人短视频免费观看| 五月婷婷五月丁香| 亚洲av免费在线| 在线播放成人网站| 丁香 婷婷五月| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 人妻肉射免费观看| yw.av| 另类图片五月天| 婷婷丁香五月天影院 | 97色在线| 天天日天天干天天插天天射| 婷婷五月丁香色播| 婷婷激情五月综合| 色婷婷六月精品| 97超碰99热99| 五月激情视频| Jh7Uf088VHafNm| 亭亭丁香97| 99色热视频| 久久只有精| 91男人操女人视频| 色色色综合网| 五月丁香婷婷在线综合蜜桃| 婷婷五月天A V| 婷婷五月激情视频在线| 91狠狠综合久久久久久| 大香蕉色婷婷伊人在线| 五月婷婷|欧美| 亚洲人人96@| 黄色高清无码| 亚洲激情网| 五月天久久成人| 婷婷色操| 欧类av怡春院| 久久久久久久久99精品| 九九爱看亚洲| 激情综合五| 九九婷婷五月天| 99热精品观看| 五月丁香另类网| WWW,五月| 久久婷婷老| 丁香五月影视| 99er久久| 日韩好吊操| 午夜日韩久久久网站| 成片免费观看视频大全| 亚洲无码yw| 丁香亚洲婷婷五月| 亚洲另类电影| 亚州综合色| 国产做爰视频免费播放| 操碰99| 婷婷五月天成人网站| 亚洲天堂久久| 91人人操人人看| 亚洲深喉AV| www.久久| 综合婷婷五月天| 婷婷五月开心中文字幕在线| 这里只有精品日韩| 91精品婷婷国产综合 | 丁香五月亚洲综合| 天天日天天舔天天摸| 9婷婷内射| 精品久9| 色婷婷亚洲婷婷| 久久久久久久97| 激情五月天在线视频| www天天干| 九九精品热| 天堂在线9| 自拍视频99| 欧美特大片黄| 中文字幕乱码亚洲精品一区| 97人人超| 丁香婷婷激情| 婷婷五月天社区| 成片免费播放| 色碰碰视频| 99.N在线视频| 五月婷婷五月色| 噜噜网免费视频| 久久九九大香蕉电院| 久色成人| 激情网第四色| 色婷婷色五月丁香| 激情亚洲五月| 五月婷深深爱激情网| 欧美色骚婷婷五月天| 狠狠舔| 久久婷五月| 狠狠操综合| 伊九九三级区| 九月激情网| 九九精品丁香花| 久久久天堂国产精品女人| 依人大香蕉| 色婷婷五月色| 久久九九99| 激情色色色| 色婷婷免费观看| 91久久久久久久久| www婷婷| 激情五月婷婷| 极品少妇XXXX精品少妇偷拍| 天天揷综合网| 国产人人操| 婷婷 伊人 久久| 婷婷激情九月| 亚洲婷婷丁香五月在线| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 丁香六月婷婷综合在线| 色五月激情| 激情综合网五月| 日韩视频99| 婷婷91| 久久久国产精品黄毛片| 情色五月天 网站| 久久丁香九| 久婷久婷| 丁香婷婷激情五月| 丁香婷婷在线| 99ri视频在线播放| 超碰免费在线| 97超碰9久热婷婷热| 99碰| 很很操很很操| 天天色色天天| 丁香婷婷久久| 国产99久| 九九色99| 久久久区区一久久久久久| 综合色色色| 亚洲成人在线播放| 色99久草在线| 99久久99九九九99九他书对| 五月四色婷婷| 色综合久久中文| 久草热久草在线视频| 亚洲成人精品三区| 狠狠舔| 免费观看欧美成人AA片爱我多深| 9l视频自拍9l九色成人| 欧美色男人网站| 久久婷婷五月综合成人d啪| 青草性爱视频| 香蕉操亚洲| www.9操| 九九热中文| 好叼操在线观看| 五月婷婷大香蕉| 五月好婷婷| 99热这里全都是精品| 狠狠爱婷婷五月天| 久婷婷五月激情| 亚洲色五月婷婷| 亚洲精品一区中文字幕乱码| 91成人电影| 九九机热| 免费无码毛片一区二区A片| 五月丁香九九| 亚洲五月情| 色色丁香| 97久久久久| AV操操操| 一本色道久久综合狠狠躁一二三| 人妻久久久久久久久妻久久久久久久久 | 天堂婷婷丁香六月网| 超碰在线观看99| 免费超碰在线| 亚洲精品久久久久久久久久吃药| 国产无套精品一区二区| 极品另类| 深爱激情五月婷婷| 亚洲三级无码| 五月婷婷六月丁香综合视频在线| 婷婷涩五月| 好色婷婷| 日韩三级高清无码| 五月丁香色停停啪啪啪| 就爱操www com| 色婷婷丁香五月| 99碰碰| 日本系列_4页_777FP| 91丁香婷婷综合久久欧美| 久久99色色| 亚州美女| 色综合天天网| 九九成人| 日 日干 日日做| 狠狠干狠狠干| 蜜臀av无码久久久久久久久| 色噜噜狠狠色综无码久久合欧美| 色综合久| 99热9| 91精品久久久久久77777| 久久亚洲天堂| 五月天激情视频| 国产色视频网站2| 婷婷性色| 六月婷色| 色色五月丁香婷婷| 97久久视频| 日本一级一级一级一级| 九九av| 六月婷婷色综合| 色激情综合狠狠婷婷| 亚洲超碰在线| 襙逼网| 中文字幕人妻一区二区| 九九视频这里只有精品| 久久久久久久久久久44| www.色色五月天.com| 日本一道久久| 这里只有精品久久| 天天成人五月天| 丁香六月婷婷操逼网| 色婷婷久久综合丁香五月| 激情五月婷婷色色| 久久综合婷婷五月| 99综合| 粉嫩AV久久一区二区三区| 亚洲AV无码久久精品色欲| 五月天久久婷| 国产欧美va| 丁香五月天黄色片| 色婷婷久久| 丁香五月色五月婷婷宗合| 9 1 A v久久久| www.91操| 五月丁香六月激情狠狠| 色黄啪啪| 操操啪| 天天cha成人综合网| www.婷婷五月.com| 在线观看中文字幕亚洲| 日本女va| 久热伊人在91| 丁香五月在线| 五月婷婷视频ab| 婷婷色五月开心五月| 五月丁香啪啪网| 五月丁香基地| 九九热黄色| 青柠影视免费高清电视剧| 亚洲色优| 全网最新网黄大秀直播高清,主播国产录屏在线| 熟女人妻视频| 极品另类| 五月婷深深爱激情网| 啪啪黄页网| 最近免费中文字幕大全高清大全1| 狠狠干综合网| 五月婷婷开心亚洲无| 狠狠色中色| 国产色色视频| 久久丁香五月| 日日干夜夜撸夜夜骑| 日本九九网| 亚洲成av人影院| 五月婷婷成人| 狠狠久综合| 色婷婷欧美| 97偷拍对白视频| 五月丁香六月激情| 超碰国产AV| 天天 青草 丝袜制服 在线| 婷婷五月天黄色| 亚洲成人av在线观看| 婷婷久久综合| 人妻精品在线| 五月丁香六月婷婷操操操| av 一区三区四区| 久9视频免费播放| .青娱乐天天操B| 色色色色色色色色综合网| 色五月天综合网| 操日本人妻视频| AV色五月婷婷| 一月婷婷色色| 青青草Avb在线| av免费在线看不卡无毒| 桃色五月天| 五月丁香好婷婷A片网| 五月六月婷婷| 亭亭五月激情亚洲在线| 亚洲综合激| 天天肏夜夜肏| 欧美激情综合色综合啪啪五月| 亚洲传媒在线观看| 熟女人妻视频| 婷婷亚洲天堂| 婷婷五月激情小说| 99操碰| 97热精品| 婷婷五月色激情欧美激情| 五月丁香激情婷婷综合| 天天综合天天玩夜夜玩天天玩夜夜玩| 五月婷婷在线短视频| 91精品无码| 六月丁香色色| 91青娱乐青青草| 日韩色色一区| 色婷婷情片| 99热九九在线| 1囯产午夜仑鲁鲁| 二区成人视频| 五月婷视频在线观看| av婷婷丁香| 色插人人| 色约约视频一区二区三区四区五区 | 日本五月天婷婷丁香| 亚洲五月色| 久久丁香五月婷| 开心五月深爱五月丁香五月激情五月 | 天天色综合网1| 九九综合久久| 日韩无码色色| 综合成人小说婷婷| 婷婷久久免费| 99色干| 激情婷婷六月天| 97碰在线视频| 福利视频在线播放| 激情AV网| 一级韩国产精品毛| www.色九月| 丁香婷婷性爱| 美女五月激情| 丁香五月激情澎湃一区| 亚洲色婷婷视频| 激情五月天影院| 91超级碰在线视频| 成人丁香五月天| 五月天婷婷激情| 丁香六月婷婷色XXXX| 影院久久久| 国产老熟妇亲子乱对白| 99热老网站| 五月婷婷狠天天色综合| 青青草视频福利| 五月丁香婷婷综合视频| 六月婷婷激情图片| 欧美成人精品三区综合A片| 丁香五月婷婷啪啪视频| 4399伦理午夜| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 97色在线| 极品精品一区二区三区在线| 亚洲成人中文字幕| 超碰在线观看99| 五月天激情在线视频| www.丁香五月| 99热最新| 五月天婷婷狂暴白浆| 五月天伊人久久久久| 丁香六月婷婷激情综合| 可以免费看的av网站| 婷婷五月天网址| 五月综合色| 密视AV综合在线| 色丁香五月天射婷婷爱婷婷| 艾小青av| 99久在线精品| 亚洲精品无人区| 色五月婷婷激情基地| 五月丁香婷婷无码中文| 五月天激情AV| 色噜噜狠狠一区二区三区| 婷婷五月丁香基| 天天射美女| 五月精品免费XXX| 亚洲永久免费| 丁香五月激情五月色综合| 久久99婷婷| 国产精品激情五月天色婷婷| www.婷婷五月| 亚洲AV日韩在线观看| www.婷婷| www.婷婷五月| 荡乳尤物3HP1V5| 99亚洲视频| 这里只有免费的精品| 粉嫩av懂色av蜜臀av熟妇| 婷婷色色欧美综合网| 婷婷色导航| 丁香五月六月综合激情| 色狠狠色噜噜AV天堂五区| 99大香蕉| 五月丁香在线看| 成人片黄网站色大片免费毛片| 踪合专区啪啪| 99爱免费视频| 九九这里只有精品| 丁香九九九九| 激情99在线视频| 午夜天堂一区人妻| 婷婷五月天色| 五月婷婷,狠狠操| 婷婷色综合网日韩国产| 91精品熟女| 婷婷97| 五月天停停日日| 色色色国产| 国产无遮挡又黄又爽免费网站| 91 九色 熟女| 超碰色综合| 在线伦子99热| 丁香涩涩爱| 偷拍九九热| 秋霞网在线观看理论91| 色99在线| 久热婷婷| 亚洲成人影视在线观看| 我去色色网五雨天| 五月天伊人网| 超碰丁香五月| 九九爱激情| 欧美黄色一级录像| 第六色在线| 伊人激情AV一区二区三区| 噜噜噜噜婷婷五月天| 成人精品在线| 国产精品久久久久久白浆色欲| 综合久久高清| 婷婷丁香五月91| 人人草人人爱| 丁香五月777| 天天爽天天| 91丁香| 丁香五月天激情综合| 久久九九囯产| 五月久视频| 香蕉伊人综合| 极品另类| 99ri国产在线| 激情五月丁香五月| 美日韩成人| 日日撸夜夜操| 99热日韩这里只有精品| 99热这里有精品| 五月综亚洲| 精品人妻在线免费观看| 综合五月激情网| 九九九九无码| 2017人人操| 色婷婷丁香| 色婷婷狠狠| 99在线观看视频精品| 日欧一片内射VA在线影院| 丁香五月天激情小说| 播丁香五月婷婷欧美| 色99欧洲色19| 日韩美女羞羞网站在线观看| 五月丁香久| 婷婷五月丁香综合亚洲 | 丁香六月婷婷综合啪啪| 99小视频在线观看| 天天噜日日噜综合无码| 思思视频久久| 成人国产欧美大片一区| 99日这里只有精品| 性爱五月丁香| 六月激情网| 小视频一区| 色五月婷婷激情基地| 影音先锋一区| 九月婷婷综合八月丁香在线观看| 激情婷婷丁香五月| 久久婷婷视频| 久久66er久久| 久9热视频在线| 久碰婷婷视频| 六月丁香成人| 偷偷操九九| 中文字幕在线观看视频www| 亚洲五月婷婷在线| 久久综合五月婷婷| 五月激情六月丁香| 亚洲久热无码| 欧美精品999| 亚洲中字AV电影在线网站| 激情五月婷婷在线观看| 色久播播| 婷婷久久色| 婷婷五月色播放| 无月播播激情在线观看视频| 97婷婷狠狠| 日韩在线观看网址| 久99视频在线观看| 五月婷婷中文网| 玖玖五月| 国产av一区二区三区| 激情99| 91啪级电影| 久久性刺激| 操碰色一区就去操| 婷婷六月色开| 色五月婷婷五月丁香五月| 婷婷99中文字幕| 思思久久久婷婷| 操碰91| 99热无码首页| 99色啊| 色欲五月婷婷| 色色综合网www| 欧美性丁香色色五月天干干| 五月激情小说网| 婷婷六月爽| 激情婷婷在线中文字幕| 色五月婷婷在线观看第一页舔| 黄色AV日韩| 五月婷婷六月丁香色| 91精品熟女| AV在线大香蕉| 五月情涩综合婷婷| 天天日天天久久青青| 91碰碰碰| 五月丁香网站| 色婷婷丁香五月天| 天干干夜夜操| 久久草人妻| 最新av在线观看| 变态另类色图 | 91久久九色| 伊人大综合| 久久综合五月天| 91丨九色丨东北熟女| 九九亚洲| 深爱激清网| 婷婷五月开心中文字幕在线| 亚洲一个色| 丁香大香蕉| WWW,五月| 97五月婷婷| ady狠狠入| 一区二区你懂的| 亚洲日韩操B| 最近中文字幕大全免费版在线 | 日日干四虎| 夜夜穞天天穞狠狠穞AV美女按摩| 超碰99在线| 超碰91在线| 高清不卡一区| aa久久| 久久婷婷内射| 色色色地址| 超碰99热精品| 在线观看亚洲AV| 99.N在线视频| 激情久久久久久久久| 色五月涩涩婷婷| 久青草影院| 思思热在线视频精品| 婷婷五月天六月丁香| 激情五月婷婷开心网| 天天影院色| 午夜婷婷久久| 99热老司机| AV人人操| 婷婷五月天小说| 国产做爰视频免费播放| se色婷婷视频| 国产首页在线| 六月激情网| 日本久久爽| 色色五月婷婷| renrencaoni| 思思久久96热在精品国产,| 婷婷婷五月天最新综合你懂的| 五月久久亚洲| 婷婷 月 丁香| 婷婷五月天社区| 超碰激情网| 久久久com| 亚洲成人在线在线| 色色草97| 99日精品视频| 久热无码| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 综合色在线| 蜜桃婷婷狠狠久久综合| 成人av在线网址| 丁香色六月| 亚州视频九九99| 色色网五月激情| 五月天婷婷爱| AV电影在线播放| 亚洲狠狠爱婷婷| 亚洲免费视频网站| 日韩啪啪视频| 极品人妻videosss人妻| 激情5月婷婷| 丁香综合网| 怡红院AV亚洲一区二区三区H| 十二区无码| 激情婷婷在线中文字幕| 日韩人妻无码一区二区| 天天操夜夜爱| 91碰| 日比网免费国产| 久久激情五月网| 安息电影在线观看完整版| 欧美色五月天| 91操人视频| 色婷婷呢狠禁久禁| 日韩黄色网络| 婷婷六月丁香激情综合| www.99视频| 涩五月婷婷| 肏日网在线看| 激情五月天婷婷激情| 79色色色色| 中文av网| 日韩小视频在线99| 日本三级中国三级99人妇网站| 久久66精品| 婷婷亚洲天堂| 婷婷九九色| jiqingtaose五月天| 激情小说五月欧美亚洲丁香| 色综合激情| 丁香9月婷婷| 天天看片日日夜夜| 涩五月婷婷| 91人人人人人| 色婷婷丁香| 99热在线只有精品| 噼里啪啦在线观看免费完整版视频 | 思思99热在线| 久草视频一,二三四| 国内精品99| 亚洲美女婷婷五月天| 五月婷婷六月色| 婷婷五月天天| 婷婷丁香视频在线观看免费| AVDV久久| 伊人久久丁香狠狠婷婷综合香蕉| 久久婷婷精品| 开心激情综合| 成人精品视频99在线观看免费| aa久久| 激情五月天社区| www.丁香黄色五月天人与| 天天做天天爱天天爽夜夜揉| 五月婷婷婷丁香播| 国产毛片操B| 精品国产va久| 激情综合婷婷| 色综合香蕉| 99综合免费视频| 无码人妻AV久久久一区二区三区| 粉嫩av蜜桃av蜜臀av| 色噜噜狠噜噜视频| 91 久热| 小视频一区| 乱岳熟女50岁| 开心 五月 综合| 久久婷婷热| 五月丁香在线观看99| 十月色综合| 琪琪狠狠干| 亚洲麻豆乱码国产2028| 国自产拍偷拍精品啪啪一区二区| 99久久九九| 99操碰| 丁香五月综合婷婷| 午夜九九九九九九九九九九九九九| 丁香五月很很肏| 夜丁香五月婷婷| 9热在线| 色爱终和网| www,99视频| 99视频精品8| 欧美激情综合五月色丁香| 99久久黄色顶级视频| 久久这里只有精品热在99| 超碰chaompinm| 99re久久| 97在线视频观看| 天天干天天色综合| 激情小说五月天社区丁香| 另类视频一区| 五月丁香久久精品在线观看| 91人妻PORNY九色大屁股| 婷婷综合视频| 啪啪操超碰| 午夜成人网站在线观看| 五月天久久网站| 五月天丁香综合久久国产| 五月天天综合| 色五月首页| 深爱丁香网|