Smart Contract
Смарт-контракты принимают и выполняют транзакции внутри блока, чтобы поддерживать переменные смарт-контрактов внутри блокчейна и создавать необратимые доказательства. IOST реализует общие интерфейсы ABI, многоязычную поддержку подключи-и-работай(plug-and-play), и может генерировать результат консенсуса. Это существенно улучшает используемость блокчейна.
ABI Интерфейс
IOST смарт-контракты взаимодействуют с сетью через ABI.
ABIs определяют информацию в формате JSON, включая имена, типы параметров, и др. Поддерживаемыми базовыми типами данных являются string
(строка), number
(число), и bool
(булевые).
Более сложные структуры данных могут быть разобраны на строку формата JSON. При вызове функций в смарт-контракте необходимо строго соблюдать типы параметров ABI. В противном случае выполнение будет прекращено, а комиссия за транзакцию взымется.
// example luckybet.js.abi
{
"lang": "javascript",
"version": "1.0.0",
"abi": [
{
"name": "bet",
"args": [
"string",
"number",
"number",
"number"
]
}
]
}
Каждая транзакция включает в себя несколько транзакционных действий, и каждое действие - это вызов ABI. Все транзакции будут генерировать строгий серийный номер в цепочке, предотвращая атаки с двойным расходованием.
type Action struct {
Contract string
ActionName string
Data string // A JSON Array of args
}
В смарт-контракте вы можете использовать BlockChain.call()
для вызова интерфейса ABI и получения возвращаемого значения. Стек вызовов будет зарегистрирован в блокчейне таким образом, что вызовы, приводящие к двойному расходованию будут отвергнуты.
Многоязычная поддержка
IOST стремиться предоставить разработчикам возможность выбора высокоуровневого языка программирования для разработки смарт-контрактов. В настоящее время мы запускаем JavaScript с движком v8, и есть встроенные модули golang VM для обработки высокопроизводительных транзакций.
Механизм смарт-контракта IOST состоит из трех частей: монитора, VM (виртуальной машины), хоста. Монитор - это глобальный блок управления, который отправляет вызовы ABI в нужную виртуальную машину. VM - это виртуальная машина, имплементирующая смарт-контракты. Хост упаковывает среду выполнения и гарантирует, что контракты выполняются в правильном контексте.
Система разрешений в смарт-контрактах
Транзакции поддерживают несколько подписей. В рамках контракта вы можете использовать RequireAuth()
, чтобы проверить несет ли текущий контекст подпись определенного идентификатора. Вызовы между смарт-контрактами будут передавать авторизацию подписи. Например, если A.a
вызывает B.b
, авторизация B.b
от пользователя подразумевается при вызове A.a
.
Смарт-контракты могут проверять стек вызова, и отвечать на такие вопросы, как «Кто вызвал этот ABI». Это позволяет осуществлять некоторые операции.
Смарт-контракты имеют специальные разрешения, такие как обновления. Они могут быть реализованы с помощью can_update()
.
Результат вызова
После исполнения смарт-контракт будет генерировать TxReceipt
в блок и и стремиться к консенсусу. Вы можете использовать RPC для отслеживания TxReceipts из транзакций в цепи.