الغوص العميق في Truffle Suite

كما هو الحال مع معظم الأشياء ، فإن أفضل طريقة للتعلم هي بالفعل ، لذلك دون مزيد من اللغط ، دعنا نتعمق في مثال على استخدام Truffle.

في هذا المثال ، سنستفيد من بعض أوامر Truffle الأساسية لبناء المكافئ اللامركزي لـ “Hello World!” برنامج “SimpleStorage”. كما يوحي الاسم ، سيوفر هذا المثال وسيلة لتخزين بعض البيانات على السلسلة (الحالة الأساسية مخزنة إلى أجل غير مسمى على blockchain) واسترداد هذه الحالة لاحقًا.

ملاحظة: إذا كنت ستتبع ذلك ، يفترض هذا المثال أنك اتبعت خطوات المقال الأخير لتثبيت Truffle بنجاح

بدء مشروع فارغ

لنبدأ بإنشاء مشروع فارغ باستخدام الأمر init. في مكان جديد على حاسوبك (مثل “SimpleStorage”) ومن terminal ، قم بتشغيل الأمر التالي.

$ truffle init

بافتراض أن كل شيء يعمل بنجاح ، يجب أن ترى المخرجات التالية وعددًا من الأدلة (العقود والترحيلات وما إلى ذلك) التي تم إنشاؤها في الدليل الحالي.

  Starting init...
      ================
      
      > Copying project files to /Users/bluer/Developer/temp
      
      Init successful, sweet!
      
      Try our scaffold commands to get started:
        $ truffle create contract YourContractName # scaffold a contract
        $ truffle create test YourTestName         # scaffold a test
      
      http://trufflesuite.com/docs
    

تهانينا ، لديك الآن مشروع عظم! بعد ذلك ، دعنا ننشئ عقدًا يمكننا من خلاله تخزين كود مشروع SimpleStorage الخاص بنا.

إنشاء عقد

يوفر Truffle أمر إنشاء يمكنك من خلاله تحقيق ذلك ، على الرغم من أنه كما سنوضح لاحقًا ، فإنه غالبًا ما يكون من السهل إنشاء الملف عبر بيئة المحرر المفضلة لديك.

$ truffle create contract SimpleStorage

سيؤدي هذا إلى إنشاء ملف Solidity جديد (لاحظ أن هذه هي اللغة الافتراضية) ، SimpleStorage.sol داخل دليل العقود.

باستخدام محرر التعليمات البرمجية ، أو باستخدام شيء مثل nano من سطر الأوامر ، الصق كود Solidity التالي في ملف SimpleStorage.sol وحفظه:


// SPDX-License-Identifier: MIT
pragma solidity >=0.4.21 <0.7.0;

contract SimpleStorage {
  uint storedData;

  function set(uint x) public {
    storedData = x;
  }

  function get() public view returns (uint) {
    return storedData;
  }
}
      
    

حلو ، عقدك الأول! الآن دعونا نجرب أمر compile الذي رأيناه سابقًا.

البناء!!

شغل أمر compile  من الجهاز الطرفي الخاص بك كما يلي:

  $ truffle compile

  Compiling your contracts...
  ===========================
  > Compiling ./contracts/Migrations.sol
  > Compiling ./contracts/SimpleStorage.sol
  > Artifacts written to /Users/bluer/Developer/temp/build/contracts
  > Compiled successfully using:
    - solc: 0.5.16+commit.9c3226ce.Emscripten.clang

بافتراض أن كل شيء سار بسلاسة ، كان من المفترض أن تكون Truffle قد بنت عقدك وأضفت الناتج المُخرج (يُشار إليه باسم عناصر البناء التي سنستكشفها بمزيد من التفصيل لاحقًا)build/contracts/SimpleStorage.json

لاحظ أنه من المحتمل أيضًا أن ترى بعض الإشارات إلى عمليات الترحيل (Migrations). هذه آلية تستخدمها Truffle لتخزين التفاصيل المتعلقة بالترحيل الأخير (النشر) على السلسلة.

بعد ذلك ، سنستكشف إمكانية نشر عقدنا لمحاكاة شبكة blockchain باستخدام Ganache.

ترحيل (أو نشر) عقدك

إذا قمنا بإنشاء عقد وتجميعه ، ولكننا الآن بحاجة إلى مكان ما لنشره حتى نتمكن من بدء الاختبار. هذا هو المكان الذي يأتي فيه Ganache!

كما أشرنا سابقًا ، يأتي Ganache بعدد من النكهات المختلفة. لسهولة الاستخدام ، سنبدأ باستخدام الإصدار المدمج مباشرةً في Truffle نفسه (المزيد عن Ganache CLI و Ganache UI قريبًا).

لتحقيق ذلك ، يمكننا استخدام أمرtruffle develop  الذي يبدأ في تشغيل مثيل Ganache ويزودنا بـ REPL تفاعلي يمكننا من خلاله التفاعل مع عقودنا.

  $ truffle develop

ويجب أن ترى هذا ، إذا نجحت:

Truffle Develop started at http://127.0.0.1:9545/

  Accounts:
  (0) 0x5ca1605d4671669b38f7e37c881ed996ede5ac68
  …

  Private Keys:
  (0) dd7a8c358901b0f572e461585c9ab27f92b24902c45859114776af12077cb208
  …

  Mnemonic: cloth either reunion project inflict inside ghost welcome tip lemon again knee

  ⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
  Ensure you do not use it on production blockchains, or else you risk losing funds.

  truffle(develop)>
    

سنقوم بتجاهل تفاصيل الناتج أعلاه في الوقت الحالي ، بخلاف القول بأنه يمنحنا الوصول إلى 10 حسابات ممولة مسبقًا (كإعداد افتراضي) يمكننا الاستفادة منها كوسيلة للتفاعل مع العقود.

قبل ترحيل عقدنا فعليًا ، سنحتاج إلى إنشاء نص برمجي للترحيل. تمكنك هذه الخطوة من توجيه تعليمات إلى Truffle بدقة حول كيفية ترحيل العقود الخاصة بك ، بما في ذلك أشياء مثل وسيطات المُنشئ.

في مجلد migrations  ، أنشئ ملفًا يسمى 2_deploy_contracts.js وانسخه إليه ما يلي :


var SimpleStorage = artifacts.require("./SimpleStorage.sol");

module.exports = function(deployer) {
  deployer.deploy(SimpleStorage);
};
      

البادئة العددية لـ 2_deploy_contracts.js مهمة في الواقع لسببين. أولاً ، يحدد الترتيب الذي يتم تنفيذ البرامج النصية به. ثانيًا ، إنه الفهرس الذي يتم تخزينه على السلسلة بواسطة Migration.sol لتتبع عمليات الترحيل الناجحة وفقًا لقيمة الترحيل الأخيرة.

الآن بعد أن أصبح لدينا برنامج نصي للترحيل جاهز للعمل ، يمكننا الترحيل على النحو التالي. نظرًا لأننا نقوم بهذا الترحيل من وحدة تحكم Truffle التي بدأناها truffle develop ، يمكنك في الواقع تشغيل التالي:

$ truffle(develop)> migrate

بافتراض أن كل شيء يسير على ما يرام ، يجب أن ترى ما يلي:

2_deploy_contracts.js
======

   Deploying 'SimpleStorage'
   -------------------------
   > transaction hash:    0x172f0cff41ea21a7dbbb52883a7499306f54277120fa89bbc6621c7b7efccb80
   > Blocks: 0            Seconds: 0
   > contract address:    0x524B2860a2489E385C5e12537f58d5a09A9d33ab


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:         0.000192354 ETH



Summary
=======
> Total deployments:   2
> Final cost:          0.000767772 ETH


- Blocks: 0            Seconds: 0
- Saving migration to chain.
- Blocks: 0            Seconds: 0
- Saving migration to chain.

      

إحدى قيم الإخراج الأساسية الواردة أعلاه هي عنوان العقد (0x524B2860a2489E385C5e12537f58d5a09A9d33ab في المثال أعلاه). كما قد يوحي الاسم ، هذا هو عنوان مثيل العقد الذي تم نشره والوسيلة التي تستخدمها في كيفية الرجوع إليه عند إرسال المعاملات المستقبلية.

من المؤكد أن عمليات الترحيل هي موضوع أعمق سنقوم بتغطيته أكثر لاحقًا. في غضون ذلك ، يمكن العثور على مزيد من التفاصيل حول عمليات الترحيل في وثائق Truffle.

التفاعل مع SimpleStorage

أخيرًا وليس آخرًا ، دعنا نمضي قدمًا ونتفاعل بالفعل مع عقد SimpleStorage المنشور حديثًا.

في النهاية ، هناك عدد من الطرق التي يمكنك من خلالها التفاعل مع العقود عبر السلسلة ، ولكن من أجل السهولة في هذه الحالة ، سنقوم بذلك مباشرة من وحدة تحكم Truffle.

لنقم بإنشاء مثيل لعقدنا المنشور عبر ما يلي. لاحظ أنه خلف الكواليس ، يشير Truffle إلى عناصر البناء (والتي بدورها تخزن عنوان العقد المذكور أعلاه) ، ولهذا السبب يعد هذا استدعاء JavaScript غير متزامن.

$ truffle(develop)> let storage = await SimpleStorage.deployed()

يمكنك الآن التفاعل مع كائن storage المرتجع ، على سبيل المثال. لنفعل ذلك الآن ، لكن باستدعاء طريقة العقد المحدد ، وكتابة قيمة جديدة في حالة العقد. كما سترى ، نظرًا لأن هذا الاستدعاء يؤدي إلى تغيير حالة السلسلة ، فإننا في الواقع نحصل على “إيصال” معاملة مرتجع.

     $ truffle(develop)> storage.set(42)
      {
        tx: '0x46e4bb35108e5ecf7ff656008295fda572a753476d5e04c286fcdb7868447dd6',
        receipt: {
          transactionHash: '0x46e4bb35108e5ecf7ff656008295fda572a753476d5e04c286fcdb7868447dd6',
          transactionIndex: 0,
          blockHash: '0x85dbdf5d71194cb0d841d58bbac283ccf078ce0ebe1c054c6c2ab76442459894',
          blockNumber: 9,
          from: '0x5ca1605d4671669b38f7e37c881ed996ede5ac68',
          to: '0x524b2860a2489e385c5e12537f58d5a09a9d33ab',
      ...
      }
    

دق الطبل لهذا الأمر الأخير! قم بتشغيل ما يلي للحصول على الرقم المخزن في الأصل. (يمكننا أيضًا شرح التركيب اللغوي قليلاً ، لأنه غريب بعض الشيء: نحن نضع وعدًا بتقديم رقم كبير ، والذي سيكون رقمنا المخزن.)

$ truffle(develop)> (await storage.get()).toNumber()
42    

تهانينا! لقد انتهيت الآن للتو من إنشاء ونشر والتفاعل مع أول عقد ذكي لك باستخدام مجموعة Truffle Suite. بعد ذلك ، سوف نتعرف على كيفية استخدام Ganache GUI.

Ganache GUI

يمكن أن تكون واجهة مستخدم Ganache مفيدة حقًا للأشخاص الجدد في تطوير العقود الذكية. نظرًا لطبيعتها المرئية ، فهي طريقة رائعة للتعرف على جميع التركيبات الأساسية لـ blockchain القائم على EVM والمساعدة في تجاوز تلك المرحلة من “عدم معرفة ما لا تعرفه”. إنه متعدد الأنظمة الأساسية بالكامل ومتاح للتنزيل هنا.

كما ترى في لقطة الشاشة أعلاه ، فهي تحتوي على علامات تبويب لجميع التركيبات الرئيسية بما في ذلك الحسابات والكتل والمعاملات والعقود والأحداث. يبدأ أيضًا مثيل السلسلة الخاص به على المنفذ 7545 (لاحظ أن truffle develop  افتراضيًا يبدأ في 9545 و ganache-cli على 8545).

لرؤية أفضل لواجهة مستخدم Ganache ، دعنا نحاول نشر عقد SimpleStorage نفسه (مع بعض التحسينات الصغيرة) من التمرين السابق إلى مثيل السلسلة الذي ينشئه.

إنشاء مساحة عمل

عند فتح Ganache UI ، تظهر الشاشة الأولى التي يجب أن تراها أدناه. حدد “New Workspace >> Ethereum” (بناءً على إصدارك ، يجب أن ترى أيضًا نكهات Corda و Filecoin مدرجة في القائمة المنسدلة).

من هنا ، ستظهر لك شاشة لإخيتار ملفة حيث يمكنك الانتقال إلى المشروع الذي أنشأناه مسبقًا وتحديد ملف truffle-config.js.

إذا سار كل شيء على ما يرام يجب أن تُعرض عليك شاشة الحسابات التي رأيناها سابقًا. لا تتردد في تصفح علامات التبويب لبدء التعرف على نفسك.

ترحيل عقودنا إلى Ganache UI

بعد ذلك ، سنقوم بترحيل عقودنا (مع بعض التحولات) إلى مثيل السلسلة الذي تم إنشاء مثيل له بواسطة Ganache UI في المنفذ 7545. وسيمنحنا هذا طريقة رائعة لفحص ما يحدث بصريًا ليس فقط على شبكة الاختبار الخاصة بنا ، ولكن أيضًا باستخدام العقد نفسه ، كما سترى بعد قليل.

قبل أن نتمكن من الترحيل ، سنحتاج إلى تحديث ملف truffle-config.js الخاص بنا لتضمين الشبكة الجديدة كوجهة. نظرًا لأننا استخدمنا truffle init لإنشاء مشروعنا ، فإنه يتضمن بسهولة عددًا من الوجهات التي تم التعليق عليها ضمن إدخال networks . على هذا النحو ، ستتمكن من النزول لأسفل وإلغاء التعليق (الأسطر 45-49 حاليًا في وقت كتابة هذا المقال). لاحظ أنه يتعين علينا تغيير المنفذ إلى 7545

 development: {
  host: "127.0.0.1",
  port: 7545,
  network_id: "*",
  },
      

رائع ، لدينا الآن شبكة جديدة يمكننا الانتقال إليها! للإشارة ، ينطبق هذا المبدأ نفسه عند الترحيل إلى الشبكات العامة (مثل testnets أو mainnet ؛ Ethereum المكافئ لبيئات التدريج والإنتاج).

استمر وقم بتشغيل ما يلي ، مع ملاحظة استخدام علامة –network التي تسمح لنا بتحديد شبكة معينة نريد استهدافها.

$ truffle migrate --network development

بافتراض أن هذا تم تشغيله بنجاح ، سترى الآن بعض الأنشطة المقابلة في Ganache UI. وتجدر الإشارة إلى المعاملات المدرجة ضمن علامة التبويب “Transactions” وجميع معلومات العقد (مثل التخزين وما إلى ذلك) ظهرت ضمن علامة التبويب “Contracts”. هذه ميزة مفيدة حقًا لـ Truffle و Ganache: تكامل كل من بيئة testnet وقيم العقود الذكية ، يتم تحديثها ديناميكيًا. الحصول على كل هذا بصريًا هو حقًا قوي لتطوير العقد وتصحيحه.

معلومات المعاملات على Ganache GUI

لاحظ (الحالة) للـ Storage في قسم “Contracts” لدينا:

معلومات العقد على Ganache GUI

أخيرًا ، دعنا نحدِّث عقدنا ليشمل حدثًا يتم إصداره في كل مرة يتم فيها تعيين قيمة جديدة (سنتعرف على الأحداث بمزيد من التفاصيل لاحقًا في هذا القسم). انسخ والصق ما يلي فوق SimpleStorage.sol الموجود لديك.

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.21 <0.7.0;

contract SimpleStorage {
  uint storedData;

  event setEvent(uint newValue);

  function set(uint x) public {
    storedData = x;
    emit setEvent(x);
  }

  function get() public view returns (uint) {
    return storedData;
  }
}
     

سنستخدم الآن علامة –reset عند إعادة تشغيل أمر الترحيل لاستبدال العقد بالقوة. لاحظ أن هذا سيؤدي إلى عنوان عقد جديد.

$ truffle migrate --network development --reset

دعنا ننتقل الآن مرة أخرى إلى console  في Truffle ، هذه المرة باستخدام أمر console  (على عكس Develop الذي سيشغل أيضًا مثيل ganache ، والذي لن نحتاجه هذه المرة).

$ truffle console --network development

كما هو الحال سابقًا ، يمكننا الآن إرسال ما يلي لتعيين القيمة داخل SimpleStorage الخاص بنا.

  $ let contract = await SimpleStorage.deployed()
  $ contract.set(888)

إذا كان كل شيء ناجحًا ، فسترى الآن كلاً من المرجع إلى setEvent في الإخراج المسجل. بالإضافة إلى ذلك ، ستتمكن أيضًا من الانتقال إلى علامة تبويب events  داخل واجهة مستخدم Ganache ورؤيتها أيضًا هناك.

الختام

رائع! لقد نجحت الآن في التعرف على واجهة مستخدم Ganache ، ونأمل أن تشعر براحة أكبر عند القيام بذلك مع بعض تركيبات Ethereum الأساسية والعناصر الأساسية في دورة حياة التطوير.

نحن نعلم أن هذا قد يكون بعيدًا قليلاً عن منطقة الراحة الخاصة بك ، ولكن الآن بعد أن أصبح لديك فهم أساسي Truffle ، ستتمكن من البدء في اللعب مع Solidity سنبدأ التعلم بعد ذلك!

بعد أن ننتقل إلى أساسيات Solidity والأمان ، سنغوص بشكل أعمق في عناصر التطوير على Truffle حتى تشعر بمزيد من الثقة والقدرة كمطور.

قبل كل ذلك ، على الرغم من ذلك ، نريد تقديم أداة أخرى لمساعدتك على اللعب مع Solidity ولغات تطوير العقود الذكية الأخرى: Remix.

عناصر اضافية

  • المستندات: Truffle Suite
  • البرنامج التعليمي: Petshop برنامج تعليمي رائع يشرح كيفية تطوير عقد ذكي وواجهة أمامية أساسية.

    البرنامج التعليمي: Metacoin برنامج تعليمي آخر جيد للانطلاق من خلال بناء رمز ERC-20 الخاص بك

إضافة تعليق