Python Blockchain - คลาสธุรกรรม
ในบทนี้ให้เราสร้างไฟล์ Transactionชั้นเรียนเพื่อที่ลูกค้าจะสามารถส่งเงินให้ใครก็ได้ โปรดทราบว่าลูกค้าสามารถเป็นทั้งผู้ส่งหรือผู้รับเงิน เมื่อคุณต้องการรับเงินผู้ส่งรายอื่นจะสร้างธุรกรรมและระบุpublicที่อยู่ในนั้น เรากำหนดการเริ่มต้นของคลาสธุรกรรมดังนี้ -
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
init วิธีการใช้สามพารามิเตอร์ - ของผู้ส่ง public ที่สำคัญผู้รับ publicคีย์และจำนวนเงินที่จะส่ง สิ่งเหล่านี้ถูกเก็บไว้ในตัวแปรอินสแตนซ์เพื่อใช้โดยวิธีการอื่น นอกจากนี้เรายังสร้างตัวแปรอีกหนึ่งตัวสำหรับจัดเก็บเวลาในการทำธุรกรรม
ต่อไปเราจะเขียนวิธียูทิลิตี้ที่เรียกว่า to_dictที่รวมตัวแปรอินสแตนซ์ทั้งสี่ที่กล่าวถึงข้างต้นในออบเจ็กต์พจนานุกรม นี่เป็นเพียงการใส่ข้อมูลธุรกรรมทั้งหมดที่สามารถเข้าถึงได้ผ่านตัวแปรเดียว
ดังที่คุณทราบจากบทช่วยสอนก่อนหน้านี้ว่าบล็อกแรกในบล็อกเชนคือไฟล์ Genesisบล็อก. Genesis block มีธุรกรรมแรกที่ริเริ่มโดยผู้สร้าง blockchain ข้อมูลประจำตัวของบุคคลนี้อาจถูกเก็บเป็นความลับเช่นในกรณีของ Bitcoins ดังนั้นเมื่อมีการสร้างธุรกรรมครั้งแรกนี้ผู้สร้างอาจส่งข้อมูลประจำตัวของเขาเป็นGenesis. ดังนั้นในขณะที่สร้างพจนานุกรมเราจะตรวจสอบว่าผู้ส่งคือใครGenesisและถ้าเป็นเช่นนั้นเราก็กำหนดค่าสตริงให้กับตัวแปรเอกลักษณ์ มิฉะนั้นเรากำหนดตัวตนของผู้ส่งให้กับไฟล์identity ตัวแปร.
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})
รหัสทั้งหมดสำหรับ to_dict วิธีการแสดงด้านล่าง -
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})
สุดท้ายเราจะเซ็นชื่อวัตถุพจนานุกรมนี้โดยใช้คีย์ส่วนตัวของผู้ส่ง ก่อนหน้านี้เราใช้ PKI ในตัวพร้อมอัลกอริทึม SHA ลายเซ็นที่สร้างขึ้นจะถูกถอดรหัสเพื่อรับการแสดง ASCII สำหรับการพิมพ์และจัดเก็บไว้ในบล็อกเชนของเรา sign_transaction รหัสวิธีแสดงที่นี่ -
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')
ตอนนี้เราจะทดสอบสิ่งนี้ Transaction ชั้นเรียน
การทดสอบคลาสธุรกรรม
เพื่อจุดประสงค์นี้เราจะสร้างผู้ใช้สองคนเรียกว่า Dinesh และ Ramesh. Dinesh จะส่ง 5 TPCoins ไปยัง Ramesh สำหรับสิ่งแรกนี้เราสร้างไคลเอนต์ชื่อ Dinesh และ Ramesh
Dinesh = Client()
Ramesh = Client()
จำไว้ว่าเมื่อคุณสร้างอินสแตนซ์ไฟล์ Client ชั้น public andคีย์ส่วนตัวเฉพาะสำหรับไคลเอ็นต์จะถูกสร้างขึ้น ในขณะที่ Dinesh ส่งการชำระเงินไปยัง Ramesh เขาจะต้องใช้กุญแจสาธารณะของ Ramesh ซึ่งได้มาจากการใช้คุณสมบัติประจำตัวของลูกค้า
ดังนั้นเราจะสร้างอินสแตนซ์ธุรกรรมโดยใช้รหัสต่อไปนี้ -
t = Transaction(
Dinesh,
Ramesh.identity,
5.0
)
โปรดทราบว่าพารามิเตอร์แรกคือผู้ส่งพารามิเตอร์ที่สองคือคีย์สาธารณะของผู้รับและพารามิเตอร์ที่สามคือจำนวนเงินที่จะโอน sign_transaction วิธีดึงคีย์ส่วนตัวของผู้ส่งจากพารามิเตอร์แรกสำหรับการร้องเพลงธุรกรรม
หลังจากสร้างวัตถุธุรกรรมคุณจะเซ็นชื่อโดยเรียกมัน sign_transactionวิธี. วิธีนี้ส่งคืนลายเซ็นที่สร้างขึ้นในรูปแบบที่พิมพ์ได้ เราสร้างและพิมพ์ลายเซ็นโดยใช้โค้ดสองบรรทัดต่อไปนี้ -
signature = t.sign_transaction()
print (signature)
เมื่อคุณรันโค้ดด้านบนคุณจะเห็นผลลัพธ์ที่คล้ายกับสิ่งนี้ -
7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972
เมื่อโครงสร้างพื้นฐานของเราในการสร้างลูกค้าและธุรกรรมพร้อมแล้วตอนนี้เราจะมีลูกค้าหลายรายที่ทำธุรกรรมหลายรายการเหมือนในสถานการณ์จริง