type
status
date
slug
summary
tags
category
icon
password
10/15
Ethers102章节:MerkleTree脚本、数字签名脚本、监听Mempool
Mempool
在用户的交易被矿工打包进以太坊区块链之前,所有交易会汇集到Mempool(交易内存池)中。矿工也是在这里寻找费用高的交易优先打包,实现利益最大化。通常来说,gas price越高的交易,越容易被打包。
Mev也发生在其中,即为通过调整gas,机器人会在一笔滑点设置过高的swap交易之前插入买单,用户交易之后发送一个卖单,以此获利的一个过程;
10/14
Ethers102章节:识别ERC721合约、编码calldata、批量生成钱包/批量转账/批量归集、
- interfaceId补充
- 接口类Interface
- 通过calldata来调用函数
10/13
Ethers101章节:检索事件,监听合约事件、事件过滤、BigInt和单位转换
Ethers102章节:StaticCall
- 监听合约
- 事件过滤
- StaticCall
10/12
Ethers101章节:提供其Provider、读取合约信息、发送ETH、合约交互、部署合约
- Contract读取
- 创建钱包的api
10/11
EVM opcode101章节: Hello Opcodes
Solidity 103章节:去中心化交易所、闪电贷
- EVM的执行模型
- 当一个交易被接收并准备执行时,以太坊会初始化一个新的执行环境并加载合约的字节码。
- 字节码被翻译成Opcode,被逐一执行。每个Opcodes代表一种操作,比如算术运算、逻辑运算、存储操作或者跳转到其他操作码。
- 每执行一个Opcodes,都要消耗一定数量的Gas。如果Gas耗尽或者执行出错,执行就会立即停止,所有的状态改变(除了已经消耗的Gas)都会被回滚。
- 执行完成后,交易的结果会被记录在区块链上,包括Gas的消耗、交易日志等信息。
- gas 计算 通过opcodes,以太坊规定了每个opcode的gas消耗,复杂度越高的opcodes消耗越多的gas;如ADD操作消耗3 gas,SSTORE操作消耗20000 gas等等
- flashloan 也就是在一笔TX中同时完成借贷-执行-还款三个行为;
10/10
Solidity 103章节:ERC-2612 ERC20Permit,多重调用
- Nonce补充 nonce用于确认交易顺序,撤销pending中的交易,确定生成的合约地址
- ERC20Permit 这里的用途主要是分离permit的发起者和gas的付费人(实际进行approve)的两个角色,用户仅仅需要进行签名即可进行交易,用于近似的cex体验;
- Multicall calldata同样可以修饰结构体的声明,Call calldata calli;calli直接从调用数据中读取,不需要复制到内存,从而节省gas;
10/9
Solidity 103章节:ERC4626代币化金库标准、EIP712类型化数据签名
- ERC4626 用vault这个名称不太好理解到底在干嘛,应该换为shareToken,这个名称会好理解一些,可以视作veToken的前身;
- EIP712 钱包会展示签名消息的原始数据,用户可以在验证数据符合预期之后签名;
- 相关代码
10/8
Solidity 103章节:多签钱包
- 多签钱包 通过一个bytes数组来存储签名,之后根据每个签名的长度为65进行分离,挨个验证,当通过数目大于等于threshold后,执行交易;
10/7
Solidity 103章节内容:代理合约、可升级合约、透明代理、通用可升级代理
- 代理合约 在fallback()回调函数中基于delegatecall来调用被代理合约;
- 选择器冲突 函数选择器为函数签名的哈希的前4个字节;
如”burn(uint256)”和(collate_propagate_storage()”具有相同的选择器;
- 透明代理 管理员:调用代理合约的可升级函数对合约升级,不能通过回调函数调用逻辑合约 其他用户:不能调用可升级函数,但是可以调用逻辑合约的函数。
- 通用可升级代理 将升级函数放在逻辑合约中,并检查调用者是否为管理员;
- 相关代码 ProxyContract case
10/6
Solidity 103章节内容:WETH、分账、线性释放、代币锁
- 函数参数的位置指定
主要针对引用类型:数组、结构体、映射、字符串
memory
:表示数据将被存储在内存中,适用于需要修改或者临时存储的数据,允许在函数内容 修改参数内容,但会消耗更多gas;calldata
:calldata为只读,最省gas,直接从调用数据中读取,不需要复制到内存;
- 代码
10/5
Solidity 103章节内容:NFT交易所、ERC1155
- ERC1155
在
ERC721
中,每个代币都有一个tokenId
作为唯一标识,每个tokenId
只对应一个代币;而在ERC1155
中,每一种代币都有一个id
作为唯一标识,每个id
对应一种代币。
- 代码
10/4
Solidity103章节内容:数字签名、链上随机数
- 椭圆曲线签名算法ECDSA 签名目的为证明当前为私钥的持有者、以及被签名数据没有被篡改过; 整个博客讲的非常详细
- 和前端如何验证流程
hash(A,B) → metamask签名 →signature
hash(A,B) →msgHash
verify(msgHash,signature) → signer,这个signer 是否和metamask签名的公钥是否相同
- 调用LINK生成随机数
注意:订阅 ID 类型已从 VRF V2 中的
uint64
变为 VRF V2.5 中的uint256
- 相关代码
10/3
Solidity103章节内容:荷兰拍卖、默克尔树
Ethers101章节内容:HelloVitalik
- merkle tree
通过两两哈希,来获取根节点,利用根节点的可验证性,来保护整个数据不被篡改;Merkle proof即为从叶子节点到根节点的路径;
- 相关代码
10/2
WTF103章节内容:ERC721
- IERC165 检查一个智能合约是否支持ERC721的接口
- 确保目标合约实现了onERC721Received()函数
- 相关代码 erc721
10/1
WTF103章节内容:空投合约
- 空投合约
_to.call(value:amount){””}
这里的value默认单位为wei,如果需要发送ether,可以amount * 1 ether 来进行换算
- 相关代码 airdrop合约
9/30
WTF103章节内容:ERC20、代币水龙头
- IERC20
- 相关代码:
9/29
WTF102章节内容:Hash、TryCatch
- 选择器
即为bytes4(keccak256("fixedSizeParamSelector(uint256[3])")),可以理解作为函数的标识符,此处需要注意空格,uint换为uint256;
- 异常捕捉
9/28
WTF102章节内容:在合约中创建新合约、Create2、删除合约、ABI编码解码
- 使用CREATE创建合约 新地址 = hash(创建者地址,nonce)
- 使用CREATE2创建合约 新地址 = hash(常数,创建者地址,salt,initcode)
- ABI 应用二进制接口,是与以太坊智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。
9/27
WTF102章节内容:Call、Delegatecall
- 通过call来进行调用某一个合约函数
- delegatecall
要求当前合约中的状态变量和被调用合约中的状态变量相同;
即为在调用过程中,delegatecall的执行结果可以修改当前合约的状态变量;
要求变量类型和声明顺序必须相同,变量名可以不同;
原因:变量名对于storage并不重要,storage是基于位置的;Solidity将状态变量以线性布局的方式存储在合约的storage slots中,如,第一个变量存在slot 0,第二个在slot1;
9/26
WTF102章节内容:接收ETH、发送ETH、调用其他合约
- 接收ETH:receive和fallback
- 接收ETH
function | gas limit | 是否支持对方合约fallback() or receive实现复杂逻辑 | 是否支持revert | 返回值 |
paybale(_to).transfer(amount) | 2300 | 否 | 支持 | no returns |
_to.send(amount) | 2300 | 否 | 不支持 | bool |
_to.call{value: amount}("") | none | 是 | 不支持 | (bool,bytes) |
- gas limit 执行交易或合约时所能消耗的最大计算资源。如果你设定的 gas limit 是 100,000 gas,那么你的交易在任何情况下都不会消耗超过 100,000 gas。如果交易需要的 gas 超过了这个限制,交易就会失败。
- 调用其他合约
9/25
WTF101章节内容:抽象合约和接口、异常
WTF102章节内容:重载、库合约、Import
- 接口规则
- 不能包含状态变量
- 不能包含构造函数
- 不能继承除接口外的其他合约
- 所有函数都必须是external且不能有函数体
- 继承接口的非抽象合约必须实现接口定义的所有功能
- 异常
- error
2.Require
3.Assert
9/24
WTF101章节内容:映射类型、变量初始值、常数、控制流、构造函数和修饰器、事件、继承
- map 1、key仅支持内置值类型,value支持struct 2、存储位置为storage,这里的map只用来记录关系,而不是一个类型; 3、当映射声明为public 时候,自动创建getter函数 4、val[key] = val
- constant和immutable
数值变量可以声明
constant
和immutable
;string
和bytes
可以声明为constant
,但不能为immutable
。
- EVM Log 用于存储Solidity Event,类似于信号量??; Topics: 描述事件,事件的签名(哈希)+最多3个indexed参数(256bit) data: 事件的值,可存储任意大小的数据;
- 构造函数的继承
9/23
WTF101章节内容:HelloWeb3(三行代码)、数值类型、函数类型、函数输出 、变量数据存储、引用类型
uint256和uint实际上是一样的,都是0到2^256-1这个范围区间内;
一个字符2个字节;
四种函数可见性说明符,共有4种。public
:内部和外部均可见。private
:只能从本合约内部访问,继承的合约也不能使用。external
:只能从合约外部访问(但内部可以通过this.f()
来调用,f
是函数名)。internal
: 只能从合约内部访问,继承的合约可以用。(默认状态变量的可见性)
Pure和View、Default 针对的是修改链上state的权限Pure
不能读、不能写View
只能读、不能写Default
能读、能写
数据位置:storage
:合约里的状态变量默认都是storage
,存储在链上。memory
:函数里的参数和临时变量一般用memory
,存储在内存中,不上链。尤其是如果返回数据类型是变长的情况下,必须加memory修饰,例如:string, bytes, array和自定义结构。calldata
:和memory
类似,存储在内存中,不上链。与memory
的不同点在于calldata
变量不能修改(immutable
),一般用于函数的参数。例子:
memory修饰的数组的大小为定长类型
- 作者:eddie
- 链接:https://www.binlog.com/article/10a4ec7d-70d7-80ee-b135-cc60ad669329
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。