• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    A Data Consistency Insurance Method for Smart Contract

    2023-10-26 13:15:26JingDengXiaofeiXingGuoqiangDengNingHuShenSuLeWangandMdZakirulAlamBhuiyan
    Computers Materials&Continua 2023年9期

    Jing Deng ,Xiaofei Xing ,Guoqiang Deng ,Ning Hu ,Shen Su ,Le Wang and Md Zakirul Alam Bhuiyan

    1School of Computer Science and Cyber Engineering,Guangzhou University,Guangzhou,510006,China

    2Information Network Engineering and Reasearch Center,South China University of Technology,Guangzhou,510640,China

    3Cyberspace Institute of Advanced Technology,Guangzhou University,Guangzhou,510006,China

    4Department of Computer and Information Sciences,Fordham University,New York,10458,USA

    ABSTRACT As one of the major threats to the current DeFi(Decentralized Finance)ecosystem,reentrant attack induces data inconsistency of the victim smart contract,enabling attackers to steal on-chain assets from DeFi projects,which could terribly do harm to the confidence of the blockchain investors.However,protecting DeFi projects from the reentrant attack is very difficult,since generating a call loop within the highly automatic DeFi ecosystem could be very practicable.Existing researchers mainly focus on the detection of the reentrant vulnerabilities in the code testing,and no method could promise the non-existent of reentrant vulnerabilities.In this paper,we introduce the database lock mechanism to isolate the correlated smart contract states from other operations in the same contract,so that we can prevent the attackers from abusing the inconsistent smart contract state.Compared to the existing resolutions of front-running,code audit,and modifier,our method guarantees protection results with better flexibility.And we further evaluate our method on a number of de facto reentrant attacks observed from Etherscan.The results prove that our method could efficiently prevent the reentrant attack with less running cost.

    KEYWORDS Blockchain;smart contract;data consistency;reentrancy attack

    1 Introduction

    Blockchain technology integrates encryption algorithms,distributed ledger technology,and other technologies to establish and maintain a decentralized and trust-free database.It has the characteristics of information transparency and tamper-proof,which makes it have broad prospects of application[1].As one of the most popular blockchain platforms,Ethereum[2]introduced the concept of smart contracts.A smart contract is a program that runs on the blockchain and has the functions of storing data and executing transactions.It can also be regarded as a distributed ledger with monetary attributes [3].It may be applied to a variety of aspects,including token assets,payments,supply chains,and electronic bills.In Ethereum,10.7 million smart contracts were created and 345 million transactions were made in 2020 [4].Since smart contracts have financial properties and can hold a significant sum of money,they are more likely to attract the attention of malicious people.Besides,due to the immutability of the blockchain,vulnerabilities in smart contracts are difficult to repair after being discovered and attacked,resulting in more serious losses.

    In the smart contract,because the developer’s design is not rigorous enough,the attacker may be able to exploit reentrancy and other methods to generate data inconsistency,launching an attack and incurring significant financial losses.The infamous the DAO(Decentralized Autonomous Organization)attack[5]exploited reentrance flaws to inflict nearly$60 million in losses and even led to the fork of the Ethereum blockchain,which severely depreciated the digital currency and had a catastrophic impact on the market.In addition,Cream.Fiance suffered an attack due to a reentrance vulnerability in August 2021,resulting in a loss of approximately$18.8 million.

    The defense methods for this vulnerability are divided into the following types: 1) Identify vulnerabilities in smart contracts using analysis tools and use some methods to fix them.For example,the study by Qian et al.[6],the study by Liu et al.[7],and the study by Samreen et al.[8].2)Intercept harmful transactions by detecting malicious behavior based on runtime information,such as ?GIS[9]and a defense technology proposed by Xiang et al.[3].3)Reinforce the security of smart contracts in the stage of code writing,such as the ReentrancyGuard modifier of Openzeppelin[10]and a security function based on the state lock in a patent called“A design method and system for security function of smart contract based on state lock”.Among the first two types of methods,some studies intercept the attack through EVM.But this way of defending against attacks has to do with the blockchain nodes,and changing the clients of each node is something that has a significant impact on the blockchain[11,12].Some methods are to inspect the contract and identify if there is a vulnerability or an attack.It does not identify all reentry attacks and may not be defensible if a new type of reentry attack is encountered.

    The method in this paper belongs to the third category,which is to reinforce the security of smart contracts during the stage of code writing,such as ReentrancyGuard.When a reentry attack occurs,it relies on the contract itself to restrict the attacker’s behavior and prevents the attack from being successfully executed.This method is convenient and straightforward to use,but the current studies can only partially avoid the reentrancy problems,and there is still a lack of exploration in this area.Therefore,we want to find a better method that can defend against more types of reentrancy attacks.This method has to be practical and low-cost.

    Our contribution in this paper includes two folds.First,we introduce the idea of modifying the correlating smart contract states as a unit to prevent the abuse of dirty states by reentrant attacks.Second,we propose to utilize external smart contracts to record the editing circumstances of the correlating smart contract states,which would not be affected by reentrant attacks.Finally,we prove the feasibility of our method by deploying our method on the smart contract which has already suffered from reentrant attacks,and our experiments indicate that our method could effectively ensure data consistency with better efficiency.

    2 Preliminary

    2.1 Smart Contract

    There are two types of accounts in Ethereum,external accounts and contract accounts.External accounts are accounts owned by users.Contract accounts are accounts allocated for smart contracts and controlled by the code of the contract.Technically,a smart contract can be seen as a set of functions defined by bytecode instructions that can receive,store,and send messages and currencies.Developers can use high-level programming languages(e.g.,solidity)to write smart contracts.Solidity is currently the most commonly used language for smart contract development,and it is a Turingcomplete high-level programming language.The work in this paper uses Solidity language to realize the writing of the contract.The code is compiled to get bytecode,which is then deployed to the blockchain.After the contract is deployed on the chain,the publisher cannot modify the contract and anyone can interact with the contract.There are variables stored in the contract and state variables are variables whose values are permanently stored in contract storage.

    External accounts can initiate transactions and call contracts,and contract accounts can call each other as well.The state of the accounts can be changed through transactions.After the transaction is created,it will be broadcast to other Ethereum nodes,executed by miners,and packaged into blocks[13,14].In order to prevent malicious transactions and regulate miners’behavior,each operation in Ethereum charges a certain fee in units of gas.

    2.2 Reentrancy Attack

    When a user calls a smart contract,there may be some operations that the contract calls an unknown contract given by the user.The external calls are easily exploited by attackers.The attacker can construct a malicious contract so that the object of the external call is the function in the malicious contract.Then the control is transferred to the malicious contract.In the called function of the malicious contract,the attacker can call the contract of the attacked project once more,and launch attacks like multiple transfers until the gas or contract fund runs out.There are many ways to launch reentrancy attacks.According to the research of Rodler et al.[15],there are several types of reentrancy attacks,including same-function reentrancy,cross-function reentrancy,delegated reentrancy,and create-based reentrancy.In same-function reentrancy,the victim contract is reentrant in the same function,which is the most classic reentrancy attack.In cross-function reentrancy,the victim contract is reentrant in a different function.In delegated reentrancy,operations that can be reentrant(such as transfers via call()) exist in the function called via the delegate call.In create-based reentrancy,the victim contract creates a contract,and the constructor of the new contract will call the function in the malicious contract.

    2.3 Data Inconsistency

    In a database,it is important to ensure data consistency.Due to improper concurrency control,data inconsistency may occur in the database,causing problems like dirty writing and lost updates.In smart contracts,the problem of data inconsistency also exists.

    In smart contracts,we refer to the logical association constraints between the state variables of the smart contract that particularly undertakes the application business as data consistency.For example,the constraint between“account”and“balance”is the number of tokens held by each project participant.When smart contracts perform data operations,especially complex data operations,an intermediate state that does not meet the associated constraints will appear.And this is the state of data inconsistency.

    When a smart contract is called externally in a dirty state,the external contract has the opportunity to maliciously cause data inconsistency of the state variable through re-entry,or use the original data inconsistency state to break the original constraints of the smart contract,tamper with the control flow and state of the original smart contract.This data inconsistency problem is usually exploited by attackers to attack the contract itself through the fallback function or other ways to achieve malicious attacks like repeated transfers.In a reentrancy attack,the successful execution of the reentrancy operation requires that the original constraints in the smart contract are satisfied.So in the reentrant attack,one or more relevant state variables involved in this constraint condition are in a data-inconsistent state.Therefore,we believe that solving the data consistency problem in smart contracts can effectively prevent reentrancy attacks.

    The data consistency mentioned here is in line with the data consistency of traditional relational databases.In the relational database,the goal of ensuring data consistency is refined into ACID principles,namely: 1) Atomicity.The transaction is either all committed successfully or all failed to roll back.There is no partial success state and cannot perform only part of the operation.2)Consistency.The execution of the transaction cannot destroy the integrity and consistency of the database data.The database must be in a consistent state before and after a transaction is executed.3)Isolation.Concurrent transactions are isolated from each other,and the execution of a transaction cannot be interfered with by other transactions.4) Durability.Once a transaction is committed,the corresponding data state changes will be permanently stored.

    In smart contracts,because blockchain data is difficult to tamper with,it is clear that the principle of durability can be satisfied.Since the smart contract transactions are executed serially and the transaction itself is executed atomically,a qualified developer can also basically guarantee the other principles if no reentry attacks are considered so that the data of the transaction results under normal circumstances are in a consistent state and satisfy the principle of consistency.Therefore,the key to guaranteeing data consistency in smart contracts is to ensure that sequences of operations(including reading and writing operations,called correlated sequences of operations)on the same set of logically related states are executed atomically and isolated from each other.Thus,it satisfies the principles of atomicity and isolation.

    3 Methodology

    In this paper,we use mutual exclusion locks to isolate data read/written between a set of associated operations.As shown in Fig.1,before performing a set of associated operations,it is necessary to apply for locking the state variables accessed by the operations,and the operations can be performed only after the locking is successful.The corresponding state variables cannot be accessed again until they are unlocked.In this way,a state variable cannot be accessed by more than one application in a single association operation,preventing the state variable from being accessed in inconsistent states.

    Figure 1:Data consistency guarantee mechanism

    After the operation sequence is finished,the state variables should be unlocked,and the locked state variables should be released so that they can be requested in the next operation sequence.If a state variable is locked and an external contract attempts to access the data,the application fails and no subsequent operations are performed.To achieve atomic execution of the associated operation sequence,i.e.,no partially successful state exists,the unreleased locked state variables are checked before the smart contract returns.If an unreleased state variable exists,the transaction will be rolled back.In this way,access to resources can be turned into a mutually exclusive operation through the lock,and the consistency of state data in smart contracts can be guaranteed.

    In this paper,we implement mutual exclusion locks in a smart contract called“Locker”and allocate mutually exclusive resources based on smart contracts’addresses and names of state variables.Adding and releasing a mutual exclusion lock is done by calling the method in the Locker contract.In the method implementation described in this paper,there is the lock function and the unlock function.

    First,we need to clarify when and how the functions will be used.To ensure data consistency,it is necessary to prevent state variables from being read or written in dirty states in a sequence of operations on logically related variables.Thus,the lock function is called before operating on state variables(i.e.,variables that will probably be in a dirty state).Meanwhile,since the read state variable may be used directly or indirectly as judgment conditions,and may also be used for data updates or other purposes,it is necessary to detect the lock state of the variables before reading them.This is done to prevent smart contracts from performing operations that deviate from the contract’s original logic because of the incorrect state variables.

    The lock function is called before accessing state variables,and a lock can be applied to one or more variables at a time.In the lock function,the lock state of the state variables is detected before the locking operation is performed,i.e.,to detect whether the requested state variables have been locked.If none of the state variables have been locked,the lock function records the data of this visit (the recorded data is called“access record”) and returns true.Then the group of state variables can be accessed.If there are one or more state variables that have already been locked,return false.The above operations prevent data from being accessed repeatedly and achieve the purpose of locking data.

    The above detection is implemented in combination with the reentry depth.When a locking operation is performed on a set of state variables,the access data of the external contract is detected and recorded,and the access records can be used in subsequent detection to determine whether the external contract reenters in a certain sequence of associated operations in that transaction.In order to accurately record the locking status of variables in different contracts,the state variable’s name and its contract address information are included in an access record.The storage and query of access records can be implemented in various ways.In this paper,we implement a Locker contract,in which the lock method and unlock method are implemented.

    When the lock function is called,based on the contract address and the state variable name,it detects whether the requested variables have already been recorded.If no record exists,the lock request is successful.The corresponding access record is recorded in the Locker contract(that is,the corresponding state variables become locked),and true is returned.Otherwise,when one or more state variables in the set of requested variables are in the locked state,the application for locking fails,and false is returned.When locking fails,we assume that a reentrant operation occurred in the transaction,so we can avoid the potential reentrant attack by means such as rolling back the transaction.After the operation on an associated set of state variables is finished,the unlock function is called to delete the corresponding access record.Then,this set of state variables can be requested to be accessed(back to the unlocked state).The flow chart is shown in Fig.2.

    As the example in Fig.3,there is a Loaner contract,where the totalDebt and loanLimit are state variables in it.External contracts can deposit a guarantee to the Loaner contract and obtain the loan limit by calling depositGuarantee().When loan() is called,the Loaner contract transfers tokens to the caller.And when the totalDebt is 0,the caller can take out the guarantee by calling withdrawGuarantee().

    When a reentrant attack occurs,the attack contract calls loan() in the Loaner contract after putting in the guarantee,and the fallback function of the attack contract is called after the transfer occurs and before the totalDebt is updated,at which time the attack contract can take over the control flow and then call withdrawGuarantee() function.In this case,if the lock function is not used,totalDebt and loanLimit can be reentered and the attack contract can successfully call the withdrawGuarantee(),causing a loss to the Loaner contract.If the lock function is used,we need to apply a lock for totalDebt and loanLimit first when calling the withdrawGuarantee().Since totalDebt and loanLimit are already locked,false is returned and reentrant attacks are avoided.

    4 Evaluation

    In this section,we design experiments to test the effectiveness and performance of the method proposed in this paper.All the experiments are conducted on a computer equipped with an AMD Ryzen 7 4800H CPU at 2.90 GHz and 32 GB RAM.The language used in the experiments is Solidity.We use Remix to compile the contract.After debugging the contract,we can publish the contract to any blockchain that supports Solidity smart contracts.In the experiment,we chose to test on the Ethereum test network Rinkeby.

    In order to verify the types of reentrancy attacks that this method can defend against,we refer to the types of reentrancy attacks in the research of Rodler et al.[15] and the experimental contract published on github by the research of Torres et al.[9].Cross-function reentrancy,delegated reentrancy,and create-based reentrancy attacks are three forms of reentrancy attacks used to conduct experiments.In addition,we selected The DAO and SpankChain from publicly reported attacks and found their source code from Etherscan.We wrote the contract SimpleDAO based on the attack logic in The DAO,then deployed SimpleDAO contract and LedgerChannel contract in the SpankChain event to the test net.Next,we edit the two contracts,add the lock and unlock functions before and after some operations,and deploy the edited contract to the test net.We write attack contracts based on the actual reports of how hackers attacked these contracts,then attack unlocked contracts and locked contracts respectively.After testing,it is found that the contract using the lock function and unlock function can successfully avoid the attack.It verifies that our method can defend against the above three types of reentrancy attacks,and shows that our method is also effective in selected real reentrancy attacks that have actually occurred.The test information such as the increased line of code(LOC)for these reentry attacks is shown in Table 1 below.

    Table 1:Test information for three types of reentry attacks

    We also found the source code for Uniswap from Etherscan and added codes to the functions of adding liquidity and swapping tokens,to lock and unlock the state variables involved in these functions.During this process,we performed 6 experiments for each function,recording and comparing the gas consumption and increased LOC before and after adding codes.The gas consumption is shown in Fig.4.In these transactions,the average increase in gas consumption is 15%.

    Figure 4:Gas cost of the method

    The cost in our method originates mainly from calling functions and storing data,and it is related to the number of variables to be locked and the number of locks to be added.When the number of locks and the number of locked variables do not vary much,we believe that the original business complexity of the function has a significant impact on the percentage increase in gas,and therefore only analyzing the percentage increase in gas is not comprehensive enough.Thus,we selected multiple state variable names from the contracts covered in the experiments above,wrote contracts to perform lock and unlock operations on different numbers of state variables,and use the gasleft()function to test and get the overhead of the lock and unlock functions.The result is shown in Fig.5,when more variables are locked at once,the average gas consumption of locking each variable is significantly lower.

    In addition,we implement an access control contract for the cost comparison with our method.We implemented a contract with access control features based on existing defense methods[3],including transit allowed list,transit banned list,transit restricted list,and interface transit time restriction.We also modified the LedgerChannel contract to use the access control contract and experimented with the cost of running this defense approach in the same environment in normal times.A comparison of the cost of the access control approach and our approach when no attack occurs is shown in Fig.6.It can be seen that our method consumes less than the access control contract when no attack occurs.And in case of an attack,our approach does not incur more cost consumption.In contrast,in the experiments in the above study,the defensive behavior in case of an attack is to restrict the attacker’s address or restrict the interface by initiating a transaction.This generates additional consumption and is more expensive because the transaction is set at twice the gas price of the attack transaction.

    Figure 6:Comparison of increased gas cost

    In terms of interception success rate,although the defensive transaction sets a higher gas price in the access control method,there is still a possibility that the defensive transaction is packaged on the chain after the attacking transaction.This is because the defensive transaction is sent after the attacking transaction is detected.On the Rinkeby test chain,the block time is about 15 s.And the average time of the interval between attack and defense transactions in the above research method is 0.533 s.The interval time is longer considering that there is an uncertain transmission time between the initiation of a transaction and its delivery to a node.Therefore,we conduct experiments to continuously obtain the timestamp of the latest block to infer the timestamp of the next block.And we issue transactions at different intervals before the predicted time to see if this transaction can be packaged in the next block.

    To avoid the experiment being affected by the order in which transactions are packaged,we set a high gas price.We calculate the probability that a transaction issued at each time point is packed in the next block,as shown in Fig.7.We use the probability to calculate the weighted average of the transmission time of 1.783 s.This means that there is a time difference of 2.316 s between the detection of an attack and the transmission of a defensive transaction to the node.Therefore,it can be calculated that the probability of two transactions being packed into the same block is 84.6%.Of course,due to network latency,the transmission time may vary significantly from one environment to another,making the interception success rate change as well.We also conducted experiments on the Rinkeby test chain,setting the transmission interval between attacking and defending transactions to 0.533 s.And the two transactions are called a set of transactions.We send a set of transactions 75 times,of which there are 9 defense failures,i.e.,the defense success rate in the experiment is 88%.While our method does not need to initiate additional transactions,which are all successfully defended in the experiments of this section.

    Figure 7:The probability that the transactions be packed in the next block

    5 Related Work

    This section introduces the defense research on smart contract reentrancy attacks.Since the method in this article belongs to the coding stage,it will be compared with other methods in the coding stage.In the current research on reentrancy attacks,using analysis tools to uncover reentrance vulnerabilities helps with adjustments to the smart contract before being deployed to the chain.There are tools that analyze contracts statically,such as analyzing the contracts written in Solidity or the bytecodes of the contracts.Qian et al.proposed a reentrancy detection method based on a sequential model [6],Liu et al.proposed a fuzzing-based analyzer to automatically detect reentrancy bugs [7],and Samreen et al.proposed a framework that combines static and dynamic analysis to capture reentry attacks[8].

    Some tools can detect attacks based on runtime information.Since it tracks the state of the contract in real time,it has more basis for judgment than static analysis of the contract.However,if the real-time data is obtained by staking to the contract code,it will undoubtedly bring higher gas consumption.Some studies such as Sereum are able to detect attacks and intercept malicious transactions in real time by modifying the EVM.However,it would require all miners to bundle the Ethereum clients with the tool,which is difficult to implement.

    All of the above methods of detection tools need to analyze the control flow and other characteristics of existing vulnerabilities or attacks,there may be new reentry attacks that are not identified.Some of the methods cannot be updated after the contract uses them and the contract is deployed,and some of the methods that can be updated need to be updated in time before the attack occurs to avoid losses.

    The defense methods in the contract code-writing phase also need to be used before the contract is deployed on the chain.Based on the analysis in Section 2.2,we believe that the key to guaranteeing the consistency of smart contract data at this stage is to ensure that the dirty state is not maliciously exploited.We think there are two solutions to guarantee the consistency of smart contract data in the code-writing phase:1)Ensure that the smart contract does not make(or cannot make)external calls in a dirty state.2) Ensure that the smart contract cannot access (read or write) the dirty state again when making external calls.

    For the first approach,the current main solution is to restrict external calls.Since smart contracts consume a certain amount of gas for each operation,one common way is to use send()or transfer()functions when sending tokens to external addresses.This method limits the number of gas so that the gas is not sufficient to call the contract again.Therefore,this method prevents reentrant attacks by limiting the number of calls.However,this approach is not flexible enough and may also cause problems when calling callback functions due to insufficient gas.Since every opcode supported by Ethereum Virtual Machine(EVM)has a gas cost and it is not constant,this may cause the contract with the gas limit set to not execute smoothly after the gas cost is adjusted.

    Checks-Effects-Interactions [16] is also a commonly mentioned way that follows a sequence of checking all preconditions first,then changing the contract state,and interacting with other contracts in the last step.This approach ensures that states change before external calls by strictly checking the interaction and execution order of statements,so that all state changes are completed before any potential reentry point,thus ensuring state consistency.This approach requires a high level of audit correctness and is susceptible to human error.

    The ReentrancyGuard approach in the OpenZeppelin smart contract codebase provides a modifier that,when applied to a function,can make the function“non-reentrant”by failing the operation when reentry is detected.However,since the modifier is applied to functions,it guarantees that the same function cannot be called more than once.But there is still a risk that the contract will be reentrant if the same data is accessed through different functions.

    In the second type of method,making the dirty state inaccessible to external contracts is achieved through locks.For example,the safe function proposed by Chen et al.Since the function call()has no gas limit setting,it is easy to be exploited to read dirty states for reentry attacks.This method avoids the call function from being exploited by attackers by designing the safe library function SafeCall()so that the state data is locked when the call function is used and the lock is released at the end.

    Current research focuses on modifying the EVM or analyzing the contract code.They detect the control flow in the contract and analyze the code or transaction characteristics to determine if there is a reentrant vulnerability.The difference between our method and the above methods is that our method does not directly detect vulnerabilities,but provides a method to be used in smart contracts.It ensures data consistency within the smart contract so that while performing external calls,the smart contract cannot re-access state variables that are in an inconsistent state.Thus,in the event of a reentry attack,we are able to roll back the transaction and the attack fails.In addition,other methods cannot solve the smart contract data consistency problem effectively.The restriction on external calls reduces the flexibility of development,which in turn limits the application mode of smart contracts.The current state-lock-based method only targets call(),and it cannot be defended if attackers use other functions to attack,such as create-based reentrancy.For the purpose of preventing reentrancy attacks more comprehensively,the data consistency insurance method proposed in this paper ensures that smart contracts cannot access dirty states again in external calls[17].This method does not result in situations where external calls cannot occur.While improving the flexibility of development,it ensures that operations on the same set of logically related states are executed atomically and isolated from each other,thus guaranteeing the consistency of smart contract data.

    6 Conclusion and Future Work

    In this paper,we propose a method to ensure the consistency of smart contract data.It is based on the mutual exclusion lock and achieves isolation of data read/write between sequences of associated operations.It detects the lock state combined with the reentry depth to judge whether it is reentrant or not.It ensures that external contracts cannot read or write to the corresponding state variables when a contract performs a data operation with a dirty state.So data consistency before and after the operation sequences is guaranteed.This method also provides a novel idea for the defense of reentrant vulnerabilities.

    In addition,the existing limitations of this method need to be pointed out.This method restricts all reentrant operations,even if the operation is not malicious.And there is an additional gas cost when using this method,and the cost increases when there are many operations of locking.But for contacts that may suffer big losses,such attrition is acceptable.Besides,in the experiments of this paper,analyzing contracts and adding locks are implemented manually.The above problems may be improved in subsequent work.

    Acknowledgement:The authors are grateful to the financial supports from the National Key Research and Development Plan,Key-Area Reasearch and Development Program of Guangdong Province,CCF-NSFOCUS Kunpeng Scientific Research Fund,National Natural Science Foundation of China,Guangdong Higher Education Innovation Group,and Guangzhou Fundamental Reasearch Plan of“Municipal-School”Jointly Funded Projects.

    Funding Statement:This work was supported by National Key Research and Development Plan(Grant No.2018YFB1800701),Key-Area Research and Development Program of Guangdong Province 2020B0101090003,CCF-NSFOCUS Kunpeng Scientific Research Fund(CCF-NSFOCUS 2021010),National Natural Science Foundation of China(Grant Nos.61902083,62172115,61976064),Guangdong Higher Education Innovation Group 2020KCXTD007 and Guangzhou Higher Education Innovation Group (No.202032854),and Guangzhou Fundamental Research Plan of“Municipalschool”Jointly Funded Projects(No.202102010445).

    Author Contributions:The authors confirm contribution to the paper as follows: study conception and design: Xiaofei Xing,Guoqiang Deng,Ning Hu,Shen Su;data collection: Jing Deng,Ning Hu;experiment:Jing Deng,Xiaofei Xing,Guoqiang Deng;analysis and interpretation of results:Le Wang and Md Zakirul Alam Bhuiyan;draft manuscript preparation:Jing Deng,Shen Su.All authors reviewed the results and approved the final version of the manuscript.

    Availability of Data and Materials:The data used in this study will be shared on reasonable request to the corresponding author.However,due to privacy and confidentiality agreementd,certain data may not be released or made publicly available.

    Conflicts of Interest:The authors declare that they have no conflicts of interest to report regarding the present study.

    国产精品国产三级国产专区5o| av网站免费在线观看视频| 国产在线一区二区三区精| 91精品国产国语对白视频| 免费播放大片免费观看视频在线观看| 欧美激情国产日韩精品一区| 久热久热在线精品观看| 王馨瑶露胸无遮挡在线观看| 爱豆传媒免费全集在线观看| 纵有疾风起免费观看全集完整版| 赤兔流量卡办理| 国产无遮挡羞羞视频在线观看| 国产高清有码在线观看视频| 日本vs欧美在线观看视频 | 国产精品一区www在线观看| 成人特级av手机在线观看| 亚洲欧美精品专区久久| 亚洲中文av在线| 久久精品国产亚洲av天美| 久久国内精品自在自线图片| 狂野欧美激情性xxxx在线观看| 黑人高潮一二区| 亚洲电影在线观看av| av视频免费观看在线观看| 热re99久久精品国产66热6| 亚洲色图综合在线观看| 丰满人妻一区二区三区视频av| 成人毛片a级毛片在线播放| 亚洲无线观看免费| 内地一区二区视频在线| 男人和女人高潮做爰伦理| 搡老乐熟女国产| 精品国产三级普通话版| 国产精品一区二区性色av| 久久av网站| 久久久久久久久久久丰满| av女优亚洲男人天堂| 视频中文字幕在线观看| 久久久久久久久大av| 天天躁夜夜躁狠狠久久av| 国产探花极品一区二区| 国产精品麻豆人妻色哟哟久久| 免费黄色在线免费观看| 免费观看无遮挡的男女| 国产男人的电影天堂91| av播播在线观看一区| 插逼视频在线观看| 另类亚洲欧美激情| 精品99又大又爽又粗少妇毛片| 国产精品嫩草影院av在线观看| 舔av片在线| 久久久久久伊人网av| 亚洲一区二区三区欧美精品| 网址你懂的国产日韩在线| 成人一区二区视频在线观看| 亚洲av不卡在线观看| 国产片特级美女逼逼视频| 国产高清有码在线观看视频| 久久人人爽人人爽人人片va| 日韩中字成人| av.在线天堂| 久久久久久久久久成人| 一个人免费看片子| 成人影院久久| 亚洲经典国产精华液单| a 毛片基地| 黄片wwwwww| 国产日韩欧美在线精品| 欧美一区二区亚洲| 成人亚洲欧美一区二区av| a 毛片基地| 亚洲欧洲国产日韩| 99久久精品一区二区三区| 久久97久久精品| 国产高潮美女av| 狠狠精品人妻久久久久久综合| 夫妻午夜视频| 我的女老师完整版在线观看| 亚洲天堂av无毛| 91午夜精品亚洲一区二区三区| 熟女电影av网| 精品人妻一区二区三区麻豆| 色视频www国产| 国产片特级美女逼逼视频| 嫩草影院入口| 人人妻人人添人人爽欧美一区卜 | 美女福利国产在线 | 中文乱码字字幕精品一区二区三区| 亚洲欧美日韩卡通动漫| 日韩大片免费观看网站| 国产在线视频一区二区| 99久久精品一区二区三区| 在线观看人妻少妇| 国产精品久久久久久久久免| 99热6这里只有精品| 国产精品嫩草影院av在线观看| 天天躁日日操中文字幕| 日韩成人av中文字幕在线观看| 精品久久国产蜜桃| 国产精品国产三级国产av玫瑰| 精品国产乱码久久久久久小说| 国产伦精品一区二区三区视频9| 国产高潮美女av| 亚洲国产高清在线一区二区三| 欧美激情国产日韩精品一区| 国产在线男女| 国产成人精品一,二区| av线在线观看网站| 一区二区三区四区激情视频| 亚洲精品视频女| 伊人久久国产一区二区| 国产黄片视频在线免费观看| 婷婷色麻豆天堂久久| 欧美97在线视频| 美女内射精品一级片tv| 国产精品无大码| av专区在线播放| 久久国内精品自在自线图片| 99热国产这里只有精品6| 日韩在线高清观看一区二区三区| 亚洲四区av| 九九久久精品国产亚洲av麻豆| 欧美老熟妇乱子伦牲交| 久久久久精品性色| 午夜免费鲁丝| 丰满迷人的少妇在线观看| 2018国产大陆天天弄谢| 高清日韩中文字幕在线| 日本wwww免费看| 五月伊人婷婷丁香| 国产午夜精品久久久久久一区二区三区| 久久热精品热| 纵有疾风起免费观看全集完整版| 在线天堂最新版资源| 国产精品一区二区在线观看99| 内射极品少妇av片p| 亚洲性久久影院| 欧美高清成人免费视频www| 久久精品熟女亚洲av麻豆精品| 在线观看人妻少妇| 尤物成人国产欧美一区二区三区| 99热这里只有精品一区| 91精品国产九色| 婷婷色av中文字幕| 麻豆乱淫一区二区| 亚洲欧美一区二区三区国产| 五月天丁香电影| 热99国产精品久久久久久7| 国产在视频线精品| av国产久精品久网站免费入址| 91精品伊人久久大香线蕉| 久久精品久久精品一区二区三区| 99九九线精品视频在线观看视频| 国产精品爽爽va在线观看网站| 97在线视频观看| 夫妻午夜视频| 有码 亚洲区| 国产精品免费大片| 午夜激情久久久久久久| 爱豆传媒免费全集在线观看| 97超视频在线观看视频| 七月丁香在线播放| 国产精品一及| 亚洲一级一片aⅴ在线观看| 精品一区二区免费观看| 精品一区二区免费观看| 日韩 亚洲 欧美在线| 色婷婷久久久亚洲欧美| 亚洲欧美清纯卡通| 春色校园在线视频观看| 日本一二三区视频观看| 国语对白做爰xxxⅹ性视频网站| 久久午夜福利片| 欧美日韩国产mv在线观看视频 | 一个人免费看片子| tube8黄色片| 一级爰片在线观看| 久久久久久久亚洲中文字幕| 国产高清三级在线| 久久国产精品男人的天堂亚洲 | 亚洲av男天堂| 日本免费在线观看一区| 尤物成人国产欧美一区二区三区| 午夜老司机福利剧场| 黑人高潮一二区| 午夜福利高清视频| 赤兔流量卡办理| 成年免费大片在线观看| 高清不卡的av网站| 丰满人妻一区二区三区视频av| 九九久久精品国产亚洲av麻豆| 日韩制服骚丝袜av| 边亲边吃奶的免费视频| 日产精品乱码卡一卡2卡三| 成人黄色视频免费在线看| 最新中文字幕久久久久| 七月丁香在线播放| 午夜激情久久久久久久| 成人影院久久| 国精品久久久久久国模美| 国产免费一区二区三区四区乱码| 亚洲四区av| 秋霞在线观看毛片| 女的被弄到高潮叫床怎么办| 又爽又黄a免费视频| 青春草视频在线免费观看| 久久亚洲国产成人精品v| www.av在线官网国产| 熟女电影av网| 国产高潮美女av| 街头女战士在线观看网站| 深夜a级毛片| 亚洲av成人精品一二三区| 大码成人一级视频| 少妇的逼好多水| 我要看日韩黄色一级片| 亚洲aⅴ乱码一区二区在线播放| 日韩免费高清中文字幕av| 乱系列少妇在线播放| 男人狂女人下面高潮的视频| 久久精品国产鲁丝片午夜精品| tube8黄色片| 亚洲精品一二三| h日本视频在线播放| 两个人的视频大全免费| 亚洲欧美精品专区久久| 日韩精品有码人妻一区| 五月玫瑰六月丁香| 一级毛片久久久久久久久女| 亚洲高清免费不卡视频| 国产 精品1| 国产精品蜜桃在线观看| 又黄又爽又刺激的免费视频.| 18+在线观看网站| 国产精品一区二区三区四区免费观看| 日本-黄色视频高清免费观看| 在线观看av片永久免费下载| 精品人妻视频免费看| 成人国产av品久久久| 日韩一区二区三区影片| 高清毛片免费看| 精品一品国产午夜福利视频| 又爽又黄a免费视频| 午夜免费男女啪啪视频观看| 网址你懂的国产日韩在线| 成人毛片a级毛片在线播放| 哪个播放器可以免费观看大片| 一本—道久久a久久精品蜜桃钙片| 激情 狠狠 欧美| 久久午夜福利片| 一级黄片播放器| 欧美成人午夜免费资源| 午夜视频国产福利| 国产精品.久久久| 日韩一本色道免费dvd| 精品国产三级普通话版| 有码 亚洲区| 亚洲成人手机| 99热6这里只有精品| 久久精品国产鲁丝片午夜精品| 午夜免费男女啪啪视频观看| 久久女婷五月综合色啪小说| 日韩av在线免费看完整版不卡| 在线天堂最新版资源| 亚洲av日韩在线播放| 黄片无遮挡物在线观看| av免费在线看不卡| 欧美一区二区亚洲| 国产亚洲精品久久久com| 国产一级毛片在线| 青春草视频在线免费观看| 国产欧美亚洲国产| 国产女主播在线喷水免费视频网站| 哪个播放器可以免费观看大片| 大片电影免费在线观看免费| 最近中文字幕高清免费大全6| 在线 av 中文字幕| 99热这里只有精品一区| 国产午夜精品一二区理论片| 精品国产一区二区三区久久久樱花 | 超碰97精品在线观看| 久久久久久久国产电影| 少妇的逼水好多| 国产有黄有色有爽视频| 精品人妻视频免费看| 高清av免费在线| 国产免费视频播放在线视频| 99热6这里只有精品| 干丝袜人妻中文字幕| 蜜桃亚洲精品一区二区三区| 国产成人精品一,二区| 人妻制服诱惑在线中文字幕| 中文资源天堂在线| 边亲边吃奶的免费视频| 久久久久久久久大av| 久久综合国产亚洲精品| 久久精品国产亚洲av天美| 国产高清不卡午夜福利| 在线观看免费日韩欧美大片 | 国产欧美日韩一区二区三区在线 | 亚洲av福利一区| 国产精品久久久久久av不卡| 99热6这里只有精品| 一级爰片在线观看| 看十八女毛片水多多多| 亚洲精品,欧美精品| 国产亚洲欧美精品永久| 午夜福利视频精品| 性色av一级| 日韩一区二区视频免费看| 国产男女超爽视频在线观看| 精品人妻视频免费看| 欧美少妇被猛烈插入视频| 美女cb高潮喷水在线观看| 亚洲人成网站在线播| 久久av网站| 在线观看av片永久免费下载| 色吧在线观看| 久久国产亚洲av麻豆专区| 一级黄片播放器| 免费人成在线观看视频色| 99精国产麻豆久久婷婷| 日韩中字成人| 偷拍熟女少妇极品色| 最近2019中文字幕mv第一页| 国产一区有黄有色的免费视频| 成人亚洲精品一区在线观看 | 国产亚洲午夜精品一区二区久久| 性色avwww在线观看| 九九爱精品视频在线观看| 99re6热这里在线精品视频| 男人舔奶头视频| 一级片'在线观看视频| videossex国产| 午夜精品国产一区二区电影| 国产伦在线观看视频一区| 男女边摸边吃奶| 少妇的逼好多水| 国产亚洲精品久久久com| av黄色大香蕉| 国产精品.久久久| 精华霜和精华液先用哪个| 丰满迷人的少妇在线观看| 狂野欧美激情性bbbbbb| 久久婷婷青草| 人妻夜夜爽99麻豆av| 黑人高潮一二区| 一本久久精品| 精品人妻一区二区三区麻豆| 亚洲成色77777| 又大又黄又爽视频免费| av在线播放精品| 美女视频免费永久观看网站| 久久av网站| 国产精品福利在线免费观看| 伦理电影免费视频| 欧美xxxx性猛交bbbb| 精品视频人人做人人爽| 亚洲av日韩在线播放| 精品国产三级普通话版| 最近中文字幕高清免费大全6| 超碰97精品在线观看| 国产毛片在线视频| 自拍偷自拍亚洲精品老妇| 激情 狠狠 欧美| 韩国av在线不卡| 亚洲欧美成人精品一区二区| 日日啪夜夜撸| 噜噜噜噜噜久久久久久91| 少妇熟女欧美另类| h视频一区二区三区| 成人毛片a级毛片在线播放| 国产国拍精品亚洲av在线观看| 久久久久网色| 亚洲丝袜综合中文字幕| 国产爱豆传媒在线观看| 国国产精品蜜臀av免费| 97精品久久久久久久久久精品| 另类亚洲欧美激情| 久久久久精品性色| 热re99久久精品国产66热6| 欧美+日韩+精品| 91aial.com中文字幕在线观看| 久久综合国产亚洲精品| 成人二区视频| 日韩国内少妇激情av| 成人黄色视频免费在线看| 久久精品久久精品一区二区三区| 晚上一个人看的免费电影| 亚洲中文av在线| 精品久久久久久电影网| 精品久久久久久久末码| 伊人久久国产一区二区| 一级毛片黄色毛片免费观看视频| 亚洲精品乱久久久久久| 在现免费观看毛片| 精品一品国产午夜福利视频| 91午夜精品亚洲一区二区三区| 搡老乐熟女国产| 亚洲av综合色区一区| 伊人久久精品亚洲午夜| 男女下面进入的视频免费午夜| 国产成人a∨麻豆精品| 国产日韩欧美亚洲二区| 欧美xxⅹ黑人| 国产亚洲欧美精品永久| 美女国产视频在线观看| 高清欧美精品videossex| 成人综合一区亚洲| 亚洲激情五月婷婷啪啪| 免费大片18禁| 国产欧美日韩一区二区三区在线 | 一二三四中文在线观看免费高清| 内地一区二区视频在线| 欧美日韩综合久久久久久| 大码成人一级视频| 最近的中文字幕免费完整| 人人妻人人爽人人添夜夜欢视频 | 国产精品不卡视频一区二区| 国产真实伦视频高清在线观看| 国产免费视频播放在线视频| 精品亚洲成a人片在线观看 | 一区二区三区免费毛片| 欧美一级a爱片免费观看看| 在线观看av片永久免费下载| 成人漫画全彩无遮挡| 国产91av在线免费观看| 你懂的网址亚洲精品在线观看| 国产亚洲欧美精品永久| 日韩一区二区三区影片| 免费大片黄手机在线观看| 亚洲国产精品专区欧美| av不卡在线播放| 久久毛片免费看一区二区三区| 精品人妻视频免费看| 亚洲成人手机| 青春草视频在线免费观看| 免费人妻精品一区二区三区视频| 亚洲色图综合在线观看| 国产 一区 欧美 日韩| 国产高潮美女av| 超碰av人人做人人爽久久| 亚洲图色成人| 我的老师免费观看完整版| 国产精品精品国产色婷婷| 内地一区二区视频在线| 寂寞人妻少妇视频99o| 青春草亚洲视频在线观看| 中文字幕制服av| 国产免费福利视频在线观看| 青春草亚洲视频在线观看| 免费黄网站久久成人精品| 国产免费福利视频在线观看| 青春草亚洲视频在线观看| 九九爱精品视频在线观看| 我的老师免费观看完整版| 天堂8中文在线网| 精品亚洲成国产av| 婷婷色麻豆天堂久久| 在线观看免费高清a一片| 欧美97在线视频| 少妇人妻一区二区三区视频| 插阴视频在线观看视频| 免费看不卡的av| 国产伦精品一区二区三区视频9| 久久久久网色| 不卡视频在线观看欧美| 亚洲精品色激情综合| videos熟女内射| 免费观看在线日韩| 久久综合国产亚洲精品| 新久久久久国产一级毛片| 男人舔奶头视频| 精品久久久久久久末码| 少妇的逼水好多| 菩萨蛮人人尽说江南好唐韦庄| 国产精品99久久99久久久不卡 | 久久久久久久久久成人| 成人国产av品久久久| 搡老乐熟女国产| 精品亚洲乱码少妇综合久久| 亚洲精品自拍成人| 好男人视频免费观看在线| 久久久欧美国产精品| 少妇人妻久久综合中文| 韩国av在线不卡| 欧美日韩综合久久久久久| 国产精品一区二区在线不卡| 高清在线视频一区二区三区| 日日啪夜夜撸| 国产在视频线精品| 久久久久久久久久成人| xxx大片免费视频| 晚上一个人看的免费电影| 欧美精品一区二区大全| 国产成人免费无遮挡视频| 久久久精品免费免费高清| 国产精品av视频在线免费观看| 在线免费观看不下载黄p国产| 国产av精品麻豆| 在线观看美女被高潮喷水网站| 一级爰片在线观看| 3wmmmm亚洲av在线观看| 熟女人妻精品中文字幕| 国产高清不卡午夜福利| 久久综合国产亚洲精品| 欧美97在线视频| 亚洲av成人精品一二三区| 麻豆乱淫一区二区| 亚洲欧美一区二区三区黑人 | 内射极品少妇av片p| 国产一区亚洲一区在线观看| 久久久久久久大尺度免费视频| 午夜福利高清视频| 能在线免费看毛片的网站| 欧美人与善性xxx| 国国产精品蜜臀av免费| 99久久精品一区二区三区| 免费久久久久久久精品成人欧美视频 | 色综合色国产| 亚洲精品国产色婷婷电影| tube8黄色片| 99热国产这里只有精品6| 麻豆乱淫一区二区| 国产精品一区二区性色av| 美女内射精品一级片tv| 人人妻人人爽人人添夜夜欢视频 | 欧美日韩一区二区视频在线观看视频在线| 我要看日韩黄色一级片| 日韩视频在线欧美| 色婷婷av一区二区三区视频| 国产精品伦人一区二区| 天天躁夜夜躁狠狠久久av| 国产在视频线精品| 女人久久www免费人成看片| 99九九线精品视频在线观看视频| 美女中出高潮动态图| 国产成人免费观看mmmm| 中文字幕亚洲精品专区| 亚洲精品久久久久久婷婷小说| 热99国产精品久久久久久7| 黄色日韩在线| 国产高清有码在线观看视频| 欧美高清成人免费视频www| 啦啦啦在线观看免费高清www| 精品亚洲乱码少妇综合久久| av国产免费在线观看| 久久精品国产亚洲网站| 边亲边吃奶的免费视频| 春色校园在线视频观看| h日本视频在线播放| 国产高清有码在线观看视频| 中文资源天堂在线| 欧美少妇被猛烈插入视频| 亚洲三级黄色毛片| 一本—道久久a久久精品蜜桃钙片| 午夜精品国产一区二区电影| av播播在线观看一区| 国产中年淑女户外野战色| 国产爱豆传媒在线观看| 在现免费观看毛片| 一级毛片黄色毛片免费观看视频| 男男h啪啪无遮挡| 久久久久国产网址| 天美传媒精品一区二区| 久久亚洲国产成人精品v| 丰满乱子伦码专区| 国产欧美日韩精品一区二区| 亚洲av福利一区| 亚洲av成人精品一区久久| 我的女老师完整版在线观看| av线在线观看网站| 亚洲av成人精品一二三区| 女的被弄到高潮叫床怎么办| 亚洲欧美日韩无卡精品| 建设人人有责人人尽责人人享有的 | 黄色日韩在线| 91精品国产国语对白视频| 免费大片黄手机在线观看| 久久99热这里只频精品6学生| 少妇的逼水好多| 免费av中文字幕在线| 秋霞伦理黄片| 男女边吃奶边做爰视频| 久久婷婷青草| 一级a做视频免费观看| 日韩一区二区视频免费看| 九色成人免费人妻av| 免费人成在线观看视频色| 国产亚洲91精品色在线| 久久国产精品男人的天堂亚洲 | 久久久久久伊人网av| 国产乱人偷精品视频| 色婷婷av一区二区三区视频| 亚洲精品一区蜜桃| 精品一区二区免费观看| 日日啪夜夜爽| 成人国产av品久久久| av播播在线观看一区| 久久精品久久久久久久性| 国产一区二区三区av在线| 亚洲精品456在线播放app| 哪个播放器可以免费观看大片| 国产精品久久久久久久久免| 精华霜和精华液先用哪个| 国产精品蜜桃在线观看| 久久精品久久久久久噜噜老黄| 久久影院123| 伦精品一区二区三区| 精品少妇久久久久久888优播| 人妻制服诱惑在线中文字幕| 高清不卡的av网站| 亚洲经典国产精华液单| 能在线免费看毛片的网站| 免费观看在线日韩|