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

如何使用Flow和IPFS創建NFT

開發 后端
隨著不可替代令牌(NFT)市場達到高潮,回顧一下相對較早的NFT并記住CryptoKitties面臨的挑戰是很有趣的。由Dapper Labs團隊構建的平臺是潛在大規模采用的第一個真實示例,也是以太坊區塊鏈上的第一個真實壓力。

[[389053]]

本文轉載自微信公眾號「區塊鏈研究實驗室」,作者鏈三豐。轉載本文請聯系區塊鏈研究實驗室公眾號。

隨著不可替代令牌(NFT)市場達到高潮,回顧一下相對較早的NFT并記住CryptoKitties面臨的挑戰是很有趣的。由Dapper Labs團隊構建的平臺是潛在大規模采用的第一個真實示例,也是以太坊區塊鏈上的第一個真實壓力。

從那時起,NFT開始興起,諸如Rarible,OpenSea,Foundation和Sorare之類的平臺也開始興起。這些平臺每月有數百萬美元的資金流向。盡管有早期的掙扎,但大多數情況還是在以太坊區塊鏈上發生的。但是,Dapper Labs的團隊在使用CryptoKitties的經驗之后,著手建立一個新的區塊鏈,該區塊鏈將是通用的,但也非常適合NFT用例。這樣做的目的是解決以太坊上的NFT所遇到的許多問題,同時為該領域的開發商和收藏家提供更好的體驗。

今天我們討論如何在由IPFS支持的Flow上創建NFT。Flow區塊鏈的主要早期應用之一是NBA Top Shot。我們將構建NFT鑄造過程的非?;镜母北?,然后在IPFS上備份NFT元數據和資產。

這是一個包含以下三部分的教程:

  • 創建合約并鑄造代幣
  • 創建一個應用以查看通過此合同創建的NFT
  • 創建一個市場以將NFT轉讓給其他人,同時也轉讓NFT在IPFS上的基礎資產

今天讓我們開始第一個教程。

配置

我們需要安裝Flow CLI:

蘋果系統:

  1. brew install flow-cli 

Linux:

  1. sh -ci “$(curl -fsSL https://storage.googleapis.com/flow-cli/install.sh)" 

Windows:

  1. iex “& { $(irm ‘https://storage.googleapis.com/flow-cli/install.ps1') }” 

我們將在IPFS上存儲資產文件。為了簡化操作,我們可以使用Pinata。您可以在此處注冊一個免費帳戶,并在此處獲取API密鑰。在本教程的第二篇文章中,我們將使用API,但在這篇文章中,我們將使用Pinata網站。

我們還需要安裝NodeJS和文本編輯器,以幫助突出顯示Flow智能合約代碼(以Cadence語言編寫)的語法。您可以在此處安裝Node。Visual Studio Code具有支持Cadence的擴展。

安裝好之后,讓我們創建一個目錄來容納我們的項目:

  1. mkdir pinata-party 

轉到該目錄并初始化一個新的流程項目:

  1. cd pinata-party 
  2. flow project init 

現在,在您喜歡的代碼編輯器中打開項目(同樣,如果您使用Visual Studio Code,請抓住Cadence擴展),然后開始工作。

您會看到一個flow.json文件,我們將很快使用它。首先,創建一個名為的文件夾cadence。在該文件夾中,添加另一個名為的文件夾contracts。最后,在contracts名為的文件夾中創建一個文件PinataPartyContract.cdc。

在繼續前進之前,重要的一點是要指出,從現在開始,我們對Flow區塊鏈所做的一切都將在模擬器上完成。但是,將項目部署到testnet或mainnet就像更新flow.json文件中的配置設置一樣簡單。現在讓我們為仿真器環境設置該文件,然后就可以開始編寫合同了。

更新合同對象,flow.json如下所示:

  1. "contracts": { 
  2.      "PinataPartyContract""./cadence/contracts/PinataPartyContract.cdc" 

然后,更新該deployments文件中的對象,如下所示:

  1. "deployments": { 
  2.      "emulator": { 
  3.           "emulator-account": ["PinataPartyContract"
  4.      } 

這是在告訴Flow CLI使用仿真器來部署我們的合同,它還引用了該帳戶(在仿真器上)和我們即將寫的合同。

合約

Flow提供了有關創建NFT合約的出色教程。這是一個很好的參考點,但是正如Flow指出的那樣,他們尚未解決NFT元數據問題。他們想在鏈上存儲元數據。那是個好主意,他們一定會提出一個合乎邏輯的方法。但是,我們現在想用元數據創建一些令牌,并且我們希望與NFT相關聯的媒體文件。元數據只是一個組成部分。我們還需要指出令牌最終代表的媒體。

如果您熟悉以太坊區塊鏈上的NFT,您可能會知道這些令牌返回的許多資產都存儲在傳統數據存儲和云托管提供商中。可以,除非不是。過去我們曾寫過關于內容可尋址內容的天才之處,以及在傳統云平臺上存儲與區塊鏈相鄰的數據的弊端。歸結為兩點:

  • 資產應該是可驗證的
  • 維護職責的轉移應該很容易

IPFS照顧了這兩個方面。然后,Pinata以一種簡單的方式分層,以將該內容長期固定在IPFS上。這正是我們想要支持NFT的媒體所需要的,對嗎?我們要確??梢宰C明所有權(NFT),提供有關NFT(NFT)的數據,并確保我們對基礎資產(IPFS)(介質或其他)擁有控制權,而不是某些副本的控制權。

考慮到所有這些,讓我們寫一個合約,創建NFT,將元數據與NFT相關聯,并確保元數據指向存儲在IPFS上的基礎資產。

打開PinataPartyContract.cdc,讓我們開始工作。

  1. pub contract PinataPartyContract { 
  2.   pub resource NFT { 
  3.     pub let id: UInt64 
  4.     init(initID: UInt64) { 
  5.       self.id = initID 
  6.     } 
  7.   } 

第一步是定義我們的合同。我們將為此添加更多的內容,但是我們首先定義PinataPartyContract并在其中創建一個resource。資源是存儲在用戶帳戶中的項目,可以通過訪問控制措施進行訪問。在這種情況下,NFT資源最終是因為擁有用于表示NFT的事物而擁有的。NFT必須是唯一可識別的。該id屬性使我們能夠識別令牌。

接下來,我們需要創建一個資源接口,該接口將用于定義哪些功能可供其他人(即不是合同所有者的人)使用:

  1. pub resource interface NFTReceiver { 
  2.   pub fun deposit(token: @NFT, metadata: {String : String}) 
  3.   pub fun getIDs(): [UInt64] 
  4.   pub fun idExists(id: UInt64): Bool 
  5.   pub fun getMetadata(id: UInt64) : {String : String} 

將其放在NFT資源代碼下方。此NFTReceiver資源接口表示,我們定義為有權訪問該資源的任何人都可以調用以下方法:

  • deposit
  • getIDs
  • idExists
  • getMetadata

接下來,我們需要定義我們的令牌收集接口??梢詫⑵湟暈槿菁{所有用戶NFT的錢包。

  1. pub resource Collection: NFTReceiver { 
  2.     pub var ownedNFTs: @{UInt64: NFT} 
  3.     pub var metadataObjs: {UInt64: { String : String }} 
  4.  
  5.     init () { 
  6.         self.ownedNFTs <- {} 
  7.         self.metadataObjs = {} 
  8.     } 
  9.  
  10.     pub fun withdraw(withdrawID: UInt64): @NFT { 
  11.         let token <- self.ownedNFTs.remove(key: withdrawID)! 
  12.  
  13.         return <-token 
  14.     } 
  15.  
  16.     pub fun deposit(token: @NFT, metadata: {String : String}) { 
  17.         self.metadataObjs[token.id] = metadata 
  18.         self.ownedNFTs[token.id] <-! token 
  19.     } 
  20.  
  21.     pub fun idExists(id: UInt64): Bool { 
  22.         return self.ownedNFTs[id] != nil 
  23.     } 
  24.  
  25.     pub fun getIDs(): [UInt64] { 
  26.         return self.ownedNFTs.keys 
  27.     } 
  28.  
  29.     pub fun updateMetadata(id: UInt64, metadata: {String: String}) { 
  30.         self.metadataObjs[id] = metadata 
  31.     } 
  32.  
  33.     pub fun getMetadata(id: UInt64): {String : String} { 
  34.         return self.metadataObjs[id]! 
  35.     } 
  36.  
  37.     destroy() { 
  38.         destroy self.ownedNFTs 
  39.     } 
  40.   } 

此資源中有很多事情要做,但是應該很快就有意義。首先,我們有一個名為的變量ownedNFTs。這很簡單。它跟蹤該合同中用戶擁有的所有NFT。

接下來,我們有一個名為的變量metadataObjs。這一點有點獨特,因為我們正在擴展Flow NFT合同功能,以存儲每個NFT的元數據映射。此變量將令牌ID映射到其關聯的元數據,這意味著我們需要先設置令牌ID,然后才能進行設置。

然后,我們初始化變量。對于Flow中資源中定義的變量,這是必需的。

最后,我們擁有NFT收集資源的所有可用功能。請注意,并非所有這些功能都可以使用。如果您還記得的話,我們在NFTReceiver資源界面的前面定義了任何人都可以使用的功能。

我確實要指出deposit功能。正如我們將默認的Flow NFT合同擴展為包括metadataObjs映射一樣,我們也在擴展默認deposit函數以采用的附加參數metadata。我們為什么在這里這樣做?我們需要確保只有令牌的鑄造者才能將該元數據添加到令牌中。為了保持私密性,我們將最初添加的元數據限制在鑄造執行中。

我們的合同代碼幾乎完成了。因此,在Collection資源下方,添加以下內容:

  1. pub fun createEmptyCollection(): @Collection { 
  2.     return <- create Collection() 
  3.  
  4. pub resource NFTMinter { 
  5.     pub var idCount: UInt64 
  6.  
  7.     init() { 
  8.         self.idCount = 1 
  9.     } 
  10.  
  11.     pub fun mintNFT(): @NFT { 
  12.         var newNFT <- create NFT(initID: self.idCount) 
  13.  
  14.         self.idCount = self.idCount + 1 as UInt64 
  15.  
  16.         return <-newNFT 
  17.     } 

首先,我們有一個函數,該函數在調用時會創建一個空的NFT集合。這樣,首次與我們的合同進行交互的用戶將具有一個創建到Collection我們定義的資源的存儲位置。

之后,我們再創建一個資源。這很重要,因為沒有它,我們將無法鑄造代幣。該NFTMinter資源包括idCount其遞增,以確保我們從來沒有對我們的NFT重復的ID。它還具有實際創建我們的NFT的功能。

在NFTMinter資源下方,添加主合同初始化程序:

  1. init() { 
  2.       self.account.save(<-self.createEmptyCollection(), to: /storage/NFTCollection) 
  3.       self.account.link<&{NFTReceiver}>(/public/NFTReceiver, target: /storage/NFTCollection) 
  4.       self.account.save(<-create NFTMinter(), to: /storage/NFTMinter) 

僅在部署合同時才調用此初始化函數。它做三件事:

  • 為集合的部署者創建一個空的集合,以便合同的所有者可以創建該合同的NFT并擁有該NFT。
  • Collection參考NFTReceiver我們在開始時創建的界面,該資源在公共位置發布。這就是我們告訴合同的方式,NFTReceiver任何人都可以調用上定義的功能。
  • 該NFTMinter資源被保存在賬戶儲存合同的創造者。這意味著只有合同的創建者才能鑄造代幣。

完整的合同可以在這里找到。

現在我們準備好了合同,讓我們部署它,對吧?好吧,我們可能應該在Flow Playground上對其進行測試。轉到那里,然后單擊左側邊欄中的第一個帳戶。用我們的合同代碼替換示例合同中的所有代碼,然后單擊“部署”。如果一切順利,您應該在屏幕底部的日志窗口中看到這樣的日志:

  1. flow project start-emulator 

現在,我們準備將合同部署到本地運行的模擬器。在命令行中,運行以下命令:

  1. flow project deploy 

現在,在仿真器運行且flow.json文件配置正確的情況下,我們可以部署合同。只需運行以下命令:

flow project deploy

如果一切順利,您應該會看到類似以下的輸出:

Deploying 1 contracts for accounts: emulator-account

PinataPartyContract -> 0xf8d6e0586b0a20c7

現在,我們在Flow仿真器上有一個合同,但是我們想要鑄造一個令牌。

鑄造NFT

在本教程的第二篇文章中,我們將致力于通過應用程序和用戶界面使鑄造過程更加用戶友好。為了說明問題,并顯示元數據如何與Flow上的NFT一起使用,我們將使用Cadence腳本和命令行。

讓我們在pinata-party項目的根目錄下創建一個新目錄,并將其稱為transactions。創建該文件夾后,在其中創建一個名為的新文件MintPinataParty.cdc。

為了編寫交易,我們需要在提供給NFT的元數據中引用一個文件。為此,我們將通過Pinata將文件上傳到IPFS,您可以上傳任何想要的視頻文件。您可以真正上載任何資產文件并將其與NFT關聯。

上傳文件后,系統會為您提供IPFS哈希(通常稱為內容標識符或CID)。復制此哈希,因為我們將在鑄造過程中使用它。

現在,在MintPinataParty.cdc文件內添加以下內容:

  1. import PinataPartyContract from 0xf8d6e0586b0a20c7 
  2.  
  3. transaction { 
  4.   let receiverRef: &{PinataPartyContract.NFTReceiver} 
  5.   let minterRef: &PinataPartyContract.NFTMinter 
  6.  
  7.   prepare(acct: AuthAccount) { 
  8.       self.receiverRef = acct.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver) 
  9.           .borrow() 
  10.           ?? panic("Could not borrow receiver reference")         
  11.  
  12.       self.minterRef = acct.borrow<&PinataPartyContract.NFTMinter>(from: /storage/NFTMinter) 
  13.           ?? panic("could not borrow minter reference"
  14.   } 
  15.  
  16.   execute { 
  17.       let metadata : {String : String} = { 
  18.           "name""The Big Swing"
  19.           "swing_velocity""29",  
  20.           "swing_angle""45",  
  21.           "rating""5"
  22.           "uri""ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6" 
  23.       } 
  24.       let newNFT <- self.minterRef.mintNFT() 
  25.  
  26.       self.receiverRef.deposit(token: <-newNFT, metadata: metadata) 
  27.  
  28.       log("NFT Minted and deposited to Account 2's Collection"
  29.   } 

這是一個非常簡單的事務,這在很大程度上要感謝Flow為使事情變得容易而進行的工作,但讓我們逐步進行一下。首先,您會在頂部注意到import語句。如果您還記得的話,當我們部署合同時,我們會收到一個帳戶。這就是我們需要參考的內容。因此,請替換0xf8d6e0586b0a20c7為您部署中的帳戶地址。

接下來,我們定義交易。這里發生的一切都與我們計劃執行的交易有關。

我們在交易中要做的第一件事是定義兩個參考變量receiverRef和minterRef。在這種情況下,我們既是NFT的接收者又是NFT的鑄造者。這兩個變量引用了我們在合同中創建的資源。如果執行事務的人無權訪問該資源,則事務將失敗。

接下來,我們有一個prepare功能。此功能獲取嘗試執行交易的人員的帳戶信息并進行一些驗證。我們嘗試“借用”我們定義的NFTMinter和兩種資源上的可用功能NFTReceiver。如果執行交易的人沒有訪問這些資源的權限,那么事情將會失敗。

最后,我們有我們的execute功能。此功能是我們為NFT建立元數據,創建NFT,然后關聯元數據,然后再將NFT存入我們的帳戶的地方。如果您注意到的話,我創建了一個元數據變量。在該變量中,我添加了一些有關令牌的信息。由于我們的代幣表示在聚會上砸了一個披薩的事件,并且由于我們試圖復制您在NBA Top Shot中看到的大部分內容,因此我在元數據中定義了一些統計信息。孩子揮動棍子打皮納塔的速度,揮桿角度和等級。我只是在玩這些統計數據。但是,您將以類似的方式輸入對您的令牌有意義的任何信息。

您會注意到,我也在uri元數據中定義了一個屬性。這將指向承載與NFT關聯的資產文件的IPFS哈希。在這種情況下,這是被擊中的Pi?ata的實際視頻。您可以使用之前上傳文件后收到的哈希值替換哈希值。

ipfs://出于幾個原因,我們為哈希添加前綴。這是IPFS上文件的正確參考,可以與IPFS的桌面客戶端和瀏覽器擴展一起使用?,F在,我們為IPFS內容提供了本機支持,我們也可以將其直接粘貼到Brave瀏覽器中。

我們調用mintNFT創建令牌的函數。然后,我們必須調用該deposit函數以將其放入我們的帳戶。這也是我們傳遞元數據的地方。請記住,我們在deposit函數中定義了一個變量關聯,該關聯將元數據添加到關聯的令牌ID。

最后,我們簡單地注銷令牌已鑄造和存放的事實。

現在,我們幾乎準備發送交易并創建NFT。但是首先,我們需要準備我們的賬戶。從項目的根文件夾中的命令行,讓我們創建一個用于簽名的新私鑰。

運行以下命令:

  1. flow keys generate 

這將為您提供一個公鑰和一個私鑰。**始終保護您的私鑰**

我們將需要私鑰來簽署交易,因此我們可以將其粘貼到我們的flow.json文件中。我們還需要指定簽名算法。這是文件中的accounts對象flow.json現在應如下所示:

  1. "accounts": { 
  2.   "emulator-account": { 
  3.      "address""YOUR ACCOUNT ADDRESS"
  4.      "privateKey""YOUR PRIVATE KEY"
  5.      "chain""flow-emulator"
  6.      "sigAlgorithm""ECDSA_P256"
  7.      "hashAlgorithm""SHA3_256" 
  8.   } 
  9. }, 

如果您打算將此項目中的任何一個存儲在github或任何遠程git存儲庫上,請確保不包括私鑰。您可能想要.gitignore全部flow.json。即使我們僅使用本地仿真器,還是保護您的密鑰的一種很好的做法。

現在我們已經更新了,我們可以發送交易了。這樣做就像運行以下命令一樣簡單:

  1. flow transactions send --code ./transactions/MintPinataParty.cdc --signer emulator-account 

我們從中引用了我們編寫的交易文件和簽名人帳戶flow.json。如果一切順利,您應該會看到類似以下的輸出:

Getting information for account with address 0xf8d6e0586b0a20c7 ...

Submitting transaction with ID 4a79102747a450f65b6aab06a77161af196c3f7151b2400b3b3d09ade3b69823 ...

Successfully submitted transaction with ID 4a79102747a450f65b6aab06a77161af196c3f7151b2400b3b3d09ade3b69823

現在,我們要做的最后一件事是驗證令牌是否在我們的帳戶中并獲取元數據。這樣做,我們將編寫一個非常簡單的腳本并從命令行調用它。

在項目的根目錄中,創建一個名為的新文件夾scripts。在其中創建一個名為的文件CheckTokenMetadata.cdc。在該文件中,添加以下內容:

  1. import PinataPartyContract from 0xf8d6e0586b0a20c7 
  2.  
  3. pub fun main() : {String : String} { 
  4.     let nftOwner = getAccount(0xf8d6e0586b0a20c7) 
  5.     // log("NFT Owner")     
  6.     let capability = nftOwner.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver) 
  7.  
  8.     let receiverRef = capability.borrow() 
  9.         ?? panic("Could not borrow the receiver reference"
  10.  
  11.     return receiverRef.getMetadata(id: 1) 

可以以類似于以太坊智能合約上的只讀方法的方式來考慮該腳本。他們是免費的,只需從合同中返回數據。

在我們的腳本中,我們正在從部署的地址導入我們的合同。然后,我們定義一個main函數(這是運行腳本所需的函數名稱)。在此函數內部,我們定義了三個變量:

  • nftOwner:這只是擁有NFT的帳戶。我們從也部署了合同的帳戶中鑄造了NFT,因此在我們的示例中,這兩個地址是相同的。取決于將來的合同設計,這可能并不總是正確的。
  • 功能:我們需要從已部署的合同中“借用”可用的功能(或功能)。請記住,這些功能是受訪問控制的,因此,如果某功能對于嘗試借用它的地址不可用,則腳本將失敗。我們正在從NFTReceiver資源中借用能力。
  • receiverRef:該變量只是利用我們的能力,并告訴腳本從已部署的合同中借用。

現在,我們可以調用函數(可用的函數)了。在這種情況下,我們要確保所討論的地址實際上已收到我們鑄造的NFT,然后我們要查看與令牌關聯的元數據。

讓我們運行我們的腳本,看看我們得到了什么。在命令行上運行以下命令:

  1. flow scripts execute ./scripts/CheckTokenMetadata.cdc 

對于元數據輸出,您應該看到類似以下的輸出:

  1. {"name""The Big Swing""swing_velocity""29""swing_angle""45""rating""5""uri""ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6"

恭喜你!您已成功創建Flow智能合約,鑄造了令牌以及與該令牌相關的元數據,并將該令牌的基礎數字資產存儲在IPFS上。接下來第二個部分的教程將構建一個簡單的React應用程序,該應用程序與Flow智能合約對接,以進行身份驗證并獲取用戶擁有的NFT,敬請期待。

 

責任編輯:武曉燕 來源: 區塊鏈研究實驗室
相關推薦

2021-09-23 11:53:06

網絡安全數據技術

2022-10-11 09:05:58

IPFS區塊鏈存儲

2022-04-08 08:00:00

NFT數字資產騙局

2021-03-11 19:13:04

NFT合約智能

2021-06-01 09:27:52

視頻動畫Remotion

2023-06-29 14:34:49

2021-04-08 18:39:57

JavaScriptExpress區塊鏈

2023-04-01 10:32:36

2022-09-23 15:38:19

NFT電影業代幣

2021-04-27 14:49:14

IPFS分布式協議

2022-05-30 15:27:48

數字資產NFT區塊鏈

2021-05-13 16:13:21

區塊鏈以太坊NFT

2022-08-04 14:36:55

NFT加密錢包黑客

2018-09-30 14:45:15

IPFSHTTP互聯網協議

2022-06-08 15:44:51

區塊鏈NFT金融

2023-06-28 15:53:25

虛擬機Linux

2023-05-19 08:00:00

ReactJSJavaScript蜘蛛圖

2014-05-12 16:40:13

Linux命令快照

2022-08-03 19:32:50

NFT球迷體育行業

2022-07-07 11:14:12

MetaNFT數字收藏品
點贊
收藏

51CTO技術棧公眾號

精品人妻一区二区三区日产| 一级特黄妇女高潮| 中文字幕免费在线看| 日韩dvd碟片| 日韩西西人体444www| 婷婷五月综合缴情在线视频| 成人精品一区二区三区校园激情| 激情六月婷婷综合| 久久久久亚洲精品国产| 日本污视频网站| 99国产精品免费网站| 午夜婷婷国产麻豆精品| 亚洲国产精品www| 亚洲第一精品网站| 日韩一区欧美二区| 欧美黑人性生活视频| 男人舔女人下部高潮全视频| 久久久久久久久成人| 色婷婷av久久久久久久| 91免费版看片| 福利成人在线观看| 波多野结衣中文字幕一区| 国产欧美日韩视频| 国语对白永久免费| 国产尤物精品| 日韩视频在线免费| 强迫凌虐淫辱の牝奴在线观看| 中文成人在线| 欧美性色xo影院| www.九色.com| a毛片在线看免费观看| 国产农村妇女毛片精品久久麻豆 | 欧美 亚洲 另类 激情 另类| 欧美成人久久| 日韩最新在线视频| 第一次破处视频| 妖精视频一区二区三区| 精品国产髙清在线看国产毛片| 黄大色黄女片18第一次| 日韩毛片免费观看| 黄色91在线观看| 国产高清www| 亚洲丝袜精品| 亚洲嫩草精品久久| 国产又粗又硬又长| 久久日韩视频| 亚洲日本青草视频在线怡红院| 无码免费一区二区三区免费播放 | 久久久久在线视频| 亚洲一区二区毛片| 国产69久久精品成人| 日本高清www免费视频| 精品69视频一区二区三区Q| 欧美久久精品一级黑人c片| 九九这里只有精品视频| 日韩精品久久久久久久电影99爱| 亚洲性无码av在线| 快灬快灬一下爽蜜桃在线观看| 久久99国内| 亚洲片av在线| 久久久精品成人| 日韩精品影视| 久久精品国产亚洲| 男女做暖暖视频| 国内精品福利| 91精品国产高清自在线| 可以免费看的av毛片| 午夜在线播放视频欧美| 全球成人中文在线| 国产精品无码一区| 精品制服美女丁香| 99超碰麻豆| 亚洲人午夜射精精品日韩| 99国产精品久久久久久久久久久 | 亚洲午夜久久久久中文字幕久| 日本一道在线观看| 91超碰国产在线| 欧美日韩色婷婷| 亚洲激情在线观看视频| 国产精品麻豆| 亚洲国产精品久久精品怡红院| 韩国三级hd两男一女| 国产成人精品三级高清久久91| 最近2019中文字幕一页二页| 国产女人18水真多毛片18精品| 国内自拍视频一区二区三区 | 麻豆天美蜜桃91| 精品白丝av| 国产精品99一区| 国产毛片一区二区三区va在线| 成人丝袜18视频在线观看| 欧美大香线蕉线伊人久久国产精品 | 亚洲电影在线观看| 国产三级av在线播放| 亚洲最大av| 欧美一区二区三区图| 91亚洲国产成人久久精品麻豆 | 永久免费看mv网站入口78| 99久久婷婷这里只有精品 | 国产精品jizz在线观看老狼| 欧洲一区二区三区| 色婷婷狠狠综合| 中文字幕亚洲日本| 国产一区网站| 欧美日韩国产123| 国产免费一级视频| 国产成人鲁色资源国产91色综| 久久亚洲国产精品日日av夜夜| 日本电影在线观看网站| 动漫精品一区二区| 国产不卡的av| 波多野结衣在线观看一区二区三区| 不卡av电影在线观看| 国产乱国产乱老熟| 岛国一区二区三区| 一级二级三级欧美| 在线手机中文字幕| 亚洲精品一区二区三区在线观看| 久久精品视频18| 亚洲黄色精品| 91九色对白| 视频三区在线| 欧美性大战xxxxx久久久| 超碰caoprom| 欧美二区视频| 91九色国产社区在线观看| 看电影就来5566av视频在线播放| 亚洲国产精品影院| 国产老头和老头xxxx×| 99精品视频精品精品视频| 国产aⅴ夜夜欢一区二区三区| 少妇高潮一区二区三区69| 最近日韩中文字幕| 向日葵污视频在线观看| 国产不卡av一区二区| 欧美专区第一页| 四虎永久在线观看| 亚洲自拍偷拍图区| 亚洲三级在线视频| 午夜激情久久| 成人精品aaaa网站| 日本电影在线观看网站| 欧美日韩午夜在线| 黄色一级片一级片| 麻豆精品视频在线观看免费| 日本一区二区三区免费看| 日韩电影毛片| 日韩精品极品在线观看播放免费视频| 国产真人真事毛片| 成人黄色在线网站| www.av片| 色婷婷久久久| 青草成人免费视频| 黄上黄在线观看| 欧美亚洲国产怡红院影院| 国产jjizz一区二区三区视频| 久久久久国产精品一区二区| 欧美日本亚洲| 亚洲第一会所001| 有码中文亚洲精品| 国产精品爽爽久久久久久| 亚洲精品一二三| 亚洲熟妇一区二区| 国产一区二区高清| 欧美性bbwbbwbbwhd| 日本一道高清亚洲日美韩| 综合网日日天干夜夜久久| 91影院在线播放| 亚洲综合999| 人妻在线日韩免费视频| 首页国产欧美日韩丝袜| 亚洲午夜精品久久| 亚洲精品观看| 日本a级片电影一区二区| 成人福利在线| 日韩一区二区三区精品视频| 国产主播在线播放| 久久久久青草大香线综合精品| 国产超碰在线播放| 欧美阿v一级看视频| 国产中文一区二区| 99欧美精品| 欧美另类在线播放| 青春有你2免费观看完整版在线播放高清| 色呦呦国产精品| 91高清免费看| www国产亚洲精品久久麻豆| 鲁一鲁一鲁一鲁一av| 欧美片第1页综合| 欧美另类高清视频在线| 电影中文字幕一区二区| 国内久久久精品| 日韩在线免费电影| 亚洲精品99久久久久| 亚洲成人av网址| 亚洲韩国精品一区| 中文字幕精品亚洲| 99精品视频在线播放观看| 在线免费观看av的网站| 激情婷婷欧美| 一区二区日本伦理| 日韩美脚连裤袜丝袜在线| 成人久久久久久久| 偷拍精品精品一区二区三区| 欧美激情一区二区三区高清视频| 精品视频三区| 精品国产一区久久| 亚洲网站免费观看| 狠狠操狠狠色综合网| 色婷婷在线视频观看| 日本一区二区视频在线观看| 国产精品久久久久久久无码| 精品在线你懂的| 国产三级三级三级看三级| 亚洲理伦在线| 青青视频免费在线观看| 日韩一区亚洲二区| 日本视频一区二区不卡| 韩国女主播一区二区三区| 亚洲综合小说区| 欧美aaaaaaaa| 国产成人精品一区二区| 毛片电影在线| 久久久久国产精品免费网站| 理论片午午伦夜理片在线播放| 亚洲欧美日韩在线一区| 日本精品一二区| 欧美videofree性高清杂交| 国产日韩免费视频| 欧美日韩精品欧美日韩精品一综合| 亚洲av中文无码乱人伦在线视色| 亚洲一区国产视频| 欧洲猛交xxxx乱大交3| 中文字幕在线不卡国产视频| 五月天综合视频| 久久综合色综合88| 美女又爽又黄视频毛茸茸| 成人h版在线观看| 少妇搡bbbb搡bbb搡打电话| 国产超碰在线一区| 俄罗斯女人裸体性做爰| 国产成人日日夜夜| 国产在线观看免费播放| 国产精品1024| 亚洲精品成人无码毛片| 高潮精品一区videoshd| 国产高潮失禁喷水爽到抽搐| 成人黄页在线观看| 久久久国产精品无码| 91社区在线播放| 国产熟妇搡bbbb搡bbbb| 久久精品一区二区| 99精品全国免费观看| 中文字幕第一区综合| 手机看片国产日韩| 亚洲精品网站在线观看| 欧美色图亚洲天堂| 亚洲成人在线观看视频| 中国一级免费毛片| 欧美中文字幕亚洲一区二区va在线 | 免费a在线观看播放| 97久久精品人人澡人人爽| 欧美亚一区二区三区| 国产日本欧洲亚洲| 日韩精品一区二区三区在线视频| 中文字幕日韩一区| 免费在线一区二区三区| 午夜精品国产更新| 黄色片网站在线免费观看| 色偷偷成人一区二区三区91| 自拍偷拍色综合| 欧美一级日韩一级| 欧美一级特黄aaaaaa大片在线观看| 日韩成人av一区| melody高清在线观看| 欧美www在线| 色吧亚洲日本| 国产精品视频区1| 日本高清久久| 日本成人看片网址| 亚洲欧美综合久久久| 国产91xxx| 日本不卡不码高清免费观看| 日本黄色一级网站| 久久综合久久综合亚洲| 中文字幕观看av| 亚洲成人av电影在线| 婷婷激情五月综合| 欧美一激情一区二区三区| 女人天堂在线| 久久视频在线观看免费| 在线人成日本视频| 91精品网站| 狠狠做六月爱婷婷综合aⅴ| 日本成人在线不卡| 日韩av一区二区在线影视| 精品国产一二区| 国产欧美精品一区aⅴ影院 | 一本久久综合亚洲鲁鲁五月天 | 日韩av超清在线观看| 亚洲永久免费观看| 国产日产精品_国产精品毛片| 91视频成人免费| 久久精品女人| 日本国产在线视频| 亚洲欧洲日产国产综合网| 中文字幕一区在线播放| 欧美成人国产一区二区| 在线观看免费黄视频| 97人人做人人爱| 日韩激情综合| 亚洲看片网站| 亚洲欧美成人| 国产免费一区二区三区最新6| 国产精品久久二区二区| 伊人中文字幕在线观看| 精品播放一区二区| 九色porny在线| 国产成人在线精品| 奇米影视777在线欧美电影观看| 日韩不卡一二区| 蜜臀av一区二区三区| 人妻少妇精品视频一区二区三区| 亚洲综合成人在线| 99热这里只有精品66| 最近免费中文字幕视频2019| 深夜成人福利| 精品一区二区三区免费毛片| 黑人一区二区三区四区五区| 亚洲国产欧美91| 国产精品国产精品国产专区不片| 国产精品21p| 日韩精品在线观看网站| а√在线中文网新版地址在线| 成人三级在线| 亚洲小说区图片区| 美女日批在线观看| 亚洲精品伦理在线| 99久久免费国产精精品| 久久综合国产精品台湾中文娱乐网| 成人四虎影院| 亚洲精品在线免费| 美女视频一区二区三区| 538精品视频| 欧美人体做爰大胆视频| 秋霞午夜在线观看| 91免费欧美精品| 伊人久久大香线蕉精品组织观看| 91亚洲精品久久久蜜桃借种| 国产精品乱人伦中文| 在线观看日批视频| 日韩在线激情视频| 国产精品高清一区二区| 免费观看国产视频在线| 国产乱人伦精品一区二区在线观看| 成人在线观看小视频| 91精品黄色片免费大全| 肉体视频在线| 国产精品yjizz| 国产亚洲亚洲| 91禁男男在线观看| 欧美一区二区在线免费观看| 午夜伦理在线视频| 国产在线欧美日韩| 日韩精品乱码av一区二区| 久久午夜精品视频| 91精品国产免费| 成人超碰在线| 欧美一级二级三级| 精品一区二区三区在线播放| 欧美日韩免费一区二区| 精品播放一区二区| 日本少妇一区| 波多野结衣 作品| 久久综合九色综合欧美就去吻| 伊人久久久久久久久久久久| 久久久999国产精品| 99这里只有精品视频| 成人在线观看黄| 亚洲精选在线视频| 四虎在线免费观看| 国产欧美婷婷中文| 亚洲人人精品| 国产一二三四区在线| 日韩欧美精品在线视频| 一级毛片久久久| 亚洲美女自拍偷拍| 97精品超碰一区二区三区| 在线观看国产一区二区三区| 国内成人精品一区| av资源久久| 国产免费一区二区三区最新6| 欧美亚洲一区二区在线| av福利在线导航| 亚洲一区二区三区涩| 成人av在线一区二区| 日本视频www色| 韩国精品美女www爽爽爽视频| 欧美一区二区三| 中文字幕a在线观看|