Lootbits io bitcoin loot

Содержание

  • (Крипто) Хэш
  • (Крипто) Блок
  • (Крипто) блок с доказательством работы
  • Блокчейн
  • Блокчейн Сломан?
  • Временная метка
  • Добыча Полезных Ископаемых, Добыча Полезных Ископаемых, Добыча Полезных Ископаемых
  • Биткойн, Биткойн, Биткойн
  • (Крипто) блок с транзакциями (Tx)
  • Ссылки / Ссылки

Давайте построим блокчейны с нуля (ноль) шаг за шагом.

(Крипто) Хэш

Давайте начнем с крипто-хэшей

Классический биткойн использует хэш-алгоритм SHA256. Давайте попробуем

require 'digest' Digest::SHA256.hexdigest( 'Hello, Cryptos!' ) 

в результате чего

#=> "33eedea60b0662c66c289ceba71863a864cf84b00e10002ca1069bf58f9362d5" 

Попробуй еще

Digest::SHA256.hexdigest( 'Hello, Cryptos! - Hello, Cryptos! - Hello, Cryptos!' ) #=> "c4b5e2b9685062ecca5d0f6f6ba605b3f99eafed3a3729d2ae1ccaa2b440b1cc" Digest::SHA256.hexdigest( 'Your Name Here' ) #=> "39459289c09c33a7b516bef926c1873c6ecd2e6db09218b065d7465b6736f801" Digest::SHA256.hexdigest( 'Data Data Data Data' ) #=> "a7bbfc531b2ecf641b9abcd7ad8e50267e1c873e5a396d1919f504973090565a" 

Примечание: результирующий хэш всегда имеет 256-битный размер или 64 шестнадцатеричных(адецимальных) символа (0-9,a-f) в длину , даже если входной сигнал меньше 256-битного или намного больше 256-битного:

Digest::SHA256.hexdigest( TXT ) Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data Data TXT #=> "c51023e2c874b6cf46cb0acef183ee1c05f14746636352d1b2cb9fc6aa5c3cee" ## use String#length Digest::SHA256.hexdigest( 'Hello, Cryptos!' ).length # => 64 Digest::SHA256.hexdigest( 'Hello, Cryptos! - Hello, Cryptos! - Hello, Cryptos!' ).length # => 64 

Примечание: 1 шестнадцатеричный символ-это 4 бита, 2 шестнадцатеричных символа-4×2=8 бит и 64 шестнадцатеричных символа-4×64=256 бит.

Шестнадцатеричная(десятичная) диаграмма:

двоичныйhex (2^4=16)десятичныйдвоичныйhex (2^4=16)десятичный
000000100088
000111100199
0010221010один10
0011331011б11
0100441100с12
0101551101д13
0110661110e14
0111771111ф15

Давайте преобразуем шестнадцатеричное (основание 16) число в десятичное (целое) число (основание 10)

hex = Digest::SHA256.hexdigest( 'Hello, Cryptos!' ) #=> "33eedea60b0662c66c289ceba71863a864cf84b00e10002ca1069bf58f9362d5" hex.to_i( 16 ) #=> 23490001543365037720284007500157053051505610714786813679598750288695740555989 

и преобразовать в 256-битное (32 байта) двоичное число (основание 2) в виде строки:

hex.to_i( 16 ).to_s( 2 ) # => "0011 0011 1110 1110 1101 1110 1010 0110 0000 1011 0000 0110 0110 0010 1100 0110 # 0110 1100 0010 1000 1001 1100 1110 1011 1010 0111 0001 1000 0110 0011 1010 1000 # 0110 0100 1100 1111 1000 0100 1011 0000 0000 1110 0001 0000 0000 0000 0010 1100 # 1010 0001 0000 0110 1001 1011 1111 0101 1000 1111 1001 0011 0110 0010 1101 0101" 

Викторина пустяков: что такое SHA256?

  • (А) Все Равно Все Равно Взламываю
  • (B) Безопасный Алгоритм Хэширования
  • (C) Милый Дом Австрия
  • (D) Сверхвысокая Апертура

A: SHA256 == Безопасные алгоритмы хэширования 256 бит

SHA256-это (безопасный) алгоритм хеширования, разработанный Агентством национальной безопасности (АНБ) Соединенных Штатов Америки (США).

Узнайте больше @ Secure Hash Algorithms (SHA) @ Wikipedia.

(Безопасный) хэш также известен как:

  • Цифровой (Крипто) Отпечаток Пальца == (Безопасный) Гашиш
  • Цифровой (Крипто) Дайджест == (Безопасный) Гашиш
  • Цифровая (Крипто) Контрольная Сумма == (Secure) Гашиш

(Крипто) Блок

Давайте построим блоки (защищенные) с крипто-хэшами. Сначала давайте определим класс блоков:

require 'digest' require 'pp' ## pp = pretty print class Block attr_reader :data attr_reader :hash def initialize(data) @data = data @hash = Digest::SHA256.hexdigest( data ) end end 

А давайте добудем (построим) несколько блоков с крипто-хэшами:

pp Block.new( 'Hello, Cryptos!' ) #=> #0x1ee9b98>0x1eeac78>0x1eebdd0>0x1ef9a68>

Примечание: все хэши (контрольные суммы/дайджесты/отпечатки пальцев) такие же, как и выше! Тот же вход , например , тот же хэш, например, та же длина, например, 64 шестнадцатеричных символа!

И большая шишка:

0x1e489a8>

(Крипто) блок с доказательством работы

Давайте добавим доказательство работы к блоку и хэшу. и давайте начнем майнинг, чтобы найти nonce (=число, используемое один раз), и начнем с “жестко закодированной” сложности двух ведущих нулей ‘00’.

В классическом биткойне вы должны вычислить хэш, который начинается с ведущих нулей (). Чем больше ведущих нулей, тем труднее (сложнее) вычислить. Давайте сделаем это легко вычисляемым и начнем с двух ведущих нулей (), то есть 16^2 = 256 возможностей (^1,2). Три ведущих нуля () будут 16^3 = 4 096 возможностей, а четыре нуля () будут 16^4 = 65 536 и так далее.

(1): 16 возможностей, потому что это шестнадцатеричное или шестнадцатеричное или базовое число 16, то есть, (10) (11) (12) (13) (14) (15).

(2): случайный безопасный хэш-алгоритм требует в среднем 256 попыток (например, 305 попыток, потому что это не идеальное статистическое распределение возможностей).

А давайте добудем (построим) несколько блоков с крипто-хэшами с “жестко закодированной” сложностью в два ведущих нуля ‘00’:

0x139b828>0x1d64270>0x1d67f18>0x1d84b50>

Видите разницу? Теперь все хэши начинаются с

БлокХэш с доказательством работы

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

В первом блоке испытуемые пробовали 143 nonces до тех пор, пока не нашли совпадающее счастливое число. Stat(istic)s для всех блоков являются:

БлокЦиклы / количество вычислений хэша

Счастливый случай для блока № 1-143:

Попробуй:

А теперь попробуй:

Давайте попробуем сложность из четырех ведущих нулей ‘0000’.

Примечание: один шестнадцатеричный символ имеет 4 бита, таким образом,

Измените “жестко закодированную” сложность с, например, на

и повторите или давайте снова добывать блоки:

0x1f7a960>0x1ee8800>0x1f4c160>0x1ef4b60>

Видите разницу? Теперь все хэши начинаются с ‘0000’, например

БлокХэш с доказательством работы

Stat вычисления хэша nonce(istic)s для всех блоков:

БлокЦиклы / количество вычислений хэша

В первом блоке теперь пробовали 26 762 nonces (сравните 143 nonces с трудностью ‘00’), пока не нашли совпадающее счастливое число.

Теперь попробуйте сделать это с последней сложностью в биткойне, то есть с 24 ведущими нулями — просто шучу. Вам понадобятся триллионы мега-зиллионов хэш-вычислений, и всем минирующим компьютерам в мире понадобится вместе около десяти (10) минут, чтобы найти счастливое число, использованное один раз (nonce), и добыть следующий блок.

Давайте повторим вычисления хэша сложности

Блокчейн

Блокчейн! Блокчейн! Блокчейн!

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

Викторина Trivia: каков уникальный идентификатор(entifier) блока?

  • (A) (Безопасный) Гашиш
  • (B) Блок Хэша
  • (C) Цифровой (Крипто) Дайджест

А: все вышеперечисленное :-). (Secure) hash == block hash == digital (crypto) digest.

Таким образом, добавьте (безопасный) хэш предыдущего блока(ious) к новому блоку и вычислите хэш, например:

Бинго! Блокчейн! Блокчейн! Блокчейн! Теперь все вместе:

Примечание: Для первого блока, то есть блока генезиса, нет блока prev(ious). Какой (блочный) хэш использовать? Давайте следовать классической конвенции биткойна и использовать все нули , например. .

Происхождение. Рождается новый блокчейн!

0x4d11ce0>

Давайте добудем (построим) еще несколько блоков, связанных (скованных) вместе с крипто-хэшами:

0x46cfc80>0x4d9d798>0x4dce620>

Давайте сохраним все блоки вместе (в массиве):

0x469ec30>0x4d6d120>0x4685388>0x4d010a8>

Примечание: если вы хотите изменить данные в блоке b1, например, вы должны изменить все блоки сверху (то есть b2 и b3) тоже и обновить их хэши тоже! С каждым добавленным блоком ломать цепь становится все труднее и труднее (не говоря уже о том, что практически невозможно!). В этом и заключается магия блокчейна — он (почти) нерушим, если у вас есть много общих / клонированных копий. Данные становятся более безопасными с каждым добавленным блоком (сверху), …

Блокчейн Сломан?

Как вы узнаете, изменил ли кто-нибудь (сломал) (почти) нерушимый блокчейн и изменил ли некоторые данные в блоках? Давайте запустим тесты, проверяющие цепные / связанные (крипто) хэши:

Все правда, правда, правда, правда. Все в порядке? Что делать, если кто-то изменит данные , но сохранит исходный (теперь фальшивый несоответствующий) хэш? Давайте проведем больше тестов, проверяя (крипто) хэши, пересчитывая (используя ++) прямо на месте плюс проверяя сложность доказательства работы (хэш должен начинаться с):

Все правда, правда, правда, правда, правда, правда, правда, правда. Все в порядке? ДА. Блокчейн (почти) нерушим.

Давайте попробуем сломать Нерушимое. Давайте изменим блок b1 с на:

0x4daa9f8>

Теперь если вы проверите:

Провалиться! Ложь! Уже не все верно. Теперь цепь разорвана. Цепные / связанные (крипто) хэши

больше не совпадают. Единственный способ вернуть цепные / связанные (крипто) хэши обратно в состояние true, true, true, true-это перестроить (переделать) все блоки сверху.

Временная метка

Как сделать блокчейн еще более безопасным? Свяжите его с реальным миром! Давайте добавим метку времени:

или в эпоху времени (то есть в секундах с 1 января 1970 года)

Примечание: Вы можете использовать для преобразования времени эпохи обратно в стандартный “классический” формат:

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

Несокрушимый. Несокрушимый. Несокрушимый. А что еще?

Давайте добавим трудность доказательства работы (например,‘00’, ‘000’, ‘0000’ и т. д.) к хэшу, чтобы сделать трудность нерушимой / неизменной тоже!

И последнее, но не менее важное: давайте отбросим “предварительно вычисленный” хэш-атрибут и всегда будем вычислять хэш по требованию, например:

Помните: вычисление хэша блока (крипто) происходит быстро, быстро, быстро. Что занимает время в зависимости от сложности доказательства работы, так это поиск nonce, то есть счастливого числа, использованного один раз.

Теперь все вместе. В результате чего:

Доказательство пудинга. Давайте построим новый (более безопасный) блокчейн с нуля (ноль). Генезис!

0x4d00700>

Давайте добудем (построим) еще несколько блоков, связанных (скованных) вместе с крипто-хэшами:

0x4dbd9d0>0x2f297e8>0x4ed7940>

Блокчейн сломан? Давайте запустим все тесты, проверяющие цепочку / связанные (крипто) хэши, метки времени, трудности доказательства работы и многое другое:

Все правда, правда, правда, правда, правда, правда, правда, правда. Все в порядке? ДА. Блокчейн (почти) нерушим.

Добыча Полезных Ископаемых, Добыча Полезных Ископаемых, Добыча Полезных Ископаемых

Каков ваш хэшрейт? Давайте выясним. Давайте используем “автономную” версию уже “классической” функции:

Давайте попробуем (запустим) бенчмарки для сложности от (4 бит) to (28 бит). Помните: в шестнадцатеричном (base16, 2^4 бита) равно в двоичном (base2), таким образом, в шестнадцатеричном (base16) равно x 4 x 7 = 28 нулевых битов в двоичном (base2). Пример:

Давайте добавим hash proof-of-work hash computing machinery и re(run):

В результате на “бюджетном” домашнем компьютере:

Суммируя хеш-курс составляет около 100 000 хешей в секунду на “бюджетном” домашнем компьютере. Каков ваш хэшрейт? Запустите тест на вашем оборудовании!

Поиск 28-битного хэша доказательства сложности работы все еще продолжается… ожидается, что счастливое число будет найдено в ближайшие часы…

Викторина Trivia Quiz: каков хэшрейт классической сети Bitcoin Classic?

Ответ: около 25 миллионов триллионов хэшей в секунду (в марте 2018 года)

Расчетное количество хэшей tera в секунду (триллионы хэшей в секунду) выполняет сеть биткойнов.

(Источник: blockchain.info)

Биткойн, Биткойн, Биткойн

Давайте рассчитаем классический блокчейн-хэш биткоина (Крипто) с нуля (ноль). Начнем с блока genesis, то есть блока #0 с уникальным хэш-идентификатором блока .

Примечание: Вы можете искать и просматривать биткойн-блоки с помощью (онлайн) block explorers. Пример:

Классический хэш блока bitcoin (crypto) вычисляется из 80-байтового заголовка блока:

ПолеРазмер (Байт)Комментарии
версия4 байтаНомер версии блока
Пред.32 байта256-битный хэш заголовка предыдущего блока
мерклерут32 байта256-битный хэш всех транзакций в блоке
время4 байтаТекущая метка времени в секундах с 1970-01-01 00:00
биты4 байтаТекущая задача сложности в компактном двоичном формате
данное время4 байта32-битное число (добытого) счастливого лотерейного номера, использованного один раз

Примечание: 32 байта х 8 бит = 256 бит

Используя данные для блока genesis, настройка:

Помните: для преобразования из эпохи времени (секунды с 1 января 1970 года) к классическому использованию времени:

Да, биткойн-классик стартовал 3 января 2009 года в 18 часов 15 минут 5 секунд (2009-01-03 18:15:05). Или в другом направлении используйте:

Что такое UTC? Всемирное координированное время-это “стандартное” мировое время. Примечание: UTC не соблюдает летнее время.

Двоичные байты — маленький конец(ian) против большого конца(ian)

В теории вычисление хэша блока так же просто, как:

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

На практике давайте разберемся с различными преобразованиями порядка байтов от big endian (самый значимый бит первым) к little endian (наименее значимый бит первым) и обратно.

Совет: Читайте больше о Endianness @ Wikipedia.

Давайте соберем вместе (двоичный) 80-байтовый заголовок, используя помощники преобразования порядка байтов и big-endian в little-endian (в двоичные байты) :

И запустите вычисления хэша:

Бинго! Результирующий блок-хэш таков .

Давайте вернемся назад и добавим недостающие помощники двоичного преобразования, то есть, ,, и .

Преобразование целых чисел (4 байта / 32 бита) в двоичные байты (в Литтл-эндиане) использовать:

сравните с “классической” шестнадцатеричной строкой (в big endian):

Что может быть лучше? Биг-эндианец или Литтл-эндианец ? Что может быть лучше? Рубин или питон? Красный или синий? Битшиллинг или биткоин?

Давайте отпразднуем, что есть более чем один способ сделать это :-). Далее.

Для преобразования шестнадцатеричной строки (32 байта / 256 бит / 64 шестнадцатеричных символа) в двоичные байты (в Литтл-эндиане) используйте:

и конвертировать обратно из двоичных байтов (в little endian) для шестнадцатеричной строки используйте:

Что может быть лучше? Биг-эндианец или Литтл-эндианец ?

Что это / магия? См. документацию ruby по оборудованию для упаковки и распаковки двоичных данных

Теперь подведем итог всему вместе. Давайте используем блок #125552, используемый в качестве примера на вики-странице алгоритма хеширования блоков биткойна:

Бонус. Для удобства (повторного)использования давайте упакуем код заголовка блока биткойна в класс:

и давайте протестируем его с блоком genesis #0 и блоком #125552: