Содержание

Область видимости в Solidity

С тех пор, как в Solidity существует 2 вида вызова функций (внутренний, который не создает фактический вызов EVM (он также называется “message call”), и внешний, который создается вызов EVM), существует 4 типа видимости функций и глобальных переменных.

Функции могут быть указаны, как external, public, internal или private. Значение по умолчанию — public. Для глобальных переменных external невозможен, и по умолчанию указан internal.

external:

External функции — это часть интерфейса контракта. Это означает, что они могут быть вызваны из других контрактов или через транзакции. External функция f не может быть вызвана внутренне (т.е. f() не сработает, а this.f() сработает). External функции наиболее эффективны, когда они принимают большой массив данных.

public:

Public функции — это часть интерфейса контракта, и они могут быть вызваны внутренне или через messages. Для public глобальных переменных автоматически создается геттер-функция (смотрите ниже).

internal:

Эти функции и глобальные переменные могут быть доступны только внутренне (то есть изнутри текущего контракта или из контракта-наследника) без использования this.

private:

Private функции и глобальные переменные видны только контракту, в котором они объявлены и не видны в контракту-наследнику.

Примечание

Все, что находится внутри контракта, видно всем. Например, создание private функции просто запрещает доступ к ней из других контрактов, а ее код остается виден всему миру даже вне сети блокчейн.

Спецификатор области видимости глобальной переменной указывается после ее типа. Спецификатор функции указывается между списком параметров и списком возвращаемых параметров.

pragma solidity ^0.4.16;

contract C {
    function f(uint a) private pure returns (uint b) { return a + 1; }
    function setData(uint a) internal { data = a; }
    uint public data;
}

В следующем примере D может вызвать c.getData(), но не может вызвать f. Контракт E — производный от C, и поэтому он может вызвать compute.

// Этот код не скомпилируется

pragma solidity ^0.4.0;

contract C {
    uint private data;

    function f(uint a) private returns(uint b) { return a + 1; }
    function setData(uint a) public { data = a; }
    function getData() public returns(uint) { return data; }
    function compute(uint a, uint b) internal returns (uint) { return a+b; }
}

contract D {
    function readData() public {
        C c = new C();
        uint local = c.f(7); // ошибка: `f` не виден, т.к. в контракте C
                             //у f() указан private
        c.setData(3);
        local = c.getData();
        local = c.compute(3, 5); // ошибка: `compute` не виден
    }
}

contract E is C {
    function g() public {
        C c = new C();
        uint val = compute(3, 5); //доступ к internal члену
                                  //контракта-родителя
    }
}
Материал был полезен? Поделитесь в соц. сетях:
Логотип echain.ru

Добавить комментарий

Ваш e-mail не будет опубликован.