欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
天天天天干| 久久图色4| 亚洲另类噜噜| 99热欧| 婷婷视频在线碰| 亭亭五月色男人| 黄色五月婷婷| 色五月婷婷天堂| 五月丁香久久| 特级西西4444www无码| 欧韩性爱| 五夜婷婷| AV色色天堂中文| 久久五月视频| 丁香婷婷久久综合在线| 婷婷五月天激情四射| 色五月激情基地| 99在线观看精品| 精品一二三区久久AAA片| 亚洲热久久| 久久九九免费大视频| 五月婷免费视频| 婷婷五月在线视频| 天天干狠狠| 色综合色色色| 六月丁香综合| www狠狠| 亚洲av免费在线| 99干免费视频| 操老逼综合网| 午夜无码熟熟妇丰满人妻 | 丁香五月天激情网| 啪啪激情网站| 97深爱伊人综合| 综合97五月| 日本天堂网站99| 国产精产国品一二三在观看 | 91avse| 四季8848精品成人免费网站| 激情婷婷| 疯狂做受XXXX高潮A片| 一区二区三区视频| 五月婷婷激情久久| 日日天天干| 久久电影4399| 五月丁香久久网| 激情综合五月开心狠狠| 99热这里有精品| 性99网站| 欧美人人草| 婷婷丁香五月天小说| 色色99| 五月婷六月| 婷婷综合一二三| 婷婷五月综合基地| 丁香五月www| 大香蕉久久伊人网| 我去色色网五雨天| 色色激情网| 99久re热| 思思热闹这里只有精品| 色月视频| 欧美成人精品老美女噜噜噜| 夜夜谢天天干| 99热这里只有精品99| 五月婷婷在线综合| 热久久91| 极品少妇XXXX精品少妇偷拍| 五月婷婷伊| 一本色综合色| 五月婷婷丁香网| 亚洲视频码| 俺去也五月| 色玖玖| 专区无日本视频高清8| 久久免费操| 五月婷啪| 国产精品99久久久久久久女警| 五月婷色| 婷婷五月丁香激情图片| 亚洲情色一区| 丁香六月天AV| 玖玖伦理电影| 婷婷丁香五月高清| 99热老网站| 九九色综合九九色| 熟女少妇内射日韩亚洲| 欧美性猛交XXXX乱大交极品| 中文字幕天天干| 182.t午在线观看| 人人操碰| 国产片天天爽夜夜爽| 美女五月天婷婷| 天天操夜夜玩!| 偷拍视频五月天| 激情五月天激情综合网| 婷婷五月天激情文学| 五月婷婷五月天| 乱精品一区字幕二区| 九九精品9| 99在线一区| 色狠狠色综合久久久绯色AⅤ影视| 久久久婷丁香五月天激情综合| 91九色国产| 五月丁香激情综合网官网| 五月丁香综合啪啪啪啪啪| 丁香五月天欧美| 79精品视频在线观看,| 丁香婷婷基地| 超碰99在线| www.一区二区三区| 很很操96| 99在线热| 日韩一本操| 亚洲第二AV| 五月丁香婷婷啪啪| 九九色99| 91久久久久久久| 日韩99无码| 五月丁香婷草| 色婷婷丁香五月天| 五月婷视频| www.91AV.com| 日本va视频| 丁香五月综合激情啪啪| 日本wwww在线| 婷婷五月天激情综合| 日本色视| 欧美三级韩国三级日本三斤| 丁香婷婷射| 亚洲性爱电影| 五月丁香六月婷婷综合| 99热九九在线| 狠狠干在线| 色情网综合| 五月婷婷色啪| 国产毛片欧美毛片久久久| 五月婷婷 自拍| 久久五月天大美女| www.久久久久| 色香久久| 六月丁香婷婷尤物| 欧美性猛交99久久久99| 丁香婷婷老司机久操| 噜噜噜噜噜在线| 操日挥操日日| 天堂成人A片永久免费网站| 激情婷婷视频在线| 天天天天天天噜| 这里只有精品久久| 9999久久久久| 丁香六月婷婷开心| 1024成人在线观看| 狼人婷婷综合| 黄色激情久久| 亚洲午夜电影| …亚洲黄色在线播放日韩、av中文a…| 丁六月激情| 色色色色五月天| 亚洲国产成人AV在线| 俺来也综合网精品一区| 97色碰| 色五月自偷自拍婷婷婷婷| 天天插天天射天天干| 五月色情婷婷开心五月色情| 欧洲色区| 26uuu亚洲欧美另类| 99毛片| 丰满少妇猛烈A片免费看观看| 五月婷婷黄色毛片| 99色热视频在线| 丁香五月天日韩无码| 丁香五月天av| 五月天成人在线播放| 99视频综合| 日本va网站| 五月丁香精品| 亚洲精品亚洲人成人网| 久久五月天免费网站| 亚州AV超碰人人操| 91综合色噜噜| 国语精品探花| 欧美久久久久久久久中文字幕| 另类激情五月| 玖玖99婷婷| 五月丁香AV在线| 亚洲午夜在线视频| 丁香五月婷久久| 天天操天天干天天射| 中文字幕+乱码+中文字幕在线观看| 色五月天综合网| 亚洲小视频免费观看| av久热| 国产毛片精品一区二区色欲黄A片| 天天日天天干天天爱| 亭亭玉月丁香| 色综合天天网| www.久久久久久久久久.com| 中文久久婷婷| 婷婷激情丁香五月天综合| 亚洲综合色色色| 丁香五月天激情网址| 天堂综合久久| 天天噜天天插| 欧美一级a| 九九这里都是精品| 亚洲天堂大香蕉| 日本精品99网站| www色婷婷| 国产成人+综合亚洲+天堂| 五月天激情图片| 天天天天爽爽天干| 玖玖色综合网| 大香蕉久久青青| 这里只有久久精99| www.婷婷,com| 99热在线观看| 99热97| 婷婷五月激情五月丁香五月| 色播五月丁香| 婷婷五月天99综合网站| 色婷婷丁香五月| av在线激情| 日日干夜夜干| 天天操夜夜橾| 天天爱天天做天天日| 五月婷婷av| 亚洲成人色五月婷婷综合| 国产在线aaa片一区二区99| 六月婷婷影院| 嫩草视频观看| 九九在线视频| 婷婷色五月开心五月| 亚洲成人网站在线观看| 成人精品视频99在线观看免费| 另类小说婷婷色| 五月丁香色婷基地综合久久| 久久久久久久久18久久| 五月婷婷丁香av| 人人操人人操919999| 亚洲精品无码一区二区| 婷婷内射视频在线| 狠狠操狠狠做| 丁香婷婷六月天| 午夜不卡久久精品无码免费| 色色免费网站| 99热这里只有精彩| 97天堂| 99ri精品| 五月丁香好婷婷A片网| 99色在线观看视频| 色婷婷综合久久久久| 五月天色色无码| 另类A片| 五月天欧美激情| 九九综合色综合| 日本熟妇乱妇熟色A片蜜桃| 五月天啪啪啪| 色婷婷丁香五月综合| 99 热国产在| 久久人妻伦理| 深爱激情九九五月天| 91pornav在线| 午夜在线成人网站免费观看| 成人精品视频99在线观看免费| 日韩AV色色色| 天天爱天天做天天舔| 国产精品成人网址| 激情综合色五月丁香| 久久这里只精品| 国产丁香五月天婷婷| 91色涩| 丁香婷婷浪潮AV久久综合| 夜夜撸天天操| 五月婷婷第四色| 五月丁香六月婷婷综合免| 久久久久98| 五月婷婷视频| 4438亚洲欧美| 欧美日韩成人在线| 五月婷婷综合在线| 婷婷五月花| 五月丁香婷婷综合久久| www.久久久久久久| 九九操操| 超碰人人操人人干| 九九精品免费| 99这里只有精品| 九一99| 色婷婷五月六月丁香综合视频| 久99久精品| 婷婷五月天大香蕉在线视频观看| 五月婷婷亚洲天堂97色婷婷| 日比视频91| 夜夜爽77777妓女免费下载| 婷婷色五月天在线观看| 可以免费观看的AV| 五月丁香六月婷精品视频| 日韩美女在线视频19| 色五月婷婷丁香凹凸| 久久综合久色欧美综合狠狠| 激情六月婷婷| 三级毛片视频| 99精品丰满| 五月天婷婷色| 日韩av手机在线观看| 国产午夜精品一区二区三区嫩草| 五月婷丁香| 亚洲色综合| 99久久久久| 色五月亚洲| 99久久这里只有精品| 五月天色婷婷基地| 色婷婷成人五月| 可以看的AV网站| 五月婷婷丁香网| 色五月激情五月天| 亚洲激情综合| 久色资源| 日韩专区五月天婷婷丁香| 99热每日| 日韩美女在线视频19| 久久免费试看120秒| 日本韩国视频在线观看社区免费的9| 中文字幕网伦射乱中文| 九月丁香婷婷网| 第四色色六月色综合| 婷婷五月a| 国内一级精品| 色五月婷婷五月| 日本乱子人伦在线视频| 99内射视频| 思思99久久| 九九热免费视频| 五月五月婷婷| 色视频2025| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 五月婷婷AV| 超碰人人艹| A在线观看| 婷婷五月综合网| 色色网站在线| 五月做爱| av九九| 99re这里只有精品免费| 日韩九九| 9色在线| 91九色白丝| 丁香五月天天| 99热精在线九九久久保| 丁香五月婷婷日本| 91人妻PORNY九色大屁股| 亚洲色婷婷五月天| 日本丰满久久| 国产伦理精品高清在线观看网站一区二区 | 色五月大| 密着浓厚中出乚交尾GvG935| 国产成人AV在线| 久久五月婷综合网| 人人摸人人干人人做| www.色色五月天.com| 超碰人人色| 婷婷五月天在线观看免费| 色噜噜五月天| 色婷婷基地 | 婷婷久久18| 婷婷九月激情| 五月丁香婷婷五月| 国产精产国品一二三在观看| 天堂资源欧日浪女在线播放| 丁香婷婷中文字幕| 五月丁香综合激情| 婷婷六月激情| 五月天六月婷婷| 日本人妻A片成人免费看片| 草榴视频黄色网| www.激情五月天。com| 婷婷五月天xxx| 五月天偷拍| 国外亚洲成AV人片在线观看 | 亚洲色情在线| 777米奇影视第四色| 久久九九中文字幕| 婷五月丁香俺| 五月丁香激情综合| 五月九九综合| 另类国产综合| 1000部毛片A片免费观看| 五月婷婷日| 婷婷五月天激情AV影院| 五月丁香六月激情综合| 亚洲国产成人在线| 伊人色综合久久久| 色婷婷最新域名| 啪啪啪五月天| 欧美色图天堂网| 在线91日韩| 热久久视频99| 男人操女人高潮91视频| 日日干综合| 99综合视频一体| www.久久婷婷| 日韩美女羞羞网站在线观看| 色色色免费视频| 国产精品A成V人在线播放| 五月天堂色| 婷婷成人五月天| 丝雨一区二区| 五月天激情视频网站| 八戒青柠影视剧在线观看| 97色久| 99色亚洲| 色青五月天| 精品成人a v无码内射| 婷婷狠狠干| 狠狠色激情在线| 激情五月天网| 五月天无码视屏播放| 五月天com| 五月综合久久| 人妻av在线| 色情五月天视频网| 超碰免费人人| 91dy.av| 99精品偷自拍| 久久成人天| 亚洲av电影网站| 韩国三级五月天婷婷。| 9 1 A v久久久| 久久婷婷五月综合色播| 天堂久久久久天堂网| 美女激情婷婷| 影音先锋五月天婷婷丁香在线观看| 九九久久视频| 婷婷玖玖丁香| 婷婷性爱网| 中文字幕视频在线播放| 亚洲五月天激情| 人人草成人视频| 五月婷婷丁香六月| 五月色欧美| 国产乱子轮XXX农村| 开心亚洲久久开心| 婷婷五月18永久免费视频| 婷婷字幕在线| 秋霞AV淫| 狠狠香婷婷五月| 人人艹艹艹| 日韩久久这里只有精品| www.久9| 五月婷六月| 九九碰九九爱97| 欧美久热| 欧美成人五月天| 六月丁香成人| 五月激情小说| 色偷偷狠狠| 98色丁香五月婷婷综合网| 玖玖在线| 狠狠色综合777| 日本熟妇乱妇熟色A片蜜桃| 综合图区激情| 五月丁香久久综合| 婷婷丁香成人色综合| 中文字幕 中文字幕明步| 69久久99精品久久久久| 五月天婷婷成人网| 久久人妻人人| 99人这里只有精品| 狠狠爱丁香婷| 丁香五月天色婷婷| 婷婷五月情天| 天堂婷婷五月在线| 国产精品成人网站| 91操人| 天天久| 超碰三级秋霞| 婷婷刺激综合| 日日影院 | 五月天色丁香| 91视屏在线观看com.wwwvv| 人人操人| 色婷婷电影网| 五月天丁香成人社| 可以直接看的AV网站| 久久3p| 甈你aaaaa| 视频一二区| 国产精品a无线| 天天日天天舔| 婷婷五月丁香婷婷| 丁香色五月 97干| 国产av第一专区| 久久九九免费视频| 六月婷婷综合| 久草xx性爱视频| 激情久久五月天| 色综合婷婷99| 国产FREESEXVIDEOS性中国| 国产精品色婷婷久久久精品| 六月婷婷国产| WWW.五月天9999| 大战熟女丰满人妻AV| www.五月天婷婷| bbwcuckold精品熟妇| 婷婷五月丁香花综合| 人人艹艹艹| 日日爽日日| 五月丁香婷婷俺| 激情五月天啪啪| 色99自拍| 91丨九色熟女丨首页| 天堂伊人干| 久久香蕉网| 五月亭亭开心网| 激情五月天色婷婷综合| 婷婷五月天无码视频| 丁香蜜臀黄色婷婷五月天| 日本三级第一页| 202丰满熟女妇大| 国产成人99久久亚洲综合精品| 五月天婷婷7米| 性生活久久人妻| 五月花成人网| 亚洲天堂AV免费片| 成人深爱丁香五月| 婷婷六月激情小说网| 99热99精品| 99热第一页| 91婷婷丁香五月亚洲| 日韩AV免费电影在线播放| 五月丁香啪啪啪啪| 国产精品社区| 亚洲情色一区| 日韩99视频| 激情婷婷六月天| 丁香五月婷中字幕| www夜夜操| 五月婷婷六月丁香色| 亚洲女婷婷五月基地综合久久久| 思思热精品免费视频| 久久人妻乱子伦| 好好干Av| 五月丁香色婷婷婷基地| 丁香六月 婷婷六月| 就要爱综合| 五月婷婷激情刺激| 夜夜躁狠狠| 色五月婷婷天天干| 99综合色色色| 五月天婷婷自拍图片在线观看| 开心五月婷婷五月| 六月色婷婷欧美| 激情合网婷婷| 免费视频这里只有精品| 色色AV色色色东莞| 国产精品香蕉| 五月狠狠| 久久综合99| 亚洲热热视频| 亚洲字幕AV一区二区三区四区| 免费看欧美成人A片无码| 免费无码毛片一区二区A片| 国产乱子轮XXX农村| 亚洲天堂婷婷丁香| 墨西哥毛片内射精| 伊人久久大香线蕉AV最新午夜| 久久婷中文字幕| 99热免费精品| henhencao国产在线| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 91丨九色丨东北熟女| 99热最新精品| 婷婷五月AV| 五月天啪啪啪| 亚洲色色色| 亚洲春色奇米影视| 中文字幕网站在线观看| 五夜丁香| 久久精品在线| 五月婷婷开心五月| 亚洲免费观看高清完整版AV线| 成人在线精品| 人人艹艹艹| 激情 久久 婷婷| 色婷婷久久视屏| 91狠狠综合久久久久久| 色婷婷九月综合| 激情五月综合亚洲另类| 丁香五月婷婷在线| 久久九九99视频| WWW,五月| 丁香五月激情六月综合| 国产成人AV在线播放| 99色网站| 婷五月天| 77799热| 五月伊人婷婷| 亚洲激情网| 六月婷婷日| 亚洲AV第二区国产精品| 成人色五月天| 日本一级特黄大片AAAAA级| 超碰在线99| 热九九九九| 六月婷婷网| 激情五月婷婷开心网| 99热亚洲精品| 婷婷中文字幕网站| 视频这里只有精品| 综合网激情| 激情AV| 五月婷婷av在线| 丁香五月91| SS丁香五月婷婷| 99在线精品观看99| 免费看欧美成人A片无码| 亚洲无aV在线中文字幕| 俺也去综合| 狠狠干狠狠色| 婷婷五月天精品| 精品成人无码A片观看香草视频| 99啪| 久久99精品久久久久久青青AR| 亚洲99激情| 六月婷久久| 亲子乱AV-区二区三区| 亚洲小视频免费看| 丁香五月激情网| 超碰熟女农村在线69| 99热这里只有精品268| 久久免费婷婷视频| 白人荫道BBWBBB大荫道| 操碰91| 五月婷婷婷丁香播| 99艹精品在线观看| 五月色欧美| 夜夜撸日日操| 婷婷综合天堂| 五月综合激情综合久| 激情五月天影院| 色v综合网| 精品人妻一区| 婷五月天| 亚洲va欧洲va国产va不卡| 香蕉久久国产AV一区二区| 久99| 欧美影院| 色五月婷婷激情基地| 夜夜做夜夜愛| 丁香五月激情图片婷婷| 欧美综合婷婷欧美综| 婷婷五月情| 新97人人上人人| 色色色地址| 五月婷综合| 婷婷激情丁五月| 亚洲成av人影院| 丁香六月天AV| 99热这里只有精品8| 狠狠干狠狠色| AV人人操| 五月六月婷婷激情网| 超碰在线成人| 五月丁香啪啪网| 成人在线视频网| 色噜噜狠狠色综合成人网| 综合99综合久久久久久久| 色婷久| 色婷五月天| 光棍影院日韩精品| 激情五月天啪啪| 久久丝袜婷婷| 色色操| 五月丁香狠狠爱| 91超级碰碰碰| 丁香五月骚喷水视频| 日韩成人无码| 激情小说之五月| 丁香六月亚洲| 丁香六月婷| 91操网| 五月丁香久久| 天天草天天日| 天天综合色丁香| AA丁香综合激情| 5月色亭亭视频| 婷婷热色| 另类图片天天影视在线观看| 丁香五月天在线直播观看| 人人操婷婷| 丁香五月区| 26uuu视频欧美| 精品一二三区久久AAA片| 26uuu欧美亚洲日韩| 热99玖玖99玖玖99九九| 9久热这里只有精品| 丁香六月av| 色色吧综合| 天天AV导航网| 五月天婷婷丁香人人操91| 日91高清无玛| 激情六月下句是什么| 久草婷婷网 | 五月丁香A片| 成 人 色 色| 26uuu偷拍亚洲欧洲综合| 九九99免费视频| 九月色婷婷| 丁香网五月网| 2017人人操| 天天做天天爱天天爽| 婷婷五月丁香色情| 大香线蕉伊人| 风流少妇A片一区二区蜜桃| 亚洲色情网站| 蜜臀AV在线成人| 色婷婷成人色网| 超碰91人人操| 影音先锋色色色资源色资源色| 九九在线热九九在线热99热| 丁五月激情视频免费| 性爱网久久| 欧美日韩国产一二区| 中文字幕av在线| 激情五月激情综合网一级丸片| 亚洲国产网址| 久99热| 久久99这里只有精品视频| 亚洲色夜| 五月丁香色停停啪啪啪| 丁香五月影视| 五月丁香六月香综合激情| 五月婷婷97| 婷婷五月丁香五月| 丁香六月情| 日本色噜| 婷婷五月娱乐在线| 九九热免费视频| 久色大| 五月色婷婷影视在线电影| 亚洲色婷婷五月天| 国外亚洲成AV人片在线观看| 婷婷玖玖五月天| 人妻videos人妻高清| 五月丁香999| 日韩免费99| 99久久婷婷国产综合亚洲| 少妇性BBB搡BBB爽爽爽电影| 99色精品| 五月天堂色| 婷婷综合成人| 色综合色色色| 九九热国产| 五月天婷婷深深爱| 丁香五月亚洲无码| 精品婷婷五月天| 激情五月天婷婷激情| 色噜噜狠狠色综合成人99| 欧美日韩五月婷婷| 色播五月丁香综合| 亚洲激情六月| 久久五月婷综合网| 99精品丰满| 九月丁香久久网| 强辱丰满人妻HD中文字幕| 五月婷婷色色| 91五月天| 欧美电影在线播放| 免费看欧美成人A片无码| 99色色视频| 九九久久网| 日本色婷婷| 亚洲永久四色| 色爱五月天| 五月丁香综合激情网| www.久久99| 色五月综合网| 操一操干一干| 国产激情综合| 99精品成人无码A片观看金桔| 欧美色五月| 99热精品在线在线| 欧美激情性做爰免费视频| 青青青在线视频国产| 五月丁香狠狠爱| 欧美交换配乱吟粗大25P| 亚洲妇女熟BBW| 狠狠精品干练久久久无码中文字幕 | 伊人久久大香线蕉亚洲五月天,| 99九九热播在线免费视频| 国产高潮白浆一区二区| 九草性爱| 九色自拍| 美女va| 成人婷婷深爱综合网| 六月婷婷影院| 色中色综合| 五月丁香亭亭操逼| 四色五月婷婷| 性按摩玩人妻HD中文字幕| www.ywav| 97电影99热| 综合婷婷| 深爱五月中文字幕| 综合一本道| 色吧婷婷| 日本三级中国三级99人妇网站| 欧美顶级少妇做爰HD| 9999热免费视频视频| 日本久久人| 深爱婷婷基地| 丁香丝袜五月| 色老久久| 婷婷五月天网| 狠狠色噜噜色狠狠狠综合色| 五月婷久久草| wWw色五月| 日日操天天| 综合视频久久| 国产又爽又猛又粗的视频A片| WWW.HENHENL.| 婷婷射丁香| 亚洲综合色丁香五月天| 五月天色区| 久久久久久人妻| 久久看九九90| 99自拍视频网站| 五月社区婷婷激情| 99在线免费视频| 日本猛少妇色XXXXX猛叫| 亚洲成人综合网在线免费观看| 91成人电影| 婷婷成人五月天一区| 日韩三级高清无码| 久久久婷婷| 大香久久伊人网| 色五月开心婷婷| 欧美人妻一区二区| 五月婷婷激情| 日本欧美啪啪| 国产Va视频| 婷婷五月丁香综合激情| 亚州视频九九99| www99精品| 色啪久| 99色婷婷视频| 五月婷婷开心五月| 国产99久久久国产精品免费看| 美国不卡视频| 五月伊人视频在线看| 另类激情五月| 97碰碰叉| 精品无码色| 色99在线观看| 日本97人人| 精品无码av丁香五月激情| 五月丁香婷婷免费视频| 国产精产国品一二三在观看| 香蕉综合在线| 天天插天天插天天插天天插| 大地资源色婷婷视频在线| 伊人久久大香蕉网| www夜夜操com| 国产偷人爽久久久久久老妇APP| 中文字幕日韩成人| 色色综合网络| 天天色天天操天天射| 婷婷色在线观看| 丁香婷婷色五月激情综合| 色天堂婷婷| 丁香五月精品视频| 超碰免费99| 无码一级片| 丁香五月亚洲天堂| 五月综合激情婷婷六月色窝| 99色天堂| 99热最新精品| 亚洲精品成人片在线播| 欧美日本高清视频99| 极品 少妇 内射| 天天干,夜夜爽| 亚洲、欧美、国产另类笫二区| 天天插插天天| 国内精品免费一区二区2009| 婷婷亚洲丁香五月| 国产亚洲在线| 99精品热视频只有精品10| 日日噜噜夜夜狠狠久久丁香六月| 亚洲爱婷婷| 另类五月激情| 日比视频91| 五月天婷婷乱| 99在线精品免费视频| 国产视频久色| 99精品在线观看| 婷婷五月天av网| www.激情五月| 99热91| 欧美日韩91| 丁香五月欧美成人| 精品人人操| 91大神操美女| www.99热视频| 人妻综合网| 另类视频一区| 日本片日本片祼观看网站在线看中文版网页在线看 | 五月色综合| 婷婷色五月天在线| 五月天婷婷综合久久| 色色色999| 丁香五月影院| 天天操夜夜操| 久一这里有精品国产| www.超碰| 色的色综合| 超碰91av| 99日韩| 丁香五月天啪啪| 九九热免费| 激情综合网之激情五月| 99热超碰| 精品99只有。| www.九月婷婷丁香.com| 精品久久人妻| 五月天天堂久久| 婷婷色导航| 久久99激情| 99燥99日| 99在热线免费视频| 任你擦免费视频| 九九av| 五月婷婷亚洲综合网| 天天干在线播放| 天天干天天干天天操| 国内一级精品| 色色色网站| 内射丰满人妻| 二区成人视频| 91丨九色丨高潮丰满日本| 九九九这里只有精品| 八戒青柠影视剧在线观看| 色五月成人在线| av第一二区| 天天激情站| 午夜爱爱爱成人| 91传媒无码人妻精| 人人操插| 五月丁香婷婷AV天堂| 任你搞免费视频观看| 99爱视频| 日日噜狠狠色综| 玖玖九九超碰| 操九色| 亚色网站小视频| 91热在线观看视频| 国产操碰| 亚洲国产精品成人va在线观看| 天色色综合网| www.yw尤物| 丁香五月网在线观看| 97色天堂| 国产又色又爽又黄又免费| 激情五月天com| 婷婷色激情网| 99国产97在线,| 久热大香蕉| 久久996re热这里只有精品无码| 九九综合88| 另类视频五月天| 五月丁香操亭亭网| 狠狠色丁香久久久婷| 玖玖九九超碰| 色五月婷婷亚洲| 热思思| 操操操操操操婷婷五月天| 日韩不卡123| 亚洲中文字幕av| 欧美成人精品一区二区 | 日本熟妇乱妇熟色A片蜜桃| 这里只有精品视频免费在线观看| 亚洲色五月| 亚洲无码色色| 99在线观看这里都是精品| 色婷婷情片| 天堂无码人妻精品AV一区| 五月天丁香婷婷社区| 五月丁香AV、伊人业余、性色熟妇| 九九人人看| 免费三级黄色| 婷婷激情社区| 99热8| 五月色婷婷综合丁香精品无遮挡| 国产免费一区二区三区三州老师F1F1.CC| 中字幕视频在线永久在线观看免费| 色婷婷丁香五月| 色婷婷香蕉丁丁网| www.99热日韩.com| 超碰9在| 婷婷色影音天| www.久热| 色色日本欧美| 天天干天天叉| 深爱激情网婷婷| 色婷婷av在线观看| 婷婷丁香社区| 日操夜操天天操不卡| 丁香五月自拍| yellow视频在线观看91| 5月丁香啪啪啪| 久色中文| 天天爽夜夜爽夜夜爽精| 99激情在线| 99噜噜噜| cao视频,现在观看| 激情内射人妻1区2区3区| 天天操婷婷| 伊人婷婷大香蕉| 色五月婷婷一二| 婷婷五月天激情五月天| 婷婷深爱五月天在线| 婷婷六月色| 五月丁香六月激情综合| www.99久久久久99| 国产九月婷婷| 苗黎美女四级成人版一级二级毛片| 亚洲综合色婷婷| www激情| 欧美色99| 五月天操逼网| 丁香婷婷色五月激情综合| 丁香六月婷婷综合啪啪| 亚洲综合狠狠艹| 国产美女精品| 五月婷婷六月爱| 婷婷婷色五月| 五月天激情偷拍| 久思思久视频| 欧美情月伍月天| 五月丁香| 夜夜夜天天操| 五月天激情综合在线| 91狠狠色丁香婷婷综合久久| 欧美色色色色色| 日本三级日本三级三级人妇四虎| 91视频五月丁香| 人人干女人| 123草逼网| 综合激情在线| 9 1超碰九色| 任你草| 九九国产精视频| 国产色丁香| 久久丁香五月婷婷激情综合网| 再綫Av免费視品| 99人这里只有精品| 国产美女精品| 天天日天天干天天插天天射| 五月草影视| 狠狠干无码| 五月天激情啪啪| 日韩在线视频中文字幕| 色婷婷丁香五月天| 天天日天天爽| 伊人在线视频| 久久久91精品| 性爱五月婷婷| 青青草轻轻操| 综合天天综合| 天天综合.com| 色五月丁香六月婷婷| 亚洲色优| 久久久18| 婷婷五月激情四月综合| 婷婷大美在线| 国产婷婷五月天| 久久九九国产精品怡红院| 丁香六月激情| 99这里有精品视频| 亚洲av| 五月天堂六月丁香亚州中文字幕久久| 五月丁香五月丁香五月丁香五月丁香91| 久久精品夜色噜噜亚洲a∨| 日本一级黄色电影| 五月www| 久久婷婷六月综合| 五月停亭六月,六月停亭的英语| 99日韩| 亚洲岛国电影| 中文字幕丰满人妻无码专区| 综合久久99| 丁香婷婷啪啪啪| 99性爱视频| 丁香九月激情| 色99欧洲色19| 五月丁香婷婷在线| 很操日本7| 99爱视频在线观看| 五月天色五月| 91人妻人人操| 五月天婷婷免费| 五月婷婷这里都是精品| 开心深爱激情网| 色综合天天综合成人网| 91人妻九色大屁股| 影音先锋一区| www.人人操人人看人人想人人摸 人人人人操,COM | 丁香五月 六月婷婷首页| 免费播放片大片| 国产亚洲精品久久久久久郑州| 五月色丁香婷婷综合| 99热啪啪| 99日这里只有精品| 超碰在线成人| 影音先锋一区二区资源站| 99自拍视频在线观看| 人人做天天爱| 五月天婷婷基地| 人人操超碰| 婷婷丁香五月天哟啪| 五月婷婷说| 五月婷婷香| 久久色吧| VA国产在线综合网站| 色停停五月,在线观看| 国产肥白大熟妇BBBB视频| 99久久五月丁香野外| 5月丁香六月婷婷| 99热这里只有精品26| 99热99这里只有精品| WWW,五月| 色色色9 9 9| 狠狠色官网| 丁香六月婷婷综合激情欧美| 99色免费观看全部| 丁香五月1页| 国产密乳av一区二区三区四区| 五月婷丁香| 91碰超| 五月久久丁香| 91九九| 久久婷婷91| 婷婷操婷婷干婷婷射| 精品人妻伦九区久久AAA片| 色色五月天网站| 久久人妻www| 青青久在线视频免费观看| 99热主页日本| 色婷婷久综合久久一本国产AV| 天天日天天爽| 99ri在线观看视频| 丁香成人五月天| 色婷婷综合久久| 五月天·www·com| 99久久9| 婷婷五月天精品| 99国产小视频| 少妇熟女视频一区二区三区| 免费黄色视频网址| 超碰国产在线观看| 99久久偷拍视频| 婷婷丁香亚洲五月天| 国产亚洲色婷婷久久99精品91| 婷久久| 婷婷五月天激情小说| 国产精品成人网址| 婷婷性爱无码视频| 五月婷在线| 婷婷和五月天| 丁香九月婷| 五月综合丁香婷婷| 97色色色| 热996精品在线观看| 亚洲夜夜操| 婷婷五月色播天| 激情小说五月天中文字幕| 成人午夜无码视频| 综合激情伊人影视在线| 色九网| www.91.com黄| 中文字幕,综合,91| 婷婷综合日本| 99精品免费视频| 久热婷婷在线视频| 99精品亚洲| www.1024久久| 人妻无码精品一区| 色婷婷色和| 99爱在线精品视频免费观看| 丁香花狠狠婷婷亚洲中文字幕| 五月丁香六月婷婷手机无线| 一级片操逼视频| 天天干天天干天天干天天干天天干天天干天天 | 色播激情| 99热费观看| 99色.com| 色色99| 人人97碰| 亚洲日日日| 五月天天天综合| 五月婷婷综合在线| 337p午夜影院| 五月天婷婷综合色| 深爱五月网| 9婷婷内射| 超碰在线视屏| 婷婷色婷婷亚洲成人| 五月天婷婷社区| 性小说五月天| 超碰人妻公开在线| 人人人舔人人人操人人人摸人人人97| 玖玖九九9999在线观看视频精品| 国产玖玖资源| 婷婷激情综合色五月久久图片| 婷婷综合视频| 激情综合网丁香| 色婷婷激情| 久久婷婷五月激情网站| 色五月婷婷丁香凹凸| 日本成人噜噜噜| 999精品乱码77777| 天天操综合网| 激情久久天天| 丁香五月婷婷激情中文| 久青操| 五月丁香爱婷婷深深| 亚洲视频一区| www.色色色色| 五月婷婷中文字幕| 五月天社区| 性生活久久人妻| 七七色色综合| 深爱婷婷网| 玖久精品视频9| 婷婷va| 久热大香蕉| 五月丁香婷婷激激激综合网色播| 久久天堂婷婷五月| 99思思| A A色色| 色天使色婷婷| 色婷婷丁香五月| 五月激情六月婷婷| 91综合国免费久入| 丰满老熟妇BBBBB搡BBB | 日本五月婷婷久久久六月丁香| 99日热在线视频| 九色91视频| 婷婷区日本| 岛国操B不卡在线| 99这里| 曰日爽日日操| 色情综合网| 狠狠色综合图片| 亚洲综合五月天婷婷丁香| 千人斩操逼| 激情五月综合第一页| 丁香激情五月| 五月婷婷亚洲色视频| 99在线爽| 天天综合91入口| 乱岳熟女50岁| 五月婷婷丁香| 翔田千里无码| 五月婷婷av| 天天操天天插天天射|