Некоторое время думал, как назвать цикл постов с описанием пунктов по Solidity от Chinmaya, о котором писал в предыдущем посте. В общем теперь это будут посты в формате заметок с пояснениями: Solidity hints.
Я буду писать заголовок пункта из репо и давать к нему небольшое описание.
Как я понял, у Chinmaya нет градации по сложности, он писал обо всем, что изучал сам. Поэтому может быть и несколько простых пунктов, а может и пара сложных подряд. Будет смотреть по ходу. Итак, поехали:
1. Sending ether to a contract B from a contract(for eg. using .send or .transfer), executes the code of B’s fallback function if it exists (and receive doesn’t exist).
Когда мы отправляем Эфир (не токены) на другой контракт, где-то "под капотом" проверяется наличие дополнительных данных в транзакции (msg.data). Если они есть, то выполнение сразу падает в fallback функцию, если же данных нет - в receive(), параллельно проверяя существует ли receive вообще. Если ее такой функции нет, то снова вызывается fallback. Если же и его нет, то транзакция откатывается.
Есть два случая, когда Эфир все равно попадет на счет нового контракта, но, думаю, об этом будут еще пункты.
Можно эту схему разложить на:
send Ether
|
msg.data is empty?
|
no => fallback()
yes => is receive() exist?
|
yes => receive()
no => fallback()
1. Division result is auto rounded towards zero
При делении округление чисел идет в меньшую сторону. Это стоит учитывать при манипуляциях с балансами токенов. Например,
function getMath() public pure returns(uint256) {
return uint256(19) / uint256(2);
}
Результатом будет 9. Вроде как потеря 0,5 не так страшна, пока не начнем думать, что это мог быть Эфир, стоимость под $ 2000.
Для решения таких проблем существуют специальные библиотеки, либо некоторые манипуляции с округлением вверх или вниз. но даже тут нужно быть очень аккуратным и проверять все в специальных программах, так как ошибки находят даже в профессиональном коде.
2. Division by zero causes panic error, escapes unchecked
Деление на 0 приводит к критической ошибке и реверту транзакции, т.е. просто не делите на ноль.
Не очень уверен в смысле "escapes unchecked". Тут либо "избегает проверок", либо "не работает в unchecked", либо "условия не проверяются". Там при каждом случе можно найти подходящее описание случая. Но будет лучше, если просто запомните, что на 0 не делится.
Это пока первые три пункта из его репо, на всякий буду оставлять на него ссылку, чтобы и вы могли изучать его по ходу нашего разбора.
#hints