- Собственная криптовалюта: реализация блокчейна на Python
- Внедряем ООП
- Прокачиваем наш связный список
- Делаем цепочку неизменяемой
- Проверяем
- Отправить Bitcoin средствами Python
- Ключи
- Баланс
- Как послать монеты?
- Комиссии
- Советы
- Возможно ли создать транзакцию на чистом питоне без необходимости запускать биткойн локально?
- 3 ответа
- Статья Работа с криптовалютой Bitcoin посредством Python
- admin
Собственная криптовалюта: реализация блокчейна на Python
Bitcoin — всеобщий любимец из числа криптовалют. Новшество, которое он привнес, — решение проблемы двойного расходования при помощи блокчейна — цепочки блоков информации. Вместо того чтобы хранить значения в централизованном банке, блокчейн формирует децентрализованную систему.
Какую структуру имеет блокчейн? Каждый блок имеет хеш-сумму, также в нем содержатся данные о транзакции и метка времени. Кроме того, в блоке есть копия хеш-суммы предыдущего блока. Выглядит все это примерно так:
Хм, на что же это похоже? На какую структуру данных? Точно! Это же связный список!
Итак, давайте возьмем класс связного списка, который мы создали ранее (см. статью «Связный список на Python: что это такое и как его реализовать», — прим. ред. Pythonist), и превратим его в простой блокчейн. Мы внесем в него несколько простых изменений, и вы увидите, что объектно-ориентированное программирование на Python позволяет создавать крутые вещи.
Внедряем ООП
Для начала нам нужно внедрить в наш класс связного списка некоторые принципы ООП (объектно-ориентированного программирования). Да, поначалу это кажется сложным. Но если мы хотим, чтобы наш блокчейн был защищенным, нам нужно сделать кое-какие вещи приватными. Этот принцип называется инкапсуляцией. Суть его в том, что некоторые поля и методы делаются доступными только изнутри класса. Поскольку мы не хотим, чтобы кто-то мог нарушить структуру нашей криптовалюты, нам нужно ограничить возможность взаимодействия с ней.
Давайте сначала перечитаем класс Node , который мы создали ранее. Изменим его имя на Block , поскольку теперь он будет представлять один блок блокчейна. Также добавим пару импортов, которые будут использоваться в классе.
Стоит отметить, что блокчейн обладает парой отличительных свойств. Во-первых, он отличается иммутабельностью, т. е. записи в нем трудно изменить (если вообще возможно). Во-вторых, он публичный. Да, именно так. Блокчейн Bitcoin-а это публичные записи, вы можете просмотреть их хоть сейчас.
В настоящий момент данные нашего узла хранятся просто как data. При помощи дот-нотации кто угодно может получить к ним доступ и изменить их: my_block.data = «One Million Dollarssss» . Нас это не устраивает. Мы можем сделать это поле приватным, добавив к имени data двойной символ подчеркивания ( __data ), а затем создав специальный метод, позволяющий пользователям читать данные (т. е. публичный доступ сохранится).
Теперь давайте напишем метод, позволяющий пользователям читать значения. В ООП мы называем это get -методом, с его помощью мы просто возвращаем значение желаемого поля.
Прокачиваем наш связный список
Теперь, когда мы встроили в наш класс защитный механизм, давайте добавим то, что сделает его собственно блокчейном. Для начала нам нужно сохранить кое-что в переменной data. Мы превратим ее в словарь, хранящий хеш блока, предыдущий хеш и метку времени. В блокчейне Bitcoin-а, как вы видели, в одном блоке могут храниться несколько транзакций (в форме дерева хешей). Мы не станем так углубляться и будем хранить только одну «транзакцию». Обязательно передайте в качестве параметров предыдущий хеш, транзактора и сумму.
Как сделать хеш блока? В блокчейне это делается так: вы берете хеш предыдущего блока и видоизменяете его, используя суперсекретный алгоритм хеширования. Вы можете сделать свой алгоритм сколь угодно сложным, но он может быть и очень простым:
Теперь у нас есть автоматически инкрементирующаяся SQL-база данных. Прекрасно. Давайте сделаем нечто более сложное. Возьмем сумму транзакции, возведем ее в странную степень, прибавим порядковый номер последней буквы имени транзактора, и прибавим все это к предыдущему хешу.
Итак, у нас есть функция хеширования, теперь нужно вызвать ее в конструкторе. Вызывать нужно непременно после определения __data .
Наконец, нужно обновить метод append() . Вместо data мы в качестве параметров будем передавать имя транзактора и сумму. Затем, прежде чем создать новый блок, мы получим последний хеш и передадим его в Block месте с другими данными. После этого добавим блок к концу цепочки.
Делаем цепочку неизменяемой
Как вы помните, блокчейны отличаются неизменяемостью (иммутабельностью). То есть изменить их очень сложно. Это свойство завязано на том, что каждый хеш зависит от сохраняемых в блоке данных (по крайней мере в нашей функции). При изменении значения в блоке должны обновиться все хеши во всех последующих блоках. Если блоков всего несколько, это не займет много времени, но представьте, что у нас очень длинная цепочка, а ее обновление имеет временную сложность O(N).
Для обновления суммы транзакции мы создадим специальный метод. Блокчейн Bitcoin-а вполне может быть реализован как-то иначе, но у нас ведь просто его подобие. В ООП это называется set -методом. Он принимает новое значение и устанавливает скрытое значение data, исключая прямое вмешательство пользователя. Не забудьте вызвать функцию make_hash , чтобы получить обновленный хеш для блока.
Но погодите, это еще не все. Нам нужно обновить хеши всех последующих блоков. Как это сделать? Конечно же путем обхода связного списка! (См. статью «Удаление дубликатов из связного списка в Python», — прим. ред. Pythonist). Как вы помните, мы начинаем со временного указателя и используем цикл while .
Для каждого блока нам нужно получить его обновленный хеш и сохранить его как prev_hash . Затем, перейдя к следующему блоку, мы обновляем его хеши, используя хеш предыдущего блока. Мы будем делать это при помощи скрытого метода __update_hashes() .
В нашем методе __update_hashes() мы принимаем в качестве параметра предыдущий хеш, сохраняем его в __data , а затем используем функцию make_hash() для создания хеша текущего блока.
Вот и все! Мы создали базовый функционал нашего блокчейна.
Проверяем
Давайте построим блокчейн при помощи нашего метода Block . Следующий код вы можете просто скопировать (он позволит вывести нашу цепочку блоков).
Давайте создадим первый блок. Передадим в него имя и сумму. Предыдущий хеш для первого блока в цепочке — всегда 0.
Теперь добавим еще несколько блоков.
Вы увидите следующий вывод:
Если вы использовали другой алгоритм хеширования, ваши хеши могут отличаться. Но суть в том, что каждый хеш создается на базе предыдущего.
Давайте попробуем обновить сумму. Установим новое значение суммы для второго человека, Джамиля. По идее мы должны увидеть, что обновятся хеши всех последующих блоков, а хеш блока Тима останется тем же.
Все прошло по плану! Вы создали собственную криптовалюту! Ну ладно, нечто похожее на нее. Если вам интересно, можете сделать форк оригинального кода Bitcoin и на его основе создать что-то свое. Код доступен на GitHub.
Источник
Отправить 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 👈
Источник
Возможно ли создать транзакцию на чистом питоне без необходимости запускать биткойн локально?
Допустим, у меня есть биткойн-адрес, на который отправлено 10 BTC. У меня также есть секретный ключ для этого адреса.
Использование Python (2 или 3) — это способ создания подписанной транзакции (которая, как я полагаю, представляет собой длинную строку шестнадцатеричных цифр), которая затем может быть отправлена во внешнюю службу (bockchain.info или что-то еще) для сетевой прогации .
Кажется, что все библиотеки python для совершения транзакций требуют подключения к интерфейсу rcc bitcoind. В моем приложении не будет битбойна с локальным запуском.
Я думаю, что код, который я ищу, выглядит следующим образом:
3 ответа
Если вы его не видели, есть хорошая статья (IMHO), в которой описывается, как сгенерировать транзакцию «вручную» с использованием «raw» python (без биткойнов libs или RPC): «Биткойны трудный путь: использование протокола биткойн»
Виталик Бутерин недавно поделился Pybitcointools , хорошая и простая в использовании библиотека Python для ручной работы с транзакциями биткойнов. В примере показан основной рабочий процесс, который это то, что вы описали в своем примере (просто разбито на несколько шагов).
Если вам нужна дополнительная помощь, эта хорошая статья технически описывает транзакции биткойнов и показывает примеры, используя библиотеку Pybitcointools .
Я думаю, что PyCoin будет отвечать вашим потребностям.
Я также хотел бы отметить, что это не очень хорошая идея. Предположим, что ваш вход на самом деле 20 BTC вместо 10. Что произойдет, так это то, что биткойн будет интерпретировать дополнительные 10 BTC в качестве платы, которую должен собрать шахтер.
Источник
Статья Работа с криптовалютой Bitcoin посредством Python
admin
Администратор
Всем привет, за прощедший месяц я выкатил несколько проектов, связанных с криптовалютой и пожалуй настало написать небольшую статью по работе с ней, а конкретно с Bitcoin.
В данном уроке мы будем генерировать секретный ключ и адрес, а также проверять баланс и совершать транзакции.
Зависимости
Нам потребуется только три сторонние библиотеки: requests, bit, bipwallet
А также Python3.8, поскольку bipwallet не работает на Python3.9
Разработка
Чтобы сгенерировать адрес кошелька (address) и приватный ключ для совершения транзакций (wif) нам понадобится лишь две вещи, это секретна фраза (seed; обычно 12 слов) и индификатор (index; на одной секретной фразе может быть бесконечное количество кошельков, достаточно только сменить индекс).
Имея seed, можно сгенерировать address и wif.
Имея wif, можно проводить транзакции.
Генерация секретной фразы (seed):
Проверку баланса мы будем делать, при помощи Blockcypher.com API:
Мы получаем баланс в сатоши, чтобы получить в BTC, нужно разделить на 100000000 (т.е. 8 нулей после точки)
И добавим строчку к остальным print(«Баланс:», balance(a[0]))
На данном участке кода мы генерируем транзакцию, т.е. ее хэш, который мы активируем на блокчейне.
При генерации задается комиссия (fee) в сатоши, майнерам. В нашем случае 10000 САТ или 0.0001 BTC.
Для успешной транзакции на кошельке должны быть средства разумеется.
Если поставить слишком маленькую комиссию, например 0.00001 BTC, то она не пройдет и деньги останутся в полете до лучших времен.
На момент написания статьи Bitcoin сеть была слишком нагружена и комиссии требовались высокие.
money — соотвественно сколько вы хотите перевести, а address — кому.
Строчка для создания транзакции: send(a[1], «btc адрес получателя», «0.00001»)
На этом думаю все.
Примеры мои готовых проектов, построенных на данных библиотеках: bitbank, chaines.
Источник