浅析白名单校验原理

ETH 上的GAS 不是欢乐豆 这篇文章来在于一个群中的一次关于一个项目的大讨论。 一个NFT项目 mint 的成本异常的高。售价是 0.01 但是实际上mint 的 gas 在 0.1+@75gwei的情况下。 网络并不繁忙。 项目的合约地址在下面 https://etherscan.io/address/0x99a8e1cc829d6b33dc37851466c360e08757a0ae 在 MonkeyPoly.sol 的69~76段。可以看到一个白名单校验的函数。这里存在着一个循环结构。我们知道ETH上的计算是需要gas的,所以这里的一个对白名单列表的遍历。就是调用高gas的元凶。 function isWhitelisted(address _user) public view returns (bool) { for (uint i = 0; i < whitelistedAddresses.length; i++) { if (whitelistedAddresses[i] == _user) { return true; } } return false; } 而在另一段代码里面我们看到了写入白名单的地方 function whitelistUsers(address[] calldata _users) public onlyOwner { delete whitelistedAddresses; whitelistedAddresses = _users; } 这里项目方直接把地址列表给导入了进去,通过传参的方式。十分的生猛。 这里的gas 消耗,可以参考下文,记录了每个evm操作符消耗的 gas 情况。对上面的来进行一个估算。 以太坊的存储成本_跨链技术践行者-CSDN博客 evm-opcode-gas-costs/opcode-gas-costs_EIP-150_revision-1e18248_2017-04-12.csv at master · djrtwo/evm-opcode-gas-costs...

二月 7, 2022 · 2 分钟 · r4y

ERC20 标准再学习

ERC20 标准,是ETH上的一种合约标准。固定了事件和对应的接口 contract ERC20Interface { function totalSupply() public constant returns (uint); function balanceOf(address tokenOwner) public constant returns (uint balance); function allowance(address tokenOwner, address spender) public constant returns (uint remaining); function transfer(address to, uint tokens) public returns (bool success); function approve(address spender, uint tokens) public returns (bool success); function transferFrom(address from, address to, uint tokens) public returns (bool success); event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed tokenOwner, address indexed spender, uint tokens); string public constant name = "TEST Token"; string public constant symbol = "TST"; uint8 public constant decimals = 18; // 18 is the most common number of decimal places uint256 public _totalSupply; } 合约分为 函数和事件变量,三个部分,...

一月 18, 2022 · 2 分钟 · r4y