daml
تیم بحث آراد | 1399.01.03

DAML یک اکوسیستم متن باز برای ساخت قراردادهای هوشمند

DAML یک اکوسیستم متن باز برای ساخت قرارداد هوشمند فول استک براساس اپلیکیشن های توزیع شده است. زبان برنامه نویسی مرکزی آن یک زبان سفارشی خاص برای توصیف جریان کار بیزینسی است. هدف آن تمرکز روی منطق اپلیکیشن بدون نگرانی در مورد اصول زیرساخت است. قبل از آن اجازه دهید به بررسی پیشنیازها بپردازیم.

لجر، بلاک چین و قراردادهای هوشمند

لجر سری زماندار از داده های ثبت شده است. بلاک چین شناخته شده ترین آنها است که توسط واحد مرکزی کنترل نمی شود. در بلاک چین، ورودی های لجر به صورت دنباله ای از بلاک ها پکیج می شوند و هر بلاک ایمن است و توسط هش رمزنگاری به بلاک های قبلی وصل است. سه ویژگی بلاک چین:

  • توزیع شده: بلاک چین دارای میزبانی نظیر به نظیر است. هر نود کپی از بلاک چین دارد و از آن مراقبت می کند. یعنی اطلاعات در تصرف یک شخص یا واحد مرکزی نیست.
  • شفافیت: چون هر نود در شبکه به اطلاعات دسترسی دارد یعنی در شبکه شفافیت وجود دارد.
  • غیرقابل تغییر: پس از ورود هر چیزی به بلاک چین امکان تغییر آن وجود ندارد.

تکنولوژی بلاک چین با ظهور بیت کوین گسترش یافت. این اختراع به قدری انقلابی بود که مردم به این فکر افتادند که آیا یک تکنولوژی گسترده تری وجود دارد که بدون وجود اطمینان اقدام به انتقال ارزش کرد.

اتریوم سپس مفهوم قرارداد هوشمند را مطرح کرد، که انعطاف پذیر بود و امکان نوشتن dApp های پشتیبانی شده توسط یک بلاک چین بر روی آن وجود داشت.

قرارداد هوشمند

قراداد یک توافق بین دو طرف است. یک قرارداد هوشمند مشابه قرارداد است، به جز اصلاحات game-changing (قوانینی که توسط قرارداد تعریف می شوند و با ماشین قابل خواندن هستند و هیچ یک از طرفین نمی تواند آن را تغییر دهد).

یک قرارداد هوشمند یک توافق دیجیتالی برای تسهیل، تأیید یا اجرای یک قرارداد است. این کار از طریق چندین طرف و ارتباط مستقیم آنها با یکدیگر، بدون واسطه صورت می گیرد.

واژه قرارداد هوشمند توسط Nick Szabo در دهه 90 ابداع شد. برای درک فلسفه آن به مثال زیر توجه کنید.

کارکرد دستگاه خرید:

  • انتخاب آیتم
  • قراردادن پول
  • دریافت کالا

طی معامله باید دو نکته را در نظر داشته باشید:

  • پیشنیاز هر گام باید انجام شود.
  • هیچ واسطه ای مثل فروشنده مداخله نمی کند.

اصول قراردادهای هوشمند:

  • دو طرف درگیر معامله می توانند به طور مستقیم با یکدیگر در ارتباط باشند.
  • هر گام پس از اجرای گام پیشنیاز انجام می شود.

با داشتن این ابداع ساده، اتریوم می توانست یک پروتکل ایجاد کند که در آن کاربران مستقیم و بی واسطه با dApp ها در ارتباط باشند. زبان برنامه نویسی اتریوم سالیدیتی است. اگرچه اتریوم بلاک چین عمومی است و دارای شبکه باز است و هر کسی می تواند ملحق شود.

سازمان ها براحتی نمی توانند از بلاک چین های عمومی استفاده کنند، آنها نیاز به بلاک چین خاصی دارند تا محرمانگی خود را حفظ کنند.

بلاک چین های شرکتی:

این بلاک چین ها برای عموم باز نیستند. برای ورود نیاز به اجازه دارند. ویژگی های آنها شامل:

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

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

ویژگی های زبان برنامه نویسی قراردادهای هوشمند شرکتی:

نکته منفی سایر زبان های برنامه نویسی این است که آنها با الگوبرداری از زبان های سیستم های سنتی ارائه شده اند. آنها سطح پایین هستند و بشدت بر زیرساخت های اجرا وابسته اند که منجر به سختی و کندی آن می شود. توسعه کنندگان به طور مرتب قراردادهای دارای باگ می سازند، که برای اکوسیستم ضررهایی در پی دارد. در سال 2016، جامعه اتریوم اولین بار به قابلیت کد قرارداد هوشمند پی بردد. DAO قرار بود مهم ترین قرارداد هوشمند اتریوم شود. اما یک باگ در آن باعث شد یک هکر بتواند معادل 150 میلیون دلار اتر به سرقت ببرد. این هک باعث تقسیم اتریوم به اتریوم و اتریوم کلاسیک شد.

این یعنی وقتی با زبانی مثل سادیتی کد می کنید باید یک سری نکات هم در نظر داشته باشید:

  • مراقب حملات reentrancy، over- and underflows، short address وغیره باشید.
  • اجازه هر طرف باید در نظر گرفته شود.
  • عملکرد یکسان یعنی چیز مختلف در زبان مختلف. درحالیکه سالدیتی از جاوااسکریپت الهام گرفته است، عملیات یکسان ممکن است در هر زبان کاملاً متفاوت باشد.

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

  • ورود به قرارداد باید داوطلبانه باشد. در این صورت هر یک از طرفین مجبور می شود نیازمندی ها را به نحو احسنت انجام دهد.
  • فقط طرفین درگیر باید در جریان عواقب باشند.
  • آنها باید بتوانند در مورد روند قرارداد در آینده پیش بینی داشته باشند. تمام وضعیت های احتمالی را باید بتوانند پیش بینی کنند.
  • توسعه دهندگان قرارداد هوشمند باید بتوانند از زبانی استفاده کنند که آنها بتوانند روی منطق بیزینس خود تمرکز کنند، تا درگیر جزئیات هش و رمزنگاری و غیره نشوند.

DAML چیست؟

DAML یک زبان قرارداد هوشمند است که برای لجرهای توزیع شده ساخته شده و امن است، گیج کننده نیست و امکان تمرکز بیزینس ها روی منطق بیزینسی را می دهد. موارد اساسی در مورد آن شامل:

  • نوشتن و خواندن آن ساده است، بنابراین شخص می تواند طبق هدف خود از آن استفاده کند.
  • ساخت و اجرای آن ساده است، می توان از صفر تا مرحله نهایی را به سرعت طی کنید.
  • زبان قرارداد است، جائی که طرفین اصل اساسی زبان هستند.
  • توسعه دهندگان قادر خواهند بود توضیح دهند قرارداد چگونه شکل گرفته است، و چه کسانی مستقیم یا غیر مستقیم در آن درگیر هستند.
  • توسعه دهندگان نیازی به پرداختن به جزئیات نداشته و می توانند روی منطق بیزینسی خود تمرکز داشته باشند.
  • DAML سطح بالایی از محرمانگی را فرآهم می کند. سیستم DAML به صورت اتوماتیک می تواند طرفینی که حق دیدن جزئیات را دارند را پیگیری کند. این اطلاعات به لجر منتقل می شود تا اطمینان دهد که تنها اطلاعات طرف خاص که حق دیدن آن را دارد به آن فرستاده شده است.
  • پس از اجرای برنامه DAML، یک سیستم بررسی قابل درک توسط انسان ساخته می شود که در فهم دو چیز کمک می کند: چرا یک اتفاق افتاد و نقش هر طرف در آن چیست.
  • در DAML، آپگریدها به صورت کد هستند و می توانند به صورت نامتلاطم با زمان دانتایم صفر انجام شوند. براحتی می توانید نقش های جدید اضافه کنید بدون اینکه مشکلی بوجود آید.

DAML یک زبان تابعی

برخلاف زبان های دستوری، DAML یک زبان تابعی است.

زبان C++، جاوا و سالیدیتی دستوری هستند. یعنی تمام مراحل باید کد شوند. مثلا در زبان C++ فرض کنید بخواهیم اعداد 1 تا 100 را پرینت کنیم:

int i = 0;
next:
i++;
printf(“%i”, i);
if(i < 100) goto next;
int a = 5;
int b = 3;
int c;
c= a + b;

همانطور که می بینید، فرآیندهای تکراری چندین بار انجام می شود و هر دستور به طور مرتب وضعیت برنامه را تغییر می دهد زیرا به صورت تکی انجام می شود.

فرآیند اضافی شامل 4 دستور به شرح زیر است:

  • تعریف متغیر a و تخصیص عدد 5 به آن
  • تعریف متغیر b و تخصیص عدد 3 به آن
  • تعریف متغیر c
  • جمع مقادیر a و b و ذخیره پاسخ در c .

برنامه های تابعی

در این برنامه توابع به جای دستورها فعال هستند. به جای نوشتن دستورها یا اجرای الگوریتم ها، تعریف مراحل به صورت توابع ریاضی و دادن ورودی به توابع و دریافت خروجی است.

برنامه نویسی تابعی برای قرارداد هوشمند مناسب است، زیرا ساختار تابع شبیه به قرارداد است. مثلاً در قرارداد “اگر آلیس به باب 100 دلار بدهد، باب به آلیس یک تیکت می دهد” مثل یک تابع است که 100 دلار را به تیکت مرتبط می کند. اگر دومین قرارداد بگوید آلیس به باب تیکت داد، باب به آلیس اجازه ورود می دهد، این تابع دوم تیکت را به دسترسی ربط می دهد. مثل توابع، این قراردادها به طور طبیعی و وقتی “اگر آلیس برای باب 100 دلار بفرستد، باب به آلیس اجازه دسترسی می دهد” انجام می شوند.

این رفتار ورودی-خروجی که آن را نسبت به وضعیت مستقل می کند منجر می شود که رویکرد تابعی از نظر منطق ریاضی ساده تر باشد: با داشتن این توابع که با دادن ورودی خروجی ناشی می شود، توسعه دهندگان می توانند روی درستی تک تک توابع و نوع سیستمی که آنها را به طور امن فعال کند و در کنار هم قابل پیش بینی باشند تمرکز کنند. به همین دلیل نسبت به زبان دستوری ارجعیت دارند. DAML یک زبان تابعی است و به توسعه دهندگان اجازه تمرکز روی منطق بیزینسی در توابع ریاضی strongly-typed را می دهد. strongly-typed یعنی هر کاری که تابع انجام می دهد را می توان با ابزارهای DAML و رانتایم بررسی کرد. این باعث می شود توسعه دهندگان بدانند چطور اجزای یک برنامه روی وضعیت لجر تأثیر می گذارد.

کد DAML:

برای شروع به کار با DAML می توانید:

  1. Visual Studio Code و DAML SDK را نصب کنید.
  2. از webIDE استفاده کنید.
template Token
with
owner : Party
where
signatory owner

چیزی که در بالا می بینید یک تمپلیت DAML است. تمپلیت نوع قرارداد و افراد مجاز انجام آن را نشان می دهد. قراردادها نمونه هایی از تمپلیت هستند. در این مثال نام تمپلیت Token است. داده های داخل قرارداد به نام arguments هستند. اجازه دهید به آرگومان های این قرارداد نگاهی بیاندازیم.

  • بلاک with نوع داده آرگوان را در داخل تمپلیت تعریف می کند و این کار را از طریق لیست کردن نام فیلد و نوع آن انجام می دهد. در مثال بالا، نام فیلد owner و نوع آن Party است.
  • بلاک where اسکوپ فیلد را تعیین می کند. در تمپلیت ما بلاک where فیلد owner را امضاکننده معرفی می کند. پس از آن، فیلد این حق را دارد تا قرارداد ایجاد یا آرشیو کند.

یک کد معمولی در DAML دارای 4 جزء است:

  • Data Model: با استفاده از DAML براحتی داده پیچیده را براحتی مدل کنید (نوع داده برای قرارداد ضروری است).
  • Fine-grained Permissions: مجوزهای قرارداد را تعیین می کند (ایجاد کننده و آرشیوکننده، دیدن بخش هایی از قرارداد و غیره).
  • Business Logic: عملیات داخل قرارداد را تعیین می کند (کارکرد اصلی قرارداد و گام های اجرا)
  • Scenario-based Testing: تست منطق بیزینسی که خود تعیین کرده اید و مراحل کار مختلف.

نمونه کد کامل DAML:

template Cash
  with
    issuer : Party
    owner : Party
    amount : Decimal
  where
    signatory issuer
    controller owner can
      Transfer : ContractId Cash
        with
          newOwner: Party
        do create this with owner = newOwner
template TicketAgreement
  with
    organizer : Party
    owner : Party
  where
    signatory organizer, owner
template TicketOffer
  with
    organizer : Party
    buyer : Party
    price : Decimal
  where
    signatory organizer
    observer buyer
    controller buyer can
      Accept : ContractId TicketAgreement
        with
          cashId : ContractId Cash
        do
          cash <- fetch cashId
          assert (cash.amount == price)
          exercise cashId Transfer with
            newOwner = organizer
          create TicketAgreement with
            organizer; owner = buyer
validateTicketPurchase = scenario do
  issuer <- getParty “Issuer”
  organizer <- getParty “Organizer”
  buyer <- getParty “Buyer”
  cash <- submit issuer do
    create Cash with
      issuer; owner = buyer; amount = 20.0
  offer <- submit organizer do
    create TicketOffer with
      organizer; buyer; price = 20.0
  submit buyer do
    exercise offer Accept with
      cashId = cash

سری از تمپلیت ها در اینجا وجود دارند که در کنار هم کار می کنند تا یک کاربر یک تیکت از سازمان بخرد. بنابراین، بر اساس رنگ 4 نوع بلاک داریم:

Data Model-قرمز

همانطور که گفتیم تمپلیت دارای فیلد داده است که باید تعیین و اجرا شود. اجازه دهید نگاهی به تمپلیت TicketOffer بیاندازیم:

template TicketOffer
  with
    organizer : Party
    buyer : Party
    price : Decimal

این تمپلیت 3 فیلد دارد:

  • Organizer و buyer از نوع Party هستند. یعنی طرفین قرارداد هستند.
  • قیمت که از نوع اعشاری است.

Fine-grained Permissions-سبز

  where
    signatory organizer
    observer buyer
    controller buyer can
      Accept : ContractId TicketAgreement

این بخش مجوزهای هر بخش را نشان می دهد. organizer حق امضا دارد و قدرت ساخت و آرشیو قرارداد را دارد.

Buyer مشاهده کننده و کنترل کننده است. یعنی مراحل و وضعیت ها را می تواند ببیند. همچنین او می تواند قرارداد تیکت را قبول کند، که منجر به آرشیو آن و ایجاد یک قرارداد TicketAgreement جدید می شود.

Business Logic-صورتی

    do
          cash <- fetch cashId
          assert (cash.amount == price)
          exercise cashId Transfer with
            newOwner = organizer
          create TicketAgreement with
            organizer; owner = buyer

بنابراین، فیلد تعیین شد و مشاهده آن تخصیص داده شد. حال، زمان منطق بیزینسی و جریان کار تمپلیت رسیده است. قرارداد چک می کند که آیا پول دریافتی از خریدار مساوی قیمت تیکت است یا نه. اگر چنین باشد مالکیت به خریدار منتقل می شود و پول به organizer می رسد.

Scenario-based Testing-آبی

validateTicketPurchase = scenario do
  issuer <- getParty “Issuer”
  organizer <- getParty “Organizer”
  buyer <- getParty “Buyer”
  cash <- submit issuer do
    create Cash with
      issuer; owner = buyer; amount = 20.0
 offer <- submit organizer do
    create TicketOffer with
      organizer; buyer; price = 20.0
  submit buyer do
    exercise offer Accept with
      cashId = cash

درنهایت، در این بخش می توانید جریان کار و منطق بیزینسی را بررسی کنید که برای توسعه دهندگان کمک کننده است. می توان با تعامل با لجر با استفاده از چندین طرف و تأثیر معامله را به سرعت تأیید کرد. نتایج سناریو مثال بالا به شکل زیر خواهد بود:

کاربردهای واقعی-Replacing ASX’s CHESS:

یکی از کاربردهای DAML در یک صرافی مالی در استرالیا است (ASX). از نظر ارزش جز 10 صرافی برتر و از نظر بالاترین نرخ بهره مشتقات در آسیا اول است. همواره در 5 صرافی برتر بوده است.

امروزه، CHESS سیستم مرکزی است که در فرآیند کلیرینگ، تسویه، ثبت نام دارایی و سایر سرویس ها ضروری است. در دسترسی این سرویس در 5 سال اخیر 99.99 درصد بوده است. با این حال، ASX تصمیم گرفته است که آن را با distributed ledger technology (DLT) تعویض کند که مزایای بیشتری دارد. دلایل این جایگزینی در وب سایت ASX به شرح زیر اعلام شده است:

  • منتشر کننده و سرمایه گذار شفافیت بیشتر از طریق دسترسی به موقع، امن و ساده به ثبت صاحبان (برای منتشرکننده) و دارایی های مالی (سرمایه گذار نهایی) و اطلاعات را فرآهم می کند.
  • سطح جدیدی از عملکرد و انعطاف به ASX کمک می کند تا در بازار در حال تغیر کارآمدتر پاسخ دهی داشته باشد.
  • یکپارچگی ساده با سیستم های بیزینسی upstream و downstream، توابع streamlining و جریان کار.
  • حذف نیاز به فرآیند گران مصالحه و به جای آن استفاده از یک منبع اطمینان واحد.
  • اطمینان از در دسترس بودن راهکار.
  • اطمینان 100 درصدی از دسترسی به آنهایی که حق استفاده از آن را بدون هیچ تبعیضی دارند.
  • فرآهم کردن سیستمی که قابل پیگیری و امن است.

نتیجه گیری:

Shaul Kfir، یکی از مؤسسان و رئیس بخش تکنولوژی Digital Asset، اشاره کرد که ظهور بلاک چین و تکنولوژی لجر توزیع شده امروزه شبیه به ظهور اینترنت در سال 1990 دارد. اینترنت یک پلتفرم انقلابی بود که با استفاده از سیستم های سنتی نمی توانست پتانسیل خود را بروز دهد. تنها پس از طراحی معماری های جدید مثل REST بود که توسعه یافت. این همان کاری است که DAML می تواند در پلتفرم های سازمان های بلاک چینی انجام دهد.

در حال حاضر، دارای چندین زبان برای قراردادهای هوشمند است. این کار باعث می شود قراردادهای هوشمند قابلیت همکاری، گسترش و مقیاس پذیری داشته باشند. DAML دارای ویژگی مورد نیاز برای سازمان ها است تا آن را به عنوان زبان اصلی بپذیرند درحالیکه پلتفرم خاص خود را می سازند. Digital Asset اعلام کرد که DAML با چندین لجر توزیع شده و پلتفرم های دیتابیس سنتی شاملVMWare Blockchain، Hyperledger Sawtooth and Fabric، Corda and Amazon’s QLDB و Aurora databases همخوانی دارد.