3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vtk删除一个actor_如何构建一个基于actor的简单区块链

發(fā)布時間:2023/11/29 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vtk删除一个actor_如何构建一个基于actor的简单区块链 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

vtk刪除一個actor

Scalachain is a blockchain built using the Scala programming language and the actor model (Akka Framework).

Scalachain是使用Scala編程語言和參與者模型( Akka Framework )構(gòu)建的區(qū)塊鏈。

In this story I will show the development process to build this simple prototype of a blockchain. This means that the project is not perfect, and there may be better implementations. For all these reasons any contribution — may it be a suggestion, or a PR on the GitHub repository — is very welcome! :-)

在這個故事中,我將展示構(gòu)建此簡單區(qū)塊鏈原型的開發(fā)過程。 這意味著該項目并不完美,并且可能會有更好的實現(xiàn)。 由于所有這些原因,我們非常歡迎您提供任何意見(包括建議或GitHub 存儲庫上的PR)! :-)

Let’s start with a little introduction to the blockchain. After that we can define the simplified model that we will implement.

讓我們從對區(qū)塊鏈的一些介紹開始。 之后,我們可以定義將要實現(xiàn)的簡化模型。

區(qū)塊鏈快速入門 (Quick Introduction to the blockchain)

There a lot of good articles that explain how a blockchain works, so I will do a high level introduction just to provide some context to this project.

有很多很好的文章解釋了區(qū)塊鏈的工作原理,因此我將做一個高層次的介紹,只是為該項目提供一些背景信息。

The blockchain is a distributed ledger: it registers some transaction of values (like coins) between a sender and a receiver. What makes a blockchain different from a traditional database is the decentralized nature of the blockchain: it is distributed among several communicating nodes that guarantee the validity of the transactions registered.

區(qū)塊鏈是一種分布式賬本 :它在發(fā)送方和接收方之間注冊一些價值交易(如硬幣)。 區(qū)塊鏈與傳統(tǒng)數(shù)據(jù)庫的不同之處在于區(qū)塊鏈的分散性:它分布在多個通信節(jié)點之間,以保證注冊交易的有效性。

The blockchain stores transactions in blocks, that are created —we say mined — by nodes investing computational power. Every block is created by solving a cryptographic puzzle that is hard to solve, but easy to verify. In this way, every block represents the work needed to solve such puzzle. This is the reason why the cryptographic puzzle is called the Proof of Work: the solution of the puzzle is the proof that a node spent a certain amount of work to solve it and mine the block.

區(qū)塊鏈將交易存儲在區(qū)塊中,區(qū)塊是由投資計算能力的節(jié)點創(chuàng)建的(我們說是開采的) 。 每個區(qū)塊都是通過解決難以解決但易于驗證的密碼難題創(chuàng)建的。 這樣,每個方塊代表解決此類難題所需的工作。 這就是密碼難題被稱為工作量證明的原因:難題的解決方案是節(jié)點花費大量工作來解決它和挖掘區(qū)塊的證明。

Why do nodes invest computational power to mine a block? Because the creation of a new block is rewarded by a predefined amount of coins. In this way nodes are encouraged to mine new blocks, contributing in the growth and strength of the blockchain.

為什么節(jié)點要投入計算能力來挖掘一塊? 因為新塊的創(chuàng)建將獲得預(yù)定義數(shù)量的硬幣獎勵。 通過這種方式,鼓勵節(jié)點挖掘新區(qū)塊,為區(qū)塊鏈的增長和實力做出貢獻。

The solution of the Proof Of Work depends on the values stored in the last mined block. In this way every block is chained to the previous one. This means that, to change a mined block, a node should mine again all the blocks above the modified one. Since every block represents an amount of work, this operation would be unfeasible once several blocks are mined upon the modified one. This is the foundation of the distributed consensus, The agreement of all the nodes on the validity of the blocks (that is the transactions) stored in the blockchain.

工作量證明的解決方案取決于存儲在最后一個開采區(qū)塊中的值。 這樣,每個塊都鏈接到前一個塊。 這意味著,要更改已開采的區(qū)塊,節(jié)點應(yīng)再次開采已修改區(qū)塊上方的所有區(qū)塊。 由于每個塊代表大量的工作,因此一旦在修改后的塊中挖掘了幾個塊,此操作將是不可行的。 這是分布式 共識的基礎(chǔ),所有節(jié)點對區(qū)塊鏈中存儲的區(qū)塊(即交易)有效性的共識

It may happen that different nodes mine a block at the same time, creating different “branches” from the same blockchain — this is called a fork in the blockchain. This situation is solved when a branch becomes longer than the others: the longest chain always wins, so the winning branch becomes the new blockchain.

可能會發(fā)生不同的節(jié)點同時挖掘一個區(qū)塊,從而從同一區(qū)塊鏈創(chuàng)建不同的“分支”的情況-這在區(qū)塊鏈中稱為分叉 。 當(dāng)分支變得比其他分支更長時,這種情況就解決了:最長的鏈總是獲勝,因此獲勝的分支成為新的區(qū)塊鏈。

區(qū)塊鏈模型 (The blockchain model)

Scalachain is based on a blockchain model that is a simplification of the Bitcoin one.

Scalachain基于一種區(qū)塊鏈模型,該模型簡化了比特幣。

The main components of our blockchain model are the Transaction, the Chain, the Proof of Work (PoW) algorithm, and the Node. The transactions are stored inside the blocks of the chain, that are mined using the PoW. The node is the server that runs the blockchain.

我們的區(qū)塊鏈模型的主要組件是交易,鏈,工作量證明(PoW)算法和節(jié)點。 事務(wù)存儲在鏈的各個塊中,這些塊使用PoW進行挖掘。 節(jié)點是運行區(qū)塊鏈的服務(wù)器。

Transaction

交易

Transactions register the movement of coins between two entities. Every transaction is composed by a sender, a recipient, and an amount of coin. Transactions will be registered inside the blocks of our blockchain.

交易記錄了兩個實體之間硬幣的移動。 每筆交易都由發(fā)送者,接收者和一定數(shù)量的硬幣組成。 交易將被注冊在我們的區(qū)塊鏈中。

Chain

The chain is a linked list of blocks containing a list of transactions. Every block of the chain has an index, the proof that validates it (more on this later), the list of transactions, the hash of the previous block, the list of previous blocks, and a timestamp. Every block is chained to the previous one by its hash, that is computed converting the block to a JSON string and then hashing it through a SHA-256 hashing function.

鏈是包含事務(wù)列表的塊的鏈接列表。 鏈中的每個區(qū)塊都有一個索引,對其進行驗證的證明(稍后會詳細介紹),事務(wù)列表,上一個區(qū)塊的哈希,上一個區(qū)塊的列表以及時間戳。 每個塊都通過其哈希值鏈接到前一個塊,該哈希值是將塊轉(zhuǎn)換為JSON字符串,然后通過SHA-256哈希函數(shù)對其進行哈希計算。

PoW

工作量

The PoW algorithm is required to mine the blocks composing the blockchain. The idea is to solve a cryptographic puzzle that is hard to solve, but easy to verify having the proof. The PoW algorithm that is implemented in Scalachain is similar to the Bitcoin one (based on Hashcash). It consists in finding a hash with N leading zeros, that is computed starting from the hash of the last block and a number, that is the proof of our algorithm.

需要PoW算法來挖掘組成區(qū)塊鏈的區(qū)塊。 這個想法是要解決一個密碼難題,這個難題很難解決,但是容易驗證有證據(jù)。 Scalachain中實現(xiàn)的PoW算法類似于比特幣一種(基于Hashcash )。 它包括找到一個具有N個前導(dǎo)零的哈希,該哈希從最后一個塊的哈希和一個數(shù)字開始計算,這是我們算法的證明。

We can formalize it as:

我們可以將其形式化為:

NzerosHash = SHA-256(previousNodeHash + proof)

The higher is N, the harder is to find the proof. In Scalachain N=4 (It will be configurable eventually).

N越高,找到證明就越難。 在Scalachain中,N = 4(最終將可配置)。

Node

節(jié)點

The Node is the server running our blockchain. It provides some REST API to interact with it and perform basic operations such as send a new transaction, get the list of pending transactions, mine a block, and get the current status of the blockchain.

節(jié)點是運行我們的區(qū)塊鏈的服務(wù)器。 它提供了一些REST API與之交互并執(zhí)行基本操作,例如發(fā)送新交易,獲取待處理交易列表,挖掘區(qū)塊并獲取區(qū)塊鏈的當(dāng)前狀態(tài)。

Scala中的區(qū)塊鏈實施 (Blockchain implementation in Scala)

We are going to implement the defined model using the Scala Programming Language. From an high level view, the things we need to implement a blockchain are:

我們將使用Scala編程語言實現(xiàn)定義的模型。 從高級的角度來看,我們實現(xiàn)區(qū)塊鏈所需要做的事情是:

  • transactions

    交易
  • the chain of blocks containing lists of transactions

    包含交易清單的區(qū)塊鏈
  • the PoW algorithm to mine new blocks

    PoW算法來挖掘新塊

These components are the essential parts of a blockchain.

這些組件是區(qū)塊鏈的基本組成部分。

Transaction

交易

The transaction is a very simple object: it has a sender, a recipient and a value. We can implement it as a simple case class.

事務(wù)是一個非常簡單的對象:它有一個發(fā)送者,一個接收者和一個值。 我們可以將其實現(xiàn)為簡單的case class 。

case class Transaction(sender: String, recipient: String, value: Long)

Chain

The chain is the core of our blockchain: it is a linked list of blocks containing transactions.

鏈是我們區(qū)塊鏈的核心:它是包含交易的區(qū)塊的鏈表。

sealed trait Chain {val index: Intval hash: Stringval values: List[Transaction]val proof: Longval timestamp: Long }

We start by creating a sealed trait that represents the block of our chain. The Chain can have two types: it can be an EmptyChain or a ChainLink. The former is our block zero (the genesis block), and it is implemented as a singleton (it is a case object), while the latter is a regular mined block.

我們從創(chuàng)建一個sealed trait開始,該sealed trait代表了我們的區(qū)塊鏈。 Chain可以有兩種類型:它可以是EmptyChain或ChainLink 。 前者是我們的零區(qū)塊( 創(chuàng)世區(qū)塊 ),它被實現(xiàn)為一個單例(它是一個case object ),而后者是一個常規(guī)的開采區(qū)塊。

case class ChainLink(index: Int, proof: Long, values: List[Transaction], previousHash: String = "", tail: Chain = EmptyChain, timestamp: Long = System.currentTimeMillis()) extends Chain {val hash = Crypto.sha256Hash(this.toJson.toString) }case object EmptyChain extends Chain {val index = 0val hash = "1"val values = Nilval proof = 100Lval timestamp = System.currentTimeMillis() }

Let’s look more in detail at our chain. It provides an index, that is the current height of the blockchain. There is the list of Transaction, the proof that validated the block, and the timestamp of the block creation. The hash value is set to a default one in the EmptyChain, while in the ChainLink it is computed converting the object to its JSON representation and hashing it with an utility function (see the crypto package in the repository). The ChainLink provides also the hash of the previous block in the chain (our link between blocks). The tail field is a reference to the previously mined blocks. This may not be the most efficient solution, but it is useful to see how the blockchain grows in our simplified implementation.

讓我們詳細了解一下我們的鏈。 它提供了一個索引,即區(qū)塊鏈的當(dāng)前高度。 這里有Transaction清單,驗證區(qū)塊的證明以及區(qū)塊創(chuàng)建的時間戳。 哈希值在EmptyChain設(shè)置為默認值,而在ChainLink ,將其計算為將對象轉(zhuǎn)換為其JSON表示并使用實用程序函數(shù)對其進行哈希處理(請參見存儲庫中的crypto包)。 ChainLink還提供鏈中上一個塊(我們的塊之間的鏈接)的哈希。 尾部字段是對先前開采的區(qū)塊的引用。 這可能不是最有效的解決方案,但是了解簡化的實現(xiàn)中區(qū)塊鏈的增長方式很有用。

We can improve our Chain with some utilities. We can add it a companion object that defines an apply method to create a new chain passing it a list of blocks. A companion object is like a “set of static methods” — doing an analogy with Java — that has complete access rights on the fields and methods of the class/trait.

我們可以使用一些實用程序來改進我們的Chain 。 我們可以為它添加一個伴隨對象 ,該對象定義了apply方法,以創(chuàng)建一個新鏈,將鏈列表傳遞給它。 伴隨對象就像一個“靜態(tài)方法集”(類似于Java),它具有對類/特征的字段和方法的完全訪問權(quán)限。

object Chain {def apply[T](b: Chain*): Chain = {if (b.isEmpty) EmptyChainelse {val link = b.head.asInstanceOf[ChainLink]ChainLink(link.index, link.proof, link.values, link.previousHash, apply(b.tail: _*))}} }

If the list of blocks is empty, we simply initialize our blockchain with an EmptyChain. Otherwise we create a new ChainLink adding as a tail the result of the apply method on the remaining blocks of the list. In this way the list of blocks is added following the order of the list.

如果塊列表為空,則只需使用EmptyChain初始化我們的EmptyChain鏈。 否則,我們將創(chuàng)建一個新的ChainLink作為尾部,在列表的其余塊上添加apply方法的結(jié)果。 這樣,將按照列表的順序添加塊列表。

It would be nice to have the possibility to add a new block to our chain using a simple addition operator, like the one we have on List. We can define our own addition operator :: inside the Chain trait.

能夠使用一個簡單的加法運算符(如List上的加法運算符)將新塊添加到我們的鏈中,將是很好的。 我們可以在Chain特征中定義自己的加法運算符:: 。

sealed trait Chain {val index: Intval hash: Stringval values: List[Transaction]val proof: Longval timestamp: Longdef ::(link: Chain): Chain = link match {case l:ChainLink => ChainLink(l.index, l.proof, l.values, this.hash, this)case _ => throw new InvalidParameterException("Cannot add invalid link to chain")} }

We pattern match on the block that is passed as an argument: if it is a valid ChainLink object we add it as the head of our chain, putting the chain as the tail of the new block, otherwise we throw an exception.

我們對作為參數(shù)傳遞的塊進行模式匹配:如果它是有效的ChainLink對象,則將其添加為鏈的頭部,將鏈作為新塊的尾部,否則拋出異常。

PoW

工作量

The PoW algorithm is fundamental for the mining of new blocks. We implement it as a simple algorithm:

PoW算法是挖掘新塊的基礎(chǔ)。 我們將其實現(xiàn)為一個簡單的算法:

  • Take the hash of the last block and a number representing the proof.

    取最后一塊的哈希值和代表證明的數(shù)字。
  • 2. Concatenate the hash and the proof in a string.

    2.將哈希和證明連接在字符串中。

    3. hash the resulting string using the SHA-256 algorithm.

    3.使用SHA-256算法對所得字符串進行哈希處理。

    4. check the 4 leading characters of the hash: if they are four zeros return the proof.

    4.檢查哈希的4個前導(dǎo)字符:如果它們是四個零,則返回證明。

    5. otherwise repeat the algorithm increasing the proof by one.

    5.否則重復(fù)算法,將證明加一。

    This a simplification of the HashCash algorithm used in the Bitcoin blockchain.

    這是比特幣區(qū)塊鏈中使用的HashCash算法的簡化。

    Since it is a recursive function, we can implement it as a tail recursive one to improve the usage of resources.

    由于它是一種遞歸函數(shù),因此我們可以將其實現(xiàn)為尾遞歸函數(shù),以提高資源利用率。

    object ProofOfWork {def proofOfWork(lastHash: String): Long = {@tailrecdef powHelper(lastHash: String, proof: Long): Long = {if (validProof(lastHash, proof))proofelsepowHelper(lastHash, proof + 1)}val proof = 0powHelper(lastHash, proof)}def validProof(lastHash: String, proof: Long): Boolean = {val guess = (lastHash ++ proof.toString).toJson.toStringval guessHash = Crypto.sha256Hash(guess)(guessHash take 4) == "0000"} }

    The validProof function is used to check if the proof we are testing is the correct one. The powHelper function is a helper function that executes our loop using tail recursion, increasing the proof at each step. The proofOfWork function wrap all the things up, and is exposed by the ProofOfWork object.

    validProof函數(shù)用于檢查我們正在測試的證明是否正確。 powHelper函數(shù)是一個輔助函數(shù),它使用尾部遞歸執(zhí)行我們的循環(huán),從而增加了每一步的證明。 proofOfWork函數(shù)將所有內(nèi)容包裝起來,并由ProofOfWork對象公開。

    演員模型 (The actor model)

    The actor model is a programming model designed for concurrent processing, scalability, and fault tolerance. The model defines the atomic elements that compose the software systems — the actors — and the way this elements interact between them. In this project we will use the actor model implemented in Scala by the Akka Framework.

    actor模型是一種為并行處理可伸縮性容錯能力設(shè)計的編程模型。 該模型定義了構(gòu)成軟件系統(tǒng)的原子元素- 參與者 -以及這些元素之間的交互方式。 在這個項目中,我們將使用由Akka Framework在Scala中實現(xiàn)的actor模型。

    Actor

    演員

    The actor is the atomic unit of the actor model. it is a computational unit that can send and receive messages. Every actor has an internal private state and a mailbox. When an actor receives and compute a message, it can react in 3 ways:

    角色是角色模型的原子單位。 它是可以發(fā)送和接收消息的計算單元。 每個參與者都有一個內(nèi)部私有狀態(tài)和一個郵箱。 當(dāng)一個參與者接收并計算一條消息時,它可以通過三種方式做出React:

    • Send a message to another actor.

      向其他演員發(fā)送消息。
    • Change its internal state.

      更改其內(nèi)部狀態(tài)。
    • Create another actor.

      創(chuàng)建另一個演員。

    Communication is asynchronous, and messages are popped out from the mailbox and processed in series. To enable the parallel computation of messages you need to create several actors. Many actors together crate an actor system. The behavior of the application arises from the interaction between actors providing different functionalities.

    通信是異步的 ,并且消息從郵箱彈出并按順序處理。 要啟用消息的并行計算,您需要創(chuàng)建多個參與者。 許多演員共同創(chuàng)建一個演員系統(tǒng) 。 應(yīng)用程序的行為源自提供不同功能的參與者之間的交互。

    Actors are independent

    演員是獨立的

    Actors are independent one to another, and they do not share their internal state. This fact has a couple of important consequences:

    演員彼此獨立,他們沒有內(nèi)部狀態(tài)。 這個事實有兩個重要的后果:

    1. Actors can process messages without side-effects one to another.

    1.演員可以處理沒有副作用的消息。

    2. It’s not important where an actor is — be it your laptop, a sever, or in the cloud — once we know its address we can request its services sending it a message.

    2.演員所在的位置(無論是您的筆記本電腦,服務(wù)器還是云)都不重要,一旦我們知道了演員的地址,便可以請求其發(fā)送消息的服務(wù)。

    The first point makes concurrent computation very easy. We can be sure that the processing of a message will not interfere with the processing of another one. To achieve concurrent processing we can deploy several actors able to process the same kind of message.

    第一點使并發(fā)計算非常容易。 我們可以確保處理一條消息不會干擾另一條消息的處理。 為了實現(xiàn)并發(fā)處理,我們可以部署幾個能夠處理相同類型消息的參與者。

    The second point is all about scalability: we need more computational power? No problem: we can start a new machine and deploy new actors that will join the existing actor system. Their mailbox addresses will be discoverable by existing actors, that will start communicate with them.

    第二點是關(guān)于可伸縮性的 :我們需要更多的計算能力嗎? 沒問題:我們可以啟動一臺新機器并部署新角色,這些角色將加入現(xiàn)有角色系統(tǒng)。 現(xiàn)有參與者可以發(fā)現(xiàn)他們的郵箱地址,并開始與他們進行通信。

    Actors are supervised

    演員受到監(jiān)督

    As we said in the description of the actor, one of the possible reaction to a message is the creation of other actors. When this happens, the father becomes the supervisor of its children. If a children fails, the supervisor can decide the action to take, may it be create a new actor, ignore the failure, or throw it up to its own supervisor. In this way the Actor System becomes a hierarchy tree, each node supervising its children. This is the way the actor model provides fault tolerance.

    正如我們在演員描述中所說的那樣,對消息的可能React之一就是創(chuàng)建其他演員。 發(fā)生這種情況時,父親變成了孩子們的導(dǎo)師 。 如果孩子失敗了,監(jiān)督者可以決定要采取的行動,可以是創(chuàng)建新的演員,忽略失敗,還是將其交給自己的監(jiān)督者。 這樣,Actor系統(tǒng)就變成了一個層次樹,每個節(jié)點都在監(jiān)督其子節(jié)點。 這就是參與者模型提供容錯能力的方式

    經(jīng)紀人,一個簡單的演員 (Broker, a simple actor)

    The first actor we are going to implement is the Broker Actor: it is the manager of the transactions of our blockchain. Its responsibilities are the addition of new transactions, and the retrieval of pending ones.

    我們要實施的第一個參與者是經(jīng)紀人參與者:它是我們區(qū)塊鏈交易的管理者。 它的職責(zé)是添加新交易以及檢索未決交易。

    The Broker Actor reacts to three kind of messages, defined in the companion object of the Broker class:

    Broker Actor對在Broker類的companion object中定義的三種消息作出React:

    object Broker {sealed trait BrokerMessagecase class AddTransaction(transaction: Transaction) extends BrokerMessagecase object GetTransactions extends BrokerMessagecase object Clear extends BrokerMessageval props: Props = Props(new Broker) }

    We create a trait BrokerMessage to identify the messages of the Broker Actor. Every other message will extend this trait. AddTransaction adds a new transaction to the list of pending ones. GetTransaction retrieve the pending transactions, and Clear empties the list. The props value is used to initialize the actor when it will be created.

    我們創(chuàng)建一個特征BrokerMessage來標識Broker Actor的消息。 其他所有消息都將擴展此特性。 AddTransaction將新事務(wù)添加到掛起的事務(wù)列表中。 GetTransaction檢索掛起的事務(wù),而Clear清空列表。 props值用于在創(chuàng)建actor時對其進行初始化。

    class Broker extends Actor with ActorLogging {import Broker._var pending: List[Transaction] = List()override def receive: Receive = {case AddTransaction(transaction) => {pending = transaction :: pendinglog.info(s"Added $transaction to pending Transaction")}case GetTransactions => {log.info(s"Getting pending transactions")sender() ! pending}case Clear => {pending = List()log.info("Clear pending transaction List")}} }

    The Broker class contains the business logic to react to the different messages. I won’t go into the details because it is trivial. The most interesting thing is how we respond to a request of the pending transactions. We send them to the sender() of the GetTransaction message using the tell (!) operator. This operator means “send the message and don’t wait for a response” — aka fire-and-forget.

    Broker class包含對不同消息做出React的業(yè)務(wù)邏輯。 我將不贅述,因為它是微不足道的。 最有趣的是我們?nèi)绾雾憫?yīng)未決交易的請求。 我們使用tell ( ! )運算符將它們sender()到GetTransaction消息的sender() 。 此運算符的意思是“發(fā)送消息,不要等待響應(yīng)”,又名即發(fā)即棄。

    礦工,不同州的演員 (Miner, an actor with different states)

    The Miner Actor is the one mining new blocks for our blockchain. Since we don’t want mine a new block while we are mining another one, the Miner Actor will have two states: ready, when it is ready to mine a new block, and busy, when it is mining a block.

    礦工演員是為我們的區(qū)塊鏈挖掘新區(qū)塊的人之一。 由于我們不希望在挖掘另一個區(qū)塊時挖掘一個新區(qū)塊,因此礦工Actor將具有兩種狀態(tài): ready ,準備挖掘一個新區(qū)塊的狀態(tài)和busy ,挖掘一個區(qū)塊的狀態(tài)。

    Let’s start by defining the companion object with the messages of the Miner Actor. The pattern is the same, with a sealed trait — MinerMessage — used to define the kind of messages this actor reacts to.

    讓我們開始定義帶有礦工演員消息的companion object 。 模式是相同的,具有密封的特征MinerMessage ,用于定義該MinerMessage的消息的類型。

    object Miner {sealed trait MinerMessagecase class Validate(hash: String, proof: Long) extends MinerMessagecase class Mine(hash: String) extends MinerMessagecase object Ready extends MinerMessageval props: Props = Props(new Miner) }

    The Validate message asks for a validation of a proof, and pass to the Miner the hash and the proof to check. Since this component is the one interacting with the PoW algorithm, it is its duty to execute this check. The Mine message asks for the mining starting from a specified hash. The last message, Ready, triggers a state transition.

    Validate消息要求驗證證明,并將哈希值和證明傳遞給礦工進行檢查。 由于該組件是與PoW算法交互的組件,因此執(zhí)行此檢查是其職責(zé)。 Mine消息要求從指定的哈希開始進行挖掘。 最后一條消息Ready觸發(fā)狀態(tài)轉(zhuǎn)換。

    Same actor, different states

    同一演員,不同州

    The peculiarity of this actor is that it reacts to the messages according to its state: busy or ready. Let’s analyze the difference in the behavior:

    這個actor的獨特之處在于,它根據(jù)消息的狀態(tài)( busy或ready對消息做出React。 讓我們分析一下行為上的區(qū)別:

    • busy: the Miner is busy mining a block. If a new mining request comes, it should deny it. If it is requested to be ready, the Miner should change its state to the ready one.

      繁忙 :礦工正在忙于開采一個街區(qū)。 如果有新的采礦請求,則應(yīng)拒絕。 如果要求準備就緒,則礦工應(yīng)將其狀態(tài)更改為就緒狀態(tài)。

    • ready: the Miner is idle. If a mining request come, it should start mining a new block. If it is requested to be ready, it should say: “OK, I’m ready!”

      準備好 :礦工閑置。 如果出現(xiàn)挖掘請求,則應(yīng)開始挖掘新塊。 如果要求準備就緒,則應(yīng)該說:“好,我準備好了!”

    • both: the Miner should be always available to verify the correctness of a proof, both in a ready or busy state.

      兩者 :礦工在準備就緒或繁忙狀態(tài)下應(yīng)始終可用以驗證證明的正確性。

    Time so see how we can implement this logic in our code. We start by defining the common behavior, the validation of a proof.

    時間到了,看看如何在代碼中實現(xiàn)此邏輯。 我們首先定義常見行為,即證明的有效性。

    We define a function validate that reacts to the Validate message: if the proof is valid we respond to the sender with a success, otherwise with a failure. The ready and the busy states are defined as functions that “extends” the validate one, since that is a behavior we want in both states.

    我們定義了一個功能validate ,它對Validate消息做出React:如果證明有效,我們以成功的方式響應(yīng)發(fā)送方,否則以失敗的方式響應(yīng)。 ready狀態(tài)和busy狀態(tài)被定義為“擴展” validate狀態(tài)的功能,因為這是我們在兩種狀態(tài)下都想要的行為。

    def validate: Receive = {case Validate(hash, proof) => {log.info(s"Validating proof $proof")if (ProofOfWork.validProof(hash, proof)){log.info("proof is valid!")sender() ! Success}else{log.info("proof is not valid")sender() ! Failure(new InvalidProofException(hash, proof))}}}

    A couple of things to highlight here.

    這里有兩點要強調(diào)。

    1. The state transition is triggered using the become function, provided by the Akka Framework. This takes as an argument a function that returns a Receive object, like the ones we defined for the validation, busy, and ready state.

    1.使用Akka Framework提供的become功能觸發(fā)狀態(tài)轉(zhuǎn)換。 該函數(shù)將返回Receive對象的函數(shù)作為參數(shù),就像我們?yōu)関alidation , busy和ready狀態(tài)定義的函數(shù)一樣。

    2. When a mining request is received by the Miner, it responds with a Future containing the execution of the PoW algorithm. In this way we can work asynchronously, making the Miner free to do other tasks, such as the validation one.

    2.當(dāng)?shù)V工收到挖掘請求時,它將以包含有執(zhí)行PoW算法的Future響應(yīng)。 這樣,我們可以異步工作,使礦工可以自由地執(zhí)行其他任務(wù),例如驗證任務(wù)。

    3. The supervisor of this Actor controls the state transition. The reason of this choice is that the Miner is agnostic about the state of the system. It doesn’t know when the mining computation in the Future will be completed, and it can’t know if the block that it is mining has been already mined from another node. This would require to stop mining the current hash, and start mining the hash of the new block.

    3.該Actor的主管控制狀態(tài)轉(zhuǎn)換。 這種選擇的原因是,礦工對系統(tǒng)狀態(tài)不了解。 它不知道Future的挖掘計算何時完成,也不知道它正在挖掘的塊是否已經(jīng)從另一個節(jié)點中挖掘出來。 這將需要停止挖掘當(dāng)前的哈希,并開始挖掘新塊的哈希。

    The last thing is to provide an initial state overriding the receive function.

    最后一件事是提供一個覆蓋receive功能的初始狀態(tài)。

    override def receive: Receive = {case Ready => become(ready)}

    We start waiting for a Ready message. When it comes, we start our Miner.

    我們開始等待Ready消息。 當(dāng)它來的時候,我們開始我們的礦工。

    區(qū)塊鏈,一個持久的參與者 (Blockchain, a persistent actor)

    The Blockchain Actor interacts with the business logic of the blockchain. It can add a new block to the blockchain, and it can retrieve information about the state of the blockchain. This actor has another superpower: it can persist and recover the state of the blockchain. This is possible implementing the PersistentActor trait provided by the Akka Framework.

    區(qū)塊鏈參與者與區(qū)塊鏈的業(yè)務(wù)邏輯進行交互。 它可以向區(qū)塊鏈添加一個新塊,并且可以檢索有關(guān)區(qū)塊鏈狀態(tài)的信息。 這個參與者還有另一個超級大國:它可以持久并恢復(fù)區(qū)塊鏈的狀態(tài)。 可以實現(xiàn)Akka框架提供的PersistentActor特性。

    object Blockchain {sealed trait BlockchainEventcase class AddBlockEvent(transactions: List[Transaction], proof: Long) extends BlockchainEventsealed trait BlockchainCommandcase class AddBlockCommand(transactions: List[Transaction], proof: Long) extends BlockchainCommandcase object GetChain extends BlockchainCommandcase object GetLastHash extends BlockchainCommandcase object GetLastIndex extends BlockchainCommandcase class State(chain: Chain)def props(chain: Chain, nodeId: String): Props = Props(new Blockchain(chain, nodeId)) } view raw

    We can see that the companion object of this actor has more elements than the other ones. The State class is where we store the state of our blockchain, that is its Chain. The idea is to update the state every time a new block is created.

    我們可以看到該companion object具有比其他參與者更多的元素。 State類是我們存儲區(qū)塊鏈狀態(tài)(即Chain 。 想法是每次創(chuàng)建新塊時都更新狀態(tài)。

    For this purpose, there are two different traits: BlockchainEvent and BlockchainCommand. The former is to handle the events that will trigger the persistence logic, the latter is used to send direct commands to the actor. The AddBlockEvent message is the event that will update our state. The AddBlockCommand, GetChain, GetLastHash, and LastIndex commands are the one used to interact with the underlying blockchain.

    為此,有兩個不同的特征: BlockchainEvent和BlockchainCommand 。 前者用于處理將觸發(fā)持久性邏輯的事件,后者用于將直接命令發(fā)送給參與者。 AddBlockEvent消息是將更新我們狀態(tài)的事件。 AddBlockCommand , GetChain , GetLastHash和LastIndex命令是用于與基礎(chǔ)區(qū)塊鏈進行交互的命令。

    The usual props function initializes the Blockchain Actor with the initial Chain and the nodeId of the Scalachain node.

    常用的props函數(shù)使用初始Chain和Scalachain節(jié)點的nodeId初始化Blockchain Actor。

    class Blockchain(chain: Chain, nodeId: String) extends PersistentActor with ActorLogging{import Blockchain._var state = State(chain)override def persistenceId: String = s"chainer-$nodeId"//Code... }

    The Blockchain Actor extends the trait PersistentActor provided by the Akka framework. In this way we have out-of-the-box all the logic required to persist and recover our state.

    區(qū)塊鏈演員擴展了Akka框架提供的特征PersistentActor 。 這樣,我們就可以開箱即用地保存和恢復(fù)狀態(tài)所需的所有邏輯。

    We initialize the state using the Chain provided as an argument upon creation. The nodeId is part of the persistenceId that we override. The persistence logic will use it to identify the persisted state. Since we can have multiple Scalachain nodes running in the same machine, we need this value to correctly persist and recover the state of each node.

    我們使用創(chuàng)建時作為參數(shù)提供的Chain初始化狀態(tài)。 nodeId是我們覆蓋的persistenceId一部分。 持久性邏輯將使用它來識別持久狀態(tài)。 由于我們可以在同一臺機器上運行多個Scalachain節(jié)點,因此我們需要此值才能正確保留并恢復(fù)每個節(jié)點的狀態(tài)。

    def updateState(event: BlockchainEvent) = event match {case AddBlockEvent(transactions, proof) =>{state = State(ChainLink(state.chain.index + 1, proof, transactions) :: state.chain)log.info(s"Added block ${state.chain.index} containing ${transactions.size} transactions")}}

    The updateState function executes the update of the Actor state when the AddBlockEvent is received.

    收到AddBlockEvent時, updateState函數(shù)將執(zhí)行Actor狀態(tài)的更新。

    override def receiveRecover: Receive = {case SnapshotOffer(metadata, snapshot: State) => {log.info(s"Recovering from snapshot ${metadata.sequenceNr} at block ${snapshot.chain.index}")state = snapshot}case RecoveryCompleted => log.info("Recovery completed")case evt: AddBlockEvent => updateState(evt)}

    The receiveRecover function reacts to the recovery messages sent by the persistence logic. During the creation of an actor a persisted state (snapshot) may be offered to it using the SnapshotOffer message. In this case the current state becomes the one provided by the snapshot.

    receiveRecover函數(shù)對持久性邏輯發(fā)送的恢復(fù)消息做出React。 在創(chuàng)建actor期間,可以使用SnapshotOffer消息向其提供持久狀態(tài)( 快照 )。 在這種情況下,當(dāng)前狀態(tài)變?yōu)榭煺仗峁┑臓顟B(tài)。

    RecoveryCompleted message informs us that the recovery process completed successfully. The AddBlockEvent triggers the updateState function passing the event itself.

    RecoveryCompleted消息通知我們恢復(fù)過程已成功完成。 AddBlockEvent觸發(fā)updateState函數(shù)傳遞事件本身。

    override def receiveCommand: Receive = {case SaveSnapshotSuccess(metadata) => log.info(s"Snapshot ${metadata.sequenceNr} saved successfully")case SaveSnapshotFailure(metadata, reason) => log.error(s"Error saving snapshot ${metadata.sequenceNr}: ${reason.getMessage}")case AddBlockCommand(transactions : List[Transaction], proof: Long) => {persist(AddBlockEvent(transactions, proof)) {event =>updateState(event)}// This is a workaround to wait until the state is persisteddeferAsync(Nil) { _ =>saveSnapshot(state)sender() ! state.chain.index}}case AddBlockCommand(_, _) => log.error("invalid add block command")case GetChain => sender() ! state.chaincase GetLastHash => sender() ! state.chain.hashcase GetLastIndex => sender() ! state.chain.index}

    The receiveCommand function is used to react to the direct commands sent to the actor. Let’s skip the GetChain, GetLastHash, and GetLastIndex commands, since they are trivial. The AddBlockCommand is the interesting part: it creates and fires an AddBlock event, that is persisted in the event journal of the Actor. In this way events can be replayed in case of recovery.

    receiveCommand函數(shù)用于對發(fā)送給角色的直接命令做出React。 讓我們跳過GetChain , GetLastHash和GetLastIndex命令,因為它們很簡單。 AddBlockCommand是有趣的部分:它創(chuàng)建并觸發(fā)一個AddBlock事件,該事件將AddBlock在Actor的事件日志中。 這樣,在恢復(fù)的情況下可以重播事件。

    The deferAsync function waits until the state is updated after the processing of the event. Once the event has been executed the actor can save the snapshot of the state, and inform the sender of the message with the updated last index of the Chain. The SaveSnapshotSucces and SaveSnapshotFailure messages helps us to keep track of possible failures.

    deferAsync函數(shù)將等待,直到事件處理后狀態(tài)被更新為止。 一旦執(zhí)行了事件,參與者就可以保存狀態(tài)的快照,并使用Chain的更新后的最后索引將消息通知給發(fā)件人。 SaveSnapshotSucces和SaveSnapshotFailure消息有助于我們跟蹤可能的故障。

    節(jié)點,一個演員來統(tǒng)治他們 (Node, an actor to rule them all)

    The Node Actor is the backbone of our Scalachain node. It is the supervisor of all the other actors (Broker, Miner, and Blockchain), and the one communicating with the outside world through the REST API.

    Node Actor是我們Scalachain節(jié)點的骨干。 它是所有其他參與者(經(jīng)紀人,礦工和區(qū)塊鏈)的主管 ,也是通過REST API與外界通信的人。

    object Node {sealed trait NodeMessagecase class AddTransaction(transaction: Transaction) extends NodeMessagecase class CheckPowSolution(solution: Long) extends NodeMessagecase class AddBlock(proof: Long) extends NodeMessagecase object GetTransactions extends NodeMessagecase object Mine extends NodeMessagecase object StopMining extends NodeMessagecase object GetStatus extends NodeMessagecase object GetLastBlockIndex extends NodeMessagecase object GetLastBlockHash extends NodeMessagedef props(nodeId: String): Props = Props(new Node(nodeId))def createCoinbaseTransaction(nodeId: String) = Transaction("coinbase", nodeId, 100) }

    The Node Actor has to handle all the high level messages that coming from the REST API. This is the reason why we find in the companion object more or less the same messages we implemented in the children actors. The props function takes a nodeId as an argument to create our Node Actor. This will be the one used for the initialization of Blockchain Actor. The createCoinbaseTransaction simply creates a transaction assigning a predefined coin amount to the node itself. This will be the reward for the successful mining of a new block of the blockchain.

    Node Actor必須處理來自REST API的所有高級消息。 這就是為什么我們在companion object或多或少地發(fā)現(xiàn)在子actor中實現(xiàn)的相同消息的原因。 props函數(shù)將nodeId作為參數(shù)來創(chuàng)建我們的Node Actor。 這將是用于初始化Blockchain Actor的工具。 createCoinbaseTransaction只是創(chuàng)建一個將預(yù)定義硬幣數(shù)量分配給節(jié)點本身的交易。 這將是成功挖掘區(qū)塊鏈新區(qū)塊的獎勵

    class Node(nodeId: String) extends Actor with ActorLogging {import Node._implicit lazy val timeout = Timeout(5.seconds)val broker = context.actorOf(Broker.props)val miner = context.actorOf(Miner.props)val blockchain = context.actorOf(Blockchain.props(EmptyChain, nodeId))miner ! Ready//Code... }

    Let’s look at the initialization of the Node Actor. The timeout value is used by the ask (?) operator (this will be explained shortly). All our actors are created in the actor context, using the props function we defined in each actor.

    讓我們看一下Node Actor的初始化。 超時值由ask ( ? )運算符使用(稍后將對此進行說明)。 我們所有的參與者都是在參與者context中使用我們在每個參與者中定義的props函數(shù)創(chuàng)建的。

    The Blockchain Actor is initialized with the EmptyChain and the nodeId of the Node. Once everything is created, we inform the Miner Actor to be ready to mine sending it a Ready message. Ok, we are now ready to receive some message and react to it.

    使用EmptyChain和節(jié)點的nodeId初始化Blockchain Actor。 創(chuàng)建完所有內(nèi)容后,我們會通知礦工演員準備好向其發(fā)送Ready消息。 好的,我們現(xiàn)在準備接收一些消息并對它做出React。

    override def receive: Receive = {case AddTransaction(transaction) => {//Code...}case CheckPowSolution(solution) => {//Code...}case AddBlock(proof) => {//Code...}case Mine => {//Code...}case GetTransactions => broker forward Broker.GetTransactionscase GetStatus => blockchain forward GetChaincase GetLastBlockIndex => blockchain forward GetLastIndexcase GetLastBlockHash => blockchain forward GetLastHash}

    This is an overview of the usual receive function that we should override. I will analyze the logic of the most complex cases later, now let’s look at the last four. Here we forward the messages to the Blockchain Actor, since it isn’t required any processing. Using the forward operator the sender() of the message will be the one that originated the message, not the Node Actor. In this way the Blockchain Actor will respond to the original sender of the message (the REST API layer).

    這是我們應(yīng)該重寫的常規(guī)receive函數(shù)的概述。 稍后,我將分析最復(fù)雜case的邏輯,現(xiàn)在讓我們看一下最后四個。 在這里,我們將消息轉(zhuǎn)發(fā)到Blockchain Actor,因為它不需要任何處理。 使用forward運算符,消息的sender()將是消息的始發(fā)者,而不是Node Actor。 這樣,Blockchain Actor將響應(yīng)消息的原始發(fā)送者(REST API層)。

    override def receive: Receive = {case AddTransaction(transaction) => {val node = sender()broker ! Broker.AddTransaction(transaction)(blockchain ? GetLastIndex).mapTo[Int] onComplete {case Success(index) => node ! (index + 1)case Failure(e) => node ! akka.actor.Status.Failure(e)}}//Code... }

    The AddTransaction message triggers the logic to store a new transaction in the list of pending ones of our blockchain. The Node Actor responds with the index of the block that will contain the transaction.

    AddTransaction消息觸發(fā)了將新交易存儲在我們的區(qū)塊鏈未決交易列表中的邏輯。 Node Actor以將包含事務(wù)的塊的index作為響應(yīng)。

    First of all we store the “address” of the sender() of the message in a node value to use it later. We send to the Broker Actor a message to add a new transaction, then we ask to the Blockchain Actor the last index of the chain. The ask operator — the one expressed with ? — is used to send a message to an actor and wait for a response. The response (mapped to an Int value) can be a Success or a Failure.

    首先,我們將消息的sender()的“地址”存儲在node值中,以備后用。 我們向經(jīng)紀人Actor發(fā)送一條消息以添加新交易,然后我們ask區(qū)塊鏈Actor ask鏈的最后一個索引。 ask運算符-用表示的那個? —用于向演員發(fā)送消息并等待響應(yīng)。 響應(yīng)(映射到Int值)可以是Success或Failure 。

    In the first case we send back to the sender (node) the index+1, since it will be the index of the next mined block. In case of failure, we respond to the sender with a Failure containing the reason of the failure. Remember this pattern:

    在第一種情況下,我們將index+1發(fā)送回發(fā)送方( node ),因為它將是下一個已開采區(qū)塊的索引。 如果發(fā)生故障,我們將以包含F(xiàn)ailure原因的“故障”響應(yīng)發(fā)件人。 記住這種模式:

    ask → wait for a response → handle success/failure

    詢問→等待回應(yīng)→處理成功/失敗

    because we will see it again.

    因為我們會再次看到它。

    override def receive: Receive = {//Code...case CheckPowSolution(solution) => {val node = sender()(blockchain ? GetLastHash).mapTo[String] onComplete {case Success(hash: String) => miner.tell(Validate(hash, solution), node)case Failure(e) => node ! akka.actor.Status.Failure(e)}}//Code... } view raw

    This time we have to check if a solution to the PoW algorithm is correct. We ask to the Blockchain Actor the hash of the last block, and we tell the Miner Actor to validate the solution against the hash. In the tell function we pass to the Miner the Validate message along with the address of the sender, so that the miner can respond directly to it. This is another approach, like the forward one we saw before.

    這次我們必須檢查PoW算法的解決方案是否正確。 我們向區(qū)塊鏈參與者詢問最后一個區(qū)塊的哈希值,然后告訴礦工參與者針對哈希值驗證解決方案。 在tell函數(shù)中,我們將Validate消息以及發(fā)送者的地址傳遞給礦工,以便礦工可以直接對其進行響應(yīng)。 這是另一種方法,就像forward一個我們以前看到。

    override def receive: Receive = {//Code...case AddBlock(proof) => {val node = sender()(self ? CheckPowSolution(proof)) onComplete {case Success(_) => {(broker ? Broker.GetTransactions).mapTo[List[Transaction]] onComplete {case Success(transactions) => blockchain.tell(AddBlockCommand(transactions, proof), node)case Failure(e) => node ! akka.actor.Status.Failure(e)}broker ! Clear}case Failure(e) => node ! akka.actor.Status.Failure(e)}}//Code... }

    Other nodes can mine blocks, so we may receive a request to add a block that we didn’t mine. The proof is enough to add the new block, since we assume that all the nodes share the same list of pending transactions.

    其他節(jié)點可以挖掘塊,因此我們可能會收到添加未挖掘塊的請求。 該證明足以添加新的塊,因為我們假設(shè)所有節(jié)點共享相同的待處理事務(wù)列表。

    override def receive: Receive = {//Code...case Mine => {val node = sender()(blockchain ? GetLastHash).mapTo[String] onComplete {case Success(hash) => (miner ? Miner.Mine(hash)).mapTo[Future[Long]] onComplete {case Success(solution) => waitForSolution(solution)case Failure(e) => log.error(s"Error finding PoW solution: ${e.getMessage}")}case Failure(e) => node ! akka.actor.Status.Failure(e)}}//Code...}def waitForSolution(solution: Future[Long]) = Future {solution onComplete {case Success(proof) => {broker ! Broker.AddTransaction(createCoinbaseTransaction(nodeId))self ! AddBlock(proof)miner ! Ready}case Failure(e) => log.error(s"Error finding PoW solution: ${e.getMessage}")}}

    This is a simplification, in the Bitcoin network there cannot be such assumption. First of all we should check if the solution is valid. We do this sending a message to the node itself: self ? CheckPowSolution(proof). If the proof is valid, we get the list of pending transaction from the Broker Actor, then we tell to the Blockchain Actor to add to the chain a new block containing the transactions and the validated proof. The last thing to do is to command the Broker Actor to clear the list of pending transactions.

    這是一種簡化,在比特幣網(wǎng)絡(luò)中不可能有這樣的假設(shè)。 首先,我們應(yīng)該檢查解決方案是否有效。 我們這樣做是向節(jié)點本身發(fā)送一條消息: self ? CheckPowSolution(proof) self ? CheckPowSolution(proof) 。 如果證明有效,我們從經(jīng)紀人代理那里獲得未決交易的清單,然后tell區(qū)塊鏈參與者將包含交易和經(jīng)過驗證的證明的新區(qū)塊添加到鏈中。 最后要做的是命令Broker Actor清除掛起的事務(wù)列表。

    The last message is the request to start mining a new block. We need the hash of the last block in the chain, so we request it to the Blockchain Actor. Once we have the hash, we can start mining a new block.

    最后一條消息是開始挖掘新塊的請求。 我們需要鏈中最后一個區(qū)塊的哈希,因此我們將其請求給Blockchain Actor。 有了哈希后,就可以開始挖掘新塊了。

    The PoW algorithm is a long-running operation, so the Miner Actor responds immediately with a Future containing the computation. The waitForSolution function waits for the computation to complete, while the Node Actor keeps doing its business.

    PoW算法是一項長期運行的操作,因此,礦工Actor立即使用包含計算的Future做出響應(yīng)。 waitForSolution函數(shù)等待計算完成,而Node Actor繼續(xù)進行其業(yè)務(wù)。

    When we have a solution, we reward ourselves adding the coinbase transaction to the list of pending transactions. Then we add the new block to the chain and tell the Miner Actor to be ready to mine another block.

    當(dāng)我們有解決方案時,我們會獎勵自己將coinbase交易添加到未決交易列表中。 然后,我們將新塊添加到鏈中,并告知礦工演員準備開采另一個塊。

    帶有Akka HTTP的REST API (REST API with Akka HTTP)

    This last section describes the server and REST API. This is the most “external” part of our application, the one connecting the outside world to the Scalachain node. We will make use of Akka HTTP library, which is part of the Akka Framework. Let’s start looking at the server, the entry point of our application.

    最后一部分介紹了服務(wù)器和REST API。 這是我們應(yīng)用程序中最“外部”的部分,將外部世界連接到Scalachain節(jié)點。 我們將使用Akka HTTP庫,它是Akka Framework的一部分。 讓我們開始看看服務(wù)器,這是我們應(yīng)用程序的入口點。

    object Server extends App with NodeRoutes {val address = if (args.length > 0) args(0) else "localhost"val port = if (args.length > 1) args(1).toInt else 8080implicit val system: ActorSystem = ActorSystem("scalachain")implicit val materializer: ActorMaterializer = ActorMaterializer()val node: ActorRef = system.actorOf(Node.props("scalaChainNode0"))lazy val routes: Route = statusRoutes ~ transactionRoutes ~ mineRoutesHttp().bindAndHandle(routes, address, port)println(s"Server online at http://$address:$port/")Await.result(system.whenTerminated, Duration.Inf)}

    Since the Server is our entry point, it needs to extend the App trait. It extends also NodeRoutes, a trait that contains all the http routes to the various endpoint of the node.

    由于Server是我們的切入點,因此它需要擴展App特性。 它還擴展了NodeRoutes ,這是一個特征,其中包含到節(jié)點各個端點的所有http路由。

    The system value is where we store our ActorSystem. Every actor created in this system will be able to talk to the others inside it. Akka HTTP requires also the definition of another value, the ActorMaterializer. This relates to the Akka Streams module, but since Akka HTTP is built on top of it, we still need this object to be initialized in our server (if you want to go deep on the relation with streams, look here).

    system值是我們存儲ActorSystem 。 在此系統(tǒng)中創(chuàng)建的每個演員都可以與其中的其他角色交談。 Akka HTTP還需要定義另一個值A(chǔ)ctorMaterializer 。 這與Akka Streams模塊有關(guān),但是由于Akka HTTP是在其之上構(gòu)建的,因此我們?nèi)匀恍枰诜?wù)器中初始化該對象(如果您想深入了解與流的關(guān)系,請參見此處 )。

    The Node Actor is created along with the HTTP routes of the node, that are chained using the ~ operator. Don’t worry about the routes now, we will be back to them in a moment.

    將使用~運算符將Node Actor與節(jié)點的HTTP路由一起創(chuàng)建。 現(xiàn)在不用擔(dān)心路線,我們稍后會再與他們聯(lián)系。

    The last thing to do is to start our server using the function Http().bindHandle, that will also bind the routes we pass to it as an argument. The Await.result function will wait the termination signal to stop the server.

    最后要做的是使用功能Http().bindHandle啟動服務(wù)器,該服務(wù)器還將綁定我們作為參數(shù)傳遞給它的路由。 Await.result函數(shù)將等待終止信號以停止服務(wù)器。

    The server will be useless without the routes to trigger the business logic of the application. We define the routes in the trait NodeRoutes, differentiating them according to the different logic they trigger:

    如果沒有路由來觸發(fā)應(yīng)用程序的業(yè)務(wù)邏輯,服務(wù)器將毫無用處。 我們在特征NodeRoutes定義路由,并根據(jù)它們觸發(fā)的不同邏輯對其進行區(qū)分:

    • statusRoutes contains the endpoints to ask the Scalachain node for its status.

      statusRoutes包含向Scalachain節(jié)點詢問其狀態(tài)的端點。

    • transactionRoutes handles everything related to transactions.

      transactionRoutes處理與事務(wù)相關(guān)的所有事情。

    • mineRoutes has the endpoint to start the mining process

      mineRoutes具有端點來開始挖掘過程

    Notice that this differentiation is a logic one, just to keep things ordered and readable. The three routes will be chained in a single one after their initialization in the server.

    請注意,這種區(qū)分是一種邏輯,只是為了保持事物的有序性和可讀性。 在服務(wù)器中初始化后,這三個路由將被鏈接為一個路由。

    //Imports... import com.elleflorio.scalachain.utils.JsonSupport._ // Imports...trait NodeRoutes extends SprayJsonSupport {implicit def system: ActorSystemdef node: ActorRefimplicit lazy val timeout = Timeout(5.seconds)//Code... }

    The NodeRoutes trait extends SprayJsonSupport to add JSON serialization/deserialization. SprayJson is a Scala library analogous to Jackson in Java, and it comes for free with Akka HTTP.

    NodeRoutes特性擴展了SprayJsonSupport以添加JSON序列化/反序列化。 SprayJson是一個Scala庫,類似于Java中的Jackson,它隨Akka HTTP免費提供。

    To convert our objects to a JSON string we import the class JsonSupport defined in the utils package, which contains custom reader/writer for every object. I won’t go into the details, you can find the class in the repository if you want to look at the implementation.

    要將對象轉(zhuǎn)換為JSON字符串,我們導(dǎo)入utils包中定義的JsonSupport類, JsonSupport包含每個對象的自定義讀取器/寫入器。 我不會詳細介紹,如果您要查看實現(xiàn),則可以在存儲庫中找到該類 。

    We have a couple of implicit values. The ActorSystem is used to define the system of actors, while the Timeout is used by the OnSuccess function that waits for a response from the actors. The ActorRef is defined by overriding in the server implementation.

    我們有幾個隱式值。 ActorSystem用于定義參與者的系統(tǒng),而Timeout由OnSuccess函數(shù)使用,該函數(shù)等待參與者的響應(yīng)。 通過覆蓋服務(wù)器實現(xiàn)中定義ActorRef 。

    //Code...lazy val statusRoutes: Route = pathPrefix("status") {concat(pathEnd {concat(get {val statusFuture: Future[Chain] = (node ? GetStatus).mapTo[Chain]onSuccess(statusFuture) { status =>complete(StatusCodes.OK, status)}})})}//Code...

    The endpoint to get the status of the blockchain is defined in the statusRoutes. We define the pathPrefix as "status" so the node will respond to the path ` http://<address>:<port/status. After that there is the definition of the HTTP actions we want to enable on the path. Here we want to get the status of the blockchain, so we define only the get action. Inside that we ask the Node Actor to get the current Chain. When the actor responds, the Chain is sent as a JSON along with an ok status in the complete method.

    用于獲取區(qū)塊鏈狀態(tài)的端點在statusRoutes中定義。 我們將pathPrefix定義為“狀態(tài)”,以便節(jié)點將響應(yīng)路徑`http:// <地址>:<端口/狀態(tài)。 然后,定義了我們要在路徑上啟用的HTTP操作。 在這里,我們要獲取區(qū)塊鏈的狀態(tài),因此我們僅定義get操作。 在其中,我們要求Node Actor獲取當(dāng)前的Chain。 當(dāng)actor響應(yīng)時,在complete方法中,Chain作為JSON連同ok狀態(tài)一起發(fā)送。

    //Code...lazy val transactionRoutes: Route = pathPrefix("transactions") {concat(pathEnd {concat(get {val transactionsRetrieved: Future[List[Transaction]] =(node ? GetTransactions).mapTo[List[Transaction]]onSuccess(transactionsRetrieved) { transactions =>complete(transactions.toList)}},post {entity(as[Transaction]) { transaction =>val transactionCreated: Future[Int] =(node ? AddTransaction(transaction)).mapTo[Int]onSuccess(transactionCreated) { done =>complete((StatusCodes.Created, done.toString))}}})})}//Code...

    The transactionRoutes allows the interaction with the pending transactions of the node. We define the HTTP action get to retrieve the list of pending transactions. This time we also define the HTTP action post to add a new transaction to the list of pending ones. The entity(as[Transaction]) function is used to deserialize the JSON body into a Transaction object.

    transactionRoutes允許與節(jié)點的待處理事務(wù)進行交互。 我們定義HTTP操作get來檢索未決事務(wù)列表。 這次,我們還定義了HTTP操作post以將新事務(wù)添加到掛起的事務(wù)列表中。 entity(as[Transaction])函數(shù)用于將JSON主體反序列化為Transaction對象。

    //Code... lazy val mineRoutes: Route = pathPrefix("mine") {concat(pathEnd {concat(get {node ! Minecomplete(StatusCodes.OK)})})}//Code...

    The last route is the MineRoutes. This is a very simple one, used only to ask the Scalachain node to start mine a new block. We define a get action since we do not need to send anything to start the mining process. It is not required to wait for a response, since it may take some time, so we immediately respond with an Ok status.

    最后一條路線是MineRoutes 。 這是一個非常簡單的示例,僅用于要求Scalachain節(jié)點開始挖掘一個新塊。 我們定義了一個get動作,因為我們不需要發(fā)送任何東西就可以開始挖掘過程。 不需要等待響應(yīng),因為它可能需要一些時間,因此我們會立即以O(shè)k狀態(tài)進行響應(yīng)。

    The API to interact with the Scalachain node are documented here.

    與Scalachain節(jié)點進行交互的API記錄在這里 。

    結(jié)論 (Conclusion)

    With the last section, we concluded our tour inside Scalachain. This prototype of a blockchain is far from a real implementation, but we learned a lot of interesting things:

    在最后一部分中,我們結(jié)束了Scalachain內(nèi)部之旅。 區(qū)塊鏈的原型遠非真正的實現(xiàn),但我們學(xué)到了很多有趣的東西:

    • How a blockchain works, at least from an high level perspective.

      至少從高層的角度來看,區(qū)塊鏈是如何工作的。
    • How to use functional programming (Scala) to build a blockchain.

      如何使用函數(shù)式編程(Scala)構(gòu)建區(qū)塊鏈
    • How the Actor Model works, and its application to our use case using the Akka Framework.

      Actor模型如何工作,以及如何使用Akka Framework將其應(yīng)用到我們的用例中。
    • How to use the Akka HTTP library to create a sever to run our blockchain, along with the APIs to interact with it.

      如何使用Akka HTTP庫創(chuàng)建一個服務(wù)器來運行我們的區(qū)塊鏈,以及與之交互的API。

    The code is not perfect, and some things can be implemented in a better way. For this reason, feel free to contribute to the project! ;-)

    代碼并不完美,有些事情可以用更好的方式實現(xiàn)。 因此, 隨時為該項目做貢獻! ;-)

    翻譯自: https://www.freecodecamp.org/news/how-to-build-a-simple-actor-based-blockchain-aac1e996c177/

    vtk刪除一個actor

    總結(jié)

    以上是生活随笔為你收集整理的vtk删除一个actor_如何构建一个基于actor的简单区块链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产精品国产三级国产专播 | 精品久久久久香蕉网 | 最近中文2019字幕第二页 | 美女黄网站人色视频免费国产 | 亚洲成a人一区二区三区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 婷婷丁香五月天综合东京热 | 丰满人妻翻云覆雨呻吟视频 | 欧美日本免费一区二区三区 | 在线亚洲高清揄拍自拍一品区 | 极品嫩模高潮叫床 | 国产在线精品一区二区三区直播 | 最新版天堂资源中文官网 | 日韩人妻无码中文字幕视频 | 日本大香伊一区二区三区 | 99久久精品国产一区二区蜜芽 | 亚洲中文字幕在线无码一区二区 | 内射爽无广熟女亚洲 | 无码一区二区三区在线观看 | 国产明星裸体无码xxxx视频 | 无码人妻久久一区二区三区不卡 | 亚拍精品一区二区三区探花 | 中文字幕久久久久人妻 | 丰满少妇弄高潮了www | 一本色道久久综合亚洲精品不卡 | 欧美亚洲国产一区二区三区 | 色婷婷综合激情综在线播放 | 欧美一区二区三区 | 人人妻人人藻人人爽欧美一区 | 天天综合网天天综合色 | 爽爽影院免费观看 | 在线成人www免费观看视频 | 蜜桃视频韩日免费播放 | 亚洲 激情 小说 另类 欧美 | 国产精品资源一区二区 | 国产精品99久久精品爆乳 | 国产精品第一国产精品 | 国产乱子伦视频在线播放 | 日韩欧美中文字幕在线三区 | 国产精品二区一区二区aⅴ污介绍 | 少女韩国电视剧在线观看完整 | 久久精品国产大片免费观看 | 国产xxx69麻豆国语对白 | 性欧美牲交xxxxx视频 | 成人试看120秒体验区 | 天堂а√在线地址中文在线 | 国产精品国产自线拍免费软件 | 免费无码一区二区三区蜜桃大 | 激情人妻另类人妻伦 | 久久精品女人的天堂av | 又大又黄又粗又爽的免费视频 | 亚洲成av人片在线观看无码不卡 | 日韩精品乱码av一区二区 | 欧美性猛交内射兽交老熟妇 | 欧美精品无码一区二区三区 | 欧美高清在线精品一区 | 奇米影视7777久久精品 | 国产色在线 | 国产 | 波多野结衣高清一区二区三区 | 日日摸日日碰夜夜爽av | 无码av免费一区二区三区试看 | 麻豆蜜桃av蜜臀av色欲av | 67194成是人免费无码 | 国产精品亚洲а∨无码播放麻豆 | 亚洲一区二区三区 | 亚洲国精产品一二二线 | 国产人妻人伦精品1国产丝袜 | 亚洲熟妇自偷自拍另类 | 学生妹亚洲一区二区 | 扒开双腿吃奶呻吟做受视频 | 午夜无码区在线观看 | 中文字幕 亚洲精品 第1页 | 亚洲精品成a人在线观看 | 大肉大捧一进一出视频出来呀 | 久久无码人妻影院 | 丰满人妻被黑人猛烈进入 | 日韩欧美群交p片內射中文 | 国产午夜视频在线观看 | 亚洲精品无码人妻无码 | 国产成人综合在线女婷五月99播放 | 白嫩日本少妇做爰 | 老头边吃奶边弄进去呻吟 | 欧洲精品码一区二区三区免费看 | 亚洲成熟女人毛毛耸耸多 | 久久zyz资源站无码中文动漫 | 国产精品怡红院永久免费 | 欧美 丝袜 自拍 制服 另类 | 丝袜 中出 制服 人妻 美腿 | 婷婷综合久久中文字幕蜜桃三电影 | 一本久久伊人热热精品中文字幕 | 美女扒开屁股让男人桶 | 亚洲天堂2017无码中文 | 国产精品久久国产精品99 | 99久久精品国产一区二区蜜芽 | 亚洲色大成网站www国产 | 国产肉丝袜在线观看 | 无码人妻丰满熟妇区五十路百度 | 全黄性性激高免费视频 | 亚洲日韩中文字幕在线播放 | 18禁止看的免费污网站 | 久久99久久99精品中文字幕 | 人妻插b视频一区二区三区 | 久久综合给合久久狠狠狠97色 | 免费国产黄网站在线观看 | 无码人妻黑人中文字幕 | 无码精品人妻一区二区三区av | 国产人妻精品一区二区三区 | 欧美野外疯狂做受xxxx高潮 | 成人性做爰aaa片免费看 | 国产成人无码区免费内射一片色欲 | 丝袜 中出 制服 人妻 美腿 | 99精品视频在线观看免费 | 免费网站看v片在线18禁无码 | 国产精品亚洲综合色区韩国 | 日韩欧美中文字幕在线三区 | 亚洲无人区午夜福利码高清完整版 | 伊人久久婷婷五月综合97色 | 欧美三级不卡在线观看 | 国产成人亚洲综合无码 | 久久国产精品二国产精品 | 久久精品国产一区二区三区肥胖 | 青草青草久热国产精品 | 领导边摸边吃奶边做爽在线观看 | 男女猛烈xx00免费视频试看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 成人无码影片精品久久久 | 国产精品久久久久9999小说 | 亚洲乱码国产乱码精品精 | 欧美老妇交乱视频在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 国产两女互慰高潮视频在线观看 | 国产av一区二区三区最新精品 | 亚洲精品国产品国语在线观看 | 大胆欧美熟妇xx | 日韩 欧美 动漫 国产 制服 | 在线亚洲高清揄拍自拍一品区 | 日韩av无码中文无码电影 | 久久精品国产一区二区三区 | 国产精品毛片一区二区 | 日韩欧美群交p片內射中文 | 国产小呦泬泬99精品 | 在线亚洲高清揄拍自拍一品区 | 日本爽爽爽爽爽爽在线观看免 | 国产欧美熟妇另类久久久 | 国产无遮挡又黄又爽又色 | 亚洲爆乳精品无码一区二区三区 | 无码精品国产va在线观看dvd | 国产亚洲精品久久久久久久 | 综合人妻久久一区二区精品 | 欧美午夜特黄aaaaaa片 | 一个人看的视频www在线 | 人人妻人人澡人人爽人人精品浪潮 | 日韩成人一区二区三区在线观看 | 午夜精品久久久久久久久 | 狂野欧美激情性xxxx | 欧美日韩久久久精品a片 | 国产成人人人97超碰超爽8 | 久久久久久av无码免费看大片 | 对白脏话肉麻粗话av | 国产高潮视频在线观看 | 亚洲精品一区二区三区在线观看 | 国产激情精品一区二区三区 | 乱人伦人妻中文字幕无码 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产av剧情md精品麻豆 | 无码帝国www无码专区色综合 | 日本一本二本三区免费 | 熟女俱乐部五十路六十路av | 成人精品天堂一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 高潮毛片无遮挡高清免费 | 丰满少妇熟乱xxxxx视频 | 久久精品国产99久久6动漫 | 丰满肥臀大屁股熟妇激情视频 | 国产偷抇久久精品a片69 | 亚洲日本va午夜在线电影 | 高中生自慰www网站 | 国产超碰人人爽人人做人人添 | 欧美喷潮久久久xxxxx | 性啪啪chinese东北女人 | 99国产欧美久久久精品 | av无码不卡在线观看免费 | 亚洲狠狠婷婷综合久久 | 日韩人妻无码一区二区三区久久99 | 亚洲午夜无码久久 | 无码人妻精品一区二区三区下载 | 亚洲精品综合一区二区三区在线 | 成人动漫在线观看 | 色综合久久久无码网中文 | 成人女人看片免费视频放人 | 天天躁日日躁狠狠躁免费麻豆 | 99久久99久久免费精品蜜桃 | 亚洲精品国产精品乱码视色 | 熟妇人妻激情偷爽文 | 久久久中文久久久无码 | 嫩b人妻精品一区二区三区 | 亚洲综合无码久久精品综合 | 欧美性猛交内射兽交老熟妇 | 丁香花在线影院观看在线播放 | 一个人看的www免费视频在线观看 | 国产精品久久久久久亚洲毛片 | 18精品久久久无码午夜福利 | 亚洲欧美综合区丁香五月小说 | 成人免费无码大片a毛片 | 小sao货水好多真紧h无码视频 | 人妻aⅴ无码一区二区三区 | 婷婷五月综合激情中文字幕 | 国产在线无码精品电影网 | 国产精华av午夜在线观看 | 日本大香伊一区二区三区 | 在线a亚洲视频播放在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 在线看片无码永久免费视频 | 亚洲欧美精品伊人久久 | 国产精品对白交换视频 | 天堂无码人妻精品一区二区三区 | 亚洲中文字幕无码一久久区 | 国产做国产爱免费视频 | 日韩少妇内射免费播放 | 激情人妻另类人妻伦 | 久久精品丝袜高跟鞋 | 无码国产色欲xxxxx视频 | 亚洲国产欧美国产综合一区 | 蜜桃av抽搐高潮一区二区 | 国产成人综合色在线观看网站 | 免费网站看v片在线18禁无码 | 荫蒂添的好舒服视频囗交 | 国产女主播喷水视频在线观看 | 日本精品久久久久中文字幕 | 3d动漫精品啪啪一区二区中 | 国产97人人超碰caoprom | 88国产精品欧美一区二区三区 | 日韩人妻少妇一区二区三区 | 亚洲人成无码网www | 99精品久久毛片a片 | 国产美女极度色诱视频www | 在线亚洲高清揄拍自拍一品区 | 欧美老熟妇乱xxxxx | 久久久亚洲欧洲日产国码αv | 国产舌乚八伦偷品w中 | 97精品国产97久久久久久免费 | 亚洲熟女一区二区三区 | 最近免费中文字幕中文高清百度 | 7777奇米四色成人眼影 | www成人国产高清内射 | 天天av天天av天天透 | 中文字幕亚洲情99在线 | 蜜桃无码一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 久久99精品国产麻豆 | 欧美国产日韩久久mv | 在线视频网站www色 | 久久aⅴ免费观看 | 成人女人看片免费视频放人 | 国产9 9在线 | 中文 | 一区二区三区高清视频一 | 又大又硬又黄的免费视频 | 俄罗斯老熟妇色xxxx | 日本精品人妻无码77777 天堂一区人妻无码 | 性欧美牲交xxxxx视频 | 无遮挡啪啪摇乳动态图 | 国产三级久久久精品麻豆三级 | 国内揄拍国内精品少妇国语 | 动漫av一区二区在线观看 | 国产精品办公室沙发 | 亚洲高清偷拍一区二区三区 | 99久久亚洲精品无码毛片 | 色婷婷综合中文久久一本 | 亚洲七七久久桃花影院 | 国产一区二区三区日韩精品 | 内射白嫩少妇超碰 | 永久免费观看国产裸体美女 | 在线视频网站www色 | 亚洲欧美日韩国产精品一区二区 | 国产手机在线αⅴ片无码观看 | 国产成人无码一二三区视频 | 久久综合给久久狠狠97色 | 午夜精品一区二区三区在线观看 | 思思久久99热只有频精品66 | 东京热一精品无码av | 性欧美疯狂xxxxbbbb | 精品午夜福利在线观看 | 中文字幕人妻无码一区二区三区 | 丁香花在线影院观看在线播放 | aⅴ在线视频男人的天堂 | 国产莉萝无码av在线播放 | 国产人妻大战黑人第1集 | 国产精品无码久久av | 亚洲欧洲无卡二区视頻 | 国产又爽又猛又粗的视频a片 | 又大又硬又爽免费视频 | 搡女人真爽免费视频大全 | 中文字幕av日韩精品一区二区 | 国产偷国产偷精品高清尤物 | 亚洲gv猛男gv无码男同 | 久久亚洲中文字幕精品一区 | 成人无码视频在线观看网站 | 性生交大片免费看l | 狠狠色噜噜狠狠狠7777奇米 | 人妻与老人中文字幕 | 精品无码国产自产拍在线观看蜜 | 免费播放一区二区三区 | 天天拍夜夜添久久精品 | 亚洲日韩av片在线观看 | 三级4级全黄60分钟 | 99国产欧美久久久精品 | 在线精品国产一区二区三区 | 精品国产一区二区三区四区在线看 | 欧美激情一区二区三区成人 | 久久这里只有精品视频9 | 人妻少妇被猛烈进入中文字幕 | 国产人妻大战黑人第1集 | 欧美丰满老熟妇xxxxx性 | 欧美激情内射喷水高潮 | 1000部夫妻午夜免费 | 亚洲中文字幕在线观看 | 精品国产乱码久久久久乱码 | 欧美精品无码一区二区三区 | 人人妻人人澡人人爽欧美精品 | 未满成年国产在线观看 | 性生交大片免费看女人按摩摩 | 亚洲 另类 在线 欧美 制服 | 伊人久久大香线蕉av一区二区 | 欧洲熟妇色 欧美 | 国产农村乱对白刺激视频 | 99久久精品午夜一区二区 | 色偷偷人人澡人人爽人人模 | 久久精品99久久香蕉国产色戒 | 2019午夜福利不卡片在线 | 樱花草在线播放免费中文 | av人摸人人人澡人人超碰下载 | 国产精品多人p群无码 | 国产乱人伦av在线无码 | 高潮毛片无遮挡高清免费视频 | 国产日产欧产精品精品app | 男女性色大片免费网站 | 正在播放东北夫妻内射 | 色噜噜亚洲男人的天堂 | 人人妻人人澡人人爽人人精品 | 亚洲色欲色欲天天天www | 日日摸天天摸爽爽狠狠97 | 国产色xx群视频射精 | 少妇人妻av毛片在线看 | 黑人玩弄人妻中文在线 | 男女作爱免费网站 | 国产成人综合在线女婷五月99播放 | 色爱情人网站 | 人人妻人人澡人人爽人人精品浪潮 | 九月婷婷人人澡人人添人人爽 | 国产亚洲精品久久久久久久 | 国产成人无码av片在线观看不卡 | 国产美女极度色诱视频www | 国产精品内射视频免费 | 亚洲中文字幕在线观看 | 国产精品免费大片 | 日本乱偷人妻中文字幕 | 亚洲成av人片在线观看无码不卡 | 婷婷六月久久综合丁香 | 99国产精品白浆在线观看免费 | 婷婷综合久久中文字幕蜜桃三电影 | 熟女少妇人妻中文字幕 | 97无码免费人妻超级碰碰夜夜 | 亚洲色大成网站www | 午夜不卡av免费 一本久久a久久精品vr综合 | 精品国产一区二区三区四区在线看 | 蜜臀av在线播放 久久综合激激的五月天 | 久久国内精品自在自线 | 国产精品香蕉在线观看 | 久久熟妇人妻午夜寂寞影院 | 熟女少妇人妻中文字幕 | 天天躁夜夜躁狠狠是什么心态 | 乱人伦中文视频在线观看 | 中文字幕人妻丝袜二区 | a国产一区二区免费入口 | 丰满人妻精品国产99aⅴ | 国产成人无码午夜视频在线观看 | 国产美女极度色诱视频www | 日本xxxx色视频在线观看免费 | 亚洲 a v无 码免 费 成 人 a v | 精品国产国产综合精品 | 日本一本二本三区免费 | av人摸人人人澡人人超碰下载 | 国产无遮挡吃胸膜奶免费看 | 久久精品国产精品国产精品污 | 欧美freesex黑人又粗又大 | 18禁黄网站男男禁片免费观看 | 中文字幕久久久久人妻 | 精品日本一区二区三区在线观看 | 精品欧洲av无码一区二区三区 | 国产av一区二区精品久久凹凸 | 中文字幕中文有码在线 | 久久久久久av无码免费看大片 | 啦啦啦www在线观看免费视频 | √天堂资源地址中文在线 | 国产精品久久久久7777 | 久青草影院在线观看国产 | 久久99精品久久久久婷婷 | 76少妇精品导航 | 精品无码av一区二区三区 | 玩弄中年熟妇正在播放 | 国产人妻大战黑人第1集 | 丝袜人妻一区二区三区 | 国产亚洲人成在线播放 | 午夜福利电影 | 男人的天堂av网站 | 黑人大群体交免费视频 | 久久久久亚洲精品中文字幕 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久久成人片免费观看蜜芽 | 久久zyz资源站无码中文动漫 | 亚洲国产精品一区二区第一页 | 国产欧美亚洲精品a | 沈阳熟女露脸对白视频 | 中文字幕精品av一区二区五区 | 男女超爽视频免费播放 | 又色又爽又黄的美女裸体网站 | 狂野欧美性猛交免费视频 | 人妻夜夜爽天天爽三区 | 日日摸日日碰夜夜爽av | 18禁止看的免费污网站 | 国内老熟妇对白xxxxhd | 98国产精品综合一区二区三区 | 国产深夜福利视频在线 | 99久久精品午夜一区二区 | 国产sm调教视频在线观看 | 白嫩日本少妇做爰 | 野狼第一精品社区 | 欧美大屁股xxxxhd黑色 | 永久免费观看国产裸体美女 | 国产热a欧美热a在线视频 | а√资源新版在线天堂 | 人妻体内射精一区二区三四 | 免费无码av一区二区 | 国产无套内射久久久国产 | 少妇无套内谢久久久久 | 日韩亚洲欧美中文高清在线 | 亚洲热妇无码av在线播放 | 国产乱子伦视频在线播放 | 亚洲自偷自偷在线制服 | 欧美人与物videos另类 | 亚洲一区二区三区播放 | 黄网在线观看免费网站 | 国产亚洲精品久久久ai换 | 国内精品一区二区三区不卡 | 婷婷丁香五月天综合东京热 | 中文字幕+乱码+中文字幕一区 | 在线а√天堂中文官网 | 国产人妻人伦精品 | 在线观看国产午夜福利片 | 国产成人精品三级麻豆 | 无遮无挡爽爽免费视频 | 国产麻豆精品精东影业av网站 | 女人高潮内射99精品 | 国产成人综合色在线观看网站 | 亚洲精品中文字幕乱码 | 内射欧美老妇wbb | 又黄又爽又色的视频 | 国产乱子伦视频在线播放 | 午夜时刻免费入口 | 国产一区二区三区影院 | 强奷人妻日本中文字幕 | 天堂在线观看www | 宝宝好涨水快流出来免费视频 | 亚洲人成网站在线播放942 | 久久天天躁狠狠躁夜夜免费观看 | 小sao货水好多真紧h无码视频 | www国产亚洲精品久久久日本 | 精品人妻人人做人人爽 | 日日碰狠狠躁久久躁蜜桃 | www成人国产高清内射 | 欧美一区二区三区视频在线观看 | 亚洲一区av无码专区在线观看 | 67194成是人免费无码 | 亚洲成色www久久网站 | 夫妻免费无码v看片 | 无码国产色欲xxxxx视频 | 久久99精品国产.久久久久 | 欧美兽交xxxx×视频 | 国产亚av手机在线观看 | 婷婷丁香五月天综合东京热 | 天天躁日日躁狠狠躁免费麻豆 | 久久无码中文字幕免费影院蜜桃 | 扒开双腿疯狂进出爽爽爽视频 | 色婷婷香蕉在线一区二区 | 国产后入清纯学生妹 | 荫蒂添的好舒服视频囗交 | 国色天香社区在线视频 | 人人妻人人澡人人爽欧美精品 | 中文字幕精品av一区二区五区 | 无码国产乱人伦偷精品视频 | 男人扒开女人内裤强吻桶进去 | 樱花草在线播放免费中文 | 美女扒开屁股让男人桶 | 日韩亚洲欧美中文高清在线 | 免费看男女做好爽好硬视频 | www国产精品内射老师 | 亚洲 另类 在线 欧美 制服 | 四虎国产精品一区二区 | 日本丰满护士爆乳xxxx | 荫蒂被男人添的好舒服爽免费视频 | 久久精品国产一区二区三区肥胖 | 久久久av男人的天堂 | 国产内射爽爽大片视频社区在线 | 人妻插b视频一区二区三区 | 国产一区二区三区日韩精品 | 欧美日韩视频无码一区二区三 | 1000部啪啪未满十八勿入下载 | 黑人大群体交免费视频 | 人妻少妇精品视频专区 | 午夜无码人妻av大片色欲 | 99久久99久久免费精品蜜桃 | 久久五月精品中文字幕 | 中文字幕无码视频专区 | 欧美放荡的少妇 | 精品成在人线av无码免费看 | 国产九九九九九九九a片 | 久久伊人色av天堂九九小黄鸭 | 亚洲人成影院在线观看 | 欧美日韩精品 | 大肉大捧一进一出视频出来呀 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品怡红院永久免费 | 精品日本一区二区三区在线观看 | 永久免费观看美女裸体的网站 | 久久久精品人妻久久影视 | 免费看男女做好爽好硬视频 | 在线播放亚洲第一字幕 | 中文字幕无码乱人伦 | 免费无码的av片在线观看 | 国产av久久久久精东av | 色综合久久久久综合一本到桃花网 | 亚洲精品中文字幕久久久久 | 亚洲熟妇自偷自拍另类 | 九九热爱视频精品 | 自拍偷自拍亚洲精品被多人伦好爽 | 初尝人妻少妇中文字幕 | 欧美成人午夜精品久久久 | 日本一卡二卡不卡视频查询 | 久久久久亚洲精品中文字幕 | 亚洲精品国产品国语在线观看 | 国产色精品久久人妻 | 久久久久99精品成人片 | 夜精品a片一区二区三区无码白浆 | 少妇高潮一区二区三区99 | 国语精品一区二区三区 | 好男人社区资源 | 国产成人无码区免费内射一片色欲 | 日韩精品无码一本二本三本色 | 欧美三级不卡在线观看 | 久久国语露脸国产精品电影 | 国产亲子乱弄免费视频 | 亚洲爆乳大丰满无码专区 | 老司机亚洲精品影院无码 | 国产美女精品一区二区三区 | 麻豆精品国产精华精华液好用吗 | 99re在线播放 | 国产成人一区二区三区别 | 国产国语老龄妇女a片 | 欧美性猛交内射兽交老熟妇 | 免费观看的无遮挡av | 亚洲精品一区二区三区四区五区 | 无遮挡国产高潮视频免费观看 | 午夜精品一区二区三区的区别 | аⅴ资源天堂资源库在线 | 国产激情无码一区二区app | 久久综合九色综合欧美狠狠 | 一本久道久久综合婷婷五月 | 特黄特色大片免费播放器图片 | 97久久精品无码一区二区 | 国产av一区二区精品久久凹凸 | 无码免费一区二区三区 | 亚洲国产精品无码久久久久高潮 | 国产成人av免费观看 | 丰满妇女强制高潮18xxxx | 久久www免费人成人片 | 亚洲人交乣女bbw | 成人无码影片精品久久久 | 精品偷拍一区二区三区在线看 | 丰满少妇高潮惨叫视频 | 中文字幕人成乱码熟女app | 丰满岳乱妇在线观看中字无码 | 丰满诱人的人妻3 | 377p欧洲日本亚洲大胆 | 天干天干啦夜天干天2017 | 天天躁夜夜躁狠狠是什么心态 | 中文字幕+乱码+中文字幕一区 | 中国大陆精品视频xxxx | 亚洲欧美国产精品久久 | 18无码粉嫩小泬无套在线观看 | 日韩精品无码一区二区中文字幕 | 波多野结衣av一区二区全免费观看 | 人妻体内射精一区二区三四 | 午夜精品一区二区三区在线观看 | 色一情一乱一伦一区二区三欧美 | 老司机亚洲精品影院无码 | 亚洲欧美日韩国产精品一区二区 | 天天躁日日躁狠狠躁免费麻豆 | 无套内谢的新婚少妇国语播放 | 麻豆国产人妻欲求不满 | aⅴ在线视频男人的天堂 | 88国产精品欧美一区二区三区 | 综合人妻久久一区二区精品 | 亚洲日韩av一区二区三区中文 | 一本久久a久久精品亚洲 | 午夜精品久久久内射近拍高清 | 亚洲精品无码国产 | 永久免费观看国产裸体美女 | 亚洲成av人片在线观看无码不卡 | 成人精品天堂一区二区三区 | 精品国产一区二区三区四区在线看 | 装睡被陌生人摸出水好爽 | 露脸叫床粗话东北少妇 | 欧美野外疯狂做受xxxx高潮 | 国产国产精品人在线视 | 一本一道久久综合久久 | 中文精品无码中文字幕无码专区 | 激情内射亚州一区二区三区爱妻 | 精品久久久无码人妻字幂 | 欧美日韩人成综合在线播放 | 亚洲人成影院在线无码按摩店 | 中文字幕无码乱人伦 | 大地资源中文第3页 | 一个人看的www免费视频在线观看 | 真人与拘做受免费视频一 | 少妇被黑人到高潮喷出白浆 | 国产热a欧美热a在线视频 | 少妇性l交大片欧洲热妇乱xxx | 国产亚洲精品久久久久久大师 | 伊人色综合久久天天小片 | 好屌草这里只有精品 | 在线观看免费人成视频 | 国产激情艳情在线看视频 | 成人三级无码视频在线观看 | 欧美激情一区二区三区成人 | 国产特级毛片aaaaaa高潮流水 | 天天av天天av天天透 | 成人毛片一区二区 | 一本色道久久综合亚洲精品不卡 | 亚洲а∨天堂久久精品2021 | 免费无码一区二区三区蜜桃大 | 亚洲精品久久久久中文第一幕 | 天堂无码人妻精品一区二区三区 | 亚洲中文字幕乱码av波多ji | 国产精品久久久一区二区三区 | 亚洲精品一区国产 | 久久国语露脸国产精品电影 | 色一情一乱一伦一区二区三欧美 | 精品国产一区二区三区av 性色 | 国产亚洲精品久久久久久 | 久久亚洲中文字幕无码 | 国产av无码专区亚洲a∨毛片 | 三上悠亚人妻中文字幕在线 | 国产色在线 | 国产 | 欧美日韩视频无码一区二区三 | 国产精品久久久久影院嫩草 | 无码免费一区二区三区 | 欧美日韩在线亚洲综合国产人 | 中文字幕乱码人妻无码久久 | 亚洲日本va中文字幕 | 97久久精品无码一区二区 | 中国女人内谢69xxxx | 欧洲熟妇精品视频 | 少女韩国电视剧在线观看完整 | 双乳奶水饱满少妇呻吟 | 久久综合给合久久狠狠狠97色 | 国产美女精品一区二区三区 | 无码av中文字幕免费放 | 久久精品人人做人人综合试看 | 亚洲国产精品久久久天堂 | 精品偷自拍另类在线观看 | 搡女人真爽免费视频大全 | 国语自产偷拍精品视频偷 | 久久综合色之久久综合 | 亚洲熟妇色xxxxx欧美老妇y | 精品无码国产自产拍在线观看蜜 | 色欲久久久天天天综合网精品 | 日本欧美一区二区三区乱码 | 亚洲欧美日韩成人高清在线一区 | 黄网在线观看免费网站 | 久久久精品国产sm最大网站 | 国产成人无码av片在线观看不卡 | 东京热男人av天堂 | 日韩成人一区二区三区在线观看 | 精品无码国产一区二区三区av | 激情国产av做激情国产爱 | 国产深夜福利视频在线 | 一本久久伊人热热精品中文字幕 | 鲁大师影院在线观看 | 国产特级毛片aaaaaa高潮流水 | 久久视频在线观看精品 | 波多野结衣av一区二区全免费观看 | 夫妻免费无码v看片 | 黑人粗大猛烈进出高潮视频 | 熟妇女人妻丰满少妇中文字幕 | 亚洲日本va午夜在线电影 | 亚洲色成人中文字幕网站 | 无码精品国产va在线观看dvd | 欧美老妇交乱视频在线观看 | 曰本女人与公拘交酡免费视频 | 九九久久精品国产免费看小说 | 亚洲成在人网站无码天堂 | 理论片87福利理论电影 | 少妇厨房愉情理9仑片视频 | 人人妻在人人 | 无码国产乱人伦偷精品视频 | 2020久久香蕉国产线看观看 | 2020久久香蕉国产线看观看 | 国产一区二区三区四区五区加勒比 | 欧美大屁股xxxxhd黑色 | 国产亚洲精品久久久久久国模美 | 免费观看黄网站 | 扒开双腿疯狂进出爽爽爽视频 | 午夜时刻免费入口 | 蜜桃无码一区二区三区 | 日本www一道久久久免费榴莲 | 国产精品va在线观看无码 | 欧美熟妇另类久久久久久多毛 | 亚洲国产精品久久久久久 | 中文无码成人免费视频在线观看 | 最近免费中文字幕中文高清百度 | 2020久久超碰国产精品最新 | 色婷婷欧美在线播放内射 | 国产乱人伦av在线无码 | 成人精品视频一区二区 | 超碰97人人做人人爱少妇 | 亚洲乱码国产乱码精品精 | 好屌草这里只有精品 | 欧美亚洲日韩国产人成在线播放 | 久久精品成人欧美大片 | 日韩 欧美 动漫 国产 制服 | 色偷偷人人澡人人爽人人模 | 日本在线高清不卡免费播放 | 婷婷丁香五月天综合东京热 | 高潮毛片无遮挡高清免费 | 无码吃奶揉捏奶头高潮视频 | 少妇性l交大片 | 天天摸天天碰天天添 | 人人超人人超碰超国产 | a片免费视频在线观看 | 高潮喷水的毛片 | 久久久中文字幕日本无吗 | 中文字幕无码免费久久9一区9 | 丰满肥臀大屁股熟妇激情视频 | 国产精品对白交换视频 | 牲欲强的熟妇农村老妇女视频 | 精品久久久久久人妻无码中文字幕 | 日韩精品乱码av一区二区 | 日韩少妇白浆无码系列 | 日本丰满护士爆乳xxxx | 精品国产国产综合精品 | 色五月五月丁香亚洲综合网 | 中文字幕 亚洲精品 第1页 | 丰满少妇熟乱xxxxx视频 | 亚洲小说图区综合在线 | 国产精品第一区揄拍无码 | 美女极度色诱视频国产 | 国产欧美熟妇另类久久久 | 国产精品久久福利网站 | 日韩亚洲欧美中文高清在线 | 国产亚洲精品精品国产亚洲综合 | 亚洲欧美色中文字幕在线 | 精品一区二区三区无码免费视频 | 无码人妻丰满熟妇区毛片18 | 亚洲色在线无码国产精品不卡 | 亚洲第一无码av无码专区 | 漂亮人妻洗澡被公强 日日躁 | 亚洲综合伊人久久大杳蕉 | a片在线免费观看 | 亚洲欧美精品伊人久久 | 综合激情五月综合激情五月激情1 | 日本一卡2卡3卡四卡精品网站 | 装睡被陌生人摸出水好爽 | 一本久久伊人热热精品中文字幕 | 色欲av亚洲一区无码少妇 | 国内精品九九久久久精品 | 久久久久久久女国产乱让韩 | 国产9 9在线 | 中文 | 国产成人无码区免费内射一片色欲 | 亚洲国精产品一二二线 | 中文字幕无码人妻少妇免费 | 天堂久久天堂av色综合 | 乌克兰少妇性做爰 | 国产人成高清在线视频99最全资源 | 国产麻豆精品精东影业av网站 | 亚洲综合久久一区二区 | 澳门永久av免费网站 | 国产九九九九九九九a片 | 300部国产真实乱 | 午夜丰满少妇性开放视频 | 国产亚洲精品久久久久久国模美 | 国产小呦泬泬99精品 | 国产在线精品一区二区高清不卡 | 精品无人区无码乱码毛片国产 | 国产成人精品视频ⅴa片软件竹菊 | 国产av人人夜夜澡人人爽麻豆 | 国产精品视频免费播放 | 一本久道高清无码视频 | 国产亚洲精品久久久久久大师 | 亚洲爆乳大丰满无码专区 | 国产精品美女久久久久av爽李琼 | 亚洲精品国产精品乱码不卡 | 激情五月综合色婷婷一区二区 | 中文字幕日产无线码一区 | 水蜜桃色314在线观看 | 亚洲精品国产品国语在线观看 | 国产性生交xxxxx无码 | 在线成人www免费观看视频 | 色狠狠av一区二区三区 | 日韩人妻系列无码专区 | 中文字幕乱码人妻无码久久 | 亚洲精品鲁一鲁一区二区三区 | 中文字幕无码人妻少妇免费 | 人人妻人人澡人人爽欧美精品 | 婷婷六月久久综合丁香 | 日韩精品a片一区二区三区妖精 | 丝袜美腿亚洲一区二区 | 亚洲熟妇色xxxxx欧美老妇y | 377p欧洲日本亚洲大胆 | 亚洲无人区一区二区三区 | 初尝人妻少妇中文字幕 | 无码成人精品区在线观看 | 无遮挡国产高潮视频免费观看 | 欧美黑人巨大xxxxx | 亚洲精品www久久久 | 欧美第一黄网免费网站 | 国产成人精品无码播放 | 野外少妇愉情中文字幕 | 国产激情无码一区二区 | 一个人免费观看的www视频 | 成人综合网亚洲伊人 | 中文字幕无码乱人伦 | 亚洲gv猛男gv无码男同 | 国产精品视频免费播放 | 大乳丰满人妻中文字幕日本 | 男人扒开女人内裤强吻桶进去 | 日欧一片内射va在线影院 | 色婷婷综合中文久久一本 | 一区二区三区乱码在线 | 欧洲 | 熟妇人妻无乱码中文字幕 | 在线欧美精品一区二区三区 | 日韩亚洲欧美中文高清在线 | 亚洲日韩av一区二区三区中文 | 97色伦图片97综合影院 | 亚拍精品一区二区三区探花 | 国产一区二区三区四区五区加勒比 | 水蜜桃亚洲一二三四在线 | 亚洲国产精品无码久久久久高潮 | 色情久久久av熟女人妻网站 | 天堂а√在线中文在线 | 国产精品对白交换视频 | 中文字幕无码人妻少妇免费 | 亚洲精品鲁一鲁一区二区三区 | 国产麻豆精品一区二区三区v视界 | 国产色精品久久人妻 | 精品国精品国产自在久国产87 | 久久人人爽人人人人片 | 又大又硬又爽免费视频 | 日本www一道久久久免费榴莲 | 久久久久久九九精品久 | 国产精品人妻一区二区三区四 | 内射后入在线观看一区 | 日韩人妻无码一区二区三区久久99 | 国精产品一品二品国精品69xx | 中文字幕久久久久人妻 | 欧美35页视频在线观看 | 97夜夜澡人人双人人人喊 | 一本色道久久综合亚洲精品不卡 | 久久综合色之久久综合 | 亚洲中文字幕乱码av波多ji | 国内综合精品午夜久久资源 | 亚洲精品国产品国语在线观看 | 青春草在线视频免费观看 | 麻花豆传媒剧国产免费mv在线 | 男女下面进入的视频免费午夜 | 国产精品美女久久久久av爽李琼 | 久久精品中文闷骚内射 | 最近中文2019字幕第二页 | 亚洲国产精品无码久久久久高潮 | 久久久久免费精品国产 | 国产乱人偷精品人妻a片 | 成熟女人特级毛片www免费 | 精品久久久久香蕉网 | 久久精品国产一区二区三区 | 内射后入在线观看一区 | 亚洲区欧美区综合区自拍区 | 久久国语露脸国产精品电影 | 久久综合色之久久综合 | 久久无码专区国产精品s | 无码人妻丰满熟妇区五十路百度 | 色妞www精品免费视频 | 久久99久久99精品中文字幕 | 少妇无码一区二区二三区 | 国产va免费精品观看 | 日本饥渴人妻欲求不满 | 麻豆av传媒蜜桃天美传媒 | 强开小婷嫩苞又嫩又紧视频 | 成在人线av无码免观看麻豆 | 丰满护士巨好爽好大乳 | 久久午夜无码鲁丝片秋霞 | 精品无码一区二区三区的天堂 | 国产激情精品一区二区三区 | 国产成人综合在线女婷五月99播放 | 中文字幕av伊人av无码av | 沈阳熟女露脸对白视频 | 精品aⅴ一区二区三区 | 2020最新国产自产精品 | 中文字幕av无码一区二区三区电影 | 天堂无码人妻精品一区二区三区 | 黑人巨大精品欧美黑寡妇 | 人妻与老人中文字幕 | 亚洲成av人影院在线观看 | 欧美高清在线精品一区 | 亚洲呦女专区 | 久久99久久99精品中文字幕 | 国产精品第一区揄拍无码 | 久久久精品国产sm最大网站 | 国产精品人人爽人人做我的可爱 | 欧洲熟妇色 欧美 | 国产精品久久久av久久久 | 粗大的内捧猛烈进出视频 | 国产免费无码一区二区视频 | 国产精品久久久久久亚洲毛片 | 国产亚洲精品精品国产亚洲综合 | 天天摸天天碰天天添 | 亚洲一区二区三区在线观看网站 | 蜜桃无码一区二区三区 | 丝袜足控一区二区三区 | 久久人人爽人人人人片 | 国产午夜精品一区二区三区嫩草 | 无码乱肉视频免费大全合集 | 久久99国产综合精品 | 少妇愉情理伦片bd | 成人无码精品一区二区三区 | 欧美黑人巨大xxxxx | 色综合久久88色综合天天 | 国产在线无码精品电影网 | 少妇的肉体aa片免费 | 乱码午夜-极国产极内射 | 丰满少妇女裸体bbw | 欧美丰满熟妇xxxx性ppx人交 | 国精产品一区二区三区 | 色诱久久久久综合网ywww | 激情内射日本一区二区三区 | 无码人妻出轨黑人中文字幕 | 亚洲色偷偷偷综合网 | 成 人 网 站国产免费观看 | 久久综合给合久久狠狠狠97色 | 成人性做爰aaa片免费看不忠 | 欧美老熟妇乱xxxxx | 黑人巨大精品欧美一区二区 | 国产成人午夜福利在线播放 | 一本精品99久久精品77 | 一本色道久久综合亚洲精品不卡 | 婷婷综合久久中文字幕蜜桃三电影 | 久久综合久久自在自线精品自 | 欧美丰满熟妇xxxx性ppx人交 | 国产在热线精品视频 | 装睡被陌生人摸出水好爽 | 亚洲欧洲中文日韩av乱码 | 四虎永久在线精品免费网址 | 久久亚洲精品成人无码 | 人妻aⅴ无码一区二区三区 | 成人无码影片精品久久久 | 中文毛片无遮挡高清免费 | 天天综合网天天综合色 | 伊在人天堂亚洲香蕉精品区 | 亚洲狠狠色丁香婷婷综合 | 久久国内精品自在自线 | 丰满妇女强制高潮18xxxx | 欧美激情一区二区三区成人 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕无码日韩专区 | 久久97精品久久久久久久不卡 | 欧美日韩人成综合在线播放 | 疯狂三人交性欧美 | 欧美xxxxx精品 | 综合人妻久久一区二区精品 | 日日碰狠狠丁香久燥 | 久久熟妇人妻午夜寂寞影院 | 狠狠色噜噜狠狠狠7777奇米 | 强辱丰满人妻hd中文字幕 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美午夜特黄aaaaaa片 | 国产激情精品一区二区三区 | 网友自拍区视频精品 | 蜜桃无码一区二区三区 | 国产极品美女高潮无套在线观看 | 奇米影视7777久久精品人人爽 | 亚洲成熟女人毛毛耸耸多 | 精品偷拍一区二区三区在线看 | 欧美高清在线精品一区 | 欧美国产日韩久久mv | 高中生自慰www网站 | 任你躁国产自任一区二区三区 | 久久www免费人成人片 | 国产亚洲欧美在线专区 | 亚洲综合色区中文字幕 | 亚洲中文字幕无码一久久区 | 日韩人妻系列无码专区 | 99久久99久久免费精品蜜桃 | 中文字幕无码av波多野吉衣 | 76少妇精品导航 | 亚洲精品中文字幕久久久久 | 精品夜夜澡人妻无码av蜜桃 | 欧美人与禽猛交狂配 | 在线播放免费人成毛片乱码 | a国产一区二区免费入口 | 丝袜足控一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 国产精品美女久久久久av爽李琼 | 日本熟妇人妻xxxxx人hd | 无码av免费一区二区三区试看 | 国产精品久久久久久亚洲影视内衣 | 成年美女黄网站色大免费全看 | 精品无人区无码乱码毛片国产 | 一本久久a久久精品亚洲 | 少妇无码av无码专区在线观看 | 少妇人妻偷人精品无码视频 | 无码一区二区三区在线 | 欧美一区二区三区 | 女人高潮内射99精品 | 色欲av亚洲一区无码少妇 | 精品aⅴ一区二区三区 | 免费中文字幕日韩欧美 | 欧美人与牲动交xxxx | 丰满少妇人妻久久久久久 | 国内精品久久毛片一区二区 | 成人一区二区免费视频 | 国产av无码专区亚洲a∨毛片 | | 欧美成人高清在线播放 | 色一情一乱一伦一区二区三欧美 | 娇妻被黑人粗大高潮白浆 | 兔费看少妇性l交大片免费 | 成人综合网亚洲伊人 | 少妇性俱乐部纵欲狂欢电影 | 老熟妇仑乱视频一区二区 | 久久精品成人欧美大片 | 成人精品视频一区二区 | 欧美自拍另类欧美综合图片区 | 国产绳艺sm调教室论坛 | 麻豆蜜桃av蜜臀av色欲av | 久久精品国产日本波多野结衣 | 精品无人国产偷自产在线 | 亚洲精品久久久久中文第一幕 | 三级4级全黄60分钟 | 国产成人精品无码播放 | 亚洲综合无码久久精品综合 | 亚洲成a人片在线观看无码 | 久久熟妇人妻午夜寂寞影院 | 人妻有码中文字幕在线 | 两性色午夜视频免费播放 | 国产精品18久久久久久麻辣 | 亚洲人成无码网www | 又粗又大又硬毛片免费看 | 亚洲一区二区三区偷拍女厕 | 国产亚洲精品久久久久久久 | 97资源共享在线视频 | 亚洲成a人片在线观看无码 | 日本在线高清不卡免费播放 | 动漫av一区二区在线观看 | 夜夜影院未满十八勿进 | 国产热a欧美热a在线视频 | 免费看少妇作爱视频 | 人妻少妇精品无码专区动漫 | 国产精品无码一区二区桃花视频 | 亚洲伊人久久精品影院 | 久久99精品久久久久久动态图 | 日本一本二本三区免费 | 嫩b人妻精品一区二区三区 | 国产免费无码一区二区视频 | 97夜夜澡人人爽人人喊中国片 | 精品无码一区二区三区爱欲 | 亚洲精品国产品国语在线观看 | 在线精品亚洲一区二区 | 色一情一乱一伦一区二区三欧美 | 国产97色在线 | 免 | 蜜臀av无码人妻精品 | 成 人影片 免费观看 | 人人澡人人妻人人爽人人蜜桃 | 人人爽人人爽人人片av亚洲 | 国产麻豆精品精东影业av网站 | 免费无码肉片在线观看 | 国产精品沙发午睡系列 | 日日橹狠狠爱欧美视频 | 亚洲理论电影在线观看 | 国产 浪潮av性色四虎 | 日日天日日夜日日摸 | 99国产精品白浆在线观看免费 | 又色又爽又黄的美女裸体网站 | 精品国偷自产在线视频 | 国产精品理论片在线观看 | 曰韩少妇内射免费播放 | 国产精品资源一区二区 | 自拍偷自拍亚洲精品被多人伦好爽 | 无码av岛国片在线播放 | 国产特级毛片aaaaaa高潮流水 | 中文无码精品a∨在线观看不卡 | 国产超级va在线观看视频 | 国产精品无码一区二区三区不卡 | 亚洲色欲色欲欲www在线 | 黑人大群体交免费视频 | √天堂中文官网8在线 | 国产午夜亚洲精品不卡下载 | 欧美色就是色 | 牛和人交xxxx欧美 | 色 综合 欧美 亚洲 国产 | 国产午夜手机精彩视频 | 国产午夜手机精彩视频 | 免费无码av一区二区 | 曰韩少妇内射免费播放 | 精品国产成人一区二区三区 | 天堂久久天堂av色综合 | 中国女人内谢69xxxx | 18禁止看的免费污网站 | 亚洲va欧美va天堂v国产综合 | 性欧美牲交在线视频 | 欧洲欧美人成视频在线 | 99精品视频在线观看免费 | 少妇愉情理伦片bd | 夜精品a片一区二区三区无码白浆 | 精品久久久久香蕉网 | 国产特级毛片aaaaaa高潮流水 | а天堂中文在线官网 | 国产欧美精品一区二区三区 | 一本一道久久综合久久 | 国产高清av在线播放 | 亚洲国产精品成人久久蜜臀 | 无码国模国产在线观看 | 久青草影院在线观看国产 | 国产成人精品必看 | 亚洲国产成人a精品不卡在线 | 人人妻人人澡人人爽欧美精品 | 性色欲情网站iwww九文堂 | 久久国产精品偷任你爽任你 | 97久久精品无码一区二区 | 成 人影片 免费观看 | 色综合久久久无码网中文 | 国产色xx群视频射精 | a在线亚洲男人的天堂 | 老熟妇仑乱视频一区二区 | 亚洲成av人综合在线观看 | 天堂久久天堂av色综合 | 一本大道久久东京热无码av | 日本一区二区更新不卡 | 国产精品人人妻人人爽 | 荫蒂添的好舒服视频囗交 | 黑人粗大猛烈进出高潮视频 | 爆乳一区二区三区无码 | 熟女少妇人妻中文字幕 | 欧美乱妇无乱码大黄a片 | 一本色道久久综合狠狠躁 | 久久天天躁狠狠躁夜夜免费观看 | 国产一区二区三区影院 | 国产又爽又猛又粗的视频a片 | 成熟妇人a片免费看网站 | 久久综合狠狠综合久久综合88 | 日本在线高清不卡免费播放 | 色综合天天综合狠狠爱 | 欧洲vodafone精品性 | 在线欧美精品一区二区三区 | 亚洲gv猛男gv无码男同 | 久久精品无码一区二区三区 | 精品偷自拍另类在线观看 | 精品人妻中文字幕有码在线 | 亚洲乱亚洲乱妇50p | 高清国产亚洲精品自在久久 | 色诱久久久久综合网ywww | 男人的天堂av网站 | 国产亚洲tv在线观看 | 成人试看120秒体验区 | 丰满少妇熟乱xxxxx视频 | 黑人巨大精品欧美一区二区 | 俺去俺来也在线www色官网 | 国产成人无码a区在线观看视频app | 免费看少妇作爱视频 | 少妇的肉体aa片免费 | 国产精品成人av在线观看 | 久久国产精品_国产精品 | 国产精品多人p群无码 | 国产精品久久久久影院嫩草 | 四虎国产精品一区二区 | 亚洲国产精品成人久久蜜臀 | aa片在线观看视频在线播放 | 天天爽夜夜爽夜夜爽 | 日本爽爽爽爽爽爽在线观看免 | 狠狠色色综合网站 | 大屁股大乳丰满人妻 | 大色综合色综合网站 | 亚洲日韩中文字幕在线播放 | 无遮挡国产高潮视频免费观看 | 无码福利日韩神码福利片 | 九九综合va免费看 | 精品久久久久久人妻无码中文字幕 | 无码乱肉视频免费大全合集 | 国产精品久久久av久久久 | 国产精品99久久精品爆乳 | 国产艳妇av在线观看果冻传媒 | √天堂中文官网8在线 | 国产亚av手机在线观看 | 日韩人妻无码一区二区三区久久99 | 亚洲中文字幕在线观看 | 亚洲一区二区三区偷拍女厕 | 荫蒂添的好舒服视频囗交 | 午夜福利不卡在线视频 | 无遮挡啪啪摇乳动态图 | 久久久久久久久蜜桃 | 国产成人精品视频ⅴa片软件竹菊 | 无码av岛国片在线播放 | 98国产精品综合一区二区三区 | 亚洲一区二区三区播放 | 免费视频欧美无人区码 | 欧洲vodafone精品性 | 午夜精品久久久内射近拍高清 | 狠狠综合久久久久综合网 | 国产亚洲精品久久久久久久久动漫 | 欧美老妇交乱视频在线观看 | 1000部啪啪未满十八勿入下载 | 在线视频网站www色 | 午夜丰满少妇性开放视频 | 无码人妻丰满熟妇区五十路百度 | 九月婷婷人人澡人人添人人爽 | 国产97人人超碰caoprom | 国产成人av免费观看 | 国产精品久久久久久久影院 | 成人性做爰aaa片免费看 | 大色综合色综合网站 | 国产精品美女久久久网av | 国产高潮视频在线观看 | 精品无码国产一区二区三区av | 国产精品久久久久久久9999 | 人人爽人人澡人人高潮 | 国产凸凹视频一区二区 | 成人免费视频在线观看 | 啦啦啦www在线观看免费视频 | 色噜噜亚洲男人的天堂 | 成 人 网 站国产免费观看 | 人人爽人人爽人人片av亚洲 | 日日碰狠狠丁香久燥 | 国产精品99爱免费视频 | 最近的中文字幕在线看视频 | 国产人妻精品午夜福利免费 | 人妻无码αv中文字幕久久琪琪布 | 伊人久久大香线蕉av一区二区 | 又大又硬又黄的免费视频 | 性生交片免费无码看人 | 亚洲精品国产a久久久久久 | 又紧又大又爽精品一区二区 | 国产色在线 | 国产 | 无码午夜成人1000部免费视频 | 内射巨臀欧美在线视频 | av人摸人人人澡人人超碰下载 | www国产亚洲精品久久网站 | 亚洲精品www久久久 | 国产另类ts人妖一区二区 | 精品久久久久久亚洲精品 | 四虎永久在线精品免费网址 | 欧美性生交活xxxxxdddd | 亚洲日韩一区二区 | 99久久精品国产一区二区蜜芽 | 初尝人妻少妇中文字幕 | 伊人久久大香线焦av综合影院 | 少妇性荡欲午夜性开放视频剧场 | 永久免费观看美女裸体的网站 | 久9re热视频这里只有精品 | 好屌草这里只有精品 | 亚洲精品久久久久avwww潮水 | 一本色道久久综合狠狠躁 | 国产成人精品优优av | 蜜桃视频插满18在线观看 | 日韩精品一区二区av在线 | 午夜精品久久久内射近拍高清 | 老熟女重囗味hdxx69 | 1000部啪啪未满十八勿入下载 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲欧洲无卡二区视頻 | 欧美熟妇另类久久久久久不卡 | 亚洲国产高清在线观看视频 | 国产色精品久久人妻 | 日韩精品a片一区二区三区妖精 | 少妇一晚三次一区二区三区 | 中文字幕日产无线码一区 | 欧美黑人巨大xxxxx | 欧美野外疯狂做受xxxx高潮 | 欧美喷潮久久久xxxxx | 国产人妻精品一区二区三区 | 亚洲精品成人av在线 | 狠狠亚洲超碰狼人久久 | 国产成人综合美国十次 | 中文字幕乱码中文乱码51精品 | 亚洲 激情 小说 另类 欧美 | 撕开奶罩揉吮奶头视频 | 国产精品高潮呻吟av久久4虎 | 人人妻人人澡人人爽欧美一区 | 日本va欧美va欧美va精品 | 波多野结衣高清一区二区三区 | 亚洲色偷偷偷综合网 | 国产一区二区三区精品视频 | 久久99国产综合精品 | 欧美精品一区二区精品久久 | 少妇的肉体aa片免费 | 亚洲 a v无 码免 费 成 人 a v | 色婷婷av一区二区三区之红樱桃 | 熟女少妇在线视频播放 | 中文字幕+乱码+中文字幕一区 | 国产成人av免费观看 | 一本久道久久综合婷婷五月 | 亚洲综合色区中文字幕 | 国产精品无码久久av | 午夜福利不卡在线视频 | 日本大乳高潮视频在线观看 | 少妇性俱乐部纵欲狂欢电影 | 久久精品中文字幕大胸 | 免费网站看v片在线18禁无码 | 午夜精品久久久久久久 | 爆乳一区二区三区无码 | 国产午夜精品一区二区三区嫩草 | 午夜丰满少妇性开放视频 | 久久人人爽人人人人片 | 免费无码午夜福利片69 | √天堂中文官网8在线 | 夜先锋av资源网站 | 又粗又大又硬又长又爽 | 亚洲人成人无码网www国产 | 国产一区二区三区四区五区加勒比 | 国产精品二区一区二区aⅴ污介绍 | 日韩精品久久久肉伦网站 | 成人女人看片免费视频放人 | 日本高清一区免费中文视频 | 在线天堂新版最新版在线8 | 熟女少妇在线视频播放 | 日本一卡二卡不卡视频查询 | 亚洲国产精品久久人人爱 | 无码人妻av免费一区二区三区 | 噜噜噜亚洲色成人网站 | 精品水蜜桃久久久久久久 | 久久99精品久久久久婷婷 | 老子影院午夜伦不卡 | 男女爱爱好爽视频免费看 | 国产精品.xx视频.xxtv | 亚洲a无码综合a国产av中文 | 国产福利视频一区二区 | 国产高清av在线播放 | 中文字幕乱码人妻无码久久 | 日本肉体xxxx裸交 | 国产精品-区区久久久狼 | 欧美猛少妇色xxxxx | 国产高清不卡无码视频 | 亚洲啪av永久无码精品放毛片 | 人人澡人摸人人添 | 亚洲性无码av中文字幕 | 国产精品国产自线拍免费软件 | 久久久成人毛片无码 | 伊人色综合久久天天小片 | 久久人人97超碰a片精品 | 免费无码的av片在线观看 | 欧美亚洲日韩国产人成在线播放 | 亚洲小说图区综合在线 | 国产亚洲精品久久久久久大师 | 55夜色66夜色国产精品视频 | 精品日本一区二区三区在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 少妇无码一区二区二三区 | 丰满护士巨好爽好大乳 | 55夜色66夜色国产精品视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 偷窥村妇洗澡毛毛多 | 久久久久免费看成人影片 | 中文字幕无码乱人伦 | 精品无码成人片一区二区98 | 老司机亚洲精品影院 | 99久久久国产精品无码免费 | 亚洲日韩一区二区 | 1000部啪啪未满十八勿入下载 | 国产精品沙发午睡系列 | 久久人人爽人人人人片 | 俺去俺来也www色官网 | 国精产品一区二区三区 | 日本精品久久久久中文字幕 | 国产精品高潮呻吟av久久4虎 | 欧美日韩在线亚洲综合国产人 | 亚洲精品中文字幕乱码 | 少妇性l交大片欧洲热妇乱xxx | 国产精品嫩草久久久久 | 日韩精品久久久肉伦网站 | 1000部啪啪未满十八勿入下载 | 亚洲熟妇自偷自拍另类 | 粉嫩少妇内射浓精videos | 欧美日本日韩 | 亚洲 激情 小说 另类 欧美 | 国产免费久久精品国产传媒 | 精品无人区无码乱码毛片国产 | 天堂久久天堂av色综合 | 亚洲精品午夜无码电影网 | 色五月丁香五月综合五月 | 男女爱爱好爽视频免费看 | 1000部夫妻午夜免费 | 六月丁香婷婷色狠狠久久 | 丝袜足控一区二区三区 | 国产乱人偷精品人妻a片 | 毛片内射-百度 | 日日摸夜夜摸狠狠摸婷婷 | 丝袜足控一区二区三区 | 麻豆精品国产精华精华液好用吗 | 强奷人妻日本中文字幕 | 丝袜美腿亚洲一区二区 | 亚洲国产午夜精品理论片 | 亚洲s码欧洲m码国产av | 精品成在人线av无码免费看 | 一本久久a久久精品vr综合 | 欧美 丝袜 自拍 制服 另类 | 美女扒开屁股让男人桶 | 国产成人人人97超碰超爽8 | 在线天堂新版最新版在线8 | 色噜噜亚洲男人的天堂 | 永久免费观看美女裸体的网站 | 色情久久久av熟女人妻网站 | 欧美乱妇无乱码大黄a片 | 精品国产国产综合精品 | 国内少妇偷人精品视频 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲乱码国产乱码精品精 | 欧美大屁股xxxxhd黑色 | 国产特级毛片aaaaaa高潮流水 | 国内精品人妻无码久久久影院 | √天堂中文官网8在线 | 学生妹亚洲一区二区 | 少妇愉情理伦片bd | 一本久道久久综合狠狠爱 | 东北女人啪啪对白 | 欧美 丝袜 自拍 制服 另类 | 玩弄中年熟妇正在播放 | 亚洲成av人综合在线观看 | 欧美人与禽zoz0性伦交 | 黑人巨大精品欧美一区二区 | 十八禁视频网站在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 老太婆性杂交欧美肥老太 | 国产两女互慰高潮视频在线观看 | 国产精品亚洲一区二区三区喷水 | 人人妻人人藻人人爽欧美一区 | 野狼第一精品社区 | 色偷偷人人澡人人爽人人模 | 男人的天堂2018无码 | 亚洲精品久久久久久一区二区 | 日日摸天天摸爽爽狠狠97 | 久久国产精品_国产精品 | ass日本丰满熟妇pics | 国产极品美女高潮无套在线观看 | 色综合久久网 | 国产偷国产偷精品高清尤物 | 波多野结衣一区二区三区av免费 | 欧美丰满熟妇xxxx性ppx人交 | 久久午夜无码鲁丝片秋霞 | 无码吃奶揉捏奶头高潮视频 | 67194成是人免费无码 | 国产又粗又硬又大爽黄老大爷视 | 无码人妻精品一区二区三区不卡 | 国产亚洲精品久久久久久久 | 精品无码成人片一区二区98 | 中文字幕无码热在线视频 | 免费看少妇作爱视频 | 国产精品igao视频网 | 亚洲精品国偷拍自产在线观看蜜桃 | 麻豆人妻少妇精品无码专区 | 久久久久se色偷偷亚洲精品av | 欧美一区二区三区 | 性生交大片免费看女人按摩摩 | 51国偷自产一区二区三区 | 性史性农村dvd毛片 | 激情五月综合色婷婷一区二区 | 最近免费中文字幕中文高清百度 | 国产精品理论片在线观看 | 18无码粉嫩小泬无套在线观看 | 婷婷色婷婷开心五月四房播播 | 精品国产麻豆免费人成网站 | 午夜精品久久久内射近拍高清 | 亚洲中文无码av永久不收费 | 东京热无码av男人的天堂 | 成人影院yy111111在线观看 | 蜜臀av无码人妻精品 | 又粗又大又硬毛片免费看 | 久久99热只有频精品8 | 少妇被黑人到高潮喷出白浆 | 午夜福利一区二区三区在线观看 | 水蜜桃色314在线观看 | 性色欲网站人妻丰满中文久久不卡 | 草草网站影院白丝内射 | 东京一本一道一二三区 | 久久视频在线观看精品 | 中文字幕乱码亚洲无线三区 | 在线观看国产一区二区三区 | 午夜丰满少妇性开放视频 | 久久久中文久久久无码 | 狠狠色噜噜狠狠狠狠7777米奇 | 麻豆国产丝袜白领秘书在线观看 | 亚洲 欧美 激情 小说 另类 | 国产午夜无码精品免费看 | 国产精品无码mv在线观看 | 无套内谢的新婚少妇国语播放 | 国产亚洲精品久久久久久国模美 | 最新国产麻豆aⅴ精品无码 | 久久综合九色综合97网 | 久久久亚洲欧洲日产国码αv | 国产精品第一区揄拍无码 | 四虎影视成人永久免费观看视频 | 久久人人爽人人爽人人片av高清 | 日本大乳高潮视频在线观看 | 2020久久香蕉国产线看观看 | 亚洲色欲色欲欲www在线 | 亚洲国产精品一区二区美利坚 | 男女猛烈xx00免费视频试看 | 啦啦啦www在线观看免费视频 | 亚洲欧洲中文日韩av乱码 | 亚洲男人av香蕉爽爽爽爽 | 精品无码成人片一区二区98 | 波多野结衣 黑人 | 欧美熟妇另类久久久久久多毛 | 国产特级毛片aaaaaa高潮流水 | 女人被爽到呻吟gif动态图视看 | 国产超碰人人爽人人做人人添 | 亚洲成a人片在线观看日本 | 网友自拍区视频精品 | 无码毛片视频一区二区本码 | 欧美日本免费一区二区三区 | 久久国产36精品色熟妇 | 中文久久乱码一区二区 | 黑人巨大精品欧美一区二区 | 国产一区二区三区四区五区加勒比 | 人妻中文无码久热丝袜 | 清纯唯美经典一区二区 | 日日碰狠狠躁久久躁蜜桃 | 日本一卡2卡3卡四卡精品网站 | 久久久久成人片免费观看蜜芽 | 久久久国产一区二区三区 | 欧洲欧美人成视频在线 | 97精品国产97久久久久久免费 | 一本久久a久久精品vr综合 | 波多野结衣av在线观看 | 波多野42部无码喷潮在线 | 亚洲另类伦春色综合小说 | 狠狠cao日日穞夜夜穞av | 99re在线播放 | 久久99精品国产麻豆蜜芽 | 人妻aⅴ无码一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 性色欲网站人妻丰满中文久久不卡 | 中文字幕+乱码+中文字幕一区 | 久久久中文字幕日本无吗 | 激情国产av做激情国产爱 | 久久亚洲日韩精品一区二区三区 | 亚洲国产精品无码一区二区三区 | 日韩精品无码一区二区中文字幕 | 88国产精品欧美一区二区三区 | 人妻少妇精品无码专区二区 | 亚洲大尺度无码无码专区 | 国产高潮视频在线观看 | 国产女主播喷水视频在线观看 | 色欲av亚洲一区无码少妇 | 久久国产精品_国产精品 | 欧美性色19p | 无码av岛国片在线播放 | 丰满人妻翻云覆雨呻吟视频 | 精品欧美一区二区三区久久久 | 国产香蕉尹人综合在线观看 | 3d动漫精品啪啪一区二区中 | 午夜免费福利小电影 | 久久亚洲中文字幕无码 | 久久国产自偷自偷免费一区调 | 国产 浪潮av性色四虎 | 学生妹亚洲一区二区 | 国产亚洲精品久久久久久大师 | 又紧又大又爽精品一区二区 | 无码人妻久久一区二区三区不卡 | 极品尤物被啪到呻吟喷水 | 大肉大捧一进一出视频出来呀 | v一区无码内射国产 | 日本大乳高潮视频在线观看 | 国产人妻精品午夜福利免费 | 性开放的女人aaa片 | 国产精品香蕉在线观看 | 成人欧美一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 小鲜肉自慰网站xnxx | 精品久久久久久人妻无码中文字幕 | 免费播放一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 国产精品久久久久久亚洲影视内衣 | 性做久久久久久久免费看 | 婷婷六月久久综合丁香 | 久久亚洲精品中文字幕无男同 | 麻豆成人精品国产免费 | 97夜夜澡人人爽人人喊中国片 | 高清无码午夜福利视频 | 给我免费的视频在线观看 | 99精品无人区乱码1区2区3区 | 免费无码一区二区三区蜜桃大 | 乱人伦人妻中文字幕无码 | 免费看男女做好爽好硬视频 | 亚洲熟妇色xxxxx亚洲 | 一本久久伊人热热精品中文字幕 | 性生交片免费无码看人 | 精品国偷自产在线视频 | 久久久久国色av免费观看性色 | 婷婷色婷婷开心五月四房播播 | 天堂在线观看www | 国产精品无码成人午夜电影 | 丁香花在线影院观看在线播放 | 亚洲va欧美va天堂v国产综合 | 国产无遮挡吃胸膜奶免费看 | 老头边吃奶边弄进去呻吟 | 久热国产vs视频在线观看 | 亚洲国产精品无码久久久久高潮 | 九九久久精品国产免费看小说 | 日韩欧美中文字幕在线三区 | 麻豆果冻传媒2021精品传媒一区下载 | 成人无码视频在线观看网站 | 激情人妻另类人妻伦 | 久久99热只有频精品8 | 18禁黄网站男男禁片免费观看 | 窝窝午夜理论片影院 | 狂野欧美性猛xxxx乱大交 | 久久久中文字幕日本无吗 | 婷婷综合久久中文字幕蜜桃三电影 | 国产精品福利视频导航 | 中文字幕+乱码+中文字幕一区 | 十八禁视频网站在线观看 | 1000部夫妻午夜免费 | 亚洲中文字幕va福利 | 久久亚洲中文字幕精品一区 | 人人爽人人爽人人片av亚洲 | 7777奇米四色成人眼影 | 少妇厨房愉情理9仑片视频 | 99久久99久久免费精品蜜桃 | 久久精品人人做人人综合 | 免费人成在线观看网站 | 久久久婷婷五月亚洲97号色 | 亚洲码国产精品高潮在线 | 内射欧美老妇wbb | 无码任你躁久久久久久久 | 国产精品久久久久7777 | 亚洲成av人片在线观看无码不卡 | 久久久久亚洲精品男人的天堂 | 中文字幕无码av波多野吉衣 | 亚洲成在人网站无码天堂 | 亚洲综合无码久久精品综合 | 久久精品视频在线看15 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲国产欧美日韩精品一区二区三区 | 国产午夜视频在线观看 | 日韩欧美群交p片內射中文 | 国产一区二区三区四区五区加勒比 | 18禁止看的免费污网站 | 亚洲精品中文字幕久久久久 | 男人和女人高潮免费网站 | 欧美黑人性暴力猛交喷水 | 国产精品欧美成人 | 亚洲国产精品无码一区二区三区 | 精品国产一区二区三区四区在线看 | 在线观看欧美一区二区三区 | 中文亚洲成a人片在线观看 | 鲁鲁鲁爽爽爽在线视频观看 | 色欲人妻aaaaaaa无码 | 老子影院午夜精品无码 | 国产av一区二区三区最新精品 | 黑人大群体交免费视频 | 人妻天天爽夜夜爽一区二区 | 国产成人综合在线女婷五月99播放 | 欧美精品免费观看二区 | 日本欧美一区二区三区乱码 | 国产激情无码一区二区 | 国内揄拍国内精品少妇国语 | 一本久道高清无码视频 | 亚洲日本一区二区三区在线 | 精品乱码久久久久久久 | 欧美真人作爱免费视频 |