Solidity: метод вызова контракта
Solidity: метод вызова контракта

В Solidity взаимодействие между контрактами осуществляется посредством вызовов. Ниже приведены некоторые основные методы вызова контракта:

1. Внутренний прямой вызов

Контракт может выполнять внутренние вызовы, вызывая свои собственные внутренние функции или частные функции. Этот метод вызова не создает новый контекст выполнения; вызываемая функция разделяет контекст выполнения функции, которая ее вызвала.

Язык кода:javascript
копировать
contract A {
    function foo() internal {
        // ...
    }

    function bar() public {
        foo(); // внутренний звонок
    }
}

2. Внешний вызов

внешний Вызов — наиболее распространенный способ вызова контракта. Контракт может выполняться внешне, вызывая общедоступную или внешнюю функцию другого контракта. вызов. Этот метод вызова создает новый контекст выполнения.,Вызванный контракт имеет свой собственныйthisиmsg.sender

Язык кода:javascript
копировать
contract A {
    function foo() external {
        // ...
    }
}

contract B {
    A a = new A();

    function bar() public {
        a.foo(); // внешний вызов
    }
}

3. Звонок делегата

Контракт может пройтиdelegatecallилиstaticcallвызвать другой контрактфункция。Этот метод вызова поддерживает контекст выполнения вызывающего объекта.,включатьthisиmsg.sender。Это означает, чтофункция Доступени Изменить статус звонящего。Этот метод вызова часто используется для реализации библиотек.функцияили Обновление контракта。

Язык кода:javascript
копировать
contract A {
    function foo() external {
        // ...
    }
}

contract B {
    function bar(address _a) public {
        _a.delegatecall(abi.encodeWithSignature("foo()")); // Делегатский звонок
    }
}

4. Низкоуровневые звонки

Контракт может пройтиcall,delegatecall,staticcallилиcallcodeПодождите низкого уровняфункцияпозвонить。Этифункция Принимает параметр байтовой строки,Первые 4 байта этой строки представляют собой селектор функций.,Следующие байты являются функциональными параметрами. Этот метод вызова обеспечивает большую гибкость,Но и ошибаться легче.

Язык кода:javascript
копировать
contract A {
    function foo() external {
        // ...
    }
}

contract B {
    function bar(address _a) public {
        _a.call(abi.encodeWithSignature("foo()")); // вызов низкого уровня
    }
}

5. Используйте вызов интерфейса

Чтобы повысить читаемость и безопасность кода, обычно определяется интерфейс для выполнения внешних вызовов.

Язык кода:javascript
копировать
interface ITarget {
    function setX(uint _x) external;
}

contract ExternalCallWithInterface {
    function callSetX(address _contract, uint _x) public {
        ITarget(_contract).setX(_x);
    }
}

6. Меры предосторожности

При совершении внешних вызовов в Solidity следует учитывать несколько важных моментов:

1.Проверьте результат звонка:внешний Вызов может завершиться неудачно, например, вызываемый контракт не существует или вызывающая функция выдает исключение. Поэтому вам всегда следует проверять внешний вид. вызоввозвращаемое значение,и соответствующим образом справляться с ситуациями сбоев。2.Используйте газ с осторожностью:внешний вызов может потреблять много газа. Если вы выполняете внешний цикл вызов, который может привести к сбою транзакции из-за исчерпания газа. Поэтому вам следует стараться избегать выполнения внешнего кода в цикле. вызов,илииспользуетсяgasleft()функциячтобы проверить оставшиесяgas。3.Предотвращение повторных атак:Если вы звоните внешнемуфункция Есть еще важная логика, которую нужно будет выполнить позже.,Может подвергаться повторным атакам. Злоумышленник может снова вызвать ваш контракт в вызываемой функции.,Таким образом, изменяется состояние контракта до того, как ваша логика будет завершена. Для предотвращения повторных атак,Вам следует позвонить внешнемуфункция Завершите все обновления статуса до。4.Используйте низкоуровневые функции с осторожностью.call,delegatecall,staticcallиcallcodeПодождите низкого уровняфункция Обеспечивает большую гибкость,Но и ошибаться легче.Например,Если вы неправильно закодируете селекторы функций и параметры,Может быть вызвана неправильная функция. поэтому,без необходимости,В противном случае вам следует стараться избегать использования низкоуровневогофункция。5.Обратите внимание на контроль разрешений:При вызове других контрактовфункциячас,Вам нужен контакт внимание на контроль разрешений。Например,Если вы вызываете публичную функцию другого контракта,Вам необходимо убедиться, что эта функция может быть вызвана вашим контрактом. Если вы вызываете частную или внутреннюю функцию другого контракта,Вам необходимо убедиться, что в вашем контракте есть разрешение на вызов этой функции.

Отказ от ответственности: эта работа распространяется под лицензией Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)[1]. Пожалуйста, укажите источник при ее использовании. Автор: мэнбин[2] блог: мэнбин[3] Гитхаб: mengbin92[4] cnblogs: Непреднамеренно полюбила воду[5] Сообщество разработчиков облачных технологий Tencent: Мюнстер[6]

References

[1] С указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] Влюбляюсь в воду нечаянно: https://www.cnblogs.com/lianshuiwuyi/ [6] Мюнстер: https://cloud.tencent.com/developer/user/6649301

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.