Python Blockchain - Tạo thợ đào
Để cho phép khai thác, chúng ta cần phát triển một chức năng khai thác. Chức năng khai thác cần tạo thông báo về một chuỗi thông báo nhất định và cung cấp bằng chứng công việc. Hãy để chúng tôi thảo luận về điều này trong chương này.
Chức năng thông báo thông báo
Chúng tôi sẽ viết một hàm tiện ích được gọi là sha256 để tạo thông báo về một tin nhắn nhất định -
def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()
Các sha256 chức năng có một message dưới dạng một tham số, mã hóa nó thành ASCII, tạo thông báo thập lục phân và trả về giá trị cho người gọi.
Chức năng khai thác
Bây giờ chúng tôi phát triển minechức năng thực hiện chiến lược khai thác của riêng chúng tôi. Chiến lược của chúng tôi trong trường hợp này sẽ là tạo một hàm băm trên thông điệp đã cho có tiền tố là số 1 cho trước. Số lượng nhất định của 1 được chỉ định làm tham số chomine chức năng được chỉ định như mức độ khó khăn.
Ví dụ: nếu bạn chỉ định mức độ khó là 2, hàm băm được tạo trên một tin nhắn nhất định phải bắt đầu bằng hai chữ 1 - như 11xxxxxxxx. Nếu mức độ khó là 3, hàm băm được tạo phải bắt đầu bằng ba số 1 - như 111xxxxxxxx. Với những yêu cầu này, bây giờ chúng ta sẽ phát triển chức năng khai thác như thể hiện trong các bước dưới đây.
Bước 1
Hàm khai thác nhận hai tham số - thông báo và mức độ khó.
def mine(message, difficulty=1):
Bước 2
Mức độ khó cần lớn hơn hoặc bằng 1, chúng tôi đảm bảo điều này bằng câu khẳng định sau:
assert difficulty >= 1
Bước 3
Chúng tôi tạo ra một prefix biến bằng cách sử dụng mức độ khó đã đặt.
prefix = '1' * difficulty
Lưu ý nếu mức độ khó là 2, tiền tố sẽ là “11” và nếu mức độ khó là 3, tiền tố sẽ là “111”, v.v. Chúng tôi sẽ kiểm tra xem tiền tố này có tồn tại trong thông báo đã tạo của thư hay không. Để thông báo chính nó, chúng tôi sử dụng hai dòng mã sau:
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
Chúng tôi tiếp tục thêm một số mới ibăm thông điệp trong mỗi lần lặp lại và tạo một thông báo mới về thông báo kết hợp. Là đầu vào chosha256 chức năng thay đổi trong mỗi lần lặp lại, digestgiá trị cũng sẽ thay đổi. Chúng tôi kiểm tra xem điều nàydigest giá trị đã đặt trên prefix.
if digest.startswith(prefix):
Nếu điều kiện được thỏa mãn, chúng tôi sẽ chấm dứt for lặp lại và trả về digest giá trị đối với người gọi.
Toàn bộ mine mã được hiển thị ở đây -
def mine(message, difficulty=1):
assert difficulty >= 1
prefix = '1' * difficulty
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
if digest.startswith(prefix):
print ("after " + str(i) + " iterations found nonce: "+ digest)
return digest
Để bạn hiểu, chúng tôi đã thêm print câu lệnh in ra giá trị thông báo và số lần lặp cần thiết để đáp ứng điều kiện trước khi trả về từ hàm.
Kiểm tra chức năng khai thác
Để kiểm tra chức năng khai thác của chúng tôi, chỉ cần thực hiện câu lệnh sau:
mine ("test message", 2)
Khi bạn chạy đoạn mã trên, bạn sẽ thấy đầu ra tương tự như bên dưới:
after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c
Lưu ý rằng thông báo được tạo bắt đầu bằng “11”. Nếu bạn thay đổi mức độ khó thành 3, thông báo được tạo sẽ bắt đầu bằng “111” và tất nhiên, nó có thể sẽ yêu cầu nhiều lần lặp hơn. Như bạn có thể thấy, một người khai thác có nhiều khả năng xử lý hơn sẽ có thể khai thác một tin nhắn nhất định sớm hơn. Đó là cách các thợ mỏ cạnh tranh với nhau để kiếm doanh thu của họ.
Bây giờ, chúng tôi đã sẵn sàng thêm nhiều khối hơn vào blockchain của mình. Hãy để chúng tôi tìm hiểu điều này trong chương tiếp theo của chúng tôi.