Title: [?] крошечный блокчейн Post by: bomj on February 08, 2020, 08:28:28 PM Преамбула.
Набрел сегодня на любопытную статью: Давайте построим самый крошечный блокчейн (https://medium.com/crypto-currently/lets-build-the-tiniest-blockchain-e70965a248b) В принципе данная статья как бы не подходит для новичков, но тем не менее привлекательна д/самостоятельных экспериментов на компе)). Так как сам себя считаю новичком во многих вещах, хотелось бы услышать: - доступный разбор разбор статьи - рекомендуемые инструменты - и порядок действий Готовый перевод данной статьи нашел на https://lambda-it.ru/post/krokhotnyi-blokchein-na-python-v-50-strok Крохотный блокчейн на Python в 50 строк [часть-1] Несмотря на то, что некоторые воспринимают блокчейн как волшебную палочку, застывшую в ожидании проблем для решения, нет никаких сомнений в том, что эта новая технология – настоящее чудо в информационном мире. Но что же такое блокчейн? Блокчейн - Цифровой “блокнот” в котором транзакции, проводимые в системе биткоин (или другой криптовалюты) записываются в хронологическом порядке и публично доступны. (https://www.google.com/search?q=blockchain+definition&oq=blockchain+definition&aqs=chrome.0.0l6.2941j0j7&sourceid=chrome&ie=UTF-8) В более общих словах - это публичная база данных, где новые данные хранятся в контейнерах, называемых блоками, и добавляются в иммутабельную (неизменяемую) цепочку вместе с данными, добавленными тудав прошлом. В случае биткоина и других криптовалют, данными являются группы транзакций. Но, естественно, данные могут быть любыми. Технология блокчейна дала толчок новым, полностью цифровым валютам, таким как биткоин и лайткоин которые не контролируются и не выпускаются централизованно. Это дает новые свободы тем, кто считает современную банковскую систему жульнической. Блокчейн также произвел революцию в системах распределенных вычислений в виде таких технологий, как эфириум, которые представили концепт умных контрактов (https://blockgeeks.com/guides/smart-contracts/). В этой статье я создам простой блокчейн в несколько десятков строчек кода на Python 3. Он будет называться SnakeCoin. Начнем с определения вида нашего блока. В блокчейне каждый блок содержит временную метку и, опционально, номер. В SnakeCoin мы будем записывать обе позиции. И чтобы убедиться в целостности всего блокчейна, каждый блок будет иметь идентификационный хэш. Как в биткоине, хэш каждого блока будет криптографическим хэшем номера блока, его временной метки, данных и хэша предыдущего блока. Да, с данными может быть все, что угодно. Code: import hashlib as hasher Отлично! У нас есть структура нашего блока, но мы создаем цепочку таких блоков (блокчейн). Нам нужно добавлять блоки в некую последовательность. Как я сказал ранее, каждый блок содержит информацию из предыдущего блока. Поэтому встает вопрос - как нам добавить самый первый блок? Ну, первый или первородный блок (genesis block) - это необычный блок. В большинстве случаев, он добавляется вручную или имеет особую логику, позволяющую его добавить. Мы создадим функцию, которая будет возвращать нам genesis block, чтобы сделать жизнь чуть проще. Этот блок будет иметь номер 0 и произвольные данные с произвольным значением хэша “предыдущего блока”. Code: import datetime as date Теперь, когда мы можем создать genesis block, нам нужна функция, которая будет создавать следующие блоки в цепочке. Эта функция будет принимать предыдущий блок в цепи, как параметр, создавать данные и возвращать новый блок с корректными хэшами. Когда новый блок хэширует информацию из предыдущего блока, надежность всей цепи увеличивается с каждым новым блоком. Если этого не делать, злоумышленникам будет проще “изменить прошлое” и заменить нашу цепочку их собственной. Цепь хэшей играет роль криптографического доказательства и дает гарантию, что однажды добавленный в блокчейн блок нельзя будет изменить или вовсе удалить. Code: def next_block(last_block): Это большая часть сложной работы. Теперь можем запустить наш блокчейн! В нашем случае, это будет простой питоновский список (list). Первым элементом будет наш первородный блок (genesis block). И, конечно, нам нужно добавить последующие блоки. Так как SnakeCoin - это крохотный блокчейн, мы добавим всего 20 новых блоков. Можем сделать это в цикле. Code: # Create the blockchain and add the genesis block https://miro.medium.com/max/1020/1*njl6-UdLUWTLRFsHc4D-tA.png (https://miro.medium.com/max/1020/1*njl6-UdLUWTLRFsHc4D-tA.png) Не переживай. Добавятся все 20 блоков :) Отлично, наш блокчейн работает! Если хочешь увидеть больше информации о каждом блоке, можешь запустить полный исходный текст в консоли (https://gist.github.com/murych/a577357d9f15c59c747f71d47ed1e3e1). В принципе, это все, что SnakeCoin имеет сейчас предложить. Чтобы сделать SnakeCoin пригодным для использования в современных условиях индустрии, в него нужно добавить множество фичей, например: сервер, отслеживающий цепочку на нескольких машинах и алгоритм proof-of-work (https://en.bitcoin.it/wiki/Proof_of_work), чтобы ограничить количество блоков, добавляемых за определенный промежуток времени. Если хочется больше технических подробностей, то можно прочитать оригинальный доклад Биткоина здесь (https://bitcoin.org/bitcoin.pdf). Удачи и веселого хакинга! https://gist.github.com/aunyks/47d157f8bc7d1829a729c2a6a919c173 Кроме того один товарищ сделал это же на js: https://github.com/zacanger/tiny-blockchain Есть продолжение(часть-2): Давайте сделаем самый крошечный блокчейн больше (https://medium.com/crypto-currently/lets-make-the-tiniest-blockchain-bigger-ac360a328f4d) Переводить не стал, чтобы не наделать некорректных ошибок, может кто возьмется...... Title: Re: [?] крошечный блокчейн Post by: ilyapx on March 19, 2020, 10:07:35 PM крутяк :) Но я рекомендую попробовать сделать блокчейн на erlang
Title: Re: [?] крошечный блокчейн Post by: mikhailr on March 24, 2020, 06:44:04 PM Давайте сделаем самый крошечный блокчейн больше
Часть 2: с большим количеством строк Python https://miro.medium.com/max/1024/1*UBjF_ql6iUiT6bWRiwDpNg.jpeg Примечание. В этой статье предполагается, что вы прочитали первую часть Самый крошечный блокчейн был чрезвычайно прост, и его было относительно легко сделать. Но вместе с его простотой появилось и несколько недостатков. Во-первых, SnakeCoin работал только на одной машине, поэтому он был далек от распространения, не говоря уже о децентрализации. Во-вторых, блоки могут быть добавлены в цепочку так же быстро, как главный компьютер может создать объект Python и добавить его в список. В случае простого блокчейна это не проблема, но теперь мы собираемся позволить SnakeCoin быть реальной криптовалютой, поэтому нам нужно будет контролировать количество блоков (и монет), которые могут быть созданы одновременно. Отныне данные SnakeCoin будут транзакциями, поэтому поле данных каждого блока будет представлять собой список некоторых транзакций. Мы определим транзакцию следующим образом. Каждая транзакция будет представлять собой объект JSON с подробным описанием отправителя монеты, получателя монеты и суммы переводимого SnakeCoin. Примечание. Транзакции выполняются в формате JSON по причине, которую я скоро опишу. Code: { Теперь, когда мы знаем, как будут выглядеть наши транзакции, нам нужен способ добавить их на один из компьютеров в нашей блокчейн сети, называемый узлом. Для этого мы создадим простой HTTP сервер, чтобы любой пользователь мог сообщить нашим узлам, что произошла новая транзакция. Узел сможет принять POST запрос с транзакцией (как показано выше) в качестве тела запроса. Вот почему транзакции в формате JSON; нам нужно, чтобы они передавались на наш сервер в теле запроса. https://i.ibb.co/TPpC4S5/1.png Code: from flask import Flask Потрясающе! Теперь у нас есть способ вести учет пользователей, когда они отправляют монеты друг другу. Вот почему люди называют блокчейны публичными распределенными бухгалтерскими книгами: все транзакции хранятся для всеобщего обозрения и хранятся на каждом узле в сети. Но возникает вопрос: где люди могут получить SnakeCoins? Пока нигде. Еще нет такого понятия, как SnakeCoin, потому что еще не было создано и выпущено ни одной монеты. Чтобы создавать новые монеты, люди должны добывать (майнить) новые блоки SnakeCoin. Когда они успешно добывают новые блоки, создаются новые SnakeCoin и вознаграждается то, кто добыл блок. Затем монета получает распространение, как только майнер отправляет SnakeCoin другому человеку. Мы не хотим, чтобы было слишком легко добывать новые блоки SnakeCoin, потому что это создаст слишком много SnakeCoin, и они будут иметь небольшую ценность. И наоборот, мы не хотим, чтобы было слишком сложно добывать новые блоки, потому что тогда не будет достаточно монет для всех, чтобы тратить их, и они будут слишком дорогими на наш вкус. Чтобы контролировать сложность майнинга новых SnakeCoins, мы реализуем алгоритм Proof-of-Work (https://en.bitcoin.it/wiki/Proof_of_work) (PoW). Алгоритм Proof-of-Work - это по сути алгоритм, который генерирует элемент, который сложно создать, но легко проверить. Предмет называется доказательством и как звучит, является доказательством того, что компьютер выполнил определенный объем работы. В SnakeCoin мы создадим несколько простой алгоритм Proof-of-Work. Чтобы создать новый блок, компьютер майнера должен будет увеличить число. Когда это число делится на 9 (количество букв в «SnakeCoin») и номер доказательства последнего блока, будет добыт новый блок SnakeCoin, и майнер получит новый SnakeCoin. Code: # ...blockchain Теперь мы можем контролировать количество блоков, добываемых за определенный период времени, и мы можем выпускать новые монеты для людей в сети для отправки друг другу. Но, как мы уже говорили, мы делаем это только на одном компьютере. Если блокчейны децентрализованы, как мы можем быть уверены, что одна и та же цепочка находится на каждом узле? Для этого мы заставляем каждый узел транслировать свою версию цепочки другим узлам и позволяем им принимать цепочки других узлов. После этого каждый узел должен проверить цепочки других узлов, чтобы каждый узел в сети мог прийти к консенсусу о том, как будет выглядеть результирующий блокчейн.. Это называется консенсусным алгоритмом (https://en.wikipedia.org/wiki/Consensus_(computer_science)). Наш алгоритм консенсуса будет довольно простым: если цепочка одного узла отличается от другой (т.е. есть конфликт), то самая длинная цепочка в сети остается, а все более короткие цепочки будут удалены. Если нет конфликта между цепочками в нашей сети, то мы продолжаем. Code: @node.route('/blocks', methods=['GET']) Мы уже почти закончили. После запуска полного кода сервера SnakeCoin (https://gist.github.com/aunyks/47d157f8bc7d1829a729c2a6a919c173) выполните следующие команды в своем терминале. При условии, что у вас установлен cURL. 1. Создать транзакцию. Code: curl "localhost:5000/txion" \ 2. Майнить новый блок. Code: curl localhost:5000/mine] 3. Проверьте результаты. В окне клиента мы видим это. https://miro.medium.com/max/2848/1*qCaWQM7Rzj-gJrJB_J0uJw.png С небольшим количеством красивой печати мы видим, что после майнинга мы получаем некоторую крутую информацию о нашем новом блоке. Code: { Вот и все! На данный момент мы сделали блокчейн довольно большого размера. Теперь SnakeCoin может быть запущен на нескольких машинах для создания сети, а реальные SnakeCoin могут быть добыты. Пожалуйста, не стесняйтесь возиться с кодом сервера SnakeCoin (https://gist.github.com/aunyks/47d157f8bc7d1829a729c2a6a919c173) столько раз, сколько захотите, и задавайте столько вопросов, сколько вам нужно! В следующей части мы обсудим создание кошелька SnakeCoin, чтобы пользователи могли отправлять, получать и хранить свои SnakeCoin. Большое спасибо за чтение! Twitter (https://twitter.com/aunyks) , Github (https://github.com/aunyks) , Snapchat (https://snapchat.com/add/aunyks) , Instagram (https://instagram.com/aunyks) Перевод. Оригинал: https://medium.com/crypto-currently/lets-make-the-tiniest-blockchain-bigger-ac360a328f4d |