海外版量化合約/秒合約/合約量化/永續合約/交易所繫統開發(多語言)及原始碼功能

xiaofufu發表於2023-02-21

那麼Web3資料板塊如何重塑資料價值呢?主要有以下三個方面:

  它使資料透明和防篡改。

  在Web2的世界中,應用程式透過提供免費服務獲取使用者資料,然後壟斷這些資料以獲取利潤並建立自己的業務。資料儲存在他們的中央伺服器上,外界無法訪問。無法知道儲存了哪些資料,以及以何種方式和粒度儲存。此外,如果這些應用程式受到攻擊或主動終止其服務,使用者的資料將在一夜之間丟失。但是,以區塊鏈技術為底層Web3框架,鏈上資料公開、透明、不可篡改,實現了使用者的獨立性和安全性。

  打破資料孤島並提高互操作性。

  使用Web2,使用者每次使用新應用程式時都必須完成註冊過程。這是因為每個應用程式都有自己獨立的資料庫,無法連線到其他應用程式。使用者資料是碎片化的,無法跨平臺複用或整合。在Web3的世界裡,使用者只需要一個地址就可以訪問和使用各種去中心化應用;該地址的每一筆鏈上交易都可以使用相應的資料。應用程式許可權是不必要的。

  透過代幣經濟更好地分配價值。

  資料創造的價值如何分配給產生它的個人,是Web3需要回答的一個重要問題。目前看來,不斷髮展的通證經濟才是實現價值再分配的核心路徑。

core偏核心邏輯,流程及案例I35軟體7O98開發O7I8,單個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(交換)。

  1. add liqudity

增加流動性,就是同時提供兩種代幣。因為代幣有可能是ETH,針對不同情況有不同的介面。邏輯類似。

function addLiquidity(    address tokenA,    address tokenB,
    uint amountADesired,
    uint amountBDesired,
    uint amountAMin,
    uint amountBMin,    address to,
    uint deadline
) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity)

add liqudity檢視之前有沒有建立相應的交易對。如果有相應的交易對,確定目前的兌換比例在希望的範圍內(期望amountDesired和不低於amountMin)。如果兌換比例OK,將相應的代幣轉入對應的交易對池子,並呼叫其的mint函式。

  1. remove liqudity

提供流動性的相反的操作就是抽取流動性。也就是說,流動性提供者不再提供相應的流動性:

function removeLiquidity(    address tokenA,    address tokenB,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,    address to,
    uint deadline
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {

liquidity是抽取的流動性的量。amountMin是抽取代幣的最小的個數。to是抽取代幣的目標地址。deadline是個有意思的設計:抽取的操作有時效性。超過了一定的deadline(區塊高度),這次抽取操作看成無效。

先收回需要抽取的Token,並且銷燬:

IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);

  1. swap

swap是普通使用者進行代幣交易的操作。普通使用者透過swap操作實現兩種token之間的交易。

function swapExactTokensForTokens(

uint amountIn,
uint amountOutMin,
address[] calldata path,address to,
uint deadline

) 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函式):

function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
    require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
    require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');    uint amountInWithFee = amountIn.mul(997);    uint numerator = amountInWithFee.mul(reserveOut);    uint denominator = reserveIn.mul(1000).add(amountInWithFee);
    amountOut = numerator / denominator;
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956839/viewspace-2936093/,如需轉載,請註明出處,否則將追究法律責任。

相關文章