99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
久久99热这里| 日本久久婷婷| 丁香六月婷婷综合激情欧美| 青青久久91| 91超级碰在线视频| 激情色情五月天| 久热69| 人人干人人看| 久久激情五月婷婷| 成人在线观看精品| 五月婷久久| 国产熟女日日骚五月丁香爱| 色五月xxx| httpwww色com日本| 91男同视频| 噜噜狠狠色综合久| 亚洲精品婷婷| 日本激情综合| 丁香五月婷婷在线视频| 26uuu国产精品| 成人一级片| 思思re最新视频| 男女99免费视频| 五月婷色激情五月| 色五月女| 人妖色AV色综合| 可以直接看的AV| 婷婷激情五月综合| 久久婷婷五月免费视频| 九一99| 99这里的视频都是精品| www.天天干.com| 婷婷九月亚洲| www激情| 人人操人人爽成人AV| 人操综合| 亚洲欧美成人在线观看| 狠狠色中色| 欧美英丁香开心快乐六月天网| 色噜噜五月天| 欧美三级黄色片久久| 午夜激情久久| 一区视频网站| 日韩色色小视频| 影音先锋91| 亚洲天堂AV综合网| 日韩99视频| 亚洲爱婷婷| 视频一区二区在线| 大香蕉人在线65| www.色色com| 欧美日韩国产成人在线| 久婷首页| 91欧美日韩综合| 久久99看免费| 亚洲色9| 激情五月天在线观看婷婷| 色99色| 婷婷激情五月天小说| 人人摸人人澡人人| 任你日视频| 免费观看的av| 九九無妻| 色无婷婷| 伊人久久大香线蕉av一区| 婷婷久久在线| www.yw尤物| 婷婷丁香五月天婷婷| 婷婷五月香蕉| 深爱网深爱综合网| 婷婷久久综合久色| 五月天婷婷av| 久久无码成人| 久久婷婷内射| 五月色婷婷影视在线电影| 天天 日综合| 狠色色狠网| 欧美美美女性色视频| 5月丁香啪啪啪| 丁婷婷五月天在线播放| 天天爽人人爽| 久久婷婷丁香| 中文字幕按摩做爰| A级毛片高清免费不卡播放谢谢谢谢| 三级毛片7979| 99.色| 六月婷婷综合| 丁香花社区av| 激情五月天婷婷图| 色色色色网| 丁香五月婷婷啪啪啪| 深爱激情丁香| 五月婷婷黄| 99久久99久久综合| 天天精品视频免费观看| 亚洲情综合五月天| 日本99视频| 六月伊人婷婷| 亚洲综合在线视频| 97婷婷五月激情六月丁香伊人| 丁香五月激情网| 色欲一区二区三区精品A片 | 激情五月天激情五月天| 九九99久久精品| 操婷婷基地| 四色永久成人网站| 五月天婷婷丁香| 极品人妻VideOssS人妻| 中文字幕五月久久婷| 久久婷婷成人视频| 超碰人人操在线| 五月婷婷色| 97超级碰碰碰| 草做免费在线观看| 欧美成人猛片AAAAAAA| 91丨九色丨老农村| 激情丁香五月天| 天天操夜夜操| 伊人午夜综合色啪| 无码少妇高潮喷水A片免费| 噜噜五月天综合| 97天堂| 99精品在这里| 影音先锋五月天婷婷丁香在线观看| 91视频一起草| 五月丁香婷草| 99视频在线观看网址| 色 五月婷婷基地| 99热自拍| 婷婷丁香五月天哟啪| 色五月六月| 97碰碰碰免费公开在线视频| 精品国产va久久久久| WWW,五月| 色综合久久综合中文综合网| 色婷婷五月在线| 五月婷婷av在线| 激情网站五月| 天天色,天天操,天天射| 亚洲亚洲人成综合网络| 中文无码精品一区二区三区| 麻豆AV一区二区三区| 国产欧美日韩性爱| 激情丁香五月婷婷| 天天拍夜夜爽日日| 亚洲综合五月天婷婷| 操笔无码| 九色99视频| 俺五月| 亚洲乱码日产精品BD| 日本综合色色| 一起草av| 久久人妻高清中文| 男人的天堂97| 色综合婷婷| 日韩久久色| 天天插天天射| 99ri精品| 国产真人做爰视频免费| www,五月天激情| 伊人丁香在线| 色婷婷五月天激情在线观看| 大香蕉九操| 一区二区免费看| 97五月久久丁香婷婷| 香焦网五月天| 五月天激情综合网站| 99久久婷婷| 九九热黄色| 一起草性爱不卡视频| 欧美性爱五月天| 丁香五月色| A一级操| 三人荫蒂添的好舒服A片| 操人妻90p| 99噜噜噜在线播放| 色欲九区| 91超碰人人操| 丁香婷婷激情网站| AV在线免费网站| 丁香色婷婷| 丁香五月天天| 九月丁香欧美综合| 五月天伊人| 99re思思精品在线观看| 综合色情网| 五月天激情国产综合婷婷婷| 婷婷五月天在线观看第二页| 天天艹天天综合网| 97丁香视频| 五月天狠狠色| 精品综合五月| 九九久久五月天| 中文字幕无码人妻少妇免费视频| 丁香婷婷性久久| 婷婷亚洲综合| 亚洲婷婷91丁香| 婷婷丁香六月五月天| 韩国中文字幕91| 99精品网| 五月婷在线视频免费播放| 色婷婷最新域名| 五月婷婷六月丁香综合在线| 99爱在线免费视频| 色丁香在线视频| 丁香六月成人网| 久久婷婷视频| 国产无人区大片| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 久久丁香| 五月婷婷六月激情| 久久久久久丁香五月| 超碰9| 91男同视频| 日本啪啪天堂| 激情爱爱网站| 色婷婷亚洲婷婷在线观看| 天天爱天天做天天日| 日韩国产AV播放| 青草性爱视频| 色丁香五月天| 日本专区久久| 日本在线观看91| 五月天成人在线视频网站| www.五月天社区| 99这里有精品视频3| 日韩AV在线免费| 99亚洲视频| 日日噜狠狠色综合久| 梁铮版《蜘蛛女侠》在线| 懂色av蜜臀av粉嫩av永陈冠希 | 九九久久99精品免费观看www| 成人综合网站| 婷婷综合视频| 六月激情网| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 91丨九色丨熟女丰满| 亚洲精品白浆高清久久久久久| 欧洲一区二区| 九九99九九99九九99视频网| 丁香五月手机在线| 大香蕉99| 亚洲成人免费在线| 久久ab| 99色在线观看视频| 色综合大香蕉| 色色色婷婷五月天| 狠狠综合| 激情四射五月天| 久久久久9999| 激情五月天影院| 97视频91| 色综合伊人网| 国产乱人偷精品人妻A片| 五月色网| 九九在线免费观看| 99思思热只有在这里看| 激情综合色播| 五月丁香激情综合| 天天肏视频| 欧美三级欧美一级| 99爱视频免费| 欧美成人一区二区三区在线视频 | 亚洲欧洲国产精品| 日本三级中国三级99人妇网站| 99九九综合久久九九| 天天做天天爱| 婷婷色综合| 久热久| 99久久国产宗和精品1上映| 五月丁香啪啪| 99久久超级| 亚洲人成网站999综合| 操逼视频网址| 五夜丁香| 婷婷深爱五月亚洲综合| 日日夜夜爽| 五月丁香六月婷婷无码| 色色色婷婷五月天| 99在线精品免费视频| 68热超碰在线| 国产操碰| 日日做夜夜爱| 国产成人综合网| 五月激情在线| 激情性爱婷婷| 亚洲激情综合色站| 思思热视频| 99热偷拍| 丰滿爆乳一区二区三区| 久久女人天堂| 婷婷五月偷拍| 99九九久久| 欧美性生交XXXXX无码小说| 丁香五月之久操视频| 婷婷性爱综合| 精品网站99| 色婷婷六月天在线| 亚洲色五月婷婷| 欧美日韩成卜| 思思热视频在线观看| 思思久久99热只有频精品66| 免费人人操| www.五月天婷婷.com| 五月婷久久在线| 99只有精品| 狠狠五月天| 日韩熟女啪啪视频| 丁香五月天激情五月天激情五月天激情网| 91色情播放| 91精品久久久久久77777| 日本女色人人| 思思视频久久| av久热| 懂色av粉嫩av蜜臀av| 久久天堂婷婷五月| 六月天六月婷| 丁香婷婷啪啪| 影音先锋一区二区三区| 五月丁香六月色| 99ER热精品视频| 五月天AV大香蕉| 玖玖99福利| 婷婷色六月| 99思思热只有在这里看| 亚洲V国产V欧美V久久久久久| www. 五月. com| 五月婷婷 六月丁香| 婷婷五月天天爽| 国内一级片| 在线播放中文字幕| 久久激情天堂| 激情熟女网| 就爱干 在线| 五月婷精品| 久久五月热| 九九激情网| 婷婷综合成人| 99热销国产这里有精品| 婷婷五月天综合久久| 成人中文网| 婷婷色导航| 天天综合网在线| 5月丁香美女影院| 人人亚洲| 能看的av| 五月色欧美| 丁香五月偷拍| 激情婷婷五月天网址| 久久伊人婷婷| 亚洲成人在线播放| 中文av网站| 可以看的av| 久久伦乱| 色优久久| 亚洲精品五十一区| 久久激情中文| 久久人妻在线| 久re在线| 激情久久久久久久久| 狠狠久久婷| 欧美一级操逼视频| 亚洲超级碰| 色五月在线观看| 久久久久久9热不雅视频| 玖玖福利视频资源| 888久久久| 五月丁香婷婷婷激情爱爱| 大香蕉伊然在亚洲90| 五月天综合影院| 在线亚洲综合| 日本婷婷在线| 九九国产精视频| 五月丁香综合啪啪| 五月天激情无码高清 | 综合精品99| 五月天综合在线观看| 超碰在线个人观看| 欧美在线97| www.99热视频| 精品久久久久成人码免费动漫| 狠狠狠激情网| 五月丁香五月丁香五月丁香五月丁香91| 久色资源| 亚洲综合视频天天精品| 97干在线免费| 99热这里全都是精品| 第二色AⅤ| 五月丁香六月激情网站| 六月婷久久| 激情婷婷五月亚洲| 丁香五月桃花在线激情综合| 色啪影院| 婷婷色狠狠| 九色无码| 久草热8精品视频在线观看| 丁香五月婷婷色播艳门照| 亚洲成人九九九| 亚洲九九视频| 国产密乳av一区二区三区四区| 99热99久久| 亚洲激情综合| 狠狠狠狠狠狠色| 久久性爱视频免费| 97在线/亚洲| 99精品偷自拍| 亚洲愉拍99热成人精品| 色五月综合激情| 91碰碰| 丝雨一区二区| 五月天激情综合网| 激情久久久久久| wwwxxx五月婷婷小说| 97碰碰电影| 五月婷婷激情网| 丁香五月婷中字幕| 丁香五月激情六月综合| www.婷婷五月天,com| 五月丁香亭亭A片| AV人人操| 色久女| 五月婷婷丁香色播网| 人人97碰| 婷婷丁香91| 丁香婷婷综合激情五月色| 欧美性爱五月天| 婷婷五日b| 香蕉婷婷色五月| 91久久久久| 色狠狠综合| 婷婷九月在线| 国产成人亚洲综合A∨婷婷| 激情综合色五月六月婷婷| 欧美日韩国产一区| yiqicaoav| 天天天干夜夜夜操| 99爱爱| 天天天天天日| 欧美性爱5月天天天看| www狠狠| 97干资源在线观看| 日日操夜夜擼| 色色色999| 日韩久热| 色色热| 天天舔天天摸天天透| 天天做天天爱天天爽夜夜揉| 99人人精品| 九九色婷| 激情99| 日本五月婷婷| 亚洲色综久久五月| 久久久久五月丁香| 五月丁香婷色| 欧美日韩精品一区二区三区钱| 激情五月综合网| 色色丁香| 99思思| 成人免费在线电影| 国产亚洲精品久久一区二区三区| 欧美色性色好| 久人操| 天天色,天天日,天天做| 色99网站| 五月丁香激情综合久久| 亚洲va欧美va天堂v国产综合| 亚洲激情综合免费| 久久激情五月天| 五六月丁香激情视频| 狠狠狠婷婷五月综合| 天堂AV三级| 亚洲综合字幕色色| 五月丁香在线视频观看| 婷婷五月丁香五月天| 狠狠色五月激情| 婷婷五月丁香av网站| 婷婷午夜| 26UUU精品一区二区Com| 色狠狠色噜噜噜a天堂一区| 五月天婷婷激情干干| 婷婷五月AA五月在线| 色五月婷婷狠狠撸| 五月综合亚洲| 婷婷丁香五月色| 色色色在线观看| 国产精品岛国片在线观看免费| 婷婷日韩| 日韩综合久久| 久久成人性爱| 婷婷深爱网| www.99热. com这里只有精品| 五月婷综合网| 婷婷内射视频在线| 天天日夜夜爽| 日逼影音先锋AV男人资源站| 五月丁香六月婷婷综合| 性色人人爽| 国产99精品免费视频| 久久婷婷五月草视频在线播放| 我爱婷婷五月天综合88| 亚洲这里只有精品| 五月丁香| 综合精品啪啪| 婷婷丁香人妻天天爽| 99在线免费视频| 99久久久久| 色99在线| 日亚二欧美| 五月丁香影院| 日撸夜撸日操| 五月丁香综合| 久久码久久无清| 91综合国免费久入| 五月婷婷开心丁香| 成人短视频在线| 国产精品18久久久| 99 re视频一区| 六月五月丁香五月欧美| 五月花激情网| 手机AVAV天堂看网| 婷婷色操| 91久久久久久久久久18| 开心五月婷婷五月| 色五月婷婷激情| 日韩操人| 91肏肏肏| 激情婷婷五月亚洲| 五月欧美丁香在线观看| 天天干电影| 丁香五月婷婷影院| 亚洲激情图文小说| 久色五月丁香视频| 亚洲日本三级片| 色婷视频| 五月激情小说| 97操碰日本女人| 99热乎| 人人摸人人搞| 96丁香婷婷九月蜜桃综合久久| 婷婷综合亚洲| 五月婷婷色激情| 国产FREESEXVIDEOS性中国| 日韩淑女人妻luan伦激情精品一区二| 丁香婷婷人妻综合网| 色色婷婷丁香| 99ri视频在线播放| 国产五月天欧美色| 中文字幕在线视频播放| 亚洲亚洲人成综合网络| www,久久久| 99热66| 超碰在线免费观看日韩| 婷婷第六色| 色色五月婷| 六月丁香婷婷综合影院| 丁香五月停停av| 久久AAAA片一区二区| 久久九九爽| 丁香婷婷视频| 人妻丰满精品一区二区A片| 久久99免费视屏| 开心激情站| 九九伦子片| A网在线欧洲| 99精品国产在热久久| 九九Av| 91超级碰碰碰| 色婷婷影院| va亚洲中文在线| 狠狠色噜噜狠狠狠777奇米| 噜噜噜噜噜日本视频| 夜夜爽天天干| 伍月婷婷免费视频| 九九热在线视频| 青草性爱视频| 五月婷婷六月激情| 五月综合777| 欧美怡红院黄站| 六月丁香深深爱| 亚洲成av人影院| wwccc久久久| 国外亚洲成AV人片在线观看| 天天激情视频| 在线超碰精品| 五月丁香影院| 色v综合网| 日本五月婷婷| 婷婷五月丁香高清无码| 丰满少妇猛烈A片免费看观看| 六月色色婷婷| 99在线爽| 99综合久久| 三级av在线| 日日夜夜爽爽| 婷婷色色欧美| 九热视频| 天天免费日日夜夜夜夜| 狠狠干狠狠操狠狠爱| 99热这里都是精品| 91综合在线| 久久精品一区二区三区四区| 婷婷五月花西瓜| 99啪在线| 中文成人在线| 玖玖资源在线视频| 国产精典视频在线观看| 麻豆AV一区二区三区| 深爱五月天婷综合| 五月天堂六月丁香亚州中文字幕久久| 成人短视频在线| 亚洲婷婷丁香五月在线| 色综色网| 亚洲人妻av| 天天拍夜夜爽日日| 激情综合网址| 丁香五月五月婷婷欧美大香蕉| 日日狠夜夜狠| 91久操| 超碰人妻公开在线| 久久婷婷五月综合激情国产| 色婷婷五月天成人网| 99在线播放| 91丨九色丨国产打屁股| 99热在这里只有精品| 99精品久久久久久久婷婷| 亚洲日韩乱码一区二区三区四区| 婷婷色五月婷| 日本五月丁香| 99热老网站| 人人插操| 久久久18| 99激情| 丁香五月婷婷六月婷| 超级碰91| 99在线精品免费视频| 夜夜干夜夜操| 五月天婷婷色播在线网| 五月色婷婷影院| 99热香港| www五月| 亚洲欧美综合7777色婷婷| 成人欧美Va| 色综合久久99色| 亚洲最大视频网站| 人妻人人操| 99伊人婷婷在线| 成人做爰A片免费看视频| 日韩啊啊啊| 天天摸天天高潮天天爽| 色婷婷丁香网| 91碰超| 91色干| 1024欧美看片| 五月婷婷色色爱| 日本欧美成人片AAAA| 激情网五月天| 99性爱视频| 五月婷婷插一插| 五月天天丁香婷婷在线中| 人人97碰| 91精品婷婷国产综合| 成人午夜在线视频| 综合五月激情| 91丁香色| 婷婷黄色网| 无码人妻丰满熟妇奶水区码| 亚洲激情网| 精品婷婷| 色综合五月天| 激情又色又爽又黄的A片 | 亚洲综合色成丁香五月色| 热99这就是精品视频| 91久久九久久九久久九久久九久久 | 国产精品色婷婷AV综合色色| 色婷激情网| 婷婷五月丁香五月天| 开心 五月 综合| 六月婷婷色综合| 香蕉操亚洲| 丁香六月激情综合网| 2016日日夜夜操| 久久丁香婷婷五月| 婷婷丁香视频| 色婷丁香| 性色欲情 网站| 99这里只有精品国产| VA婷婷| 久久五月天婷婷视频| 九九热视频网站| www.天天干.com| 久久作爱| 九九国产视频| 色婷婷精品小视频| 国产色五月| 九九热视频精品| 久久色五月| 天天操夜夜玩!| 天天日,夜夜爽| 色婷婷裸体色性在线| 婷婷五月天欧美图片在线播放电驴| 色色色色色色97| 看久久性爱99视频| 亚洲午夜电影| 极品少妇高潮啪啪AV无码| 成人做爰高潮A片免费视频| 综合AV网| 五月婷婷综合视频| 欧美丁香五月97色| 亚洲乱码日产精品BD| 丁香五月五月婷婷欧美大香蕉| 激情人妻蜜夜系列区| 精品亚洲日韩99欧美片| 五月婷在线观看| 色婷婷最爱五月| 九九精品视频在线6| 狠狠色丁香| 夜夜爽天天爽| 91狼友视频网页更新| 噜噜五月天综合| 99热亚洲精品| 色婷婷视频| 五月丁香婷婷网在线在线| 日本三级韩三级99久久| 欧美在线干| 超碰国产在线播放| 9有码中文| 日日鲁鲁夜夜爽爽| 五月丁香激情综合网| 色五月激情| 性爱视频久久| 日韩视频女神99| 国产六月婷婷| www.夜夜| 5Www色5夜| 亚洲成人AV在线观看| 激情WWW| 天堂A∨在线| 色99热| 亚洲精品又粗又大又爽A片| 婷婷激情综合色五月久久91| 色五月婷婷久久| 天天做好综合色| 人人摸人人干| 婷婷性爱网| 五月婷婷在线观看| 婷婷99狠狠| 91日韩美女被插视频| 久久丁香五月婷婷激情综合网| 婷婷日欧美在线观看| 俺去也婷婷| 综合爱久久| 激情丰满熟妇五月| 人妻AV在线| 99人人操人人操人人精| 甈你aaaaa| 性做久久久久久久免费看| 九九大香蕉黄色影院| 热99只有精品| 风流少妇A片一区二区蜜桃| 97热精品| 久久人人妻| 丁香伍月婷电影全集| 亚洲久久视频| www超碰| 97久久五月丁香婷婷| 丁香六月天之亚州热女| 久9热| 九九这里只有精品在线视频| 97色天堂| 成人Av在线大片| 看久久性爱99视频| 五月久久丁香| 丁香五月婷婷色| 亚洲日本韩国| 2020夜夜操天天爽| 开心五月婷婷激情| 天天日天天干天天爱| 天天色图| 99激情在线| 综合视频久久| 久婷婷五月综合欧美| 日日噜噜夜夜狠狠久久丁香五月| 色九九中文字幕| 日韩乱玛久久| 91碰碰| 欧美激情xxxXX| 99热精品观看| 日本三久久| 午夜丁香婷婷| 激情综合亚洲| 强伦轩人妻一区二区电影| 午夜丁香丁香婷婷| 天天干天天操天天拍| 国产精品久久99| 久久免费精彩视频| 婷婷五月天777| 婷婷综合视频| 婷婷开心激情综合五月天| http://www.com久久久精品一区| 这里只有在线精品| 九九久久9 9在线观看| 色丁香五月综合网| 亚洲精品成人片在线播| 91日视频| 激情五婷精品网在线观看网址| 激情图片五月天| 亚洲天天免费| 熟女强人妻一区二区三区四区无| 精品一区二区三区木瓜| 久久99网| 五夜丁香| 九九热在线精品视频| 亚洲激情五月婷婷日日| 婷婷五月娱乐在线| 中文字幕av在线播放| 五月天六月丁香| 国产毛片欧美毛片久久久| 亚洲综合网激情五月天| 九月婷婷在线观看| 丁香五月激情网| 新久久五月天激情| 97操资源婷婷| 久久精品4| 丁香五月自拍| 玖玖婷婷视频| 99亚洲精品| 99热中文字幕久久| 亚洲不卡| 免费无码毛片一区二区A片| 色婷婷丁香五月天在线观看| 91碰| 午夜微拍福利| 婷婷激情九月| 秋霞三及片| 96精品久久久久久久久| 秋霞av吧| www.色9| 婷婷五月伦理| 久久99网址| 色婷婷中文| 色五月天丁香| 久久成人精品视频| 五月丁香六月激情综合网 | 婷婷综合性爱网| 久久久久久人妻| 春色激情第四色| 99热第一页| 99re思思热久久| 。久久久久久久久久久久久久人妻 | 五月开心婷婷网| 色综合久久无码| 超碰av在线| 激情六月丁| 色国产五月| 欧美日韩99| 99re视频在线精品| 亚洲综合五月天婷婷丁香| 六月婷五月丁香| 色女人久久| 91女人18毛片水多国产| 五月婷婷片| 国产色网站| 亚洲丁香网| 天天爽天天日人人爱| 国产激情在线| a毛片二逼wwwwwwwwww| 久久人人看| 99综合网| 久久视频婷婷| 婷婷五月六月丁香| 九九久久综合网站| 综合五月亭亭9| 丁香婷婷久久 | 天天干com| 99热香港| 久久99热这里| 五月婷婷激情网| 五月婷婷色影院| 丁香五月天堂网AV| 久久久免费图片视频| 欧美性猛交99久久久久99按摩| 久色资源| www狠狠| 色婷婷久久综合| 激情五月天色色色| 久久丁香婷婷色情综合| 久久久99精品免费观看| 色久综合| 99爱在线视频| 亚洲乱码日产精品BD| 久久99网| 91操人| 99精品在线| 操碰97| 国产67194| 欧美激情五月天| 婷婷五月天久久久| 五月丁香影院| 乱精品一区字幕二区| 情欲禁地| 国产XXXX搡XXXXX搡麻豆| 夜夜操加勒比| 天天日天天肏天天奸| 色色色香蕉五月婷| 日韩青青| 婷婷六月天| 丁香花社区av| 亚洲av另类在线观看| 9|在线观看视频| 极品少妇XXXX精品少妇偷拍| 欧美三9久九观看| 艳妇野外情欲放荡HD| 97色五月丁香婷婷| 五月激情久久| 熟女激情网| 东京热人妻一区二区三区在线| 操操熟女| 丁香婷婷六月| 丁香五月人妻| 成片免费播放| 色欲五月天| 天天噜天天爱| 色五月婷婷婷婷| 九九热这里只有精品6| 狠狠色噜噜狠狠| 深爱激情五月婷婷| 亚洲天堂99| 日本波多野结衣视频| 99热香港| 丁香婷婷五月色成人网站| www.久久久久| 色五月丁香在线| 日本va欧美va欧美va| 99在线观看精品| 在线99热| 五月桃花网综合| 色欧美日| 韩国情人在线电视剧免费观看高清版全集| 婷婷 激情 五月| 偷拍五月丁香| 九九久久精品| 大香蕉在线99热| 五月停停色| 思思热思在线精品视频| 99色 色| 激情四射五月天| 中文字幕日产A片在线看| 免费在线a| 中文字幕日产A片在线看| 免费色婷婷| 色丁香五月天| 性99网站| 第四色激情网| 成人小说色图婷婷五月| 日韩综合网络男女香蕉a片| 丁香六月av| 草五月| 婷婷色情 | 丁香五月婷婷啪| 99福利视频| AV九九| www。五月,com| 国产精品久久久99视频| 色六月视频| 久久草大香蕉| 午夜丁香 婷婷| 26uuu亚洲色| 激情五月天综合网| 色综合久久久综合久久网| 丁香久月婷| 欧美性色五月天| 九九99免费理论| 丁香九色不卡aaa| 天天色综和网| 91超级碰在线视频| 五月丁香六月情| 99在线热视频| 色色网五月激情| 26uuu| 97色女人在线| 久久综合天天综合| 久久婷婷五月天| 综合色网站| 五月婷天天搞视频| 高清一区二区三区日本久| 五月丁香激情四射综合| 人人看人人摸人人| 99精品偷自拍| AA丁香综合激情| 射区导航| www.久久9| 色丁香久久久| 日韩国产在线精品| 久久五月天激情美女| 一起草Av| 久久狠婷婷| 婷婷婷婷色| 成人在线观看国产| 热热久久久久久久久| 日本五月婷| 91色五月| 九月婷婷综合| 另类伊人婷婷| 国产97色在线 | 日韩| 猫咪伊人AV| 26uuu另类| 国产乱妇乱子在线播视频播放网站 | 婷婷丁香五月综合| 九九热自拍| 4399在线观看免费毛片| 热久精品| 色婷婷影音| 欧美成人va| 五月丁香久人妻中文| 99热思思| 99福利导航| 色婷另类| 91精品久久久久久| 原琪琪色影院| 开心五月婷婷激情| 中文字幕,综合,91| 色综合偷拍| 香蕉国产2013| 久久婷婷五月综合色奶水99啪| 色婷婷偷拍| 九九人人精品| 91丨九色丨东北熟女| 久9热在线视频| 丁香五月激情综合| 91综合色| 成人AV在线电影| 九九热色视频| 婷婷五月天成人网| 99热这里只有精品69| 久草婷婷网 | 五月香蕉婷婷| 丁香色色网| 俺来也综合网精品一区| 激情99| 婷婷五月丁香色情| 99热www| 五月天五月天激情网| 亚洲AV第二区国产精品| 综合网色| 久热这里只有精品3| 欧美私人家庭影院| 5月丁香六月婷婷| 第四色五月婷婷| 五月丁香久久网| 一區四區歐美日韓| 伊人大香久久| 午夜天堂啪啪| 97热91| 六月丁香VA| www99热| 国产在这里只有精品| 色综合开心五月深爱五月| aV欲望人妻中文字幕| 国产操碰| 婷婷四色五月| 婷婷色色丁香| 99在线免费视频| 影音先锋777xfplay色资源网站| 久久人操-久草婷婷-成人AV| 天天色色天天| 5月丁香六月情| 丁香九月综合激情| 开心激情站| 五月婷婷激情网| 丁香婷婷六月激情| 丁香花五月天社区| 大香蕉人妻| 五月婷天天搞视频| 丁香婷最新动态| 激情婷婷丁香色五月| 久99热| 欧美va在线| 五月丁香香蕉| 亚洲视频1区| 我去色色网五雨天| 亚洲色欲AAAAAA| 99色中文| 婷婷五月天99综合网站| 九九久久99精品免费观看www| 99在线视频免费| 99热丁香| 丁香婷婷综合影院| 综合久久婷婷| 五月丁香六月色| 操国产人妻| 日韩另类| 综合色影院| 五月婷婷爽爽爽| 五月天激情小说| 久热视频这里只有精品| 婷婷五月天无码熟女| 大香蕉婷婷五月天| 色婷婷av综合网| 无码人妻精品一区二区蜜桃色欲| 色五月AV| 狠婷婷五月| 亚洲综合丁香五月| 99在线资源| 婷婷五月天你懂的| 少妇搡BBBB搡BBB搡毛茸茸| 99热综合| 996热re视频精品视频| 久久精品视频9| 激情五月亚洲综合网| 噜噜色五月| 亚洲婷婷基地| 日本三级日本三级99| 99热99热在线| 这里只有精品视频在线看| 天天爱天天做综合| 色播六月| 青青草tp| 日韩精品无码AV| 91成人看| 五月丁香久久激情综合| 激情丁香五月| 色婷婷香蕉| 99国产小视频| 国际国外精品欧洲南美洲专区无码不卡| 多精窝99在线视频| 婷婷色婷婷亚洲成人| 大香蕉久艹| 9久精品视频| 色婷婷天堂| 六月婷婷色色色| 丁香花五月天社区| 丁香五月婷婷婷桃花影院| 婷婷久久婷婷色五月| 五月激情四射网站| 五月婷婷爽爽爽| 丁香六月在线| 久久色情| 色五月婷婷老师| 99热这里| 99热色精品| 亚洲乱码日产精品BD| 国产在线网| 激情性爱五月天网页| OYIWbGcPu8H| 无语停婷丁香网| 人妻中文字幕网| 97色在线观看视频| 激情综合网色五月| 五月丁香啪啪激情| 亚洲综合视频天天精品| 五月丁香六月色婷婷综合五月天| 五月丁香爱婷婷深深| 桃色激情婷婷伊人网| 婷久看人爽| 色婷婷五月天不卡| 丁香五月色欲| 丁香综合婷婷五月天| 亚洲天堂爱爱| 婷婷综合色图| 色九月婷婷| 爱iii做iiii日| 五月丁香婷婷激情爱爱| 激情无码网| 五月丁香婷婷色色| 超碰在线视屏| 九九丁香社区欧美激情| 99欧美三级视频| 欧美天天搞| 美女天天久久| 麻豆五月丁香婷婷| 婷婷五月天资源| 99综合自拍| 狠狠干综合| 色婷婷丁香女女| 国产综合婷婷| 五月色综合网欧美网| 色五月之第四色| 欧美色五月天| 色综合久久久久| 五月开心网| 男人天堂AV在线一区二区| 天天色月| va婷婷在线免费观看| 五月婷婷影院| 性做爰1一7伦| 久久女人九九| 五月激情啪啪| 婷婷色欧美激情| 国产精品国产| 北京熟妇搡BBBB搡BBBB| 亚洲四色五月| 丁香丁婷五月激情| 色综合射婷婷| 少妇高潮呻吟A片免费看软件| wwccc久久久| 这里只有久久精99| 桃色五月天| 一起草日本| 国产精品久久久久久白浆色欲| 五月天久久www| 久久人操| 久久视9精| 婷婷和五月天| 天天狠狠夜夜狠狠2023| 五月天综合婷婷| 91在线观看www| 秋霞簧片| 91大神操美女| 免费色婷婷| 亚洲色婷婷激情| 五月丁香五月婷婷| 伊人婷婷福利网| 超碰99在线| 天天干狠狠| 色噜噜狠狠色综无码久久合欧美| 99热综合在线| 色哟哟精品| 婷婷色狠狠| 亚洲愉拍99热成人精品| 天天噜日日噜综合无码| 五月丁香六月综合激情网| 久久99网| 99狠狠色| 婷婷开心六月| www.超碰97| 婷婷五月黄色激情在线| 啪到高潮激情丁香五月| 成人精品视频99在线观看免费| 婷婷五月亚洲综合| 夜夜爽天操| 国产无遮挡又黄又爽免费网站| 91色久| 五月天另类视频| 九九成人电影婷婷| 日日色五月天| 97色色色色色| 亚洲啪啪视频| 99热爱爱干干日| 黑人无码一区| 久久视频在线| 丁香五月天大香蕉啪啪| 这里只有精品99www| 99re这里| 日本色色网| 五月婷婷性爱| 夜色综合网| 免费观看大片视频 丁香婷婷 六月欧美| BlACKEDRAW视频一区二区| 亚洲人妻一区二区| 欧美性爱五月天| 色久在| BBWCUCKOLD精品熟妇| 欧美操人| 色屌丝中文字幕| 天天想夜夜爽天天爽| 操逼视频一区| 99热老司机| 欧美在线视频99| 丁香五月天在线观看视频| 亚洲午夜视频| 婷婷伊人中文字幕| 激情小说在线视频| 丁香六月综合激情| 天天日天天操心| 天天做天天双| 五月天丁香久久综合|