精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在以太坊上構(gòu)建GraphQL API

區(qū)塊鏈
過(guò)去,開(kāi)發(fā)人員通過(guò)構(gòu)建自己的集中式索引服務(wù)器從區(qū)塊鏈中提取數(shù)據(jù),將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,并通過(guò)API進(jìn)行公開(kāi)。這需要大量的工程和硬件資源,并且破壞了分散化所需的重要安全性。

 [[397787]]

本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。

過(guò)去,開(kāi)發(fā)人員通過(guò)構(gòu)建自己的集中式索引服務(wù)器從區(qū)塊鏈中提取數(shù)據(jù),將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,并通過(guò)API進(jìn)行公開(kāi)。這需要大量的工程和硬件資源,并且破壞了分散化所需的重要安全性。

本文將向大家介紹如何在去中心化Web基礎(chǔ)架構(gòu)-區(qū)塊鏈數(shù)據(jù)上輕松部署API。

分散Web基礎(chǔ)架構(gòu)

分布式互聯(lián)網(wǎng)的構(gòu)想和發(fā)展方向通常稱為Web3,Web3通過(guò)以下附加功能增強(qiáng)了我們今天所知道的互聯(lián)網(wǎng):

  • 去中心化
  • 可驗(yàn)證的
  • 不信任
  • 自我管理

為了實(shí)現(xiàn)分散化,協(xié)議定義了網(wǎng)絡(luò),這些網(wǎng)絡(luò)提供了一系列數(shù)字服務(wù),例如計(jì)算,存儲(chǔ),帶寬,身份以及其他沒(méi)有中介的Web基礎(chǔ)結(jié)構(gòu)。這些協(xié)議通常分布在多個(gè)節(jié)點(diǎn)(服務(wù)器)上,使大部分希望成為網(wǎng)絡(luò)并提供服務(wù)的任何人都能參與。

在圖上建立

在本文中,我們還將研究一種這樣的協(xié)議Graph,以及如何使用以太坊區(qū)塊鏈中存儲(chǔ)的數(shù)據(jù)來(lái)構(gòu)建和部署我們自己的GraphQL API。

Graph是一個(gè)索引協(xié)議,用于查詢以太坊等區(qū)塊鏈和IPFS等網(wǎng)絡(luò),任何人都可以構(gòu)建和發(fā)布稱為子圖的開(kāi)放API,從而使數(shù)據(jù)易于訪問(wèn)。

子圖定義了您希望通過(guò)GraphQL API提供的數(shù)據(jù),數(shù)據(jù)源和數(shù)據(jù)訪問(wèn)模式。作為一個(gè)開(kāi)發(fā)人員可以選擇使用一個(gè)子已經(jīng)部署的其他開(kāi)發(fā)人員,或者定義和部署自己的子圖,并使用它。

子圖由幾個(gè)主要部分組成:

1. GraphQL模式

GraphQL模式定義您要保存和查詢的數(shù)據(jù)類型/實(shí)體,您還可以在架構(gòu)中定義諸如關(guān)系和全文搜索功能之類的配置。

2.子圖清單(yaml配置)

清單定義了子圖索引的智能合約,它們的ABI,這些合約中要注意的事件以及如何將事件數(shù)據(jù)映射到Graph Node存儲(chǔ)并允許查詢的實(shí)體。

3. AssemblyScript映射

AssemblyScript映射使您可以保存要使用架構(gòu)中定義的實(shí)體類型建立索引的數(shù)據(jù);該圖表CLI還使用子圖的模式的組合與智能合約的ABI一起產(chǎn)生AssemblyScript類型。

開(kāi)始建造

現(xiàn)在我們對(duì)Graph及其工作原理有了很好的了解,讓我們開(kāi)始編寫一些代碼。

在本教程中,我們將構(gòu)建一個(gè)子圖,用于從Zora智能合約查詢NTF數(shù)據(jù),實(shí)現(xiàn)用于獲取NFT及其所有者的查詢,并在它們之間建立關(guān)系。

先決條件:

為了在本教程中取得成功,您應(yīng)該在計(jì)算機(jī)上安裝Node.js,我建議您使用NVM或FNM管理Node.js的版本。

在圖資源管理器中創(chuàng)建圖項(xiàng)目

首先,打開(kāi)Graph Explorer,然后登錄或創(chuàng)建一個(gè)新帳戶。接下來(lái),轉(zhuǎn)到儀表板,然后單擊“添加子圖”以創(chuàng)建一個(gè)新的子圖。

使用以下屬性配置子圖:

  1. 子圖名稱-Zoranft子圖
  2. 字幕-用于查詢NFT的子圖
  3. 可選-填寫說(shuō)明和GITHUB URL屬性

使用Graph CLI初始化新的子圖

接下來(lái),安裝Graph CLI:

  1. $ npm install -g @graphprotocol/graph-cli 
  2. or 
  3. $ yarn global add @graphprotocol/graph-cli 

安裝Graph CLI后,您可以使用Graph CLIinit命令初始化一個(gè)新的子圖。

兩種方法:

1 從示例子圖中

  1. $ graph init --from-example <GITHUB_USERNAME>/<SUBGRAPH_NAME> [<DIRECTORY>] 

2 來(lái)自現(xiàn)有的智能合約

如果您已經(jīng)將智能合約部署到以太坊主網(wǎng)或測(cè)試網(wǎng)之一,則從該合約初始化新的子圖是啟動(dòng)和運(yùn)行的簡(jiǎn)便方法。

  1. $ graph init --from-contract <CONTRACT_ADDRESS> \ 
  2.   [--network <ETHEREUM_NETWORK>] \ 
  3.   [--abi <FILE>] \ 
  4.   <GITHUB_USER>/<SUBGRAPH_NAME> [<DIRECTORY>] 

在我們的例子中,我們將使用Zora令牌合約,因此我們可以通過(guò)使用--from-contract標(biāo)志傳遞合約地址來(lái)從該合約地址進(jìn)行初始化:

  1. $ graph init --from-contract 0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7 --network mainnet  \ 
  2. --contract-name Token --index-events 
  3. ? Subgraph name › your-username/Zoranftsubgraph 
  4. ? Directory to create the subgraph in › Zoranftsubgraph 
  5. ? Ethereum network › Mainnet 
  6. ? Contract address › 0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7 
  7. ? Contract Name · Token 

此命令將根據(jù)作為參數(shù)傳入的合同地址生成一個(gè)基本子圖--from-contract。通過(guò)使用此合同地址,CLI將在項(xiàng)目中初始化一些內(nèi)容以幫助您入門。

子圖的主要配置和定義位于subgraph.yaml文件中,子圖代碼庫(kù)由幾個(gè)文件組成:

  • subgraph.yaml:包含子圖清單的YAML文件。
  • schema.graphql:一個(gè)GraphQL架構(gòu),用于定義為子圖存儲(chǔ)的數(shù)據(jù)以及如何通過(guò)GraphQL查詢數(shù)據(jù)。
  • AssemblyScript映射:從以太坊中的事件數(shù)據(jù)轉(zhuǎn)換為架構(gòu)中定義的實(shí)體的AssemblyScript代碼。

我們將使用的subgraph.yaml中的條目是:

  • description(可選):子圖是什么的可讀描述,子圖部署到Hosted Service時(shí),圖資源管理器將顯示此描述。
  • repository(可選):可在其中找到子圖清單的存儲(chǔ)庫(kù)的URL。
  • dataSources.source:子圖來(lái)源的智能合約的地址,以及要使用的智能合約的abi。
  • dataSources.source.startBlock(可選):數(shù)據(jù)源從其開(kāi)始索引的塊的編號(hào)。
  • dataSources.mapping.entities:數(shù)據(jù)源寫入存儲(chǔ)的實(shí)體,每個(gè)實(shí)體的架構(gòu)都在schema.graphql文件中定義。
  • dataSources.mapping.abis:一個(gè)或多個(gè)命名ABI文件,用于源合同以及您在映射中與之交互的任何其他智能合同。
  • dataSources.mapping.eventHandlers:列出該子圖所響應(yīng)的智能合約事件以及映射中的處理程序(示例中為./src/mapping.ts),這些處理程序?qū)⑦@些事件轉(zhuǎn)換為商店中的實(shí)體。

定義實(shí)體

使用The Graph,您可以在schema.graphql中定義實(shí)體類型,并且Graph Node將生成用于查詢?cè)搶?shí)體類型的單個(gè)實(shí)例和集合的頂級(jí)字段。每種應(yīng)為實(shí)體的類型都必須使用@entity指令進(jìn)行注釋。

我們將要建立索引的實(shí)體/數(shù)據(jù)是Token和User。這樣,我們可以索引用戶以及用戶自己創(chuàng)建的令牌。

為此,請(qǐng)使用以下代碼更新schema.graphql:

  1. type Token @entity { 
  2.   id: ID! 
  3.   tokenID: BigInt
  4.   contentURI: String! 
  5.   metadataURI: String! 
  6.   creator: User
  7.   owner: User
  8. type User @entity { 
  9.   id: ID! 
  10.   tokens: [Token!]! @derivedFrom(field: "owner"
  11.   created: [Token!]! @derivedFrom(field: "creator"

通過(guò)@derivedFrom(來(lái)自文檔)通過(guò)“關(guān)系”

可以通過(guò)@derivedFrom字段在實(shí)體上定義反向查找。這會(huì)在實(shí)體上創(chuàng)建一個(gè)虛擬字段,可以查詢?cè)撎摂M字段,但無(wú)法通過(guò)映射API手動(dòng)設(shè)置。

相反,它是從另一個(gè)實(shí)體上定義的關(guān)系派生的。對(duì)于此類關(guān)系,存儲(chǔ)關(guān)系的兩邊幾乎沒(méi)有意義,并且僅存儲(chǔ)一側(cè)而派生另一側(cè)時(shí),索引和查詢性能都將更好。

現(xiàn)在,我們已經(jīng)為我們的應(yīng)用程序創(chuàng)建了GraphQL模式,我們可以在本地生成實(shí)體,以開(kāi)始在mappingsCLI所創(chuàng)建的實(shí)體中使用:

  1. graph codegen 

為了使工作中的智能合約,事件和實(shí)體變得容易且類型安全,Graph CLI從子圖的GraphQL模式和數(shù)據(jù)源中包含的合約ABI的組合中生成AssemblyScript類型。

使用實(shí)體和映射更新子圖

現(xiàn)在,我們可以配置subgraph.yaml以使用我們剛剛創(chuàng)建的實(shí)體并配置它們的映射。

為此,請(qǐng)先dataSources.mapping.entities使用User和Token實(shí)體更新字段:

  1. entities: 
  2.   - Token 
  3.   - User 

接下來(lái),更新,dataSources.mapping.eventHandlers使其僅包括以下兩個(gè)事件處理程序:

  1. eventHandlers: 
  2.   - event: TokenURIUpdated(indexed uint256,address,string) 
  3.     handler: handleTokenURIUpdated 
  4.   - event: Transfer(indexed address,indexed address,indexed uint256) 
  5.     handler: handleTransfer 

最后,更新配置以添加startBlock:

  1. source: 
  2.   address: "0xabEFBc9fD2F806065b4f3C237d4b59D9A97Bcac7" 
  3.   abi: Token 
  4.   startBlock: 11565020 

Assemblyscript映射

接下來(lái),打開(kāi)src / mappings.ts來(lái)編寫我們?cè)谧訄Dsubgraph中定義的映射eventHandlers。

使用以下代碼更新文件:

  1. import { 
  2.   TokenURIUpdated as TokenURIUpdatedEvent, 
  3.   Transfer as TransferEvent, 
  4.   Token as TokenContract 
  5. from "../generated/Token/Token" 
  6. import { 
  7.   Token, User 
  8. from '../generated/schema' 
  9. export function handleTokenURIUpdated(event: TokenURIUpdatedEvent): void { 
  10.   let token = Token.load(event.params._tokenId.toString()); 
  11.   token.contentURI = event.params._uri; 
  12.   token.save(); 
  13. export function handleTransfer(event: TransferEvent): void { 
  14.   let token = Token.load(event.params.tokenId.toString()); 
  15.   if (!token) { 
  16.     token = new Token(event.params.tokenId.toString()); 
  17.     token.creator = event.params.to.toHexString(); 
  18.     token.tokenID = event.params.tokenId; 
  19.     let tokenContract = TokenContract.bind(event.address); 
  20.     token.contentURI = tokenContract.tokenURI(event.params.tokenId); 
  21.     token.metadataURI = tokenContract.tokenMetadataURI(event.params.tokenId); 
  22.   } 
  23.   token.owner = event.params.to.toHexString(); 
  24.   token.save(); 
  25.   let user = User.load(event.params.to.toHexString()); 
  26.   if (!user) { 
  27.     user = new User(event.params.to.toHexString()); 
  28.     user.save(); 
  29.   } 

這些映射將處理創(chuàng)建,傳輸或更新新令牌的事件。當(dāng)這些事件觸發(fā)時(shí),映射會(huì)將數(shù)據(jù)保存到子圖中。

運(yùn)行構(gòu)建

接下來(lái),讓我們運(yùn)行一個(gè)構(gòu)建以確保正確配置了所有內(nèi)容。為此,請(qǐng)運(yùn)行以下build命令:

  1. $ graph build 

如果構(gòu)建成功,則應(yīng)該在根目錄中看到一個(gè)新的構(gòu)建文件夾。

部署子圖

要進(jìn)行部署,我們可以deploy使用Graph CLI運(yùn)行該命令。要進(jìn)行部署,您首先需要為在Graph Explorer中創(chuàng)建的子圖復(fù)制Access令牌:

接下來(lái),運(yùn)行以下命令:

  1. $ graph auth https://api.thegraph.com/deploy/ <ACCESS_TOKEN> 
  2. $ yarn deploy 

部署子圖后,您應(yīng)該看到它顯示在您的儀表板中:

當(dāng)您單擊子圖時(shí),它應(yīng)該打開(kāi)Graph資源管理器:

查詢數(shù)據(jù)

現(xiàn)在我們位于儀表板中,我們應(yīng)該能夠開(kāi)始查詢數(shù)據(jù)了。運(yùn)行以下查詢以獲取令牌及其元數(shù)據(jù)的列表:

  1.   tokens { 
  2.     id 
  3.     tokenID 
  4.     contentURI 
  5.     metadataURI 
  6.   } 

我們還可以配置訂單方向:

  1.   tokens( 
  2.     orderBy:id, 
  3.     orderDirection: desc 
  4.   ) { 
  5.     id 
  6.     tokenID 
  7.     contentURI 
  8.     metadataURI 
  9.   } 

或選擇跳過(guò)某些結(jié)果以實(shí)現(xiàn)一些基本分頁(yè):

  1.   tokens( 
  2.     skip: 100, 
  3.     orderBy:id, 
  4.     orderDirection: desc 
  5.   ) { 
  6.     id 
  7.     tokenID 
  8.     contentURI 
  9.     metadataURI 
  10.   } 

或查詢用戶及其相關(guān)內(nèi)容:

  1.   users { 
  2.     id 
  3.     tokens { 
  4.       id 
  5.       contentURI 
  6.     } 
  7.   } 

更新子圖

如果我們想要對(duì)子圖進(jìn)行一些更改然后重新部署,我們應(yīng)該怎么辦?假設(shè)我們要向子圖添加新功能,假設(shè)我們除了現(xiàn)有的查詢功能外,還想添加該功能以按創(chuàng)建NFT的時(shí)間戳進(jìn)行排序。

為此,我們需要先向?qū)嶓w添加一個(gè)新createdAtTimestamp字段Token:

  1. type Token @entity { 
  2.   id: ID! 
  3.   tokenID: BigInt
  4.   contentURI: String! 
  5.   metadataURI: String! 
  6.   creator: User
  7.   owner: User
  8.   "Add new createdAtTimesamp field" 
  9.   createdAtTimestamp: BigInt

現(xiàn)在,我們可以重新運(yùn)行代碼生成:

  1. graph codegen 

接下來(lái),我們需要更新映射以保存此新字段:

  1. // update the handleTransfer function to add the createdAtTimestamp to the token object 
  2. export function handleTransfer(event: TransferEvent): void { 
  3.   let token = Token.load(event.params.tokenId.toString()); 
  4.   if (!token) { 
  5.     token = new Token(event.params.tokenId.toString()); 
  6.     token.creator = event.params.to.toHexString(); 
  7.     token.tokenID = event.params.tokenId; 
  8.     // Add the createdAtTimestamp to the token object 
  9.     token.createdAtTimestamp = event.block.timestamp
  10.     let tokenContract = TokenContract.bind(event.address); 
  11.     token.contentURI = tokenContract.tokenURI(event.params.tokenId); 
  12.     token.metadataURI = tokenContract.tokenMetadataURI(event.params.tokenId); 
  13.   } 
  14.   token.owner = event.params.to.toHexString(); 
  15.   token.save(); 
  16.   let user = User.load(event.params.to.toHexString()); 
  17.   if (!user) { 
  18.     user = new User(event.params.to.toHexString()); 
  19.     user.save(); 
  20.   } 

現(xiàn)在我們可以重新部署子圖:

  1. $ yarn deploy 

子圖重新部署后,我們現(xiàn)在可以按時(shí)間戳查詢以查看最近創(chuàng)建的NFTS:

  1.   tokens( 
  2.     orderBy:createdAtTimestamp, 
  3.     orderDirection: desc 
  4.   ) { 
  5.     id 
  6.     tokenID 
  7.     contentURI 
  8.     metadataURI 
  9.   } 
  10. }} 

 【編輯推薦】

 

責(zé)任編輯:武曉燕 來(lái)源: 區(qū)塊鏈研究實(shí)驗(yàn)室
相關(guān)推薦

2023-05-05 08:00:00

2020-09-28 06:57:39

Node.jsGraphQLAPI

2021-05-13 16:13:21

區(qū)塊鏈以太坊NFT

2023-10-12 09:05:11

2021-05-02 22:19:46

以太坊比特幣加密貨幣

2020-10-27 18:45:45

GolangGraphQ開(kāi)發(fā)

2022-10-18 08:00:00

2021-10-26 00:27:28

Python以太坊智能

2021-05-03 23:32:55

以太坊區(qū)塊鏈比特幣

2021-05-22 22:57:24

以太坊加密貨幣比特幣

2021-12-08 13:57:29

以太坊加密貨幣比特幣

2018-04-23 14:31:02

微服務(wù)GraphQLBFF

2021-04-19 12:31:04

太坊數(shù)據(jù)QuestDB

2020-04-23 08:55:01

LinuxGradle工具

2021-04-29 16:11:14

以太坊共識(shí)鏈驗(yàn)證者

2018-06-01 09:17:52

區(qū)塊鏈以太坊

2022-02-23 23:43:15

網(wǎng)絡(luò)安全IT云安全

2017-02-09 09:30:18

UbuntuDokuWikiApache

2022-12-05 07:13:44

2021-12-07 12:00:12

UbuntuLinuxQt 6.2.2
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91精品国产色综合| 亚洲国产精品yw在线观看| 一级做a爰片久久| 国产绿帽一区二区三区| 雨宫琴音一区二区在线| 亚洲精品一区二区久| 国产精品区在线| 男女免费观看在线爽爽爽视频| 99视频精品在线| 国产精品美女午夜av| 久草免费新视频| 精品在线91| 欧美一区二区二区| 久久久久久久久久久福利| 香蕉视频在线播放| 91尤物视频在线观看| 国产精品视频xxx| 伊人365影院| 91视频久久| 国产女人爽到高潮a毛片| 成年人视频在线看| 成人午夜电影小说| 国产美女直播视频一区| 久久综合综合久久| 欧美疯狂party性派对| 日韩av在线免播放器| 91欧美视频在线| 少妇视频一区| 亚洲综合成人网| 亚洲视频导航| 欧美日韩在线中文字幕| 成人av综合在线| 97人人模人人爽人人喊38tv| 在线观看一二三区| 日韩福利视频导航| 日本不卡高字幕在线2019| 久久久久久久久久久网| 图片区亚洲欧美小说区| 一区二区三区视频观看| 中文精品在线观看| 高清欧美性猛交xxxx黑人猛| 欧美一区二区日韩一区二区| 污污动漫在线观看| 在线一区视频观看| 欧美在线免费观看亚洲| 久久人妻精品白浆国产| 午夜激情在线播放| 激情久久av一区av二区av三区| www.男人天堂网| www久久日com| 亚洲啪啪综合av一区二区三区| 天堂资源在线亚洲视频| 极品美乳网红视频免费在线观看| 久久久亚洲精品一区二区三区| 精品亚洲欧美日韩| 色视频在线观看| 99久久国产综合精品色伊| 国产91视觉| 国产精品一区二区免费视频| 激情小说亚洲一区| 国产精品欧美一区二区三区奶水| 久久久久久少妇| 一本色道久久综合亚洲精品高清| 精品视频9999| 2021亚洲天堂| 欧美一区成人| 久久成人精品电影| 欧美第一页在线观看| 成人激情视频| 亚洲精品乱码久久久久久金桔影视| 国产成人美女视频| 黄色成人小视频| 欧美日韩国产一级| 亚洲一级免费在线观看| 粉嫩91精品久久久久久久99蜜桃| 色婷婷久久综合| 四虎永久在线精品无码视频| 涩涩视频在线| 91久久精品日日躁夜夜躁欧美| 男人靠女人免费视频网站| 黄色视屏在线免费观看| 欧美日韩国产综合新一区| 黄色一级片黄色| 中文字幕在线中文字幕在线中三区| 精品福利在线看| 久久无码高潮喷水| 国产成人免费9x9x人网站视频| 91国产免费观看| 黄色在线视频网| 日韩一区二区三区四区五区 | 熟女丰满老熟女熟妇| 秋霞蜜臀av久久电影网免费 | 91精品久久久久久| 99视频免费看| 成人免费看黄yyy456| 久久av一区二区三区漫画| 日本中文字幕一区二区有码在线| 国产亚洲1区2区3区| 亚洲成人蜜桃| 污污视频在线看| 精品久久在线播放| 国产精品视频黄色| 国产精品一区二区精品视频观看| 精品日韩成人av| 亚洲国产欧美视频| 精品国产a一区二区三区v免费| 久久精品福利视频| 日韩三级av在线| 免费成人在线观看视频| 91免费版黄色| 免费理论片在线观看播放老| 国产精品久久久久四虎| 中国丰满熟妇xxxx性| 惠美惠精品网| 日韩色在线观看| 波多野结衣福利| 在线中文一区| 国产精品成人一区| 亚洲av综合色区无码一区爱av| 99久久99久久精品免费看蜜桃| 日本在线观看不卡| 日皮视频在线观看| 欧美主播一区二区三区美女| 日本天堂在线播放| 日韩三级在线| 欧美激情精品久久久久久黑人| 91午夜视频在线观看| 狠狠色狠狠色综合日日91app| 久久精品第九区免费观看| 国产成人无吗| 色婷婷精品大在线视频| 中文字幕在线观看91| 欧美日韩精品在线一区| 51ⅴ精品国产91久久久久久| 国产精品视频无码| 久久久不卡影院| 久久亚洲精品无码va白人极品| 成人黄色视屏网站| 精品亚洲一区二区三区| 欧美被狂躁喷白浆精品| 日本成人超碰在线观看| 久久精品人成| 日本不良网站在线观看| 精品精品国产高清一毛片一天堂| 大吊一区二区三区| 午夜影院日韩| 国产一区二区在线观看免费播放| 免费av网站在线看| 欧美性猛交xxxx黑人交| 中文字幕国产综合| 99精品国产在热久久| 国产91社区| 色操视频在线| 亚洲韩国欧洲国产日产av| 欧美另类视频在线观看| 狠狠色丁香久久婷婷综合_中| 日韩三级电影免费观看| 黑人巨大亚洲一区二区久| 日韩www在线| 欧美成人精品欧美一级乱黄| 成人综合在线视频| 18黄暴禁片在线观看| 国产麻豆一区二区三区| 久久久国产精品免费| 欧美日韩 一区二区三区| 久久这里只有精品视频网| 免费无码不卡视频在线观看| 欧亚精品一区| 欧美在线一级视频| 色鬼7777久久| 色综合久久久久久久久| b站大片免费直播| 米奇777在线欧美播放| 欧美专区一二三| 中文字幕系列一区| 亚洲天堂av在线免费观看| 国产精品午夜一区二区| 国产精品看片你懂得| 天堂在线一区二区三区| 亚洲欧洲美洲一区二区三区| 亚洲最大福利网| 手机在线免费观看av| 亚洲第一福利在线观看| 成年免费在线观看| 国产欧美日韩中文久久| 五月天激情播播| 日韩一区二区免费看| 蜜桃成人免费视频| 素人啪啪色综合| 欧美成人性生活| 天天综合永久入口| 91国内精品野花午夜精品| 亚洲一区 欧美| 国产精品18久久久| 久久国产亚洲精品无码| 卡一精品卡二卡三网站乱码| 国产精品久久77777| 国产调教视频在线观看| 亚洲国产精品久久精品怡红院 | 亚洲精品资源| 日韩亚洲一区在线播放| 国产在线一区不卡| 91爱爱小视频k| 在线免费观看黄色av| 日韩精品一区二区三区swag| av资源免费观看| 久久精品免视看| 人妻体内射精一区二区三区| 日日噜噜夜夜狠狠视频欧美人| 天堂v在线视频| 欧美成a人免费观看久久| 国产精品一区电影| 999av小视频在线| 欧美成人精品xxx| 免费人成黄页在线观看忧物| 欧美一区二视频| 国产婷婷色一区二区在线观看| 国产精品国产三级国产普通话三级| 国产清纯白嫩初高中在线观看性色| 久久精品国产清高在天天线| 91精品国产毛片武则天| 日韩aaa久久蜜桃av| 成人免费大片黄在线播放| 正在播放日韩精品| 欧美日韩第一视频| 青青操视频在线| 亚洲精品福利免费在线观看| 国产精品一级视频| 91黄色在线观看| 日韩欧美不卡视频| 亚洲色图19p| 欧美亚洲色综久久精品国产| 91女人视频在线观看| 性鲍视频在线观看| 日韩国产欧美三级| 妞干网在线观看视频| 激情丁香综合| 国产91porn| 日韩免费一区| 奇米精品在线| 欧美韩一区二区| 国产精品久久九九| 国产精品3区| 国产精品一区二区久久久久| 高清在线视频不卡| 国模吧一区二区三区| av黄在线观看| 久久精品久久精品亚洲人| 男人的天堂在线免费视频| 亚洲娇小xxxx欧美娇小| 精品人妻久久久久一区二区三区 | 国产精品视频一区二区三区综合| 国产精品久久久久久久久久东京| 国产伦理精品| 国语自产精品视频在线看一大j8| www.综合网.com| 久久青草精品视频免费观看| 日本在线视频网址| 欧美成人亚洲成人日韩成人| 欧美猛烈性xbxbxbxb| 在线播放国产一区中文字幕剧情欧美| 牛牛热在线视频| 亚洲欧美国产高清va在线播| 同心难改在线观看| 亚洲性视频网址| 成人影视在线播放| 最近2019年好看中文字幕视频 | 一区二区在线视频| 国产乱理伦片a级在线观看| 亚洲人成网站777色婷婷| 欧洲亚洲精品视频| 亚洲精品国产精品国自产在线| 嫩草精品影院| 在线观看精品自拍私拍| 99se视频在线观看| 久久精品视频导航| 五月天激情在线| 欧美高清在线视频观看不卡| 伦理av在线| 欧美亚洲在线视频| 青娱乐极品盛宴一区二区| 亚洲精品欧美一区二区三区| 日韩免费成人| 九色91在线视频| 国产免费久久| 正在播放亚洲| 国产一区清纯| 国产精品va无码一区二区| 蜜桃久久久久久| 日本成人在线免费观看| 成人丝袜高跟foot| 无码h肉动漫在线观看| 中文字幕乱码一区二区免费| 日韩在线一卡二卡| 亚洲一区二区三区激情| 久久久久久91亚洲精品中文字幕| 色噜噜狠狠色综合欧洲selulu | 日韩一区二区在线免费观看| 高清国产mv在线观看| 亚洲欧美综合精品久久成人| 调教视频免费在线观看| 欧美激情一级精品国产| 日本免费久久| 99porn视频在线| 国产毛片一区二区三区| 亚洲一区三区| 91精品成人| 欧美 日韩 国产一区| 久久99久久久久| 亚洲啪av永久无码精品放毛片| 国产亚洲综合色| 欧美成人一区二区三区高清| 午夜精品福利视频网站| 97caocao| 亚洲图片在线综合| 青草视频在线免费直播| 国产精品扒开腿做爽爽爽的视频| 激情综合婷婷| 色综合久久久久久久久五月| 狠久久av成人天堂| 一级做a免费视频| 久久亚洲捆绑美女| 欧美日韩激情在线观看| 欧美午夜理伦三级在线观看| 午夜精品久久久久久久99| 中文字幕在线看视频国产欧美在线看完整 | 91精品办公室少妇高潮对白| 91丨九色丨丰满| 最近2019好看的中文字幕免费| av资源一区| 亚洲精品女av网站| 人人狠狠综合久久亚洲婷| 男人天堂1024| 国产精品亚洲成人| 极品蜜桃臀肥臀-x88av| 一本一本久久a久久精品综合麻豆| 国产女人高潮毛片| 最好看的2019的中文字幕视频| 韩国成人二区| 国产精品视频免费一区| 一区二区免费不卡在线| 尤物av无码色av无码| 成人aa视频在线观看| 黄色一级免费视频| 日韩一区二区精品在线观看| www 日韩| 国产成一区二区| 怕怕欧美视频免费大全| 女性女同性aⅴ免费观女性恋| 91原创在线视频| 国产精品7777777| 精品国产免费久久| 亚洲国产精品精华素| 成人免费自拍视频| 久久精品久久久| 亚洲 激情 在线| 亚洲欧美视频在线观看| 国产又粗又长又黄| 色妞欧美日韩在线| 亚洲精品aaa| 色撸撸在线观看| 国产一区二区三区四| 亚洲国产精品免费在线观看| 91精品国产一区二区| 粗大黑人巨茎大战欧美成人| 91久久精品美女| 欧美在线二区| 国产国语老龄妇女a片| ...av二区三区久久精品| www.桃色av嫩草.com| 欧美激情小视频| 成人台湾亚洲精品一区二区 | 国产欧美一区二区三区在线看| av中字幕久久| 婷婷激情四射五月天| 中文字幕+乱码+中文字幕一区| 中文字幕第99页| 久久伊人精品天天| 欧美大胆a级| 国产成人综合一区| 国产精品国产三级国产专播品爱网 | 亚洲国产欧美日韩| 国产九九视频一区二区三区| 久久久www成人免费毛片| 亚洲国产99精品国自产| 超碰一区二区| 一区二区三区四区欧美| 久久成人精品无人区| 日韩精品视频播放| 亚洲品质视频自拍网| 日韩成人在线电影| 日产精品久久久久久久蜜臀| 不卡av在线免费观看| 中文字幕在线播| 日韩一区在线视频| 老司机精品在线| 一区二区在线播放视频| 亚洲美女免费视频| 欧洲亚洲精品视频| 国产精品综合网站|