এখন নির্ভরতাগুলি ইনস্টল করা হয়েছে, আসুন আমরা এইমাত্র তৈরি করা প্রকল্প ডিরেক্টরি কাঠামোটি পরীক্ষা করি:
- চুক্তি ডিরেক্টরি: এখানেই সমস্ত স্মার্ট পরিচিতি বাস করে। আমাদের ইতিমধ্যেই একটি মাইগ্রেশন চুক্তি আছে যা ব্লকচেইনে আমাদের মাইগ্রেশন পরিচালনা করে।
- মাইগ্রেশন ডিরেক্টরি: এখানেই সমস্ত মাইগ্রেশন ফাইল থাকে। এই মাইগ্রেশনগুলি অন্যান্য ওয়েব ডেভেলপমেন্ট ফ্রেমওয়ার্কের মতো যা একটি ডাটাবেসের অবস্থা পরিবর্তন করতে মাইগ্রেশনের প্রয়োজন হয়। যখনই আমরা ব্লকচেইনে স্মার্ট কন্ট্রাক্ট স্থাপন করি, তখনই আমরা ব্লকচেইনের অবস্থা আপডেট করি, এবং তাই একটি মাইগ্রেশন প্রয়োজন।
- node_modules ডিরেক্টরি: এটি আমাদের সমস্ত নোড নির্ভরতার হোম যা আমরা এইমাত্র ইনস্টল করেছি।
- টেস্ট ডিরেক্টরি: এখানে আমরা আমাদের স্মার্ট চুক্তির জন্য আমাদের পরীক্ষা লিখব।
- truffle-config.js ফাইল: এটি আমাদের ট্রাফল প্রকল্পের প্রধান কনফিগারেশন ফাইল, যেখানে আমরা নেটওয়ার্ক কনফিগারেশনের মতো জিনিসগুলি পরিচালনা করব।
এখন আসুন স্মার্ট চুক্তির বিকাশ শুরু করি যা আমাদের করণীয় তালিকা পরিচালনা করবে। আমরা এই মত চুক্তি ডিরেক্টরিতে একটি নতুন ফাইল তৈরি করে এটি করতে পারি:
$ touch ./contracts/TodoList.sol
এখানে, আসুন আমাদের করণীয় তালিকার স্মার্ট চুক্তি বিকাশ করি। প্রথমে, আমরা এই মত সংস্করণ নির্দিষ্ট করে শুরু করব:
pragma solidity ^0.5.0;
এখন আমরা এইভাবে স্মার্ট চুক্তি ঘোষণা করতে পারি:
pragma solidity ^0.5.0;
contract TodoList {
// Code goes here...
}
আমরা টোডোলিস্ট নামে একটি স্মার্ট চুক্তি তৈরি করি যার পরে কোঁকড়া ধনুর্বন্ধনী। আমরা তাদের ভিতরে স্মার্ট চুক্তির জন্য সমস্ত কোড যোগ করব। আমরা যা করব তা হ'ল করণীয় তালিকার মধ্যে কাজের সংখ্যার উপর নজর রাখা। এটি আমাদের কিছু সহজ কোড লিখতে অনুমতি দেবে যা আমাদের নিশ্চিত করতে সাহায্য করবে যে প্রকল্পটি সঠিকভাবে সেট আপ করা হয়েছে এবং আমাদের কোড ব্লকচেইনে কাজ করছে। এই ধরনের কাজের সংখ্যা ট্র্যাক করতে আমরা টাস্ককাউন্ট নামে একটি স্টেট ভেরিয়েবল তৈরি করব:
pragma solidity ^0.5.0;
contract TodoList {
uint taskCount;
}
এখানে taskCount হল একটি বিশেষ ধরনের ভেরিয়েবল যাকে "state variable" বলা হয়। এই স্টেট ভেরিয়েবলের মধ্যে আমরা যে কোনো ডেটা সঞ্চয় করি তা ব্লকচেইনের স্টোরেজের জন্য লেখা হয়। এটি স্মার্ট কন্ট্রাক্টের অবস্থা পরিবর্তন করে এবং স্থানীয় ভেরিয়েবলের বিপরীতে সমগ্র স্মার্ট কন্ট্রাক্টের মধ্যেই এর সুযোগ রয়েছে যা শুধুমাত্র ফাংশনের ভিতরেই সুযোগ রয়েছে। আমরা এই স্টেট ভেরিয়েবলের জন্য 0 এর একটি ডিফল্ট মান সেট করতে পারি:
pragma solidity ^0.5.0;
contract TodoList {
uint taskCount = 0;
}
এখন, আমরা চুক্তির বাইরে এই স্টেট ভেরিয়েবলের মান অ্যাক্সেস করার একটি উপায় তৈরি করতে পারি। আমরা পাবলিক ইন সলিডিটি নামক একটি বিশেষ মডিফায়ার কীওয়ার্ড দিয়ে এটি করতে পারি। যখন আমরা এটি করি, সলিডিটি জাদুভাবে একটি taskCount() ফাংশন তৈরি করবে যাতে আমরা স্মার্ট চুক্তির বাইরে এই ভেরিয়েবলের মান অ্যাক্সেস করতে পারি। এটি উপযোগী হবে যখন আমরা কনসোলে, ক্লায়েন্ট সাইড অ্যাপ্লিকেশন থেকে এবং পরীক্ষার ফাইলের ভিতরে স্মার্ট চুক্তির সাথে ইন্টারঅ্যাক্ট করি।
এখন স্মার্ট কন্ট্রাক্ট কম্পাইল করি এবং নিশ্চিত করি যে কোন ত্রুটি নেই:
$ truffle compile
হ্যাঁ! 🎉 আপনি এইমাত্র আপনার প্রথম Ethereum স্মার্ট চুক্তি লিখেছেন৷ আপনার লক্ষ্য করা উচিত যে আপনি যখনই নিম্নলিখিত পথে স্মার্ট চুক্তি কম্পাইল করেন তখনই একটি নতুন ফাইল তৈরি হয়েছিল: `./build/contracts/TodoList.json`। এই ফাইলটি হল স্মার্ট কন্ট্রাক্ট ABI ফাইল, যার অর্থ হল "বিমূর্ত বাইনারি ইন্টারফেস"। এই ফাইলটির অনেক দায়িত্ব রয়েছে, তবে দুটি আমি এখানে হাইলাইট করব:
- এতে সলিডিটি স্মার্ট কন্ট্রাক্ট কোডের সংকলিত বাইটকোড সংস্করণ রয়েছে যা একটি ইথেরিয়াম ভার্চুয়াল মেশিন (ইভিএম), অর্থাৎ একটি ইথেরিয়াম নোডে চালানো যেতে পারে।
- এটিতে স্মার্ট কন্ট্রাক্ট ফাংশনগুলির একটি JSON উপস্থাপনা রয়েছে যা ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলির মতো বহিরাগত ক্লায়েন্টদের কাছে প্রকাশ করা যেতে পারে।
আমাদের পরবর্তী লক্ষ্য ট্রাফল কনসোলের ভিতরে স্মার্ট চুক্তি অ্যাক্সেস করা। যাইহোক, আমরা Truffle কনসোল চালাতে পারি না কারণ আমাদের অ্যাপ্লিকেশনটি এখনও নির্ভরশীল বিভাগে সেট আপ করা Ganache ব্যক্তিগত ব্লকচেইন নেটওয়ার্কের সাথে সংযুক্ত নয়। Truffle কনসোলের ভিতরে ব্যক্তিগত ব্লকচেইন নেটওয়ার্কে স্মার্ট চুক্তির সাথে কথা বলতে, আমাদের কিছু জিনিস করতে হবে:
- আমরা যে ব্যক্তিগত ব্লকচেইন নেটওয়ার্কে সংযোগ করতে চাই তা নির্দিষ্ট করতে আমাদের প্রকল্পের কনফিগারেশন ফাইল আপডেট করুন (Ganache)।
- একটি মাইগ্রেশন স্ক্রিপ্ট তৈরি করুন যা ট্রাফলকে বলে যে কীভাবে ব্যক্তিগত ব্লকচেইন নেটওয়ার্কে স্মার্ট চুক্তি স্থাপন করতে হয়।
- ব্যক্তিগত ব্লকচেইন নেটওয়ার্কে স্মার্ট চুক্তি স্থাপন করে নতুন তৈরি মাইগ্রেশন স্ক্রিপ্ট চালান।
প্রথমে, আমরা প্রথম বিভাগে যে ব্যক্তিগত ব্লকচেইন নেটওয়ার্ক সেট আপ করতে চাই তা নির্দিষ্ট করতে আমরা প্রকল্প কনফিগারেশন ফাইলটি আপডেট করব। truffle-config.js ফাইলটি খুঁজুন এবং নিম্নলিখিত কোড পেস্ট করুন:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 7545,
network_id: "*" // Match any network id
}
},
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
}
দ্রষ্টব্য: এগুলি Ganache ব্যক্তিগত ব্লকচেইন নেটওয়ার্ক দ্বারা প্রদত্ত ডিফল্ট সেটিংসের সাথে মেলে। আপনি যদি Ganache সেটিংস পৃষ্ঠার ভিতরে কোনো সেটিংস পরিবর্তন করেন, যেমন পোর্ট, সেগুলি এখানে প্রতিফলিত হওয়া উচিত।
এরপর, আমরা ব্যক্তিগত ব্লকচেইন নেটওয়ার্কে স্মার্ট চুক্তি স্থাপন করতে মাইগ্রেশন ডিরেক্টরির ভিতরে একটি মাইগ্রেশন স্ক্রিপ্ট তৈরি করব। আপনার প্রজেক্ট রুট থেকে, কমান্ড লাইন থেকে এইভাবে একটি নতুন ফাইল তৈরি করুন:
$ touch migrations/2_deploy_contracts.js
আমাকে এই ফাইলটি কি ব্যাখ্যা করা যাক. যে কোনো সময় আমরা একটি নতুন স্মার্ট চুক্তি তৈরি করি, আমরা ব্লকচেইনের অবস্থা আপডেট করছি। মনে রাখবেন, আমি বলেছিলাম যে একটি ব্লকচেইন মৌলিকভাবে একটি ডাটাবেস। তাই, যখনই আমরা এটিকে স্থায়ীভাবে পরিবর্তন করি, আমাদের অবশ্যই এটিকে এক রাজ্য থেকে অন্য রাজ্যে স্থানান্তর করতে হবে। এটি একটি ডাটাবেস মাইগ্রেশনের অনুরূপ যা আপনি অন্যান্য ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্ট ফ্রেমওয়ার্কগুলিতে সম্পাদন করতে পারেন।
লক্ষ্য করুন যে আমরা মাইগ্রেশন ডিরেক্টরির ভিতরে আমাদের সমস্ত ফাইলকে সংখ্যা সহ সংখ্যা করি যাতে ট্রাফল জানতে পারে কোন অর্ডারে সেগুলি চালাতে হবে৷ এই নতুন তৈরি মাইগ্রেশন ফাইলের ভিতরে, আপনি স্মার্ট চুক্তিটি স্থাপন করতে এই কোডটি ব্যবহার করতে পারেন:
var TodoList = artifacts.require("./TodoList.sol");
module.exports = function(deployer) {
deployer.deploy(TodoList);
};
প্রথমত, আমাদের তৈরি করা চুক্তির প্রয়োজন, এবং এটিকে "TodoList" নামক একটি ভেরিয়েবলে বরাদ্দ করি। এর পরে, আমরা যখন মাইগ্রেশন চালাই তখন এটি স্থাপন করা হয় তা নিশ্চিত করতে আমরা এটিকে স্থাপন করা চুক্তির ম্যানিফেস্টে যোগ করি। এখন কমান্ড লাইন থেকে এই মাইগ্রেশন স্ক্রিপ্টটি এভাবে রান করা যাক:
$ truffle migrate
এখন যেহেতু আমরা সফলভাবে স্মার্ট চুক্তিটি ব্যক্তিগত ব্লকচেইন নেটওয়ার্কে স্থানান্তরিত করেছি, আসুন স্মার্ট চুক্তির সাথে যোগাযোগ করতে কনসোলটি খুলি। আপনি এইভাবে কমান্ড লাইন থেকে truffle কনসোল খুলতে পারেন:
$ truffle console
এখন যেহেতু আমরা কনসোলের ভিতরে আছি, আসুন আমাদের স্থাপন করা স্মার্ট চুক্তির একটি উদাহরণ পান এবং দেখুন আমরা চুক্তি থেকে টাস্ককাউন্ট পড়তে পারি কিনা। কনসোল থেকে, এই কোডটি চালান:
todoList = await TodoList.deployed()
এখানে
TodoList হল ভেরিয়েবলের নাম যা আমরা মাইগ্রেশন ফাইলে তৈরি করেছি। আমরা
deployed() ফাংশনের সাথে চুক্তির একটি নিয়োজিত উদাহরণ পুনরুদ্ধার করেছি এবং এটি একটি
todoList এ বরাদ্দ করেছি। এছাড়াও,
await কীওয়ার্ডের ব্যবহার নোট করুন। আমাদের অবশ্যই একটি অ্যাসিঙ্ক্রোনাস ফ্যাশনে ব্লকচেইনের সাথে যোগাযোগ করতে হবে। সুতরাং, ব্লকচেইন স্মার্ট কন্ট্রাক্টের সাথে ক্লায়েন্ট-সাইড ইন্টারঅ্যাকশনের জন্য জাভাস্ক্রিপ্ট একটি চমৎকার পছন্দ। জাভাস্ক্রিপ্টে অ্যাসিঙ্ক্রোনাস অ্যাকশন পরিচালনা করার জন্য বেশ কিছু কৌশল রয়েছে। সবচেয়ে জনপ্রিয় উপায়গুলির মধ্যে একটি হল
async/await প্যাটার্ন যা আমি এখানে বেছে নিয়েছি। Truffle সম্প্রতি Truffle কনসোলের ভিতরে এটির জন্য সমর্থন প্রকাশ করেছে। আপনি
এখানে async/ওয়েট প্যাটার্ন সম্পর্কে আরও পড়তে পারেন।
প্রথমত, আমরা স্মার্ট চুক্তির ঠিকানা পেতে পারি যেটি ব্লকচেইনে স্থাপন করা হয়েছিল এইভাবে:
todoList.address
// => '0xABC123...'
এখন আমরা স্টোরেজ থেকে টাস্ককাউন্টের মান এভাবে পড়তে পারি:
takCount = await app.taskCount()
// => 0
হ্যাঁ! 🎉 আপনি সফলভাবে এই টিউটোরেলের প্রথম বিভাগটি সম্পূর্ণ করেছেন। আপনি নিম্নলিখিত সব করেছেন:
- ব্লকচেইন উন্নয়নের জন্য আপনার মেশিন সেট আপ করুন
- একটি নতুন ট্রাফল প্রকল্প তৈরি করা হয়েছে
- আপনার প্রথম স্মার্ট চুক্তি তৈরি
- একটি লাইভ ব্লকচেইনে আপনার সদ্য তৈরি স্মার্ট চুক্তির সাথে ইন্টারঅ্যাক্ট করেছে
আপনি যদি কোনও ধাপে আটকে থাকেন তবে
গিথুব থেকে এই বিভাগের জন্য প্রকল্প কোডটি নির্দ্বিধায় ক্লোন করুন। আপনি এখানে শুরু হওয়া এই বিভাগের ভিডিও টিউটোরিয়ালটিও উল্লেখ করতে পারেন।
তালিকা টাস্ক
টিউটোরিয়ালের এই অংশের জন্য সহগামী ভিডিও ফুটেজ 22:47 এ শুরু হয়।
এখন করণীয় তালিকায় কাজগুলি তালিকাভুক্ত করা শুরু করা যাক। এই বিভাগে আমরা যে সমস্ত ধাপগুলি সম্পূর্ণ করব তা এখানে রয়েছে:
- স্মার্ট চুক্তিতে কাজ তালিকাভুক্ত করতে কোড লিখুন
- Truffle কনসোলের ভিতরে স্মার্ট চুক্তি থেকে কাজগুলি তালিকাভুক্ত করুন
- ক্লায়েন্ট সাইড অ্যাপ্লিকেশনে কাজের তালিকা করুন
- তালিকাভুক্ত কাজের জন্য একটি পরীক্ষা লিখুন
স্মার্ট চুক্তির অভ্যন্তরে কাজগুলি তালিকাভুক্ত করার জন্য, আমাদের দৃঢ়তার সাথে একটি টাস্ক মডেল করার একটি উপায় প্রয়োজন। সলিডিটি আপনাকে স্ট্রাকট দিয়ে আপনার নিজস্ব ডেটা টাইপ সংজ্ঞায়িত করতে দেয়। আমরা এই শক্তিশালী বৈশিষ্ট্যের সাথে যেকোন নির্বিচারে ডেটা মডেল করতে পারি। আমরা আমাদের করণীয় তালিকার জন্য টাস্ক মডেল করার জন্য একটি
স্ট্রাকট ব্যবহার করব:
pragma solidity ^0.5.0;
contract TodoList {
uint public taskCount = 0;
struct Task {
uint id;
string content;
bool completed;
}
}
প্রথমে আমরা নতুন struct টাস্কের নাম অনুসরণ করে struct কীওয়ার্ড দিয়ে টাস্কটিকে মডেল করি। দ্রষ্টব্য, এটি একটি টাস্কের একটি উদাহরণকে প্রতিনিধিত্ব করে না, তবে কেবলমাত্র একটি Taskকাঠামোর সংজ্ঞা। কোঁকড়া ধনুর্বন্ধনীতে থাকা লাইনগুলিTask কাঠামোর বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করে:
- uint id - এটি struct-এর অনন্য শনাক্তকারী। এটির একটি id থাকবে, যেমন একটি ঐতিহ্যগত ডাটাবেস রেকর্ড। দ্রষ্টব্য, আমরা এই শনাক্তকারীর জন্য ডেটা টাইপকে একটি uint হিসাবে ঘোষণা করি, যা "আনসাইনড ইন্টিজার" এর জন্য দাঁড়ায়। এর সহজ অর্থ হল এটি একটি অ-নেতিবাচক পূর্ণসংখ্যা। এটির কোন "চিহ্ন" নেই, যেমন a - বা + চিহ্ন, এটির সামনে, বোঝায় যে এটি সর্বদা ইতিবাচক।
- string content - এটি একটি স্ট্রিং এর মধ্যে থাকা করণীয় তালিকার টাস্কের পাঠ্য।
- bool completed - এটি করণীয় তালিকার চেকবক্সের অবস্থা, যা true/false। যদি এটি true হয়, টাস্কটি "সম্পূর্ণ" হবে বা করণীয় তালিকা থেকে চেক বন্ধ করা হবে।
এখন যেহেতু আমরা একটি টাস্ক মডেল করেছি, আমাদের করণীয় তালিকায় সমস্ত কাজ রাখার জন্য একটি জায়গা দরকার! আমরা সেগুলিকে ব্লকচেইনে স্টোরেজে রাখতে চাই যাতে স্মার্ট চুক্তির অবস্থা স্থায়ী হয়। আমরা একটি স্টেট ভেরিয়েবলের সাহায্যে ব্লকচেইনের স্টোরেজ অ্যাক্সেস করতে পারি, ঠিক যেমন আমরা taskCount সাথে করেছি। আমরা একটি task স্টেট ভেরিয়েবল তৈরি করব। এটি একটি বিশেষ ধরনের সলিডিটি ডেটা স্ট্রাকচার ব্যবহার করবে যাকে ম্যাপিং বলা হয়:
pragma solidity ^0.5.0;
contract TodoList {
uint public taskCount = 0;
struct Task {
uint id;
string content;
bool completed;
}
mapping(uint => Task) public tasks;
}
সলিডিটিতে ম্যাপিং অনেকটা অ্যাসোসিয়েটিভ অ্যারে বা অন্যান্য প্রোগ্রামিং ভাষায় হ্যাশের মতো। এটি কী-মানের জোড়া তৈরি করে যা ব্লকচেইনে সংরক্ষণ করা হয়। আমরা কী হিসাবে একটি অনন্য আইডি ব্যবহার করব। মান টাস্ক এটা নিজেই হবে. এটি আমাদের id দ্বারা যেকোনো কাজ সন্ধান করার অনুমতি দেবে!
এখন কাজ তৈরি করার জন্য একটি ফাংশন তৈরি করা যাক। এটি আমাদেরকে ডিফল্টরূপে টোডো তালিকায় নতুন কাজ যোগ করার অনুমতি দেবে যাতে আমরা সেগুলিকে কনসোলে তালিকাভুক্ত করতে পারি।
pragma solidity ^0.5.0;
contract TodoList {
uint public taskCount = 0;
struct Task {
uint id;
string content;
bool completed;
}
mapping(uint => Task) public tasks;
function createTask(string memory _content) public {
taskCount ++;
tasks[taskCount] = Task(taskCount, _content, false);
}
}
আমি এই ফাংশন ব্যাখ্যা করব:
- প্রথমে, আমরা function কীওয়ার্ড দিয়ে ফাংশন তৈরি করি এবং এটিকে CreateTask() নাম দিই।
- আমরা ফাংশনটিকে _content নামক একটি আর্গুমেন্ট গ্রহণ করার অনুমতি দিই, যা টাস্কের জন্য পাঠ্য হবে। আমরা উল্লেখ করি যে এই আর্গুমেন্ট হবে stringডেটা টাইপের, এবং এটিmemory থাকবে
- আমরা ফাংশনটির দৃশ্যমানতা public জন্য সেট করেছি যাতে এটিকে স্মার্ট চুক্তির বাইরে যেমন কনসোলের মতো বা ক্লায়েন্টের দিক থেকে বলা যেতে পারে
- ফাংশনের ভিতরে, আমরা নতুন Task জন্য একটি id তৈরি করি। আমরা কেবল বিদ্যমান টাস্ককাউন্ট গ্রহণ করি এবং এটি 1 দ্বারা বৃদ্ধি করি।
- এখন আমরা Task(taskCount, _content, false) কল করে একটি নতুন টাস্ক স্ট্রাকট তৈরি করি; এবং নতুন কাজের জন্য মান পাস করা.
- এর পরে, আমরা ব্লকচেইনে নতুন টাস্কটিকে এইভাবে Tasks ম্যাপিংয়ে যুক্ত করে সংরক্ষণ করি: task[taskCount] = ....
যখনই ব্লকচেইনে স্মার্ট কন্ট্রাক্ট স্থাপন করা হয় তখন আমরা টোডো তালিকায় একটি টাস্ক যোগ করতে চাই যাতে এটির একটি ডিফল্ট টাস্ক থাকে যা আমরা কনসোলে পরিদর্শন করতে পারি। আমরা এইভাবে স্মার্ট কন্ট্রাক্টের কনস্ট্রাক্টর ফাংশনের ভিতরে createTask() ফাংশনকে কল করে এটি করতে পারি:
contract TodoList {
// ....
constructor() public {
createTask("Check out dappuniversity.com");
}
// ....
}
আমরা কনস্ট্রাক্টর কীওয়ার্ড দিয়ে constructorফাংশন তৈরি করি যেমন আপনি উপরে দেখতে পাচ্ছেন। এই ফাংশনটি শুধুমাত্র একবার চালিত হবে, যখনই চুক্তিটি শুরু হবে, অর্থাৎ ব্লকচেইনে স্থাপন করা হবে। এই ফাংশনের ভিতরে, আমরা স্ট্রিং কন্টেন্ট "চেক আউট https://dappuniversitybd.blogspot.com/ সহ একটি নতুন ডিফল্ট টাস্ক তৈরি করেছি।
এখন ব্লকচেইনে এই স্মার্ট চুক্তিটি স্থাপন করা যাক। এটি করার জন্য, আমাদের অবশ্যই আমাদের কোডের একটি নতুন অনুলিপি স্থাপন করতে হবে। মনে রাখবেন, স্মার্ট চুক্তি কোড অপরিবর্তনীয়! এটা পরিবর্তন করা যাবে না. অতএব, আমরা যে কোনো সময় কোড পরিবর্তন করার সময় একটি নতুন স্মার্ট চুক্তি তৈরি করতে হবে। সৌভাগ্যবশত ট্রাফল এটিতে সহায়তা করার জন্য একটি শর্টকাট প্রদান করে। আমরা এইভাবে মাইগ্রেশন পুনরায় চালাতে পারি:
$ truffle migrate --reset
ভায়োলা ! এখন আমাদের ব্লকচেইনে স্মার্ট চুক্তির একটি নতুন কপি আছে। এখন কনসোলে কাজগুলো তালিকা করা যাক।
$ truffle console
কনসোলের ভিতরে, আসুন নতুন স্মার্ট চুক্তির একটি স্থাপন করা অনুলিপি পান।
todoList = await TodoList.deployed()
এখন আমরা tasks() ফাংশন কল করে টোডো তালিকা থেকে tasks পেতে পারি। এটি আমাদের id দ্বারা টাস্ক ম্যাপিং থেকে মান অ্যাক্সেস করার অনুমতি দেবে। যখন আমরা এই ফাংশনটি কল করব তখন আমরা তালিকার প্রথম টাস্কের id পাস করব:
task = await todoList.tasks(1)
হ্যাঁ! 🎉 কিভাবে আপনি কনসোলে এই টাস্কের মান পরিদর্শন করতে পারেন। 😃
এখন যেহেতু আমরা এই স্মার্ট চুক্তিটি ব্লকচেইনে স্থানান্তরিত করেছি, আসুন টোডো তালিকার স্মার্ট চুক্তির সাথে ইন্টারঅ্যাক্ট করার জন্য ক্লায়েন্ট সাইড কোড তৈরি করি। আপনার প্রকল্পের জন্য আপনাকে নিম্নলিখিত ফাইলগুলি তৈরি করতে হবে:
- bs-config.json
- src/index.html
- src/app.js
আমরা এই সমস্ত ফাইলের জন্য এক এক করে কোড পূরণ করব। আমরা ক্লায়েন্ট পক্ষের জন্য সমস্ত প্রকল্প ফাইল পরিবেশন করতে
lite-server ব্যবহার করছি। এই সমস্ত ফাইল কোথায় অবস্থিত তা আমাদের লাইট সার্ভারকে বলতে হবে। আমরা
bs-config.json ফাইলের ভিতরে লাইট-সার্ভারের জন্য ব্রাউজারসিঙ্ক কনফিগারেশন আপডেট করে এটি করতে পারি। আপনার প্রকল্প ফাইলে এই কনফিগারেশন আটকান:
{
"server": {
"baseDir": [
"./src",
"./build/contracts"
],
"routes": {
"/vendor": "./node_modules"
}
}
}
এই কনফিগারেশনটি লাইট-সার্ভারকে
src-এর সমস্ত ফাইল প্রকাশ করতে বলে এবং আমাদের ওয়েব সার্ভারের রুটে ডিরেক্টরি
build/contracts করে। এটি বিক্রেতা রুটে উপস্থিত হওয়ার জন্য
node_modules ডিরেক্টরিতে যেকোনো ফাইলের জন্য একটি উপনাম যোগ করে। এটি আমাদেরকে
vendor সাথে ক্লায়েন্ট সাইডে
bootstrap মতো যেকোন প্রজেক্ট নির্ভরতা টেনে আনতে দেয়, যা আমরা মুহূর্তের মধ্যে দেখতে পাব।
এখন আমাদের করণীয় তালিকার জন্য HTML কোড পূরণ করা যাক। এই টিউটোরিয়ালটি মূলত ব্লকচেইন প্রযুক্তির উপর ফোকাস করে, তাই আমি HTML এবং CSS অংশে খুব বেশি সময় ব্যয় করতে চাই না। আমি এখানে শুধু HTML কোড পেস্ট করব:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<title>Dapp University | Todo List</title>
<!-- Bootstrap -->
<link href="vendor/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<style>
main {
margin-top: 60px;
}
#content {
display: none;
}
form {
width: 350px;
margin-bottom: 10px;
}
ul {
margin-bottom: 0px;
}
#completedTaskList .content {
color: grey;
text-decoration: line-through;
}
</style>
</head>
<body>
<nav class="navbar navbar-dark fixed-top bg-dark flex-md-nowrap p-0 shadow">
<a class="navbar-brand col-sm-3 col-md-2 mr-0" href="http://www.dappuniversity.com/free-download" target="_blank">Dapp University | Todo List</a>
<ul class="navbar-nav px-3">
<li class="nav-item text-nowrap d-none d-sm-none d-sm-block">
<small><a class="nav-link" href="#"><span id="account"></span></a></small>
</li>
</ul>
</nav>
<div class="container-fluid">
<div class="row">
<main role="main" class="col-lg-12 d-flex justify-content-center">
<div id="loader" class="text-center">
<p class="text-center">Loading...</p>
</div>
<div id="content">
<!-- <form onSubmit="App.createTask(); return false;">
<input id="newTask" type="text" class="form-control" placeholder="Add task..." required>
<input type="submit" hidden="">
</form> -->
<ul id="taskList" class="list-unstyled">
<div class="taskTemplate" class="checkbox" style="display: none">
<label>
<input type="checkbox" />
<span class="content">Task content goes here...</span>
</label>
</div>
</ul>
<ul id="completedTaskList" class="list-unstyled">
</ul>
</div>
</main>
</div>
</div>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="vendor/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="vendor/truffle-contract/dist/truffle-contract.js"></script>
<script src="app.js"></script>
</body>
</html>
এই ফাইলটি আমাদের প্রজেক্টের জন্য প্রয়োজনীয় সমস্ত এইচটিএমএল স্ক্যাফোল্ড করে। আমি ফর্ম কোডটি মন্তব্য করেছি যা আমরা পরবর্তী বিভাগে সক্ষম করব। ফাইলটি বুটস্ট্র্যাপ টেমপ্লেটিং ফ্রেমওয়ার্কের মতো প্রকল্পের জন্য সমস্ত নির্ভরতাকে টেনে নেয় যা আমাদেরকে খুব বেশি CSS না লিখেই সুন্দর-সুদর্শন UI উপাদান তৈরি করতে দেয়। এটি Truffle Conract লাইব্রেরিও ব্যবহার করে যা আমাদের জাভাস্ক্রিপ্টের সাথে টোডো তালিকার স্মার্ট চুক্তির সাথে ইন্টারঅ্যাক্ট করতে দেয়।
এখন এই বিভাগের জন্য JavaScript কোডটি পূরণ করা যাক। আমরা সদ্য নির্মিত app.js ফাইলে এইভাবে কোড যোগ করব:
App = {
loading: false,
contracts: {},
load: async () => {
await App.loadWeb3()
await App.loadAccount()
await App.loadContract()
await App.render()
},
// https://medium.com/metamask/https-medium-com-metamask-breaking-change-injecting-web3-7722797916a8
loadWeb3: async () => {
if (typeof web3 !== 'undefined') {
App.web3Provider = web3.currentProvider
web3 = new Web3(web3.currentProvider)
} else {
window.alert("Please connect to Metamask.")
}
// Modern dapp browsers...
if (window.ethereum) {
window.web3 = new Web3(ethereum)
try {
// Request account access if needed
await ethereum.enable()
// Acccounts now exposed
web3.eth.sendTransaction({/* ... */})
} catch (error) {
// User denied account access...
}
}
// Legacy dapp browsers...
else if (window.web3) {
App.web3Provider = web3.currentProvider
window.web3 = new Web3(web3.currentProvider)
// Acccounts always exposed
web3.eth.sendTransaction({/* ... */})
}
// Non-dapp browsers...
else {
console.log('Non-Ethereum browser detected. You should consider trying MetaMask!')
}
},
loadAccount: async () => {
// Set the current blockchain account
App.account = web3.eth.accounts[0]
},
loadContract: async () => {
// Create a JavaScript version of the smart contract
const todoList = await $.getJSON('TodoList.json')
App.contracts.TodoList = TruffleContract(todoList)
App.contracts.TodoList.setProvider(App.web3Provider)
// Hydrate the smart contract with values from the blockchain
App.todoList = await App.contracts.TodoList.deployed()
},
render: async () => {
// Prevent double render
if (App.loading) {
return
}
// Update app loading state
App.setLoading(true)
// Render Account
$('#account').html(App.account)
// Render Tasks
await App.renderTasks()
// Update loading state
App.setLoading(false)
},
renderTasks: async () => {
// Load the total task count from the blockchain
const taskCount = await App.todoList.taskCount()
const $taskTemplate = $('.taskTemplate')
// Render out each task with a new task template
for (var i = 1; i <= taskCount; i++) {
// Fetch the task data from the blockchain
const task = await App.todoList.tasks(i)
const taskId = task[0].toNumber()
const taskContent = task[1]
const taskCompleted = task[2]
// Create the html for the task
const $newTaskTemplate = $taskTemplate.clone()
$newTaskTemplate.find('.content').html(taskContent)
$newTaskTemplate.find('input')
.prop('name', taskId)
.prop('checked', taskCompleted)
// .on('click', App.toggleCompleted)
// Put the task in the correct list
if (taskCompleted) {
$('#completedTaskList').append($newTaskTemplate)
} else {
$('#taskList').append($newTaskTemplate)
}
// Show the task
$newTaskTemplate.show()
}
},
setLoading: (boolean) => {
App.loading = boolean
const loader = $('#loader')
const content = $('#content')
if (boolean) {
loader.show()
content.hide()
} else {
loader.hide()
content.show()
}
}
}
$(() => {
$(window).load(() => {
App.load()
})
})
আমাকে এই কোড ব্যাখ্যা করা যাক. আমরা একটি নতুন App অবজেক্ট তৈরি করেছি যাতে জাভাস্ক্রিপ্ট অ্যাপ চালানোর জন্য আমাদের প্রয়োজনীয় সমস্ত ফাংশন রয়েছে। আমি এখানে গুরুত্বপূর্ণ ফাংশন ব্যাখ্যা করব. সম্পূর্ণ ব্যাখ্যার জন্য, ভিডিওতে আমাকে
40:25 এ জাভাস্ক্রিপ্ট কোড ব্যাখ্যা করতে দেখুন। এছাড়াও নোট করুন যে আমি কোডের কয়েকটি লাইন মন্তব্য করেছি যা আমরা পরবর্তী বিভাগে সক্ষম করব।
- loadWeb3() web3.js হল একটি জাভাস্ক্রিপ্ট লাইব্রেরি যা আমাদের ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনকে ব্লকচেইনের সাথে কথা বলার অনুমতি দেয়। আমরা এখানে web3 কনফিগার করি। এটি মেটামাস্ক দ্বারা নির্দিষ্ট করা ডিফল্ট ওয়েব3 কনফিগারেশন। আপনি এখানে কি ঘটছে তা সম্পূর্ণরূপে বুঝতে না পারলে চিন্তা করবেন না। এটি একটি কপি-এবং-পেস্ট বাস্তবায়ন যা মেটামাস্ক পরামর্শ দেয়।
- loadContract() এখানেই আমরা ব্লকচেইন থেকে স্মার্ট কন্ট্রাক্ট ডেটা লোড করি। আমরা ট্রাফল কন্ট্রাক্ট লাইব্রেরির সাথে স্মার্ট চুক্তির একটি জাভাস্ক্রিপ্ট উপস্থাপনা তৈরি করি। তারপর আমরা web3 দিয়ে স্মার্ট কন্ট্রাক্ট ডেটা লোড করি। এটি আমাদের করণীয় তালিকায় কাজগুলি তালিকাভুক্ত করার অনুমতি দেবে।
- renderTasks() এখানেই আমরা আসলে করণীয় তালিকায় কাজগুলি তালিকাভুক্ত করি। লক্ষ্য করুন যে আমরা প্রতিটি কাজকে পৃথকভাবে অ্যাক্সেস করার জন্য একটি লুপ তৈরি করি। কারণ আমরা স্মার্ট চুক্তি থেকে সম্পূর্ণ টাস্ক ম্যাপিং আনতে পারি না। আমাদের প্রথমে টাস্ককাউন্ট নির্ধারণ করতে হবে এবং প্রতিটি কাজ একে একে আনতে হবে।
এখন ওয়েব সার্ভার শুরু করা যাক এবং প্রকল্পটি ব্রাউজারে লোড হবে তা নিশ্চিত করি।
$ npm run dev
হ্যাঁ! 🎉 আপনি সফলভাবে ক্লায়েন্ট সাইড অ্যাপ্লিকেশন লোড করেছেন। 😃 লক্ষ্য করুন যে আপনার অ্যাপ্লিকেশনটি বলছে "লোড হচ্ছে..."। কারণ আমরা এখনও ব্লকচেইনে লগ ইন করিনি! ব্লকচেইনের সাথে সংযোগ করার জন্য, আমাদের গণচে থেকে মেটামাস্কে একটি অ্যাকাউন্ট আমদানি করতে হবে। আপনি
43:55 এ ভিডিওতে আমাকে মেটামাস্ক সেট আপ করতে দেখতে পারেন।
একবার আপনি মেটামাস্কের সাথে সংযুক্ত হয়ে গেলে, আপনার সমস্ত চুক্তি এবং অ্যাকাউন্ট ডেটা লোড হওয়া উচিত।
💥 বুম! আপনার করণীয় তালিকা আছে! 😃
No comments:
Post a Comment