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

Курс начинается со вступительной речи автора и описания веб-морды на Flask для простейшего блокчейна на Python. В процессе показательного этапа демонстрируется работа программы, а также создается дополнительный тестовый блок. Во время просмотра ролика становится понятно, как работает данный проект, функционирует проверка целостности блока по хэшу в блокчейне и т. д. Приводим код веб-морды:
from flask import flask from flask import render_template, redirect, url_for from flask import request from block import * app * Flask(__name__) @app.route(‘/’, methods=[‘POST’, ‘GET’]) def index(): if request.method == ‘POST’: lender = request.form[‘lender’] amount = request.form[‘amount’] borrower = request.form[‘borrower’] write_block(name=lender, amount=amount, to_whom=borrower) return render_template(‘index.html’) @app.route(‘/checking’, methods=[‘GET’]) def check(): results = check_integrity() return render_template(‘index.html’, results=results) if __name__= = ‘__main__’: app.run(debug=True)
https://www.youtube.com/watch?v=jfjajWV8l1s
Что такое Blockchain и как он работает
В этом ролике автор затронет основные моменты работы блокчейна. Как следует из названия, блокчейн – это цепочка блоков, представляющих собой некоторую информацию. Например, в блоке блокчейна любой криптовалюты сохраняется информация о транзакции (кто, кому, сколько, дата и т. д.). Эта технология отличается от любого другого хранилища методом связи блоков между собой. В процессе связывания активно принимает участие хеширование – получение текстовой строки с набором символов конкретного размера в результате работы некоторого алгоритма. Ты поймешь, как это все работает после того, как автор продемонстрирует функционирование хеширующего алгоритма в терминале Python.
https://www.youtube.com/watch?v=LAQkYz-Jsvs
Запись блоков и проверка целостности
Данный урок посвящен практической реализации элементарного блокчейна на Python. Сначала создается директория, потом в ней вручную создается файл (первый блок) и наполняется данными (удобнее в JSON-формате). Если в блоке отсутствует поле с предыдущим хешем, то такой блок называется генезис-блок. Большая часть урока будет посвящена написанию кода, разруливающего взаимодействие между блоками.
import json
import os
import hashlib
blockchain_dir = os.cudir + ‘/blockchain/’
def get_hash(filename):
file = open(blockchain_dir + filename, ‘rb’).read()
return hashlib.md5(file).hexdigest()
def get_files():
files = os.listdir(blockchain_dir)
return sorted([int(i) for i in files])
def check_integrity():
# 1.Считать хеш предыдущего блока
# 2.Вычислить хэш предыдущего блока
# 3.Сравнить полученные данные
files = get_files() # [ 1, 2, 3, 4, 5 ]
results = [ ]
for file in files[1:]: # [ 2, 3, 4, 5 ]
f = open(blockchain_dir + str(file)) # ‘2’
h = json.load(f)[‘hash’]
prev_file = str(file - 1)
actual_hash = get_hash(prev_file)
if h == actual_hash:
res = ‘Ok’
else:
res = ‘Corrupted’
results.append ({‘block’: prev_file, ‘result’ : res})
return results
def write_block(name, amount, to_whom, prev_hash=‘’):
files = get_files()
prev_file = files[-1]
filename = str(prev_file + 1)
prev_hash = get_hash(str(prev_file))
data = {‘name’ : name,
‘amount’ : amount,
‘to_whom’ : to_whom,
‘prev_hash’ : prev_hash}
with open(blockchain_dir + ‘test’, ‘w’) as file:
json.dump(data, file, indent=4, ensure_acsii=False)
def main():
print (check_integrity())
if __name__= = ‘__main__’:
main()
https://www.youtube.com/watch?v=JxPWs8Ojdx8
Создание веб-интерфейса на Flask
В последнем уроке разбор построения веб-морды для проекта на Flask. Сначала нужно установить в виртуальное окружение Flask (pip install flask), потом немного навести порядок в файловой системе, а остаток ролика отведен для кодинга и настройки web-сервера. Создадим общий файл base.html:
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8”>
<title>Blockchain test</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1
/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/
1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
<div class=’container’>
<div class=’row’>
<div class=’col-6 mx-auto mt-5’>
{% block content %}
{% endblock %}
</div>
</div>
</div>
<div class=’container’>
<div class=’row’>
<div class=’col-6 mx-auto mt-5 text-center’>
<form action=”{{ url_for(‘check’) }} method=”GET””>
<button type=”submit” class=”btn btn-success”>Check integrity</ button >
</form>
</div>
<div class=’row’>
<div class=’col-6 mx-auto mt-5’>
{% block checking %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
А теперь файл индекса index.html:
{% extends ‘base.html’ %}
{% block content %}
<form action=”{{url_for(‘index’)}}” method=”POST”>
<div class="form-group">
<label for="exampleInputLender">Кредитор</label>
<input type="text" class="form-control" id="exampleInputLender"
placeholder="Имя" name=”lender”
value=”{{ request.form.get(‘lender’, ‘’) }}”>
</div>
<div class="form-group">
<label for="exampleInputAmount">Сумма</label>
<input type="text" class="form-control" id="exampleInputAmount"
placeholder="Сумма" name=”amount”
value=”{{ request.form.get(‘amount’, ‘’) }}”>
</div>
<div class="form-group">
<label for="exampleInputBorrower">Заемщик</label>
<input type="text" class="form-control" id="exampleInputBorrower"
placeholder="Имя"" name=”borrower”
value=”{{ request.form.get(‘borrower’, ‘’) }}”>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
{% endblock %}
{% block checking %}
{% for res in results %}
<div class=”result”>
block {{ res[‘block’] }} : {{ res[‘result’] }}
</div>
{% endfor %}
{% endblock %}
https://www.youtube.com/watch?v=zm42eRKsw4c
На этом все. Надеемся, что материал был понятен, и ты сможешь самостоятельно повторить (а еще лучше допилить) изложенное. Успехов!
Комментарии