Хобрук: Ваш путь к мастерству в программировании

Мне было интересно, может ли кто-нибудь объяснить мне .decode и .encode в hashlib?

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

импортировать хеш-библиотеку

transaction_hex = "93a05cac6ae03dd55172534c53be0738a50257bb3be69fff2c7595d677ad53666e344634584d07b8d8bc017680f342bc6aad523da31bc2b19e1ec0921078e872"

transaction_bin = transaction_hex.decode('hex')

хеш = hashlib.sha256(hashlib.sha256(transaction_bin).дайджест()).дайджест()

hash.encode('hex_codec') '38805219c8ac7e9a96416d706dc1d8f638b12f46b94dfd1362b5d16cf62e68ff'

hash[::-1].encode('hex_codec') 'ff682ef66cd1b56213fd4db9462fb138f6d8c16d706d41969a7eacc819528038'


  • Какой протокол вы пытаетесь описать здесь? То, о чем вы говорите, звучит ненормально. 08.07.2018
  • Вы используете питон 2 или 3? 08.07.2018
  • Вы кодируете байты (целые числа) в строку символов ASCII нижнего регистра из [0-9a-f] 08.07.2018
  • Этот ответ может быть полезен? 08.07.2018
  • @BenStolman О, это биткойн? Пожалуйста, включите эту информацию в вопрос - прямо сейчас вы нигде этого не объяснили. 08.07.2018
  • Исправил и удалил свой комментарий. Я использую Python 2 - ответ, который вы дали Хенно, был определенно полезен. 08.07.2018

Ответы:


1

header_hex — это обычная строка символов ASCII нижнего регистра, а метод decode() с аргументом 'hex' изменяет ее на (двоичную) строку (или объект bytes в Python 3) с байтами 0x93 0xa0 и т. д. В C это будет массив символов без знака длины 64 в данном случае.

Эта строка массива/байта длиной 64 затем хэшируется с помощью SHA256, а ее результат (еще одна двоичная строка размером 32) снова хешируется. Таким образом, hash — это строка длиной 32 или байтовый объект этой длины в Python 3. Тогда encode('hex_codec') является синонимом для encode('hex') (в Python 2); в Python 3 он заменяет его (поэтому, возможно, этот код предназначен для работы в обеих версиях). Он снова выводит строку ASCII (нижний шестнадцатеричный), которая заменяет каждый необработанный байт (который представляет собой просто небольшое целое число) строкой из двух символов, которая является его шестнадцатеричным представлением. Таким образом, последний бит переворачивает двойной хэш и выводит его в шестнадцатеричном виде, в форме, которую я обычно называю «строчными шестнадцатеричными ASCII».

08.07.2018
  • Я снова запутался. Выводит ли hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest() двоичную строку? и hash.encode('hex_codec') преобразует его в шестнадцатеричный? 14.07.2018
  • @BenStolman да, в последний раз вы применяете метод .digest(), и это действительно выводит двоичную строку, encode('hex_codec') делает ее строкой ASCII (для потребления человеком). 14.07.2018
  • Как бы вы получили доступ к двоичному уровню? Это просто набор 1 и 0, да? 14.07.2018
  • @BenStolman У вас уже есть доступ к двоичному уровню, когда у вас есть двоичная строка: каждый байт состоит всего из 8 бит. Если вам нужны отдельные биты, вы можете использовать операторы & и т. д. для их вычисления. Если вы хотите напечатать один байт, используйте функцию bin, которая работает с целыми числами (а байт — это просто небольшое целое число). 14.07.2018
  • @BenStolman [bin(i) for i in hash], если вы хотите видеть все байты в виде битовых строк (снова в печатной форме). 14.07.2018
  • Могу ли я поставить это после hashlib.sha256(hashlib.sha256(header_bin).digest()).digest() ? 14.07.2018
  • Что я представляю? - Я бы привел это в чат, но мне не хватает уличного авторитета. 14.07.2018
  • @BenStolman - переменная цикла для каждого байта хеша. Можно было назвать как угодно 15.07.2018
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

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