Офигенная задача от Immunefi
Позавчера в Твиттере выложили задачу, которая заставила меня немного врасплох.
Посмотрите на скрин выше внимательно. Решение тут будет открыто изначально, так как пост скорее обучающий, а не для тренировки навыков.
На строчке owner.call{} я сразу понял, что может случиться gas griefing атака (если не в курсе, что это, то поищите посты по тегу), и побежал в комменты писать свой ответ.
И все бы ничего, если бы не два твита, которые поставили меня в некое замешательство. Вот первый и второй.
Они оба указывали на некую особенность исполнения контракта ERC721Enumerable от OpenZeppelin, о которой я слышал впервые. И мне захотелось поглубже копнуть, чтобы понять, о чем идет речь.
Для начала посмотрите вот это видео, объясняющее работу этого контракта.
Обратите особое внимание на то, как преобразуется массив во время transfer токена от одного пользователя другому.
Если потребуется, то напишу еще один пост про это, но, вроде как, на видео все предельно просто и понятно.
И вот, из-за особенностей формирования массива при изменении владельцев токена, в данной задаче один пользователь может дважды получить награду, а другой, тот чей индекс будет подвинут, вообще ничего не получит.
Надеюсь, вы сможете разобраться в этом.
Люблю задачи, в которых знание нюансов кода и логики может сыграть значительную роль!
#security #erc721 #enumerable #task #erc721enumerable
Post #537
352
- 👍 6