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

เมื่อโครงสร้างพื้นฐานของเราในการสร้างลูกค้าและธุรกรรมพร้อมแล้วตอนนี้เราจะมีลูกค้าหลายรายที่ทำธุรกรรมหลายรายการเหมือนในสถานการณ์จริง