Как сделать свой блокчейн python

Обновлено: 06.07.2024

Чтобы создать биткоин транзакцию в наше время не нужно прилагать много усилий. Есть специальные доверенные онлайн сервисы, которые отправят вашу транзакцию в сеть бесплатно (без учета комиссии сети) и безопасно. Вам даже не нужно устанавливать ноду биткоина локально и выкачивать весь блокчейн. Еще лучше то, что под 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 , она сама определит тип сети и создаст нужный класс:

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

Баланс

Как видите, на тот момент на адресе лежало 1391025 сатоши. 1 сатоши = одна стомиллионная целого биткоина (10 -8 ) – самая маленькая неделимая частичка. Библиотека bit удобна еще тем, что содержит встроенный конвертер валют, поэтому баланс можно получить в любой поддерживаемой валюте: хоть в милибиткоинах, хоть в долларах, хоть в рублях. Просто передайте название валюты аргументом:

Как послать монеты?

Очень просто: методом send . Создадим еще один ключ ( dest_k ) и пошлем ему часть биткоинов от source_k :

Как вы помните, у транзакции может быть много выходов, поэтому первый аргумент функции send – список – кому и сколько мы посылаем (кортеж: адрес, количество, валюта). В данном случае адресат у нас один ‘n2R8xiqs6BqdgtqpXRDLKrN4BLo9VD171z’, а второй неявный выход – обратно наш же адрес, чтобы получить сдачу. Вот эта транзакция выглядит так:


Через 5 минут я уже получил первое подтверждение перевода! Проверим список транзакций:

Пример для нескольких адресатов (каждая валюта будет пересчитана по курсу в биткоин):

Если вернуть сдачу не себе, а на другой адрес – аргумент leftover :

Функция create_transaction только создает транзакцию и подписывает ее ключом, но не посылает ее в сеть. Аргументы те же, что у send .

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

В худшем случает транзакция не дойдет до сети и не исполнится.

Комиссии

Если комиссия не указана явно, то она рассчитывается по средним значениям с учетом длины транзакции. Средняя комиссия берется из онлайн-сервиса. Но можно указать комиссию самостоятельно:

Полезные константы комиссий:

Советы

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

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

Храните надежно ваши приватные ключи!

Если вы брали тестовые монеты с крана, пожалуйте, верните обратно их на адрес, который вам предложат. Они могут быть полезны другим разработчикам!

Библиотека bit умеет еще работать с мульти-адресами, которые требует 2 и более подписей для выполнения транзакции.

Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈

Создаём первый блокчейн на Python за 3 дня

Вы разберётесь, как работают блокчейн и криптовалюты. Создадите свой первый смарт-контракт на языке Solidity и напишете простейший блокчейн на Python. Поймёте, как построить карьеру Python-разработчика и развиваться в ней.

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

Python-разработчики востребованы на рынке. 6532 вакансии для разных уровней открыто на рынке труда.

  • от 45 000 ₽ Без опыта
  • до 250 000 ₽ 1–3 года опыта
  • до 350 000 ₽ 3–6 лет опыта

Кому подойдёт интенсив

Новички в IT

Поймёте, как работает блокчейн и какие возможности даёт в онлайн-среде. Познакомитесь с основами программирования и напишете своё первое приложение на Python. Узнаете, чем занимается Python-разработчик и как начать свой путь в IT.

Начинающие программисты

Разберётесь, в каких сферах IT используют блокчейн. Познакомитесь с языком Python и сделаете первый смарт-контракт. Узнаете, как начать использовать навыки разработки на Python в инновационных областях.

Вы научитесь

  • Различать криптовалюты и блокчейн
  • Писать простые программы на Python
  • Создавать смарт-контракты на Solidity
  • Защищать данные с помощью криптографии
  • Разбираться в процессе майнинга
  • Применять Python в разных сферах блокчейна
  • Создавать криптовалюту

Программа

Изучаем основы блокчейна и программирования на Python

  • Биткоин и первые блокчейны.
  • Перспективы рынка для Python-специалистов.
  • Краткое введение в Python.
  • Принципы распределенного хранения. Структуры данных, хэш-функции и Computer Science.
  • Не только криптовалюты: где ещё нужен блокчейн.

Криптовалютные технологии: создаём смарт-контракты

  • Основы криптографии.
  • Ключевые различия криптовалют и их блокчейнов.
  • Etherium, смарт-контракты на Solidity.
  • Процесс майнинга, CPU, ASIC, GPU.
  • Как создать собственную криптовалюту.

Блокчейн и криптовалюты: подводим итоги

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

Подарки и призы

Сертификат на обучение в Skillbox

Сертификат на обучение в Skillbox

Все, кто сделает домашнее задание, получат сертификат на 15 000 рублей на любой курс.

Преподаватель

Фото преподавателя

Михаил Овчинников

  • Экс-руководитель команды разработки систем машинного обучения и антиспама в Badoo.
  • Занимается разработкой ПО последние 17 лет.
  • Докладчик крупнейших IT-конференций России.
  • Специалист в области разработки высоконагруженных систем, обработки больших данных и машинного обучения.

Что вас ждёт

Мощная программа

3 дня вебинаров по 1,5-2 часа для полного погружения в тему — такого вы ещё не видели.

Реальные задачи

Которые помогут закрепить знания и понять, в каком направлении двигаться дальше.

Комьюнити

Вас ждёт общение с другими участниками и ведущим интенсива в закрытом чате в Telegram.

Кейс в портфолио

На интенсиве вы создадите проект, который наверняка оценят потенциальные работодатели.

Получить доступ к записи бесплатного интенсива

Ваша заявка успешно отправлена

Получайте расписание новых интенсивов каждую неделю

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

Данные успешно отправлены.

Прежде чем вы уйдёте… Загляните на распродажу

Профессии с трудоустройством и топовые курсы. Для вас — со скидками до 50%.

До конца распродажи:

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

Пишем блокчейн и криптовалюту с нуля за час

Ты, наверное, думаешь, что криптовалюты — это супер сложно? Блокчейн, шифрование, ключи? На самом деле все намного проще, чем тебе кажется. И сегодня ты в этом убедишься. Сегодня мы напишем свой блокчейн со своей криптой. Всего за один час. Хочешь большего — делай. Выбор за тобой.

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

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

К примеру на основе статьи можно банально написать децентрализированый ботнет.

Я считаю, что статья должна быть обучающая , а не супер схема зароботка 2000. Которую все равно никто не попробует. Да и контингент тут врядли схемы зароботка ищут или темки как воровать крипту , тп.

С самого начала своего пути программирования я интересовался сетями и криптографией. И следовательно с самого начала пути я изучал С, читал документации Сатоши Накамото. Затем начал изучат шарп.

На каком языке будем писать?

Основные концепции криптовалют

Да , безусловно мы знаем что такое криптовалюта. Это набор узлов в одноранговой децентрализованой сети (Не путать с распределенной), которые посылают какие-то пакеты. Зачастую это псевдоанонимная сеть, где коэффициент анонимности определяет количество узлов-посредников. Тоесть совершая какое либо действие , например транзакцию , сетевой адрес отправителя не скрывается, он находится в сети и маскеруется по средставм криптографического адреса. Иными словами узел-получатель знает адрес первичного отправителя. Именно не узла посредника , а отправителя. И если этот узел будет являться подконтрольным, то он действительно будет знать кто отправитель транзакции.

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

И тут возникает первая проблема криптовалюты биткоин, а именно на её примере мы собираемся писать блокчейн, если больше 50% мощьности сети сосредоточены в одних руках, то транзакцию можно подделать(продублировать). Наши мощьности начинают майнить и запускат транзакцию через серый тунель , в то время как мы отправляем обычную тарнзакцию в сеть , она подтверждается в то время как серая подтверждена тоже . Затем основная сеть перепроверяет блокчен поддельной и замечает несостыковку возвращает средства назад. На сколько я понял что практически это никогда не проверялось , хоть и в 2013 году китайская майнинг ферма владела 55% мощностей, название я не вспомню.

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

Начнем

Это наш мейн. В нем мы и будем совершать все необходимые манипуляции. Подключаем JSON, для вывода блокчйена.

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

Теперь детально по пунктам.

Первый пункт

Это подключение к узлу. Тут метод Connect принимает в качестве аргумента адрес узла:

Ну и конечно использованы методы создания транзакций. О них читайте ниже.

И так перейдем непосредственно к созданию транзакции. Это пункт 2 нашего меню.

Сдесь мы указываем получателя , сумму и коментарий.

Используем 2 метода из класса блокчейн , а именно CreateTransaction и ProcessPendingTransactions .

Рассмотрим класс Blockchain и их реализацию.

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

И так напомню метод который нам нужен это CreateTransaction, он принимает нашу транзакцию. И добавляет ее в список:

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

AddBlock добавляем транзакцию в блок и создает его. Расмотрим клас блока.

Реализация методов описана выше в класе Block.

Третий пункт . В обяснении не нуждается. Спомощью стандартных пунктов выводим блокчейн на консоль.

Четвертый пункт . Узнаем баланс .

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

AddBlock добавляем транзакцию в блок и создает его. Расмотрим клас блока.

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

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

Логика не сложная , чем то похожа на клиента. Поднимаем серв, в моем случае на локалке,и принимает или отправляем моенты, страхуемся от ошибок .

1. Запускам узел и подключаемся к нему же.


Создаем транзакцию. Пишем получателя (Сами себя):


Сумму и коментарий

Начинается процесс майнинга , его полностью я не покажу так как комбинаций перебора очень много.

Дальше печатем наш Блокчейн. В нем пока 2 блока и 1 транзакция.

3. Наш блок и транзакция самим себе в 100 монет.

Блок у нас содержит 2 транзакции после чего создаем новый.


Ну и еще парочка сайтов с описаниями работы крипты, уже и не вспомню.

Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.

André François McKenzie

С точки зрения дилетантов, биткойн — это бухгалтерская книга. Гроссбух — это набор транзакций. Давайте разберемся в этом на примере.

Потом, скажем, парень с овощами идет к врачу и платит 10 долларов за медицинский осмотр. Запись в бухгалтерской книге будет — владелец овощей платит врачу 10 долларов.

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

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

Blockchain and Transactions

В биткойн-бухгалтерской книге все транзакции хранятся блоками. Она содержит миллионы транзакций с момента изобретения bitcoin. Она содержит несколько блоков для этих транзакций, которые растут с каждым днём.

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

Скажем, есть цепочка из пяти блоков — Блок1, Блок2, Блок3, Блок4 и Блок5. Тогда Блок1 будет указывать на Блок2, Блок2 будет указывать на Блок3 и так далее.

Размер одного биткойн-блока — один мегабайт. Итак, в одном мегабайте мы храним несколько транзакций, затем переходим к следующему блоку для дальнейших транзакций. Все эти блоки связаны между собой.

Биткойн Криптография и Майнинг

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

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

На Python мы можем сгенерировать это хэш-значение с помощью приведенного ниже кода:

В bitcoin блок состоит не только из набора транзакций. В нём есть как предыдущий хэш, так и nonce (число один раз).

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

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

В чем польза от добычи биткойна?

Майнеры получают биткойны для добычи блока. В 2009 году за добычу одного блока ты получишь 50 BTC. В 2012 году он был сокращен до 25 BTC.

Каждые четыре года награда уменьшается вдвое за добычу одного блока. В 2020 году награда была снижена до 6,25 BTC. Но за последние несколько лет bitcoin оценили очень высоко. Даже 6,25 BTC за блок означает 280 000 долларов (на момент публикации). Это довольно много денег за такую работу.

Многие люди по всему миру занимаются добычей биткойн. Это не очень сложно, но это трудоёмкая задача. Нужно много вычислительной мощности, чтобы получить правильную стоимость. Если 10 человек занимаются угадыванием, то тот, кто получит результат первым, выиграет награду.

Поэтому, чтобы выиграть награду в добыче биткойн, требуется и время, и удача.

Давайте займёмся добычей биткойн с Python.

Понятия, которые мы обсуждали до сих пор, были важны для понимания реальной работы по добыче bitcoin. Давайте перейдём к коду, который помогает нам добывать биткойны:

Вот так. Мы можем добыть биткойн с этими 12 строками кода в python.

Просмотр кода

Строка 1: Импорт библиотеки sha256 в наш проект.

Строка 2: Объявите переменную с максимальным значением nonce, до которого вы хотите угадать. Она может быть увеличена или уменьшена в зависимости от вычислительной мощности вашей системы.

Строка 3-4: Определяем функцию SHA256 для генерации хэш-значения.

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

Строка 6: После добавления требуемого префикса мы создаем еще одну переменную prefix_str для хранения значения Hexa. В дальнейшем эта строка будет использоваться для сравнения с сгенерированным хэшем.

Строка 7-9: A for цикла итерируется для nonce значений для генерации нового хэша с помощью вызова функции SHA256, которую мы сгенерировали на строке 3.

Строка 10-12: Сравниваем только что сгенерированный префикс хэш-значения с нужным. Если он совпадает, то мы распечатываем значение nonce, для которого добывается биткойн, и возвращаем этот сгенерированный хэш.

Заключение

Я взял сложность восьми для тестирования. Приложению пришлось выполнить итерацию около 1,2 миллиона раз, прежде чем оно угадало правильный нон-це.

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

Добыча биткойнов требует специального оборудования. Одними из популярных являются DragonMint T1, Antminer T9+, Antminer R4, Avalon6 и Antminer S9.

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


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

Общая структура нашего блокчейна

Итак, наш блокчейн (как и положено) будет представлять собой цепочку из блоков, каждый из которых включает в себя следующее:

  • номер блока [index] ;
  • метка времени [timestamp] ;
  • содержание транзакции [transaction] ;
  • значение так называемого доказательства работы [proof] (о том, что это такое, чуть ниже);
  • значение хеш-суммы предыдущего блока [previous hash] ;
  • значение хеш-суммы текущего блока [hash] .

В содержание транзакции мы включим отправителя денежных средств [sender] , имя получателя этих средств [recipient] и количество переданных денежных средств [amount] . Для простоты в блок будем включать сведения только об одной транзакции.

Общая структура блока, таким образом, будет выглядеть вот так:

Помимо очередных текущих блоков, блокчейн должен включать в себя начальный (или первый) блок, с которого, собственно говоря, и начинается вся цепочка блоков. Этот блок называется genesis-блоком, и он, в отличие от текущих блоков, содержит в себе только номер (который всегда равен нулю), метку времени, какое-либо рандомное значение вместо хеш-суммы предыдущего блока (поскольку genesis-блок первый и предыдущего блока у него просто-напросто нет) и собственное значение хеш-суммы:

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

Общая схема нашего блокчейна

Общая схема нашего блокчейна

Функция подсчета хеш-суммы

Саму функцию объявим так:

Далее объявляем структуру для хранения результатов подсчета хешей и выделяем для нее память:

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

Далее считаем хеш:

Поскольку выход функции тоже должен быть в виде строки, а рассчитанное значение хеша представлено в виде байтового массива, нам необходимо сделать соответствующее преобразование. Сделаем это следующим образом ( HASH_SIZE — длина хеш-суммы, 512 или 256 бит, выберем 256):

Функция по расчету хешей у нас готова, можно писать дальше.

Файл block.h

В этом файле опишем класс CBlock, в который войдет все, что нам нужно для создания блока (как очередного, так и genesis-блока). Однако прежде чем описывать сам класс, определим структуру, которая будет описывать транзакцию. Как мы уже решили, транзакция будет включать в себя три поля — отправитель, получатель и сумма транзакции:

Теперь можно приступить к описанию нашего класса CBlock. В него входит public-секция, включающая два конструктора (тот, который без параметров, служит для инициализации genesis-блока, а тот, который с параметрами, — для инициализации очередных блоков); метод, создающий genesis-блок; метод, с помощью которого будет майниться очередной блок; метод, записывающий значение хеша предыдущего блока в нужное место текущего блока; метод получения значения хеша блока из соответствующего поля и private-секция со всеми необходимыми полями (номер блока, имя блока, метка времени и так далее) и одним методом подсчета хеш-суммы:

Теперь можно написать реализацию всех указанных методов. Все это мы поместим в файл block.cpp .

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

Читайте также: