目标
- 常用操作的记录,不定时更新,方便查找
linux
1 | - 查看末尾的的100行 tail 100 |
vim
1 | - 跳转到页面顶部 gg |
关于我
区块链技术痴迷的程序猿一枚,如果你喜欢我的文章,可以加上微信共同学习,共同进步。
code is law
1 | - 查看末尾的的100行 tail 100 |
1 | - 跳转到页面顶部 gg |
区块链技术痴迷的程序猿一枚,如果你喜欢我的文章,可以加上微信共同学习,共同进步。
当然更好的方式使用ts来书写咯!!!
1 | { |
使用这种方式后,__filename没有了,可以使用如下方式实现呢
1 | import path from "path"; |
1 | <!DOCTYPE html> |
软件开发攻城狮一枚,熟悉dapp,web,android,node,go等软件的开发。
1 | custom-less-theme |
1 | { |
1 | import "antd/dist/antd.less" |
1 | const path = require("path"); |
熟悉各个工具的使用,细心跟着文档做就可以啦
软件开发攻城狮一枚,熟悉dapp,web,android,node,go等软件的开发。
1 | <link type="text/css" rel="StyleSheet" href="./antd.dark.min.css" /> |
1 | import {Button} from 'antd'; |
区块链技术痴迷的程序猿一枚,如果你喜欢我的文章,可以加上微信共同学习,共同进步。
koa + graphql的使用在这篇文章中,我们只实现了基本上的如何使用graphql,那么我们来实现业务上的graphql
1 | ./src: |
1 | import Koa from "koa"; |
1 |
|
1 | import {IResolvers} from "apollo-server-koa"; |
1 | import message from "./message"; |
1 | let users = { |
区块链技术痴迷的程序猿一枚,如果你喜欢我的文章,可以加上微信共同学习,共同进步。
本篇文章主要配合前端实现xswap的最后一个功能swap
1 | function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) { |
1 | import BN from 'bignumber.js' |
区块链程序猿一枚
本篇文章主要介绍UniswapV2Pair中的以及一个名词,三个方法,四个变量,理解完后,实现xswap的add,remove的功能
1 | address public token0; // 交易对中的token0 的地址 |
1 | function mint(address to) external lock returns (uint liquidity) { |
burn 即销毁你转入的LP,即你先把LP转入pair合约中,然后根据你转入的LP数量按照占总量LP的比例返回pair中token0,token1到你指定的地址
1 | function burn(address to) external lock returns (uint amount0, uint amount1) { |
swap 即使用token0交换token1或者相反交易.注意一下,swap是不会改变pair的LP的量.这个呢会改变当前两种token对应的价格.所以一个token的价格也即是通过这种方式来定义的呢!
1 | function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { |
区块链程序猿一枚
本篇文章编写智能合约中的create2的使用,也就是uniswap中的UniswapV2Factory合约中的createPair方法.具体的信息可参考eip1014与the-magical-world-of-create2.
1 | bytes memory bytecode = type(UniswapV2Pair).creationCode; |
因为我们是批量创建相同的合约,只是每个合约的里面记录的数据不同而已,所以这里我们还得引入另一个合约函数来配合使用,他就是
UniswapV2Library中的pairFor方法,此方法可以根据创建的参数返回正确的合约地址.其中factory参数就是上述使用create2的合约地址
1 | // calculates the CREATE2 address for a pair without making any external calls |
此处我们使用create2实现一个功能,记录Apple手机的制作流程,具体使用AppleFactory定义手机的信息,然后把指定具体的工厂来加工生产出Apple,并将数据保存在区块链上
1 | // SPDX-License-Identifier: MIT |
1 | // SPDX-License-Identifier: MIT |
区块链程序猿一枚
本篇文章主要看看UniswapV2Pair的父类合约UniswapV2ERC20,主要学习一下eip712
此合约如果熟悉ERC20 token的同学一定知道,她其实是标准的erc20合约(其标准的erc20合约的内容此处就不再详细介绍了)
但是相对标准的erc20合约多了一个permit方法,那么这个方法的作用是什么什么呢?其实是eip721的一个实现
1 | contract UniswapV2ERC20 is IUniswapV2ERC20 { |
1 | bytes32 digest = keccak256( |
1 | // EIP712Domain(string name,string version,uint256 chainId,address verifyingContract) |
此处采用的结构为 keccak256(‘Test(address owner,uint256 amount,uint256 nonce)’),此处注意数据类型和字段名中间有一个空格,参数之间的逗号之间没有空格
eip712主要功能是能够离线签名,让任意的人可以代替你做同样的事情,相当于授权.此处仅做演示签名后的地址正确性
此处仅测试验证结果成功即增加用户输入的amount
1 |
|
这一周花了点时间用react做了个UI,使用了react + react-material开发UI,web3-react实现与区块链的交互xswap前端
目前web3不支持此类签名方式,metamask是支持的,请注意一下签名的请求方式
1 | // 两个字段 types与domain |
区块链程序猿一枚
本篇文章主要看看uniswap的合约的源码和结构,以及如何找到源码的入口(当然也可以直接阅读uniswap的doc来达到目的)
从uniswap合约源码 github把源码colne到本地,进入contract目录
这里如果不熟悉的同学可以试着run一下这个这个test,然后根据test去查看项目如何执行的
1 | -rw-r--r-- 1 kun staff 3435 10 25 11:14 UniswapV2ERC20.sol |
1 | function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) |
1 | // **** SWAP **** |
amount0Out, amount1Out, to, new bytes(0)
);**这个方法上,这个方法就在我们的clone项目中了,那么其核心方法我们就只要关心**IUniswapV2Pair. swap()**
5. 为什么我们colne项目中没有这个router的合约? (本系列结束后回答)
只有在etherscan上验证过的合约才能够找到其合约元am,这也是最真实的,如果做defi,一般会将其验证,增加其去中心化的公信力
通过一系列的操作,我们总算找到了合约入口啦,接下来应该进入到正式的合约阅读步骤啦,是不是很激动?
其中有些细节我觉得通过文字来描述就有点啰嗦了,然后就跳过了,如果你感觉到其中哪些地方迷糊,可以给我发邮件
区块链程序猿一枚