ICON DAPP от А до Я. Часть 1: Инструменты и окружающая среда

ICON Network Topology & Ecosystem

Этот учебник предполагает, что у вас нет предварительных знаний о разработке blockchain, возможно, вы прошли курс или два с минимальным пониманием концепций программирования, хотите создать свое первое децентрализованное приложение или изучить основы разработки смарт-контрактов ICON. К концу этого урока вы познакомитесь со средой разработки ICON, научитесь писать и развертывать SCORE (Smart Contract) в сети ICON. Это часть 1 интенсивной и всеобъемлющей программы обучения, которая позволит вам создать свой первый значок DAPP от A-Z.

Уровень: Начинающий

Разделы обучения:
Terminal ★☆☆☆☆
Programming Concepts ★☆☆☆☆
Python ☆☆☆☆☆
ICON SDK ☆☆☆☆☆
T-Bears (Local Emulated ICON Node) ☆☆☆☆☆
SCORE (Smart Contract) ☆☆☆☆☆

Как следовать этому руководству.

Этот учебник предназначен для начинающих, он должен следовать сверху вниз в последовательности. Если у вас уже есть знания определенного раздела, не стесняйтесь, чтобы пропустить и перейти к следующему разделу.

Давайте начнем-изучать Python

В настоящее время доступны два SDK (Python и Java), это интерфейс, который позволяет вызывать все основные службы ICON. Поскольку вся кодовая база ICON написана на Python, это, вероятно, лучший язык для начала, поскольку Python SDK, вероятно, будет наиболее стабильным и актуальным.

Установить Python
Сначала нам нужно установить Python, следуйте этому полному учебнику по установке для вашей операционной системы, убедитесь, что вы установили последнюю версию или, по крайней мере, 3.5+, чтобы все работало правильно.

Руководство по установке и настройке Python 3: https://realpython.com/installing-python/

Изучать Python
Я прочитал несколько книг, прошел онлайн-курсы и видео-уроки, я нахожу “Learn Python” на сегодняшний день самым простым, чтобы разобраться в основах Python. Как правило, мы не хотим вдаваться во все мельчайшие подробности, и мы хотим потратить как можно меньше времени, чтобы мы могли читать/писать код и использовать SDK без языкового барьера. Со временем вы сможете перевести свою логику в код Python с помощью практик и фактического построения.

Изучение Python: http://learnpython.org

На сайте также встроен интерактивный режим, в котором можно экспериментировать с кодом онлайн. Убедитесь в том, чтобы сделать все упражнения в конце каждого урока, хорошо подумайте, прежде выкладывать свое решение. Завершите весь урок до конца от «Hello World» до «Advanced Tutorials». В зависимости от уровня ваших навыков программирования, это займет от 1–2 часов до 2–3 дней. К концу занятий у вас должно быть достаточно навыков Python, чтобы выполнить разработку вашего SCORE (Smart Contract).

Виртуальная окружающая среда Python
Прежде всего, давайте создадим виртуальную среду Python. Python virtualenv — это изолированная рабочая среда, в которой можно указать версию Python для установки и использования без влияния на корневую установку. Связанные пакеты Python также устанавливаются в эту среду, так что проще говоря, это виртуальная среда, в которой вы можете указать, с какой версией пакета программного обеспечения вы хотите работать, не затрагивая остальные ваши проекты. Настоятельно рекомендуется всегда работать под virtualenv. Предполагая, что у вас есть python 3.x и pip 3.x установлен из предыдущих инструкций, чтобы выполнить установку virtualenv.

# Install virtualenv
$ sudo pip3 install virtualenv
# Make a folder to work under
$ mkdir icon-tutorial && cd icon-tutorial
# Make the virtual environment
$ virtualenv -p python3.6 venv
# Activate the environment
$ source venv/bin/activate # enter deactivate to exitТеперь вы должны увидеть приставку (venv) и использовать к вашему рабочему маршруту. Вы можете проверить версию Python в среде:

Теперь вы должны увидеть приставку (venv) и использовать к вашему рабочему маршруту. Вы можете проверить версию Python в среде:

$ python -V

Теперь имея основу, давайте глубоко погрузимся в среду разработки ICON. Я попытался создать среду под Windows, macOS и Linux, все они работают под разными инструкциями по установке. Для целей этого урока мы разберем macOS, которая является предпочтительной средой разработки для команды ICON.

ICON Python SDK

ICON SDK для Python представляет собой набор библиотек, которые позволяют взаимодействовать с локальным или удаленным узлом Loopchain, используя соединение HTTP.

Вскоре мы подробно рассмотрим SDK, сначала давайте его установим.

$ sudo pip3 install iconsdk

Создание запроса
Теперь давайте сделаем наш первый вызов API с помощью ICON Python SDK:

# Enter interactive mode
$ python
>>> from iconsdk.icon_service import IconService
>>> from iconsdk.providers.http_provider import HTTPProvider
>>> icon_service = IconService(HTTPProvider("https://bicon.net.solidwallet.io/api/v3"))
>>> block = icon_service.get_block("latest")
>>> print(block)
>>> exit()
  • IconService содержит набор методов API. Он принимает HTTPProvider, который служит для подключения к серверам JSON-RPC на основе HTTP и HTTPS.
  • Поставщик определяет, как IconService подключается к Loopchain.
  • HTTPProvider берет полный URI, где сервер может быть найден. Для местного развития это было бы что-то вроде http://localhost:9000. В этом примере мы подключаемся к одной из многих конечных точек API testnet. список URI mainnet и testnet, а также доступность их служб, смотрите: http://iconstatus.spl3en.com

Мы попытались захватить последний блок из узла testnet, это должно вернуть аналогичный результат:

{'version': '0.1a', 'prev_block_hash': '47a450d4d7b44cba89fad97cf590d1aa375bf762788ddad7f29438c193758372', 'merkle_tree_root_hash': '2f018ea43471ca941977b70d27b7edd8c4d7a9a473e0ee0b7e1d3530412bff5b', 'time_stamp': 1539958749423136, 'confirmed_transaction_list': [{'from': 'hx2a445fe4e846403ff3698cece2f1e2a5a24fa7eb', 'to': 'hx56a9ccece79441b72aac162a8e95e0486fab94bf', 'value': 1022000000000000000, 'version': 3, 'nid': 3, 'stepLimit': 100000, 'timestamp': 1539958748264000, 'signature': 'nHXKv0/jBtOY/1a1fYHJujHL4TW2bdYMZWg795UjLTUxfuKq+ZZdQDNd03HsHcloy4NZ0xoRGQlAXlPFGFt2qwE=', 'txHash': '0x2f018ea43471ca941977b70d27b7edd8c4d7a9a473e0ee0b7e1d3530412bff5b'}], 'block_hash': '7b4771a571045e8f415f14f0607e3b5d2ffb0138107bb1f72dd9d67ef5e8ced1', 'height': 9697, 'peer_id': 'hxf64fc9c20c4a5b8c59e999405fbc941a96bc2c00', 'signature': '8NXFWdyHuFx5eD8eaJSOr9XPPQZ/236eFFUO0nFeKEkKnRNSWLLILHbVh1wxAimpmPuKZNK4AnUOsTtZXuTqgAE='}

Поздравляем, вы только что выполнили операцию на узле ICON, уже можете называть себя «blockchain expert» в своем резюме, но давайте пойдем дальше.

Рассмотрим еще кое что!

SDK предоставляет набор методов для запроса информации, набор методов для операций KeyWallet и набор методов для подписи и отправки транзакций. Они обычно связаны с разработкой смарт-контрактов, а также немного удивляют для некоторых разработчиков, где существует логика приложения, мы рассмотрим это позже.

Создание кошелька
Мы попробовали get_block, который является частью методов API запросов, давайте теперь поиграем с KeyWallet, который позволяет создавать кошелек ICX без использования ICONex.

# Enter interactive mode
$ python
# Create a wallet
>>> from iconsdk.wallet.wallet import KeyWallet
>>> wallet = KeyWallet.create()
# Check the wallet address
>>> wallet.get_address()
# Let try getting the private key
>>> wallet.get_private_key()
# Now let's create a keystore
>>> wallet.store('./iconkeystore', '@icon111')
# Let's create another wallet to test transactions later
>>> wallet2 = KeyWallet.create()
>>> wallet2.store('./iconkeystore2', '@icon222')
>>> exit()

В приведенном выше примере мы создали кошелек ICON, это фактически то же самое, что и создание кошелька из официального кошелька ICONex. Мы можем проверить это, фактически загрузив кошелек через ICONex либо через хранилище ключей, либо с помощью закрытого ключа.

Выберите Load Wallet
Любой вариант подходит
Используйте ключ “iconkestore” который вы создали, а также пароль “@icon111” при сохранении кошелька

Вы должны были успешно загрузить кошелек, созданный в ICONex.

Давайте протестируем ICX, введите адрес кошелька, начиная с «hx» ICON Testnet ICX Faucet, вы должны получить 20 тестовых ICX. Давайте используем SDK для проверки:

*ICON в настоящее время генерирует один блок каждые 2 секунды, скоро это вопрос секунд.

# Enter interactive mode
$ python
# Get balance through the querying method
>>> from iconsdk.icon_service import IconService
>>> from iconsdk.providers.http_provider import HTTPProvider
>>> icon_service = IconService(HTTPProvider("https://bicon.net.solidwallet.io/api/v3"))>>> balance = icon_service.get_balance('hxb94e8c183b72255057d9d05a28532afa2787682c')
>>> print(balance)

Теперь вы должны увидеть баланс 20000000000000000000 в вашем кошельке. Токен использует 18 знаков после запятой, поэтому Ваш баланс равен 20.000000000000000000 ICX. Если вы хотите проверить баланс в ICONex, не забудьте переключиться на тестовую сеть “YEOUIDO”. По умолчанию ICONex указывает на ICON mainnet, следуйте этой инструкции: как изменить сеть в расширении ICONex Chrome (https://icon-project.github.io/docs/icon_network.html#mainnet), чтобы включить выбор testnet.

Отправка транзакции

Здесь код немного длиннее, так что давайте работать в .py файле вместо интерактивного режима. Создайте новый файл с именем send_transaction.py в нашем текущем каталоге.

Значение основано на единице «loop», 1000000000000000000 loops = 1 ICX. Это много нулей для работы, и не очень разборчиво. По этой причине я разработал простой инструмент для преобразования в различные блоки, вы можете получить доступ к нему здесь: Unit Converter

# send_transaction.py
# Load our existing wallet 1
from iconsdk.wallet.wallet import KeyWallet
wallet = KeyWallet.load("./iconkeystore", "@icon111")
# Build a transaction instance, hard-code it to send 1 ICX from wallet 1 to wallet 2
transaction = TransactionBuilder()\
.from_(wallet.get_address())\
.to("hx4fbeb2879960248111e2006f12b8aba5173d1edd")\
.value(1000000000000000000)\
.step_limit(2000000)\
.nid(3)\
.nonce(100)\
.build()
from iconsdk.icon_service import IconService
from iconsdk.providers.http_provider import HTTPProvider
icon_service = IconService(HTTPProvider("https://bicon.net.solidwallet.io/api/v3"))
# Returns the signed transaction object having a signature
signed_transaction = SignedTransaction(transaction, wallet)
# Sends the transaction
tx_hash = icon_service.send_transaction(signed_transaction)

Сохранить файл.

  • from_: кошелек для инициирования транзакции
  • to: кошелек для получения транзакции (это может быть оценка, мы доберемся до этого)
  • valeu: количество ICX, которое нужно послать, содержит его 18 десятичных дробей.
  • step_limit: максимальное значение шага для обработки транзакции. Подобно пределу газа Ethereum.
  • nid: идентификатор сети. По умолчанию 1 значение указывает на ICON mainnet, узел, который мы тестируем в сети 3, https://bicon.net.solidwallet.io/
  • nonce: произвольное число, используемое для предотвращения конфликта хэшей транзакций. (Факультативный)
  • build: возвращает объект транзакции ICX.

Теперь мы можем выполнить это:

$ python send_transaction.py

В этом примере мы создали экземпляр транзакции через SDK и выполнили его с помощью метода Send_transaction IconService. Вы можете проверить баланс каждого кошелька *в ближайшее время с помощью метода get_balance (), который мы только что практиковали, в качестве альтернативы вы можете просмотреть обновленный баланс на ICONex.

Так как мы делаем переводы на ICON testnet, вы также можете проверить детали сделки на Live tracker: https://bicon.tracker.solidwallet.io/address/hx4fbeb2879960248111e2006f12b8aba5173d1edd

**Transaction Fees (операционный сбор)**

Давайте потратим минуту, чтобы быстро объяснить комиссии за транзакции,

«Step» является базовой единицей для расчета транзакций и издержек в сети ICON, коэффициент конверсии 100,000,000 Step = 1 ICX.

Steps, требуемые для каждой транзакции = макс ( [ ( ∑ ßiSi + С ), С] ), где ∑ ßiSi является суммой различных SCORE операции, вес которых определен в желтой бумаге (yellow paper), в раздеое: «Transaction Fee and SCORE Operation Policy», а С является постоянной в 100 000 шагов (что эквивалентно 0.001 ICX)

Фактический операционный сбор рассчитывается с помощью

Fee = usedStep * stepPrice где usedStep мы только что рассчитали выше и stepPrice является фактическим $ICX по курсу.

На момент написания этой статьи у нас нет никаких функциональных баллов, работающих в сети ICON, поэтому операционные сборы составляют 0,001 ICX по всем направлениям при проверке ICON tracker.

Вот и все для ICON SDK. Для получения полного списка ICON Python SDK API, посетите: https://github.com/icon-project/icon-sdk-python/blob/master/README.md

ICON T-Bears

До сих пор мы использовали SDK для выполнения основных операций непосредственно на узле testnet с помощью ICON Service. Это не идеально по очевидным причинам, мы должны тестировать локально в тестовой среде с нашим собственным счетом и развертывать, когда все будет готово. ICON подготовил пакет разработки под названием T-Bears с набором команд CLI, а также локальную emulated environment для полного узла в сети ICON.

Обзор T-Bears

T-Bears — это набор инструментов разработки для SCORE. T-Bears предоставляет шаблон проекта для SCORE, чтобы помочь начать прямо сейчас. Вы можете кодировать и тестировать смарт-контракт локально в emulated environment, а когда будете готовы, развернуть SCORE в сети ICON из интерфейса командной строки.

ICON RPC-сервер

Модуль, который обрабатывает запрос API ICON JSON-RPC и отправляет ответ клиенту. Спецификации API определены: ICON JSON-RPC API v3

ICON Service

Модуль, который управляет жизненным циклом SCORE и его выполнением. Переход состояния SCORE хранится в базе данных (LevelDB). Служба ICON также управляет состоянием ICX.

T-Bears CLI

T-Bears Интерфейс Командной Строки. Поддерживает следующие функции :

  • Управление сервисом T-Bears
  • Развернуть оценку
  • Отправить транзакцию
  • Отправить запрос

Для получения полной информации посетите: Command-line Interfaces

T-Bears Блок Менеджер

Эмулятор LoopChain для сервиса T-Bears. Он не имеет полных функций «консенсуса» и «коллегиального управления». Этот модуль обрабатывает транзакции и эмулирует генерацию блоков.

Очередь сообщений

Очередь сообщений используется для межкомпонентного взаимодействия.

Не беспокойтесь, если вы не понимаете, что делает каждый из вышеперечисленных компонентов, мы вскоре узнаем через упражнение. Сначала давайте установим сервисную среду T-Bears.

Вариант установки 1: Docker Container (не рекомендуется для этого урока)

Команда подготовила изображение docker с каждым компонентом, уже встроенным внутрь, вы можете получить изображение с помощью этой команды:

$ docker run -it --name tbears-container -p 9000:9000 iconloop/tbears

Вариант установки 2: Установите каждый компонент по одному (рекомендуется для этого учебника)

В этом руководстве используется опция 2, чтобы установить каждый компонент по одному, поэтому мы не будем работать внутри docker container.

# Install some dependencies you don't need to worry about
$ brew install leveldb autoconf automake pkg-config libtool libffi gmp
# Install RabbitMQ, this is used for the Message Queue
$ brew install rabbitmq
# Install ICON Service
$ sudo pip3 install iconservice
# Install ICON Commons (for T-Bears configurations and logs)
$ sudo pip3 install iconcommons
# Install ICON RPC Server
$ sudo pip3 install iconrpcserver
# Install T-Bears
$ sudo pip3 install tbears

На этом этапе у нас есть локальный эмулированный узел, готовый к запуску, нам нужно сначала запустить службу очереди сообщений:

$ brew services start rabbitmq

Теперь мы можем запустить T-Bears:

$ tbears start

Давайте экспериментировать с T-Bears, помните наш первый API запроса к ICON testnet? Давайте сделаем вызов API, на этот раз в наш местный эмулируемый узел:

# Enter interactive mode
$ python
>>> from iconsdk.icon_service import IconService
>>> from iconsdk.providers.http_provider import HTTPProvider
>>> icon_service = IconService(HTTPProvider("http://localhost:9000/api/v3"))
>>> block = icon_service.get_block("latest")
>>> print(block)
>>> exit()

Обратите внимание на это, вместо подключения к узлу testnet — [bicon.net.solidwallet.io](https://bicon.net.solidwallet.io/api/v3), мы подключаемся к localhost.

T-Bears имеет 19 команд: init, start, stop, deploy, clear, samples, genconf, transfer, txresult, balance, totalsupply, scoreapi, txbyhash, lastblock, blockbyheight, blockbyhash, keystore, sendtx , call

Вы можете запустить:

tbears -h

Чтобы вывести список доступных команд для использования конкретной команды, вы можете выполнить:

tbears command -h

Давайте попробуем несколько команд T-Bears, помните send_transaction.py скрипт, который мы экспериментировали ранее через SDK? Мы можем достичь тех же результатов с помощью T-Bears, сначала запустите команду help, чтобы увидеть, какие аргументы необходимы:

$ tbears transfer -h
usage: tbears transfer [-h] [-f FROM] [-k KEYSTORE] [-n NID] [-u URI]
[-p PASSWORD] [-s STEPLIMIT] [-c CONFIG]
to value
Transfer ICX coin.
positional arguments:
to                    Recipient
value                 Amount of ICX coin in loop to transfer (1 icx = 1e18
loop)
optional arguments:
-h, --help            show this help message and exit
-f FROM, --from FROM  From address.
-k KEYSTORE, --key-store KEYSTORE
Keystore file path. Used to generate "from" address
and transaction signature
-n NID, --nid NID     Network ID (default: 0x3)
-u URI, --node-uri URI
URI of node (default: http://127.0.0.1:9000/api/v3)
-p PASSWORD, --password PASSWORD
Keystore file's password
-s STEPLIMIT, --step-limit STEPLIMIT
Step limit
-c CONFIG, --config CONFIG
Configuration file path. This file defines the default
values for the properties "keyStore", "uri", "from"
and "stepLimit". (default: ./tbears_cli_config.json)

Мы хотим отправить из кошелька 1, поэтому нам нужно будет предоставить хранилище keystore/password через -k keystore и-p password. Поскольку наши балансы хранятся в узле testnet, нам нужно указать node-uri для выполнения операции под URI через -u, если вы не укажете правильный узел (localhost по умолчанию), вы получите исключение balance, так как у вас нет ICX в этих кошельках локально. Самый последний аргумент — это значение для отправки в «loops», которое является наименьшей единицей в ICX, коэффициент преобразования равен 1e18 loops = 1 ICX. (1e18 = 1,000,000,000,000,000,000)

$ tbears transfer -k ./iconkeystore -p "@icon111" hx4fbeb2879960248111e2006f12b8aba5173d1edd -u https://bicon.net.solidwallet.io/api/v3 1e18

Проверьте баланс через SDK или ICONex, 1 ICX должен был быть переведен из кошелька 1 в кошелек 2.

Давайте рассмотрим наиболее важные особенности разработки и выполнения T — Bears-SCORE. tbears init для инициализации нового SCORE и simple tbears для создания образца SCORE. tbears sendtx, tbears sendtx и tbears call — команды используются для развертывания SCORE, отправки транзакции и вызов функции.

*Мы собираемся инициализировать новый SCORE , вы можете запустить tbears samples, которые будут генерировать два проекта sample SCORE автоматически.

# Create a new directory to work under
$ mkdir SCORE && cd SCORE
# Initialize a SCORE project
$ tbears init my_first_score FirstScore

Это запустит среду разработки SCORE и создаст my_first_score.py и .package.json в my_first_score каталоге. Имя SCORE классифицируется как FirstScore. Файлы конфигурации по умолчанию «tbears_server_config.json» используется при запуске T-Bears и «tbears_cli_config.json» используется при развертывании SCORE, также генерируются. Keystore_test1 также создается, это кошелек по умолчанию во всех этих файлах конфигурации, откройте файл и скопируйте адрес кошелька:

# Check how much ICX keystore_test1 has
$ tbears balance hxe7af5fcfd8dfc67530a01a0e403882687528dfcb

баланс в десятичную: 800460000000000000000000000

Отлично, мы получили большой запас, теперь у нас есть много ICX для работы.

# Deploy the SCORE we just created
$ tbears deploy my_first_score/

Вы должны увидеть подобное сообщение:

If you want to check SCORE deployed successfully, execute txresult command
transaction hash: 0xb4563bc9994572ff4e9ca744628c388127b41f3072919a923a53f48f9f195085

Следуйте инструкции:

$ tbears txresult 0xb4563bc9994572ff4e9ca744628c388127b41f3072919a923a53f48f9f195085

Если вы не видите сообщений об ошибках в результате JSON, SCORE успешно развернута на локальном хосте.

Удобный способ проверить, какие функции вы можете вызвать на SCORE путем запроса его открытых методов через scoreapi:

# Check SCORE API
$ tbears scoreapi cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b

Вы увидите функцию «hello»:

SCORE API: [
{
"type": "fallback",
"name": "fallback",
"inputs": []
},
{
"type": "function",
"name": "hello",
"inputs": [],
"outputs": [
{
"type": "str"
}
],
"readonly": "0x1"
}
]

Это полный список внешних API в вашем счете, вы можете проверить это, открыв my_first_score/my_first_score.py файл, функции с @external decorator доступны для общего пользования.

Далее мы сделаем вызов этой функции через ICON JSON-RPC V3. Сначала создайте файл JSON «call.json», мы собираемся вызвать функцию hello:

# call.json
{
"jsonrpc": "2.0",
"method": "icx_call",
"params": {
"from": "hxe7af5fcfd8dfc67530a01a0e403882687528dfcb",
"to": "cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b",
"dataType": "call",
"data": {
"method": "hello"
}
},
"id": 1
}

Выполните его с:

$ tbears call call.json

Функция “hello” возвращает строку “Hello”.

response : {
"jsonrpc": "2.0",
"result": "Hello",
"id": 1
}

Далее мы собираемся попробовать sendtx tbears, который вызывает ICON icx_sendTransaction JSON-RPC.

# Check SCORE balance first
$ tbears balance cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b

остаток в десятичном формате: 0

Как и ожидалось, в контракте 0 сальдо. В следующем упражнении мы намеренно создадим некоторые ошибки и исправим их, вы узнаете еще несколько вещей, которые будут полезны при отладке вашего SCORE в будущем. Сначала создайте новый файл send.json

Обратите внимание, что значение здесь принимает шестнадцатеричный формат, вы можете использовать этот инструмент, чтобы сделать преобразование из десятичных знаков. Unit Converter

# send.json
{
"jsonrpc": "2.0",
"method": "icx_sendTransaction",
"params": {
"version": "0x3",
"from": "hxe7af5fcfd8dfc67530a01a0e403882687528dfcb",
"value": "0xde0b6b3a7640000",
"stepLimit": "0x200000",
"nid": "0x3",
"nonce": "0x1",
"to": "cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b",
"dataType": "call"
},
"id": 1
}

Теперь пошлите этот запрос через CLI T-Bears:

$ tbears sendtx -k keystore_test1 send.json
# default password is test1_Account

Вам будет предложено ввести пароль для хранилища ключей, пароль по умолчанию: test1_Account

Теперь проверьте баланс SCORE, вы, вероятно, ожидали увидеть 1 ICX

$ tbears balance cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b

остаток в десятичном формате: 0

Подожди, здесь что-то не так. Первое, что нужно сделать в такой ситуации, это всегда сначала проверять результат транзакции:

$ tbears txresult 0x0c65bdb4de42cd773e22d07c92d5d80cf4bdaf2b6758535fe299fb40f5381914

Результат:

Transaction result: {
...
"failure": {
"code": "0x7d64",
"message": "This is not payable"
}

шаблон SCORE по умолчанию не имеет методов оплаты для получения средств, давайте создадим функцию в my_first_score/my_first_score.py

# my_first_score.py
...
@external
@payable
def receive_funds(self) -> None:
Logger.debug(f'{self.msg.value} received from {self.msg.sender}', TAG)

Ваш файл должен выглядеть примерно так:

Затем нам придется изменить метод для вызова файла send.json:

# send.json
{
"jsonrpc": "2.0",
"method": "icx_sendTransaction",
"params": {
"version": "0x3",
"from": "hxe7af5fcfd8dfc67530a01a0e403882687528dfcb",
"value": "0xde0b6b3a7640000",
"stepLimit": "0x200000",
"nid": "0x3",
"nonce": "0x1",
"to": "cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b",
"dataType": "call",
"data": {
"method": "receive_funds"
}
},
"id": 1
}

Попробуем отправить запрос еще раз:

$ tbears sendtx -k keystore_test1 send.json

Проверьте результат транзакции:

$tbears txresult 0xcbba1562a09adc6d8933812edd3d337ad8130d8cad89b154378a2ef2c1968174

Работает?

"failure": {
"code": "0x7d00",
"message": "'FirstScore' object has no attribute 'receive_funds'"
}

Нет, недавно добавленная функция receive_funds не найдена. Причина в том, что мы уже развернули SCORE на нашем узле localhost, внесение изменений в определение SCORE потребует обновления смарт-контракта (уникальная функция в ICON, которая является обновляемыми смарт-контрактами на blockchain). Это можно сделать командой deploy с указанным режимом развертывания:

$ tbears deploy my_first_score -m update -o cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b -k keystore_test1

Теперь SCORE должен быть обновлен с помощью нашего нового метода receive_funds, отправьте запрос еще раз:

$ tbears sendtx -k keystore_test1 send.json

Теперь проверьте баланс еще раз:

$ tbears balance cx4f1ac3681a51dbbca949c5b411e6a6dadcfd6d2b

баланс в десятичном формате: 1000000000000000000

В этом упражнении мы решили реализовать платный метод для непосредственного получения средств и сделать запрос JSON RPC API методом receive_funds. Альтернативно, если мы не указываем.

# send.json
"data": {
"method": "receive_funds"
}

Без предоставления метода для этого запроса означает, что метод не вызывается, в этом случае будет вызван метод afallback. Это разработано, чтобы принять передачи ICX и другие цели (резервный вариант не может быть создан с помощью @external, таким образом, это не может быть запрошено извне). Мы могли бы реализовать «fallback» вместо этого.

# my_first_score.py
@payable
def fallback(self):
...

Теперь, если мы сделаем запрос JSON без предоставления метода, он будет вызван и работать аналогично receive_funds.

Вот и все для T-Bears! Мы научились использовать T-Bears CLI для создания и развертывания SCORE, и выполнять различные операции. Мы также узнали, как сделать ICON JSON-RPC API отправив запрос на RPC Server, вызвав ICON Service. Очередь сообщений и менеджер блоков выполняют свои операции за кулисами, поэтому мы не будем углубляться в эти детали в этом уроке. На данный момент у нас есть все необходимые инструменты для начала построения смарт-контрактов в сети ICON. В следующем уроке мы рассмотрим, как написать SCORE, как развернуть его на удаленном узле testnet (в конечном итоге mainnet), синтаксис, рекомендации и понять его ограничения.

Уровень пройден!

Python ★★★☆☆

ICON SDK ★★★★★

T-Bears (Local Emulated ICON Node) ★★★★★

SCORE (Smart Contract) ☆☆☆☆

Источник: https://medium.com/@2infiniti/creating-icon-dapp-from-a-z-part-1-tools-environment-dd56f8dfc905

Присоединяйтесь к нам в Telegram: https://t.me/ICON_Foundation_Russia