Q1ngying

今朝梦醒与君别,遥盼春风寄相思

0%

Huff

Huff 安装

官网:https://docs.huff.sh

Windows系统下,能够成功按照 rust 和 Foundry 的话,直接通过 cargo 命令一次就能成功的安装 Huff。如果没有成功安装 Rust 和 Foundry,大致解决方法:

阅读全文 »

DEX2—wp

这道题中的 DEX 和上一个中有一处不同:该 DEX 的swap函数中没有检测 Tokenfrom&to是否为该 DEX 中的 token1 和 token2。针对这一点可以对齐利用

阅读全文 »

DEX-wp

这是一个拥有两个 ERC20 Token 的交易池,开始时,我们的账户中会拥有两种代币各10个。需要我们达到的目的是:将这个交易池中的代币至少一个清空,而这道题实际上就是一个典型的价格预言机操控攻击

阅读全文 »

Shop-wp

合约可以以任何他们想要的方式操纵可看到的其他合约的数据。

根据外部和不受信任的合约逻辑更改状态是不安全的

阅读全文 »

Denial-wp

这道题还是一道 DoS 攻击的利用,只不过这里采用的是耗尽 gas 的方法以实现 DoS 攻击。

阅读全文 »

继承

继承

首先,Solidity 支持多重继承,包括多态性

多态性意味着函数调用总是执行继承层次结构中最新继承合约的合约中的同名函数(和参数类型),但是,必须使用virtualoverride关键字在层次结构中的每个函数上明确启用

可以通过ContractName.functionName()明确指定合约,可以在内部调用继承层次结构中更高的函数。或者直接调用继承层次中调用高一级的函数,可以使用super.functionName()

一个合约继承自其他合约,在区块链上只会创建一个单一的合约。所有基础合约的代码被编译到创建的合约中。这意味着,对基础合约的所有内部函数的调用都只是使用内部函数调用。

Solidity 的继承系统和 Python 的继承系统非常类似。

阅读全文 »

函数重载

函数重载

简单理解,一个合约中可以有多个同名的函数,但是这些函数的参数类型需要保证不同

个人理解:

在 Solidity 的底层,调用函数其实并不是通过函数名来调用的,而是通过函数选择器,函数选择器是函数签名的哈希值的前4个字节。函数签名不同,得到的函数选择器就会不同。所以这不会引起冲突。(函数签名:函数名和函数的参数,不使用空格分隔,比如:func(uint256,uint8))

阅读全文 »

通用升级合约(UUPS)

通用升级合约(UUPS)相比透明代理合约,UUPS 代理合约最终可以移出其升级能力,使代码真正不可变,而且 UUPS 在技术上部署成本稍低一些。

OpenZeppelin 的文档中详细介绍了这两种代理的区别: https://docs.openzeppelin.com/contracts/5.x/api/proxy#transparent-vs-uups

阅读全文 »

可升级合约

合约升级包括三种方式(目前)

参数化升级

这是升级智能合约最简单的方法,实际上,他并没有升级智能合约,因为我们不能真正的改变合约的逻辑。升级只是参数化一切

阅读全文 »

Foundry模糊测试入门

关于模糊测试,需要首先考虑在我们的代码中系统的不变量/属性 是什么,这样我们就可以编写一些有状态和无状态的模糊测试

定义:

Fuzz 测试(模糊测试),是将随机数据提供给系统,以尝试破坏系统

阅读全文 »