200 строк кода Go для реализации блокчейна — алгоритма майнинга

Go блокчейн

В первых двух статьях этой серии [1] [2] мы покажем вам, как создать простую цепочку блоков путем уточнения кода GO. Включая блоки генерации, данные блока проверки, широковещательную связь и т. д., эта статья заставляет нас сосредоточиться на том, как реализовать алгоритм POW.

Все воскликнули продолжающееся безумие Биткойн, Ethereum и других зашифрованных электронных валют, особенно для новичков к этой области, они продолжали услышать, что Чжан Сан и Ли СИ накопил десятки тысяч или даже миллионов криптографических активов через GPU «Горные» электронные деньги. Так что же именно «добыча»? Как это работает? Я считаю, что для программистов нет лучшего способа учиться, чем практиковать «добычу» алгоритма самостоятельно. В этой статье давайте расшифруем каждую проблему один за другим и, наконец, написать наш собственный «добыточный» алгоритм. Этот алгоритм называется доказательством работы [3], и это основание для двух из самых популярных криптовалютов, биткойна и этюренма.

Что такое «майнинг»?

Криптовалюты имеют ценность, потому что их мало. Возьмите биткойн сегодня, если бы кто-то мог «создать» биткойн по своему желанию в любое время, он был бы бесполезен как электронная валюта. Биткойн алгоритмически контролирует скорость выпуска и достигает своего максимального объема примерно через 122 года. Этот медленный, устойчивый и постепенный подход к объему производства с течением времени эффективно предотвращает инфляцию. Вывод биткойнов достигается путем награждения «победивших майнеров», и между майнерами будет конкуренция за получение вознаграждения в биткойнах. Этот процесс называется «майнинг», потому что он похож на «золотую лихорадку» [4], когда каждый золотодобытчик трудится и в конце концов (надеется) находит немного золота.

Как работает «майнинг»?

Если вы погуглите этот вопрос, вы получите массу результатов. Проще говоря, «майнинг» — это процесс «решения математической задачи». Начнем с некоторых знаний о криптографии и алгоритмах хеширования.

Краткое введение в криптографию

Одностороннее шифрование принимает в качестве входных данных удобочитаемый текст (открытый текст), например строку «Hello world», и создает неразборчивый вывод (зашифрованный текст) с помощью математической функции. Такие функции или алгоритмы различаются по природе и сложности. Чем сложнее алгоритм, тем сложнее его реконструировать. Возьмем, к примеру, популярный алгоритм SHA-256. Просмотр этого веб-сайта [5] позволяет вам вычислить вывод любого заданного ввода, который представляет собой хэш SHA-256. Например, давайте наберем «Hello world» и посмотрим, что мы получим:

Значение Hello World "рассчитывается, продолжая пытаться. Вы найдете, что каждый раз, когда результаты являются точно такими же. Этот процесс называется idempotent. Алгоритм шифрования Основная характеристика очень сложно решить ввод через обратную машину, но очень легко проверить вывод. Такие, как пример выше, вы можете легко проверить, что данный ввод «Hello World» из хешашского значения SHA-256 является правильным, но трудно пройти данное значение хеша, чтобы определить, что его вход да. Вот почему этот тип алгоритма называется односторонним шифрованием. Биты кредиты с использованием двойной SHA-256, SHA-256 будут получены как значение входного хеша, рассчитанное значение HASH SHA-256. Для простоты мы использовали только один раз только SHA-256.

добыча

Возвращаясь к зашифрованной электронной валюте, Биткойн реализует процесс «майнинга», позволяя участникам использовать такой алгоритм шифрования для решения хеш-значения, удовлетворяющего определенным условиям. В частности, Биткойн требует от участников использования двойного алгоритма SHA-256 для вычисления хеш-значения с более чем несколькими цифрами «ведущего 0», и первый участник, решивший проблему, становится «майнером-победителем». Например, давайте найдем хэш SHA-256 строки «886»:

Видно, что это хеш-значение с «начальным 0» в виде 3 бит (первые три равны 0). Вспомните особенность «одностороннего шифрования», о которой мы упоминали ранее: любой может легко проверить, производит ли «886» 3-значное хеш-значение с «начальным 0». Но для того, чтобы найти такой вход, который выдает 3 «начальных нуля» (то есть «886» в данном случае), мы делаем много утомительных вычислений: из большого набора цифр и букв вычисляем их хэши один за другим и определить, выполняются ли вышеуказанные условия. Если я первым найду "886", другие люди смогут судить о том, что я проделал такую ​​кропотливую работу по проверке. В Биткойне и Эфириуме такой процесс называется алгоритмом доказательства работы. «Что, если мне действительно повезет, и я найду подходящее (входное) значение с первой попытки?» - Это очень маловероятно, можно попробовать ввести какие-то случайные буквы и цифры. Фактический алгоритм и ограничения в Биткойне более сложны и, безусловно, сложнее (требуется больше битов «начальных нулей»). В то же время он также может динамически регулировать сложность с целью обеспечения того, чтобы биткойны производились каждые 10 минут, независимо от того, больше или меньше людей участвует в «майнинге».

Почти готов

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

Рекомендуется прочитать предыдущую статью «Внедрение собственного блокчейна с 200 строками кода Go».серия статей, потому что следующая часть алгоритма проверки работоспособности будет включать предыдущий код.

Proof-of-work

Прежде чем новый блок можно будет создать и добавить в цепочку, необходимо выполнить процесс «Proof of Work». Начнем с написания простой функции для проверки того, удовлетворяет ли заданное значение хеш-функции требованиям.

  • Хэш-значение должно иметь «начальный 0» для данного бита.

  • Количество «начальных 0» цифр определяется сложностью (difficulty)решенный

  • Сложность можно регулировать динамически (difficulty), чтобы гарантировать, что Proof-of-Work труднее решить

НижеisHashValidЭта функция:

func isHashValid(hash string, difficulty int) bool {        prefix := strings.Repeat("0", difficulty)        return strings.HasPrefix(hash, prefix)}

Перейти на языкstringsУдобство в упаковкеRepeatа также HasPrefixфункция. мы будемprefixпеременная, представляющая «начальный 0», затем проверяет, есть ли в хеш-значении «начальный 0», который удовлетворяет условию, и возвращаетTrueили False. Мы модифицируем ранее сгенерированный блокgenerateBlockфункция:

func generateBlock(oldBlock Block, BPM int) Block {        var newBlock Block        t := time.Now()        newBlock.Index = oldBlock.Index + 1        newBlock.Timestamp = t.String()        newBlock.BPM = BPM        newBlock.PrevHash = oldBlock.Hash        newBlock.Difficulty = difficulty        for i := 0; ; i++ {                hex := fmt.Sprintf("%x", i)                newBlock.Nonce = hex                if !isHashValid(calculateHash(newBlock), newBlock.Difficulty) {                        fmt.Println(calculateHash(newBlock), " do more work!")                        time.Sleep(time.Second)                        continue                } else {                        fmt.Println(calculateHash(newBlock), " work done!")                        newBlock.Hash = calculateHash(newBlock)                        break                }        }        return newBlock}

Создать новый блокnewBlock,внутри PrevHashсодержит хэш предыдущего блока,Timestampметка времени,BPMданные сердечного ритма,DifficultyЭто упомянутая выше сложность, и ее значение определяет количество «начальных 0» цифр. здесь forЦиклы важны:

  • получать iшестнадцатеричное представление ,NonceУстановите это значение и передайтеcalculateHashВычислите хэш-значение. Затем пройти вышеisHashValidФункция оценивает, выполнено ли требование сложности, и если нет, повторяет попытку.

  • Этот процесс расчета будет продолжаться до тех пор, пока не будет получено требуемое значение.Nonceзначение, затем передатьhandleWriteBlockФункция добавляет в цепочку новый блок.

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

беги и смотри

стартовая программа:

go run main.goДоступ в браузереhttp://localhost:8080

Затем отправьте сообщение, содержащее данные о частоте сердечных сокращений, через Postman.POSTпросить.

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

Видно, что последнее значение хеш-функции соответствует установленному нами требованию сложности (1 "начальный 0"). Давайте снова обновим браузер:

Вы видите, что второй блок был успешно создан и добавлен в цепочку, гдеNonceЭто значение, которое соответствует требованиям сложности, рассчитанным Proof-of-Work.

Следующий шаг

Прежде всего, поздравляю с тем, что попали сюда, приведенный выше контент очень ценен. Хотя в нашем примере используется очень низкая сложность, по сути алгоритм доказательства работы является важной частью блокчейнов, таких как Биткойн и Эфириум. Что касается того, в каком направлении дальше копаться в блокчейне, мы рекомендуем научиться получать доступ к большим файлам и взаимодействовать с блокчейном через IPFS [7]. Кроме того, по сравнению с Proof-of-Work алгоритм Proof-of-Stake [8] получает все большее внимание и предпочтение.Вы также можете узнать, как изменить алгоритм PoW в этой статье, чтобы реализовать алгоритм PoS.

Ссылка на ссылку

[1] Напишите свой собственный блокчейн всего за 200 строк кода Go!

[2] 200 строк кода Go для реализации собственного блокчейна — генерация блоков и сетевое взаимодействие

[3] https://en.bitcoin.it/wiki/Proof_of_work

[4] https://zh.wikipedia.org/zh-cn/%E6%B7%98%E9%87%91%E6%BD%AE

[5] http://www.xorbin.com/tools/sha256-hash-calculator

[6] https://github.com/mycoralhealth/blockchain-tutorial/blob/master/proof-work/main.go

[7] https://github.com/ipfs/ipfs

[8] https://en.bitcoin.it/wiki/Proof_of_Stake


Связанное чтение:

Напишите свой собственный блокчейн всего за 200 строк кода Go!

200 строк кода Go для реализации собственного блокчейна — генерация блоков и сетевое взаимодействие

Руководство для начинающих по блокчейну и биткойну

Особая рекомендация:

Биткойн, Ethereum, ERC20, PoW, PoS, смарт-контракты, Lightning Network…

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

Группа изучения блокчейна

Автором этой статьи является Coral Health, перевод Вэй Цзя. Для перепечатанных переводов, пожалуйста, укажите источник, техническую оригинальность и статьи об архитектурной практике, и вы можете представить материалы через меню официального аккаунта «Связаться с нами».

Архитектура высокой доступности

Изменение способа построения Интернета

Нажмите и удерживайте QR-код, чтобы подписаться на общедоступную учетную запись «Архитектура высокой доступности».