SUSHI的源码及方案解析三(uniswap部分)
Ps1:uniswap.inf如果运行报错则输入:
echo
fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf &&
sudo sysctl -p
ps2:目前感觉并不是那么简单,应该还有更复杂的内容。:所以暂时告一个段落,目前不打算继续做这个,太复杂了。
关于uniswap的部分智能合约说明(非原创)
Uniswap V2 Core (核心合约) 是至关重要的 Uniswap V2 智能合约,包括:
UniswapV2Pair.sol,用于实现核心的代币兑换和流动性提供功能;
UniswapV2Factory.sol,用于为任何 ERC20/ERC20 代币交易对部署 UniswapV2Pair.sol 合约
Uniswap V2 Core 在设计上是极简主义的,去掉了所有的不必要逻辑,这些逻辑对于确保其资金池中的流动性并不是严格必需的。与交易员安全性或易用性相关的逻辑必须在外部助手合约 (external helper contracts) 中实现。由于外部助手合约是可以在无需迁移流动性的情况下进行改进和替换,这就提升了 Uniswap 的灵活性和模块性。
Uniswap V2 Periphery (外部合约) 是一组最初的助手合约,包括:
1个路由合约 (router contract),用于在安全兑换、流动性增加或移除时执行所需的安全性检查;
1个迁移者合约 (migrator contract),可以从 Uniswap V1 中移除流动性,并通过单笔交易将这些流动性存入 Uniswap V2 中;
1个 库合约 (library contract),可以用于创建其他助手合约;
1个示例预言机合约 (oracle contract),可以用于通过 Uniswap V2 累计价格创建一个简单的 TWAP (时间加权平均价格);
1个示例 Flash Swap 合约 (flash swap contract),可以从 Uniswap V2 取出 ERC20 代币,执行任意代码,然后支付费用。
备注:上方描述为外部合约仅作为用于说明的“示例”,不应在实际交易中使用。
虽然这是一个巨大的改进,但在 Uniswap 上进行搭建的开发者需要意识到,Uniswap V2 引入了一些全新的智能合约模式。
Uniswap V2 Core (核心合约) 使用 WETH 而非 ETH。路由合约可以实现 ETH 和 WETH 之间的转换,这允许用户直接使用 ETH;
核心合约在内部存储 ERC20 代币余额,而不是依赖于存储在该 ERC20 代币合约中的余额;
核心合约不再在 msg.sender 上调用 transferFrom。在调用兑换、铸造或销毁的函数之前,ERC20 代币应该直接通过某个路由合约发送至核心合约。
核心合约将根据其当前的余额和存储的余额之间的差额,来决定发往核心合约中的 ERC20 代币的数量。
核心合约不再返回给定输入量的 ERC20 代币的最大数量。相反,路由合约必须指定其 ERC20 代币的数量。核心合约将在扣除 3% 的任何输入量之后发送该代币数量;
Core不再返回给定输入量的ERC20令牌的最大数量。相反,路由器必须指定它想要的ERC20令牌的数量。核心将发送这个数字,只要保持不变后,扣除0.3%的任何输入金额。
路由合约应该处理有关滑点安全性检查和多跳交易 (multihop trades) 的逻辑。
更多的细节信息请阅读正在制作中的 Uniswap V2 文档的架构部分,或者阅读 Core 合约和外部合约部分。
技术改进
Uniswap V2 包含了许多重大的改进和提升,包括:
智能合约使用 Solidity 而非 Vyper 编写;
使用 CREATE2,使得流动性池地址基于 ERC20 代币交易对来确定;
Uniswap V2 适当地处理在 Uniswap V1 上的 “missing return” ERC20 代币,比如 USDT 和 OMG。
内置的 metaTransaction “批准” 流动性代币的函数
使用 mutex (增加支持 ERC777 和其他非标准的 ERC20 代币) 来提升重入攻击保护;
修复了 Uniswap V1 在失败的交易中使用所有剩余 Gas 的 bug;
更多描述性错误消息。上述 bug 导致失败的交易只返回错误 “Bad Jump Destination”。