Trước khi viết mã Python để xác minh Merkle Root trong khối Bitcoin, chúng ta cần làm quen với hai mô-đun Python cần thiết để tính hàm băm SHA256
- mô-đun "hashlib" - Cung cấp cho chúng tôi các hàm băm SHA56
- Module "binascii" - Cung cấp cho chúng ta các hàm chuyển đổi dữ liệu giữa định dạng nhị phân và hex
Đây là tập lệnh Python của tôi để thực hiện hàm băm SHA256 và hàm băm Double-SHA256 trên 3 vectơ kiểm tra
#- Double-SHA256-Test-Vectors.py #- Copyright [c] 2018, HerongYang.com, All Rights Reserved. import hashlib import binascii def doubleSha256[hex]: bin = binascii.unhexlify[hex] hash = hashlib.sha256[bin].digest[] hash2 = hashlib.sha256[hash].digest[] print["Input Hex: "+str[hex,"ascii"]] print["SHA256:\n "+str[binascii.hexlify[hash],"ascii"]] print["Double-SHA256:\n "+str[binascii.hexlify[hash2],"ascii"]] print["\nTest 1:"] ascii = "null" hex = b"00" print["Input ASCII: "+ascii] doubleSha256[hex] print["\nTest 2:"] ascii = "abc" hex = binascii.hexlify[bytes[ascii,"ascii"]] print["Input ASCII: '"+ascii+"'"] doubleSha256[hex] print["\nTest 2:"] ascii = "The quick brown fox jumps over the lazy dog" hex = binascii.hexlify[bytes[ascii,"ascii"]] print["Input ASCII: '"+ascii+"'"] doubleSha256[hex]
Đầu ra có vẻ tốt. Các giá trị SHA256 phù hợp tốt với các thử nghiệm được công bố trên Internet
E:\herong\bitcoin_20080000\cod>python Double-SHA256-Test-Vectors.py Test 1: Input ASCII: null Input Hex: 00 SHA256: 6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d Double-SHA256: 1406e05881e299367766d313e26c05564ec91bf721d31726bd6e46e60689539a Test 2: Input ASCII: 'abc' Input Hex: 616263 SHA256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad Double-SHA256: 4f8b42c22dd3729b519ba6f68d2da7cc5b2d606d05daed5ad5128cc03e6c6358 Test 2: Input ASCII: 'The quick brown fox jumps over the lazy dog' Input Hex: 54686520717569636b2062726f776e20666f78206a756d7073206f76657220746 865206c617a7920646f67 SHA256: d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592 Double-SHA256: 6d37795021e544d82b41850edf7aabab9a0ebe274e54a519840c4666f35b3937
Mục lục
Về cuốn sách này
Giới thiệu Bitcoin
chuỗi khối bitcoin
ví tiền Bitcoin
lõi bitcoin
giao dịch bitcoin
Bitcoin-Qt - GUI Bitcoin Core
khai thác bitcoin
Quy tắc đồng thuận bitcoin
►Cấu trúc dữ liệu khối Bitcoin
Thành phần dữ liệu của khối Bitcoin
Thuộc tính dữ liệu của khối Bitcoin
Merkle Root của Khối Bitcoin
►Tính toán Băm đôi SHA256 bằng Python
Xác minh Merkle Root của 2 giao dịch
Xác minh Merkle Root của 7 giao dịch
Cấu trúc dữ liệu của khối Bitcoin
"getblock blockhash 0" - Dữ liệu khối hex được tuần tự hóa
Thuật toán tính toán băm khối
Tính toán khối băm trong Python
Tính Hash Double-SHA256 bằng Java
Cấu trúc dữ liệu giao dịch bitcoin
API chuỗi khối Bitcoin
Đồng thanh toán - Ví Bitcoin
Hướng dẫn đã lưu trữ
Người giới thiệu
Phiên bản đầy đủ ở định dạng PDF/EPUB
Hướng dẫn này cho thấy cách đơn giản nhất để tính tổng kiểm tra. Nó chia sẻ một hàm Python xử lý các hàm băm MD5 và SHA256 có thể được sử dụng để kiểm tra tính toàn vẹn của [các] tệp của bạn
1. Tổng kiểm tra là gì?
Nếu bạn đang ở trong thế giới của máy tính và tại sao không, thậm chí cả an ninh mạng, bạn có thể đã nghe thấy thuật ngữ tổng kiểm soát được ném ra đây đó. Tổng kiểm soát là một dãy số và chữ cái được sử dụng để kiểm tra dữ liệu lỗi. Nếu bạn biết tổng kiểm tra cho một tệp gốc, bạn có thể sử dụng tiện ích kiểm soát tổng để xác nhận rằng bản sao của bạn giống hệt nhau. Để tạo tổng kiểm tra, bạn chạy chương trình đặt tệp này thông qua thuật toán. Thuật toán sử dụng hàm băm mật mã nhận đầu vào và tạo ra một chuỗi [một chuỗi số và chữ cái] có độ dài cố định. Tệp đầu vào có thể là tệp nhỏ 1 MB hoặc tệp lớn 4GB, nhưng trong mọi trường hợp, bạn sẽ nhận được tổng kiểm soát có cùng độ dài. Tổng kiểm soát cũng có thể được gọi là "băm"
Khi kiểm tra hữu ích Bạn có thể sử dụng tổng kiểm soát để kiểm tra tệp và dữ liệu khác để tìm lỗi xảy ra trong quá trình truyền hoặc lưu trữ. Ví dụ: một tệp có thể không được tải xuống chính xác do sự cố mạng hoặc sự cố đĩa cứng có thể khiến tệp trên đĩa bị hỏng. Máy tính sử dụng các kỹ thuật tổng kiểm soát để kiểm tra dữ liệu nhằm tìm kiếm các sự cố trong nền, nhưng bạn cũng có thể tự mình làm điều đó. Bạn cũng có thể sử dụng tổng kiểm soát để xác minh tính toàn vẹn của bất kỳ loại tệp, ứng dụng nào đối với tài liệu và phương tiện. Điều khá quan trọng cần đề cập là tổng kiểm soát này không xảy ra đơn giản vì nó được tạo bởi một phép toán gọi là hàm tổng kiểm soát. Tuy nhiên, bạn cũng có thể gặp anh ta dưới dạng thuật toán tổng kiểm soát, chỉ để bạn biết điều đó. Thiết kế của thuật toán có thể khác nhau, nhưng nói chung, thuật toán tổng kiểm soát hiệu quả phải tạo ra giá trị khác biệt đáng kể [tổng kiểm soát], ngay cả đối với những thay đổi nhỏ nhất được thực hiện đối với mục nhập, bất kể loại tài liệu hoặc dữ liệu nào
1. 1. Từ chẵn lẻ hoặc byte chẵn lẻ
Chúng tôi bắt đầu với thuật toán tổng kiểm soát đơn giản nhất, hay còn gọi là kiểm soát chẵn lẻ theo chiều dọc. Hoạt động của thuật toán này là chia dữ liệu thành các từ có số bit cố định [n], sau đó tính “hoặc” [XOR] loại trừ của tất cả các từ mà nó vừa được xử lý. Kết quả của phép tính này được thêm vào thông báo dưới dạng một từ bổ sung
Để xác minh tính toàn vẹn của tin nhắn, người nhận tính toán “hoặc loại trừ” [XOR] của tất cả các từ, bao gồm tổng kiểm soát và kiểm tra xem kết quả có phải là một từ bao gồm [n] số không hay không. Nếu đây là trường hợp, mọi thứ đều ổn, nhưng nếu không, nó sẽ biết rằng đã xảy ra lỗi ở đâu đó trong quá trình truyền
1. 2. Phần bổ sung
Như bạn có thể tưởng tượng, vì nó bị lỗi nên đã có một nỗ lực để hoàn thiện thuật toán được đề cập và mô tả ở trên, vì vậy thuật toán bổ sung tổng đã được thiết kế. Không giống như thuật toán điều khiển chẵn lẻ, phần bổ sung tổng đã thêm tất cả các “từ” ở dạng số nhị phân không dấu, đồng thời loại bỏ từng bit tràn, cũng như thêm phần bổ sung tổng vào hai dưới dạng điều khiển tổng. Để xác thực một tin nhắn, người nhận phải thêm tất cả các từ dưới dạng thuật toán kiểm soát chẵn lẻ theo chiều dọc, bao gồm cả kiểm tra. Nếu kênh kết quả không phải là một từ chứa đầy số không, thì đó là dấu hiệu rõ ràng cho thấy đã xảy ra lỗi truyền tại một thời điểm nhất định
1. 3. Theo vị trí
Thuật toán điều khiển phụ thuộc vào vị trí nhằm sửa các lỗi của hai chức năng được mô tả ở trên vì chúng không có khả năng phát hiện chính xác nhiều lỗi phổ biến có thể xảy ra trong hơn một bit. Một số ví dụ về các lỗi phổ biến này bao gồm việc chèn hoặc xóa các từ có tất cả các bit được đặt thành 0, cũng như sửa đổi thứ tự của các từ dữ liệu
1. 4. Tổng kiểm soát mờ
Loại thuật toán tổng kiểm soát này đã được phát triển như một cách hiệu quả để phát hiện thư rác qua e-mail. Hoạt động của chức năng này là tạo cơ sở dữ liệu hợp tác từ một số ISP. Những cơ sở dữ liệu này bao gồm các e-mail bị nghi ngờ hoặc bị báo cáo là thư rác. Tuy nhiên, vì nội dung của mỗi thư rác có thể rất khác so với nội dung sau, nó sẽ làm cho thuật toán tổng kiểm soát và kiểm tra thông thường không hiệu quả và do đó không đáng sử dụng. Đổi lại, việc sử dụng thuật toán kiểm tra mờ có thể giảm nội dung của một email tối thiểu, sau đó tính tổng kiểm soát như bình thường
1. 5. Làm thế nào để sử dụng tổng kiểm soát tập tin?
Nếu bạn thực sự nghiêm túc về sự an toàn của máy tính của mình và bạn hiểu sự nguy hiểm của việc tải xuống ngẫu nhiên các tệp ở bên trái và bên phải từ các trang web tải xuống, bạn có thể muốn sử dụng tổng kiểm soát để kiểm tra tính toàn vẹn của các tệp của mình trước khi tải xuống hoặc sao chép chúng . để có thể làm thiệt hại
2. tổng kiểm tra. MD5 và SHA256
Trước hết, hàm Python đơn giản bên dưới có thể được sử dụng để tính toán tổng kiểm tra cho các tệp bằng hàm băm MD5 và SHA26
# !/usr/bin/env python3 # -*- coding: utf-8 -*- import hashlib def get_checksum[filename, hash_function]: """Generate checksum for file baed on hash function [MD5 or SHA256]. Args: filename [str]: Path to file that will have the checksum generated. hash_function [str]: Hash function name - supports MD5 or SHA256 Returns: str`: Checksum based on Hash function of choice. Raises: Exception: Invalid hash function is entered. """ hash_function = hash_function.lower[] with open[filename, "rb"] as f: bytes = f.read[] # read file as bytes if hash_function == "md5": readable_hash = hashlib.md5[bytes].hexdigest[] elif hash_function == "sha256": readable_hash = hashlib.sha256[bytes].hexdigest[] else: Raise["{} is an invalid hash function. Please Enter MD5 or SHA256"] return readable_hash
2. trường hợp thử nghiệm
Ngoài ra, tôi đã tải xuống một hình ảnh ngẫu nhiên trực tuyến và tính toán tổng kiểm tra cho các hàm băm MD5 và SHA256 bằng cách sử dụng hàm Python và để so sánh nó với hình ảnh được tạo bằng các lệnh Unix
import os photo = "g_circle-300x300.png" md5_result = get_checksum[photo, "md5"] sha256_result = get_checksum[photo, "sha256"] os.system["md5 {}".format[photo]] print['Hash Function: MD5 - Filename: {}'.format[md5_result]] os.system["shasum -a 256 {}".format[photo]] print['Hash Function: SHA256 - Filename: {}'.format[sha256_result]]
mà in như
MD5 [g_circle-300x300.png] = 0100c08784ed0f8defa8c9156b45a97e Hash Function: MD5 - Filename: 0100c08784ed0f8defa8c9156b45a97e 132124053114b94b46e421dbc4587a15e6962d812389d1705c66d431f1944b9e g_circle-300x300.png Hash Function: SHA256 - Filename: 132124053114b94b46e421dbc4587a15e6962d812389d1705c66d431f1944b9e
Cuối cùng nhưng không kém phần quan trọng, trong trường hợp bạn muốn tìm hiểu thêm về tổng kiểm tra, vui lòng xem video Youtube bên dưới
Nhiêu tai nguyên hơn
Đây là ba cuốn sách Python yêu thích của tôi trong trường hợp bạn muốn tìm hiểu thêm về nó
- Sách dạy nấu ăn Python, ấn bản thứ ba của David Beazley và Brian K. Jones
- Học Python, ấn bản thứ 5 Phiên bản thứ năm của Mark Lutz
- Tài liệu tham khảo bỏ túi Python. Python trong túi của bạn bởi Mark Lutz
Phần kết luận
Tóm lại, tôi hy vọng hướng dẫn này hữu ích cho bạn. Hy vọng rằng bạn đã biết cách đơn giản để kiểm tra tính toàn vẹn của tệp cho MD5 và SHA256