Как создать и использовать кошелек Bitcoin Cash (BCH)

Чтобы создать биткоин транзакцию в наше время не нужно прилагать много усилий. Есть специальные доверенные онлайн сервисы, которые отправят вашу транзакцию в сеть бесплатно (без учета комиссии сети) и безопасно. Вам даже не нужно устанавливать ноду биткоина локально и выкачивать весь блокчейн. Еще лучше то, что под Python есть супер-удобные библиотеки, чтобы пользоваться этими сервисами.

Давайте поставим библиотеку bit:

pip install bit

Какие задачи можно решить на PHP

Для начала работы создается страница с расширением .php или .html (в зависимости от конфигурации сервера). Исходный код этой страницы содержит теги разметки html и непосредственно PHP-команды. Они заключаются между операторами !

Открыв эту страницу, пользователь увидит надпись «Здравствуйте, Петя!». Если вы уже знакомы с программированием, то могли заметить, что $username — это переменная, а команда echo используется для вывода данных на экран.

В PHP поддерживаются применение функций, математические вычисления, работа с переменными (как в примере выше) и массивами, прописывание условий «если — то», создание объектов и многое другое. Чаще всего это используется:

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

Теперь обо всем этом по порядку.

Создание и использование Bitcoin Cash кошелька

Рассмотрим создание криптовалютного кошелька для (BCH) Bitcoin Cash на примере btc.com. Здесь есть собственный бумажник для биткоина и биткоин кэш.

bitcoin cash кошелек

Для начала, нужно пройти лёгкую процедуру регистрации на сайте. Здесь же можно выбрать тип кошелька. Для работы с bch, необходимо выбирать Wallet Type Bitcoin Cash (BCC).

После заполнения всех полей, нужно нажать на кнопку «Создать новый кошелек». В процессе регистрации, система предложит создание резервной копии. Рекомендуется это сделать, так как в дальнейшем это может пригодиться при необходимости восстановления доступа.

Наконец, когда все операции выполнены, можно переходить к транзакциям.

Формы

Если вы знакомы с html, то знаете, что с его помощью нельзя просто так получить информацию, введенную пользователем. То есть вы можете создать красивую форму, но без PHP или другого подобного языка все данные просто исчезнут, когда он нажмет кнопку «Отправить».

Для начала создается форма подобного вида:

У тега

есть два атрибута: action и method. В первом указывается страница, куда будут отправлены данные, а во втором — метод передачи. Всего их два:

  1. POST — безопасный, но медленный метод. Им пользуются для передачи конфиденциальной информации: пароли, логины, адреса и так далее.
  2. GET — простой, но уязвимый метод. Вы могли видеть ссылки вида index.php?page=8&category=2. Информация записывается прямо в ссылку, и любой может поменять ее значение или поделиться ею, поэтому лучше не передавать так ничего секретного и позаботиться о дополнительной безопасности.

Из формы на страницу auth.php будут переданы переменные login и password. В зависимости от метода они попадут в супермассив $_POST или $_GET. Дальше на этой странице можно будет сделать с ними все что угодно, в том числе и проверить их наличие в базе данных.

Настройка Bitcoin Core

Создать кошелек Bitcoin Core не составит труда. Не должна вызвать трудностей и сама эксплуатация клиента, ведь в нем присутствуют только самые необходимые функции. Тем не менее, как пользоваться Bitcoin Core и его настроить я опишу подробно.

Работу с бумажником лучше начать с настройки – для этого переходим в соответствующий раздел(1). Все настройки сходу вам не будут нужны, для начала можно включить управление входами(2) и задать домен обозревателя блоков(3), который вы хотите использовать для отображения транзакций. Теперь подробнее о каждой функции.

Управление входами

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

Сторонние URL транзакций

Во вкладке “Отображение” вставьте в поле “Сторонние URL транзакций” ссылку https://blockchain.info/tx/%s – и при переводах вместо “%s” автоматически будет подставляться хэш транзакции.

Это удобно, если вам потребуется скинуть ссылку на свою транзакцию. К примеру, в инвестиционном проекте у вас не зачислился депозит и админ просит ссылку на транзакцию, чтобы удостовериться в вашем вкладе.

Базы данных

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

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

Продолжим пример с авторизацией. Страница auth.php получает логин и пароль. Дальше она может сделать запрос в базу данных, чтобы узнать, существует ли такая комбинация.

Контент сайта: статьи, изображения и прочее.

Это экономит массу времени и места, потому что не нужно каждый раз прописывать этот код заново.

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

Bitcoin Core или как хранить биткоины на компьютере

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

Подобные клиенты предлагают высочайший уровень безопасности (хоть и уступают аппаратным), а в работе с деньгами это порой главный фактор. И если уж говорить о программных кошельках, то главным из них и наиболее популярным является Bitcoin Core.

Преимущества

Официальный клиент предлагает нам следующие плюсы:

  • Высокий уровень безопасности средств – если вы не забудете пароль и не подцепите какой-нибудь вирус, то вашим биткам ничего не страшно.
  • Ключи доступа хранятся только у самого пользователя и не передаются на сторонний сервер.
  • Не требует специальных настроек для работы и предоставляет основные функции для работы с криптовалютой.
  • Так как кошелек официальный, то все обновления сразу появляются в нем и только через какое-то время появляются в других бумажниках.
  • Поддерживает все популярные операционные системы.
  • Предоставляет холодное хранение биткоинов (далее в статье я поясню, что это такое).

Недостатки

Наряду с преимуществами есть и минусы, от которых никуда не деться:

  • Занимает много места на жестком диске. На ваш ПК будет загружен весь блокчейн, который сегодня весит порядка 145 ГБ и продолжает расти в размерах. Впрочем, этот размер можно очень хорошо урезать, в статье я ещё вернусь к этому моменту.
  • Первая синхронизация занимает много времени – она может выполняться сутки и даже несколько дней.
  • Как пользователь, вы будете постоянно привязаны к своему компьютеру, ведь совершать платежи без него нельзя. Но это уже проблема всех программных кошельков.

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

Сессии и куки

Следующая интересная возможность — сессии и куки. Они нужны для того, чтобы не забивать базу данных и хранить часть информации на компьютере пользователя. Например, многие интернет-магазины помещают в куки пользователя данные о посещениях и просмотренных товарах, чтобы потом вывести не «Добро пожаловать! Посмотрите наши гироскутеры!», а «Рады снова вас видеть! Вернулись за гироскутером XYZ?».

Также их можно использовать для создания системы авторизации.

На PHP вполне можно создать файловый менеджер или текстовый редактор.

Как установить куки в PHP

Все не так сложно, как может показаться. Установка cookie происходит следующим образом:

setcookie(‘name’, ‘value’),

setcookie(‘name’, ‘value’),

Это базовые значения, которые обязательны для заполнения. Но параметров гораздо больше, а именно 7! Семь, Карл! И вот для чего каждый из них нужен.

1 Name Название (имя) cookie
2 Value Значение (как правило переменная)
3 Expires Время жизни куки
4 Path Путь для которого будут сохранены куки
5 Domain Можно указать поддомен (‘.domain.ru’)
6 Secure Использование только на HTTPS (true или false)
7 HttpOnly Использование только на HTTP (true или false)

В подавляющем большинстве случаев используются первые 3 параметра чтобы записать cookie в PHP. То есть имя, значение и время жизни. Этого вполне достаточно для полноценной работы. Давайте к практике.

setcookie(‘name’, 5, time()+60)

setcookie(‘name’, 5, time()+60)
Здесь я установил cookie name со значением — 5, которая удалится через 1 минуту.

Изображения

Используется, например, для реализации капчи, когда нужно, чтобы каждый раз выводилось уникальное число. Для этого создается файл captcha.php, а потом он указывается как ссылка на изображение.

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

И хотя таких примеров много и в других языках, именно простота PHP послужила благоприятной средой для появления всего этого добра. Если на C# придется постараться, чтобы заставить кривой код работать, то PHP постарается за вас.

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

В старых версиях была уязвимость, которая позволяла создать переменную через ссылку. То есть если сейчас из ссылки ?var=5 мы получим ячейку в супермассив $_GET, раньше создавалась еще и переменная $var. И если программист забывал выполнить проверку всех данных, то его сайт был в опасности. Сейчас этой уязвимости нет, как и многих других, но мнение людей все равно не меняется.

У PHP на самом деле много недостатков:

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

Многие ошибки исправляются, и с каждой версией их становится меньше, хотя PHP считают «мертвым» языком уже больше 20 лет.

Ключи

Ключ – центральное понятие в мире Биткоина. Приватный ключ – это ваш кошелек. Вы храните его в секрете от всех. Публичный ключ получается из приватного. А адрес кошелька, получается из публичного ключа. Это преобразование одностороннее: нужно затратить колоссальный объем вычислительной мощности и миллиарды лет времени, чтобы к адресу подобрать приватный ключ и получить контроль над средствами. Я уже рассказывал о генерации ключей биткоин вручную. Но библиотека bit прекрасно делает это за вас.

У биткоина две сети – главная и тестовая. В каждой свои ключи и свои виды адресов. Генерация нового ключа для основной сети, где адреса обычно начинаются с цифры:

from bit import Key key = Key() print(k.address) # 1C8REeQUnXE3HtLCYXVG21AryDxRXnnyar

Класс Key – псевдоним для PrivateKey:

from bit import Key, PrivateKey print(PrivateKey is Key) # true

Для демонстрационных целей, я буду использовать тестовую сеть. В ней монеты ничего не стоят и их легко получить. Адреса тестовой сети обычно начинаются с буквы m или n! Ключ тестовой сети описан классом PrivateKeyTestnet:

from bit import PrivateKeyTestnet k = PrivateKeyTestnet() print(k.address) # mrzdZkt4GfGMBDpZnyaX3yXqG2UePQJxpM

Если мы в конструкторе класса ключа не указали параметров, то каждый раз создается новый (почти наверняка пустой – без баланса) адрес. Генерация происходит локально (без обращения к онлайн сервисам) и очень быстро. Но, если приватный ключ не сохранен, то после завершения программы доступ будет утерян. Поэтому сгенерируем приватный ключ и запишем его в блокноте. Адрес получается по свойству k.address, а приватный ключ можно получить в разных форматах, самый удобный из них – WIF (Wallet Export Format) – получаем строку методом k.to_wif():

from bit import PrivateKeyTestnet as Key k = Key() print(‘Private key:’, k.to_wif()) print(‘Public address:’, k.address) # Private key: cQqh9xFys2KJyWhHMaBwG2kFLCNBCmTgxVqnPTXK6Vng4vU6igoV # Public address: mhnmzFN5gr6gvmEr1t8UcRh6rdTh6JxuDe

Также по приватному ключу можно получить еще SegWit адрес. Если очень кратко, то этот адрес будет работать быстрее, чем традиционный.

print(k.segwit_address) # 2MsWNuzx8EfgEeGLesLmkMM6q3kajEjVnVh

Воспользуемся биткоин краном, чтобы получить немного тестовых монет бесплатно:

Биткоин кран

Транзакция займет некоторое время (минут 10-20). Так что наберитесь терпения!

А пока она идет, создадим класс ключа уже из сохраненной секретной строки:

from bit import PrivateKeyTestnet as Key k = Key(‘cQqh9xFys2KJyWhHMaBwG2kFLCNBCmTgxVqnPTXK6Vng4vU6igoV’) print(k.address) # mhnmzFN5gr6gvmEr1t8UcRh6rdTh6JxuDe ура тот же!

Приватный ключ может быть представлен, как число, байты, HEX-строка, в WIF, DER и PEM форматах:

from bit import PrivateKeyTestnet as Key k = Key(‘cQqh9xFys2KJyWhHMaBwG2kFLCNBCmTgxVqnPTXK6Vng4vU6igoV’) print(‘Int:’, k.to_int(), end=’nn’) print(‘Hex:’, k.to_hex(), end=’nn’) print(‘Bytes:’, k.to_bytes(), end=’nn’) print(‘WIF:’, k.to_wif(), end=’nn’) print(‘DER:’, k.to_der(), end=’nn’) print(‘PEM:’, k.to_pem(), end=’nn’)

Вывод:

Int: 4397583691621789343100573085…453641742227689755261559235 Hex: 6139710fb66e82b7384b868bda1ce59a0bd216e89b8808ae503c5767e4d461c3 Bytes: b’a9qx0fxb6nx82xb78Kx86x8bxd…d4axc3′ WIF: cQqh9xFys2KJyWhHMaBwG2kFLCNBCmTgxVqnPTXK6Vng4vU6igoV DER: b’0x81x84x02…xb3bx8ex1arxc6′ PEM: b’——BEGIN PRIVATE KEY——nMIGEA…..OnrRnD/Ls2KOGnLGn——END PRIVATE KEY——n’

Также, удобно создавать класс ключа из WIF формата функцией wif_to_key, она сама определит тип сети и создаст нужный класс:

from bit import wif_to_key k = wif_to_key(‘cQqh9xFys2KJyWhHMaBwG2kFLCNBCmTgxVqnPTXK6Vng4vU6igoV’) print(k) #

Надеюсь монеты с крана вам уже дошли, и мы продолжим.

Добавим обработку сигналов в скрипте

… //Без этой директивы PHP не будет перехватывать сигналы declare(ticks=1), //Обработчик function sig_handler($signo) { switch ($signo) { case SIGTERM: // Обработка задач остановки exit, break, case SIGINT: // обработка CTRL+C break, case SIGHUP: // обработка задач перезапуска break, case SIGUSR1: echo «Получен сигнал SIGUSR1…n», break, default: // Обработка других сигналов } } // Установка обработчиков сигналов. Подробнее читаем тут https://www.php.net/manual/ru/function.pcntl-signal.php pcntl_signal(SIGTERM, «sig_handler»), pcntl_signal(SIGHUP, «sig_handler»), pcntl_signal(SIGINT, «sig_handler»), pcntl_signal(SIGUSR1, «sig_handler»),

Как получить, прочитать, проверить cookie в PHP

В этом нам поможет глобальный массив COOKIE. Чтобы получить значение куки нам нужно вызвать ее по имени.

echo $_COOKIE[‘name’],

echo $_COOKIE[‘name’],
Как вы уже догадались, на экран выведется пятерка. Теперь сделаем проверку. Если данная кука была установлена, то выедем одно сообщение, если не была, то другое.

if(isset($_COOKIE[‘name’])){ echo ‘Куки успешно установлены!’, }else{ echo ‘Куки НЕ установлены!’, }

if(isset($_COOKIE[‘name’])){ echo ‘Куки успешно установлены!’, }else{ echo ‘Куки НЕ установлены!’, }
Есть один маленький нюанс. При первом заходе на страницу будет выведено сообщение, что куки не установлены, однако, если заглянуть в консоль браузера, то увидим, что она там есть. В чем же дело? Элементарно. Дело в том, что запрос на проверку и сама установка куки идут ОДНОВРЕМЕННО

. Поэтому сообщение об успешной установке мы увидим только после следующей перезагрузке страницы.

Теперь у нас есть условие и его можно использовать в некоторых случаях.

Поддержание уникальности демона

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

function isDaemonActive($pid_file) { if( is_file($pid_file) ) { $pid = file_get_contents($pid_file), //проверяем на наличие процесса if(posix_kill($pid,0)) { //демон уже запущен return true, } else { //pid-файл есть, но процесса нет if(!unlink($pid_file)) { //не могу уничтожить pid-файл. ошибка exit(-1), } } } return false, } if (isDaemonActive(‘/tmp/my_pid_file.pid’)) { echo ‘Daemon already active’, exit, }

А после демонизации — нужно записать в pid-файл текущий PID демона.

file_put_contents(‘/tmp/my_pid_file.pid’, getmypid()),

Время жизни cookie в PHP

Если не указан третий параметр (Expires), то куки будут храниться до окончания сессии, то есть пока вы не закроете браузер. Но можно выставить и другие временные рамки, к примеру на 1 час или на 1 день и т. д. Вот некоторые примеры:

  • time()+3600 — один час
  • time()+86400 — один день
  • time()+86400 * 30 — 30 дней
  • time()+86400 * 30 * 12 — 1 год

Этого вполне достаточно, но многие интересуются, как сделать так, чтобы куки жили вечно или сделать время жизни бесконечным. Не очень понимаю в каких случаях это может понадобиться, однако ответ на этот вопрос будет — НЕТ, нельзя. Но можно поставить максимальное время. Пишется так: 0x7FFFFFFF

— дата 19.01.2038 года.

Правильно создавайте уникальные каталоги

Вы не объяснили, что на самом деле делает ваш PHP-скрипт, так что это похоже на проблему X / Y. В общем, вы должны использовать Mktemp или его эквиваленты PHP:

  • РНР TempNam
  • РНР tmpfile
  • в PEAR Система :: Mktemp

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

Вместо того, чтобы пытаться использовать PID, вы должны использовать Mktemp Утилита для создания уникальных каталогов или имен файлов без условий гонки. Если вы делаете это в Bash, вы можете экспортировать переменную в среду, а затем использовать ту же директорию внутри вашего PHP-скрипта. Например:

#!/usr/bin/env bash # Create a unique temp directory safely. export DIR=$(mktemp -d) # Create your output directory for whatever reason. mkdir «$DIR/output» # Ensure PHP uses $_ENV[«DIR»] to do whatever it’s doing. php myscript.php | curl -X POST —data-binary @- «file://$DIR/output/» # Clean up the temp directory at some point. echo «I did something with ‘$DIR’ so clean it up later.» &gt, /dev/stderr


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