Ethernaut. Задача 1. Fallback
В этой задаче нам нужно забрать права ownership и обнулить баланс до 0.
Ссылка на задачу.
Решение
Для решения задачи я переношу код в Ремикс, чтобы было удобнее разворачивать его и проводить транзакции.
В чем суть?
В конструкторе определяется владелец контракта и ему начисляется 1000 Эфира. Далее есть функция contribute(), которая позволяет любому участнику делать взносы больше 0.001 Эфира, и если сумма взноса превышает сумму владельца, то права ownership переходят совершившему взнос участнику.
Также есть fallback функция receive(), которая говорит принимает деньги, если они просто пришли на контракт. Там проверяется, есть ли такой участник в системе (вносил ли он ранее деньги) и сумма, которая должна быть больше 0. Если условия прошли, то участнику автоматически передаются права ownership.
Поэтому, чтобы решить задачу нам нужно, чтобы эти условия в receive() были выполнены: мы внесли сумму ранее и прислали деньги через fallback потом.
В Ремикс нужно выбрать другой адрес пользователя, вызвать функцию contribute(), чтобы появилась запись о нас в системе, а затем прислать деньги через Transact.
Таким образом ownership перейдет к нам и можно будет спокойно вызвать функцию withdraw(), чтобы получить все деньги.
#ethernaut
Post #384
215
- 👍 3