久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(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)容還不錯,歡迎將生活随笔推薦給好友。

    国内精品人妻无码久久久影院蜜桃 | 国产成人综合在线女婷五月99播放 | 在线a亚洲视频播放在线观看 | 一本久久a久久精品vr综合 | 51国偷自产一区二区三区 | 欧美性猛交xxxx富婆 | 亚洲一区二区观看播放 | 国产另类ts人妖一区二区 | 青春草在线视频免费观看 | 99久久精品午夜一区二区 | 国产真人无遮挡作爱免费视频 | 国产卡一卡二卡三 | 中文字幕人妻无码一区二区三区 | 精品一区二区不卡无码av | 男女下面进入的视频免费午夜 | 精品熟女少妇av免费观看 | 高潮毛片无遮挡高清免费 | 国产精品无码永久免费888 | 亚洲精品一区二区三区四区五区 | 人妻天天爽夜夜爽一区二区 | 国产一区二区不卡老阿姨 | 国产精品久久福利网站 | 少妇厨房愉情理9仑片视频 | 国产香蕉97碰碰久久人人 | 日韩无套无码精品 | 亚洲国产精品一区二区美利坚 | 熟妇人妻激情偷爽文 | 3d动漫精品啪啪一区二区中 | 人妻有码中文字幕在线 | 男女下面进入的视频免费午夜 | 亚洲の无码国产の无码步美 | 免费无码的av片在线观看 | 美女张开腿让人桶 | 免费无码午夜福利片69 | 国产精品国产三级国产专播 | 一本久道久久综合狠狠爱 | 色情久久久av熟女人妻网站 | 男女下面进入的视频免费午夜 | 99久久精品国产一区二区蜜芽 | 大地资源网第二页免费观看 | 18禁止看的免费污网站 | 日日天日日夜日日摸 | 嫩b人妻精品一区二区三区 | 国产亚洲精品久久久ai换 | 帮老师解开蕾丝奶罩吸乳网站 | 高清不卡一区二区三区 | 性欧美videos高清精品 | 国产精品久久久久久久影院 | 精品人妻中文字幕有码在线 | 久久人人爽人人人人片 | 成熟人妻av无码专区 | 精品少妇爆乳无码av无码专区 | 成人无码影片精品久久久 | 国产人妖乱国产精品人妖 | 天堂а√在线中文在线 | 亚洲欧洲日本无在线码 | 婷婷五月综合激情中文字幕 | 蜜桃无码一区二区三区 | 精品一区二区三区波多野结衣 | 久久国语露脸国产精品电影 | 99国产精品白浆在线观看免费 | 国产97在线 | 亚洲 | 亚洲男女内射在线播放 | 国产成人精品优优av | 丰满少妇女裸体bbw | 一区二区传媒有限公司 | 日韩人妻无码一区二区三区久久99 | 免费男性肉肉影院 | 亚洲毛片av日韩av无码 | 久久久www成人免费毛片 | 狠狠亚洲超碰狼人久久 | 蜜桃臀无码内射一区二区三区 | 亚洲成a人片在线观看无码 | 无码人妻av免费一区二区三区 | 国产成人精品久久亚洲高清不卡 | 欧美国产亚洲日韩在线二区 | 亚洲精品国产第一综合99久久 | 女人被男人躁得好爽免费视频 | 无码纯肉视频在线观看 | 精品日本一区二区三区在线观看 | 国产人妖乱国产精品人妖 | 男人扒开女人内裤强吻桶进去 | 性欧美牲交xxxxx视频 | 老熟女重囗味hdxx69 | 色偷偷人人澡人人爽人人模 | 激情国产av做激情国产爱 | 中文字幕av伊人av无码av | 又色又爽又黄的美女裸体网站 | 一区二区三区乱码在线 | 欧洲 | 精品一区二区三区无码免费视频 | 蜜桃臀无码内射一区二区三区 | 麻豆国产丝袜白领秘书在线观看 | 亚洲综合久久一区二区 | 日韩精品久久久肉伦网站 | 又大又黄又粗又爽的免费视频 | 又紧又大又爽精品一区二区 | 熟女少妇在线视频播放 | 国产在线精品一区二区三区直播 | √8天堂资源地址中文在线 | 漂亮人妻洗澡被公强 日日躁 | 欧美人与动性行为视频 | 日本肉体xxxx裸交 | 蜜桃臀无码内射一区二区三区 | 亚洲中文字幕无码一久久区 | 国产又爽又猛又粗的视频a片 | 亚洲人成无码网www | 欧美日韩视频无码一区二区三 | 国产亚洲精品精品国产亚洲综合 | 欧美性色19p | 红桃av一区二区三区在线无码av | 国产色在线 | 国产 | 色婷婷香蕉在线一区二区 | 国产又爽又猛又粗的视频a片 | 国产精品久久久av久久久 | 成人亚洲精品久久久久软件 | 欧美自拍另类欧美综合图片区 | 日本一区二区三区免费高清 | 亚洲中文字幕成人无码 | 大乳丰满人妻中文字幕日本 | 一二三四在线观看免费视频 | 伊人久久大香线蕉av一区二区 | 色欲久久久天天天综合网精品 | 亚洲精品一区二区三区婷婷月 | 国产成人午夜福利在线播放 | 国产成人无码一二三区视频 | 亚洲精品鲁一鲁一区二区三区 | 亚洲区小说区激情区图片区 | 无人区乱码一区二区三区 | 久久久中文久久久无码 | 暴力强奷在线播放无码 | 欧美 日韩 亚洲 在线 | 亚洲人亚洲人成电影网站色 | 亚洲另类伦春色综合小说 | 美女扒开屁股让男人桶 | 色婷婷香蕉在线一区二区 | 精品久久8x国产免费观看 | 激情内射亚州一区二区三区爱妻 | 亚洲一区二区三区四区 | 377p欧洲日本亚洲大胆 | 中文字幕av日韩精品一区二区 | 日韩少妇内射免费播放 | 国产超级va在线观看视频 | 欧美猛少妇色xxxxx | 男女超爽视频免费播放 | 曰韩少妇内射免费播放 | 丰满护士巨好爽好大乳 | 波多野结衣一区二区三区av免费 | 精品久久久久香蕉网 | 成人欧美一区二区三区黑人 | 97夜夜澡人人爽人人喊中国片 | 午夜成人1000部免费视频 | 久久精品国产日本波多野结衣 | 日本一区二区三区免费播放 | 久久久av男人的天堂 | 欧美自拍另类欧美综合图片区 | 国产亚洲人成在线播放 | 一本久久a久久精品亚洲 | 国产高清av在线播放 | 国产疯狂伦交大片 | 欧美 丝袜 自拍 制服 另类 | 日韩无套无码精品 | 精品偷自拍另类在线观看 | 乌克兰少妇性做爰 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产综合色产在线精品 | 夫妻免费无码v看片 | 欧美黑人乱大交 | 国内精品久久久久久中文字幕 | 久久精品国产99精品亚洲 | 美女极度色诱视频国产 | 国产特级毛片aaaaaaa高清 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 四虎4hu永久免费 | 免费观看的无遮挡av | a在线观看免费网站大全 | 久久精品人妻少妇一区二区三区 | 人妻少妇精品无码专区动漫 | 女人被男人爽到呻吟的视频 | 国产成人精品久久亚洲高清不卡 | 精品少妇爆乳无码av无码专区 | 成人一区二区免费视频 | 中文字幕乱码亚洲无线三区 | 亚洲乱码国产乱码精品精 | 亚洲性无码av中文字幕 | 成人无码视频免费播放 | 日韩欧美群交p片內射中文 | 无码帝国www无码专区色综合 | 激情亚洲一区国产精品 | 国产精品无码一区二区三区不卡 | 日本丰满熟妇videos | 九九久久精品国产免费看小说 | 一本色道婷婷久久欧美 | 国产黑色丝袜在线播放 | 99久久久国产精品无码免费 | 水蜜桃色314在线观看 | 秋霞特色aa大片 | 狠狠色噜噜狠狠狠狠7777米奇 | 日韩少妇内射免费播放 | 天下第一社区视频www日本 | 伊人久久大香线蕉亚洲 | 亚洲精品成人福利网站 | 欧美性猛交xxxx富婆 | 久久亚洲精品中文字幕无男同 | 欧美猛少妇色xxxxx | 夜夜高潮次次欢爽av女 | 免费无码av一区二区 | 熟妇人妻中文av无码 | 国内揄拍国内精品少妇国语 | 国产人妻精品一区二区三区不卡 | 在线成人www免费观看视频 | 67194成是人免费无码 | 内射白嫩少妇超碰 | 天天躁日日躁狠狠躁免费麻豆 | 西西人体www44rt大胆高清 | 亚洲精品国产精品乱码视色 | 亚洲春色在线视频 | 国产亚洲日韩欧美另类第八页 | 免费网站看v片在线18禁无码 | 国产做国产爱免费视频 | 欧美精品免费观看二区 | 欧美变态另类xxxx | 熟妇人妻无乱码中文字幕 | 久久亚洲精品中文字幕无男同 | 国产高潮视频在线观看 | 国产明星裸体无码xxxx视频 | 亚拍精品一区二区三区探花 | 人人爽人人澡人人人妻 | 亚洲精品中文字幕久久久久 | 亚洲区欧美区综合区自拍区 | 久久精品视频在线看15 | 色一情一乱一伦一区二区三欧美 | 国产在线无码精品电影网 | 国产一区二区三区精品视频 | 131美女爱做视频 | 少妇高潮一区二区三区99 | 色综合天天综合狠狠爱 | 午夜福利一区二区三区在线观看 | 中文字幕无码av激情不卡 | 女人被爽到呻吟gif动态图视看 | 久久久久se色偷偷亚洲精品av | 双乳奶水饱满少妇呻吟 | 波多野结衣一区二区三区av免费 | 国产精品久久久av久久久 | 国产超碰人人爽人人做人人添 | 中国大陆精品视频xxxx | 亚洲中文字幕av在天堂 | 亚洲色偷偷偷综合网 | 精品人妻av区 | 玩弄人妻少妇500系列视频 | 午夜熟女插插xx免费视频 | 亚洲天堂2017无码 | 99麻豆久久久国产精品免费 | 日本丰满护士爆乳xxxx | 亚洲一区二区三区播放 | 无码精品国产va在线观看dvd | 日韩精品一区二区av在线 | 天堂无码人妻精品一区二区三区 | 网友自拍区视频精品 | 精品久久久无码中文字幕 | 人妻无码久久精品人妻 | 99久久婷婷国产综合精品青草免费 | 99久久精品国产一区二区蜜芽 | 国产莉萝无码av在线播放 | 国产99久久精品一区二区 | 澳门永久av免费网站 | 十八禁真人啪啪免费网站 | 18无码粉嫩小泬无套在线观看 | 奇米影视7777久久精品人人爽 | 熟妇人妻激情偷爽文 | 中文字幕无码免费久久99 | 色婷婷香蕉在线一区二区 | 久久熟妇人妻午夜寂寞影院 | 在线观看免费人成视频 | 精品国产一区二区三区四区 | 高潮毛片无遮挡高清免费 | 性欧美videos高清精品 | 国产成人无码av片在线观看不卡 | 无码av岛国片在线播放 | 蜜桃av抽搐高潮一区二区 | 四十如虎的丰满熟妇啪啪 | 国产亚洲视频中文字幕97精品 | 成年美女黄网站色大免费视频 | 国产真实乱对白精彩久久 | 色欲久久久天天天综合网精品 | 国产成人午夜福利在线播放 | 免费播放一区二区三区 | 亚洲精品一区二区三区婷婷月 | 2020久久香蕉国产线看观看 | 久精品国产欧美亚洲色aⅴ大片 | ass日本丰满熟妇pics | 牲欲强的熟妇农村老妇女视频 | 亚洲综合无码久久精品综合 | 国内丰满熟女出轨videos | 亚拍精品一区二区三区探花 | 亚洲欧洲日本综合aⅴ在线 | 国产超级va在线观看视频 | 亚洲中文字幕在线观看 | 老子影院午夜伦不卡 | 久久精品视频在线看15 | 亚洲色欲色欲欲www在线 | 成人女人看片免费视频放人 | av无码不卡在线观看免费 | 欧美老妇交乱视频在线观看 | 精品国产aⅴ无码一区二区 | 久久精品国产亚洲精品 | 亚洲一区av无码专区在线观看 | 人人妻人人藻人人爽欧美一区 | 伦伦影院午夜理论片 | yw尤物av无码国产在线观看 | 亚洲人成网站免费播放 | 丰满诱人的人妻3 | 国产精品久久久久无码av色戒 | 国语自产偷拍精品视频偷 | 2020久久超碰国产精品最新 | 中文字幕日韩精品一区二区三区 | 欧美人妻一区二区三区 | 欧洲vodafone精品性 | 亚洲gv猛男gv无码男同 | 野狼第一精品社区 | 特黄特色大片免费播放器图片 | 国产真实乱对白精彩久久 | 日本在线高清不卡免费播放 | 内射老妇bbwx0c0ck | 一区二区三区高清视频一 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 人人澡人摸人人添 | 国产人成高清在线视频99最全资源 | 无码人妻av免费一区二区三区 | 永久免费精品精品永久-夜色 | 四虎影视成人永久免费观看视频 | 呦交小u女精品视频 | www成人国产高清内射 | 永久免费观看国产裸体美女 | 久久人人爽人人爽人人片av高清 | 国产精品久久精品三级 | 亚洲精品成a人在线观看 | 亚洲 a v无 码免 费 成 人 a v | 97色伦图片97综合影院 | 内射后入在线观看一区 | 日本一区二区三区免费播放 | 激情人妻另类人妻伦 | 婷婷五月综合缴情在线视频 | 国产精品永久免费视频 | 成人动漫在线观看 | 国产成人综合美国十次 | 国产成人一区二区三区别 | 日本高清一区免费中文视频 | 少妇无码av无码专区在线观看 | 国产农村妇女高潮大叫 | 欧美第一黄网免费网站 | 日本一卡2卡3卡四卡精品网站 | 桃花色综合影院 | 成人女人看片免费视频放人 | 国产精品igao视频网 | 欧美35页视频在线观看 | 国产精品久久久久久久影院 | 日本免费一区二区三区最新 | 5858s亚洲色大成网站www | 人妻中文无码久热丝袜 | 亚洲熟妇色xxxxx欧美老妇 | 国产熟妇高潮叫床视频播放 | 高清国产亚洲精品自在久久 | 精品午夜福利在线观看 | 日本一区二区三区免费播放 | 成人精品一区二区三区中文字幕 | 午夜丰满少妇性开放视频 | 麻豆av传媒蜜桃天美传媒 | 亚洲成av人片在线观看无码不卡 | 天天av天天av天天透 | 国产在线一区二区三区四区五区 | 国产精品内射视频免费 | 久久成人a毛片免费观看网站 | 国产乱人伦偷精品视频 | 麻豆人妻少妇精品无码专区 | 久久精品国产日本波多野结衣 | 98国产精品综合一区二区三区 | 成人免费视频视频在线观看 免费 | 欧洲美熟女乱又伦 | 久久午夜无码鲁丝片秋霞 | 无码av中文字幕免费放 | 99久久无码一区人妻 | 国内揄拍国内精品少妇国语 | 中文字幕人妻丝袜二区 | 夜夜影院未满十八勿进 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲 高清 成人 动漫 | 亚洲国产高清在线观看视频 | 亚洲一区二区三区偷拍女厕 | 人人妻人人澡人人爽欧美一区九九 | 国产成人无码av一区二区 | 在线a亚洲视频播放在线观看 | 伦伦影院午夜理论片 | 婷婷综合久久中文字幕蜜桃三电影 | 天干天干啦夜天干天2017 | 十八禁真人啪啪免费网站 | 中文字幕av日韩精品一区二区 | 成人一区二区免费视频 | 荡女精品导航 | 成人无码精品一区二区三区 | 久久亚洲精品成人无码 | 成人免费视频视频在线观看 免费 | 最近免费中文字幕中文高清百度 | 欧美喷潮久久久xxxxx | 99视频精品全部免费免费观看 | 国产成人一区二区三区别 | 少妇高潮喷潮久久久影院 | 天天躁夜夜躁狠狠是什么心态 | 久久久久亚洲精品男人的天堂 | 欧美喷潮久久久xxxxx | 搡女人真爽免费视频大全 | 日韩精品无码一本二本三本色 | 未满小14洗澡无码视频网站 | 久久人人爽人人爽人人片av高清 | 人妻体内射精一区二区三四 | 自拍偷自拍亚洲精品10p | 久久久国产精品无码免费专区 | 色一情一乱一伦一区二区三欧美 | 亚洲国产成人a精品不卡在线 | 激情内射日本一区二区三区 | 国产麻豆精品精东影业av网站 | 一本精品99久久精品77 | 国产激情艳情在线看视频 | 18精品久久久无码午夜福利 | 日本肉体xxxx裸交 | 国产亚洲精品久久久久久久久动漫 | 日韩亚洲欧美精品综合 | 久久人妻内射无码一区三区 | 日欧一片内射va在线影院 | 欧美性猛交内射兽交老熟妇 | а√天堂www在线天堂小说 | 99久久人妻精品免费二区 | 亚洲熟妇自偷自拍另类 | 欧美真人作爱免费视频 | 国产亚洲精品久久久久久久 | 熟女少妇人妻中文字幕 | 国产成人久久精品流白浆 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 秋霞特色aa大片 | 国产偷自视频区视频 | 天下第一社区视频www日本 | 国产精品亚洲一区二区三区喷水 | 久久久婷婷五月亚洲97号色 | 综合激情五月综合激情五月激情1 | 久久久久成人精品免费播放动漫 | 国产精品久久精品三级 | v一区无码内射国产 | 欧美怡红院免费全部视频 | 欧洲精品码一区二区三区免费看 | 国产精品-区区久久久狼 | 久久国产精品精品国产色婷婷 | 少妇一晚三次一区二区三区 | 黑人大群体交免费视频 | 国产精品18久久久久久麻辣 | 人妻夜夜爽天天爽三区 | 天天av天天av天天透 | 在线欧美精品一区二区三区 | 老司机亚洲精品影院无码 | 强开小婷嫩苞又嫩又紧视频 | 3d动漫精品啪啪一区二区中 | 无码人妻久久一区二区三区不卡 | 国产黄在线观看免费观看不卡 | 粉嫩少妇内射浓精videos | 色诱久久久久综合网ywww | 色一情一乱一伦一视频免费看 | 国产一区二区三区影院 | 熟妇人妻无乱码中文字幕 | a片在线免费观看 | 99久久亚洲精品无码毛片 | 无码人妻出轨黑人中文字幕 | 天天摸天天透天天添 | 呦交小u女精品视频 | 国产亲子乱弄免费视频 | 老熟妇仑乱视频一区二区 | 国产做国产爱免费视频 | 俺去俺来也在线www色官网 | 久久久久久久久888 | 99久久精品日本一区二区免费 | 久久久久成人片免费观看蜜芽 | 国产亚洲日韩欧美另类第八页 | 97久久超碰中文字幕 | 国产麻豆精品一区二区三区v视界 | 图片区 小说区 区 亚洲五月 | 亚洲区小说区激情区图片区 | 精品日本一区二区三区在线观看 | 精品人妻av区 | 成人片黄网站色大片免费观看 | 亚欧洲精品在线视频免费观看 | 三级4级全黄60分钟 | 亚洲精品午夜国产va久久成人 | 久久久久久久人妻无码中文字幕爆 | 99视频精品全部免费免费观看 | 男人扒开女人内裤强吻桶进去 | 天天拍夜夜添久久精品 | 性欧美牲交在线视频 | 色偷偷人人澡人人爽人人模 | 免费无码av一区二区 | 女人被爽到呻吟gif动态图视看 | 亚洲精品国偷拍自产在线麻豆 | 国产色xx群视频射精 | 国产精品亚洲一区二区三区喷水 | 日韩欧美群交p片內射中文 | 日日摸天天摸爽爽狠狠97 | 中文字幕精品av一区二区五区 | 亚洲精品美女久久久久久久 | 亚洲国产午夜精品理论片 | 97se亚洲精品一区 | 久精品国产欧美亚洲色aⅴ大片 | 99久久婷婷国产综合精品青草免费 | 蜜桃无码一区二区三区 | 在线播放免费人成毛片乱码 | 日本丰满护士爆乳xxxx | 亚洲热妇无码av在线播放 | 欧美35页视频在线观看 | 婷婷六月久久综合丁香 | 国产亚洲精品久久久久久久久动漫 | 亚洲精品一区二区三区大桥未久 | 黑人巨大精品欧美黑寡妇 | 欧美黑人巨大xxxxx | 国产精品自产拍在线观看 | 老熟妇仑乱视频一区二区 | 亚洲日韩av一区二区三区四区 | 国产人妻人伦精品 | 97久久超碰中文字幕 | 免费看少妇作爱视频 | 2020久久香蕉国产线看观看 | 亚洲中文字幕无码中文字在线 | 亚洲成a人一区二区三区 | 国产97色在线 | 免 | 国产精品办公室沙发 | 少妇被粗大的猛进出69影院 | 中文字幕+乱码+中文字幕一区 | 天天av天天av天天透 | 天堂а√在线地址中文在线 | 国产成人综合色在线观看网站 | 精品无码一区二区三区的天堂 | 全黄性性激高免费视频 | 漂亮人妻洗澡被公强 日日躁 | 亚洲一区二区三区国产精华液 | 国产精品无码一区二区三区不卡 | 伊人久久大香线蕉av一区二区 | 日本一区二区三区免费播放 | 成人免费无码大片a毛片 | 欧美人与禽zoz0性伦交 | 久久99国产综合精品 | 搡女人真爽免费视频大全 | 水蜜桃av无码 | 欧美肥老太牲交大战 | av无码久久久久不卡免费网站 | 大地资源中文第3页 | 天海翼激烈高潮到腰振不止 | 国产又粗又硬又大爽黄老大爷视 | 四虎国产精品一区二区 | 久久久无码中文字幕久... | 久久久国产精品无码免费专区 | 国产69精品久久久久app下载 | 大地资源中文第3页 | 日本欧美一区二区三区乱码 | 国产成人无码区免费内射一片色欲 | 亚洲热妇无码av在线播放 | 午夜精品久久久久久久久 | 在线看片无码永久免费视频 | 精品夜夜澡人妻无码av蜜桃 | 啦啦啦www在线观看免费视频 | 亚洲一区二区三区在线观看网站 | 97久久国产亚洲精品超碰热 | 国产亚洲精品久久久久久国模美 | av无码电影一区二区三区 | 激情爆乳一区二区三区 | 亚洲呦女专区 | 国产电影无码午夜在线播放 | 亚洲大尺度无码无码专区 | 99久久亚洲精品无码毛片 | 熟妇女人妻丰满少妇中文字幕 | 精品久久8x国产免费观看 | 欧美一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 最新国产乱人伦偷精品免费网站 | 天天摸天天碰天天添 | 亚洲精品鲁一鲁一区二区三区 | 日欧一片内射va在线影院 | 亚洲精品一区三区三区在线观看 | 激情国产av做激情国产爱 | 欧美阿v高清资源不卡在线播放 | 国产肉丝袜在线观看 | 曰韩少妇内射免费播放 | 精品国产一区二区三区av 性色 | 午夜精品久久久久久久 | 无码吃奶揉捏奶头高潮视频 | 国产黄在线观看免费观看不卡 | 曰韩无码二三区中文字幕 | 国内综合精品午夜久久资源 | 午夜免费福利小电影 | 免费人成网站视频在线观看 | 成人免费无码大片a毛片 | 人妻天天爽夜夜爽一区二区 | 欧美人与牲动交xxxx | 亚洲自偷自拍另类第1页 | 色一情一乱一伦一视频免费看 | 天堂亚洲免费视频 | 精品偷自拍另类在线观看 | 丰满少妇人妻久久久久久 | 天天综合网天天综合色 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲一区二区三区 | 国内丰满熟女出轨videos | 国产肉丝袜在线观看 | 欧美激情一区二区三区成人 | 久久亚洲中文字幕精品一区 | 香蕉久久久久久av成人 | 人人妻人人澡人人爽精品欧美 | 欧美性生交活xxxxxdddd | 成人免费视频在线观看 | 国产精品无码成人午夜电影 | 奇米影视7777久久精品 | 日本高清一区免费中文视频 | 久久99精品久久久久久 | 人人澡人人透人人爽 | 久久久精品国产sm最大网站 | 一区二区三区乱码在线 | 欧洲 | 午夜精品久久久久久久久 | 中国女人内谢69xxxx | 四虎国产精品免费久久 | 国内精品一区二区三区不卡 | 中文无码伦av中文字幕 | 久久综合给久久狠狠97色 | 日韩欧美成人免费观看 | 理论片87福利理论电影 | 天天做天天爱天天爽综合网 | 国产亚洲日韩欧美另类第八页 | а√天堂www在线天堂小说 | 人妻无码αv中文字幕久久琪琪布 | 亚洲成av人在线观看网址 | 日韩精品a片一区二区三区妖精 | 成 人影片 免费观看 | 亚洲成熟女人毛毛耸耸多 | 小鲜肉自慰网站xnxx | 蜜臀av在线播放 久久综合激激的五月天 | 四虎国产精品免费久久 | 日本一区二区三区免费高清 | 大屁股大乳丰满人妻 | 精品乱子伦一区二区三区 | 亚洲国产精品一区二区第一页 | 宝宝好涨水快流出来免费视频 | 久久久久免费看成人影片 | 国产欧美熟妇另类久久久 | 四虎4hu永久免费 | 国产精品igao视频网 | 18禁黄网站男男禁片免费观看 | 四十如虎的丰满熟妇啪啪 | 国内丰满熟女出轨videos | 国产成人无码午夜视频在线观看 | 亚洲精品成人av在线 | 国产亚洲精品久久久久久 | 亚洲最大成人网站 | 欧美日韩亚洲国产精品 | 国精品人妻无码一区二区三区蜜柚 | 高潮毛片无遮挡高清免费视频 | 特大黑人娇小亚洲女 | 免费国产黄网站在线观看 | 欧美黑人性暴力猛交喷水 | 亚洲无人区一区二区三区 | 粗大的内捧猛烈进出视频 | aⅴ亚洲 日韩 色 图网站 播放 | 午夜丰满少妇性开放视频 | 装睡被陌生人摸出水好爽 | 性色欲情网站iwww九文堂 | 久久久久se色偷偷亚洲精品av | 乱中年女人伦av三区 | 精品久久久无码中文字幕 | 色欲人妻aaaaaaa无码 | 国产av剧情md精品麻豆 | 国内精品久久毛片一区二区 | 131美女爱做视频 | 乱人伦人妻中文字幕无码久久网 | 国产精品手机免费 | 国产精品香蕉在线观看 | 扒开双腿吃奶呻吟做受视频 | 久久久久久亚洲精品a片成人 | 成人亚洲精品久久久久 | 亲嘴扒胸摸屁股激烈网站 | 亚洲成av人在线观看网址 | 亚洲精品综合五月久久小说 | 久久久精品456亚洲影院 | 天堂久久天堂av色综合 | 国产精品人人爽人人做我的可爱 | 国产人妻精品一区二区三区 | 免费中文字幕日韩欧美 | 丁香花在线影院观看在线播放 | 99精品国产综合久久久久五月天 | 国产精品美女久久久网av | 国产激情综合五月久久 | 久久zyz资源站无码中文动漫 | 噜噜噜亚洲色成人网站 | 久9re热视频这里只有精品 | 97精品人妻一区二区三区香蕉 | 亚洲色无码一区二区三区 | 色狠狠av一区二区三区 | 人人妻人人澡人人爽欧美一区 | 久久久久se色偷偷亚洲精品av | 欧美丰满熟妇xxxx性ppx人交 | 综合激情五月综合激情五月激情1 | 欧美日韩一区二区综合 | 日本一本二本三区免费 | 色综合久久久无码中文字幕 | 免费无码午夜福利片69 | 免费无码的av片在线观看 | 成人无码精品一区二区三区 | 午夜嘿嘿嘿影院 | 美女毛片一区二区三区四区 | 亚洲熟妇色xxxxx亚洲 | 国产麻豆精品一区二区三区v视界 | a国产一区二区免费入口 | 国产深夜福利视频在线 | 国产精品高潮呻吟av久久 | 国产婷婷色一区二区三区在线 | 日本高清一区免费中文视频 | 成 人影片 免费观看 | 国产激情无码一区二区 | 丰满少妇高潮惨叫视频 | 欧美性猛交内射兽交老熟妇 | 日韩人妻无码中文字幕视频 | 国语精品一区二区三区 | 伊人久久大香线蕉av一区二区 | 中文字幕人妻丝袜二区 | 久久久久久亚洲精品a片成人 | 久久国产精品二国产精品 | 国产区女主播在线观看 | 国产亚洲视频中文字幕97精品 | 中文字幕无码日韩专区 | 欧美老妇交乱视频在线观看 | 成 人 免费观看网站 | 毛片内射-百度 | 少妇性l交大片欧洲热妇乱xxx | 老熟妇乱子伦牲交视频 | а√资源新版在线天堂 | 日日橹狠狠爱欧美视频 | 亚洲欧洲无卡二区视頻 | 男女下面进入的视频免费午夜 | 亚洲精品午夜无码电影网 | 成人免费视频一区二区 | 一本久道久久综合婷婷五月 | 人人超人人超碰超国产 | 亚洲精品国产精品乱码不卡 | 熟女少妇在线视频播放 | 日本一区二区三区免费高清 | 国产真实伦对白全集 | 久久久av男人的天堂 | 内射欧美老妇wbb | 在线观看免费人成视频 | a片免费视频在线观看 | 亚洲午夜福利在线观看 | 美女扒开屁股让男人桶 | 强开小婷嫩苞又嫩又紧视频 | 国产精品美女久久久网av | 国产乡下妇女做爰 | 在教室伦流澡到高潮hnp视频 | 丰满少妇弄高潮了www | 大地资源中文第3页 | 美女扒开屁股让男人桶 | 国产国语老龄妇女a片 | 在线观看欧美一区二区三区 | 特黄特色大片免费播放器图片 | 蜜桃臀无码内射一区二区三区 | 野狼第一精品社区 | 免费观看的无遮挡av | 大乳丰满人妻中文字幕日本 | 日韩人妻无码一区二区三区久久99 | 牲欲强的熟妇农村老妇女视频 | 亚洲理论电影在线观看 | 日本丰满护士爆乳xxxx | 国产精品无码成人午夜电影 | 99麻豆久久久国产精品免费 | 亚洲欧美日韩国产精品一区二区 | 天堂一区人妻无码 | 久久亚洲国产成人精品性色 | 在线天堂新版最新版在线8 | 欧美日韩色另类综合 | 亚洲乱码日产精品bd | 99久久无码一区人妻 | 国产女主播喷水视频在线观看 | 久久久中文久久久无码 | 少妇人妻偷人精品无码视频 | 国产激情无码一区二区app | 亚洲色大成网站www | 无码人妻精品一区二区三区不卡 | 曰韩少妇内射免费播放 | 国产精品美女久久久久av爽李琼 | 青春草在线视频免费观看 | 精品一区二区三区波多野结衣 | 国产av久久久久精东av | 国产超碰人人爽人人做人人添 | 3d动漫精品啪啪一区二区中 | 亚洲精品一区三区三区在线观看 | 国产精品久久久久7777 | v一区无码内射国产 | 亚洲中文字幕无码一久久区 | 国内揄拍国内精品少妇国语 | 欧美乱妇无乱码大黄a片 | 色欲av亚洲一区无码少妇 | 国产无遮挡又黄又爽免费视频 | 日本免费一区二区三区最新 | 日本高清一区免费中文视频 | 午夜精品一区二区三区在线观看 | 国产电影无码午夜在线播放 | 天堂亚洲免费视频 | 亚洲精品午夜无码电影网 | 成人一在线视频日韩国产 | 国产亚洲精品久久久ai换 | 国产两女互慰高潮视频在线观看 | 亚洲精品一区二区三区大桥未久 | 人人超人人超碰超国产 | 亚洲精品中文字幕 | 又色又爽又黄的美女裸体网站 | 午夜嘿嘿嘿影院 | 性欧美疯狂xxxxbbbb | 台湾无码一区二区 | 东北女人啪啪对白 | 欧美日韩一区二区三区自拍 | 人人妻人人澡人人爽人人精品浪潮 | 国产亚洲精品久久久久久国模美 | 亚洲区欧美区综合区自拍区 | 国产色精品久久人妻 | 少妇被粗大的猛进出69影院 | 男女下面进入的视频免费午夜 | 中文无码伦av中文字幕 | 亚洲一区二区三区无码久久 | 清纯唯美经典一区二区 | 狠狠色色综合网站 | 国产精品办公室沙发 | 国内精品九九久久久精品 | 久久午夜无码鲁丝片秋霞 | 国语自产偷拍精品视频偷 | 国语自产偷拍精品视频偷 | 精品久久久中文字幕人妻 | 波多野结衣高清一区二区三区 | 国产绳艺sm调教室论坛 | 亚洲色www成人永久网址 | 日本熟妇浓毛 | 无码毛片视频一区二区本码 | 日本xxxx色视频在线观看免费 | 亚洲国产精品美女久久久久 | 久久无码中文字幕免费影院蜜桃 | a片在线免费观看 | 亚洲国产高清在线观看视频 | 亚洲精品国偷拍自产在线麻豆 | 精品无人国产偷自产在线 | 亚洲日韩av一区二区三区四区 | 久久午夜无码鲁丝片 | 国产精品无码mv在线观看 | 亚洲精品国产精品乱码视色 | 国产亲子乱弄免费视频 | 中文字幕+乱码+中文字幕一区 | 在线视频网站www色 | 全黄性性激高免费视频 | 久久伊人色av天堂九九小黄鸭 | 国产农村妇女高潮大叫 | 丝袜 中出 制服 人妻 美腿 | 日本高清一区免费中文视频 | 青青青爽视频在线观看 | 野外少妇愉情中文字幕 | 欧美人与善在线com | 久久久久久九九精品久 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品一区二区三区在线 | 久久精品无码一区二区三区 | 国产办公室秘书无码精品99 | 国产艳妇av在线观看果冻传媒 | 东京热无码av男人的天堂 | 帮老师解开蕾丝奶罩吸乳网站 | 色诱久久久久综合网ywww | 亚洲熟妇自偷自拍另类 | 日本爽爽爽爽爽爽在线观看免 | 久久婷婷五月综合色国产香蕉 | 亚洲综合在线一区二区三区 | 精品成在人线av无码免费看 | 亚洲小说图区综合在线 | 亚洲男人av香蕉爽爽爽爽 | 亚洲精品一区国产 | 亚洲啪av永久无码精品放毛片 | 亚洲中文无码av永久不收费 | 婷婷六月久久综合丁香 | 亚洲色欲久久久综合网东京热 | 妺妺窝人体色www在线小说 | 久久久久国色av免费观看性色 | 日韩av无码中文无码电影 | 5858s亚洲色大成网站www | 久久久久免费精品国产 | 人妻无码αv中文字幕久久琪琪布 | 内射爽无广熟女亚洲 | 国产熟妇高潮叫床视频播放 | 丰满护士巨好爽好大乳 | 无码人妻丰满熟妇区五十路百度 | 婷婷丁香六月激情综合啪 | 日本爽爽爽爽爽爽在线观看免 | 少妇高潮一区二区三区99 | 午夜精品一区二区三区在线观看 | 日本一区二区更新不卡 | 99国产欧美久久久精品 | 久久午夜无码鲁丝片午夜精品 | 偷窥日本少妇撒尿chinese | 日本精品人妻无码免费大全 | 欧美肥老太牲交大战 | 亚洲国精产品一二二线 | 久久久中文字幕日本无吗 | 人人妻人人澡人人爽人人精品浪潮 | 国产精品久久久av久久久 | 国产又粗又硬又大爽黄老大爷视 | 熟妇人妻无乱码中文字幕 | 亚洲第一网站男人都懂 | 婷婷丁香五月天综合东京热 | 国产乱子伦视频在线播放 | 精品一区二区不卡无码av | 亚洲中文字幕在线无码一区二区 | 中文字幕 人妻熟女 | 国内精品人妻无码久久久影院蜜桃 | 日韩精品无码免费一区二区三区 | 国产精品a成v人在线播放 | 亚拍精品一区二区三区探花 | 性啪啪chinese东北女人 | 露脸叫床粗话东北少妇 | √天堂资源地址中文在线 | 国产成人av免费观看 | 水蜜桃av无码 | 熟妇人妻无码xxx视频 | 欧美精品在线观看 | 狂野欧美激情性xxxx | 色欲人妻aaaaaaa无码 | 又大又黄又粗又爽的免费视频 | 乱人伦人妻中文字幕无码久久网 | 亚洲精品国产第一综合99久久 | 欧美阿v高清资源不卡在线播放 | 亚洲中文字幕无码一久久区 | 欧美性色19p | 亚洲精品国产第一综合99久久 | 亚洲欧美精品aaaaaa片 | 日本护士xxxxhd少妇 | 中文字幕无码人妻少妇免费 | 久久久久久av无码免费看大片 | 日本高清一区免费中文视频 | 日本www一道久久久免费榴莲 | 亚洲国产精品无码久久久久高潮 | 无码一区二区三区在线 | 成人片黄网站色大片免费观看 | 精品国产精品久久一区免费式 | 国产精品国产自线拍免费软件 | 亚洲成色在线综合网站 | 波多野结衣av在线观看 | 亚洲中文字幕在线观看 | 在线а√天堂中文官网 | 久久久久亚洲精品中文字幕 | 欧美日韩在线亚洲综合国产人 | 亚洲熟悉妇女xxx妇女av | 日韩人妻无码一区二区三区久久99 | 97精品人妻一区二区三区香蕉 | 久久久久se色偷偷亚洲精品av | 樱花草在线社区www | 国产成人人人97超碰超爽8 | 欧美日韩一区二区免费视频 | 免费人成在线观看网站 | 日本一区二区三区免费播放 | 欧洲熟妇精品视频 | 色噜噜亚洲男人的天堂 | 青青青爽视频在线观看 | 国产精品人人爽人人做我的可爱 | 成人试看120秒体验区 | 国产真实乱对白精彩久久 | 18精品久久久无码午夜福利 | 天天拍夜夜添久久精品 | 国内少妇偷人精品视频免费 | 欧美 亚洲 国产 另类 | 久久精品女人天堂av免费观看 | 国产激情一区二区三区 | 夜精品a片一区二区三区无码白浆 | 国产肉丝袜在线观看 | 国产精品福利视频导航 | 爽爽影院免费观看 | 久久综合激激的五月天 | 亚洲日韩一区二区 | 亚洲中文字幕va福利 | 丰满少妇女裸体bbw | 香蕉久久久久久av成人 | 久久精品中文字幕一区 | 蜜桃视频插满18在线观看 | 成人精品天堂一区二区三区 | 中文字幕日产无线码一区 | 亚洲精品国产第一综合99久久 | 学生妹亚洲一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人一区二区三区别 | 国产网红无码精品视频 | 久久久久久a亚洲欧洲av冫 | 东京热一精品无码av | 欧美性黑人极品hd | 国产日产欧产精品精品app | 亚洲另类伦春色综合小说 | 亚洲乱码日产精品bd | 亚洲国产欧美在线成人 | 国产精品福利视频导航 | 大地资源网第二页免费观看 | 中文久久乱码一区二区 | 亚洲人交乣女bbw | 国内精品人妻无码久久久影院蜜桃 | 玩弄少妇高潮ⅹxxxyw | 丰腴饱满的极品熟妇 | 日韩精品无码一本二本三本色 | 国产亚洲视频中文字幕97精品 | 国产超碰人人爽人人做人人添 | 我要看www免费看插插视频 | 国产精品亚洲一区二区三区喷水 | 欧美激情一区二区三区成人 | 97资源共享在线视频 | 亚洲自偷自偷在线制服 | 国产亚洲精品久久久久久大师 | 日韩欧美成人免费观看 | 欧美真人作爱免费视频 | 丝袜美腿亚洲一区二区 | 亚洲中文字幕无码一久久区 | 久久精品丝袜高跟鞋 | av在线亚洲欧洲日产一区二区 | 永久免费观看国产裸体美女 | 国产国产精品人在线视 | 四虎影视成人永久免费观看视频 | 黑人玩弄人妻中文在线 | 国产成人综合在线女婷五月99播放 | 色婷婷香蕉在线一区二区 | 乱人伦人妻中文字幕无码久久网 | 亚洲国产欧美在线成人 | 丰满人妻被黑人猛烈进入 | 任你躁在线精品免费 | 免费无码肉片在线观看 | 一本久道久久综合狠狠爱 | 一个人看的www免费视频在线观看 | аⅴ资源天堂资源库在线 | 男女下面进入的视频免费午夜 | 综合人妻久久一区二区精品 | 亚洲一区二区三区偷拍女厕 | 国产精品资源一区二区 | 成人亚洲精品久久久久 | 欧美性生交活xxxxxdddd | 日本精品人妻无码免费大全 | 欧美freesex黑人又粗又大 | 丰满妇女强制高潮18xxxx | 少妇高潮一区二区三区99 | 色综合久久久久综合一本到桃花网 | 亚洲精品中文字幕 | 欧美日本精品一区二区三区 | 日本精品少妇一区二区三区 | 国产成人无码一二三区视频 | 国产乱人伦偷精品视频 | 天天躁夜夜躁狠狠是什么心态 | 乱码av麻豆丝袜熟女系列 | 久久99精品国产麻豆蜜芽 | 日欧一片内射va在线影院 | 精品亚洲韩国一区二区三区 | 日日摸日日碰夜夜爽av | 性生交片免费无码看人 | 牲欲强的熟妇农村老妇女视频 | 香港三级日本三级妇三级 | 自拍偷自拍亚洲精品10p | 亚洲国产精品无码一区二区三区 | 中国女人内谢69xxxxxa片 | 国产精品国产自线拍免费软件 | 成人亚洲精品久久久久 | 自拍偷自拍亚洲精品10p | 又湿又紧又大又爽a视频国产 | 性啪啪chinese东北女人 | 国产精品福利视频导航 | 国产综合在线观看 | 麻豆成人精品国产免费 | 国产特级毛片aaaaaa高潮流水 | 精品国产精品久久一区免费式 | 国产真人无遮挡作爱免费视频 | 双乳奶水饱满少妇呻吟 | 国产美女极度色诱视频www | 欧美阿v高清资源不卡在线播放 | 中文字幕人妻无码一区二区三区 | 国产精品无码成人午夜电影 | 无遮挡啪啪摇乳动态图 | 欧洲美熟女乱又伦 | 最新国产麻豆aⅴ精品无码 | 亚洲精品国产a久久久久久 | 国产97人人超碰caoprom | 亚洲欧洲中文日韩av乱码 | 久久精品国产日本波多野结衣 | 国产乱人伦偷精品视频 | 久久综合激激的五月天 | 无码人妻精品一区二区三区不卡 | 久久久久久九九精品久 | 国产精品第一区揄拍无码 | 亚洲热妇无码av在线播放 | 永久黄网站色视频免费直播 | 欧美三级a做爰在线观看 | 久久久久久九九精品久 | 欧美黑人巨大xxxxx | 婷婷六月久久综合丁香 | 小鲜肉自慰网站xnxx | 麻豆国产人妻欲求不满谁演的 | 人人妻在人人 | 久热国产vs视频在线观看 | 中文精品久久久久人妻不卡 | 熟女俱乐部五十路六十路av | 九月婷婷人人澡人人添人人爽 | 激情国产av做激情国产爱 | 日韩精品无码一区二区中文字幕 | 国产成人无码a区在线观看视频app | 久久亚洲国产成人精品性色 | 日韩欧美中文字幕在线三区 | 蜜桃无码一区二区三区 | 色欲av亚洲一区无码少妇 | 亚洲一区二区三区含羞草 | 中文无码伦av中文字幕 | 日本一卡二卡不卡视频查询 | 少妇人妻大乳在线视频 | 精品少妇爆乳无码av无码专区 | 亚洲毛片av日韩av无码 | 成在人线av无码免费 | 牲欲强的熟妇农村老妇女视频 | 国产精品igao视频网 | 中文字幕无码免费久久9一区9 | 青草青草久热国产精品 | 亚洲呦女专区 | 激情综合激情五月俺也去 | 国产午夜亚洲精品不卡 | 中文字幕人成乱码熟女app | 精品无人国产偷自产在线 | 久久久久亚洲精品中文字幕 | 国产又粗又硬又大爽黄老大爷视 | 丰满少妇弄高潮了www | 玩弄人妻少妇500系列视频 | 亚洲男人av香蕉爽爽爽爽 | 熟妇人妻激情偷爽文 | 无码人妻av免费一区二区三区 | 欧美激情综合亚洲一二区 | 中文字幕乱妇无码av在线 | 久久精品国产99精品亚洲 | 激情内射亚州一区二区三区爱妻 | 国产suv精品一区二区五 | 又大又硬又爽免费视频 | 青青青手机频在线观看 | 久久综合狠狠综合久久综合88 | 中国女人内谢69xxxx | 精品国产aⅴ无码一区二区 | 免费无码肉片在线观看 | 亚洲成av人片天堂网无码】 | 免费无码的av片在线观看 | 中文字幕av日韩精品一区二区 | 久久综合九色综合97网 | 天海翼激烈高潮到腰振不止 | 中文无码精品a∨在线观看不卡 | 国产无套内射久久久国产 | 日韩亚洲欧美精品综合 | 亚洲乱码日产精品bd | 午夜福利电影 | 国产成人综合在线女婷五月99播放 | 成人无码精品一区二区三区 | 色婷婷综合中文久久一本 | 狠狠色色综合网站 | 久久无码中文字幕免费影院蜜桃 | 日韩精品乱码av一区二区 | 少妇邻居内射在线 | 99久久精品日本一区二区免费 | 又色又爽又黄的美女裸体网站 | 久久精品99久久香蕉国产色戒 | 天堂久久天堂av色综合 | 精品水蜜桃久久久久久久 | 亚洲小说图区综合在线 | 成人免费视频一区二区 | 国产手机在线αⅴ片无码观看 | 日本一区二区更新不卡 | 欧洲熟妇色 欧美 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲最大成人网站 | 国产成人久久精品流白浆 | 成人一在线视频日韩国产 | 日本一区二区三区免费高清 | 午夜精品一区二区三区在线观看 | 兔费看少妇性l交大片免费 | 久久五月精品中文字幕 | 成人亚洲精品久久久久软件 | 丰满护士巨好爽好大乳 | 免费国产黄网站在线观看 | 成人性做爰aaa片免费看 | 99精品久久毛片a片 | 国产激情无码一区二区 | 中文字幕乱码人妻无码久久 | 亚洲中文字幕无码中字 | 婷婷色婷婷开心五月四房播播 | 久久综合香蕉国产蜜臀av | 色一情一乱一伦一视频免费看 | 无码国产激情在线观看 | 无套内谢的新婚少妇国语播放 | 成人影院yy111111在线观看 | 国产热a欧美热a在线视频 | 国产无遮挡又黄又爽又色 | 一个人看的视频www在线 | 久久天天躁夜夜躁狠狠 | 男女作爱免费网站 | 亚洲一区二区三区国产精华液 | 国产在线一区二区三区四区五区 | 国产精品美女久久久久av爽李琼 | 中文字幕无码乱人伦 | 精品久久久久香蕉网 | 国产av久久久久精东av | 亚洲成a人片在线观看日本 | 久久精品国产日本波多野结衣 | 中文字幕av伊人av无码av | 97色伦图片97综合影院 | 性史性农村dvd毛片 | 国产乱人无码伦av在线a | 午夜精品一区二区三区在线观看 | 久久综合久久自在自线精品自 | 18黄暴禁片在线观看 | 久久99久久99精品中文字幕 | 亚洲精品久久久久中文第一幕 | 久精品国产欧美亚洲色aⅴ大片 | 少妇愉情理伦片bd | av小次郎收藏 | 亚洲人成网站免费播放 | 亚无码乱人伦一区二区 | 日本一区二区更新不卡 | 精品久久久无码中文字幕 | 疯狂三人交性欧美 | 国产午夜精品一区二区三区嫩草 | 大肉大捧一进一出视频出来呀 | 免费观看黄网站 | 久久久久亚洲精品男人的天堂 | 国产无遮挡又黄又爽免费视频 | 99久久人妻精品免费一区 | 97夜夜澡人人双人人人喊 | 又粗又大又硬毛片免费看 | 成人av无码一区二区三区 | 国内精品一区二区三区不卡 | 日日摸日日碰夜夜爽av | 日韩少妇白浆无码系列 | 东京无码熟妇人妻av在线网址 | 亚洲 高清 成人 动漫 | 国产精品爱久久久久久久 | 色一情一乱一伦 | 丰满少妇女裸体bbw | 国产成人无码午夜视频在线观看 | 丰满人妻被黑人猛烈进入 | 国产亚洲视频中文字幕97精品 | 亚洲人亚洲人成电影网站色 | 好爽又高潮了毛片免费下载 | 少妇人妻av毛片在线看 | 99精品国产综合久久久久五月天 | 999久久久国产精品消防器材 | 欧美激情一区二区三区成人 | 3d动漫精品啪啪一区二区中 | 成人欧美一区二区三区黑人免费 | 国内精品九九久久久精品 | 欧美人与禽zoz0性伦交 | 国产乱码精品一品二品 | 激情内射日本一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 中文无码成人免费视频在线观看 | 伦伦影院午夜理论片 | 日本va欧美va欧美va精品 | 性开放的女人aaa片 | 无码国产乱人伦偷精品视频 | 国产极品视觉盛宴 | 国产精品香蕉在线观看 | 国产深夜福利视频在线 | 日本爽爽爽爽爽爽在线观看免 | 人人澡人人妻人人爽人人蜜桃 | 精品无人区无码乱码毛片国产 | 76少妇精品导航 | aa片在线观看视频在线播放 | 国内精品久久久久久中文字幕 | 成 人 网 站国产免费观看 | 久久久久99精品成人片 | 免费播放一区二区三区 | 久久 国产 尿 小便 嘘嘘 | 性欧美牲交xxxxx视频 | 久久精品国产大片免费观看 | 日本一卡二卡不卡视频查询 | 国产精品久久久久久久影院 | 亚洲国产日韩a在线播放 | 人人妻人人澡人人爽精品欧美 | 2020久久超碰国产精品最新 | 国产av人人夜夜澡人人爽麻豆 | 亚洲色欲久久久综合网东京热 | 国产成人综合美国十次 | 成在人线av无码免费 | 一本大道久久东京热无码av | 丰满少妇人妻久久久久久 | 动漫av网站免费观看 | 狂野欧美性猛交免费视频 | 婷婷丁香六月激情综合啪 | 麻豆精品国产精华精华液好用吗 | 99久久精品日本一区二区免费 | 久久午夜无码鲁丝片午夜精品 | 少妇高潮一区二区三区99 | 久久无码人妻影院 | 在线成人www免费观看视频 | 精品无人区无码乱码毛片国产 | 日韩成人一区二区三区在线观看 | 亚洲爆乳大丰满无码专区 | av香港经典三级级 在线 | 免费乱码人妻系列无码专区 | 性做久久久久久久久 | 国产亚洲人成a在线v网站 | 国产精品久久国产精品99 | 岛国片人妻三上悠亚 | a国产一区二区免费入口 | 亚洲人成网站色7799 | 日日麻批免费40分钟无码 | 色诱久久久久综合网ywww | 樱花草在线社区www | 55夜色66夜色国产精品视频 | 国产精品免费大片 | 久久久久久国产精品无码下载 | 人妻无码久久精品人妻 | 国产一精品一av一免费 | 99麻豆久久久国产精品免费 | 少妇性荡欲午夜性开放视频剧场 | 秋霞成人午夜鲁丝一区二区三区 | 少妇性俱乐部纵欲狂欢电影 | 日本精品人妻无码免费大全 | 少妇性俱乐部纵欲狂欢电影 | 国内丰满熟女出轨videos | 国产做国产爱免费视频 | 免费播放一区二区三区 | 日本一区二区更新不卡 | 精品无码国产一区二区三区av | 高清无码午夜福利视频 | 国产精品无码一区二区桃花视频 | 久久99精品久久久久久动态图 | 免费观看激色视频网站 | 亚洲精品成人av在线 | 国产精品爱久久久久久久 | 色婷婷综合激情综在线播放 | 国产麻豆精品精东影业av网站 | 男女作爱免费网站 | 中文字幕日韩精品一区二区三区 | 亚洲一区二区三区播放 | 亚洲精品久久久久avwww潮水 | 日本一区二区三区免费播放 | 老熟妇仑乱视频一区二区 | 欧美精品一区二区精品久久 | 精品偷自拍另类在线观看 | 久久久久99精品国产片 | 成人欧美一区二区三区黑人 | 久久综合色之久久综合 | 亚洲日韩一区二区三区 | 国产激情无码一区二区app | 清纯唯美经典一区二区 | 狠狠色噜噜狠狠狠狠7777米奇 | 色欲综合久久中文字幕网 | 色婷婷综合激情综在线播放 | 国产精品.xx视频.xxtv | 中文字幕无码乱人伦 | 啦啦啦www在线观看免费视频 | 国产一区二区三区四区五区加勒比 | a在线观看免费网站大全 | 荡女精品导航 | 无码免费一区二区三区 | 久久国产精品_国产精品 | 国产在线一区二区三区四区五区 | 国产成人无码av在线影院 | 在线观看欧美一区二区三区 | 一本加勒比波多野结衣 | 国产一区二区三区影院 | 永久免费观看国产裸体美女 | 国产激情无码一区二区 | 丝袜美腿亚洲一区二区 | 国产成人av免费观看 | www国产亚洲精品久久网站 | 色婷婷香蕉在线一区二区 | 无码任你躁久久久久久久 | 天天综合网天天综合色 | 麻豆av传媒蜜桃天美传媒 | 亚洲乱码中文字幕在线 | 久久久久久av无码免费看大片 | 国产精品资源一区二区 | 狠狠色噜噜狠狠狠7777奇米 | 色欲综合久久中文字幕网 | 中国大陆精品视频xxxx | 国产欧美熟妇另类久久久 | 永久免费观看国产裸体美女 | 色婷婷综合中文久久一本 | 国产日产欧产精品精品app | 欧美乱妇无乱码大黄a片 | 精品无码一区二区三区的天堂 | 久久久国产一区二区三区 | 久久综合香蕉国产蜜臀av | 午夜福利不卡在线视频 | 午夜丰满少妇性开放视频 | 成人性做爰aaa片免费看不忠 | 99精品久久毛片a片 | 亚洲娇小与黑人巨大交 | 少妇性荡欲午夜性开放视频剧场 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产成人精品必看 | 中文字幕色婷婷在线视频 | 国产激情无码一区二区 | 免费国产成人高清在线观看网站 | 日本大乳高潮视频在线观看 | 欧美激情一区二区三区成人 | 中文字幕无码热在线视频 | 国产人妻精品午夜福利免费 | 国产小呦泬泬99精品 | 性欧美牲交在线视频 | 免费观看激色视频网站 | 偷窥村妇洗澡毛毛多 | 特级做a爰片毛片免费69 | 成年美女黄网站色大免费视频 | 久久人人爽人人人人片 | 亚洲色欲色欲欲www在线 | 国内揄拍国内精品少妇国语 | 午夜精品久久久久久久久 | 色综合久久久久综合一本到桃花网 | 亚洲国产精品无码一区二区三区 | 久久久精品国产sm最大网站 | 国产精品18久久久久久麻辣 | 亚洲国产精品无码一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲热妇无码av在线播放 | 精品无码成人片一区二区98 | 亚洲精品一区二区三区大桥未久 | 欧美丰满老熟妇xxxxx性 | 久青草影院在线观看国产 | 欧洲美熟女乱又伦 | 一个人免费观看的www视频 | 亚洲人成网站在线播放942 | 精品人妻人人做人人爽夜夜爽 | 人人澡人人妻人人爽人人蜜桃 | 欧美日本免费一区二区三区 | 日韩 欧美 动漫 国产 制服 | 国产精品人人爽人人做我的可爱 | 亚洲国产成人av在线观看 | 久久这里只有精品视频9 | 国产成人精品一区二区在线小狼 | 日本一区二区三区免费高清 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲中文字幕av在天堂 | 精品一二三区久久aaa片 | 中文毛片无遮挡高清免费 | 日本精品人妻无码77777 天堂一区人妻无码 | 性开放的女人aaa片 | 国产精品美女久久久久av爽李琼 | 爽爽影院免费观看 | 水蜜桃色314在线观看 | 国产精华av午夜在线观看 | 国产成人午夜福利在线播放 | 欧美性生交xxxxx久久久 | www国产亚洲精品久久久日本 | 亚洲精品国产a久久久久久 | 午夜免费福利小电影 | 欧美人与善在线com | 婷婷综合久久中文字幕蜜桃三电影 | 国产av久久久久精东av | 欧美 日韩 人妻 高清 中文 | √天堂中文官网8在线 | 最新版天堂资源中文官网 | 日本一区二区更新不卡 | 亚洲国产精品无码久久久久高潮 | 人妻无码久久精品人妻 | 免费乱码人妻系列无码专区 | 久久精品成人欧美大片 | 中文毛片无遮挡高清免费 | 亚洲精品国产a久久久久久 | 亚洲爆乳无码专区 | 国产人妖乱国产精品人妖 | 亚洲色大成网站www国产 | 亚洲一区二区三区国产精华液 | 国产乱人伦偷精品视频 | 国产精品沙发午睡系列 | 日韩人妻无码一区二区三区久久99 | 黑森林福利视频导航 | 国产综合在线观看 | 人妻少妇精品视频专区 | 成人无码视频在线观看网站 | 国产精品亚洲专区无码不卡 | 97资源共享在线视频 | 99国产精品白浆在线观看免费 | 久久99精品国产.久久久久 | 99视频精品全部免费免费观看 | 亚洲综合久久一区二区 | 亚洲日本va午夜在线电影 | 久久五月精品中文字幕 | 内射巨臀欧美在线视频 | 精品国产av色一区二区深夜久久 | 人妻互换免费中文字幕 | 久久精品99久久香蕉国产色戒 | 久久久久久av无码免费看大片 | 久久精品人人做人人综合试看 | 日本一卡二卡不卡视频查询 | 日本一区二区三区免费播放 | 高中生自慰www网站 | 久久婷婷五月综合色国产香蕉 | 人人爽人人澡人人人妻 | 国产肉丝袜在线观看 | 大胆欧美熟妇xx | 久9re热视频这里只有精品 | 麻豆国产人妻欲求不满谁演的 | 久久久精品欧美一区二区免费 | 99久久99久久免费精品蜜桃 | 一本久久a久久精品亚洲 | 中文毛片无遮挡高清免费 | 色噜噜亚洲男人的天堂 | 装睡被陌生人摸出水好爽 | 国产suv精品一区二区五 | 成年美女黄网站色大免费全看 | 老熟女乱子伦 | 国产精品无码一区二区三区不卡 | 欧美喷潮久久久xxxxx | 午夜精品久久久久久久久 | 精品国产成人一区二区三区 | 国产香蕉尹人综合在线观看 | 国产人妖乱国产精品人妖 | 日本精品人妻无码免费大全 | 亚洲综合伊人久久大杳蕉 | 人人妻人人澡人人爽人人精品 | 国产精品鲁鲁鲁 | ass日本丰满熟妇pics | 亚洲人成人无码网www国产 | 一个人看的www免费视频在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 无码人妻精品一区二区三区下载 | 疯狂三人交性欧美 | 亚洲国产精品久久久久久 | 中文字幕久久久久人妻 | 亚洲人成无码网www | 日韩精品无码一本二本三本色 | 欧美黑人性暴力猛交喷水 | 波多野结衣乳巨码无在线观看 | 欧美xxxx黑人又粗又长 | 精品久久久无码人妻字幂 | 久久精品国产一区二区三区肥胖 | 美女扒开屁股让男人桶 | 夜精品a片一区二区三区无码白浆 | 狂野欧美性猛xxxx乱大交 | 亚洲成a人片在线观看日本 | 久久精品国产99精品亚洲 | 国产精品亚洲一区二区三区喷水 | 嫩b人妻精品一区二区三区 | 天堂亚洲2017在线观看 | 国产一区二区三区四区五区加勒比 | 在线 国产 欧美 亚洲 天堂 | 国产精品久久久午夜夜伦鲁鲁 | 久久午夜无码鲁丝片 | 一本色道久久综合狠狠躁 | 在线a亚洲视频播放在线观看 | 97se亚洲精品一区 | 精品水蜜桃久久久久久久 | 国产成人无码a区在线观看视频app | 久久精品国产99精品亚洲 | 丰满少妇高潮惨叫视频 | 久久亚洲国产成人精品性色 | 日本护士毛茸茸高潮 | 日本成熟视频免费视频 | 国产人妻精品一区二区三区不卡 | 超碰97人人射妻 | 性欧美牲交在线视频 | 国产成人综合色在线观看网站 | 熟妇女人妻丰满少妇中文字幕 | 久久天天躁夜夜躁狠狠 | 美女毛片一区二区三区四区 | 东北女人啪啪对白 | 日本免费一区二区三区最新 | 成人欧美一区二区三区黑人免费 | 久久久久亚洲精品中文字幕 | 欧美国产日韩久久mv | 少妇人妻偷人精品无码视频 | 少妇无码av无码专区在线观看 | 男女作爱免费网站 | а√天堂www在线天堂小说 | 青青久在线视频免费观看 | 无码纯肉视频在线观看 | 正在播放东北夫妻内射 | 欧美成人午夜精品久久久 | 亚洲精品久久久久中文第一幕 | 国产成人精品一区二区在线小狼 | 亚洲 欧美 激情 小说 另类 | 无码毛片视频一区二区本码 | 国产绳艺sm调教室论坛 | 亚洲日韩av片在线观看 | 亚洲一区av无码专区在线观看 | 亚洲国产成人a精品不卡在线 | 中文字幕 人妻熟女 | 老太婆性杂交欧美肥老太 | 亚洲成在人网站无码天堂 | 亚洲一区二区三区四区 | 亚拍精品一区二区三区探花 | 亚洲aⅴ无码成人网站国产app | 娇妻被黑人粗大高潮白浆 | 国产精品久久久一区二区三区 | 亚洲一区二区三区在线观看网站 | 麻豆md0077饥渴少妇 | 国内精品久久久久久中文字幕 | 亚洲精品鲁一鲁一区二区三区 | 熟女少妇在线视频播放 | 国产在线一区二区三区四区五区 | 最近中文2019字幕第二页 | 欧洲vodafone精品性 | 麻豆果冻传媒2021精品传媒一区下载 | 精品欧美一区二区三区久久久 | 国产精品资源一区二区 | 午夜成人1000部免费视频 | 欧美国产日产一区二区 | 欧美激情综合亚洲一二区 | 色一情一乱一伦一区二区三欧美 | 高潮毛片无遮挡高清免费视频 | 亚洲中文无码av永久不收费 | 伊人久久大香线蕉av一区二区 | 国产97在线 | 亚洲 | 久久精品人人做人人综合试看 | 亚洲国产成人av在线观看 | 中国大陆精品视频xxxx | 国产在线精品一区二区高清不卡 | 亚洲中文字幕av在天堂 | 午夜成人1000部免费视频 | 亚洲国产高清在线观看视频 | 纯爱无遮挡h肉动漫在线播放 | 青春草在线视频免费观看 | 亚洲精品午夜无码电影网 | 乱码午夜-极国产极内射 | 亚洲欧美日韩成人高清在线一区 | 国产成人一区二区三区别 | 久久精品女人的天堂av | 精品国产av色一区二区深夜久久 | 精品无码av一区二区三区 | 久久精品无码一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 99久久99久久免费精品蜜桃 | 成人欧美一区二区三区黑人 | 人妻人人添人妻人人爱 | 无码精品人妻一区二区三区av | 欧美性猛交xxxx富婆 | 伊在人天堂亚洲香蕉精品区 | 亚洲成在人网站无码天堂 | 久久久久久久女国产乱让韩 | 丰满少妇弄高潮了www | 一二三四在线观看免费视频 | v一区无码内射国产 | 日韩人妻少妇一区二区三区 | 97夜夜澡人人爽人人喊中国片 | 中文字幕人妻无码一区二区三区 | 内射后入在线观看一区 | 欧美一区二区三区视频在线观看 | 国产精品毛多多水多 | 性欧美videos高清精品 | 少妇愉情理伦片bd | 奇米影视7777久久精品 | 久久国产36精品色熟妇 | 天堂亚洲2017在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 欧美老熟妇乱xxxxx | 国产精品手机免费 | 亚洲成色在线综合网站 | 麻花豆传媒剧国产免费mv在线 | 男人的天堂2018无码 | 亚洲精品中文字幕乱码 | 亚洲色成人中文字幕网站 | 亚洲国产欧美在线成人 | 精品无人国产偷自产在线 | 小鲜肉自慰网站xnxx | aⅴ在线视频男人的天堂 | 亚洲精品午夜国产va久久成人 | 六月丁香婷婷色狠狠久久 | 99久久精品日本一区二区免费 | 国产在线精品一区二区高清不卡 | 大乳丰满人妻中文字幕日本 | 在线成人www免费观看视频 | 久久综合激激的五月天 | 精品一区二区三区无码免费视频 | 伊人久久大香线蕉午夜 | 日本饥渴人妻欲求不满 | 无码一区二区三区在线观看 | 精品久久久无码人妻字幂 | 玩弄中年熟妇正在播放 | 国产真人无遮挡作爱免费视频 | 动漫av网站免费观看 | 国产激情艳情在线看视频 | 黑人巨大精品欧美一区二区 |