gas 优化
把之前看过的笔记一下 1.减少合约call调用。例如汇编下面会有每次的extencodesize调用 2.32字节放一块的常规做法。不过除了这个,在保存的时候,一个group(32字节一组的)的store要尽量连续同时操作(读和写,不要中间run其它代码打断)。记住除了空间,还有时间维度考虑3.循环里面减少storage变量的读和写,可以临时拿个memory变量来过渡,操作完保存回storage 4.可以考虑用uncheck来规避0.8.4编译器后自动加入的溢出检测,在循环的里面记得使用,例如i++ 5.input data,一个非0 byte需要68gas,0 byte需要4 gas 6.函数声明是external时一定程度可以省gas,因为会把函数参数保存在calldata 7.变量类型使用。为什么uint256比uint8使用更少gas,因为是按32字节操作,只取8位(1个字节)的话,需要在32字节里面再额外操作取1个字节PS:uintxx,xx/8就是多少个字节,uint256,就是256/8=32,32个字节
gas 优化
把之前看过的笔记一下 1.减少合约call调用。例如汇编下面会有每次的extencodesize调用 2.32字节放一块的常规做法。不过除了这个,在保存的时候,一个group(32字节一组的)的store要尽量连续同时操作(读和写,不要中间run其它代码打断)。记住除了空间,还有时间维度考虑3.循环里面减少storage变量的读和写,可以临时拿个memory变量来过渡,操作完保存回storage 4.可以考虑用uncheck来规避0.8.4编译器后自动加入的溢出检测,在循环的里面记得使用,例如i++ 5.input data,一个非0 byte需要68gas,0 byte需要4 gas 6.函数声明是external时一定程度可以省gas,因为会把函数参数保存在calldata 7.变量类型使用。为什么uint256比uint8使用更少gas,因为是按32字节操作,只取8位(1个字节)的话,需要在32字节里面再额外操作取1个字节PS:uintxx,xx/8就是多少个字节,uint256,就是256/8=32,32个字节
create2深入学习
一级理解:create2可以在创建合约前,就预先知道地址 二级:利用create2配合selfdestruct 重复部署不同业务合约在同一个地址上,可以执行类似shellcode的东西,链上无逻辑代码 这次主要说下深入研究第二级的利用概念说明create2创建合约时,生成的地址主要是受合约的initcode和sender account影响,这里我们可以保证sender不变,那就主要是看这个initcode了,那这个initcode是什么的,要部署不同的业务合约的话,这个initcode不会变吗? 回头看,前面有提到对于合约 Bytecode vs. Runtime Bytecode When compiling a contract, you can either get the contract bytecode or the runtime bytecode. Bytecode = init code + runtime bytecode bytecode是存在链上的 部署合约的时候,我们知道是会先执行构造函数,构造函数底层 就是会回runtime bytecode的 se...
create2深入学习
一级理解:create2可以在创建合约前,就预先知道地址 二级:利用create2配合selfdestruct 重复部署不同业务合约在同一个地址上,可以执行类似shellcode的东西,链上无逻辑代码 这次主要说下深入研究第二级的利用概念说明create2创建合约时,生成的地址主要是受合约的initcode和sender account影响,这里我们可以保证sender不变,那就主要是看这个initcode了,那这个initcode是什么的,要部署不同的业务合约的话,这个initcode不会变吗? 回头看,前面有提到对于合约 Bytecode vs. Runtime Bytecode When compiling a contract, you can either get the contract bytecode or the runtime bytecode. Bytecode = init code + runtime bytecode bytecode是存在链上的 部署合约的时候,我们知道是会先执行构造函数,构造函数底层 就是会回runtime bytecode的 se...
为什么Gnosis多签钱包接收不了转账
有朋友在合约里面写了个提款函数是直接把合约balance调用transfer函数转到多签钱包中,最后在合约部署上后,才发现提款时不行。 这是为什么呢,这是因为transfer函数是限定了只使用2300 gas来调用这个转账的call。 我们想深一层,如果我们代码里面用的是transfer,难道那些EVM不能直接兼容下,给多点gas调用吗? 这时候就涉及到更有意思的问题了,高级语言和Low level语言。因为我们写solidity是用的高级语言,需要编译转成Low level语言给evm执行的,里面只有一些Opcode之类的,如果学过c/c++,asm这些,应该就好理解,类似于汇编asm语言,里面只有opcode 类似的操作码,如add ,push之类的。 扯完了,回到刚说的transfer,是一个高级语言层次的东西,他需要编译后再给evm执行,这时候 transfer函数就会被编译成一个call{gas:2300}类似这样的硬成编码在bytecode里面。回到我们前面说的问题,为什么evm不能兼容下,就是因为硬编码写死了只用2300 gas调用! 其实当时那个问题是有2种可以解...
为什么Gnosis多签钱包接收不了转账
有朋友在合约里面写了个提款函数是直接把合约balance调用transfer函数转到多签钱包中,最后在合约部署上后,才发现提款时不行。 这是为什么呢,这是因为transfer函数是限定了只使用2300 gas来调用这个转账的call。 我们想深一层,如果我们代码里面用的是transfer,难道那些EVM不能直接兼容下,给多点gas调用吗? 这时候就涉及到更有意思的问题了,高级语言和Low level语言。因为我们写solidity是用的高级语言,需要编译转成Low level语言给evm执行的,里面只有一些Opcode之类的,如果学过c/c++,asm这些,应该就好理解,类似于汇编asm语言,里面只有opcode 类似的操作码,如add ,push之类的。 扯完了,回到刚说的transfer,是一个高级语言层次的东西,他需要编译后再给evm执行,这时候 transfer函数就会被编译成一个call{gas:2300}类似这样的硬成编码在bytecode里面。回到我们前面说的问题,为什么evm不能兼容下,就是因为硬编码写死了只用2300 gas调用! 其实当时那个问题是有2种可以解...
rss3 stake 源码分析了下
持仓几千刀这币,最近跌的有点惨,前2天又出了stake,全仓stake进去了,所以也得看下合约源码,是否案例 (下面排版本来在word的,直接粘贴过来了) Stake里面只要是有distributeRewards和mint里面的_correctPointsMint staked token的时候 ,shares是负数,burn的时候是正数 先看distribute函数,参数就是每秒奖励的数量乘以上次奖励到现在过去的时间,可以发现这里面的 pointsPerShare 会有更新,这里更新了,上面的correct里面的值就会有影响 getTotalShares 就是staked rss3的 totalsupply函数,(竟然用了函数指针的形式) pointsPerShare 那这个值就是一个累加+的结果,每份share可以得到的奖励,,例如当前过了1分钟,这1分钟,系统会奖励5个token,然后系统stake了100万rss3的话,那就是5/100w,由于系统没小数,所以需要给他乘一个很大的数,这样就不会丢失数据,因为这只是算份额,不是真实发奖励了,所以没问题,可以在拿奖励的时候,再...
rss3 stake 源码分析了下
持仓几千刀这币,最近跌的有点惨,前2天又出了stake,全仓stake进去了,所以也得看下合约源码,是否案例 (下面排版本来在word的,直接粘贴过来了) Stake里面只要是有distributeRewards和mint里面的_correctPointsMint staked token的时候 ,shares是负数,burn的时候是正数 先看distribute函数,参数就是每秒奖励的数量乘以上次奖励到现在过去的时间,可以发现这里面的 pointsPerShare 会有更新,这里更新了,上面的correct里面的值就会有影响 getTotalShares 就是staked rss3的 totalsupply函数,(竟然用了函数指针的形式) pointsPerShare 那这个值就是一个累加+的结果,每份share可以得到的奖励,,例如当前过了1分钟,这1分钟,系统会奖励5个token,然后系统stake了100万rss3的话,那就是5/100w,由于系统没小数,所以需要给他乘一个很大的数,这样就不会丢失数据,因为这只是算份额,不是真实发奖励了,所以没问题,可以在拿奖励的时候,再...
freemint sniper项目
这就纯记录下项目情况。最近的freemint项目开发基本完善了,希望后续能抓到有价值的freemint项目。当时下午花了几个小时开发出原型,后来和小伙伴慢慢完善,到近期基本需求已经完善。 顺便说下,上次提到的The Association NFT (NBA)项目由于白名单是免费,其实我们当时也抓取到的,不过大意了,看了下要白就没细看了。
freemint sniper项目
这就纯记录下项目情况。最近的freemint项目开发基本完善了,希望后续能抓到有价值的freemint项目。当时下午花了几个小时开发出原型,后来和小伙伴慢慢完善,到近期基本需求已经完善。 顺便说下,上次提到的The Association NFT (NBA)项目由于白名单是免费,其实我们当时也抓取到的,不过大意了,看了下要白就没细看了。