Принимаем оплату в bitcoin: Часть вторая. Инструменты и подготовка

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

В этой статье мы расскажем про некоторые основные команды, которые вы можете использовать для взаимодействия с консолью RPC Bitcoin core.

Клиент QT Bitcoin core — это оригинальный Биткойн-кошелек. Он имеет функции, которых нет у большинства других Биткойн-кошельков. Bitcoin core обеспечивает высокий уровень конфиденциальности, безопасности и стабильности.

Кошелек доступен для следующих операционных систем: Windows, Mac и Linux. Если на вашем компьютере еще не установлен Bitcoin core, вы можете .

Перед загрузкой и установкой обязательно проверьте пропускную способность и место на жестком диске (SSD).

ЧИТАЙТЕ:

 

Читайте также:  Лучшие сайты для майнинга криптовалюты без вложений

 

Как обновить Биткойн-кошелек. Руководство по обновлению криптовалютных кошельков

Core Walle должен полностью подтверждать транзакции и блоки – поэтому он выкачивает весь блокчейн криптовалюты Bitcoin.

На момент написания этой статьи минимальные требования к месту на диске для работы Bitcoin core составляют более 350 ГБ. Он обрабатывает огромные объемы данных, поэтому убедитесь, что у вас хорошее подключение к Интернету.

Перед тем, как начать…

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

Если вы не знаете, что такое хеш, то вот вам статьи:

  • Шифрование и криптография в Python
  • Генерация случайных данных в Python (Руководство)

На кого нацелена данная статья?

В целом, вы уже должны более-менее свободно читать и писать основы Python, наряду с пониманием работы запросов HTTP, так как мы будем говорить о блокчейне на HTTP.

Что нам нужно? Убедитесь, что у вас установлен Python 3.6+ (а также pip). Вам также нужно будет установить Flask и замечательную библиотеку Requests:

Shell

1 pip install Flask==0.12.2 requests==2.18.4

И да, вам также нужен будет HTTP клиент, такой как Postman или cURL. В целом, что-нибудь подойдет.

Окно консоли Bitcoin core

В более старой версии кошелька Bitcoin вы должны увидеть окно отладки в разделе «Help> Debug window», где вы можете начать вводить команды bitcoin-cli.

В последней версии выберете выпадающее меню «window» и откройте «console».

Вы должны увидеть следующее предупреждение.

«Welcome to the Bitcoin Core RPC console. Use up and down arrows to navigate history, and Ctrl-L to clear screen. Type help for an overview of available commands. For more information on using this console type help-console.»

«WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.»

Перевод:

 

Читайте также:  Обзор электронной платежной системы Skrill в 2020 году

 

Добро пожаловать в консоль Bitcoin Core RPC.

Используйте стрелки вверх и вниз для навигации по истории и Ctrl-L для очистки экрана. Введите help для обзора доступных команд. Для получения дополнительной информации об использовании этой консоли введите help-console.

ВНИМАНИЕ: существуют мошенники, которые просят пользователей вводить команды, которые крадут содержимое кошельков. Не используйте эту консоль, не понимая полностью смысл команды.

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

Endpoint для майнинга

Наш endpoint майнинга – это то, где происходит магия, и в ней нет ничего сложного. Здесь совершаются три следующих вещи:

  1. Расчет алгоритма PoW;
  2. Майнер(ы) получают награду в виде транзакции, которая гарантируем им 1 биткойн;
  3. Формирование нового блока, путем его добавления в цепочку.

import hashlib import json from time import time from uuid import uuid4 from flask import Flask, jsonify, request … @app.route(‘/mine’, methods=[‘GET’]) def mine(): # Мы запускаем алгоритм PoW для того чтобы найти следующий proof… last_block = blockchain.last_block last_proof = last_block[‘proof’] proof = blockchain.proof_of_work(last_proof) # Мы должны получить награду за найденный proof. # Если sender = «0», то это означает что данный узел заработал биткойн. blockchain.new_transaction( sender=»0″, recipient=node_identifier, amount=1, ) # Формируем новый блок, путем добавления его в цепочку block = blockchain.new_block(proof) response = { ‘message’: «New Block Forged», ‘index’: block[‘index’], ‘transactions’: block[‘transactions’], ‘proof’: block[‘proof’], ‘previous_hash’: block[‘previous_hash’], } return jsonify(response), 200
Обратите внимание, что получателем замайненного блока является адрес нашего узла. И большинство из того, что мы здесь сделали, просто взаимодействует с методами нашего класса Blockchain. На данном этапе мы закончили с подготовкой нашего блокчейна и теперь готовы взаимодействовать с ним.

Вы можете использовать простой, но уже устаревший cURL или Postman, для взаимодействия с нашим API через сеть.

Запускаем наш сервер:

$ python blockchain.py* Running on https://127.0.0.1:5000/ (Press CTRL+C to quit)
Давайте попробуем смайнить блок. Для этого воспользуемся GET-запросом на https://localhost:5000/mine:

Создадим новую транзакцию с помощью POST-запроса на https://localhost:5000/transactions/new с телом, содержащим структуру нашей транзакции:

Если не хотите использовать Postman, то вы можете сделать аналогичные запрос с помощью cURL:

$ curl -X POST -H «Content-Type: application/json» -d ‘{ «sender»: «d4ee26eee15148ee92c6cd394edd974e», «recipient»: «someone-other-address», «amount»: 5 }’ «https://localhost:5000/transactions/new»

 

Читайте также:  Сегодня запуск сети Ethereum 2.0. Как теперь будет работать блокчейн и стейкинг ETH?

 

Я перезагрузил свой сервер, и смайнил два блока, чтобы в итоге получилось три. Давайте проверим всю цепочку, с помощью запроса на https://localhost:5000/chain:

{ «chain»: [ { «index»: 1, «previous_hash»: 1, «proof»: 100, «timestamp»: 1506280650.770839, «transactions»: [] }, { «index»: 2, «previous_hash»: «c099bc…bfb7», «proof»: 35293, «timestamp»: 1506280664.717925, «transactions»: [ { «amount»: 1, «recipient»: «8bbcb347e0634905b0cac7955bae152b», «sender»: «0» } ] }, { «index»: 3, «previous_hash»: «eff91a…10f2», «proof»: 35089, «timestamp»: 1506280666.1086972, «transactions»: [ { «amount»: 1, «recipient»: «8bbcb347e0634905b0cac7955bae152b», «sender»: «0» } ] } ], «length»: 3 }

Пока, все что мы делали, это круто. Мы получили базовый Блокчейн, который может принимать транзакции, тем самым позволяя нам майнить новые Блоки. Однако вся суть Блокчейнов заключается в том, что они должны быть децентрализованы. Но если блокчейны децентрализованы, то как мы можем гарантировать, что все они отражают одну и ту же цепочку? Данная проблема называется проблемой Консенсуса (конфликтов). Мы реализуем алгоритм Консенсуса, если мы конечно хотим, чтобы в нашей сети было больше одного узла.

Перед тем как мы сможем реализовать алгоритм Консенсуса, нам необходимо придумать способ, как наши узлы будут знать о своих «соседях» в сети. Каждый узел в нашей сети будет хранить в себе запись о других узлах в сети. Итак, нам необходимо еще некоторое количество endpoint-ов:

  1. /nodes/register чтобы можно было принимать список новых узлов в форме URL;
  2. /nodes/resolve для реализации нашего алгоритма Консенсуса, который разрешит любые конфликтные ситуации, чтобы каждый узел содержал корректную цепочку.

Для всего этого нам необходимо модифицировать конструктор нашего Блокчейна, и предоставить метод по регистрации узлов:

… from urllib.parse import urlparse … class Blockchain(object): def __init__(self): … self.nodes = set() … def register_node(self, address): «»» Добавляем новый узел в список узлов :параметр address: Адрес узла, например: ‘https://192.168.0.5:5000’ :return: None «»» parsed_url = urlparse(address) self.nodes.add(parsed_url.netloc)

Обратите внимание, что мы использовали set() для хранения списка узлов. Это самый дешёвый способ гарантировать, что новый узлы будут добавляться, не изменяя при этом объект, то есть не важно сколько раз мы добавляли определенный узел, он появится ровно один раз.

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

… import requests class Blockchain(object) … def valid_chain(self, chain): «»» Определяем, что данный блокчейн прошел проверку :параметр chain: Блокчейн :return: True если прошел проверку, иначе False «»» last_block = chain[0] current_index = 1 while current_index < len(chain): block = chain[current_index] print(f'{last_block}’) print(f'{block}’) print(«n————n») # Проверяем, что хэш этого блока корректен if block[‘previous_hash’] != self.hash(last_block): return False # Проверяем, что алгоритм PoW корректен if not self.valid_proof(last_block[‘proof’], block[‘proof’]): return False last_block = block current_index += 1 return True def resolve_conflicts(self): «»» Это наш алгоритм Консенсуса, он разрешает конфликт путём замены нашей цепочки на самую длинную в нашей сети. :return: True если наша цепочка была заменена, False если это не так «»» neighbours = self.nodes new_chain = None # Мы ищем цепочки длиннее наших max_length = len(self.chain) # Берем все цепочки со всех узлов нашей сети и проверяем их for node in neighbours: response = requests.get(f’https://{node}/chain’) if response.status_code == 200: length = response.json()[‘length’] chain = response.json()[‘chain’] # Проверяем, что цепочка имеет # максимальную длину и она корректна if length > max_length and self.valid_chain(chain): max_length = length new_chain = chain # Заменяем нашу цепочку, если нашли другую, # которая имеет большую длину и является корректной if new_chain: self.chain = new_chain return True return False

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

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

Давайте зарегистрируем два endpoint-а в нашем API, один будет предназначен для добавления соседних узлов, а второй для разрешения конфликтных ситуаций.

@app.route(‘/nodes/register’, methods=[‘POST’]) def register_nodes(): values = request.get_json() nodes = values.get(‘nodes’) if nodes is None: return «Error: Please supply a valid list of nodes», 400 for node in nodes: blockchain.register_node(node) response = { ‘message’: ‘New nodes have been added’, ‘total_nodes’: list(blockchain.nodes), } return jsonify(response), 201 @app.route(‘/nodes/resolve’, methods=[‘GET’]) def consensus(): replaced = blockchain.resolve_conflicts() if replaced: response = { ‘message’: ‘Our chain was replaced’, ‘new_chain’: blockchain.chain } else: response = { ‘message’: ‘Our chain is authoritative’, ‘chain’: blockchain.chain } return jsonify(response), 200

На этом этапе вы можете задействовать любое количество машин, по вашему усмотрению, и реализовать различные узлы в вашей сети. Или же реализовать все то же самое на одной машине, используя разные порты. Я это реализовал вторым способом, используя разные порты. То есть, я зарегистрировал другой узел, уже с имеющимся узлом. Итак, у меня есть два узла: https://localhost:5000 и https://localhost:5001.

свой блокчейн

После чего я замайнил новые блоки на узел 2, для того чтобы цепочка стала длиннее. Потом, я вызвал GET /nodes/resolve на узел 1, где цепочка была заменена по алгоритму Консенсуса:

И это просто обёртка… Объединитесь с друзьями для того, чтобы затестить свой Блокчейн.

Итак, мы с вами написали свой блокчейн. Я надеюсь, что данная статья способствует тому, что вы создадите что-то новое для себя.

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

Простейший блокчейн своими руками 10 полезных ресурсов по технологии blockchain

Ссылка на оригинальную статью Перевод: Александр Давыдов

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