NFT具有唯一、可验证、透明公开、不可篡改、不可分割等特征:
唯一性:NFT以智能合约的形式发行,智能合约记录了每个NFT独一无二的Token ID、资源存储地址及各项信息,每个NFT在区块链上都具有唯一性;
可验证性:基于区块链的存储功能,NFT及其元数据和所有权能够进行信息溯源,可实现公开验证;
透明公开:NFT相关的发行和购买记录均可在链上公开查询,每一个NFT都包含最新所有权信息,这些信息对于用户是公开透明的;
不可篡改性:根据区块链特性,NFT元数据及其交易记录是持续储存的,一旦交易被确认就不能被操纵或篡改;
不可分割性:NFT数据通过智能合约存储在区块链上,不可分割。每个NFT都拥有固定的信息,不可随意分割。
内部函数(仅供合约内部调用)
_swap
function _swap(uint[]memory amounts,address[]memory path,address _to)internal virtual{
for(uint i;i<path.length-1;i++){
(address input,address output)=(path<i>,path[i+1]);
(address token0,)=UniswapV2Library.sortTokens(input,output);
uint amountOut=amounts[i+1];
(uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOut):(amountOut,uint(0));
address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;
IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output)).swap(
amount0Out,amount1Out,to,new bytes(0)
);
}
}
参数分析
函数_swap的入参有3个,出参有0个,对应的解释如下:
function _swap(
uint[]memory amounts,//交易期望数量列表
address[]memory path,//交易路径列表
address _to//交易获得的token发送到的地址
)internal virtual{
...
}
函数_swap实现了由多重交易组成的交易集合。path数组里定义了执行代币交易的顺序,amounts数组里定义了每次交换获得代币的期望数量,_to则是最后获得代币发送到的地址。
实现分析
...
{
//循环交易路径列表
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);
//期望交易获得的代币数量
uint amountOut=amounts[i+1];
//如果input==token0,那么amount0Out就是0,amount1Out就是amountOut;反之则相反
(uint amount0Out,uint amount1Out)=input==token0?(uint(0),amountOut):(amountOut,uint(0));
//如果这是最后的一笔交易,那么to地址就是_to,否则to地址是下一笔交易的流动池地址
address to=i<path.length-2?UniswapV2Library.pairFor(factory,output,path[i+2]):_to;
//执行input和output的交易
IUniswapV2Pair(UniswapV2Library.pairFor(factory,input,output)).swap(
amount0Out,amount1Out,to,new bytes(0)