Урок посвящен практике
Так что решаем её тут
Несколько дней точно уйдёт на это
Во время решения задач пришлось подтянуть эти темы:
1) tx.origin
2) self.destruct()
3) Работа со слотами
ethers.provider.getStorageAt(...)4) Байт код (посмотреть длину байт кода можно с помощью
msg.sender.code.lengthЕсли в контракте есть переменные и функции, то длина будет > 0
Но если все действия делаются в конструкторе, то длина байт кода будет = 0
5) Битовые операции (&, |, ^, ~)
6) Фунция abi.encodePacked() для преобразования address->bytes
7) Оказывается, что преобразование типов
uint64->uint32 работает не самым очевидным способом (uint64 переводятся в 16-ую систему счисления и для того, чтобы перевести в uint32, просто обрезается половина битов СЛЕВА и то, что получилось, преобразуется в 10-ую систему счисления. Но когда преобразуем байты bytes2->bytes1 происходит наоборот: обрезаются байты СПРАВА)
8) Следующий момент по поводу преобразования байтов (нашел тут в одном из ответов):
"Thereby if you have something bytes32 and want it to be uint128, you first have to explicitly convert it to bytes16, and therafter can convert it to uint128, via regular solidity. Of course, you'll wish to debug/test to see which parts of that bytes32 may get truncated yourself before proceeding with this, as there's converse cases where it may make more sense to convert it to uint256 first and then cut it down to uint128."
Если коротко: то когда мы хотим преобразовать bytes->uint мы должны это сделать так, чтобы размерность uint была в 8 раз больше или в 8 раз меньше размерности байт
9) All about Bytes
Решение задач, которые не были разобраны на уроке:
Elevator
Gatekeeper One до этого я тут писал, что нихрена не понял. Но в итоге с байтами разобрался (в пунктах 5-9 сверху можно найти всю информацию). В итоге получился вот такой код с решением (решение, которое по ссылке тут - не работает). Ну и еще я не понял пока что как пройти gateTwo (проверка газа)