مدل داده‌‌ قرارداد هوشمند هایپرلجر فابریک: از پروتوباف تا کد زنجیره‌ای‌‌

کد زنجیره‌ای یا ‌‌ chaincode حوزه‌‌ای مخصوص برنامه‌‌نویسی است که به روند کار مشاغل مشخصی مرتبط می‌‌شود. این برنامه به دو بخش مجزای دفتر کل دسترسی پیدا می‌‌کند: یک بلاکچین، که بی‌‌وقفه تاریخچه‌‌ی تمام تراکنش‌‌ها را ثبت می‌‌کند و یک حالت جهانی که منبع ذخیره‌‌ی مقادیر فعلی است. وظیفه‌‌ی یک ارتقادهنده‌‌ی قرارداد هوشمند این است که فعل و انفعال شرکت فعلی را که هزینه بردار و مشروط به تحویل نیز هست را انتخاب کند و با برنامه‌‌نویسی، آن را به شکل یک قرارداد هوشمند درآورد. پروتوباف (مخفف بافرهای پروتکل) از هیچ زبان و پلتفرمی طرفداری نمی‌‌کند و مکانیزمی قابل گسترش برای ساختار داده‌‌های سریالیزه‌‌شده دارد. با استفاده از پروتکل بافرها می‌‌توانید مدل داده‌‌ای تعریف کنید و با آن، از تعداد زیادی منبع داده، ساختار داده‌‌ها را بنویسید و بخوانید.

0 180

حالت کد زنجیره‌ای‌‌

داده‌‌ وضعیت فعلی دفتر کل نشان‌‌دهنده‌‌ی همه‌‌ی کلیدهایی است که در تراکنش زنجیره مشارکت داشته اند. از آن جایی که وضعیت فعلی مقادیر اخیر همه‌‌ی کلیدهای کانال‌‌ها را نشان می‌‌دهد، از آن با عنوان حالت جهانی نیز یاد می‌‌شود.

احضارهای کد زنجیره‌ای‌‌ تراکنش‌‌هایی بر خلاف داده‌‌ی وضعیت فعلی اجرا می‌‌کند. برای کارایی عملکرد کد زنجیره‌ای‌‌، مقادیر اخیر همه‌‌ی کلیدها باید در یک پایگاه داده ذخیره شوند.

قراردادهای هوشمند با حالت‌‌های get، put و delete در حالت جهانی قرار می‌‌گیرند و می‌‌توانند تاریخچه‌‌ی تغییرات را مورد پرسش و پاسخ قرار دهند. APIهای شیم  (ChaincodeStubInterface, (shimرا در کد زنجیره‌ای‌‌ اجرا می‌‌کنند تا روش‌‌هایی برای دستیابی و مدیریت دفتر کل‌‌ها ارائه دهند و کد زنجیره‌ای‌‌ها را احضار کنند. روش‌‌های اصلی عبارت اند از:

  • (GetState (key string) ([]byte, error که یک پرسش و پاسخ را انجام می‌‌دهد تا اطلاعاتی در مورد وضعیت فعلی یک شیئ را بازیابی کند.
  • PutState(key string, value []byte) error  که شیئ جدیدی را می‌‌سازد یا شیئ موجود در دفتر کل حالت جهانی را تغییر می‌‌دهد.
  • DelState(key string) error  یک شیئ را از وضعیت فعلی دفتر کل حذف می‌‌کند ولی آن شیئ در تاریخچه باقی می‌‌ماند.

(GetStateByPartialCompositeKey(objectType string, keys []string

  • (StateQueryIteratorInterface, error) بر اساس کلید مرکب مشخصی وضعیت دفتر کل را مورد پرسش و پاسخ قرار می‌‌دهد.
  • (GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error تاریخچه‌‌ی مقدار یک کلید در یک زمان را بر می‌‌گرداند.

همه‌‌ی این روش‌‌ها از کلیدهای رشته‌‌ای برای شناسایی سوابق و از تکه‌‌های بایت برای مقدار وضعیت فعلی استفاده می‌‌کند. بیشتر مثال‌‌ها، از بایت‌‌های سریالیزه‌‌ی JSON برای مقدارِ وضعیت در کد زنجیره‌ای‌‌ استفاده می‌‌کنند. هایپرلجر فابریک از هر دوی LevelDB و CouchDB به عنوان حالت پایگاه داده حمایت می‌‌کنند و آخرین وضعیت هر شیئ را ذخیره می‌‌کنند. LevelDB به طور پیش‌‌فرض، کلید مقدار وضعیت پایگاه داده برای هر شخص است. CouchDB جایگزینی پیشنهادی برای وضعیت پایگاه‌‌داده‌‌های خارجی است که ویژگی‌‌های بیشتری دارد و پرسش‌‌های پیچیده‌‌تری از JSON انجام می‌‌دهد. در حالی که در LevelDB فقط می‌‌توانید از کلیدها پرسش و پاسخ داشته باشید.

پرسش و پاسخ و ارتقای وضعیت با روش‌‌های ChaincodeStubInterface

همان طور که در مثال‌‌های متعددی مشاهده کردید، دارایی‌‌ها می‌‌توانند در ساختارهای پیچیده‌‌ای قرار بگیرند. Golang structها باید قبل از قرارگیری در وضعیت کد زنجیره‌ای‌‌، در رشته‌‌های JSON جمع‌‌آوری شوند و پس از دریافت، باید پخش شوند.

با روش ChaincodeStubInterface  این عملیات می‌‌تواند این گونه باشد:

 

در مثال بالا، کد قراردادهای هوشمند به عملیات‌‌های کمکی دیگری نیز نیاز دارد:

  • ساخت کلید مرکب
  • پخش کردن داده‌‌ها پس از دریافت از وضعیت
  • جمع‌‌آوری داده‌‌ها قبل از قرارگیری در وضعیت

عملیات حالت کد زنجیره‌ای‌‌ با CCKit

روش‌‌های وضعیت پوشنده

CCKit یک کتابخانه است که Hyperledger Fabric golang chaincode را می‌‌سازد و امتحان می‌‌کند. این کتابخانه یک پوشنده (wrapper) در روش‌‌های ChaincodeStubInteface دارد که با وضعیت کد زنجیره‌ای‌‌ سروکار دارد. این روش‌‌ها ساخت کلیدهای کد زنجیره‌ای‌‌ و انتقال داده در حین کار با آن‌‌ها را ساده می‌‌کنند.

 

تبدیل از/به بایت در حال عمل با وضعیت کد زنجیره‌ای‌‌

پوشاننده‌‌ی وضعیت اجازه‌‌ی تایپ خودبه‌‌خود golang از/به هر تکه از بایت را می‌‌دهد. متنی که تایپ می‌‌کنید می‌‌تواند این باشد:

هر جمله‌‌ای که با ToByter و FromByter شروع شود

 

 

  • Golang struct یا هر نوعی که معتبر باشد (int, string, []string)
  • پیام‌‌های بافرهای پروتکل

Golang struct به طور اتوماتیک با عبارت json.Marshal و json.Unmarshal جمع‌‌آوری و پخش می‌‌شود. proto.Marshal و proto.Unmarshal برای تبدیل به پروتوباف استفاده می‌‌شود.

ساخت کلیدهای وضعیت

در مدل داده‌‌ی کد زنجیره‌ای‌‌ گاهی نیاز داریم مثال‌‌های متعددی از یک نوع (مانند مقالات تجاری متعدد، نامه‌‌های اعتباری و غیره) را در دفتر کل ذخیره کنیم. در این حالت، کلید به خصوص این مثال‌‌ها از ترکیب ویژگی‌‌ (attribute)های مختلف ساخته می‌‌شود. برای مثال:

{CommercialPaper + {Issuer} + {PaperId

با قرار دادن سری کلیدهای وضعیت کد زنجیره‌ای‌‌

CommercialPaperIssuer1Id1CommercialPaperIssuer2Id2, …]

منطق ساخت کلید در کد قرار دارد و کلیدهای مرکب در یک لحظه، با ترکیب ویژگی‌‌های متعدد حاصل می‌‌شود. کلیدهای مرکب می‌‌توانند با توابع ()PutState و ()GetState  به عنوان کلیدهای رشته‌‌ای برای ثبت و بازیابی مقادیر استفاده شوند. کدهای زیر توابعی که کلیدهای مرکب را در ChaincodeStubInterface می‌‌سازند و با آن کار می‌‌کنند را نشان می‌‌دهد:

 

وقتی داده‌‌ای را به/از کد زنجیره‌ای‌‌ می‌‌گیرید، باید کلید داشته باشید. CCKit 3 گزینه برای کاربرد کلیدهای ورودی ارائه می‌‌دهد:

  • کلید می‌‌تواند با روش Put  به کارگیری شود.

  •  
  • نوع کلید با رابط Keyer  مشخص می‌‌شود.

     
  • کلید می‌‌تواند از نوع Key  باشد: این نوع در واقع بخشی از یک رشته است. این بخش به صورت خودکار با روش shim.CreateCompositeKey به رشته تبدیل می‌‌شود.

و در کد زنجیره‌ای‌‌ باید نوع را فقط مشخص کنید. کلید خودبه‌‌خود ساخته خواهد شد:

(c.State().Put (&myStructInstance

– نوع ورودی می‌‌تواند تصویر اشتراکی داشته باشد

تصویر قوانینی را برای نام‌‌گذاری کلیدهای ابتدایی، یکتا و غیر یکتا تعیین می‌‌کند. تصویر به طور ویژه، در وضعیت پروتوباف کاربرد دارد.

پرسش و پاسخ range

همان طور که امکان بازیابی دارایی‌‌ها با یک کلید به خصوص وجود دارد، ChaincodeStubInterface توابعی را برای بازیابی بر مبنای ویژگیِ رنج معرفی می‌‌کند. به علاوه، کلیدهای مرکب می‌‌توانند از مولفه‌‌های مختلف کلید، پرسش و پاسخ انجام دهند.

توابع range یک StateQueryIteratorInterface  تکرارشونده را برای مجموعه‌‌ای از کلیدهایی که با ویژگی‌‌های پرسش هم‌‌خوانی دارد، می‌‌سازند. کلیدهای ساخته‌‌شده به ترتیب حروف الفبا مرتب شده‌اند. به علاوه، اگر یک کلید مرکب ویژگی‌‌های مختلف داشته باشد، تابع پرسش و پاسخِ ()range GetStateByPartialCompositeKeyکلیدهایی که با تعدادی از ویژگی‌‌ها هم‌‌خوانی دارد را انتخاب می‌‌کند.

برای مثال کلید CommercialPaper  از ویژگی‌‌های Issuer و PaperId تشکیل شده است و ورودی‌‌ها فقط از یک Issuer حاصل می‌‌شوند.

مثالی از مدل وضعیت پروتوباف

CCKit از Commercial paper scenario استفاده می‌‌کند و عملکردی مشابه با Node.JS دارد. پروتوباف در یک فرمت کارآمد و قابل گسترش، راهی برای رمزگذاری ساختار داده‌‌ها ارائه می‌‌دهد.

فواید پروتوباف

۱- لایه‌‌ی چکیدگی شما

با رمزگذاری اشیاء شرکت خود به فرمت .proto، مطمئن می‌‌شوید که پیام‌‌ها در اپلیکیشن گم نخواهند شد و محدوده‌‌هایی که تعیین کرده اید قوانین شرکت شما را خواهند ساخت.

۲- اضافه‌‌ها، اعتباردهندگان و غیره

Protobuf v3 پارامترهای مورد نیاز را اعتباردهی نمی‌‌کند ولی واسطه‌‌هایی مانند https://github.com/mwitkow/go-proto-validators وجود دارند که این کار را می‌‌کنند. با این واسطه‌‌ها می‌‌توانید در سطح شِما، ساختار داده‌‌های خود را کدگذاری کنید و قوانین اعتباردهی خود را معین کنید.

۳- عملکرد متقابل آسانِ زبان

از آنجایی که پروتکل بافرها در زبان‌‌های مختلفی نوشته شده اند، روابط متقابل بین اپلیکیشن‌‌های polyglot آسان‌‌تر خواهد بود. اگر یک سرویس جدید را با Java Fabric SDK یا Node.Js Fabric SDK ارائه دهید، تنها باید فایل .proto را به سازنده‌‌ی کد در زبان مقصد بفرستید و از بابت امنیت و عملکرد متقابل بین این دو زبان ترسی نداشته باشید.

معرفی مدل

با پروتکل بافرها، در مورد ساختار داده‌‌ی مورد نظر به فرمت .proto توضیحاتی ارائه دهید. با کامپایلرِ پروتکل بافر، یک goang struct بسازید و با آن کدگذاری‌‌های اتوماتیک و داده‌‌های پروتکل بافر را به یک فرمت باینری مانند json در آورید. کلاس تولید شده getterها و setterهای مورد نیاز برای پر کردن پروتکل بافرها را ایجاد می‌‌کند و جزئیات خواندن و نوشتن پروتمل بافر را حفظ می‌‌کند.

در Commercial Paper example پیام‌‌هایی که در کد زنجیره‌ای‌‌ ذخیره می‌‌شوند را معرفی می‌‌کنیم:

  • CommercialPaper در وضعیت کد زنجیره‌ای‌‌ قرار می‌‌گیرد.
  • CommercialPaperId یک ID بخصوص برای پیام کامرشال پیپر معرفی می‌‌کند
  • IssueCommercialPaper پرداخت‌‌های تراکنش‌‌های issue و رویدادهایی را که با شروع یک کامرشال پیپر جدید رخ می‌‌دهند را انجام می‌‌دهد
  • BuyCommercialPaper پرداخت‌‌های تراکنش‌‌های buy و رویدادهایی که با تغییر مالک یک کامرشال پیپر رخ می‌‌دهند را انجام می‌‌دهد
  • RedeemCommercialPaper پرداخت‌‌های تراکنش‌‌های redeem و رویدادهایی که با بازخرید یک کامرشال پیپر رخ می‌‌دهند را انجام می‌‌دهد

     

معرفی پروتوباف به تصویر وضعیت کد زنجیره‌ای‌‌

پروتکل بافرها به تصویرگران کد زنجیره‌ای‌‌ پیام ارسال می‌‌کنند تا شماهای لحظه‌‌ای را در وضعیت کد زنجیره‌ای‌‌ ذخیره کنند. هر نوع شما (protobuf یا struct) قوانین تصویر مختلفی دارد:

  • منطق ساخت کلیدهای ابتدایی
  • منطق نام‌‌گذاری
  • منطق ساخت کلیدهای ثانویه

     

کد زنجیره‌ای‌‌

در کد زنجیره‌ای‌‌ ما از ساختار فایل‌‌های .proto استفاده می‌‌کنیم و وضعیت‌‌های ازپیش‌‌تعیین‌‌شده در تصویر را می‌‌سازیم. کد زنجیره‌ای‌‌ با CCKit routing and middleware features داده‌‌ها را می‌‌سازد.

 

آزمون

ما می‌‌توانیم همه‌‌ی چین‌‌کدها را با سناریوهای MockStub بیازماییم:

 

 

 

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.