智能合约看上去就是一段计算机执行程序,满足可准确自动执行即可。那么为什么用传统的技术很难实现,而需要用***技术等新技术呢?
传统技术通过软件限制、性能优化等方法,也无法实现***的以下特性:
1、数据无法删除、
2、去中心化
基于***技术的智能合约不仅可以发挥智能合约在成本效率方面的优势,可以避免恶意行为对合约正常执行的干扰。将智能合约以数字化的形式写入***中,由***技术的特性保障存储、读取、执行整个过程透明可跟踪、不可攥改。由***自带的共识算法构建出一套状态机系统,使得智能合约能够高效地运行。
//returnssortedtokenaddresses,usedtohandlereturnvaluesfrompairssortedinthisorder
//两个地址排序
functionsortTokens(addresstokenA,addresstokenB)internalpurereturns(addresstoken0,addresstoken1){
require(tokenA!=tokenB,'UniswapV2Library:IDENTICAL_ADDRESSES');
(token0,token1)=tokenA<tokenB?(tokenA,tokenB):(tokenB,tokenA);
require(token0!=address(0),'UniswapV2Library:ZERO_ADDRESS');
}
//calculatestheCREATE2addressforapairwithoutmakinganyexternalcalls
//计算交易对地址,注意这个initcodehash...这是个坑
functionpairFor(addressfactory,addresstokenA,addresstokenB)internalpurereturns(addresspair){
(addresstoken0,addresstoken1)=sortTokens(tokenA,tokenB);
pair=address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0,token1)),
hex'de683***97cb455dd2d3ea50f1f95386fdeca75180cc01bb6b12207c44272e17'//initcodehash
))));
}
//fetchesandsortsthereservesforapair
//获取当前储备量,返回值会根据你输入的token排序
functiongetReserves(addressfactory,addresstokenA,addresstokenB)internalviewreturns(uintreserveA,uintreserveB){
(addresstoken0,)=sortTokens(tokenA,tokenB);
(uintreserve0,uintreserve1,)=IUniswapV2Pair(pairFor(factory,tokenA,tokenB)).getReserves();
(reserveA,reserveB)=tokenA==token0?(reserve0,reserve1):(reserve1,reserve0);
}
//givensomeamountofanassetandpairreserves,returnsanequivalentamountoftheotherasset
//添加流动性时,通过tokenA输入额,计算tokenB需要输入多少
functionquote(uintamountA,uintreserveA,uintreserveB)internalpurereturns(uintamountB){
require(amountA>0,'UniswapV2Library:INSUFFICIENT_AMOUNT');
require(reserveA>0&&reserveB>0,'UniswapV2Library:INSUFFICIENT_LIQUIDITY');
amountB=amountA.mul(reserveB)/reserveA;
}
//givenaninputamountofanassetandpairreserves,returnsthemaximumoutputamountoftheotherasset
//通过in计算out(后面详细说明)
functiongetAmountOut(uintamountIn,uintreserveIn,uintreserveOut)internalpurereturns(uintamountOut){
require(amountIn>0,'UniswapV2Library:INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn>0&&reserveOut>0,'UniswapV2Library:INSUFFICIENT_LIQUIDITY');
uintamountInWithFee=amountIn.mul(997);
uintnumerator=amountInWithFee.mul(reserveOut);
uintdenominator=reserveIn.mul(1000).add(amountInWithFee);
amountOut=numerator/denominator;
}
//givenanoutputamountofanassetandpairreserves,returnsarequiredinputamountoftheotherasset
//通过out计算in(后面详细说明)
functiongetAmountIn(uintamountOut,uintreserveIn,uintreserveOut)internalpurereturns(uintamountIn){
require(amountOut>0,'UniswapV2Library:INSUFFICIENT_OUTPUT_AMOUNT');
uintnumerator=reserveIn.mul(amountOut).mul(1000);
uintdenominator=reserveOut.sub(amountOut).mul(997);
amountIn=(numerator/denominator).add(1);