Мне было интересно, может ли кто-нибудь объяснить мне.decode и.encode в hashlib?
Я понимаю, что у вас есть шестнадцатеричная строка, дважды выполните SHA256, а затем поменяйте местами последнюю шестнадцатеричную строку. Цель этого кода - найти корень Merkle путем объединения двух транзакций. Я хотел бы понять, что происходит на заднем плане немного больше. Что именно вы декодируете и кодируете?
импорт хешлиб
action_hex = "93a05cac6ae03dd55172534c53be0738a50257bb3be69fff2c7595d677ad53666e344634584d07b8d8bc017680f342bc6aad523da31bc2b19e1ec0921078e872"
action_bin =action_hex.decode ('hex')
hash = hashlib.sha256 (hashlib.sha256 (Transactions_bin).digest ()). digest ()
hash.encode ('hex_codec') '38805219c8ac7e9a96416d706dc1d8f638b12f46b94dfd1362b5d16cf62e68ff'
хэш [::-1].encode('hex_codec') 'ff682ef66cd1b56213fd4db9462fb138f6d8c16d706d41969a7eacc819528038'
1 ответ
header_hex
является обычной строкой символов ASCII в нижнем регистре и decode()
метод с 'hex'
аргумент меняет его на (двоичную) строку (или bytes
объект в Python 3) с байтами 0x93 0xa0
и т.д. В C это будет массив без знака char длиной 64 в этом случае.
Эта строка массива / байта длиной 64 затем хэшируется с помощью SHA256, и ее результат (другая двоичная строка размера 32) снова хэшируется. Так hash
является строкой длиной 32 или байтовым объектом этой длины в Python 3. Тогда encode('hex_codec')
является синонимом для encode('hex')
(в Python 2); в Python 3 он заменяет его (поэтому, возможно, этот код предназначен для работы в обеих версиях). Он снова выводит строку ASCII (нижний шестнадцатеричный код), которая заменяет каждый необработанный байт (который является просто небольшим целым числом) двухсимвольной строкой, которая является его шестнадцатеричным представлением. Таким образом, последний бит инвертирует двойной хеш и выводит его как шестнадцатеричный, в форму, которую я обычно называю "строчный шестнадцатеричный ASCII".