闪电贷
闪电贷闪电贷(Flash loan):是一种无抵押、借贷金额无上限(可以借光池中所有的钱)的贷款。它要求借贷人快借快还,快到还款和借款在同一个交易内(同一个以太坊 transaction),在我看来就是非常迅速的借款还款
首先你要借钱的话,你要写个还钱合约,里面包括了如何赚钱,还本金加利息的数目,开始借款的话,就要实现一个flashloan()闪电贷合约,这个合约首先要先进行一系列的数据验证,再调用你的还钱合约,验证你是否还了本金加利息,如果没有还上,直接 revert 整个交易,让借款无效,从而保证借出方总是安全的。实现闪电贷通常有俩个合约。
闪电贷的优点:编写闪电贷合约总体并不复杂。使用闪电贷风险也比较小。如果赚钱逻辑失败,变成了亏钱逻辑,不能完成还款,那么也不用担心借来的巨款无力偿还。整个交易将会执行失败,就如同借款从来没有发生过一样。
实现你第一笔闪电贷合约闪电贷的极简入门下面是AI生成
## 闪电贷### 同一个区块中提款可导致闪电贷攻击攻击者利用闪电贷的特性,在同一个区块内执行多个交易,以迅速操控市场,并从中获利,闪电贷本身就是一笔交易完成的,如果允许在同一个区块上进行提款 ...
damn-vulnerable-defi题解
Damn-vulnerable-defiUnstoppable要求是,使拥有一百万DVI的钱包停止闪电贷的功能
分析:这个合约的代码在gittub上,要分开去看,这道题的解决就是靠一个基本的闪电贷的知识首先要看闪电贷的函数
function flashLoan(IERC3156FlashBorrower receiver, address _token, uint256 amount, bytes calldata data) external returns (bool) { if (amount == 0) revert InvalidAmount(0); // fail early if (address(asset) != _token) revert UnsupportedCurrency(); // enforce ERC3156 requirement uint256 balanceBefore = totalAssets(); if (convertToShares(totalSupp ...
hardhat
hardhathardhat就是以太坊开发环境,如同remix,现在介绍一下安装hardhat的步骤
打开终端,win+r,输入cmd
检查node js,安装没有,node -v (没有安装去官网下载)
建一个文件夹,在终端输入mkdir hardhat-tutorial,然后进入文件夹,cd hardhat-tutorial
进行初始化,npm init,接下来一直按enter,直到出现Is this OK? (yes),回答yes即可
安装hardhat npm install --save-dev hardhat,需要等待几秒
再安装一个插件 npm install –save-dev @nomicfoundation/hardhat-toolboxs
编写合同安装完成后,因为使用VScode,所以我们要安装一个VScode 安全帽,它可以帮组我们更好的使用solidity语言,然后在VScode创建一个新目录,写一个简单的.sol合约,在终端中运行该合约,npx hardhat compile,成功后就会看到Compiled 1 Solidity file su ...
Uniswap V2
Uniswap V2Uniswap是一种流行的去中心化交易所 (DEX)协议,允许用户将任何 ERC20 代币交换为另一种代币,提供流动性以赚取费用,并访问以太坊区块链上的价格预言机。 而Uniswap V2具有更强大的功能,如下:
它允许任何的ERC20代币与其他的ERC20代币配对,无需ETH作为中介,这使得流动性池更加多样化和高效,并为交易者提供更好的价格。 就是一种代币可与其他的代币转化,方便很多
Uniswap V2 实施了一种新颖的机制,可实现高度去中心化且抗操纵的链上价格供给。 这是通过在每个区块开始时测量两种资产的相对价格并随着时间的推移积累历史数据来实现的。 这允许外部智能合约查询任何时间间隔内任何货币对的时间加权平均价格(TWAP),同时将天然气成本和预言机风险降至最低。
Uniswap V2 支持一种称为闪电互换的新型交易,用户可以从池中接收任意数量的任何资产,并在链上的其他地方使用它,只要他们在交易结束时偿还该金额并支付费用即可。 交易。 这为套利、保证金交易、抵押品互换等开辟了新的可能性。
每个Uniswap智能合约或一对智能合约都管理由两个ERC-20代 ...
ERC20
ERC20ERC20是以太坊上的代币标准,它实现了代币转账的基本逻辑:
账户余额(balanceOf())
转账(transfer())
授权转账(transferFrom())
授权(approve())
代币总供给(totalSupply())
授权转账额度(allowance())
代币信息(可选):名称(name()),代号(symbol()),小数位数(decimals())
除了ERC20,还有它的接口合约IERC20,就是为了统一规范,以便好使用,接下来就介绍一下IERC20合约的功能
俩个事件
释放条件:当 value 单位的货币从账户 (from) 转账到另一账户 (to)时.event Transfer(address indexed from, address indexed to, uint256 value);
释放条件:当 value 单位的货币从账户 (owner) 授权给另一账户 (spender)时.event Approval(address indexed owner, address indexed spender, uint256 valu ...
Ethernaut靶场题解
EthernautFallback要求是,成为这个合约的所有者,并使这个合约的钱为零
分析;从这个合约中可以看到,要成为owner1,我们的钱必须大于合约持有者的钱,但是最开始合约本身就有1000ether,这个时候就走contribute函数不行,因为我们没有那么多钱2,此时发现receive,只要我们的钱和合约的钱大于0,就可以成为这个合约的持有者
方法:1,在remix上不能部署这个合约,因为部署后,合约初始化,owner就是我们自己了
constructor() { owner = msg.sender; contributions[msg.sender] = 1000 * (1 ether); }
直接使用合约地址At Adress2,调用contribute函数,转账1wei;2,调用receive函数,转账1wei,就完成了,注意记得将钱收回来
Fal1out要求是,成为这个合约的所有者
分析:注意这个的solidity的版本是0.6,没有影响关系,只是构造函数的写法不一样,如:
//solidity 0.8 construc ...
靶场题解
Fallback要求是,成为这个合约的所有者,并使这个合约的钱为零
首先找到owner,
分析;从这个合约中可以看到,要成为owner1,我们的钱必须大于合约持有者的钱,但是最开始合约本身就有1000ether,这个时候就走contribute函数不行,因为我们没有那么多钱2,此时发现receive,只要我们的钱和合约的钱大于0,就可以成为这个合约的持有者
方法:1,在remix上部署这个合约,首先调用contribute函数,给我们转账;2,在调用receive函数,就完成了
Fal1out要求是,成为这个合约的所有者
从这个题目来看,Fallout,Fal1out,
分析:首先看与owner相关的函数,再去分析构造的合约名字Fallout,仔细发现有个Fal1out的函数,它实际上是命名错误的,这个时候我们就可以调动这个函数,刚好成为合约的所有者
方法:
定义函数接口,直接调用该函数Fal1out,此时就成为了合约的所有者
my fist blog
先进入blog cd blog预览hexo hexo s创建文章题目 hexo new “”进入文章目录 cd 提目前,blog后的东西)题目.md写文章 notepad 题目.md
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post$ hexo new "My New Post"
More info: Writing
Run server$ hexo server
More info: Server
Generate static files$ hexo generate
More info: Generating
Deploy to remote sites$ hexo deploy
More info: Deployment