SUSHI的源码及方案解析三(uniswap部分)

我在前两篇说的是sushi的流动性挖矿部分。我们观看真正的 sushi 合约,里面还包含了uniswap部分。因为uniswap的资料比较多,所以我在本节主要是做技术上的整理与说明

首先说一下。我的开发项目是智能设备自治,其中有一个很关键的部分就是,物联网设备之前如何进行有价的信息交换。 我在前两篇说的是sushi的流动性挖矿部分。我们观看真正的 sushi 合约,里面还包含了uniswap部分。因为uniswap的资料比较多,所以我在本节主要是做技术上的整理与说明,有一些内容是引用的,特此说明。 # Uniswap的说明 对于相关的合约内容,研究的相关文章不少,我就不做描述了。我说一下怎么搭建前端。 安装uniswap的交易所网站 npm install -g yarn 然后修改环境配置文件 cp .env .env.local Change REACT_APP_NETWORK_ID to "{3}"//ropsten Change REACT_APP_NETWORK_URL to e.g. " [https://ropsten.infura.io/v3/527e056aa313441780026e40c7e8a74a](https://ropsten.infura.io/v3/527e056aa313441780026e40c7e8a74a)}" 然后就是yarn Yarn start 一会就可以访问3000端口 如果想编译就是yarn build //然后就是曲折的代币获取流程了 首先安装的时候不用管,第一次存币的时候会有一个panding,赶紧点击进去。 是一个tx Tx里面有四项,第四项就是流动挖矿的获得的token。 那个地址都是零,不可以点,可以点的是UNI-V2,点进去的地址就是流动挖矿的token。0x4ec555944a1a09cb572aab52e2515264b3ff39c7 然后把这个地址添加到mesta里面就识别了。 总结:整个上面就是通过使用uniswap的ropsten前端来实现直接对uniswap的调用。 下面就是uniswap.info的建立流程了,比实际认为的难了很多。 https://github.com/Uniswap/uniswap-info 步骤是三个: 1. 做自己的subgraph(但目前没有资料) https://github.com/CryptoManiacsZone/mooniswap-v2-subgraph https://github.com/Uniswap/uniswap-v2-subgraph 2. 修改下面说的三个内容 这里的重点是三部分: 第一是uniswap.info里面的factory,weth的0x要改 第二是所有的ethscan改为ropsten.ethscan 第三是最重要的就是,src\apollo里面的client.js,https://api.thegraph.com/subgraphs/name/ianlapham/uniswap 3. 按readme里面进行设置和编译运行 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”。 # 由imBTC引起的攻击事件(非原创) > Uniswap攻击事件是由于imBTC采用ERC777标准,ERC777标准中原生地支持hook(钩子)机制的运行,而在imBTC实现过程中,并未在相应函数间加入互斥锁,从而出现了重入攻击漏洞。黑客正是利用该漏洞对Uniswap发起攻击,以几乎接近于0的成本获得了巨额的数字资产。 UTC时间2020年4月18日上午12:58:19发生了一起针对Uniswap imBTC流动池的重入漏洞攻击。 从技术上讲,这两起事件背后的主要逻辑是,兼容ERC777的“transferFrom()”的实现有一个回调机制。 # 简单总结 因为uniswap的资料非常多,所以我就不在这里过多的说明了。主要就三条。 1.对uniswap部分的克隆重点是在智能合约的理解,测试前端的安装,和代码分析方面。 2.因为erc777有一个回调函数,所以我们在对erc777的代码兼容过程中要考虑到足够的互斥。因为目前尽管主流是erc20,但在可以预期的未来,有很多新币都会用erc777,或者其他兼容erc20,但具有回调函数的协议。 我们不管是在做什么开发,都要充分考虑到这方面的问题。 3.sushi在早期只有一个流动性挖矿和一个token,后来又推出了社区治理,再后来又基于uniswap做了自己的交易所。近期又推出了一些新的功能,其中包含可以在其自行发布流动性挖矿的功能。如果大家对defi项目有兴趣,sushi是一个非常值得研究的项目。

首先说一下。我的开发项目是智能设备自治,其中有一个很关键的部分就是,物联网设备之前如何进行有价的信息交换。 我在前两篇说的是sushi的流动性挖矿部分。我们观看真正的 sushi 合约,里面还包含了uniswap部分。因为uniswap的资料比较多,所以我在本节主要是做技术上的整理与说明,有一些内容是引用的,特此说明。

Uniswap的说明

对于相关的合约内容,研究的相关文章不少,我就不做描述了。我说一下怎么搭建前端。 安装uniswap的交易所网站 npm install -g yarn 然后修改环境配置文件 cp .env .env.local Change REACT_APP_NETWORK_ID to "{3}"//ropsten Change REACT_APP_NETWORK_URL to e.g. " https://ropsten.infura.io/v3/527e056aa313441780026e40c7e8a74a}" 然后就是yarn Yarn start 一会就可以访问3000端口 如果想编译就是yarn build //然后就是曲折的代币获取流程了 首先安装的时候不用管,第一次存币的时候会有一个panding,赶紧点击进去。 是一个tx Tx里面有四项,第四项就是流动挖矿的获得的token。 那个地址都是零,不可以点,可以点的是UNI-V2,点进去的地址就是流动挖矿的token。0x4ec555944a1a09cb572aab52e2515264b3ff39c7 然后把这个地址添加到mesta里面就识别了。 总结:整个上面就是通过使用uniswap的ropsten前端来实现直接对uniswap的调用。 下面就是uniswap.info的建立流程了,比实际认为的难了很多。 https://github.com/Uniswap/uniswap-info 步骤是三个:

  1. 做自己的subgraph(但目前没有资料) https://github.com/CryptoManiacsZone/mooniswap-v2-subgraph https://github.com/Uniswap/uniswap-v2-subgraph
  2. 修改下面说的三个内容 这里的重点是三部分: 第一是uniswap.info里面的factory,weth的0x要改 第二是所有的ethscan改为ropsten.ethscan 第三是最重要的就是,src\apollo里面的client.js,https://api.thegraph.com/subgraphs/name/ianlapham/uniswap
  3. 按readme里面进行设置和编译运行 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”。

由imBTC引起的攻击事件(非原创)

Uniswap攻击事件是由于imBTC采用ERC777标准,ERC777标准中原生地支持hook(钩子)机制的运行,而在imBTC实现过程中,并未在相应函数间加入互斥锁,从而出现了重入攻击漏洞。黑客正是利用该漏洞对Uniswap发起攻击,以几乎接近于0的成本获得了巨额的数字资产。 UTC时间2020年4月18日上午12:58:19发生了一起针对Uniswap imBTC流动池的重入漏洞攻击。 从技术上讲,这两起事件背后的主要逻辑是,兼容ERC777的“transferFrom()”的实现有一个回调机制。

简单总结

因为uniswap的资料非常多,所以我就不在这里过多的说明了。主要就三条。 1.对uniswap部分的克隆重点是在智能合约的理解,测试前端的安装,和代码分析方面。 2.因为erc777有一个回调函数,所以我们在对erc777的代码兼容过程中要考虑到足够的互斥。因为目前尽管主流是erc20,但在可以预期的未来,有很多新币都会用erc777,或者其他兼容erc20,但具有回调函数的协议。 我们不管是在做什么开发,都要充分考虑到这方面的问题。 3.sushi在早期只有一个流动性挖矿和一个token,后来又推出了社区治理,再后来又基于uniswap做了自己的交易所。近期又推出了一些新的功能,其中包含可以在其自行发布流动性挖矿的功能。如果大家对defi项目有兴趣,sushi是一个非常值得研究的项目。

区块链技术网。

  • 发表于 2021-02-10 14:31
  • 阅读 ( 2286 )
  • 学分 ( 34 )
  • 分类:Uniswap

评论