Глава 3
____________________________________
[ 78 ]
___________________________________
function makePayment(int d) payable
{
a
=
d;
}
}
contract sample2{
function
hello()
{
}
function
sample2(address
addressOfContract)
{
//отправка 12 wei при создании контракта
sample1 s = (new sample1).value(12)(23);
s.makePayment(22);
//также
отправляем
эфир
s.makePayment.value(45)(12);
//назначаем
стоимость
газа
s.makePayment.gas(895)(12);
//отправляем эфир, а также назначаем стоимость газа
s.makePayment.value(4).gas(900)(12);
//hello() - это внутренний вызов, this.hello() - это
//внешний вызов
this.hello();
//указатель на контракт, который уже развернут
sample1
s2
=
sample1(addressOfContract);
s2.makePayment(112);
}
}
Вызовы с ключевым словом
this
выполняются как внешние. Ключевое слово
this
внутри функции ссылается на текущий экземпляр контракта.
Разработка
смарт-контрактов
____________________________________
[ 79 ]
___________________________________
Свойства контракта
Пришло время подробнее изучить контракты. Мы узнаем о некоторых новых их
свойствах, а также более детально рассмотрим уже знакомые опции.
Видимость
Видимость статических переменных или функций определяет, кто их может видеть.
Существует четыре типа видимости функций и статических переменных:
external
,
public
,
internal
и
private
.
По умолчанию функции имеют видимость
public
, а статические переменные —
видимость
internal
. Давайте разберемся, что означает каждая разновидность ви-
димости:
external
— внешние функции (external functions) могут быть вызваны только из
другого контракта или через транзакцию. Внешняя функция
f
не может быть
вызвана внутренним вызовом. Это означает, что вызов
f()
не будет работать, но
вызов
this.f()
сработает. Вы не можете применить видимость
external
к стати-
ческим переменным;
public
— общие функции и статические переменные могут быть доступны лю-
быми возможными способами. Созданные компилятором функции доступа
включают все статические переменные. Вы не можете создавать собственные
функции доступа (аксессоры). Фактически компилятор генерирует только гетте-
ры
4
, но не сеттеры
5
;
internal
— внутренние функции и статические переменные могут быть доступ-
ны только внутри текущего контракта и контрактов, наследующих его. Вы не
можете использовать для доступа ключевое слово
this
;
private
— частные функции и статические переменные похожи на внутренние,
но они недоступны для наследующих контрактов.
В листинге 3.10 приведен пример, демонстрирующий видимость и функции доступа.
Листинг 3.10. Пример различной видимости и функций доступа
contract sample1
{
int public b = 78;
int internal c = 90;
4
Геттер (getter) — метод, возвращающий значение переменной.
5
Сеттер (setter) — метод, присваивающий значение переменной.
Do'stlaringiz bilan baham: |