- Introduction to smart contracts
- Простыми словами: смарт-контракты, Ethereum, ICO
- Идея Ethereum
- Примеры смарт-контрактов
- Ограничения смарт-контрактов
- Главное использование смарт-контрактов
- ICO — Initial Coin Offering
- Окупаемость криптоинвестиций
- Работа со смарт-контрактами через Ethereum RPC API
- Некоторые общие замечания
- Упаковка параметров и возвращаемых данных
- Создание счёта и работа с ним
- Создание смарт-контракта
- Компиляция исходного кода смарт-контракта
- Извлечение кода из транзакции
- Расчет стоимости опубликования контракта
- Выполнение транзакции на публикацию контракта
- Взаимодействие со смарт-контрактом
- Создание контракта с параметрами
- Идентификация методов контракта
- Вызов методов запроса информации
- Вызов методов, изменяющих состояние контракта
- Резюме
Introduction to smart contracts
What is a smart contract?
A «smart contract» is simply a program that runs on the Ethereum blockchain. It’s a collection of code (its functions) and data (its state) that resides at a specific address on the Ethereum blockchain.
Smart contracts are a type of Ethereum account. This means they have a balance and they can send transactions over the network. However they’re not controlled by a user, instead they are deployed to the network and run as programmed. User accounts can then interact with a smart contract by submitting transactions that execute a function defined on the smart contract. Smart contracts can define rules, like a regular contract, and automatically enforce them via the code.
Make sure you’ve read up on accounts, transactions and the Ethereum virtual machine before jumping into the world of smart contracts.
A digital vending machine
Perhaps the best metaphor for a smart contract is a vending machine, as described by Nick Szabo. With the right inputs, a certain output is guaranteed.
To get a snack from a vending machine:
This logic is programmed into the vending machine.
A smart contract, like a vending machine, has logic programmed into it. Here’s a simple example of how this vending machine might look like as a smart contract:
Like how a vending machine removes the need for a vendor employee, smart contracts can replace intermediaries in many industries.
Anyone can write a smart contract and deploy it to the network. You just need to learn how to code in a smart contract language, and have enough ETH to deploy your contract. Deploying a smart contract is technically a transaction, so you need to pay your Gas in the same way that you need to pay gas for a simple ETH transfer. Gas costs for contract deployment are far higher, however.
Ethereum has developer-friendly languages for writing smart contracts:
However, they must be compiled before they can be deployed so that Ethereum’s virtual machine can interpret and store the contract. More on compilation
Smart contracts are public on Ethereum and can be thought of as open APIs. That means you can call other smart contracts in your own smart contract to greatly extend what’s possible. Contracts can even deploy other contracts.
Smart contracts alone cannot get information about «real-world» events because they can’t send HTTP requests. This is by design. Relying on external information could jeopardise consensus, which is important for security and decentralization.
There are ways to get around this using oracles.
Smart contract resources
OpenZeppelin Contracts — Library for secure smart contract development.
DappSys — Safe, simple, flexible building-blocks for smart-contracts.
Источник
Простыми словами: смарт-контракты, Ethereum, ICO
Автор статьи — Алексей Маланов, эксперт отдела развития антивирусных технологий «Лаборатории Касперского»
Про Биткойн слышали многие, что и не удивительно — эта криптовалюта была первой и до сих пор остается самой популярной и самой крупной. Успех Биткойна вдохновил на подвиги кучу людей, поэтому за последние пару лет разных криптовалют — так называемых альткойнов — насоздавали ужас сколько, больше 1000.
Так вот, Биткойн — на данный момент однозначно номер один. А знаете, какая криптовалюта на втором месте? Ethereum. Когда мы говорим про места, мы имеем в виду капитализацию, то есть суммарную стоимость всех монет валюты.
Капитализация и цены TOP-5 криптовалют. Источник
Как видите, Ethereum с большим отрывом опережает другие «альткойны», а в июне 2017 чуть было даже не обогнал Биткойн, «великий и ужасный». Давайте разберемся, что же в Ethereum такого особенного и почему подавляющее большинство проводимых в этом году ICO используют именно его.
Идея Ethereum
Ethereum запустился совсем недавно, 30 июля 2015 года. Одним из его создателей был нынче известный в блокчейн-тусовке и, не побоюсь этого слова, влиятельный Виталик Бутерин. Он родился в России, но с шести лет жил в Канаде. На тот момент, когда он изложил свои идеи, которые в итоге легли в основу сети Ethereum, ему было 19 лет.
Так вот, в чем же идея? В сети Биткойн с точки зрения пользователя все устроено довольно просто. Есть кошельки, можно передавать деньги с одного кошелька на другой или на несколько сразу. Сеть построена на весьма остроумных принципах, позволяющих обходиться без единого центра, но задачи решаются вполне классические. Обычная платежная система, по большому счету: люди, деньги, переводы — все, больше ничего нет.
Но можно пойти дальше и создать такую платежную сеть, которая позволяет писать программы, которые бы работали с кошельками, сами бы принимали с кошельков деньги, решали, кому сколько отправить и так далее. С важным условием: для всех пользователей каждая такая программа будет работать по известным принципам, предсказуемо, одинаково, прозрачно, и чтобы никто не мог ее изменить.
Собственно, создатели Ethereum как раз и добавили к базовой функциональности криптовалют возможность создавать подобные программы. Все кошельки в Ethereum делятся на два типа: те, что управляются людьми, и те, что управляются автономно программами.
Программы — их называют смарт-контрактами — записываются в блокчейн. Таким образом, эта программа запоминается навсегда, у всех участников сети есть ее копия (блокчейн ведь у всех одинаковый), соответственно и выполняется смарт-контракт у всех тоже идентично.
И вот это нововведение существенно расширило сферу применения блокчейн-валют.
Примеры смарт-контрактов
Какие программы можно написать? Да какие угодно. Например, финансовую пирамиду. Для этого в сети Ethereum достаточно создать смарт-контракт со следующими правилами:
- Если с адреса кошелька A пришла сумма X, запомнить это в табличке долгов.
- Если после этого с адреса B пришла сумма Y > 2*X, отправить 2*Х денег на адрес А, запомнить долг участнику B.
- И так далее для каждого участника.
- Опционально: отправлять 5% всех поступающих денег автору смарт-контракта.
Или можно устроить аукцион. Пишем программу:
- Если аукцион еще не окончен, запоминаем адреса отправителей и суммы ставок каждого участника.
- Когда аукцион окончен, выбираем максимальную ставку, объявляем победителя, высылаем обратно все остальные ставки.
- Опционально: высылаем выигранный лот, если Ethereum имеет представление, что это такое.
Есть еще миллион применений: кошельки с несколькими владельцами, финансовые инструменты, самоисполняющиеся пари, голосования, лотереи, игры, казино, нотариат и прочее.
Напомним преимущество: это блокчейн — все уверены, что никто не жульничает, все видят текст программы и понимают, что она работает именно так, как в ней написано. Программа — не человек. Она не скроется с деньгами, не обанкротится, и так далее. Если, конечно, в ней нет багов или «неожиданного поведения».
Ограничения смарт-контрактов
Но есть и существенные ограничения, вот некоторые из них:
- В программе очень сложно получить случайные числа и другую неопределенность. В некоторых лотереях умным участникам удается «подгадать» джекпот.
- Не так просто «спрятать» какую-то информацию. Например, список участников аукциона или их ставки.
- Если для работы контракта требуется информация, которой в блокчейне нет (например, текущий курс какой-нибудь валюты), то кто-то доверенный должен добавлять эту информацию в блокчейн.
- Для взаимодействия с контрактами пользователям нужен эфир — это внутренняя валюта Ethereum. Нельзя устроить голосование среди тех, у кого еще нет кошельков с деньгами.
- Смарт-контракты работают довольно медленно. На весь мир можно выполнять 3-5 транзакций в секунду.
- Сами смарт-контракты обычно выполняют немного действий, ведь в блокчейне каждый майнер должен будет эти действия повторить и сверить результат. Вдруг у него будет медленный компьютер.
- Если в смарт-контракте есть ошибки, то это навсегда. Единственный выход исправить ошибку — перейти на другой смарт-контракт, но только если возможность вывода денег и такого перехода была предусмотрена в программе изначально. Как правило, очень мало кто это предусматривает.
- Смарт-контракты могут зависнуть или вообще работать не так, как все ожидали, потому что не разобрались в программном коде.
Иными словами, как и в других областях, многое зависит от профессионализма авторов контрактов.
Главное использование смарт-контрактов
Простой смарт-контракт Ethereum. Имеющаяся ошибка позволяет украсть все деньги, кто нашел — молодец
Пирамиды, голосования, казино, лотереи — это все здорово. Но что оказалось действительно удобно делать при помощи смарт-контрактов — это надувать пузыри собирать деньги на свой стартап.
Ведь при помощи смарт-контракта можно автоматизировать всю «бухгалтерию»: контракт сам запомнит, от кого и сколько пришло денег, сам начислит «акции», а также даст возможность каждому участнику передавать и продавать эти акции. Не нужно никакой возни с адресами почты, кредитными картами, проверкой карт, авторизацией инвесторов и тому подобного. Вдобавок все видят, сколько всего было выпущено акций и как они распределились по участникам. От скрытого допечатывания акций и продажи одной акции несколько раз защищает блокчейн.
Смарт-контракты дали миллиону «криптоинвесторов» возможность «швырять деньги в монитор».
ICO — Initial Coin Offering
Нащупал эту нишу Ethereum не сразу. На 1 января 2017 стоимость одного эфира составляла $8, а своего пика (во всяком случае, пока) в $400 курс достиг к июню. Все благодаря большому количеству проводимых ICO — первичному предложению акций стартапов. Желание вложить эфир в какой-либо проект стимулирует спрос на эфир. А проектов этих сейчас — тьма.
График стоимости Ethereum. Источник
Обсудим ICO поподробнее. Типичная схема криптостартапа такова:
- У вас есть идея. Обычно она как-то связана с криптовалютой или блокчейном.
- На ее реализацию и запуск вам нужны деньги.
- Вы объявляете всем, что принимаете эфир, а взамен выдаете акции/токены/фантики при помощи смарт-контракта.
- Вы рекламируете свой проект и собираете требуемую сумму.
Сумма обычно составляет 10-20 миллионов долларов и собирается буквально за несколько минут, иногда дней. Как правило, ICO ограничено по времени или собираемой сумме — и это формирует ажиотаж.
Доходит до комических случаев. Например, в ходе ICO одного из проектов 35 миллионов долларов собрали за 24 секунды. А чтобы попасть в число «счастливчиков-участников», фанаты проекта платили до $6600 комиссии за транзакцию. Большой спрос и низкая пропускная способность Ethereum’а заставляет увеличивать комиссионные, чтобы отправить деньги и поучаствовать, а не остаться в хвосте очереди.
Окупаемость криптоинвестиций
Что будет дальше с выданными инвесторам токенами, зависит от проекта. Кто-то обещает выплачивать дивиденды с будущей прибыли, кто-то планирует принимать эти токены к оплате услуг, реализуемых проектом, кто-то ничего не обещает.
Как правило, сами токены выводятся на криптобиржу, и открываются торги. Те, кто не успел поучаствовать в ICO, могут купить их уже на бирже — скорее всего, подороже. Те, кто участвовал в ICO, чтобы потом перепродать подороже, могут их на бирже продать.
Иногда первых настолько больше, что цена растет стремительно, и капитализация проекта раздувается до миллиарда долларов. При том, что у него нет прибыли нет продукта, есть только идея, план и, в лучшем случае, команда.
Так как автор проекта собрал много денег, он этими же деньгами имеет возможность на бирже выкупать свои же токены, подогревая цену токена еще больше. На обычных биржах с обычными акциями такое поведение запрещено, но в криптоиндустрии регуляторов нет.
В 2017 году (к сентябрю) на ICO разные проекты уже собрали порядка 1,7 миллиарда долларов. Об успешных проектах слышно мало, но инвесторы не теряют оптимизма.
Источник
Работа со смарт-контрактами через Ethereum RPC API
Всем привет. В этой статье мы рассмотрим основные приемы по публикации смарт-контрактов и взаимодействию с ними с использованием Ethereum RPC API. Обсуждаемые методы API позволяют решать такие задачи:
- Создание счёта.
- Создание корректного смарт-контракта.
- Получение информации со смарт-контракта.
- Изменение состояния смарт-контракта.
Содержание:
- Некоторые общие замечания
- Упаковка параметров и возвращаемых данных
- Создание счёта и работа с ним
- Создание смарт-контракта
- Компиляция исходного кода смарт-контракта
- Извлечение кода из транзакции
- Рассчёт стоимости опубликования контракта
- Выполнение транзакции на публикацию контракта
- Взаимодействие со смарт-контрактом
- Создание контракта с параметрами
- Идентификация методов контракта
- Вызов методов запроса информации
- Вызов методов, изменяющих состояние контракта
Описание используемого API:
Некоторые общие замечания
- Все предлагаемые действия иллюстрируются реальными данными из тестовой сети Rinkeby (на момент написания статьи).
- Состояние транзакций, счетов и смарт-контрактов в Rinkeby можно отслеживать по сайту https://rinkeby.etherscan.io/ (для подсети Ropsten будет, соответственно, https://ropsten.etherscan.io/).
Упаковка параметров и возвращаемых данных
Эта часть также носит общий характер и поэтому вынесена в отдельную главку, но её изучение можно отложить до момента, когда непосредственно понадобится использовать параметры или разобрать ответ смарт-контракта.
Входящий (параметры) или исходящий пакет данных для контракта формируется по следующему принципу:
- Фиксированные по длине типы данных (address, uint32, bytes32) передаются с выравниванием до 32-байтного слова (64 hex-цифры).
- Переменные по длине типы данных (строковые, массивы) передаются по следующей схеме:
- В позиции объекта в списке передается смещение блока с его данными относительно начала пакета (с выравниванием до 32-байтного слова).
- В первом 32-байтном слове блока передается число единиц данных.
- В последующих 32-байтных словах передаются сами данные.
Рассмотрим, например, блок, в котором передается следующий набор данных: address , string , uint32 , address[] (в начале каждой 32-байтовой строки для удобства дан ее шестнадцатеричный адрес относительно начала блока).
В строке 000 передается адрес 0х570f5d143ee469d12dc29bf8b3345fa5536476d9 .
В строке 020 передается ссылка на блок, описывающий переменную типа string — 0x80 байт от начала блока.
В строке 040 передается целое число 0х1234 .
В строке 060 передается ссылка на блок, описывающий массив address[] — 0xc0 байт от начала блока.
В строке 080 передается счетчик символов переменной типа string — 3 .
В строке 0a0 передаются сами символы переменной типа string — слово New .
В строке 0c0 передается счетчик элементов массива address[] — 2 .
В строке 0e0 передается первый элемент массива address[] — 0хaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa .
В строке 100 передается второй элемент массива address[] — 0хbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb .
Внимание! Весь блок передается одним слитным массивом:
Создание счёта и работа с ним
Для создания нового счёта используется метод personal_newAccount , в качестве параметра которому передаётся пароль, который в дальнейшем будет использоваться для разблокировки счёта:
В ответ приходит идентификатор счёта, в данном случае — 0xfbeda9914b78b58a0f0e810298f9d545f8379f8d .
Все дальнейшие манипуляции мы будем производить с этого счета — 0xfbeda9914b78b58a0f0e810298f9d545f8379f8d .
Теперь нам необходимо положить на него некоторую сумму для оплаты исполнения транзакций. Так как в тестовой сети Rinkeby поучаствовать в майнинге человеку со стороны невозможно, то для пополнения счетов предусмотрен специальный «кран», процедура использования которого описана здесь — https://faucet.rinkeby.io/.
Для пополнения счета необходимо:
- Зарегистрироваться на github.com и создать новый gist:
Вписать в него идентификатор счета:
и создать публичный gist («Create public gist»)
Далее нам понадобится URL gist-а, в нашем случае — https://gist.github.com/oldmadjackal/6e246d3f199a80bfb82bfe626faad604:
Переходим на https://faucet.rinkeby.io/, вводим URL gist-а в поле и выбираем сумму пополнения счёта:
Если всё хорошо, то появится зелёное сообщение с подтверждением. Транзакция может пройти не очень быстро — за 5-10 минут.
Смотрим счёт на EtherScan:
Для того, чтобы использовать средства со счета — выполнять транзакции любого вида — счёт необходимо разблокировать. Для разблокировки счёта используется метод personal_unlockAccount. В качестве параметров указываются идентификатор счёта, пароль и продолжительность разблокировки в секундах:
Создание смарт-контракта
Технически смарт-контракт создаётся транзакцией, содержащей в поле данных байт-код контракта и блок параметров инициализации, если такие предусмотрены смарт-контрактом.
Байт-код контракта для формирования транзакции создания может быть получен следующими способами:
- Компиляцией из исходного текста смарт-контракта.
- Извлечением из другой транзакции создания такого же смарт-контракта.
Второй способ можно использовать, чтобы хранить шаблон создания контракта непосредственно в блокчейне — тогда достаточно знать идентификатор транзакции, чтобы его извлечь и «клонировать».
Технически можно извлечь код транзакции непосредственно по идентификатору уже существующего смарт-контракта (метод eth_getCode), но этого делать НЕЛЬЗЯ, так как он выдаёт байт-код, подвергшийся специальной обработке при создании смарт-контракта (в частности, из него удаляются блоки инициализации).
Компиляция исходного кода смарт-контракта
Для компиляции исходного кода на Solidity я использую Remix — https://remix.ethereum.org/.
Вводим текст контракта, если ошибок нет — в поле Bytecode будет находиться собственно байткод, в нашем случае:
Извлечение кода из транзакции
Для извлечения кода из транзакции используется метод eth_getTransactionByHash . В нашем примере «клонируемый» смарт-контракт был создан транзакцией 0xc4d20bb8f9eede45968fc6bc850397e92b9f263eeb11200615cc08562d46c2e7 .
В тэге input ответа содержится байткод контракта.
Обратите внимание, что если конструктор смарт-контракта предусматривает использование параметров, то кроме байт-кода в тэге input будут указаны значения параметров, следующих сразу следом за байт-кодом. При создании шаблона смарт-контракта для последующего клонирования можно использовать нулевые значения параметров.
Расчет стоимости опубликования контракта
Для расчета стоимости опубликования контракта используется метод eth_estimateGas , в параметрах которого следует указать номер счета (тэг from ), с которого будет создан контракт, а также байт-код контракта (тэг data ). В ответе будет указано необходимое количество Gas.
Если конструктор смарт-контракта предполагает использование параметров, то они должны быть включены в запрос в тэге data сразу после байт-кода. В противном случае расчет Gas будет некорректным.
Обратите внимание, что в некоторых случаях смарт-контракты содержат семантические (не синтаксические) ошибки, которые пропускаются компилятором, но приводят к неработоспособности контракта. Одним из признаков появления такой ошибки будет резкое — в разы, возрастание стоимости создания контракта.
Выполнение транзакции на публикацию контракта
Для публикации контракта используется метод eth_sendTransaction . В качестве параметров методу передаются:
- номер счета, с которого создаётся контракт (тэг from );
- стоимость публикации в Gas (тэг gas , берется из предыдущего пункта);
- байт-код контракта с пристыкованным блоком параметров конструктора (тэг data , должен полностью совпадать с использованным в предыдущем пункте).
В ответ мы получим номер транзакции:
или сообщение об ошибке:
Теперь необходимо дождаться завершения транзакции и получить результат её исполнения — создан контракт или нет. Для этого используется метод eth_getTransactionReceipt :
Пока транзакция находится в «листе ожидания» (Pending Txn), будет выдаваться следующий ответ:
После исполнения транзакции мы получим полную «квитанцию», в теге contractAddress которой будет содержаться адрес созданного смарт-контракта:
Если в течении 5 минут квитанция не получена, то либо в сети проблемы, либо ваш узел не разослал проводку по сети. Чтобы понять истинную причину, следует просмотреть очередь Pending Txn на etherscan.io (https://rinkeby.etherscan.io/txsPending). Если транзакции там нет — значит, надо перезапустить клиент Ethereum и повторить публикацию заново.
Теперь следует проверить, корректно ли создался смарт-контракт. Для этого можно использовать метод eth_getCode — получение кода контракта по его адресу:
Если контракт создался некорректно, то будет получен ответ:
Если в тэге result выдаются некоторые данные, отличные от 0x , то контракт создан успешно.
Взаимодействие со смарт-контрактом
Для демонстрации взаимодействия со смарт-контрактом будем использовать следующий образцовый смарт-контракт:
При создании контракта (конструктор — функция Test ) ему передаются адрес Продавца ( seller_ ) и адрес Банка ( bank_ ). Метод GetStatus возвращает адресa Продавца, Банка и текущий статус контракта. Метод SetBankCert предназначен для сохранения в контракте некоторого цифрового идентификатора с переводом в статус «Confirmed».
Создание контракта с параметрами
Если конструктор смарт-контракта использует параметры (как в нашем демонстрационном примере), то они должны быть «упакованы» в соответствии с описанием «Упаковка параметров и возвращаемых данных» и присоединены в хвост к байт-коду контракта.
В нашем случае, передача адреса Продавца 0x794ce6de39fa2d274438cc1692db04dfb5bea836 и адреса Банка 0xfbeda9914 b78b58a0f0e810298f9d545f8379f8d при создании смарт-контракта будет выглядеть следующим образом (байт-код контракта кончается на 0029 ):
Еще раз обращаю внимание, что расчет Gas должен выполняться для всего блока Байт-код + Параметры, иначе контракт или не будет создан, или будет неработоспособен.
Наш тестовый демо-контракт был создан по адресу 0x3d20e579f5befdc7d3f589adb6155f684d9a751c .
Идентификация методов контракта
Для идентификации метода смарт-контракта, к которому мы обращаемся, используются первые 4 байта (8 шестнадцатеричных цифр) от хэша описания метода.
Например, для метода GetStatus демо-контракта описанием будет GetStatus() , а для метода SetBankCert — SetBankCert(address) . Особое внимание следует обратить на отсутствие пробелов в описании — были печальные прецеденты :(.
Для определения хэша используется метод web3_sha3 , при этом строчное значение следует давать в шестнадцатеричном представлении (для GetStatus() это будет 0x4765745374617475732829 ):
Соответственно, идентификатором метода GetStatus будет 0xabd95b95 , для метода SetBankCert идентификатор — 0x1bb71149 .
Вызов методов запроса информации
Для вызова методов, не связанных с изменением состояния контракта (например, для получения информации о его текущем статусе), может быть использован метод API eth_call .
Запрос метода имеет такую структуру:
Блок формируется следующим образом:
где формируются, как указано в пункте «Упаковка параметров и возвращаемых данных».
Если метод не предполагает наличия параметров, то блок состоит только из идентификатора метода.
Например, для вызова метода GetStatus демо-контракта Test используется запрос:
на который будет дан ответ:
Разберем полученный ответ в соответствии с правилами пункта «Упаковка параметров и возвращаемых данных» и с учетом описания метода GetStatus — function GetStatus() constant returns (address, address, string retVal).
Для удобства анализа разложим ответ на 32-байтные слова:
Исходя из описания мы ожидаем получение следующего набора переменных: address, string. Таким образом:
- в строке 000 находится адрес Продавца (тип address ) — 0x794ce6de39fa2d274438cc1692db04dfb5bea836
- в строке 020 находится адрес Продавца (тип address ) — 0xfbeda9914b78b58a0f0e810298f9d545f8379f8d
- в строке 040 находится ссылка на блок описания статуса контракта (тип string ) — блок начинается с адреса 060
- в строке 060 находится счетчик символов в строке статуса контракта — 3 символа
- в строке 080 находятся собственно символы статуса контракта в шестнадцатеричной кодировке — New
Вызов методов, изменяющих состояние контракта
Для вызова методов, изменяющих состояние контракта, должен быть использован метод API eth_sendTransaction .
Запрос метода имеет такую структуру:
должен иметь баланс, достаточный для выплаты . Кроме того, следуют учитывать, что контракт может содержать внутренние условия по контролю , как, например, в методе SetBankCert нашего демо-контракта.
Блок формируется следующим образом:
где формируются, как указано в параграфе «Упаковка параметров и возвращаемых данных».
Если метод не предполагает наличия параметров, то блок состоит только из идентификатора метода.
Например, для вызова метода SetBankCert(«0хf7b0f8870a5596a7b57dd3e035550aeb5af16607») демо-контракта, будут иметь следующий вид:
Для определения стоимости исполнения, как и при создании смарт-контракта, используется метод eth_estimateGas , в который передаются всё те же параметры, которые затем будут переданы в методе eth_sendTransaction .
Как показывает опыт, если в вызываемом методе содержится транзакционный вызов других смарт-контрактов, то сумма Gas может быть рассчитана неверно и транзакция не исполнится. Поэтому рекомендую указывать заведомо большее количество Gas, так как, по идее, излишек использован не будет. В таких случаях я указываю количество Gas, близкое к максимальному — 0х200000 .
Далее вызываем метод eth_sendTransaction :
и получаем в ответ идентификатор транзакции:
Как и в случае с созданием смарт-контракта, ожидаем исполнения транзакции, запрашивая квитанцию (метод eth_getTran sactionReceipt):
Как только квитанция пришла — транзакция исполнилась:
Однако, само по себе исполнение транзакции вовсе не означает, что смарт-контракт переключился в нужное состояние, кроме того, могут не исполниться внутренние транзакционные вызовы других смарт-контрактов.
На мой взгляд, самый надежный способ проверить, что всё отработало — снова запросить состояние смарт-контракта и убедиться, что всё изменилось «как надо».
Разобрав ответ, мы увидим, что статус изменился на «Confirmed».
Резюме
В этом руководстве мы рассмотрели выполнение ряда задач, связанных с публикацией смарт-контрактов и взаимодействием с ними с помощью RPC API блокчейн-платформы Ethereum. Разобрались, как создавать счёт, как создавать корректный смарт-контракт, получать по нему информацию и изменять его состояние, а также выяснили, как с этим смарт-контрактом взаимодействовать.
Если у вас возникнут дополнительные вопросы, рад буду ответить/подсказать.
Источник