например не позволить выполнить int ф-ю
все же просто довольно… представим, что каждой ext функции ставится в соответствие некий идентификатор. Например, a() - 0x01, b() — 0x02, c() - 0x03. Тогда в скомпилированном байткоде будет вот такая конструкция в самом начале: desc = tx.data[0:1] if desc == 0x01: a() elif desc == 0x02: b() elif desc == 0x03: c() else: fallback()
Эмм, про 4 байта я в курсе. Не замечал я что в байткоде матчинг такой есть. Проверю ещё раз.
А можешь ткнуть на любой контракт в etherscan, где этот матч в байткоде. Прям подчеркнуть. Буду благодарен.
Вот контракт: https://kovan.etherscan.io/address/0x381DD3387B2AAa0178d035dDB6D3840AFC5Dbdac#code Вот его runtime-байткод: 6080604052348015600f57600080fd5b506004361060325760003560e01c806308112fe314603757806356f835fd14603f575b600080fd5b603d6045565b005b603d6070565b6040517f440a57bf0cad4531f0d64cfe9a30829810bbcd2b992d0ef6c9a6bd73bb65c5e590600090a1565b6040517fd217144c730a1ad05c23bd421e694cff562f313468e7486c268e493019a7829b90600090a156fea264697066735822122044b6379f61c5eb4ef7f6e3f3f2d0fb85c0a34dcabbf08c5f836d942fa32e8f8964736f6c63430008040033
Вот декомпилированный байткод:
получить его можно вот здесь: https://ethervm.io/decompile
Спасибо, щас позже найду нужные опкоды. В начале как помню выделяется память.
Кстати хорошо что ты ответил. Я как раз не мог понять как диспач раьотает в байткоде. Т е весь байткод контракта с самого начала прогоняется через evm при каждом вызове?
именно так. Считывается байткод из сторейджа, PC выставляется на нулевой байт байткода и поехали. И так каждую транзакцию, где получатель - наш контракт или каждый call/delegatecall/staticcall для нашего контракта.
Обсуждают сегодня