- Отправить Bitcoin средствами Python
- Ключи
- Баланс
- Как послать монеты?
- Комиссии
- Советы
- Создать транзакцию биткоин вручную
- Table of Contents
- Биткойн существует в форме записей о биткойн-транзакциях
- Пример биткойн-транзакции
- Как работает биткойн-транзакция?
- Почему подтверждения некоторых биткойн-транзакций занимают так много времени?
- Подробнее о входах и выходах биткойн-транзакций
- Каковы комиссионные сборы за биткойн-транзакции?
- Создание RAW транзакций Bitcoin
Отправить Bitcoin средствами Python
Чтобы создать биткоин транзакцию в наше время не нужно прилагать много усилий. Есть специальные доверенные онлайн сервисы, которые отправят вашу транзакцию в сеть бесплатно (без учета комиссии сети) и безопасно. Вам даже не нужно устанавливать ноду биткоина локально и выкачивать весь блокчейн. Еще лучше то, что под Python есть супер-удобные библиотеки, чтобы пользоваться этими сервисами.
Давайте поставим библиотеку bit:
Ключи
Ключ – центральное понятие в мире Биткоина. Приватный ключ – это ваш кошелек. Вы храните его в секрете от всех. Публичный ключ получается из приватного. А адрес кошелька, получается из публичного ключа. Это преобразование одностороннее: нужно затратить колоссальный объем вычислительной мощности и миллиарды лет времени, чтобы к адресу подобрать приватный ключ и получить контроль над средствами. Я уже рассказывал о генерации ключей биткоин вручную. Но библиотека bit прекрасно делает это за вас.
У биткоина две сети – главная и тестовая. В каждой свои ключи и свои виды адресов. Генерация нового ключа для основной сети, где адреса обычно начинаются с цифры:
Класс Key – псевдоним для PrivateKey :
Для демонстрационных целей, я буду использовать тестовую сеть. В ней монеты ничего не стоят и их легко получить. Адреса тестовой сети обычно начинаются с буквы m или n ! Ключ тестовой сети описан классом PrivateKeyTestnet :
Если мы в конструкторе класса ключа не указали параметров, то каждый раз создается новый (почти наверняка пустой – без баланса) адрес. Генерация происходит локально (без обращения к онлайн сервисам) и очень быстро. Но, если приватный ключ не сохранен, то после завершения программы доступ будет утерян. Поэтому сгенерируем приватный ключ и запишем его в блокноте. Адрес получается по свойству k.address , а приватный ключ можно получить в разных форматах, самый удобный из них – WIF (Wallet Export Format) – получаем строку методом k.to_wif() :
Также по приватному ключу можно получить еще SegWit адрес. Если очень кратко, то этот адрес будет работать быстрее, чем традиционный.
Воспользуемся биткоин краном, чтобы получить немного тестовых монет бесплатно:
Транзакция займет некоторое время (минут 10-20). Так что наберитесь терпения!
А пока она идет, создадим класс ключа уже из сохраненной секретной строки:
Приватный ключ может быть представлен, как число, байты, HEX-строка, в WIF, DER и PEM форматах:
Также, удобно создавать класс ключа из WIF формата функцией wif_to_key , она сама определит тип сети и создаст нужный класс:
Надеюсь монеты с крана вам уже дошли, и мы продолжим.
Баланс
Узнаем баланс нашего кошелька. Для этого внутри bit используются онлайн сервисы (https://insight.bitpay.com, https://blockchain.info, https://smartbit.com.au). Поэтому операция не моментальная.
Как видите, на тот момент на адресе лежало 1391025 сатоши. 1 сатоши = одна стомиллионная целого биткоина (10 -8 ) – самая маленькая неделимая частичка. Библиотека bit удобна еще тем, что содержит встроенный конвертер валют, поэтому баланс можно получить в любой поддерживаемой валюте: хоть в милибиткоинах, хоть в долларах, хоть в рублях. Просто передайте название валюты аргументом:
Как послать монеты?
Очень просто: методом send . Создадим еще один ключ ( dest_k ) и пошлем ему часть биткоинов от source_k :
Как вы помните, у транзакции может быть много выходов, поэтому первый аргумент функции send – список – кому и сколько мы посылаем (кортеж: адрес, количество, валюта). В данном случае адресат у нас один ‘n2R8xiqs6BqdgtqpXRDLKrN4BLo9VD171z’, а второй неявный выход – обратно наш же адрес, чтобы получить сдачу. Вот эта транзакция выглядит так:
Через 5 минут я уже получил первое подтверждение перевода! Проверим список транзакций:
Пример для нескольких адресатов (каждая валюта будет пересчитана по курсу в биткоин):
Если вернуть сдачу не себе, а на другой адрес – аргумент leftover :
Если нужно прикрепить к транзакции сообщение (до 40 байт в кодировке UTF-8) – аргумент message :
Функция create_transaction только создает транзакцию и подписывает ее ключом, но не посылает ее в сеть. Аргументы те же, что у send .
Еще раз хочу подчеркнуть, что это безопасно, потому что вы отправляете уже подписанную транзакцию, перехват которой не даст злоумышленникам доступ к вашим средствам или прав на смену получателя.
В худшем случает транзакция не дойдет до сети и не исполнится.
Комиссии
Если комиссия не указана явно, то она рассчитывается по средним значениям с учетом длины транзакции. Средняя комиссия берется из онлайн-сервиса. Но можно указать комиссию самостоятельно:
Полезные константы комиссий:
Советы
Иногда лучше пользоваться сервисом для комиссий, потому что из-за смены нагрузки на сеть комиссия для быстрого перевода может варьироваться в широком диапазоне.
Работа с внешними онлайн сервисами может тормозить. В принципе можно поменять их приоритет, но это тема отдельной статьи. Очень хорошо, если вам доступна своя нода биткоин, тогда вы можете подключиться к ней и выполнять все действия без лишних задержек и ограничений! Вот так:
Храните надежно ваши приватные ключи!
Если вы брали тестовые монеты с крана, пожалуйте, верните обратно их на адрес, который вам предложат. Они могут быть полезны другим разработчикам!
Библиотека bit умеет еще работать с мульти-адресами, которые требует 2 и более подписей для выполнения транзакции.
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
Источник
Создать транзакцию биткоин вручную
Bitcoin (BTC) был создан как одноранговая электронная платежная система. Независимо от того, отправляете вы или получаете платеж в BTC, стоит понимать, как происходит транзакция. Транзакции Bitcoin — это сообщения, как электронные письма, которые подписаны цифровым способом с использованием криптографии и отправлены всей сети Биткойн для подтверждения. Транзакции публичны и могут быть найдены в цифровом реестре под названием блокчейн.
История всех транзакций в BTC ведет назад, к точке, когда биткойны были впервые произведены.
Table of Contents
- Биткойн существует в форме записей о биткойн-транзакциях
- Пример биткойн-транзакции
- Как работает биткойн-транзакция?
- Почему подтверждения некоторых биткойн-транзакций занимают так много времени?
- Подробнее о входах и выходах биткойн-транзакций
- Каковы комиссионные сборы за биткойн-транзакции?
Биткойн существует в форме записей о биткойн-транзакциях
Мы определяем биткойн как цепь цифровых подписей. Каждый владелец отправляет свой биткойн следующему путем цифрового подписывания хэша предыдущей транзакции и открытого ключа следующего владельца, после чего добавляет эту информацию в конец койна. Получатель платежа может проверить подписи, чтобы верифицировать цепочку владельцев.
Здесь стоит упомянуть, что биткойны (Bitcoin) не «существуют» в физическом аспекте, а только в цифровом. Думайте о блокчейне как о записи транзакций между разными биткойн-адресами. Записи об этих транзакциях обновляются сетью Bitcoin и публикуются на всех ее узлах при изменении баланса. Вы даже можете использовать один из наших обозревателей блоков, если хотите посмотреть историю и текущий баланс любого существующего адреса BTC.
Пример биткойн-транзакции
Марк хочет отправить биткойны Джессике. В сущности транзакция с BTC состоит из трех частей:
Ввод: Это запись адреса BTC, с которого Марк изначально получил биткойны, которые хочет отправить Джессике.
Количество: Это конкретное количество BTC, которое Марк хочет отправить Джессике.
Вывод: Это открытый ключ Джессики, также известный как ее биткойн-адрес.
Как работает биткойн-транзакция?
Отправка BTC требует доступа к открытым и закрытым ключам, связанным с требуемым количеством биткойнов. Когда мы говорим, что у кого-то есть биткойны, на самом деле мы имеем в виду, что этот человек обладает доступом к паре ключей, состоящей из:
- открытого ключа, на который ранее было выслано некоторое количество биткойнов
- соответствующего ему уникального закрытого ключа, который авторизует отправку куда-то еще BTC, ранее отправленных на вышеупомянутый открытый ключ
Открытые ключи, также называемые биткойн-адресами, представляют собой случайную последовательность букв и цифр, которая работает так же, как адрес электронной почты или имя пользователя в социальной сети. Они публичные, так что вы можете без опасений делиться ими с другими. На самом деле вы должны давать свой адрес Bitcoin другим, когда хотите, чтобы они прислали вам BTC. Закрытый ключ — это еще одна последовательность букв и цифр. Однако закрытые ключи, как и пароли к электронной почте или другим аккаунтам, должны храниться в секрете.
Никогда не делитесь своим закрытым ключом с кем-либо, если вы на 100% не уверены, что этот человек никогда не украдет ваши средства. Также не забудьте сделать резервную копию закрытых ключей, записав их ручкой на бумаге, и храните их в безопасном месте. Ваш адрес Bitcoin по сути является прозрачным сейфом. Другие могут видеть, что внутри, но только те, у кого есть закрытый ключ, могут разблокировать сейф и получить доступ к средствам внутри. В нашем примере транзакции выше Марк хочет отправить BTC Джессике. Для этого он использует свой закрытый ключ, чтобы подписать сообщение с деталями транзакции. Затем в блокчейн отправляется это сообщение, содержащее:
- ввод: исходная операция с монетами, ранее отправленными по адресу Марка
- сумма: количество BTC, которое нужно отправить от Марка Джессике
- вывод: Публичный адрес Джессики.
Затем эта транзакция транслируется в сеть Bitcoin, где майнеры подтверждают, что ключи Марка имеют доступ к источникам (т. е. к адресам, с которых он ранее получал BTC), которые, по его словам, он контролирует. Этот процесс подтверждения известен как майнинг, потому что он требует ресурсоемкого вычислительного труда и вознаграждения майнеров в BTC за каждый разрешенный блок. Это также процесс, посредством которого «создаются» новые биткойны.
Почему подтверждения некоторых биткойн-транзакций занимают так много времени?
Все транзакции Bitcoin должны быть проверены майнерами блокчейна. Обратите внимание, что майнеры не занимаются отдельными транзакциями. Они майнят блоки, которые являются группами транзакций. Иногда ваша транзакция не попадает в текущий блок и встает в очередь до тех пор, пока не будет собран следующий блок. Протокол Bitcoin динамически регулирует требования, чтобы каждый блок занимал примерно 10 минут. Другая причина для длинного периода подтверждения заключается в том, что размер блока ограничен 1 Мбайтом текущим протоколом Bitcoin . Этот произвольный лимит может быть увеличен, но на данный момент он ограничивает количество транзакций, которые могут войти в блок, что по сути замедляет время подтверждения и, как следствие, всю сеть Bitcoin.
Подробнее о входах и выходах биткойн-транзакций
Хотя с монетами можно было бы обращаться по отдельности, было бы крайне неудобно совершать отдельную операцию на каждый цент при переводе. Чтобы значение можно было разделять и объединять, транзакции содержат несколько входов и выходов. Как правило, существует либо один вход от более крупной предыдущей операции, либо несколько входов, объединяющих меньшие суммы, и максимум два выхода: один для оплаты и один для возврата отправителю сдачи, если таковая имеется.
Помните, что биткоины «существуют» только в виде записей транзакций в блокчейне? Это означает, что иногда несколько транзакций заканчиваются прикреплением к определённому адресу Bitcoin. Допустим, у вас в кошельке 2 BTC. Эти 2 BTC пришли от четырех разных друзей, каждый из которых прислал вам 0,5 BTC на ваш день рождения. Для удобства интерфейс вашего кошелька будет отображать ваши сбережения как «2 BTC». Но внутри вашего кошелька эти доходы по 0,5 BTC не «складываются» в 2 BTC. Скорее ваш кошелек просто отслеживает четыре транзакции по 0,5 BTC по отдельности, и в сумме они составляют 2 BTC. Когда вы хотите купить что-то за BTC, ваш кошелек использует записи транзакций различных сумм, которые в сумме составляют сумму биткойнов, которую вы хотите потратить. Предположим, это число составляет 0,25 BTC, и вы хотите использовать эту сумму для покупки одежды у продавца. Основываясь на информации о ваших сбережениях выше, мы знаем, что у вас нет ни одной транзакции ровно на 0,25 BTC. Пользователи Bitcoin не могут разбить транзакцию на меньшие суммы, и потратить можно только всю транзакцию целиком. Поэтому когда вы открываете свой кошелек и набираете «.25» в поле количество, технически происходит так: одна из транзакций на 0,5 BTC (от вашего щедрого друга Криса) будет отправлена целиком. Затем разница вернется вам через новую транзакцию. Вот технический процесс по шагам:
- Количество, которое вы должны за вашу одежду, составляет 0,25 BTC
- Вы «отправляете» в магазин ввод на 0,5 BTC. (Помните, что вводы должны быть потрачены целиком).
- Биткойн-адрес магазина одежды — это вывод
Но фактически ваш кошелек создает для этой транзакции два вывода:
- 0,25 BTC продавцу одежды
- 0,25 BTC на новый адрес, созданный вашим кошельком, чтобы получить от продавца «сдачу».
Это может звучать сложно, но хорошая новость заключается в том, что для отправки или получения биткойнов знать это не обязательно.
Каковы комиссионные сборы за биткойн-транзакции?
Комиссионные сборы в Bitcoin учитывают различные факторы. Многие кошельки позволяют пользователям вручную устанавливать комиссию за транзакции. Любая часть транзакции, которая не предназначена получателю или возвращается как «сдача», включается в расчет комиссии. Комиссии идут майнерам. Их можно использовать для увеличения скорости подтверждения, мотивируя майнеров считать ваши транзакции приоритетными. Bitcoin сборы за больште переводы иногда могут достигать значительных сумм. Bitcoin Cash, напротив, обладает копеечным транзакционным сбором, а его платежи могут быть верифицированы даже с нулем подтверждений.
Начните покупать на сумму от 30 долларов!
Выберите из Bitcoin, Bitcoin Cash, Ethereum и других криптовалют
Источник
Создание RAW транзакций Bitcoin
Raw транзакции – это способ создания транзакций и управления Bitcoin кошельком через командную строку, где полностью вручную можно указать все возможные параметры и обойти ограничения, вносимые графическими оболочками клиентов.
Консоль можно открыть через bitcoin-Qt. Меню: Help -> Debug Window -> вкладка “Concole”. Либо, если используется демон bitcoind, то можно выполнять команды напрямую через терминал операционной системы, например в Windows:
Какие существуют команды?
Все возможные команды, которые можно использовать в консоли, можно посмотреть командой help . Их действительно очень много. В данной статье будут рассмотрены команды, которые требуются для создания raw транзакций.
listunspent [minconf] [maxconf] [«address». ] — выводит данные о монетах, содержащихся в кошельке.
minconf и maxconf – необязательные параметры, заставляющие показывать только те монеты, которые имеют количество подтверждений в промежутке между этими значениями включительно. Тем самым можно сократить список вывода, так как иногда он может быть очень длинным, если кошелек активно используется.
Пример команды, выводящей список монет на указанном адресе с числом подтверждений от 10 и больше:
Вывод состоит из 5 элементов:
- txid –ID транзакции;
- vout – номер выхода транзакции;
- scriptPubKey – хэш открытого ключа получателя (Ваш).
- amount – количество монет
- confirmations – число подтверждений транзакции.
Более подробно о все элементах, из которых состоит транзакция, можно прочитать в статье Анатомия Bitcoin транзакций, а также статье Транзакции Bitcoin.
createrawtransaction [<"txid":txid,"vout":n>. ]
txid – id транзакции, которая будет на входе создаваемой
vout – какой выход этой транзакции мы используем.
amount – сколько BTC отправляем.
Следует быть внимательным и не забыть включить в транзакцию комиссию, а то она может быть никогда не включена в блок.
В данной транзакции 0,003 монеты отправится новому получателю, для 0,005 указываем наш адрес, чтобы они остались при нас. И 0,0005 BTC – оставшиеся монеты — на комиссию.
Ответ возвращает хэш транзакции:
Или, если отправляемые монеты будут браться из нескольких транзакций, то тогда написание команды усложнится, и для двух входящих будет выглядеть примерно так:
По аналогии можно написать команду для сколь угодно длинной транзакции.
Стоит отметить, что после выполнения createrawtransaction транзакция не является подписанной, она не хранится в кошельке и не передается в сеть. То есть вы еще ничего никому не отправили. Вы, по сути, только узнали ее хэш для себя.
Также следует сказать, что никаких проверок корректности транзакции не делается, поэтому можно легко создать невозможную транзакцию или транзакцию с недостаточным размером комиссии, для ее включения в блок.
decoderawtransaction — возвращает подробные данные о транзакции. Таким образом можно дополнительно проверить, что транзакция сформирована правильно. В качестве hex string вставляем полученный нами ранее хэш транзакции.
Если кошелек заблокирован паролем, нужно сначала его ввести перед последующим подписанием транзакции, использовав команду:
walletpassphrase your_pass timeout
timeout – указывается число секунд, сколько авторизация с этим паролем будет действовать. После истечения этого времени, потребуется заново выполнять команду walletpassphrase чтобы подписать транзакцию.
signrawtransaction [<"txid":txid,"vout":n,"scriptPubKey":hex>. ] [. ] [sighash=»ALL»] — подписывает транзакцию. Дополнительные необязательные параметры нужны в случае, если требуется создавать цепочку зависящих друг от друга raw транзакций, прежде чем отправлять их в сеть.
«complete» : true – показывает, что все прошло удачно. Полученный хэш и указываем в следующей команде:
sendrawtransaction — Передает raw транзакцию в сеть.
Возвращает id транзакции или ошибку, если команда по какой-то причине не сработала.
Можно сразу сказать, что если вы столкнулись с ошибкой: «TX rejected (code -22)», то вот возможные причины:
— Вы указали хэш транзакции, который получили до ее подписи.
— Сумма отправляемых монет больше, чем сумма монет на указанных в транзакции инпутах.
— Выполнение команды signrawtransaction вернуло результат «false».
— Вы используете input, который уже был отправлен когда-то до этого.
Дополнительные сведения об ошибках можно смотреть в файлике debug.log, который находится там же, где лежит файл кошелька.
Где может понадобиться использование raw транзакций?
- Многоподписанные транзакции.
- Управление через консоль.
- Выбор монет для отправки (с каких адресов и сколько).
- Возможность вручную указать желаемый размер комиссии.
- Самостоятельная повторная отправка в сеть транзакции, которая не была включена в блок до этого. Стоит напомнить, что , Bitcoin-Qt и bitcoind сами периодически автоматически ретранслируют транзакции в сеть, пока они не будут приняты в блок.
Источник