Python Blockchain - Lớp giao dịch
Trong chương này, chúng ta hãy tạo Transactionđể khách hàng có thể gửi tiền cho ai đó. Lưu ý rằng khách hàng có thể vừa là người gửi hoặc vừa là người nhận tiền. Khi bạn muốn nhận tiền, một số người gửi khác sẽ tạo một giao dịch và chỉ địnhpublicđịa chỉ trong đó. Chúng tôi định nghĩa việc khởi tạo một lớp giao dịch như sau:
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
Các init phương thức nhận ba tham số - của người gửi public chìa khóa, của người nhận publicvà số tiền sẽ được gửi. Chúng được lưu trữ trong các biến cá thể để sử dụng bởi các phương thức khác. Ngoài ra, chúng tôi tạo thêm một biến để lưu trữ thời gian giao dịch.
Tiếp theo, chúng tôi viết một phương thức tiện ích được gọi là to_dictkết hợp tất cả bốn biến phiên bản nêu trên trong một đối tượng từ điển. Điều này chỉ để đưa toàn bộ thông tin giao dịch có thể truy cập được thông qua một biến duy nhất.
Như bạn đã biết từ hướng dẫn trước đó rằng khối đầu tiên trong chuỗi khối là Genesiskhối. Khối Genesis chứa giao dịch đầu tiên do người tạo ra blockchain khởi xướng. Danh tính của người này có thể được giữ bí mật giống như trong trường hợp của Bitcoin. Vì vậy, khi giao dịch đầu tiên này được tạo, người tạo chỉ có thể gửi danh tính của mình làGenesis. Do đó, trong khi tạo từ điển, chúng tôi kiểm tra xem người gửi cóGenesisvà nếu vậy, chúng ta chỉ cần gán một số giá trị chuỗi cho biến nhận dạng; nếu không, chúng tôi chỉ định danh tính của người gửi choidentity Biến đổi.
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
Chúng tôi xây dựng từ điển bằng cách sử dụng dòng mã sau
return collections.OrderedDict({
'sender': identity,
'recipient': self.recipient,
'value': self.value,
'time' : self.time})
Toàn bộ mã cho to_dict phương pháp được hiển thị bên dưới -
def to_dict(self):
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
return collections.OrderedDict({
'sender': identity,
'recipient': self.recipient,
'value': self.value,
'time' : self.time})
Cuối cùng, chúng tôi sẽ ký đối tượng từ điển này bằng cách sử dụng khóa riêng của người gửi. Như trước đây, chúng tôi sử dụng PKI tích hợp với thuật toán SHA. Chữ ký đã tạo được giải mã để lấy biểu diễn ASCII để in và lưu trữ nó trong blockchain của chúng tôi. Cácsign_transaction mã phương thức được hiển thị ở đây -
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_v1_5.new(private_key)
h = SHA.new(str(self.to_dict()).encode('utf8'))
return binascii.hexlify(signer.sign(h)).decode('ascii')
Bây giờ chúng tôi sẽ kiểm tra điều này Transaction lớp học.
Kiểm tra lớp giao dịch
Với mục đích này, chúng tôi sẽ tạo hai người dùng, được gọi là Dinesh và Ramesh. Dinesh sẽ gửi 5 TPCoins cho Ramesh. Đầu tiên, chúng tôi tạo các khách hàng có tên là Dinesh và Ramesh.
Dinesh = Client()
Ramesh = Client()
Hãy nhớ rằng khi bạn khởi tạo một Client lớp học, public andkhóa riêng tư duy nhất cho khách hàng sẽ được tạo. Vì Dinesh đang gửi thanh toán cho Ramesh, anh ta sẽ cần khóa công khai của Ramesh, khóa này có được bằng cách sử dụng thuộc tính nhận dạng của khách hàng.
Do đó, chúng tôi sẽ tạo phiên bản giao dịch bằng cách sử dụng mã sau:
t = Transaction(
Dinesh,
Ramesh.identity,
5.0
)
Lưu ý rằng tham số đầu tiên là người gửi, tham số thứ hai là khóa công khai của người nhận và tham số thứ ba là số tiền cần chuyển. Cácsign_transaction phương thức truy xuất khóa riêng của người gửi từ tham số đầu tiên để hát giao dịch.
Sau khi đối tượng giao dịch được tạo, bạn sẽ ký nó bằng cách gọi sign_transactionphương pháp. Phương thức này trả về chữ ký đã tạo ở định dạng có thể in được. Chúng tôi tạo và in chữ ký bằng hai dòng mã sau:
signature = t.sign_transaction()
print (signature)
Khi bạn chạy đoạn mã trên, bạn sẽ thấy đầu ra tương tự như sau:
7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972
Bây giờ khi cơ sở hạ tầng cơ bản của chúng tôi để tạo khách hàng và giao dịch đã sẵn sàng, giờ đây chúng tôi sẽ có nhiều khách hàng thực hiện nhiều giao dịch như trong một tình huống thực tế.