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
返回資訊列表
思思热99er| 婷婷五月情| 大香蕉综合| 777丁香六月青青草婷婷综合久月 五月丁香综合伦理片 | 91久久久久久久| 婷婷丁香九色| 天堂成人A片永久免费网站| 九月婷婷丁香| 热久久思思热思思| 丁香六月婷婷激情综合| 蒲京久久无码视频| 久久精品凹凸分类| 色日本颜射| 99操久久| 婷婷五月丁香啪啪| 久久五月天视频| 79色色| 思思热国产视频| 久热久色| 九月av在线| 午夜69成人做爰视频| 五月丁色AV| 色九四色| 一区无码| 一婬一伦一区二区三区| 99热官网| 亚洲色无码A片一区二区麻豆| 五月天激情亚洲| 五月婷婷激情四季| 色五月开心五月激情五月| 内射人妻视频国内| 日本不卡一区二区三区| 久久xxxx| 97天堂| 久久金品黃色| 国产.亚洲.欧洲视频在线| 激情伊人| 久久激情网| 国产综合婷婷| 婷婷激情五月综合| 亚洲五月天天| 五月天激情av| 在线成人视频免费| 99热6精品| 91热在线| 免费精品99| 26UUU精品一区二区| 99久久成人| 五月天亚洲最大成人| 五月丁香婷色| 久久五月网| 九九色色网| 久Se视频在线观看| 欧美婷婷丁香五月社区| 操人精品| 婷婷成人网五月天| 婷婷丁香五月天小说| 91青娱乐青青草| 中文字幕不卡视频| 婷婷五月色情天| 色噜噜夜夜夜综合网| AA片在线观看视频在线播放| 26UUU精品一区二区| 婷婷婷婷婷婷婷五月丁香| 国产亚洲精品人人| 99性爱视频网站| 色五月丁香伊人五月| 五月婷婷在线视频免费观看| 婷婷香香五月| 天天干天天操天天上| 五月婷婷六月天| 九九热超碰| 777久久综合视频| WWW.桔色成人.COM入口| 婷婷瑟五月天久久综合| 久久久久综合激动五月天| 色五月婷婷色| 五月天色视频| 亚洲操b| 丁香六月婷婷久久综合| 成人美女网| 国产,欧美,日韩,性爱| 久久99热免费| 婷婷色导航| 日韩成人中文字幕| 黄色激情网站在线观看| 99久久婷婷综合| 另类丁香综合| 婷婷五月丁香五月天| 夜夜操夜夜爽| 日本一级特黄大片AAAAA级| 九九这里都是精品| 欧美黑人巨大性生话| 99久久久| 天天色99| 欧美综合激情五月天| 五月天色婷婷图片| 婷婷五月天精品| 亚洲情综合五月天| 亚洲国产精品成人免费一区久久久在线观看AAAA | 五月婷婷无码专区| 久久久激情| 香蕉人妻AV久久久久天天| 免费黄色片子| 91色综合网| 26uuu国产精品| 综合五月网| www.婷婷五月.com| 六月色色婷婷| 五月婷婷丁香| 91婷婷在线| 天天日夜夜操五月| 99久久久99久久91熟女| 亚洲丁香花五月丁香花| 91嫩草国产线观看亚洲一区二区| 五月丁香 狠狠爱| 久久久91| 青青草轻轻操| 久久性刺激| 激情综合网亚洲色图| 狠狠操狠狠狠| 成人.在线日韩| 色情丁香五月婷婷精品| 白天AV月月| 亚洲无码另类| 97色啪| 狠狠狠五月婷婷六月丁香| 久久久精品色| 亚洲色五月婷婷| 欧美天天五月丁香免费观看| 激情婷婷丁香| 极品另类| 五月激情婷婷综合| 全高清无码视頻| 婷婷综合精品视频97| 人妻久热| 五月丁香婷婷中文| 99欧美| 久久宗合影| 久机视频这只有精品| 国产.亚洲.欧洲视频在线| 婷婷午夜天| 亚洲久久日| 色色哒五月婷婷六月丁香| 激情综合五月| 强伦轩人妻一区二区电影| 婷婷五月成人有| 色色色色色色色色综合网| 91肏肏肏| 久久免片| 婷婷无码视频| 婷婷综合五月天| 丁香六月婷婷缴情欧美| 国产综合色婷婷精品久久| 99精品在线播放| 伊人婷婷青青cao| 亚韩在线视频| 亚洲婷婷月丁香五月| 日韩99色99| 色99xx| 五月丁香婷婷激情澎湃四射| 亚洲精品久久久久AV无码| 人人草碰| 超碰色综合| 久婷久婷| CHINESE熟女老女人HD视频 | 五月婷婷色情| 熟女国产在线一区二区三区四区| 涩涩网五月天| 亚洲av午夜精品一区二区| 丁香亭亭久久| 91呦呦呦| 久99视频在线观看| 色播五月天天| 激情五月婷婷五月| 婷婷综合色| 日韩啪啪视频| 五月亭亭综合五码| 色五月激情| 狠狠干综合| 丁香5月啪啪| 20253AV| 五月丁香免费看| 天天肏天天肏天天肏| 热99只有精品| 日本久久人人| 色五月丁香com| 51国精产品自偷自偷综合| 最新无毒无码AV| 26uuu欧美日本| 六月色激情| 97色色婷婷| 99爱免费在线视频| 国产 码在线成人网站| 91日日日| 五月丁香成人版| 欧美婷婷丁香五月| 91九色最新视频| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 激情影院丁香五月| 亚洲激情婷婷| 天天碰天天插天天操| 99热这里只有精品9| AV中文在线| 亚洲12p| 午夜大香蕉| www.狠狠干| 欧美 日韩 成人| 激情99| 欧美色频| 日日.c| 99re思思热在线视频| 久久激情五月| 99在线观看精品| 开心五月婷婷在线视频免费观看| 婷婷五月色亚洲| 99碰网站| 91av视频在线观看最新网址| 五月婷婷深深爱| 五月色丁香| www.99色在线| 色色色五月天婷婷| 色婷婷五月天| 五月丁香黄色视频| 天天摸天天肏| 91婷婷色 | 九九色热| 五月丁香婷婷激情澎湃四射| 超碰九色| 丁香五月日韩| 大香蕉婷婷丁香天堂AV| 婷婷香蕉精品| 99热网精品| 激情婷婷| 大香蕉久| www.狠狠| 五月婷在线| 超碰色综合| 桔色成人在线| 亚洲色频| 久大香蕉| 婷婷久久五月| 色播五月网| 91丨九色丨丰满人妖| 26uuu欧美| 深爱激情综合网| 无码一区二区日韩| 五月婷婷av| 亚洲av电影在线| 五月色综合| 五月天婷婷小说| 思思99re这里只有| 琪琪理论片| av在线免费网站 | AV网址大全在| 在线视频九色97| 六月综合婷婷开心伊人| 丁香五月在线观看完整版| 亚洲在线成人| 婷婷五月丁香四射| 婷婷香蕉精品| 九月婷婷在线视频| 成人免费黄色短视频| 五月婷婷之综合激情| 99re热99| 国产在线黄色| 夜夜爱网站| 99性感视频| 天天免费成年人视频| 久久日本wwww色| 精品夜夜澡人妻无码AV| 综合色影院| ji'qi'luan'ren'lun| 亚洲旡码| 狠狠五月天| 思思热在线精品视频| 九九99久久| 97资源欧美日韩大香蕉超碰一区| 综合久久五| 99热| 婷婷综合性爱网| 五月天偷拍| 色色国产| 六月婷婷激情| 曰韩五月丁香色婷婷无码| 99啪啪网| 另类天堂| 日本一级一级一级一级| AAA久久| 色天堂A| XX久久| 色99热| 激情av在线| 色九九九九| 激情久久久久久久久久| 2025年最新亚洲在线欧美| 久久婷婷五月综合| 二人电影免费版在线观看| 人人操人人看97干| 色婷婷伊人| 天天操中文字幕| 九九色大香蕉| 五月天激情综合首页| 综合激情专区| 九九综合九九| 天天日日人| 激情五月激情综合网一级丸片| 91ncm视频| 婷婷欧美综合| 五月丁香婷婷久久| 九九性视频| 丁香五月成人av| 97超碰婷婷五月天| 色涩影院六月丁香| 色五月婷激情| 99精品在线观看| ...婷婷五月综合不卡,国产在线手机| 丁香五月aV| A在线观看| 99在线视频。| 情五月亚洲婷婷| 色爱综合网| 一区二区三区四日本| 婷婷伊人五月天| 免费亚洲婷婷中文字幕| 另类激情五月| 五月婷婷综合在线| 丁香婷婷六月激情文学| 成人色色视频| 狠狠久久婷五月综合色| 操日视频| 91麻豆国产三级精品福利在线观看| 91碰视频| 五月综合激情网| 色婷婷五月天成人网| 激情啪啪五月天| 99操逼| 678五月丁香亚洲综合| 色黑鬼导航| 日本激情综合| 青青草五月天| 人人操女人| 精品无码av丁香五月激情| 丁香六月久久| 婷婷五月美女直播| 五月香婷婷| 亚洲综合碰| 成人在线日韩| 亚洲最大激情无码| 少妇性按摩无码中文A片| 色狠狠色噜噜AV天堂五区| 色情综合| 森林影视大全,最好看的2019年视频| 亚洲舔观看| 婷婷免费视频| 婷婷的五月天另类视频| 婷婷久久18| 色色无码日韩| 91狠狠色| 成人啪啪色婷婷久| 国产乱妇乱子伦| 99久久9| 伊人影院久久网| WWW、日本色丁香co m| 千人斩操逼| 亚洲成人网站在线播放| 天天日天天插| 丁香五月综合高清在线| 五月丁香六月婷婷手机无线| 久99久精品| 婷婷五月天综合小说网| 大香蕉久艹| 97韩国久久电影院| 男女啪啪做爰高潮无遮挡 | 九九视频在线观看| 91视频一起草| 亚洲激情网| 久久色六月| 亚洲精久久| 99热97| 婷婷综合丁香| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 四色99久久| 午夜不卡久久精品无码免费| 97操男人的天堂| 久久久久综合激动五月天| 国产婷婷五月天| 大香蕉九九| 狠狠爱激情网| 天天搡日日搡aaaaⅩ| 九九精品片一| 91操碰| 九九青青草成人| 五月婷婷在线视频| 国产午夜精品AV一区二区麻豆| 激情五月婷婷色色| www.超碰| 色情综合网| 日本婷婷在线| 丁香婷婷成年| www激情| 五月婷婷六月激情网| 欧美大肥婆大肥BBBBB| 超碰久热| 人人97操| 精品夜夜澡人妻无码AV| 超碰AAAAAAV| 国产亚洲色婷婷久久99精品9j| 天天色色天天| 婷婷五月综合欧美在线播放| 国产看真人毛片爱做A片| 五月激情精品视频| 亚洲无码播放| 亚洲视频1区| 九九视频这里只有精品| 五月综合婷婷开心网| www.婷婷| 九九操操| 五月婷婷啪啪| 婷婷五月婷婷五月| 激情美女五月天| 99碰在线视频| 伊人婷婷大香蕉在线| 狠狠色噜噜色狠狠狠综合久久成人波| 综合亚洲色色| 超碰免费大香蕉| 九月丁香很很色| 婷婷久久大香蕉| 毛片毛片毛片毛片| 99在线视频在线观看| av首页在线| 精品久久99码| 丁香五月久久| 成人网站免费在线播放| 五月丁香婷色| 性爱网久久| 亚洲色人妻| 亚洲123区高清入口| 色色色色色色色色色色色色色97| 色之综合网| 久久精品五月天| 狠狠色婷婷综合开心影视| 色播五月天激情| 人人操人av| 五月丁香 久久久| 99热9| 久久精品五月天| 一区二区传媒视频| 五月丁香最新| 婷婷丁香视频| 日本久久人| 色99婷婷五月天| 丁香狠狠色婷婷久久无码视频| 亚洲婷婷丁香| 99精品久久久久久久婷婷| 六月婷婷毛片| 大香蕉久久久| 激情五月六月丁香| 好看的国产精品| 99精品视频在线观看| 欧美婷婷六月丁香综合色| 开心深爱激情网| 伊人激情啪啪| 激情婷婷色五月| 五月天·www·com| 五月激情另类| 五月激情婷婷开心| www五月| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 97久久精品| 色九九七七| 亚洲婷婷激情综合激情999精品| 九九色热| 天天干天天av天天射| 婷婷午夜| 极品人妻VIDEOSSS人妻| 婷婷丁香五月亚洲| 婷婷99| 午夜天堂一区人妻| 91大操| 精品一区二区三区三区| 99色人| 97AV人人插人人操| 色婷丁香| 伊人综合网4| 久久欧洲综合网| 久久色这里只有精品| 五月丁香激情四射| 国产欧美熟妇另类久久久 | AV成人在线网站| 在线精品97| 激情久久综合网| 国产五月天婷婷| 九月婷婷| 婷婷五月天另类网站| 色婷婷六月性| 色丁香婷婷| 亚洲天堂啪啪| 99精品国产在热久久| 日日杆天天| 激情五月婷婷综合网| 中文字幕人妻熟女在线| 九九综合| 97热精品| 五月丁香婷婷中文网| 激情婷婷亚洲五月| 国产性爱一级| 一本大道伊人AV久久综合| 婷婷丁香六月| 91人碰| 色婷婷内射| 涩婷婷五月天| 五月丁香婷婷色| www九月婷婷| 五月婷婷综合网| 婷婷丁香人妻久久在线观看| 婷婷五月深爱五月| 亚洲va综合va国产va中文| 婷婷色五月激情| 五月丁香 狠狠爱| 婷婷激情五月| 99热这里只有精品1| 可似看的AV| 五月婷婷色| 99精品国产在热久久婷婷| 五月丁香综合在线| 九九精品视频在线观看| 丁香激情五月| 日韩国产AV播放| 久久狠狠欧美| 久久多色| 日熟女| 五月丁香六月婷婷a v| 亚洲熟妇AV乱码在线观看| 成人中文网| 丁香大香蕉| 亚洲热视频在线| 影音先锋91网站在线观看| 中文在线视频久9| 色婷婷五月天激情久久| www天天爽| 国产69久久久欧美黑人A片| 影音先锋男人av资源站| 久久综合丁香| 99九九在线视频| 9|人妻人人操| 亚洲综合在线丁香五月| 天天插天天插| 啪啪夜久久| 五月婷婷丁香婷婷| 色久一| 26uuu91| 无码人妻丰满熟妇奶水区码| www.91在线看| 26uuu在线观看| av免费在线观看0| 激情五月综合ì香亚洲| 91九色中文字幕女在线观看| 中文字幕日产A片在线看| 男女av免费看| 亚洲 激情 中文| 久9热| 99噜噜噜在线播放| 婷婷综合久久| 伊人婷婷激情| 91男人操女人视频| 综合激情深爱| www.一起草av| 久久婷婷五月天激情| 蜜桃人妻无码AV天堂三区| 婷婷中文字幕在线| 久色| 久99视频| 欧美操人| 日日操日日射| 秋霞网在线免费基地五月婷婷丁香| 在线VA视频| 色播五月丁香婷婷| 久机视频这只有精品| 五月天五月天激情网| 五月婷婷九月婷婷九月婷婷| 丁香丝袜五月| 中文字幕综合网| 精品婷婷五| 丁香九月婷婷色| 成人 视频免费观看网站| 公的粗大挺进了我的密道| 在线综合91| 99九九热视频| 丁香午月AV中文字幕| 日日干日日| 欧洲毛片基地c区| 337p大胆噜噜噜噜噜91Av| 久久性刺激| 久久五月丁香| 天天热夜夜操| 久久99激情| 欧美日韩成人在线| 伊人婷婷色激情丁香| 中文字幕在线日亚洲9| 九九自拍网| 婷婷视频网| 五月天激情子轮| 影音先锋天天日| 亚洲色99| 999热成人在线综合网| 国产无遮挡又黄又爽免费网站| 婷婷中文字幕| 婷婷六久久| 99玖玖免费视频| 天天插天天草人人玩| 色婷婷综合网| 97色色视频| 五月婷婷开心亚洲无| 天天色宗合| 99热这里只有精品无码| 五月激情丁香六月狠狠干| 97色伦另类图片小说视频| 午夜婷婷五月天| 欧美99热| 日韩成人av在线| 亚洲综合五月| 婷婷五月丁香性爱| 色高清无码视频| 成人丁香| 色婷婷狠狠爱| 综合久久久| 色爱亚洲| 久久在线大香蕉| 青草视频在线蜜臀| 久久99久久99久久99人受| 99自拍视频在线观看| 丁香六月开心| 色情五月天。| 欧美激情丁香五月| 另类视在线| 六月婷在线| 丁香五月婷婷色| 国产成人一区二区三区在线观看| 激情婷婷九月| 美女天天爽| 久草婷| 99色在线观看| 久久久精品免费啪啪国| 五月丁香六月激情综合网| WWW,五月| 人妻丰满精品一区二区A片| 久热A| 五月激情丁香五月宗合| 97操在线资源| 色色丁香婷婷五月天| 久久久婷婷五月亚洲97号色| 99热精品网| 婷婷五月丁香综合| 日本久久人人| 综合久久五月天| 免费成片在线观看| 丁香婷婷激情四射五月| 激情综合啪啪| 五月天久久网站| 综合网五月天123| 天天干天天拍| 五月丁香色综合| 五月婷婷综合网| 久久久久9999| 丁香五月婷久久| 色播综合| 狠狠操狠狠爱| 996热| 99热网站| 国产精品18久久久| www,婷婷,com| 20253AV| 超级碰碰碰久久网站| 欧美激情综合| 婷婷五月天成人网| 国产亚洲精品AAAAAAA片| 婷婷成人AV| 96精品久久久久久久久| 999影院成人在线影院| 九九精品视频免费在线| 东北黄色一级| 97人人看| 国产永久一二一起草| 99色日本| 丁香丁婷五月激情| 天天操九九插| 九九久热| 美女激情综合| 色婷婷导航| 麻豆观看夏晴子| 丁香五月婷婷香| 婷婷综合在线播放| 五月丁香香蕉| 天天日人人爽| 亚洲无码99| 99热欧美| 日韩人妻白浆视频系列| 91久热| 五月四色激情| 99久久www| 婷婷五月亚洲激情| 丁香五月开心婷婷| 成人视频在线免费播放| 狠狠色综合网| 亚洲操逼网| 男同色五月开心五月激情五月| 乱精品一区字幕二区| 99热精品在线| 男人的天堂99| 九九精品在线视频观看| 九九青青草成人| 啪啪啪五月天| 五月色丁香| 精品无码久久久久久久久 | 热婷婷在线视频| 婷婷综合久久| 久热网站| 五月天激情网站| 五月色激情综合网| 日本女天天爽| 很很干夜夜干| 婷婷五月天av| 婷婷色操| 99热这里只有精品2016| 黄桃AV无码免费一区二区三区| 玖玖资源在线视频| 伊人激情网| VA五月激情在线| 五月丁香六月在线| 日日做A爰片久久毛片A片英语| 99国产精品久久久久久久久久久| 丰满少妇乱A片无码| 影音先锋 萱萱| 久久婷婷热| 噜噜色噜噜网| 青青草视频免费观看| 在线看片h站| 九九热在线观看6| 天天狠狠夜夜狠狠2023| 五月天停婷基地| 日韩青青| 色狠狠伊人久久五月丁香| 激情综合网激情五月欧美| 日日夜夜噜噜爽爽| AAA久久| 激情婷婷在线中文字幕| 激情综合女人网五月播播| 99热在线精品播放| 思思热视频在线观看| 97精品人人A片免费看| 五月天基地| se色99| WWW久久久| 婷婷五月天AV在线| 激情五月天第四色| 亚州欧美黄色电影| 三级黄色大片视频| 国内9l视频自拍老熟女九色| 伊人婷婷91| 丁香五月a| 激情图片亚洲| 我爱婷婷五月天综合88| 丁香五月社区| 色婷婷AⅤ| 激情婷婷五月社区| 七七久久婷婷| 5月婷婷五月天| 久久婷婷五月丁香蜜桃网| 在线观看亚洲视频影院| 激情婷婷人妻| 最近中文字幕2019视频1| 超碰一区二区| 久久99激情| 日本综合色图| 精品人妻伦| 久久99网站| 天天色情站| 亚洲激情在线| 五月丁香六月婷婷中合网| 热久91| 色情综合网| 国产原创视频91九色| 五月天激情综合在线| 激情五月丁香六月| 色原狠狠综合| 久久电影4399| 婷婷色导航| 六月婷婷综合| 婷婷开心青青草| 丁香五月婷婷图片综合| 色色色激情| 亚洲激情av| 激情小说五月天中文字幕| 九九热av| 99这里精品| 丰满少妇猛烈A片免费看观看| 色狠狠综合| 99爱精品| 视色综合| 久久99精品日本| 人人爱操| 成人网站免费sxj| 久久九九热re6这里有精品| 人妻操逼| 92久久久| 秋霞性爱AV| 久久黄色网扯| 丁香五月天日韩无码| 思思热性操| 五月婷综合| 日本超碰在线| 日操五月婷| 人人操人人添人人摸97| 播五月丁香六月| AV色婷婷| 成人综合网站| 日日综合网| 99操碰| 青青久在线视频免费观看| 99在线观看视频免费| 伊人五月天在线| 思思热在线精品视频网站| 久久久天堂国产精品女人| 99五月丁香丁| 九九视频在线观看视频在线播放69| 婷婷五月丁香色情| 非洲一级AV| 99精品偷自拍| 波多野结衣AV无码Porn| 色婷婷久久综合久色综| 超碰人人91| 99热这里只有精品一| www.91av.com| 涩五月婷婷| ji'qi'luan'ren'lun| 久久国产AV| 中字幕视频在线永久在线观看免费| 电影《战争与艾拉》免费观看| 99久久婷婷国产综合| 久久五月天综合视频网站| 色色操| 丁香五月天婷婷中文字幕| 精品网站:999WWW| 无人区码一码二码三码医生系列| 夜夜操少妇| 婷婷五月天Av| 亚洲成人乱码av网站| 欧美性生交XXXXX无码小说| 99视频精品全部免费 在线| 20253AV| 亚洲超碰在线| 欧美日本国产欧美日本韩国99| 色射影院| 日韩无码乱轮| 九月丁香很很色| 五月丁香综合网| 日韩精品一区二区亚洲AV观看 | 婷婷色爱| 4399在线日本A片| 亚洲激情六月丁香| 精品9197碰| 99热97| 婷婷五月丁香六月| 婷婷婷婷婷开心无码播放| 久99久在线| 丁香五月综合久久| 午夜微拍福利| 五月网站| 精品一二三区久久AAA片| 99爱在线视频观看| 深爱开心激情网| 玖玖在线视频福利| 日本 欧美在线| 久久九九99桃花视频| 99热免费| 五月天成人在线视频网站| 综合图区激情| 天天干天天 亚洲| 五月激情视频网| 久月丁香爱婷婷综合| 激情电影五月婷婷| 天天干天天日蜜臀av| 99热久草| 97碰| 五月色网| www.99色| 综合色播| 99在线精品观看99| 五月丁香六月激情综合| 中文成人在线| 欧美色九| 91精品无码| 色婷婷香蕉| 婷婷丁香在线| 婷婷五月天综合在线| 99国产视频网| 亚洲综合色网| 丁香五月中文字幕| 婷婷五月成人| 91丨九色丨国产打屁股| 五月天丁香| 五月天操逼网| 五月综合久久| 六月激情婷婷| 99国产精品久久久久久久久久久| 亚洲中文av| 久久怕怕视频| AA片在线观看视频在线播放| 色五月首页| 99人人干| 国产成人综合电影| 墨西哥毛片内射精| 国产精品视频| 色婷婷婷av| 五月激情婷婷播播网| 女人露出p毛视频www网站| 无码A片一区二区免费| se色婷婷视频| 丁香五月WWW| 91丨九色丨高潮丰满日本| 久久精彩视频99| 中文字幕日韩成人| 丁香五月婷婷婷婷欧美综合| 色婷婷婷婷| AV天堂淫乩| 久热精品视频| AV在线免费网站| 97香蕉碰碰人妻国产欧美| 97色色综合| 无码成人AAAAA毛片AI换脸| 97碰在线视频| 国产九月婷婷| 99视频久久| www.久久66| 成人视频在线免费播放| 一本色道久久综合狠狠躁小说| 狠狠插日日干撸| 五月玖玖| 日木WWW视频| 六月婷婷久久| 丁香伊人综合| 九热免费视频| 色色色色色色色色色影院| 97精品人人A片免费看| 最近免费中文字幕大全高清大全1| www.99热| 怡红院成人AV| 亚洲性爱干干| 色婷婷激情| 国产精品VIDEOSSEX久久发布| 欧美韩国日本| 天久久久久| 激情五月天之五月婷婷| 天天日夜夜操五月| 在线婷婷| 一级韩国产精品毛| 婷婷五月成人色综合| 99热20| 九九热在线视频| 国产精品第一国产精品| 日本三级第一页| 五月天激情黄色小说在线观看| www.婷婷网| 激情综合五月天| 欧美情色一区| 亚洲婷婷视频| 久re热视频| 亚洲操女| 色小说婷婷五月天天天| 天天射影视综合网| 五月天婷婷伊人| 丁香狠狠色婷婷久久无码视频| 伊人大蕉香| 操日本人妻视频| 色婷婷av在线观看| 亚洲午夜一区二区| 五月丁香淫淫婷婷婷| 久久总和99| 婷婷丁香黄色| 爱婷婷久久视频| 97人妻碰碰中文无码久热丝袜| 99久久九九视频| 色婷婷中文字母五月丁香| 天天天摸夜夜夜玩| 国产精品VIDEOSSEX久久发布| 色天使色综合| 欧美亚洲操逼| 亚洲操操操| 青青.com| 99色综合| 婷婷丁香熟妇综合网| 99热这里精| 午夜性做爰电影| 色色自拍视频网站| 色色色色色色网站| 97综合在线| 色婷婷欧美| 亚洲视频操| 来吧亚洲综合网| 丁香九月综合在线| www,26uuu,c0m,色情| 狠狠爱综合网| 激情九月综合| 99热自拍| 丁香六月婷婷综情欧美| 色色网站在线| 永久热91| enecarbon-materials.com污K127封锁请涟系@wip1688 | 欧美婷婷五月丁香| 超碰在线国产| 激情丁香五月天| 九九国产精视频| 1024日韩| 五月天婷婷六月| 色视频色综合91| 五月天激情网页| 九九色黄色| 狠狠草狠狠草| www.久久综合| 色九网| 九九热这里有精品23| 综合久久综合久久| 婷婷五月天AV| 色五月婷婷五月天| 色丁香婷婷美女视频网站| 九热视频| 婷婷丁香高潮了| 内射 无码 伊人| 亚洲操B| 色啪网| 国产精品久久久久久久久久 | 亚洲第一第二网站| 天天色爽| 色婷婷色丁香色欲av| 色五月五月丁香| 九月婷婷综合在线| 五月丁香好婷婷A片网| 91婷婷五月丁香碰| 欧美性爱五月天| 久婷婷久草| 亚州第一A片| 九九热AV| 26uuuavcom| 91九九精品| 色色丁香| 天天做天天爱综合| 久久婷婷五月综合色奶水99啪| 精品久久这里热66| 综合五月草| 五月婷婷丁香综合,亚洲天堂| 亚洲小视频| 国产成人综合在线| 无遮挡国产高潮视频免费观看| bbwcuckold精品熟妇| 99热在线观看| 色五月激情婷婷| 久久99视频| 碰碰人人人| 亚洲九区| 99爱精品视频| 99综合视频一体| 影音先锋男士资源网一区| 天天激情| 888精品福利地址| 狠狠久久婷| 色99在线| 91丨九色丨熟女|老版| 任你爽免费视频| 琪琪色五月婷婷老师| 99亚洲色色| 日本色噜| 99人人干人人| 深夜婷婷 丁香| 91啪啪视频| 五月婷婷伊人在线| 久久久妻人人人| 日韩精品99久久| 中文字幕在线免费看线人| 久久婷婷一级片| 亚洲区,视频区,视频区免费| 噼里啪啦在线观看免费完整版视频| 五月婷婷这里都是精品| 99热有精品在线观看| 天天摸天天做天天爱天天爽| 国产av影片| 五月婷狠狠| 精品一二三区久久AAA片| 婷婷五月天欧美图片在线播放电驴| 色婷婷亚洲综合网站| 2025天天操| 99综合婷婷五月| 六月丁香久久| 五月天婷婷激情网| 综合色七七| 99热在线观看| 大香蕉精品视频| 五月婷婷视频在线观看| 婷婷五月天美女| 狠狠久久婷五月| 九月色婷婷综合| 狠狠色综合无线观看| 色婷婷欧美| av在线免费网站| 丁香五月Av| 丁香六月婷婷综合在线| 另类激情四射| 国产超碰av| 五月激情丁香啪啪| 99热这里全都是精品| 色丁香五月综合网| 五月天婷婷激情小说| 婷婷色在线视频| 奇米四色五月天| 欧美A A A A A| 婷婷五月丁香亚洲| 爱99干99| 伊人无码高清| 99色色| 婷婷亚洲综合| 天天天天天天操| 婷婷丁香18| 日本99热| www.minyis.com【JT】实力收量可预付QQ2101460746 | 六月婷婷私欲| Av性爱网| 26uuu四色| 色五月在线| 色五月婷婷狠狠撸| wuyuedingxiang99| 色日本丁香婷婷| 激情网狠狠干| 欧洲亚洲免费视频9| 人妻视频在线| 日韩一级A片黄色| 丁香五月欧美色综合| 色六月 婷婷| www...com黄在线观看| 五月丁香六月色| 97自拍视频在线| 激情婷婷丁香| 国产成人精品一区二三区熟女在线| 综合网亚洲| 丁香五月婷婷基地| 五月丁香啪啪综合| 五月天另类小说| 99热一区| 老师的粉嫩小又紧水又多A片视频| 超碰99在线观看| 91视频综合网| 永久免费视频| 色色色色网站| 欧美美女视频| 日本二级毛片二级毛片| 久久激情视频| 婷婷丁香五月综合网| 色色丁香| 99国产精品久久久久久久久久久 | 免费的日逼视频| 99爱最新免费视频在线观看| 精a品a视a频| 五月天婷婷色小说| 狠狠狠狠狠草| 色综合五月| 激情99| 五月综合激情网| 伊人久久大香天蕉亚洲特级| 丁香亭亭激情四射| 91婷婷色| 日本va欧美va精品发布视频| 婷婷性爱影院| 五月天激情婷婷五月天久久| 综合xx网| 五月久久丁香| 婷婷久久亚洲| 乱精品一区字幕二区| 欧美日韩中文国产一区发布| www.99热| 免费碰碰视频久| 国产欧美第五十五页| 国产成人综合在线| www.婷婷网| 色五月婷婷色五月婷婷色五月婷婷| 五月丁香六月综合基地| 婷婷综合爱| 4438激情网| 麻豆AV一区二区三区| 激情五月婷婷| 日本久久激情| 国产67194| 色色COm| 久草热在线视频| 97久久超视频| 久久五月丁香婷婷| 99热这里只有精品3| 九九热最新| 国产成人精品一区二三区熟女在线| 婷婷在线视频| A1片久久久| 思思热热久久| 九九99免费视频| 涩丁香| 欧美99| 天天爽夜夜操| 丁香五月婷婷欧美性爱| 丁香五月激情宗合| 日本精品人妻无码77777| 激情婷婷五月| 丁香五月婷婷av| 99色爱| 亚洲AV日韩无码| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 五月草影视| 99热一区| 欧洲区自拍| 婷婷五月天xxx| 91碰碰视频| 99re在线免费视频| 月月AV| 激情五月丁香五月| 欧美色碰| 丁香六月色婷婷综合| 有哪些A片网站| 大地资源色婷婷视频在线 | 怡春院天天干| 天天做天天视天天谢| 秋霞电影理论| 久久人妻精品| 亚洲国产成人在线| 99热这里有精力| 丁香五月激情图片婷婷| 婷婷色情 | 五月婷六月综合在线观看| 爱草视频在线| 五月婷婷六月色| 婷婷五月色| 色色激情网| 色五月婷婷影视| 五月综合缴情网| 亚洲黄色网址| 最新精品视频99| 99国产精品久久久久久久久久久| 精品一二三区久久AAA片| www.yw色| 99久在线精品99re8热| 99这里只有精品| 91精品婷婷国产综合久久| 精品色色网| 免费看成人AA片无码视频吃奶| 婷婷五月天久久综合88| 开心久久五月天| 五月婷婷,六月丁香| 97涩婷婷婷婷基地| www.五月天社区| 万月丁香狠狠爱| 人妻VideOssS人妻| 五月久久丁香| 亚洲aV写真天天综合网久久 | 婷婷导航| 伊人丁香六月婷婷| 在线播放成人网站| 久久综合热17c| 五月丁香婷婷色| ji'qing'luan'ren'lun| 丁香综合网| 丁香婷婷精品视频|