در این مقاله به توضیح تکنیکی میپردازیم که در ترجمه دادههای ساختاری با استفاده از Protobuf در هایپر لجر (Hyperledger Fabric) مورد استفاده قرار میگیرد. Protobuf کوتاه شده عبارت Protocol Buffers است و در فارسی هم به آن پروتکل بافرز گفته میشود. Protobuf روشی برای ترجمه دادههای ساختاری است و در توسعه برنامههایی برای ارتباط با یکدیگر و یا برای ذخیره داده مفید است. Protobuf شکلگیری و پردازش داده را آسانتر میکند. آن دادهها را به شیوهای سازمان میدهد که خواندن و نوشتن آنها در داخل یک قرارداد هوشمند (smart contract) آسان باشد. مفهوم قرارداد هوشمند را اولین بار اتریوم وارد فضای ارز دیجیتال کرد.
Chaincode و قرارداد هوشمند
در هایپر لجر، Chaincode برنامه خاصی است که منطق یا لوجیک تجاری هستهای را مدیریت میکند. این منطق مورد توافق گروهی از مشارکتکنندگان در یک شبکه مبتنی بر بلاک چین است. Hyperledger Fabric همچنین از یک تکنیک شکلگیری داده هم استفاده میکند که قرارداد هوشمند نامیده میشود و برای مجموعه خاصی از مدل داده در داخل یک Chaincode تعریف میشود. Chaincode میتواند مجموعههای متعددی قرارداد هوشمند برای کار کردن به عنوان یک لوجیک تراکنش داشته باشد که مدلهای داده مختلف را کنترل میکند.
به عنوان مثال، اگر لازم باشد سوابق چند کاربر در داخل یک لجر (ledger) ذخیره شود، باید یک قرارداد هوشمند داشته باشیم که همه حوزههای داده مورد نیاز از یک قرار داد هوشمند کاربری خاص را داشته باشد.
در این SmartContract، آی دی (ID)، ایمیل، نام، موبایل، سن و غیره به یک سابقه کاربری خاص مرتبط است. اگر لازم باشد که سوابق مالی را برای هر کاربر ذخیره کنیم، یک قرارداد هوشمند دیگر خواهیم داشت که Financial نامیده میشود.
پس این دو قرارداد هوشمند داخل Chaincode توسعه داده میشود و لوجیک تراکنش را برای هر دو وضعیت WorldState و Blockchain مدیریت میکند.
SmartContract عمدتا عملکردهای Put، get، Delete و GetHistory را در WorldState اجرا میکند.
PutState برای هر کلید مجزا شی جدید ایجاد میکند و یا بر بالای شیهای موجود نوشته میشود.
GetState شی را برای کلیدی خاص از وضعیت لجر بازیابی میکند.
DelState شی را از WorldState لجر برمیدارد.
GetHistoryForKey همه سوابق تاریخچه تراکنش را برای یک کلید در طول زمان برمیگرداند.
همه سوابق در CouchDB به عنوان یک سابقه WorldState ذخیره میشود. شیها به عنوان جفت key-value در فرمت JSON ذخیره میشوند. CouchDB در فراخوانی مجموعههای JSON از پایگاه داده سریعتر است. در Blockchain State، همه این سوابق به صورت بایت (byte) ذخیره میشوند و غیر قابل تغییر هستند.
Protobuf
Protobuf داده ساختاری در حال ترجمه گوگل است که از لحاظ زبانی و پلتفرمی خنثی است و یک مکانیسم قابل توسعه دارد. این دادهها به صورت بایت کامپایل (compile) میشوند و در مقایسه با فرمتهای سنتی کوچکتر، سریعتر و سادهتر هستند.
چرا از protobuf استفاده میشود؟
همچنان که دیدیم، دو قرارداد هوشمند با نامهای User و Financial برای ذخیره اطلاعات در داخل لجر یک کاربر موجود است. User اطلاعات زیستی اساسی را ذخیره میکند و Financial جزئیات بانکی کاربر را ذخیره میکند.
اما اگر به قرارداد هوشمند به منظور فراخوانی نگاه کنیم، ارتباطی بین دو مجموعه داده وجود ندارد. ما نمیتوانیم یک ID را به عنوان کلید برای مدل دادههای User و financial تعریف کنیم زیرا دادههای لجر در key-value ذخیره میشود و اطلاعات برای یک کلید لغو میشود.
هر دوی این سوابق با دو ID مختلف در Ledger State ذخیره میشوند.
برای حل این مشکل، Protobuf راهحلی سریعتر و انعطافپذیرتر فراهم میکند. ما تنها لازم است که یم فایل .proto بنویسیم که ساختار داده را توصیف میکند. بنابراین، نتیجه بایتی پیام protobuf مستقیما به User SmartContract ارجاع داده میشود و Financial SmartContract را کاملا برمیدارد.
Protobuf چگونه کار میکند؟
در اینجا نحوه تنظیم کامپایلر protobuf و ایجاد فرمت پیام Protobuf را مشاهده میکنیم.
در ابتدا لازم است چند فرآیند نصب را برای استفاده از این کامپایلر دنبال کنیم.
حالا کامپایلر را نصب میکنیم.
حال protoc را در خط فرمان تایپ میکنیم. اگر پیام Missing Input File ظاهر شود، به معنی این است که کامپایلر با موفقیت نصب شده است.
به عنوان مثال، ابتدا لازم است یک فایل financial.proto ایجاد نماییم. آن متشکل از یک فرمت پیام نوع Financial است که چهار قسمت نام بانکی، کد ifsc، شماره حساب و تاریخ ایجاد دارد.
فایل proto را برای ایجاد فایل مدل داده protobuf و برای فرمت پیام Financial کامپایل کنید.
مشاهده میشود که فایل protobuf به صورت Financial.pb.go ایجاد شده است. این فایل یک مدل داده سازگار با بسته proto است و برای تبدیل فرمت پیام proto به بایت مورد استفاده قرار میگیرد.
حال یک فیلد داده اضافی را در قرارداد هوشمند User ایجاد میکنیم.
ارجاع فرمت پیام Financial
در حالی که سوابق کاربر را به لجر اضافه میکنیم، میتوان ارجاع فرمت پیام Financial را به داخل همان قرارداد هوشمند User اضافه کرد.
تجزیه Protobuf
تجزیه دادههای Protobuf خیلی ساده است؛ از آنجا که سوابق به صورت بایت ذخیره میشود، آن را به راحتی میتوان با استفاده از ارجاع Financial proto تغییر داد.
نتیجهگیری
پروتکل بافرز پردازش و فرمت داده را آسانتر میکند. آن دادهها را با یک کد منبع خاص سازمان میدهد و باعث میشود دادهها در داخل یک قرارداد هوشمند به آسانی نوشته و خوانده شوند. این مروری بر اعمال پروتکل بافرز در هایپر لجر بود. امیدواریم که برای شما مثمر ثمر بوده باشد. فراموش نکنید که نظرات خود را با ما در میان بگذارید.