Các giao dịch được thực hiện bởi các khách hàng khác nhau được xếp hàng đợi trong hệ thống; các thợ đào nhận các giao dịch từ hàng đợi này và thêm nó vào khối. Sau đó, họ sẽ khai thác khối và người khai thác chiến thắng sẽ có đặc quyền thêm khối vào blockchain và do đó kiếm được một số tiền cho mình.
Chúng tôi sẽ mô tả quá trình khai thác này sau khi chúng tôi thảo luận về việc tạo ra blockchain. Trước khi chúng tôi viết mã cho nhiều giao dịch, hãy thêm một chức năng tiện ích nhỏ để in nội dung của một giao dịch nhất định.
Hiển thị Giao dịch
Hàm display_transaction chấp nhận một tham số duy nhất của loại giao dịch. Đối tượng từ điển trong giao dịch đã nhận được sao chép vào một biến tạm thời được gọi là dict và sử dụng các khóa từ điển, các giá trị khác nhau được in trên bảng điều khiển.
def display_transaction(transaction):
#for transaction in transactions:
dict = transaction.to_dict()
print ("sender: " + dict['sender'])
print ('-----')
print ("recipient: " + dict['recipient'])
print ('-----')
print ("value: " + str(dict['value']))
print ('-----')
print ("time: " + str(dict['time']))
print ('-----')
Tiếp theo, chúng tôi xác định một hàng đợi giao dịch để lưu trữ các đối tượng giao dịch của chúng tôi.
Hàng đợi giao dịch
Để tạo một hàng đợi, chúng ta khai báo một biến danh sách toàn cục được gọi là các giao dịch như sau:
transactions = []
Chúng tôi chỉ cần nối mỗi giao dịch mới được tạo vào hàng đợi này. Xin lưu ý rằng để ngắn gọn, chúng tôi sẽ không triển khai logic quản lý hàng đợi trong hướng dẫn này.
Tạo nhiều khách hàng
Bây giờ, chúng ta sẽ bắt đầu tạo giao dịch. Đầu tiên, chúng tôi sẽ tạo ra bốn khách hàng sẽ gửi tiền cho nhau để nhận các dịch vụ hoặc hàng hóa khác nhau từ những người khác.
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()
Tại thời điểm này, chúng tôi có bốn khách hàng tên là Dinesh, Ramesh, Seema và Vijay. Hiện tại, chúng tôi giả định rằng mỗi khách hàng này có một số TPCoins trong ví của họ để giao dịch. Danh tính của từng khách hàng này sẽ được xác định bằng cách sử dụng thuộc tính nhận dạng của các đối tượng này.
Tạo giao dịch đầu tiên
Bây giờ, chúng tôi bắt đầu giao dịch đầu tiên của mình như sau:
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)
Trong giao dịch này, Dinesh gửi 5 TPCoins cho Ramesh. Để giao dịch thành công, chúng tôi sẽ phải đảm bảo rằng Dinesh có đủ tiền trong ví của anh ấy cho khoản thanh toán này. Lưu ý rằng, chúng tôi sẽ cần một giao dịch gốc để bắt đầu lưu thông TPCoin trong hệ thống. Bạn sẽ viết mã giao dịch cho giao dịch khởi đầu này ngay sau khi bạn đọc cùng.
Chúng tôi sẽ ký giao dịch này bằng khóa cá nhân của Dinesh và thêm nó vào hàng đợi giao dịch như sau:
t1.sign_transaction()
transactions.append(t1)
Sau giao dịch đầu tiên do Dinesh thực hiện, chúng tôi sẽ tạo thêm một số giao dịch giữa các khách hàng khác nhau mà chúng tôi đã tạo ở trên.
Thêm nhiều giao dịch hơn
Bây giờ chúng tôi sẽ tạo thêm một số giao dịch, mỗi giao dịch sẽ cung cấp một vài TPCoin cho một bên khác. Khi ai đó tiêu tiền, không nhất thiết anh ta phải kiểm tra xem có đủ số dư trong ví này hay không. Người khai thác dù sao cũng sẽ xác thực từng giao dịch cho số dư mà người gửi có trong khi bắt đầu giao dịch.
Trong trường hợp không đủ số dư, người khai thác sẽ đánh dấu giao dịch này là không hợp lệ và sẽ không thêm nó vào khối này.
Đoạn mã sau tạo và thêm chín giao dịch khác vào hàng đợi của chúng tôi.
t2 = Transaction(
Dinesh,
Seema.identity,
6.0
)
t2.sign_transaction()
transactions.append(t2)
t3 = Transaction(
Ramesh,
Vijay.identity,
2.0
)
t3.sign_transaction()
transactions.append(t3)
t4 = Transaction(
Seema,
Ramesh.identity,
4.0
)
t4.sign_transaction()
transactions.append(t4)
t5 = Transaction(
Vijay,
Seema.identity,
7.0
)
t5.sign_transaction()
transactions.append(t5)
t6 = Transaction(
Ramesh,
Seema.identity,
3.0
)
t6.sign_transaction()
transactions.append(t6)
t7 = Transaction(
Seema,
Dinesh.identity,
8.0
)
t7.sign_transaction()
transactions.append(t7)
t8 = Transaction(
Seema,
Ramesh.identity,
1.0
)
t8.sign_transaction()
transactions.append(t8)
t9 = Transaction(
Vijay,
Dinesh.identity,
5.0
)
t9.sign_transaction()
transactions.append(t9)
t10 = Transaction(
Vijay,
Ramesh.identity,
3.0
)
t10.sign_transaction()
transactions.append(t10)
Khi bạn chạy đoạn mã trên, bạn sẽ có mười giao dịch trong hàng đợi để các thợ đào tạo khối của họ.
Giao dịch bán phá giá
Với tư cách là người quản lý blockchain, bạn có thể định kỳ xem xét nội dung của hàng đợi giao dịch. Với mục đích này, bạn có thể sử dụng hàm display_transaction mà chúng tôi đã phát triển trước đó. Để kết xuất tất cả các giao dịch trong hàng đợi, chỉ cần lặp lại danh sách giao dịch và đối với mỗi giao dịch được tham chiếu, hãy gọi hàm display_transaction như được hiển thị ở đây
for transaction in transactions:
display_transaction (transaction)
print ('--------------')
Các giao dịch được phân tách bằng một đường đứt nét để phân biệt. Nếu chạy đoạn mã trên, bạn sẽ thấy danh sách giao dịch như hình bên dưới:
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214
4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e
c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b
47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311
c4d866c12d79d3fc3034563dfb0203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e
674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad
d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977
04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484
d805f874260dfc2d1627473b910203010001
-----
value: 15.0
-----
time: 2019-01-14 16:18:01.859915
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214
4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e
c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b
47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311
c4d866c12d79d3fc3034563dfb0203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae14
3cbe59b3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fb
d9ee74b9e7ea12334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0
961b4f212d1fd5b5e49ae09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d0623
75799742a359b8f22c5362e5650203010001
-----
value: 6.0
-----
time: 2019-01-14 16:18:01.860966
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e
674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad
d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977
04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484
d805f874260dfc2d1627473b910203010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876
f41338c62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cc
e25be99452a81df4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47
452590137869c25d9ff83d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f0
0e321b65e4c33acaf6469e18e30203010001
-----
value: 2.0
-----
time: 2019-01-14 16:18:01.861958
-----
--------------
Để ngắn gọn, tôi chỉ in một số giao dịch đầu tiên trong danh sách. Trong đoạn mã trên, chúng tôi in tất cả các giao dịch bắt đầu bằng giao dịch đầu tiên ngoại trừ giao dịch gốc chưa bao giờ được thêm vào danh sách này. Khi các giao dịch được thêm vào các khối định kỳ, bạn thường sẽ quan tâm đến việc chỉ xem danh sách các giao dịch chưa được khai thác. Trong trường hợp đó, bạn sẽ cần tạo một vòng lặp for thích hợp để lặp lại các giao dịch chưa được khai thác.
Cho đến nay, bạn đã học được cách tạo khách hàng, cho phép họ tham gia với nhau và duy trì một hàng đợi các giao dịch đang chờ xử lý sẽ được khai thác. Bây giờ, đến phần quan trọng nhất của hướng dẫn này và đó là tạo ra chính một blockchain. Bạn sẽ tìm hiểu điều này trong bài học tiếp theo.
Blockchain Python – Lớp khối
Một khối bao gồm một số lượng giao dịch khác nhau. Để đơn giản, trong trường hợp của chúng tôi, chúng tôi sẽ giả định rằng khối bao gồm một số lượng giao dịch cố định, trong trường hợp này là ba. Vì khối cần lưu trữ danh sách ba giao dịch này, chúng tôi sẽ khai báo một biến thể hiện có tên là Veri_transactions như sau:
self.verified_transactions = []
Chúng tôi đã đặt tên biến này là Veri_transactions để chỉ ra rằng chỉ những giao dịch hợp lệ đã được xác minh mới được thêm vào khối. Mỗi khối cũng giữ giá trị băm của khối trước đó, để chuỗi khối trở nên bất biến.
Để lưu trữ hàm băm trước đó, chúng ta khai báo một biến thể hiện như sau:
self.previous_block_hash = “”
Cuối cùng, chúng tôi khai báo một biến nữa được gọi là Nonce để lưu trữ các nonce do người khai thác tạo ra trong quá trình khai thác.
self.Nonce = “”
Định nghĩa đầy đủ của lớp Block được đưa ra dưới đây:
class Block:
def __init__(self):
self.verified_transactions = []
self.previous_block_hash = ""
self.Nonce = ""
Vì mỗi khối cần giá trị băm của khối trước đó, chúng tôi khai báo một biến toàn cục được gọi là last_block_hash như sau:
last_block_hash = “” Bây giờ chúng ta hãy tạo khối đầu tiên của mình trong blockchain.