Предопределенные глобальные переменные и функции
Когда контракт выполняется в EVM, он имеет доступ к небольшому набору глобальных объектов. К ним относятся объекты block, msg и tx. Кроме того, Solidity открывает ряд опкодов EVM в виде предопределенных функций. В этом разделе мы рассмотрим переменные и функции, к которым можно получить доступ из смарт-контракта в Solidity.
Контекст вызова транзакции/сообщения
Объект msg - это вызов транзакции (при создании EOA) или вызов сообщения (при создании контракта), который запустил выполнение этого контракта. Он содержит ряд полезных атрибутов:
msg.sender
Мы уже использовали этот параметр. Он представляет собой адрес, который инициировал вызов этого контракта, не обязательно отправителя EOA, который отправил транзакцию. Если наш контракт был вызван непосредственно транзакцией EOA, то это адрес, который подписал транзакцию, но в противном случае это будет адрес контракта.
msg.value
Значение эфира, отправленного с этим вызовом (в wei). газ Количество газа, оставшегося в газовом запасе данной среды выполнения. Эта функция была устаревшей в Solidity v0.4.21 и заменена функцией gasleft.
msg.data
Полезная нагрузка данных этого вызова в нашем контракте.
msg.sig
Первые четыре байта полезной нагрузки данных, которая является селектором функций.
Примечание: Каждый раз, когда контракт вызывает другой контракт, значения всех атрибутов msg изменяются, чтобы отразить информацию о новом вызывающем. Единственным исключением из этого является функция delegatecall, которая выполняет код другого контракта/библиотеки в исходном контексте msg.
Контекст транзакции
Объект tx предоставляет средства доступа к информации, связанной с транзакцией:
tx.gasprice
Цена газа в вызывающей сделке.
tx.origin
Адрес отправителя EOA для данной транзакции. ВНИМАНИЕ: небезопасно!
Контекст блока
Объект block содержит информацию о текущем блоке:
block.blockhash(blockNumber)
Хеш блока указанного номера блока, до 256 блоков в прошлом. Исправлена и заменена функцией blockhash в Solidity v0.4.22.
block.coinbase
Адрес получателя вознаграждения за текущий блок и вознаграждения за блок.
block.difficulty
Сложность (доказательство работы) текущего блока.
block.лимит газа
Максимальное количество газа, которое может быть потрачено по всем транзакциям, включенным в текущий блок.
block.number
Номер текущего блока (высота блокчейна).
block.timestamp
Временная метка, помещенная майнером в текущий блок (количество секунд с момента эпохи Unix).
адресный объект
Любой адрес, переданный в качестве входных данных или полученный из объекта контракта, имеет ряд атрибутов и методов:
address.balance
Баланс адреса, в вэй. Например, текущий баланс контракта - address(this).balance.
address.transfer(amount)
Переводит сумму (в wei) на этот адрес, выбрасывая исключение при любой ошибке. Мы использовали эту функцию в нашем примере Faucet в качестве метода для адреса msg.sender, как msg.sender.transfer.
address.send(amount)
Аналогичен передаче, только вместо исключения возвращает false при ошибке. ПРЕДУПРЕЖДЕНИЕ: всегда проверяйте возвращаемое значение send.
address.call(payload)
Низкоуровневая функция CALL - может сконструировать произвольный вызов сообщения с полезной нагрузкой данных. Возвращает false при ошибке. ПРЕДУПРЕЖДЕНИЕ: небезопасный получатель может (случайно или злонамеренно) израсходовать весь ваш газ, в результате чего ваш контракт остановится с исключением OOG; всегда проверяйте возвращаемое значение вызова.
address.delegatecall(payload)
Низкоуровневая функция DELEGATECALL, подобная callcode(...), но с полным контекстом msg, видимым текущим контрактом. Возвращает false при ошибке. ВНИМАНИЕ: только для продвинутого использования!
Встроенные функции
Среди других функций стоит отметить следующие:
addmod, mulmod
Для сложения и умножения по модулю. Например, addmod(x,y,k) вычисляет (x + y) % k.
keccak256, sha256, sha3, ripemd160
Функции для вычисления хэшей с помощью различных стандартных алгоритмов хэширования.
ecrecover
Восстанавливает адрес, использованный для подписи сообщения, из подписи.
seldestruct(адрес_получателя)
Удаляет текущий контракт, отправляя все оставшиеся на аккаунте эфиры на адрес получателя.
this
Адрес аккаунта текущего исполняемого контракта.