欧美成人午夜精品久久久,国产?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
返回資訊列表
日韩无码色色| 天天搞天天爽| 91seav| 五月天婷婷色| 操逼三区| 五月婷婷深深爱| 六月99天天婷婷激情综合| 婷婷99综合| 噜一噜在线| 9热久久在线| 天天爽天天操| 日日夜夜爽| 欧美精品99| 人妻久久久久久| 丁香五月婷久久| 五月天婷婷综合久久| 婷婷色影音天| 婷婷欧美| 婷婷导航| 99re久久| 99色天堂| 26uuu丁香婷婷五月| 男女久久婷婷五月天| 开心婷婷中文字慕| 日本99视频| 99热国产婷婷| 热99在线精品| 久久婷婷内射| 99re免费精品视频| 五月天社区| 欧美日韩成人在线观看| 在线中文av| 99这里只有精彩视频| 久久这里面只有精品视频| 99久久久久| 97在线/日本| 无码少妇高潮喷水A片免费| 丁香六月情| 久久狠狠干| 六月婷婷开心| 99综合在线| 亚洲熟妇无码乱子AV电影| 五月花亭亭| 国产夫妻操逼内射视频| WWW.夜夜| 六月婷婷综合| 亚洲色五月| 婷婷激情小说| 激情涩播| 91久久九久久九久久九久久九久久 | 91九色精品熟女内射| 色很久综合| 91怕怕网| 26UUU欧美激情一区二区| 激情婷婷丁香色五月| 激情五月天福利| 99久久超级| 99成人精品视频| 丁香色播五月天| 天天综合天天做天天综合| 99久re热视频精品98| 久久艹99| 六月婷婷影院| 成人综合AV| 九九色图| 亚洲综合色成丁香五月色| 久久久国产精品黄毛片| 色色日本欧美| 色色色视频| 天天激情夜夜干| 五月天婷婷丁香蜜桃91| 无码区婷婷五月花开| 色色com| 99毛片| 婷婷久久综合久| 五月天婷婷在线观看| 亚州操人在线视频| 亚洲成人在线观看网址| 五月婷婷激情综合| 六月天丁婷婷| 97色碰| 九色PORNY9l原创自拍| 性做久久久久久久免费看| 天天干天天操天天爱| 亚洲六月色| 女人被男人吃奶到高潮| 91人人人人人| 五月天无码| 丁香5月啪啪| 色偷偷色婷婷| 婷婷色色综合| 亚洲精品色色| 婷婷丁香亚洲色综合91| 黄色录像网点| 激情五月伊人婷婷| 99热在线精品观看| 97在线日本| 色综合色综合网| 伊人婷婷色激情丁香| 狠狠的日| www,黄色在线,con| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 六月99天天婷婷激情综合| 五月丁香成人| 激情五月天视频| 强奸幻女毛片| 久久精品永久免费| 丁香五月色网| 丝袜熟女一区二区三区| 九月影院義母在线播放| 非洲一级AV| 国产成人AV在线| 清色五月天| 色 色 色综合com| 黄网在线播放| 综合久久久| 日操五月婷| 五月色综合| 亚洲日韩乱码一区二区三区四区 | 丁香久久| 五月天社区婷婷丁香社区| 777.色色| 五月天婷婷久久视频| 久久久91精品| 亚洲综合色丁香五月天| 亚洲超碰在线| 婷婷五月丁香综合亚洲 | 色狠狠婷婷| 超碰在线人人| 五月天成人在线播放| 国产特级毛片AAAAAAA高清| 综合九九久久| 狠狠色狠狠操| 丁香五月97视频| 婷婷五月天av网| 激情五月深爱五月观看| 丁香久久综合| 爆乳熟女一区二区三区爆乳| 激情婷婷五月| www久久久久| 91操操操| 婷婷五月丁香图片人人操| 啊V视频在线观看| 色情婷婷五月天| 五月天婷婷色播综合在线| 日韩色色色99| 五月天社区| 午夜婷婷丁香| 狠狠操狠狠爱| 丁香五月另类小说在线阅读| 亚洲国产精品SUV| 九九热黄色| 色色激情五月| 超碰91av| 天天色视频| 8区视频在线| 婷婷五月色播| 五月天天堂久久| 久久只有18视频| 激情 久久 婷婷| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 丁香婷婷在线| 激情五月狠狠喔| 婷婷五月综合在线视频| 久久婷婷超碰| 舔色婷婷| 日韩狠狠色| 中文资源在线a| 婷婷成人在线| 99日在线视频| 亚洲精品操一操、噜一噜、摸一摸、爽 | www.91九色| 亚洲久久日| 久99视频在线观看| 亚洲婷婷在线播放十月| 亚洲va综合va国产va中文| 99婷婷五月天| 青青久久五月| 激情婷婷丁香| 99色综合| 久久五月婷婷综合网| 激情二色月| 婷婷五月性感| 激情九色| 婷婷五月天伊人在线| 婷婷色综合| 婷婷丁香午夜综合影视| 九九99热精品| AV在线大香蕉| 色 丁香婷婷| WwW色婷婷| 色综合久久久久久久久五月| 久啪欧美| 79精品视频在线观看,| 性色欲情 网站| 日日做A爰片久久毛片A片英语| 婷婷中文字幕网站| 亚洲无码yw| 大香蕉啪啪| 五月激情小说网| 丁香六月婷婷开心| 97在线视频 欧美| 久热亚洲| 亚洲色域网| 丁香9月婷婷| 久久婷婷内射| 3p日韩网站视频| 91大神在线免费看视频全集男男一起操| 人人摸人人干| 狠狠色丁香婷婷基地| 超碰免费人人肏| 天天色99| 久久99热精品a片在线观看| 九色1区视频在线| 国产综合婷婷| 影音先锋 婷婷| 美女91一起草| 老师的粉嫩小又紧水又多A片视频| 丁香五月婷在线| 婷婷伊人75| 色丁香五月婷婷| 五月天激情久色| 亚洲无码yw| 五月天大香蕉| 操逼巨乳91| 99精品这里只有免费视频| 99视频综合网| 97色色网| 91久久1118| 99热九九在线| 五月天国产成人| 超级碰碰视频无码| 丁香8月手机综合| 黄网免费看| 天天日夜夜草进麻麻的子宫| 丁香五月婷婷激情网| 久99999热视频在线观看免费| 五月天婷婷伊人| 一本久久婷婷| 色色色色综合网| 性爱视频99| 婷婷综合五月激情| 人人爱操| 大香蕉婷婷久久| 超碰日韩成人| 欧洲色区| 大香蕉九九| 国产激情在线| 欧美成人网99网| 99热在线99| 五月天激情四射网站| 丁香五月婷婷天激情| 九九色影院| 九九热视| 午夜婷婷五月天| 99热国内| 日本狠狠爽| 激情久久综合| 91九色|疯狂|高潮|对白|| 色婷婷影视99| www.韩日视频| 99久久国产综合精品五月天喷水\| 99热97| 婷婷五月成人| 天天综合精品| 五月婷婷丁香五月| 色婷婷综合影院| 婷婷五月天六月| 好好日激情五月天| 婷婷五月欧美综合| 90色免费视频| 久热re视频在线观看网站| 人人草人人舔| 开心五月天激情网| 婷婷伊人网| 99在线热| 久色视频| 99久久久久| AV大香蕉| 热九九精品| 久久婷婷五月天懂色| 免费看成人747474九号视频在线观看| www.夜夜操.com| 女高怪谈在线观看| 一级二级色大片| 丁香五月激情婷婷婷婷在线观看| 狠狠草狠狠草| 婷婷色导航| 夜夜骑天天操| 婷婷九月激情| 五月色网| 国产亚洲精品久久久久久久久动漫 | 婷婷色丁香五月| 狠狠色丁香婷婷基地| 月婷婷亚洲| 狠狠色性| 国产精品婷婷午夜在线观看| 九九热精品视频| 五月激情五月婷婷五月天在线| 一区二区三区四区无码| 久99久热| 久久久久久欧美精品se一二三四| 亚洲九九免费| 天天天天天天天操| 日本婷婷| 色五月婷婷久久| 亭亭玉月丁香| 婷婷97色| 国内久久久精品99| 九九蜜臀精品| 欧美成人精品一区二区| 国产9色在线/日韩| 五月开心网| 中文字幕免费高清电视剧| 成人.在线日韩| 九月丁香网婷婷| 日本欧美999久久久三级片| 婷婷色情五月| 婷婷欧美激情综合| 九九精品在线观看视频6| 怡红院一二三| 精品久久人妻| 拍色综合| 九九热这里只有精品5| 色综久久久| 激情激情激情网| 99亚洲精品视频| 六月婷婷av| 色色婷婷丁香| 99色久| 99自拍视频| 97色伦另类图片小说视频| 中文字幕色色| 午夜一区| 婷婷五月丁香色综合| 这里只有精品亚洲| 五月综合婷婷五月| 丁香五月AV| 91精品国产色猫| 美日韩成人| 日日操,天天操| 色婷婷综合影院| 婷色五月天| 国产一级黄色影片,| 日本97在线视频| 无码G高清天| 久草热在线视频| 色色色网站| 91热在线观看视频| 色婷丁香五月| 婷婷五月丁香啪啪| 天天操天天国产三级片处女学生妹| 久久狼人天堂| 天天婷婷| 丁香五月婷婷国产av| 久99久在线| 五月综合婷婷久久在线| 色色色热| 婷婷综合视频| 亚洲第79页| 日韩一级片| 日本免费91| 丁香五月婷婷成人网| 亚洲超碰在线| 99综合熟女| 激情五月天无码| 激情五月天综合网| 丁香五月ⅤA久久久| 久久五月视频| 91ncom.色| 色情网综合| eeuus五月婷| 神马欧美精| 亚洲AV成人在线观看| 婷丁香久综合| 思思热99热| 久热久操久热久草国产91| 五月婷婷开心六月激情小说| 成人综合网站| 日韩一区二区在线播放| 色播综合| 变态另类9| 五月丁香六月综合激情无码软件亮点| 天天激情站| 另类综合激情| 婷婷五月天激情小说| 久操热线| 天天操无码| 久久9RE热视频精品98| 国产精品久久久久久五月天加勒比| 五月丁香六月激情在线| 婷婷五月大| 久久99视频| 丁香玖玖| 97九色视频| 九月av在线| 午夜做爱影院| av在线观看网址| 久99热| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 色五月无码| 免费黄色视频网址| 久久丝丝热| 开心五月婷婷激情| 桃色五月婷婷| 丰满老熟妇BBBBB搡BBB| 色婷婷在线综合色播网| 香蕉久久av一区二区三区| 久久婷婷丁香五月一二三| 亚洲99综合| 99九九综合久久九九| 中文资源在线a| 好看的国产精品| 另类图片激情五月| 丁香婷婷啪啪| 国产做爰视频免费播放| 激情伊人五月婷婷久久| 激情婷婷激情在线不卡| 开心激情婷婷| 狠狠综合网| 人人摸人人搞| 五月丁香久久久日婷婷久久婷婷日| 九九热精品在线| 五月色丁香婷婷中文字幕| 天天碰夜夜操| 五月天激情国产综合婷婷| 免费观看2018www黄色操逼网站| 国产午夜一区二区三区| 丁香五月婷婷av| 91九色在线| 人人色人人摸人人看| 五月激情在线| 五月丁香亚洲婷婷| 99色综合网| 亚洲天天| 天天干天天干天天干天天干天天| 超碰人人妻| 综合伊人久久| 五月婷无码| 九九色网| 操碰99| 婷婷五月成人有| 一级黄在线| 日日夜夜狠狠操| 9|无码久久久久久| 五月天综合在线网| 午夜婷婷久久| 好吊丝aV| 婷婷五月天综合AV| 无码99| 五月天久久丁香| 久久婷婷五月天激情四射| www.久久| 五月天色婷婷伊人网| 精品久久婷婷| 无码人妻丰满熟妇奶水区码| 2025天天日爽| 另类图片五月天婷婷| 97操男人的天堂| 综合色99| 色永久| 91狠狠综合久久久| 超级久久久| 亚洲丁香花色| http://www.sd-xiangsu.com/| 青青草色在线视频观看| 久久桃花网色婷婷| 日本色色网| 蜜臀嫩草| 99热 在线观看| 99热99思午夜精品| 99色综合| 久草A片| 五月丁香六月情亚洲| 黄色激情久久| 九九色video| 五月天婷婷无码| 久久这里只| 婷婷5月色| 另类视屏| www.91AV.com| 男女啪啪做爰高潮无遮挡| 欧洲亚洲免费视频9| 婷婷夜夜夜夜| 九九免费视频在线| 欧美熟女99| 亚洲综合视频八| 久久婷婷伊人| 99精品久久久久久久婷婷| 国模淫穴色图| 人妻五月天激情开心网| 日韩操人| 色色五月天婷婷丁香| 亚州在线中文字幕| 日日日日日| 成人免费在线电影| 婷婷五月综合网| 日本婷婷激情四射中文字幕在线观看| 久久机热/这里只有精品| www,婷婷| 另类图片婷婷五月天| 色色日韩网| 丁香五月综合久久综合| www.婷婷激情网.com| 9+1视频网址| 影视av久久久噜噜噜噜噜三级| 亚洲色综合性| 色婷五月天网站| 国产乱码久久| 色愛综合网| 9久国产| 超碰永久在线| 波多野结衣成人作品在线| 强壮公让我夜夜高潮A片视频| 婷婷五月天久久| 五月丁香六月激情在线| 五月第四色| 噜噜噜精品欧美成人在线观看| 五月天婷a在线| 五月激情综合网| 怡红院91a√| AV中文字幕夜夜操b天天摸bb | 久久婷婷内射| 久久伦乱| 大香蕉久艹| 九九精品热播| 操操人人| 久久久网站| 91色噜噜狠狠狠狠色综合| 色综合99| 色色婷婷丁香| 久久婷婷六月综合| 99热综合在线| 五月天另类综合网| 五月综合亚洲婷婷| 这里只有精品在线免费视频| 3www激情| 色色色色色综合| 狠狠插狠狠插| 国产97色在线 | 日韩| 激情无码网| 亚洲AV网址| 丁香五月婷婷av| 九热精品| 丁香五月性| 嫩草AV久久伊人妇女超级A| 五月婷婷色| 亚洲精品V天堂中文字幕| 国产欧美精品AAAAAA片| 五月天啪啪网| 五月婷婷七月丁香| 色综合色| 五月丁香婷婷久久| 久久九九蜜| 五月丁香免费看| 女人天堂AV| 婷婷涩五月| 99免费在线视频| 亚洲精品字幕在线观看| 久久久久久久久18久久| 五月天欧美激情| 91在线精品一区二区| 丁香五月九九| 国产亚洲99| AV美美午夜| 亚洲国产色色| 91人人爽狠狠狠| 丁香五月激情啪啪| 亚洲视频在线观看区| 骚五月婷婷| 99这里只有精品视频免费| 婷婷五月天Av| 色色性爱视频| 久久九九国产精品怡红院| 亚洲久久婷婷| 日本爆乳片手机在线播放| 狠狠色婷婷777| 中文字幕乱码亚洲精品一区| 免费成片在线观看| 色色色色色热| 五月花综合视频| 久久久91| 性爱激情久久| 色人久久| 激情五月天色婷婷| 亚洲天天| 97超碰9久热婷婷热| 婷婷综合久久| 久久婷婷六月综合| 久久人人妻| 色婷婷狠狠禁久久| 色噜噜狠狠色综合伊人| 天天干 夜夜爽| 99色在线| 涩涩婷婷五月| 婷婷四色五月| 大香网伊人久久综合| 婷婷综合婷婷| 激情婷婷五月久久| 99色| Aaa久久| 91操碰| 色吧五月婷婷| 人妻体体内射精一区二区| 99久热精品在线| 天天插天天很| 五月天婷婷基地| 色婷婷色丁香色欲av| 婷婷五月综合婷婷| 91免费看片| 春色激情| 亚洲激情无码久久| 99热老网站| 九九色黄色| 五月花婷婷在线精品视频| 开心婷婷五月| 天天在线XXX| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 五月天成人免费视频| 成人片黄网站色大片免费毛片| 任你爽精品免费视频6| 色狠狠色噜噜噜a天堂一区| 狠狠狠狠狠狠| 色综合久久综合中文综合网| 五月婷av| 天堂美国久久| 天天操夜夜玩!| 99热这里全都是精品| 激情婷婷五月少妇| 开心激情五月天网| 秋霞九九无码| 久久精品永久免费| 中文字幕丰满孑伦无码专区| 五月丁香 六月婷婷a| 色99日韩| 第五婷婷伊人丁香色| 亭亭玉月丁香| 日韩无码性爱| 天天狠狠夜夜狠狠2023| 亭亭丁香97| 天天色综合综合| 天天射网站| 这里只有精品日韩精品| 九九热精品| 女性自慰系列第五页| 丁香婷婷六月天| 国产精品色婷婷久久久精品| www.色五月| 欧美激情伊人| www.9797国产| 人妻AV在线观看| 五月婷婷人人人操| 天天草天天爽| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 久久五月天激情视频| 大香蕉九九| 六月丁香五月激情亚洲AV| 日韩AAAAA| 国产亚洲精品人人| 无码色| 婷婷舔| 人人摸人人操人人爱| 天天综合.com| 日韩99无码| 五月久久丁香| 在线99精品| 91狠狠色色丁香婷婷综合久久| 成人免费在线电影| 婷婷五月天AV| 99热无码精品| 激情图片亚洲| 四月丁香五月婷婷久久| 激情文学第四色婷婷丁香五月| 亚洲性视频| 色综合丁香| 激情六月婷婷| 开心五月婷婷激情网| 99超碰欧美| 第五色色色婷婷| 在线观看免费狠狠色丁香香综合| 五月婷色色| 99这里有精品免费| 嫩草免费视频| 六月婷婷视频| www.天天干.com| 国产高潮A片羞羞视频涩涩| 99er6热在线观看精品6| 热99在线精品| 97精品综合久久| 丁香五月综合亚洲| 人人干99| 国产成人一区二区三区在线观看| site:feetmall.com| 日韩无码人妻一区二区| 色久天| 欧美va| 色九九九九| 久久这里只有精品5| 大香蕉久久青青| 五月天网站免费欧美| 亚洲中文字幕av| 久久97久久99久久综合欧美| 亚洲综合另类| 黄涩毛片| 激情人妻综合| 人妻熟人中文字幕一区二区| 操逼巨乳91| 袁子仪视频观看| 丁香五月 无码| 这里只有精品免费视频| 天天综合网网欲色| 色色婷婷五月| 一起操 91N.com| 五月丁香偷拍| 99精品视频免费| 高清无码.com| 成人网页在线观看| 欧美搡BBBBB摔BBBBB| 丁香婷婷激情五月天无毒不卡蜜桃| 欧美A级网站| 五月天大香蕉视频| 国产精产国品一二三在观看| 色五月成人| 最新激情五月天| 91人操人人人操人| 开心色色五月天综合| 六月激情婷婷| 欧美成人色婷婷| wwW天天干| 婷婷色操| 7777久久亚洲中文字幕| www.丁香五月| 欧美激情综合色综合啪啪五月| 婷婷五月天伊人网在线观看视频| 大香蕉九操| 五月刺激丁香月综合| 婷婷中文字幕| 97人人超| 婷婷久久五月天| 区区欧美你爱| 97丁香五月天| 99精品在线播放| 五月丁香婷婷婷激情爱爱| 五月网在线| 欧美色色色色色色色色色色影视| 九洲一级A片| 天花AV无码| 婷婷色色网站| 精品国产AV色一区二区深夜久久| 天天摸天天肏| 婷婷 丁香 精品| 丁香婷婷在线| 婷婷五月天日日日干干干| 天天做天天视天天谢| 天天搡日日搡aaaaⅩ| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 亚洲av成人在线| 思思久久精品| 直接看的AV| 天天免费日日夜夜夜夜| 五月婷婷开心激情六月蜜桃| 丁香九月综合| 五月婷婷黄色| 婷婷丁香成人| 激情九月综合| 丁香五月中文字幕| 色九月婷婷综合| 色色色在线观看| 91久久九色| 亚洲在线成人| 毛v一区二区视频| 97婷婷久久丁香| 九九色黄色| 超碰妻人人| 婷婷五月天国产性感美女演员久久久久| 夫妇交换刺激做爰| 日本熟妇乱妇熟色A片蜜桃| 九九色色| 粉嫩AV久久一区二区三区| 99熟女| 欧美大肥婆大肥BBBBB| 99∨VTV| 国产成人精品亚洲线观看| 99热超碰在线| 日本少妇裸体做爰高潮片| 免费无码毛片一区二区A片| 麻豆AV一区二区三区| 99久久国产宗和精品1上映| 成人片黄网站色大片免费毛片| 久热婷婷| 超喷97免费在线视频| 亚洲综合五月天婷婷| 天天干天天日蜜臀av| 91免费试看| 亚洲激情五月| 五月丁香成人| 五月婷婷在线视频免费观看| 99人这里只有精品| 99爱免费视频在线观看| 99热这里只有精品搜| 日婷婷久久开心| 九九热大香蕉| 在线只有精品| 白人荫道BBWBBB大荫道| 琪琪狠狠干| 日韩综合久| 五月丁香999| 中文字幕+乱码+中文字幕在线观看| 人色五月天婷婷| 婷婷六月情| 香焦网五月天| 五月婷婷综合视频| 涩丁香| 丁香九月激情久久| 婷婷五月激情网| 天天模,夜夜模夜夜爽| 久热A| 色色激情网| 五月婷在线| 九九99偷拍视频| 日本三久久| 婷婷丁香五月视频| 天天干天天干天天操| 超碰99在线观看| 亚洲亚洲人成综合网络| av操一操| 五月丁香在线视频观看| 日韩精品无码99| 91在线日| 久久久久久五月天| 色吧婷婷| 婷婷一本和五月丁香| 久久机热/这里只有精品| 欧美丁香婷婷五月| 综合网精品99| 任你爽视频| 国产另类综合| 99热99干| a毛片二逼wwwwwwwwww| 久操无码| dingxiangtingtingliuyue| av在线观看网站| 欧美性生交XXXXX无码小说 | 久久99热这里只有精品 | 日韩熟女啪啪视频| 久久久婷婷婷| 噜噜色com| www.天天日| 色五月婷婷天堂| 国产精品久久99| 婷婷五月天开心网| 99只有精品| 亚洲午夜Av| 天天艹天天色| 五月天色图| 久久色吧| 婷婷色天香| 99热新网址| 北条麻妃伊人 | 久久人妻熟女一区二区| www.久久久久久久| 婷婷射婷婷舔| 六月婷婷激情| 操久久网| 五月婷婷激情综合av| 思思re最新视频| 免费AAAAA网| 操逼三区| 碰久久精品w| 天天做天天干天天综合网| WWW久久久| 色综合香蕉视频| 青青福利网| 六月丁香婷婷亚洲中文玖玖| 色五月综合在线| 久久综合网桃花| 久久99久久99精品免观看软件| 可以直接看的av| 激情无码网| 婷婷日日夜夜| 国产免费性爱| 99激| 97碰在线视频| 99ri精品视频在线观看| 欧美成人日韩| 成人VAV视频在线观看| 久久只这里有精品| 99国产精品白浆在线观看免费| 超碰在线视屏| 久久综合影院| 色色色9 9 9| 婷婷五月天激情基地| 激情综合网激情五月俺也去| 99热国产国产| 狠狠操天天干| 色情五月丁香婷婷网| 亚洲五月天婷婷| 9|无码久久久久久| 丁香五月欧美激情| 99碰网站| 五月天激情四射网站| 玖玖99精品视频| 成人免费va| 91精品综合久久久久久五月天| 天天狠狠色综合| 91人妻九色大屁股| 婷激情五月| 激情AV综合| 亚洲五月天婷婷在线| 伊人网色婷婷五月天| 日本性激情色播| 久cao香蕉影院| 9久热这里只有精品| 爆乳熟妇一区二区三区四区| 天天久久综合| 超碰97在线观看免费| 热99热9| 日本高清不卡免费一区二区三区| 天天摸天天日天天舔| 99精品丰满| 五月天六月婷婷| 99噜噜噜| 午夜爱爱网站| 日本高清久久| 人妻久久久| 天色综合网站| 亲子乱AV-区二区三区| 欧美人妻一区二区| 五月婷久久草| 五月丁香综合啪啪| 久久婷婷丁香五月一二三| 五月婷婷激情综合| 婷婷爱婷婷| 久久色吧| 91九色国产| 凹凸7777操操操| 天天碰夜夜操| 激情五月天婷婷丁香| 五月丁香色婷婷久久| www.久久| www.爱操com.| 亚洲123区高清入口| 99视频在线精品| 久操热| 农村熟妇高潮精品A片| 九九热视频免费| 亚洲另类av| 五月丁香黄色视频| 五月丁香AV、伊人业余、性色熟妇| 丁香六月丁香婷婷激情| 丁香五月人妻| 欧美色色色| 国产精品久久久久久喷浆| jiqingliuyuetian| 国产1区2区3区| 色婷婷激情| 天天日日夜夜爽。| 在线另类视频| 免费看欧美成人A片无码| 六月婷婷九月丁香亚洲综合| 97久人人| 久久久国产精品黄毛片| 丁香狠狠色婷婷久久无码视频| 五月丁香琪琪| 无码人妻丰满熟妇奶水区码| 99这里只有精| 99在线精品视频免费| 九九九激情网| 婷婷五月激情欧美| 婷婷在线操| 99人人精品| 五月天大香蕉| 天天操婷婷| 六月丁婷婷| 99九精品| 粉嫩AV久久一区二区三区| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | ...婷婷五月综合不卡,国产在线手机 | 操人91| 人妻精品久久久久久| 五月婷婷激情| 丰滿爆乳一区二区三区| 久久久8| 丁香五月激情视频| 人妻性爱av网站| 在线日韩av| 丁香久久| 婷婷五月丁香综合激情| 人人看人人草人人摸| 色射影院| www.一起草av| 色欲一区二区三区精品A片 | 婷婷丁香综合| 性爱AV天堂| 69色婷婷| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 日本颜色视频人人爱| caopeng超碰| 99在线资源| 亚洲人成网站999综合| 久热九九| 婷婷五月综合久久中文字幕| 五月丁香六月香综合激情| 欧美成人Va| 无码髙清| 九九伦子片| 中国女人做爰A片| 色色综合网站| 99热都是精品| 婷婷十月丁香| 亚洲天天免费| 99小视频| 九九色色色| 狠狠色综合网站久久久久| 国产肥白大熟妇BBBB视频| 日韩aaaaa| 99在线视频精品| 婷婷五月天开心网| 99精品在线下载| 久久亚洲色导航| 久久综合激情| 五月天丁香成人社| 久久婷婷五月综合色天| 在线播放人妻| 图片区 小说区 区 亚洲五月| 五月香婷婷| 超碰99资源站| 色情成人五月天| 天天综合亚洲| 日本五月视频| 六月丁香婷婷开心综合基地| 《战争与艾拉》完整版| 丁香九月婷婷| 9久久精品| 欧洲不卡视频| 97碰碰在线看视频免费| www91在线| 成人短视频在线免费观看| 俺去婷婷 丁香| 日韩啪啪视品| 五月精品99综合| 狠狠色综合五月人人| www.色五月| 大战熟女丰满人妻AV| 日本欧美成人片AAAA| 人妻少妇色综合| 五月婷婷综合在线| 色婷婷狠狠| 操人无码| 欧美成人精品A片免费一区99| 五月婷婷激情| 乱岳熟女50岁| 国产成人精品亚洲线观看| 欧美人与性动交CCOO| 日本乱子人伦在线视频| 国外亚洲成AV人片在线观看| 欧美人与性动交CCOO| 亚洲人妻av伦理| 无码激情AAAAA片-区区| 无码成人AAAAA毛片AI换脸| 色色欧美色色色| 久久婷婷超碰| 激情五月天福利| 怡红院91a√| 欧美日比视频| 99热伊人| 久久精品国产色| 色婷婷丁香五月天激情综合网| 69激情小说| 这里精品| 97se视频在线| 开心激情五月天网| 五月丁香综合激情| 激情四射亚洲| 偷偷操九九| 97干网站| 六月丁香成人| 五月天婷婷黄色| 婷婷丁香18| 91人人爽狠狠狠| 操91| 黄色av网站在线免费播放| 色原狠狠综合| 综合网色| 精品无码人妻一区| 国产五月天欧美色| 成人五月天丁香| 97婷婷色| 五月丁香另类网| 亚洲婷婷丁香| 久1色色| 丁香五月婷婷色偷偷| 激情人妻综合| 大香蕉综合网| 日韩久久日| 大香蕉五月婷婷| 色月视频| 日韩AV在线免费观看| 大香蕉啪啪| 狠狠色情婷婷| 天天爽夜夜爽夜夜爽精品视频 | 天天爽天天草| 五月丁香91| 熟女人妻视频| 色播五月天婷婷老师| A一级操| 五月婷婷激情综合网 | 丁香婷婷欧美综合| 性天堂久久| 丁香婷婷五月天色播| 免费亚洲婷婷| 婷婷色综合| 欧美激情伊人| 99色看这里只有精品| 5月婷婷6月六月丁香| 91chinese在线| 丁香亚洲色综合| 天天色综合天天| 五月天色婷婷伊人网| 五月天激情四射| 色香蕉婷婷| 久热九九| 亚洲成人噜噜| 五月天国产| 激情综合婷婷久久| 久久网站观看免费欧洲国产 | 99视频这里有精品| 殴美97色| 无码一区二区三区四区五区| av狠狠操| 日本精品人妻无码77777| 九九人人精品| 婷婷五月激情在线| 五月花免费视频| 综合网色综合| 97涩涩丁香五月天| 久久九九爽| 激情五月天婷婷丁香| 丁香五月天人体| 久久激情五月天| 五月婷九九草| 米奇激情婷婷| 激情综合亚洲| 婷婷成人在线| www色中色综合| 国产成人精品一区二三区熟女在线| 九九免费在线视频| 9久久久久久久久久久| 高清a片基地| www.夜夜操.con| 欧美 日韩 成人 在线| www.99操| 激情五月婷婷欧美极品| 日韩成人AV在线| 色婷婷影视99| 深爱激情五月天婷婷网| 激情五月丁香婷婷| 色欲九区| 99热只有| 欧美日韩色色| 久热最新视频| www.99在线| 在线色色| 激情六月天婷婷| 色综合色综合色综合| 久热视频这里只有精品68| 婷婷五月影院| 五月婷婷啪啪| 伊人激情综合网| www热久久yy9| 综合网亚洲| 婷婷字幕在线| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 激情亚洲色图片丁香综合| 99久在线精品99re8| 久久色情| 四虎成人精品永久免费AV九九| 999久久久国产精品| 五月天国产婷婷精品视频在线| 极骚大香蕉伊人| 成人网站免费sxj| 丁香婷婷综合激情五月色| 五月欧美色播| 99精品视频免费观看| 色婷婷成人| WWW,五月| 久久免费精品小视频| 热九九精品| 色综合激情| 99无码视频| 婷婷九月丁香| 五月丁香婷婷综合| 国产成人+综合亚洲+天堂| 996er热| 91超碰人人操| 五月丁香婷婷六月| 丁香婷婷人妻| 激情深爱五月天| 亚洲精品乱码久久久久久综合| 日韩婷婷| 狠狠五月天婷婷| 欧美槡BBBB槡BBB少妇| 天天干天天操天天上| 性爱激情五月| 婷婷情色激情| 东北黄色一级| xx久久| 91一起操| 久久伊人五月天| VA国产在线综合网站| 操人妻AV| 夜丁香五月婷婷| 丁香花操逼| 99操无码视频观看| 激情久久久| 五月丁香六月婷| 亭亭五月天黑人2014| 婷婷狠狠爱| 欧美日韩成人在线网站| 激情九月综合| 色九区| 狠狠干思思热| 99玖玖人人| www婷婷| 亚洲在线激情婷婷五月| 色综合久久久无码中文字幕999| 天天干天天射色综合| 婷婷成人AV| 五月色婷婷综合| 99热这里只有精品23| 激情婷婷22月间| 五月 激情视频| 97亚洲色 torrent magnet| 人妻内射一区二区在线视频| 色婷婷五月天天天干天天操天天爽| 五月婷婷亚洲色图| 99国产在线| 99精品在线下载| 久热亚洲| 亚洲免费看片| 天天摸人人摸| 日韩成人无码人妻| 97在线观视频免费观看| 99性视频| 在线日韩视频| 婷婷五月天性色| 丁香 久久| www..com色爱| 五月婷婷色色网址| 婷婷六月色| 九九热精品6| 91狠狠综合久久久| 99riAV成人在线视频| AV操逼网| 激情激情激情网| 91成人看片| 亚洲春色奇米影视| 影音先锋91| 婷婷五月天AV激情| 天堂爱啪啪| 天天插天天插| 99热在线看片| 青青草护士中出内射-欧美电影在线天堂新版| 伊人热婷婷| 欧美经典片免费观看大全| 天天爽天天|