آموزش کلاس تراکنش در بلاک چین پایتون
آموزش کلاس تراکنش در بلاک چین پایتون
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش کلاس تراکنش در بلاک چین پایتون خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون و جنگو
در این درس، اجازه دهید یک کلاس Transaction ایجاد کنیم تا مشتری بتواند برای کسی پول ارسال کند. توجه داشته باشید که مشتری می تواند هم فرستنده و هم گیرنده پول باشد. وقتی می خواهید پول دریافت کنید، فرستنده دیگری تراکنش ایجاد می کند و آدرس عمومی شما را در آن مشخص می کند. مقداردهی اولیه یک کلاس تراکنش را به صورت زیر تعریف می کنیم
1 2 3 4 5 |
def __init__(self, sender, recipient, value): self.sender = sender self.recipient = recipient self.value = value self.time = datetime.datetime.now() |
متد init سه پارامتر دارد – کلید عمومی فرستنده، کلید عمومی گیرنده و مقداری که باید ارسال شود. اینها در متغیرهای نمونه برای استفاده توسط روش های دیگر ذخیره می شوند. علاوه بر این، یک متغیر دیگر برای ذخیره زمان تراکنش ایجاد می کنیم.
در مرحله بعد، یک متد کاربردی به نام to_dict می نویسیم که هر چهار متغیر نمونه ذکر شده در بالا را در یک شی دیکشنری ترکیب می کند. این فقط برای قرار دادن کل اطلاعات تراکنش از طریق یک متغیر است.
همانطور که از آموزش قبلی می دانید که اولین بلاک در بلاک چین یک بلوک Genesis است. بلوک Genesis شامل اولین تراکنش است که توسط خالق بلاک چین آغاز شده است. هویت این شخص ممکن است مانند مورد بیت کوین مخفی بماند. بنابراین وقتی اولین تراکنش ایجاد شد، خالق ممکن است هویت خود را به عنوان Genesis ارسال کند. بنابراین، در حین ایجاد فرهنگ لغت، بررسی می کنیم که آیا فرستنده Genesis است یا خیر و اگر چنین است، به سادگی مقداری رشته را به متغیر هویت اختصاص می دهیم. در غیر این صورت، هویت فرستنده را به متغیر هویت اختصاص می دهیم.
1 2 3 4 |
if self.sender == "Genesis": identity = "Genesis" else: identity = self.sender.identity |
ما دیکشنری را با استفاده از خط کد زیر می سازیم
1 2 3 4 5 |
return collections.OrderedDict({ 'sender': identity, 'recipient': self.recipient, 'value': self.value, 'time' : self.time}) |
کل کد متد to_dict در زیر نشان داده شده است
1 2 3 4 5 6 7 8 9 10 11 |
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 در اینجا نشان داده شده است
1 2 3 4 5 |
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') |
تست کلاس تراکنش
برای این منظور دو کاربر به نام های دینش و رامش ایجاد می کنیم. دینش 5 TPCoin به رامش ارسال خواهد کرد. برای این کار ابتدا کلاینت هایی به نام دینش و رامش ایجاد می کنیم.
1 2 |
Dinesh = Client() Ramesh = Client() |
به یاد داشته باشید که وقتی یک کلاس Client را نمونهسازی میکنید، کلیدهای عمومی و خصوصی منحصر به فرد مشتری ایجاد میشوند. از آنجایی که دینش در حال ارسال پرداخت به رامش است، به کلید عمومی رامش نیاز دارد که با استفاده از ویژگی هویت مشتری به دست آمده است.
بنابراین، نمونه تراکنش را با استفاده از کد زیر ایجاد خواهیم کرد
1 2 3 4 5 |
t = Transaction( Dinesh, Ramesh.identity, 5.0 ) |
توجه داشته باشید که پارامتر اول فرستنده، پارامتر دوم کلید عمومی گیرنده و پارامتر سوم مبلغی است که باید منتقل شود. روش sign_transaction کلید خصوصی فرستنده را از اولین پارامتر برای آهنگسازی تراکنش بازیابی می کند.
پس از ایجاد شی تراکنش، با فراخوانی متد sign_transaction آن را امضا می کنید. این روش امضای تولید شده را در قالب قابل چاپ برمی گرداند. ما امضا را با استفاده از دو خط کد زیر تولید و چاپ می کنیم
1 2 |
signature = t.sign_transaction() print (signature) |
وقتی کد بالا را اجرا می کنید، خروجی مشابه این − را خواهید دید
1 2 3 4 |
7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7 13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0 0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5 c6363dc511222fb2416036ac04eb972 |
اکنون که زیرساخت اصلی ما برای ایجاد یک مشتری و یک تراکنش آماده است، اکنون چندین مشتری خواهیم داشت که چندین تراکنش را مانند یک موقعیت واقعی انجام می دهند.
دیدگاه شما