চুক্তি ক্লোন তৈরি করে এমন একটি চুক্তি কারখানা কীভাবে তৈরি করবেন

নীচের নিবন্ধটি লিখেছেন আপস্টেট ইন্টারেক্টিভের কেসনিয়া লিফানোয়া এবং ডগ ক্রেসেনজি।

গত বছর আমরা নয়টি স্মার্ট চুক্তি সমন্বিত বাণিজ্যিক ক্লায়েন্টের জন্য ডিএও-তে কাজ শুরু করি। আমরা এনডিএ প্রতি নির্দিষ্টকরণে যেতে পারি না, তবে সংক্ষেপে ডিএও তার সমষ্টিগত ব্যবহারকারী এবং শেয়ারহোল্ডারদের আমাদের বিকাশিত স্মার্ট চুক্তির মাধ্যমে স্বায়ত্তশাসিতভাবে পরিচালনা করতে সক্ষম করে। এটি আর্থিক লেনদেন প্রক্রিয়াজাতকরণ, স্মার্ট চুক্তি তৈরি এবং মোতায়েন, টোকেনকে নকল করা, পরিচালনা পরিচালনা এবং বহু-স্বাক্ষর প্রমাণীকরণ পরিচালনা করার জন্য দায়বদ্ধ।

ডিএও কেন্দ্রগুলির একটি মূল বৈশিষ্ট্য শেষ ব্যবহারকারীরা তাদের নিজস্ব এবং পরিচালনা করার জন্য স্মার্ট কন্ট্রাক্ট ক্লোন তৈরি করতে সক্ষম হওয়ার প্রয়োজনীয়তার উপর নির্ভর করে।

আমরা বুঝতে পেরেছিলাম যে কয়েক হাজার বার না হলেও একই চুক্তি স্থাপন করা ব্যয়বহুল হবে, তাই আমরা একটি চুক্তি কারখানা বাস্তবায়নের সিদ্ধান্ত নিয়েছি। চুক্তি কারখানাটি ব্যবহারকারীদের প্রক্সি চুক্তি উত্পন্ন এবং স্থাপনের অনুমতি দেয় যা একই বাস্তবায়ন চুক্তিকে নির্দেশ করে। বাস্তবায়ন চুক্তিটি যেখানে সমস্ত যুক্তি যুক্ত থাকে।

একইভাবে যুক্তিযুক্ত চুক্তিটি বারবার প্রবর্তনের চেয়ে এই পদ্ধতিতে প্রক্সি চুক্তি স্থাপন করা আরও দক্ষ এবং ব্যয়বহুল। এটি কেবলমাত্র বাস্তবায়ন চুক্তিতে কল অর্পণ করার জন্য দায়বদ্ধ। অন্য কথায়, সমস্ত প্রক্সি চুক্তি বা ক্লোনগুলির বাস্তবায়ন চুক্তির মতোই কার্যকারিতা রয়েছে তবে মূল পার্থক্যটি হ'ল প্রতিটি প্রক্সি চুক্তির নিজস্ব রাষ্ট্র রয়েছে।

গ্রন্থাগার এবং মান

এই চুক্তি কারখানার সমাধানটি কার্যকর করার পরে আমরা একটি চুক্তি কারখানার লাইব্রেরি বা মানক তৈরি করার চিন্তাভাবনা করেছি। আমরা শীঘ্রই উপলব্ধি করেছিলাম ওপেনজেপেলিনে আমাদের বন্ধুরা আমাদের এতে পরাজিত করেছে এবং তাদের নিজস্ব আপগ্রেডযোগ্য, প্রক্সি কারখানার বেস চুক্তিটি প্রয়োগ করেছে। আমরা ন্যূনতম প্রক্সি চুক্তির জন্য পিটার মারে, নেট ওয়েলচ এবং জো মেসারম্যানের ইআইপি 1167 স্ট্যান্ডার্ড জুড়ে এসেছি। তাদের স্ট্যান্ডার্ডটি বিকাশকারীদের একটি অপ্রয়োজনীয় উপায়ে সহজ এবং সস্তায় স্মার্ট চুক্তির কার্যকারিতা ক্লোন করতে সক্ষম করে একটি ন্যূনতম বাইটকোড বাস্তবায়ন নির্দিষ্ট করে যা একটি পরিচিত, নির্দিষ্ট ঠিকানায় সমস্ত কলকে প্রতিনিধিত্ব করে।

চাকাটি পুনরায় উদ্ভাবন এবং আমাদের নিজস্ব চুক্তি কারখানার গ্রন্থাগারটি তৈরি করার বা আমাদের নিজস্ব নতুন মানের প্রস্তাব দেওয়ার পরিবর্তে আমরা ভেবেছিলাম যে ইতিমধ্যে কী রয়েছে তা হাইলাইট করা এবং চুক্তি কারখানাগুলি কীভাবে কার্যকর হয়, কীভাবে তারা কাজ করে এবং অন্বেষণ করে তা সেরা হওয়া ভাল would কয়েকটি নমুনা ব্যবহারের ক্ষেত্রে।

কোড

ওপেনজেপেলিন প্রক্সিফ্যাক্টরি চুক্তিটি ব্যবহার করতে একটি নতুন প্রকল্প তৈরি করুন এবং চালনা করে ওপেনজেপেলিন এসডিকে জাভাস্ক্রিপ্ট লাইব্রেরি ইনস্টল করুন

এনপিএম ইনস্টল করুন @ ওপেনজেপেলিন / আপগ্রেড

এই লাইব্রেরিটি সাধারণত ওপেনজেপেলিন এসডিকে ব্যবহার করে তবে আপনি এটি সরাসরি আপনার প্রকল্পেও ব্যবহার করতে পারেন যা আমরা আজ যে পদ্ধতিটি ব্যবহার করব।

প্রথমে আসুন বাস্তবায়ন চুক্তিটি তৈরি করুন যা আপনি ক্লোন করতে চান।

প্রাগমা দৃity়তা ^ 0.5.0;
আমদানি করুন '@ ওপেনজেপেলিন / আপগ্রেড / চুক্তি / ইনিশিয়ালিয়েবল.সোল';
আমদানি করুন '@ ওপেনজেপেলিন / চুক্তি-ইথেরিয়াম-প্যাকেজ / চুক্তি / মালিকানা / Ownable.sol';
চুক্তি জিনিসটি আরম্ভযোগ্য, মালিকানাধীন {
  স্ট্রিং পাবলিক নাম;
  / **
  * @ দেবদেব যুক্তিযুক্ত চুক্তি যা প্রক্সিগুলি নির্দেশ করে
  * @ পরিম _ নাম নাম
  * @ পরিম _ _ মালিক জিনিসটির মালিকের ঠিকানা
  * /
  ফাংশন সূচনা (স্ট্রিং মেমরি _নাম, ঠিকানা _ মালিক) পাবলিক {
    Ownable.initialize (_owner);
  নাম = _নাম;
  }
}

আপনি দেখতে পাবেন যে কনস্ট্রাক্টর ফাংশনটি ব্যবহার না করে আমরা একটি ইনিশিয়াল ফাংশন ব্যবহার করব। এটি কারণ কারণ কনস্ট্রাক্টর ফাংশন সহ একটি চুক্তি ক্লোনিং 100% সুনির্দিষ্ট হবে না। কনস্ট্রাক্টর ফাংশন একটি চুক্তির তৈরি কোডের অংশ, যা রানটাইম কোড (ব্লকচেইনে সঞ্চিত প্রকৃত চুক্তি কোড, এবং আরম্ভকরণ প্রক্রিয়া)। কোনও চুক্তি ক্লোন করার সময় আমরা কেবল রানটাইম কোডটি ক্লোন করি। আমরা ইনিশিয়াল ফাংশন দিয়ে কনস্ট্রাক্টর ফাংশনটি স্যুইচ করতে পারি যা একটি নিয়মিত ফাংশন যা রানটাইম কোডে অন্তর্ভুক্ত থাকে। রানটাইম কোড বনাম তৈরি কোডের একটি দুর্দান্ত প্রযুক্তিগত ভাঙ্গনের জন্য, নিবন্ধটি এখানে দেখুন।

এটি আমাদের আরেকটি বিষয় নিয়ে আসে। যেহেতু ইনিশিয়াল ফাংশনটি একটি নিয়মিত ফাংশন যা বেশ কয়েকবার বলা যেতে পারে, তাই এটি কেবল একবার বলা হয় তা নিশ্চিত করার জন্য আমাদের অতিরিক্ত কার্যকারিতা যুক্ত করতে হবে (প্রতিটি প্রক্সি)। ধন্যবাদ ওপেনজেপেলিন একটি সূচনাযোগ্য চুক্তি সরবরাহ করে, একটি বেস চুক্তি যা আমরা উত্তরাধিকার সূত্রে গ্রহণ করতে পারি যা আমাদের পক্ষে সেই চেকটি সম্পাদন করার যুক্তি সরবরাহ করে।

আমরা চুক্তি মালিকানা অধিকার দাঁড়িয়ে থাকা ব্যবহারকারীকেও দিতে চাই, সুতরাং আমরা মালিকানাধীন চুক্তির উত্তরাধিকারী যা আমরা ব্যবহার করতে পারি তার একটি সূচনা ফাংশন রয়েছে।

এর পরে, আমাদের চুক্তি কারখানাটি তৈরি করুন:

প্রাগমা দৃity়তা ^ 0.5.0;
আমদানি "./Ting.sol";
আমদানি করুন '@ ওপেনজেপেলিন / আপগ্রেড / চুক্তি / আপগ্রেডিবিলিটি / প্রক্সিফ্যাক্টরি.সোল';
চুক্তি থিংফ্যাক্টরি হ'ল প্রক্সিফ্যাক্টরি {
  পাবলিক বাস্তবায়ন ঠিকানা
  কনস্ট্রাক্টর (অ্যাড্রেস _ কমপ্লিটেশন কনট্রাক্ট) সর্বজনীন {
    বাস্তবায়ন কন্ট্র্যাক্ট = _প্রিমেশনেশন কন্ট্র্যাক্ট;
  }
  ফাংশন ক্রিয়েটিং (বাইটস মেমরি _ডাটা) পাবলিক রিটার্ন (ঠিকানা) {
    ঠিকানা প্রক্সি = ডিপ্লোয়িমিনিমাল (বাস্তবায়ন চুক্তি, _ডাটা);
    রিটার্ন প্রক্সি;
  }
}

কারখানার চুক্তির জন্য, আমরা ওপেনজেপেলিনের প্রক্সিফ্যাক্টরি চুক্তির উত্তরাধিকারী। প্রক্সিফ্যাক্টরির আপনি একটি প্রক্সি মোতায়েন করতে পারেন এর বেশ কয়েকটি উপায় রয়েছে: deployMinimal, স্থাপনা এবং স্থাপনিচাইনিত। মোতায়েনের মধ্যে একটি লবণ থাকে এবং মোতায়েনের একটি স্বাক্ষর অন্তর্ভুক্ত থাকে। আমরা ডিপ্লোয়িমিনিমাল ফাংশনটি ব্যবহার করছি যা কার্যকরভাবে কার্যকরকরণ চুক্তির একটি ক্লোন তৈরি করে যা আমরা পূর্বে স্থাপন করেছি।

আমরা কনস্ট্রাক্টর ফাংশনে বাস্তবায়ন চুক্তির ঠিকানা সেট করি। তারপরে আমরা ক্রিয়েটিহিং ফাংশন যুক্ত করব যা ডিপ্লোইনিমিনিমাল ফাংশনটি কল করে এবং প্রয়োগের ঠিকানায় পাস করে এবং ফাংশন ডেটা বাইটে সূচনা করে। যখন কোনও ব্যবহারকারী কোনও প্রক্সি / ক্লোন তৈরি করতে চান, তখন এই ফাংশনটি আর্গুমেন্টগুলি কল করা হবে যা প্রয়োগ কোডের সূচনা ফাংশনে প্রেরণ করা হয়। আসুন এটি পরীক্ষা করে দেখুন:

কনস্ট থিংফ্যাকচারি = আর্টিফ্যাক্টস.রেইকায়ার ('থিংফ্যাক্টরি.সোল');
কনস্ট থিং = আর্টিফিক্স.রেক্সায়ার ('থিং.সোল');
কনটকোড এনকোডক্যাল = প্রয়োজনীয় ('জোস-লিব / লিব / হেল্পার্স / এনকোডক্যাল') default
চুক্তি ('থিংফ্যাক্টরি', ফাংশন (অ্যাকাউন্ট))
  পূর্ববর্তী প্রতিটি (async ফাংশন () {
    বাস্তবায়ন = প্রতীক্ষা থিং.নিউ ();
    প্রক্সিফ্যাক্টরি = প্রত্যাশা থিংফ্যাকচারি.নেইউ (বাস্তবায়ন.অ্যাড্রেস);
  });
  এটি ('এটি যুক্তিযুক্তি ফিরে আসা উচিত', অ্যাসিঙ্ক ফাংশন () {
   কনস্ট্রেস অ্যাড্রেস = অপেক্ষা করুন প্রক্সিফ্যাক্টরি.আইপিমেন্টেশনকন্ট্র্যাক্ট ক্যাল ();
   assert.equal (ঠিকানা, বাস্তবায়ন। ঠিকানা);
  });
  এটি ('এটি তৈরি করা উচিত', অ্যাসিঙ্ক ফাংশন () {
    ইনিশিয়ালডাটা = এনকোডক্যাল ('ইনিশিয়ালাইজ', ['স্ট্রিং', 'অ্যাড্রেস'], ['কসনিয়া', অ্যাকাউন্টস [2]]);
    কনস্ট্রাক্ট ট্রানজেকশন রিসিপট = অপেক্ষা     
    প্রক্সিফ্যাক্টরি। ক্রিয়েটহিং (আর্টিমাইজডডাটা, {থেকে: অ্যাকাউন্টস [2];);
    প্রক্সিএড্রেস = লেনদেন রিসিপট.লগস [0] .args.proxy;
    const impl = প্রতীক্ষা থিং.ট (প্রক্সিএড্রেস);
    কনস্ট নাম = অপেক্ষা করুন impl.name.call ();
    কনট মালিক = অপেক্ষা করুন impl.owner ();
    assert.equal (নাম, 'Kseniya');
    assert.equal (মালিক, অ্যাকাউন্টসমূহ [2]);
  });
});

চুক্তি কারখানাগুলি কেন কার্যকর

চুক্তি কারখানাগুলি অত্যন্ত কার্যকর কারণ তারা "ব্যবহারের ক্ষেত্রে সমর্থন করে যেখানে ন্যূনতম পার্শ্ব প্রতিক্রিয়া (যেমন মেমরি স্লট স্টমপিং) এবং ডুপ্লিকেট প্রক্সিগুলির স্বল্প গ্যাস ব্যয় মোতায়েন সহ সঠিক চুক্তি কার্যকারিতা ক্লোন করা বাঞ্চনীয়” " [1] এটি বিতরণ করা ব্যবস্থাগুলিতে অত্যন্ত শক্তিশালী যেখানে আপনি শেষ ব্যবহারকারীকে নিজের চুক্তির স্টোরেজ এবং রাজ্যের উপরে সম্পূর্ণ নিয়ন্ত্রণ বজায় রেখে একটি বাস্তবায়ন চুক্তির কার্যকারিতা অ্যাক্সেস করতে চান।

চুক্তি কারখানাগুলি কীভাবে কাজ করে

আপনার স্ট্যান্ডার্ড চুক্তি কারখানার আর্কিটেকচারটি এর মতো দেখাচ্ছে:

কারখানার চুক্তি নিজেই অভিন্ন প্রক্সি চুক্তির ক্লোন তৈরি করতে ব্যবহৃত হয় যা বাস্তবায়ন চুক্তিতে এবং যুক্তিতে থাকা লেনদেনকে এগিয়ে দেয়। কারখানাটি প্রায়শই বাস্তবায়ন চুক্তির ঠিকানা আপডেট করতে ব্যবহার করা যেতে পারে যাতে নতুন প্রক্সি চুক্তিতে নতুন, আপগ্রেড কার্যকারিতা থাকে। তদতিরিক্ত, আপনি কারখানার নিয়ন্ত্রণগুলি কাস্টমাইজ করতে পারেন এবং প্রশাসনিক সুবিধাদি যেমন বাস্তবায়ন চুক্তি আপডেট করা ইত্যাদি add

ব্যবহারের ক্ষেত্রে

  • ইএনটিপ, ETH এবং ERC20 টোকেনগুলির মধ্যে স্বয়ংক্রিয় ডিজিটাল সম্পদ আদান-প্রদানের সুবিধার্থে ডিজাইন করা ইথেরিয়াম-ভিত্তিক প্রোটোকল, কোনও ইআরসি 20 টোকেনের বিনিময় চুক্তি তৈরি করতে একটি কারখানার চুক্তি ব্যবহার করে যা ইতিমধ্যে নেই। এটি ERC20 টোকেনগুলির একটি রেজিস্ট্রি হিসাবেও কাজ করে যা সিস্টেমে যুক্ত করা হয়েছে এবং যার সাথে তারা যুক্ত রয়েছে সেই বিনিময়।
  • অথেরিয়ামের মতো কম ঘর্ষণ ওয়ালেট সমাধান। অথেরিয়াম ব্যবহারকারীর ওয়ালেট (বা প্রক্সি) তৈরি করতে একটি ফ্যাক্টরি ব্যবহার করে যা শেষ ব্যবহারকারীরা নিজেরাই মালিকানাধীন এবং যেকোন মোবাইল বা নেটিভ অ্যাপ্লিকেশনটিতে তাদের প্রিয় ড্যাপগুলি অ্যাক্সেস করতে ব্যবহার করে।
  • শেষ ব্যবহারকারীদের তাদের সম্পত্তি প্রাপ্তি ও সঞ্চয় করতে মাল্টিসিগ ওয়ালেট ক্লোন স্থাপন করছে
  • গভর্নমেন্ট চুক্তিগুলি বিভিন্ন সত্তা ও সংস্থার ক্লোনগুলিকে স্থাপন করা
  • নিবন্ধকরণ চুক্তির ক্লোনগুলি স্থাপন করা যা চুক্তির ঠিকানাগুলি সেট এবং পুনরুদ্ধারে ব্যবহার করা যেতে পারে
  • জুয়ার পুলগুলি স্থাপন করা এবং পরিচালনা করা (যেমন, এনসিএএ টুর্নামেন্ট, ফিফা বিশ্বকাপ ইত্যাদি)।

takeaways

চুক্তি কারখানাগুলি শেষ ব্যবহারকারীদের ক্ষমতায়ন এবং তাদের নিজস্ব প্রক্সিগুলির সঞ্চয়স্থান এবং রাজ্যের মালিকানা এবং নিয়ন্ত্রণ সরবরাহ করতে ব্যবহৃত হতে পারে। আপগ্রেডযোগ্য প্রক্সি চুক্তি উত্পন্ন করার ক্ষেত্রে চুক্তি কারখানাগুলিও খুব কার্যকর। শেষ অবধি, প্রক্সি প্যাটার্ন আর্কিটেকচারের সাথে একত্রে ব্যবহৃত ঠিকাদার কারখানাগুলি বেশ সাধারণ। তাই আমরা বিকাশকারীদের EIP 1167 স্ট্যান্ডার্ড এবং ওপেনজেপেলিনের প্রক্সিফ্যাক্টরি বেস চুক্তিটি ব্যবহার করতে উত্সাহিত করি।

সম্পদ

[1] EIP 1167: ন্যূনতম প্রক্সি চুক্তি

[2] ন্যূনতম প্রক্সি চুক্তিতে গভীর ডুব দিন

[3] আপনার EIP1167 কেন ব্যবহার করা উচিত কারণ

স্মার্ট কন্ট্রাক্ট ডেভলপমেন্ট সম্পর্কে আরও জানতে আগ্রহী?