dapp元宇宙鏈遊開發【詳情】技術實現及原始碼實現方式
什麼是dApp和Web3應用?
如果不提及dApp,關於Web3的討論就不會完整。簡而言之,dApp或去中心化應用程式是Web3革命的支柱。術語“Web3應用程式”、“Web3應用程式”、“去中心化應用程式”、“dApps”或“Web3 dApps”在很大程度上都是同義詞。它們都指作為Web3一部分的分散的、通常基於區塊鏈的應用程式。
那麼,什麼是Web3應用程式?許多dApp或Web3應用程式的一個組成部分是所謂的“智慧合約”。有區塊鏈技術經驗的人可能熟悉智慧合約的概念。智慧合約本質上是自動執行的軟體協議,是在以太坊區塊鏈等區塊鏈上執行的程式碼片段。這些會自動“執行”,或在滿足一組相關條款時執行。因此,這些“合約”可以自動驗證和執行不同方之間的交易。
內部函式(僅供合約內部呼叫)
_swapSupportingFeeOnTransferTokens
程式碼速瀏覽
function _swapSupportingFeeOnTransferTokens(address[]memory path,address _to)internal virtual{
for(uint i;i<path.length-1;i++){ DAPP鏈遊開發176應用0206詳細5616
(address input,address output)=(path<i>,path[i+1]);
(address token0,)=UniswapV2Library.sortTokens(input,output);
IUniswapV2Pair pair=IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output));
uint amountInput;
uint amountOutput;
{
(uint reserve0,uint reserve1,)=pair.getReserves();
(uint reserveInput,uint reserveOutput)=input==token0?(reserve0,reserve1):(reserve1,reserve0);
amountInput=IERC20(input).balanceOf(address(pair)).sub(reserveInput);
amountOutput=UniswapV2Library.getAmountOut(amountInput,reserveInput,reserveOutput);
}
(uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOutput):(amountOutput,uint(0));
address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;
pair.swap(amount0Out,amount1Out,to,new bytes(0));
引數分析
函式swapETHForExactTokens的入參有2個,出參有0個,對應的解釋如下:
function _swapSupportingFeeOnTransferTokens( DAPP鏈遊開發威:wwqqyy420
address[]memory path,//交易路徑列表
address _to//交易獲得的token傳送到的地址
)internal virtual{
函式_swapSupportingFeeOnTransferTokens相比函式_swap為了支援path中有交易後可變數量的代幣,不需要輸入amounts,但需要額外做一些操作。
實現分析
……
{
//迴圈交易路徑列表
for(uint i;i<path.length-1;i++){
//從path中取出input和output
(address input,address output)=(path<i>,path[i+1]);
//從input和output中算出誰是token0
(address token0,)=UniswapV2Library.sortTokens(input,output);
//獲得input,output的流動池
IUniswapV2Pair pair=IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output));
uint amountInput;
uint amountOutput;
{
//獲取流動池庫存reserve0,reserve1
(uint reserve0,uint reserve1,)=pair.getReserves();
//如果input==token0,那麼(reserveInput,reserveOutput)就是(reserve0,reserve1);反之則相反
(uint reserveInput,uint reserveOutput)=input==token0?(reserve0,reserve1):(reserve1,reserve0);
//amountInput等於流動池餘額減去reserveInput
amountInput=IERC20(input).balanceOf(address(pair)).sub(reserveInput);
//獲取amountOutput
amountOutput=UniswapV2Library.getAmountOut(amountInput,reserveInput,reserveOutput);
}
//如果input==token0,那麼amount0Out就是0,amount1Out就是amountOut;反之則相反
(uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOutput):(amountOutput,uint(0));
//如果這是最後的一筆交易,那麼to地址就是_to,否則to地址是下一筆交易的流動池地址
address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;
//執行input和output的交易
pair.swap(amount0Out,amount1Out,to,new bytes(0));
總結
可以看到,因為沒有amounts,需要使用流動池餘額減去庫存來計算amountInput。
外部函式(僅供合約外部呼叫)
swapExactTokensForTokensSupportingFeeOnTransferTokens
程式碼速瀏覽
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[]calldata path,
address to,
uint deadline
)external virtual override ensure(deadline){
TransferHelper.safeTransferFrom(
path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amountIn
);
uint balanceBefore=IERC20(path[path.length-1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path,to);
require(
IERC20(path[path.length-1]).balanceOf(to).sub(balanceBefore)>=amountOutMin,
'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT'
引數分析
函式swapExactTokensForTokensSupportingFeeOnTransferTokens的入參有5個,出參有0個,對應的解釋如下:
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,//交易支付代幣數量
uint amountOutMin,//交易獲得代幣最小值
address[]calldata path,//交易路徑列表
address to,//交易獲得的token傳送到的地址
uint deadline//過期時間
)external virtual override ensure(deadline){
函式swapExactTokensForTokensSupportingFeeOnTransferTokens相比函式swapExactTokensForTokens,少了amounts,因為交易後可變數量的代幣不能做amounts的預測。
實現分析
……
//檢查交易是否過期
ensure(deadline)
{
//將amountIn數量的path[0]代幣從使用者賬戶中轉移到path[0],path[1]的流動池
TransferHelper.safeTransferFrom(
path[0],msg.sender,UniswapV2Library.pairFor(factory,path[0],path[1]),amountIn
);
//記錄to地址path[path.length-1]代幣的餘額
uint balanceBefore=IERC20(path[path.length-1]).balanceOf(to);
//按path列表執行交易集合
_swapSupportingFeeOnTransferTokens(path,to);
//如果to地址獲得的代幣數量小於amountOutMin,交易失敗
require(
IERC20(path[path.length-1]).balanceOf(to).sub(balanceBefore)>=amountOutMin,
'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT'
);
}
該函式適用於支付確定數量的代幣,獲得不定數量的代幣,且在path路徑列表中有交易後數量可變的代幣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70029396/viewspace-2953408/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DAPP質押挖礦模式系統開發|DAPP質押拆分模式開發
- 技術乾貨|如何利用 ChunJun 實現資料離線同步?
- 區塊鏈技術|智慧合約證券委託交易平臺開發技術應用
- DAPP字母幣(雙幣)質押LP挖礦系統開發
- DAPP互助分紅模式系統開發方案
- HKT雲算力挖礦/HKT公鏈系統開發/質押挖礦技術詳情
- HKT(公鏈)算力挖礦系統技術開發程式
- 5月25日14:00 直播預告 | 一場不容錯過的“遊戲安全技術分享會”
- 如何進行測試分析與設計-HTSM啟發式測試策略模型 | 京東雲技術團隊
- mate雲端元宇宙系統智慧合約鏈遊開發技術
- 智慧合約DAPP挖礦系統開發應用
- PAXG算力挖礦/流動性質押挖礦節點/系統開發/DAPP合約/方案詳情/成熟技術/原始碼
- NFT質押挖礦系統開發/質押DAPP開發案例
- NFT遊戲系統開發/遊戲開發技術
- 精益管理:是門技術,還是門社會科學?
- DAPP/Defi/LP去中心化流動性質押挖礦生息系統技術開發
- Defi智慧合約DAPP/LP流動性質押挖礦系統技術開發
- Defi/DAPP/LP代幣流動性質押挖礦系統開發(技術元件)