Как написать смарт-контракт на Python в сети Ontology. Часть 1: Blockchain Block API

Пиринговая платежная система, использующая одноименную расчетную единицу и одноименный протокол передачи данных, «Биткоин», многим полюбилась из-за криптографических методов, обеспечивающих защиту системы. Еще одним очевидным плюсом является то, что вся информация о транзакциях между адресами системы доступна в открытом виде. В этой статье мы рассмотрим способ добавления «Биткоин» на ваш сайт в качестве системы оплаты.

1. Введение

2. Как получить ключ API?

3. Создание новых адресов для ваших клиентов

4. Безопасность

5. Выводы

Введение

Биткоины — довольно привлекательный метод оплаты для онлайн-предпринимателей, в основном из-за того, что комиссия при использовании этого метода крайне незначительна в сравнении с PayPal или кредитными картами. Соответственно, это позволяет получить более высокую прибыль и предлагать услуги клиентам во всем мире по доступным ценам. Более того, биткоины формально не облагаются налогом, поскольку не представляют собой денежную форму, выдаваемую правительством. Также среди достоинств системы «Биткоин» можно выделить отсутствие необходимости обращения к посредникам.

В этой статье мы попробуем добавить биткоины в качестве способа оплаты на сайте. Для принятия платежей мы будем использовать Blockchain.info Receive Payments API V2, так как он прост, безопасен и может быть реализован менее чем за 10 минут.

Blockchain.info’s API V2

Paychanges API V2 Blockchain.info является самым простым и быстрым способом начать принимать платежи биткоинами от кого угодно в любой точке мира с помощью простого HTTP-GET-запроса. Стоит отметить, что одним из основных препятствий, связанных с принятием платежей биткойнами, является необходимость создания уникального адреса биткойнов для каждого нового пользователя или счета. Эти сгенерированные адреса должны быть под контролем и безопасно храниться. API приема платежей отвечает за создание и мониторинг биткоин-адресов. При получении платежей API позволяет уведомить сервер с помощью простой процедуры обратного вызова.

Что такое Bitcoin Core

Bitcoin Core

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

Первая версия приложения была разработана в 2009 году Сатоши Накамото и носила то же самое название, что и основной продукт — Bitcoin. До 2011 года код кошелька публиковался на самом популярном на тот момент портале для разработчиков SourceForge. Затем состоялся «переезд» на GitHub, где и размещаются все результаты разработки по сегодняшний день. С самого начала официальным веб-ресурсом блокчейн-проекта и кошелька был сайт Bitcoin.org, с которого также всегда можно скачать последнюю версию приложения.

С 2012 года поддержкой разработки всего ПО на базе оригинального кода биткоина занимается некоммерческая организация Bitcoin Foundation. По ее инициативе в декабре 2013 года бумажник был переименован на Bitcoin Core, под которым и известен до сегодня.

В октябре 2016-го этот биткоин кошелек стал одним из первых приложений, в которых появилась возможность отправки транзакций на базе все еще тестируемой на тот момент технологии SegWit, нацеленной на улучшение масштабирования и пропускной способности сети. А в версиях, выпущенных после февраля 2018-го, поддержка Segregated Witness уже включена по умолчанию.

В данный момент Bitcoin Core является одним из немногих безостановочно развивающихся криптовалютных кошельков, поддерживающих исключительно BTC. Выпускается только в десктопной версии для компьютеров под управлением Windows, MacOS или Linux. Относится к категории «толстых» кошельков и является самым популярным ее представителем.

Видеообзор Bitcoin Core на Ютуб смотрите в видео ниже:


Обзор Bitcoin Core


Как получить ключ API?

Чтобы использовать API Blockchain.info, вы должны заполнить форму заявки по адресу:

https://api.blockchain.info/v2/apikey/request/

Обратите внимание, что этот ключ API предназначен только для получения платежей. Существует стандартный API кошелька, который доступен в Python, Java, .NET (C #), Ruby, PHP и Node и может использоваться для отправки и получения платежей. Однако он отличается от Receive Payments V2 API тем, что не подходит для генерации разных адресов для разных пользователей.

На рисунке ниже показана форма заявки на получение Receive Payments V2 API. Вам нужно будет ввести свое имя, адрес электронной почты, URL-адрес сайта, на котором вы будете внедрять API, а также описание товаров, которые вы продаете, или услуг, которые предлагаете на своем веб-сайте. В большинстве случаев заявка рассматривается в течение 2-3 рабочих дней.

Рисунок 1. Форма заявки на получение Receive Payments V2 API

Запуск API

Давайте изменим конфиг и посмотрим, что получится

Нода развернута на машине с адресом 192.168.88.244, а адрес компа, с которого я работаю, 192.168.88.248. На ноде я разрешаю подключаться только с него (ну и локально с самой ноды, конечно).

Ноду нужно перезапустить (в простейшем случае перезагрузите убунту, или убейте процесс bitcoind и запустите заново, скопировав команду из crontab)

Теперь можно проверить работу – откроем для начала в браузере

Ура, хост доступен, апи подняли, но тупо через браузер работать нельзя, давайте напишем небольшой скрипт для работы с ней.

Если всё сделано правильно, результат будет таким:

Еще пару методов – запросим инфу о текущем состоянии блокчейна и попробуем осуществить перевод

Вывод будет выглядеть так

Вот, собственно, код:

import requests from requests.auth import HTTPBasicAuth # Указать rpc логин и пароль, который задавали в bitcoin.conf node_login = «SomeUser» node_password = «SomeStrongVeryStrongReallyStrongPassword» # IP адрес ноды node_address = «https://192.168.88.244:8332» # Запросим баланс payload = { «jsonrpc»: «1.0», «id»:»», «method»: «getbalance», } balance = requests.post(node_address, json=payload, auth=HTTPBasicAuth(node_login, node_password)) print(«Balance», balance,balance.text) print(«-«*80) # Запросим информацию о блокчейне payload = { «jsonrpc»: «1.0», «id»:»», «method»: «getblockchaininfo», } b_info = requests.post(node_address, json=payload, auth=HTTPBasicAuth(node_login, node_password)) print(«BlockChainInfo», b_info, b_info.json()) print(«-«*80) # Отправить 0.01 BTC автору статьи payload = { «jsonrpc»: «1.0», «id»:»», «method»: «sendtoaddress», «params»: [«15u2exuYtMbvaDyVNYWgThFidZP7KHyjmM», «0.001», «donation»] } send_money = requests.post(node_address, json=payload, auth=HTTPBasicAuth(node_login, node_password)) print(«Send Money», send_money, send_money.json())

Готово, получилось – нода работает и скрипт отправляет и получает с неё данные. Считайте, платежный шлюз или что-то такое в кармане. Из полезного еще можно упомянуть такой параметр, как walletnotify. Можете вписать его в конфиг. Вот так:

walletnotify=/home/scripts/transaction.sh %s

Каждый раз, когда в вашу ноду прилетает информация о транзакции (кто-то отправил вам деньги или вы отправили кому-то), будет вызываться скрипт /home/scripts/transaction.sh (его надо написать, конечно).

Этому скрипту входящим параметром будет передаваться транзакция. Что с ней делать – ваш выбор. Я использовал так – как только приходила транзакция, срабатывал скрипт, писал этот переданный хеш транзации в файл, как наиболее надежное средство. Серверный демон мониторил файл, и, если находил там свежую запись, уже переносил в базу и проверял – т.е. вызывал метод ноды, который запрашивал информацию о транзакции. Если это была входящая транзакция, и это первое её упоминание, смотрел на какой адрес она пришла, по адресу находил в базе юзера с этим платежным адресом (адреса я выдавал) и сообщала ему, что платеж поступил и ждет подтверждений.

Еще из той же серии параметр blocknotify=/home/bitcoin/blocknotify.sh %s. Каждый раз, когда обновляется информация о блоках, он вызывает скрипт и передает ему номер блока. Это удобно использовать для обновления инфы о подтверждениях. Т.е. если блок изменился, значит поработали майнеры, можно проверить что там есть по нашим транзакциям.

Более подробно о командах можно узнать тут (на английском языке)

Получение расширенного публичного ключа (Extended Public Key)

Чтобы иметь возможность получать платежи, вам потребуется учетная запись BIP32. Самый простой способ начать прием биткоинов — создать кошелек blockchain.info по адресу:

https://blockchain.info/wallet/#/signup

Вам нужно создать новую учетную запись, которая будет использоваться исключительно для получения транзакций, поддерживаемых API. При вызове API нужно использовать ключ xPub, который можно найти в «Настройки-&gt, Учетные записи и адреса -&gt, Дополнительные параметры -&gt, Показать код xPub».

Рисунок 2. Получение ключа xPub

Как принимать к оплате биткоин используя API Blockchain

30.09.2015 kaplan

#API#Blockchain.info#биткоин#интеграция платежей

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

По аналогии с известными методами оплаты, такими как PayPal, WebMoney, VISA и Mastercard, Klarna и прочие, есть разные методы приема оплаты в биткоинах на своем сайте. Один из удобнейших методов в случае с биткоином — использование API биржи Blockchain. Вам не нужно привязываться к конкретному языку или SDK, не нужно даже там регистрироваться как в обычных мерчантах (которые, к тому же, становятся все привередливее).

Все что вам необходимо: иметь кошелек для приема биткоинов (или несколько, если будет угодно) и некоторое время на подключение довольно простых API в вашу систему. К тому же, клиент увидит не ваш родной кошелек, а временный кошелек биржи (что тоже приятно, не так ли?).

Прежде чем говорить непосредственно о коде (я буду в примерах использовать PHP, однако все это легко реализуется на JAVA, Python и т.д.), следует прояснить сам механизм приема оплат.

Тут все довольно просто и укладывается в следующую последовательность:

1. Вы запрашиваете у Blockchain временный кошелек, отправив ряд данных. 2. Blockchain возвращает свой временный кошелек для приема оплат вам. 3. Вы показываете этот кошелек клиенту, а также небольшую инструкцию что с этим делать. 4. Клиент оплачивает (переводит средства на кошелек). 5. Дальше следует подождать валидации платежа в системе Bitcoin. 6. В случае успешной валидации системой Blockchain будет вызван скрипт на вашем сайте (вы сами указываете какой) и переданы все данные транзакции. 7. После этого можно спокойно подтверждать факт оплаты уже внутри вашей системы.
Теперь о деталях реализации. Исходить будем из того, что у вас один кошелек (вариант с несколькими сводится в любом случае к выбору одного, а метод их хранения — любой, на ваше усмотрение).

Для получения временного кошелька следует отправить ряд данных:

1. URL скрипта, который будет вызван в случае успешного подтверждения транзакции. Следует заметить, что рекомендуется указывать некий параметр, или даже несколько для возможности идентификации платежа в текущей системе. Можно, конечно, просто указать идентификатор клиента в вашей системе и при получении подтверждения транзакции уже тогда вносить какие-либо данные в БД. Однако я (а также официальная документация) рекомендую использовать заранее созданный номер платежа и какую-либо проверочную фразу. Суммарно получится URL с параметрами как при обычной передаче GET запросом. Для системы Blockchain этот параметр носит название callback. Значение же следует закодировать как URL-строку. 2. Ваш кошелек, для приема платежа. Собственно, на него Blockchain и переведет полученные деньги. Параметр носит название address. 3. Последний из параметров носит название method и для создания временного кошелька всегда имеет значение create.
Эти данные отправляются скрипту Blockchain по адресу https://blockchain.info/api/receive, при этом каждый из параметров идет обычным GET параметром, а результат его выполнения обрабатывается вашей системой (результат будет в формате JSON). Обо всем этом говорится в документации Blockchain API .

Проще всего это рассмотреть на примере:

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

И пока мы не перешли к следующему шагу, внесу ряд замечаний:

1. Этот код — максимально прост. В реальной системе я бы советовал использовать грамотно продуманный и написанный класс, а также использовать базу данных для хранения подготовленных платежей (как минимум, важно хранить номер платежа, идентификатор пользователя в системе, проверочную фразу или ее составляющие). 2. Функции file_get_contents будет достаточно. Использование cURL или даже чистых сокетов — дело личное и зависит от реализации получения данных от сервиса. 3. Время на валидацию платежа может быть разным и весьма существенным (доходило до 6 часов у меня). А курс биткоина может поменяться. Так что тут есть два варианта: или хранить курс на момент создания платежа (что может сыграть как в плюс, так и в минус) или же запрашивать его по факту получения подтверждения транзакции. Я использую второй метод для спокойствия. Это если вы конечно будете конвертировать биткоин в какую-нибудь другую валюту. Как конвертировать и получать курс я расскажу в конце.
А теперь — получение подтверждения транзакции (деньги к тому моменту на ваш кошелек уже поступят).

Файл должен именоваться receive_payment.php и лежать в корне сайта, так как при запросе временного кошелька мы указали именно такое именование при формировании $callback_url.

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

Однако, как и в предыдущем шаге внесу ряд замечаний:

1. ВАЖНО! На самом деле скрипт для одного и того же платежа будет вызван не один раз, а по количеству его подтверждений на отдельных нодах. Отсюда следует, что вам следует проверять, а не было ли раньше подтверждения. Иначе получится накрутка. 2. Blockchain отдает гораздо больше параметров, чем я указал в скрипте: transaction_hash — хэш транзакции (он уникален), input_transaction_hash — хэш оригинальной транзакции (он уникален), input_address — кошелек Blockchain, на который придет платеж, destination_address — ваш кошелек, на который придет платеж, confirmations — количество подтверждения нодами (рекомендуется принимать подтверждение платежа в случае, если этот параметр имеет значение большее или равное 6). 3. Параметр value отдает значения не в биткоинах, а в satoshi (1 Satoshi = 0.00000001 BTC). Поэтому следует приводить полученное значение к биткоинам (по указаной в примере скрипта формуле выше). 4. Параметры invoice_id и secret являются кастомными, то есть задаются вами еще на этапе получения кошелька от Blockchain. Соответственно их может быть больше, меньше, вообще не быть, а также они могут иметь любые названия. 5. Рекомендую хранить в истории платежей полученное значение в биткоинах, однако конвертировать его в другую валюту (доллары, например), которая используется у вас в системе. Если же ваша система работает только с биткоинами — ничего конвертировать не нужно.
На этом можно было бы завершить статью — получать биткоины вы теперь умеете, однако я не могу не затронуть вопрос конвертации биткоина в другие валюты по курсу биржи Blockchain. По этому вопросу существует отдельная документация: Exchange Rates API.

Этот сервис может ровно две вещи: 1. Дать сводку текущего курса. Вернет JSON. Как этим пользоваться на своем сайте — решать вам. Я приведу только примитивный пример:

Полная распечатка результата есть в документации. 2. Конвертировать для вас из указанной валюты необходимое указанное количество денежных единиц в биткоины. Я б сказал — сервис для ленивых. Пример:

Сервису надо отдать два параметра: currency — название валюты (список валют есть в документации, а также его можно получить самостоятельно, используя код из предыдущего пункта, просто вызвав там print_r($exchange_data_obj),). value — сколько меняем.

Все. Вернет только число биткоинов.

Также, этот сервис полезен в виде калькулятора как можно ближе к тому месту на сайте, где вы будете показывать кошелек Blockchain для приема денег (при условии, что вам нужна конвертация). Указанного в статье достаточно (более чем) для организации приема платежей в биткоинах у вас на сайте. Дальше все зависит от грамотно спроектированного кода и осторожности.

Moon Labs специально для ForkLog

Нашли ошибку в тексте? Выделите ее и нажмите CTRL+ENTER

Создание новых адресов для ваших клиентов

Для каждого клиента у нас будет свой уникальный адрес, на который он будет отправлять платежи. При получении денег на любой из таких адресов вам будет отправлено HTTP-уведомление. Обратите внимание, что каждый вызов, сделанный на сервере, приведет к увеличению параметра index, это делается для того, чтобы убедиться, что один и тот же адрес не назначен более чем одному клиенту. Тем не менее все средства, отправленные на любой из созданных адресов, будут добавлены в один и тот же кошелек.

https://api.blockchain.info/v2/receive?xpub=$xpub&callback=$callback_url&key=$key

Следует учесть, что существует программное ограничение — кошелек не сканирует более 20 неиспользуемых адресов. Таким образом, API будет возвращать ошибку, если более 20 из ранее созданных адресов не были использованы. Если вы столкнулись с этой ошибкой, вам придется либо перейти на новый xPub (в том же блоке blockchain.info), либо начать получать платежи на один из ранее созданных неиспользуемых 20 адресов.

Это можно опционально контролировать, добавляя gap_limit в качестве дополнительного параметра URL, что не приведет к увеличению числа биткоин-адресов, которые могут отслеживаться серверами Blockahin.info. Добавление параметра gap_limit изменяет максимально допустимый интервал, после которого API больше не будет генерировать новые адреса.

https://api.blockchain.info/v2/receive?xpub=$xpub&callback=$callback_url&key=$key&gap_limit=$gap_limit

Ниже рассмотрим параметры, используемые в приведенном URL:

  • xpub: ваш xPub (пункт назначения, куда будут отправляться платежи ваших клиентов).
  • callback_url: это URL-адрес обратной связи, на который будут приходить уведомления при получении платежа.
  • key: ваш ключ API-интерфейса получения платежей, который вы получите после того, как приложение будет успешно принято.
  • gap_limit: необязательный параметр, который определяет количество неиспользуемых адресов биткоинов, разрешенных до того, как будет возвращена ошибка.

С помощью xPub создаем неиспользуемый биткойн-адрес:

curl https://api.blockchain.info/v2/receive?xpub=xpub6CWiJoiwxPQni3DFbrQNHWq8…

Теперь пусть ваши клиенты отправляют средства по адресу, указанному в ответе:

RESPONSE: 200 OK, APPLICATION/JSON

{«address»:»19jJyiC6DnKyKvPg38eBE8R6yCSXLLEjqw»,»index»:23,»callback»:»https://mystore.com?invoice_id=058921123″}

Ниже приведен пример реализации на PHP:

$secret = ‘ZzsMLGKe162CfA5EcG6j’,

$my_xpub = ‘{YOUR XPUB ADDRESS}’,

$my_api_key = ‘{YOUR API KEY}’,

$my_callback_url = ‘INSERT YOUR CALLBACK URL HERE +/- that can include customer identification parameters such as ?invoice_id=058921123&secret=’.$secret,

$root_url = ‘https://api.blockchain.info/v2/receive’,

$parameters = ‘xpub=’ .$my_xpub. ‘&callback=’ .urlencode($my_callback_url). ‘&key=’ .$my_api_key,

$response = file_get_contents($root_url . ‘?’ . $parameters),

$object = json_decode($response),

echo ‘Send Payment To : ‘ . $object-&gt,address,

Второй способ (сложнее):

Суть в том, чтобы разобрать WIF bitcoin-адреса на части, и попробовать из этих частей собрать WIF для litecoin.

  1. Откройте страницы https://bitaddress.org/ и https://liteaddress.org/ (или скачайте архивы https://github.com/pointbiz/bitaddress.org/archive/v3.3.0.zip и https://github.com/litecoin-project/liteaddress.org/archive/master.zip и запустите в них страницу bitaddress.org.html).
  2. Скопируйте Ваш WIF в поле ввода «Введите Приватный Ключ» ссылки «Детали кошелька». Промотайте вниз странице и скопируйте значение «Приватный Ключ в HEX формате (64 символа [0-9A-F])».
  3. Пройдите по ссылке LiteAddress.org и перемещайте мышь, пока не появится вкладка «Детали кошелька». Введите в поле «Введите Приватный Ключ» значение, полученное на предыдущем шаге.
  4. Скопируйте значение «Приватный ключ, короткий, 52 символа base58»
  5. Как и в первом способе, импортируйте ключ — litecoin-cli importprivkey ЗНАЧЕНИЕ ПОЛУЧЕННОЕ _НА_ ШАГЕ 4, далее проверить, появились ли средства командами getbalance и listunspent.

Оба метода не дают стопроцентой гарантии, но попробовать стоит.

Ссылки

  1. https://github.com/pointbiz/bitaddress.org/archive/v3.3.0.zip
  2. https://github.com/litecoin-project/liteaddress.org/archive/master.zip
  3. https://litecointalk.io/t/sent-ltc-to-btc-address-cxop-please-help/8414/15


Понравилась статья? Поделиться с друзьями:
Добавить комментарий