آموزش گام به گام زبان برنامه نویسی Solidity برای ساخت DApp اتریوم
ساناز موسوی | 1397.04.30

آموزش گام به گام زبان برنامه نویسی Solidity برای ساخت DApp اتریوم (قسمت سوم)

سخنان نهایی: این مقاله باید تا حد زیادی به شما کمک کند تا نسخه آزمایشی و کد های مربوط به زبان برنامه نویسی solidity اتریوم را به خوبی آموخته و یک توسعه دهنده DApp شوید. می توانید پلاگین Metamask را نصب کنید، به MAinnet اتریوم متصل شوید و به لینک www.enledger.io/etherereum-demo-tools مراجعه کنید. در آنجا برنامه ی Guestbook / Notary Demo را مشاهده خواهید کرد و حتی اگر بخواهید می توانید guestbook و عکس های notarize را هم امضا کنید.

برای کنترل بیشتر روی قرارداد هوشمند، توانایی های بیشتری برای «صاحب» این قرارداد در نظر می گیرم؛ که بتواند آدرس اولین پرداخت کننده برای راه اندازی قرارداد هوشمند در mainnet اتریوم را، که در اینجا خودم هستم، ببیند. با این کار قصد دارم خیلی سریع به شما نشان دهم که ادمین خاص چه توانایی هایی دارد:

address GeektAdmin;
  function Geekt() payable {  // this is the CONSTRUCTOR (same name as contract) it gets called ONCE only when contract is first deployed
    GeektAdmin = msg.sender;  // just set the admin, so they can remove bad users or images if needed, but nobody else can
  }
  modifier onlyAdmin() {
      if (msg.sender != GeektAdmin)
        throw;
      // Do not forget the "_;"! It will be replaced by the actual function body when the modifier is used.
      _;
  }
  function removeUser(address badUser) onlyAdmin returns (bool success) {
    delete Users[badUser];
    return true;
  }
  function removeImage(bytes32 badImage) onlyAdmin returns (bool success) {
    delete notarizedImages[badImage];
    return true;
  }

تابع سازنده خاص Geekt() را هم نام قرارداد ساختیم. این تابع تنها یکبار، زمان اولین فراخوانی قرارداد روی بلاک چین، فراخوانی می شود. این تابع، آدرسِ msg.sender شخصی که اولین پرداخت برای راه اندازی قرارداد هوشمند را انجام داده، به ادمین نشان می دهد. همچنین، تابع اصلاح کننده خاص onlyAdmin() برای محدود کردن توابع removeUser() و removeImage() به کار می رود و این توابع فقط زمانی فعال می شوند که آدرس msg.sender آدرسِ ادمین باشد.

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

آموزش گام به گام زبان برنامه نویسی Solidity برای ساخت DApp اتریوم

how-to-learn-solidity-2/ Source

نکته نهایی دیگر، ساختارِ اتریوم و هزینه واقعی استفاده از قرارداد های هوشمند است. اتریوم شبکه ایست که روی یک بلاک چین عمومی، منفرد و بزرگ اجرا می شود و هرکسی می تواند داده های آن را ارزیابی و ذخیره کند. با این حال، انجام چنین کاری تا حدودی گران است. همانطور که در تصویر فوق می بینید، من ۰.۰۰۴۱۸۲ اتر که معادل ۰.۹۶ دلار است برای ذخیره یک عکس URL، SHA256 notary hash، زماندار و ۱۹۶ بایتی روی Mainnet اتریوم، پرداخت کردم. یعنی، ۵۱۵۹.۰۳ دلار برای یک مگابایت! (ارقام بر اساس زمان نگارش مقاله آورده شده است)

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

بیشتر بخوانید: سرنوشت توکن ها در ۲۰۱۸

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

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

بیشتر بخوانید: قراردادهای هوشمند؛ ۱۲ موارد استفاده برای کسب و کار و فراتر از آن

آموزش گام به گام زبان برنامه نویسی Solidity برای ساخت DApp اتریوم

how-to-learn-solidity-2/ Source

نکات سری!

فرض کنید قرارداد هوشمند خود را با زبان برنامه نویسی solidity نوشتید، هزار بار تست می کنید تا مطمئن شوید تمام بخش ها به خوبی کار می کند. حال چطور آن را درون Mainnet  قرار می دهید؟

این کار مشکل است و معمولا نیاز پیدا می کنید که فول نود اتریوم را خودتان اجرا کنید یا پرداختی انجام دهید و کس دیگری این کار را برای شما انجام دهد و به شما اجازه ارزیابی بدهد (مثلا با VPS). برای اولین بار، می توانید قرارداد هوشمند کامل خود را در Mainnet اتریوم، بدون نیاز به فول نود اتریوم خودتان، تست و حتی اجرا کنید. ابزار EthDeployer نرم افزار رایگانیست که به همین منظور ساخته شده است (از اینجا نیز قابل دسترس است). کافیست پلاگین Metamask را نصب کنید و ابتدا به Mainnet اتریوم متصل شوید. به علاوه نیاز دارید مقداری اتر در کیف پول Metamask خود برای پرداخت کارمزد راه اندازی قرارداد هوشمند Mainnet داشته باشید.

آموزش گام به گام زبان برنامه نویسی Solidity برای ساخت DApp اتریوم

how-to-learn-solidity-2/ Source

این ابزار از Browser-Solc استفاده می کند که فقط یک browserified، ابزار بارگیری minified برای بارگذاری ورژن Solidity کامپایلرِ جاوا اسکریپت، مستقیما در مرورگر سرویس گیرنده، برای تجزیه و تحلیل یا کامپایل یک قرارداد هوشمند on-the-fly، است. این ویژگی باعث می شود این ابزار پرتابل باشد. کد زیر آخرین کامپایلر  Solidity موجود را بارگذاری می کند:

<script src=”./browser-solc.min.js” type=”text/javascript”></script>

browser-solc.min.j جاوا اسکریپ را با صفحه سطح بالای index.html بارگذاری می کنیم که شیء window.BrowserSolc را برای عکس العمل اسکریپت های سطح پایین، می سازد. این برنامه بسیار ساده است و در عرض چند دقیقه روی دستگاه شما نصب می شود.

setupCompiler(){
    var outerThis = this;
    setTimeout(function(){
      // console.debug(window.BrowserSolc);
      window.BrowserSolc.getVersions(function(soljsonSources, soljsonReleases) {
        var compilerVersion = soljsonReleases[_.keys(soljsonReleases)[0]];
        console.log("Browser-solc compiler version : " + compilerVersion);
        window.BrowserSolc.loadVersion(compilerVersion, function(c) {
          compiler = c;
          outerThis.setState({statusMessage:"ready!"},function(){
            console.log("Solc Version Loaded: " + compilerVersion);
          });
        });
      });
    },1000);
  }

تابع setupCompiler پس از یک ثانیه انتظار برای شیء window.BrowserSolc روی صفحه بارگذاری می گردد. سپس توابع داخلی .getVersions() و .loadVersion() و کامپایلر تابعی Solc مستقیما در محیط مشتری اجرا می شوند. برای تکمیل، خطوط مربوط به اجرای واقعی و به کار گیری قرارداد درون یک تابع جاوا اسکریپت را می آورم:

compileAndDeploy() {
     ...
     var result = compiler.compile(this.state.contractText, optimize);
     var abi = JSON.parse(result.contracts[_.keys(result.contracts)[0]].interface);
     var bytecode = "0x" + result.contracts[_.keys(result.contracts)[0]].bytecode;
     var myContract = web3.eth.contract(abi);
     ...
       web3.eth.estimateGas({data: bytecode},function(err,gasEstimate){
          ...
          myContract.new({from:web3.eth.accounts[0],data:bytecode,gas:inflatedGasCost},function(err, newContract){
            ...
            thisTxHash: newContract.transactionHash,
            thisAddress: newContract.address

 

پیش تر با تمام این شیء ها آشنا شده ایم. compiler.compile() را روی متن قرارداد فراخوانی کرده، شیء «نتیجه» قرارداد اجرا شده را از abi و bytecode استخراج می کنیم و به یک تراکنش جدید می فرستیم. تابع .estimateGas() برای انجام تخمین خوب، اینجا قرار داده شده است. وقتی قرارداد با موفقیت اجرا می شود، شناسه تراکنش و آدرس قرارداد جدید را به کاربر نشان می دهیم.اگر هنگام اجرا با پیغام خطا مواجه شدید، حتما لینک شناسه تراکنش را چک کنید. احتمالا قرارداد به طور موفقیت آمیز در حال اجراست؛ گاهی Metamask در انتخاب تراکنش موفق و برداشتن آدرس جدید دچار اشکال می شود.در نهایت، من ۰.۰۲۲۶۸ اتر و معادل ۵.۳۰ دلار در تاریخ ۱ ژوئن ۲۰۱۷ برای راه اندازی قرارداد در Mainnet اتریوم پرداخت کردم. به خاطر آورید که پیش نمایش خیلی ساده اپلیکیشن با تنها دو ساختار داده مد نظرمان بود. بنابراین اصلا مقرون به صرفه نیست. هرچند، شما اغلب تنها یکبار نیاز دارید که قرارداد هوشمندتان را در زنجیره اصلی اجرا کنید.

بیشتر بخوانید: آیا می توان بلاک چین را به صورت سه بعدی دید؟

توجه!

دیدگاه هایی که در این مقاله ارائه شده اند، متعلق به نویسنده می باشند و لزوماً مربوط به Coiniran نمی باشد و نباید به آن نسبت داده شود.

Source & image