在Web2的世界中,应用程序通过提供免费服务获取用户数据,然后垄断这些数据以获取利润并建立自己的业务。数据存储在他们的中央服务器上,外界无法访问。无法知道存储了哪些数据,以及以何种方式和粒度存储。此外,如果这些应用程序受到攻击或主动终止其服务,用户的数据将在一夜之间丢失。但是,以区块链技术为底层Web3框架,链上数据公开、透明、不可篡改,实现了用户的独立性和安全性。
打破数据孤岛并提高互操作性。
使用Web2,用户每次使用新应用程序时都必须完成注册过程。这是因为每个应用程序都有自己独立的数据库,无法连接到其他应用程序。用户数据是碎片化的,无法跨平台复用或整合。在Web3的世界里,用户只需要一个地址就可以访问和使用各种去中心化应用;该地址的每一笔链上交易都可以使用相应的数据。应用程序权限是不必要的。
通过代币经济更好地分配价值。
数据创造的价值如何分配给产生它的个人,是Web3需要回答的一个重要问题。目前看来,不断发展的通证经济才是实现价值再分配的核心路径。
core偏核心逻辑,单个swap的逻辑。periphery偏外围服务,一个个swap的基础上构建服务。单个swap,两种代币形成的交易对,俗称“池子”。每个交易对有一些基本属性:reserve0/reserve1以及total supply。reserve0/reserve1是交易对的两种代币的储存量。total supply是当前流动性代币的总量。每个交易对都对应一个流动性代币(LPT - liquidity provider token)。简单的说,LPT记录了所有流动性提供者的贡献。所有流动性代币的总和就是total supply。Uniswap协议的思想是reserve0*reserve1的乘积不变。
Periphery逻辑
核心逻辑实现在UniswapV2Router02.sol中。称为Router,因为Periphery实现了“路由”,支持各个swap之间的连接。基本上实现了三个功能:1/ add liquidity(增加流动性)2/remove liqudity (抽取流动性) 3/ swap(交换)。
提供流动性的相反的操作就是抽取流动性。也就是说,流动性提供者不再提供相应的流动性:
functionremoveLiquidity(addresstokenA,addresstokenB,
uintliquidity,
uintamountAMin,
uintamountBMin,addressto,
uintdeadline【更全面的开发源码搭建可看我昵称】
)publicvirtualoverrideensure(deadline)returns(uintamountA,uintamountB){
liquidity是抽取的流动性的量。amountMin是抽取代币的最小的个数。to是抽取代币的目标地址。deadline是个有意思的设计:抽取的操作有时效性。超过了一定的deadline(区块高度),这次抽取操作看成无效。
swap是普通用户进行代币交易的操作。普通用户通过swap操作实现两种token之间的交易。
function swapExactTokensForTokens(
uintamountIn,
uintamountOutMin,
address[]calldatapath,addressto,
uintdeadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
Uniswap支持多种代币的交换。具体的含义是,Uniswap提供了多级交易池的路由功能。举个例子,已有两个交易对TokenA-TokenB,以及TokenB-TokenC,通过swap接口,可以实现TokenA-TokenC的交换,其中经过的TokenA-TokenB,TokenB-TokenC,称为路径(path)。amountIn是路径中的第一个代币的数量,amountOutMin是期望的交换后的最少的数量。
amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);【更全面的开发源码搭建可看我昵称】
require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
amounts是每个路径上的交换后的数量。amounts[amounts.length-1]也就是最后一条路径的输出数量。注意,UniswapV2Library.getAmountsOut的实现(在获取每个交易对的reserve信息后,调用getAmountOut函数):