前言
- 第一届钓鱼城杯,2020线上智博会
strictmathmatician
的WP
- 题目很简单,考察的其实是storage存储,主要涉及动态数组和map类型数据
- 题目没给的那部分代码其实只是对map(address)对应的数组长度的限制,如果题目分析的比较透彻,这部分是不会造成影响的,因为比赛只有一天,后来直接给了完整的源码
Source
1 | pragma solidity ^0.4.23; |
Analyse
- 调用
start(0x000000000000000000000000)
- 调用
guess(0, 0xffffffff0000000000000153)
一次 - 计算
target = kecaak256(keccak256(addr|4))+3
- 计算
base = keccak256(3)
distance = (2**256-base+target) % (2**256), idx = distance // 3
- 若
distance % 3 = 0
, 则idx = idx
- 若
distance % 3 = 1
, 则idx += 4
,调用guess(0, 0xffffffff0000000000000153)
两次 - 若
distance % 3 = 2
, 则idx += 2
,掉用guess(0, 0xffffffff0000000000000153)
一次
- 若
调用
guess(0, 0xffffffff0000000000000153)
三次- 调用
check(idx, 4)
,其中tmp
为4
的倍数,在调用check
之前需调用guess(0, 0xffffffff0000000000000153)
的次数为tmp*3/4