স্মার্ট কন্ট্রাক্ট অডিট করার জন্য বিগিনার্স গাইডে স্বাগতম! স্মার্ট কন্ট্রাক্ট অডিটিং দিয়ে শুরু করার অন্যতম সেরা উপায় হল ঝাঁপিয়ে পড়া এবং স্মার্ট চুক্তিতে কয়েকটি সাধারণ ধরনের দুর্বলতা দেখা।
আপনার যদি ইতিমধ্যে Ethereum এর সলিডিটি প্রোগ্রামিং ভাষা সম্পর্কে প্রাথমিক ধারণা থাকে তবে এটি সহায়ক হবে। আমরা নুব সলিডিটি প্রোগ্রামারদের লেখা কিছু কোড দেখব।
পুনঃপ্রবেশ আক্রমণ
বাস্তব-বিশ্বের দৃশ্যকল্প:
কল্পনা করুন আপনার কাছে 50টি চকলেট আছে। আপনার একটি দুষ্টু ছোট বোন আছে যাকে আপনি যেকোনো সময়ে আপনার কাছ থেকে মাত্র 2টি চকলেট নিতে দিয়েছেন। আপনি তাকে দিনে 10টির বেশি চকলেট দিতে চান না, ভয়ে তিনি দাঁত ক্ষয় পাবেন। এটি নিশ্চিত করার জন্য, প্রতি সন্ধ্যায় আপনি গণনা করেন কতগুলি চকলেট আপনার কাছে অবশিষ্ট আছে। আপনি কি মনে করেন এই কাজ হবে? অথবা আপনি আপনার ছোট বোন দ্বারা হ্যাক করা হবে?
দুর্ভাগ্যবশত, এটা কাজ করবে না! আপনার বোন বুঝতে পারে যে সন্ধ্যা না হওয়া পর্যন্ত আপনার কাছে কতগুলি চকলেট আছে তা আপনি জানেন না। তাই পরের দিন, আপনার ছোট বোন সন্ধ্যার আগে 6 বার আপনাকে দেখতে আসে এবং প্রতিবার 2টি চকলেট নেয়! এটাকেই আমরা Re-entrency Attack বলি।
প্রতিবার আপনার বোন আপনার কাছ থেকে 2টি চকলেট নেওয়ার সময় গণনা আপডেট করার পরিবর্তে এখানে আপনি সন্ধ্যায় আপনার কাছে থাকা চকলেটগুলির গণনা আপডেট করছেন। এটি স্মার্ট চুক্তির সাথেও ঘটে। স্মার্ট চুক্তি একটি নির্দিষ্ট ভারসাম্য অনুমান করে যখন আক্রমণকারী আসলে একাধিকবার চুক্তি থেকে কিছু পরিমাণ ক্রিপ্টো প্রত্যাহার করতে ব্যস্ত থাকে।
বাস্তব-বিশ্ব কোড উদাহরণ:
এই কোড নামক একটি স্মার্ট চুক্তির অন্তর্গত unbanked. msg.sender (অর্থাৎ এর কলকারী withdraw
ফাংশন ) প্রত্যাহার করতে বলা পরিমাণের চেয়ে বেশি বা সমান।
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount;
}
লক্ষ্য করুন যে ইথারের প্রয়োজনীয় পরিমাণ পাঠাতে একটি কল কীওয়ার্ড ব্যবহার করা হয়েছে msg.sender
. একজন আক্রমণকারী চোর নামক একটি চুক্তি তৈরি করে এটিকে কাজে লাগাতে পারে যেখানে সে একটি তে উইথড্র ফাংশনকে কল করে fallback()
ফাংশন ক fallback()
সলিডিটিতে ফাংশন হল একটি বিশেষ ফাংশন যা কার্যকর হয় যখন ইথারকে স্মার্ট চুক্তিতে পাঠানো হয়।
এর মানে হল যে একজন আক্রমণকারী সক্ষম recursively প্রত্যাহার ফাংশন কল. এইভাবে, স্মার্ট চুক্তি আপডেট করার আগে, এর ব্যালেন্স msg.sender
কোডের শেষ লাইনে, আক্রমণকারী ইতিমধ্যে একাধিকবার ইথার প্রত্যাহার করেছে। কল কীওয়ার্ড ব্যবহার করার আগে ব্যালেন্স আপডেট করা হলে এটি এড়ানো যেতে পারে, এভাবে একটি অনুসরণ করুন চেক-প্রভাব-মিথস্ক্রিয়া প্যাটার্ন।
প্রভাবঃ
সার্জারির প্রথমবারের মতো রিএন্ট্রান্সি অ্যাটাক 2016 সালে একটি DAO (বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা) এ ঘটেছে যার ফলে প্রায় $50 মিলিয়ন হ্যাক হয়েছে। এই হ্যাকটিকে বিপরীত করার জন্য, ইথেরিয়াম সম্প্রদায় ইথেরিয়াম ব্লকচেইনকে বিভক্ত করেছে যা ETC (Ethereum Classic) এবং ETH (Ethereum) এর জন্ম দিয়েছে।
পাটিগণিত ওভারফ্লো এবং আন্ডারফ্লো
বাস্তব-বিশ্বের দৃশ্যকল্প:
আসুন একটি চিন্তা খেলা খেলি. এটি একটি স্পিন-দ্য হুইল নিয়ে গঠিত, এবং বিজয়ী নির্ধারণ করা হয় চাকা ঘুরানোর সময় তিনি যে সর্বাধিক সংখ্যা পেতে পারেন তার ভিত্তিতে। চাকাটি 256 থেকে -256 পর্যন্ত চিহ্নিত করা হয়েছে।
খেলার নিয়ম হল যে সমস্ত খেলোয়াড়ের জন্য পয়েন্টার প্রতিটি স্পিন এর শুরুতে 0 এর উপর থাকে। এবং একজন খেলোয়াড়কে শুধুমাত্র ঋণাত্মক সংখ্যার দিকে ঘুরতে দেওয়া হয়। আপনি এই খেলা কিভাবে জিতবেন?
এই গেমটি প্রতিবার জেতার জন্য একটি ভাল কৌশল হ'ল চাকাটি এমন শক্তিতে ঘোরানো যে চাকাটি -256 পর্যন্ত ঘোরে এবং তারপরে একবারে 256 এ পরিণত হয়। এটি সম্ভব কারণ চাকার উপরে -256 এর ঠিক পরে 256 আসে। এটিকে আমরা একটি পাটিগণিত আন্ডারফ্লো বলি। এবং গাণিতিক ওভারফ্লো এই ঠিক বিপরীত হয়.
বাস্তব-বিশ্ব কোড উদাহরণ:
An underflow or overflow যখন একটি গাণিতিক অপারেশন সর্বনিম্ন বা সর্বোচ্চে পৌঁছায় তখন ঘটে।
function withdraw(uint _amount) public { require(balances[msg.sender] - _amount > 0); address payable to = payable(msg.sender); to.transfer(_amount); balances[msg.sender] -= _amount;
}
সার্জারির _amount
উইথড্র ফাংশনের প্যারামিটার একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা। ব্যালেন্স ম্যাপিংয়ের মান (যা পাইথনের অভিধানের মতো বা C++ বা জাভাতে একটি কী-মানের জোড়ার মতো)ও একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা।
mapping(address => uint256) public balances
প্রয়োজনীয় বিবৃতিটি এর ব্যালেন্স কিনা তা পরীক্ষা করে msg.sender
ইতিবাচক বা না। কিন্তু এই বিবৃতিটি সর্বদা সত্য হবে এমনকি যদি পরিমাণটি ব্যালেন্সের চেয়ে বেশি হয় msg.sender
. এই কারণ উভয় balances
এবং _amount
ভেরিয়েবল টাইপ অস্বাক্ষরিত পূর্ণসংখ্যা এবং তাদের গাণিতিক ফলাফল (আন্ডারফ্লো পরে) এছাড়াও একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা হবে!
এবং আপনি মনে করতে পারেন, একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা সবসময় ইতিবাচক হয়। এর মানে হল যে একজন আক্রমণকারী স্মার্ট চুক্তি থেকে সীমাহীন পরিমাণ ইথার প্রত্যাহার করতে সক্ষম! আপনি এই দুর্বলতার জন্য একটি বিস্তারিত উদাহরণ এবং বাস্তবায়ন কোড খুঁজে পেতে পারেন এখানে.
এখানে লক্ষণীয় আরেকটি গুরুত্বপূর্ণ বিষয় হল যে দুটি স্বাক্ষরবিহীন পূর্ণসংখ্যার মধ্যে গাণিতিক ক্রিয়াকলাপটিও একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা। এটি বিপজ্জনক হতে পারে যদি এটি স্মার্ট চুক্তিতে উপেক্ষা করা হয়, কারণ এর ফলে অবাঞ্ছিত নিরাপত্তা লঙ্ঘন হতে পারে!
function votes(uint postId, uint upvote, uint downvotes) { if (upvote - downvote < 0) { deletePost(postId) }
}
আপনি উপরের উদাহরণে লক্ষ্য করেছেন যে, if বিবৃতিটি বেশ অর্থহীন upvote - downvote
সবসময় ইতিবাচক হতে যাচ্ছে. আর পোস্ট হলেও ডিলিট হয়ে যাবে downvotes
চেয়ে বড় upvotes
. এই ধরনের আক্রমণ এড়াতে, এর চেয়ে বড় একটি সলিডিটি কম্পাইলার সংস্করণ ব্যবহার করার পরামর্শ দেওয়া হয় 0.8.0.
প্রভাবঃ
একটি মুদ্রা বলা হয় PoWH মুদ্রা 2017 সালে চালু করা হয়েছিল। যদিও এটি একটি Ponzi গেম ছিল, এটি নিজেই একটি গাণিতিক ওভারফ্লো বাগের কারণে হ্যাক হয়ে গিয়েছিল যার ফলে সেই সময়ে প্রায় 866 ETH বা $950,000 ক্ষতি হয়েছিল। আপনি এই সম্পর্কে বিস্তারিত পড়তে পারেন এখানে.
অবশ্যই পরুন: টিনিম্যানের আক্রমণ থেকে শিক্ষা, অ্যালগোরান্ডে সবচেয়ে বড় ডেক্স
পরিষেবা আক্রমণ অস্বীকার
বাস্তব-বিশ্বের দৃশ্যকল্প:
কল্পনা করুন আপনি একটি বিটকয়েন টেক ইউনিভার্সিটিতে আছেন। প্রত্যেকের জন্য একটি সাধারণ খাবার টেবিল ছাড়া সবকিছুই ঠিক আছে বলে মনে হচ্ছে। এবং দুর্ভাগ্যবশত, অন্য শ্রেণীর কিছু লোক আছে যারা সবসময় আপনার ক্লাসের কারও সামনে খাবার টেবিল দখল করতে পারে।
ব্যবহারিক পরিস্থিতিতে, তারা প্রত্যেকের জন্য প্রয়োজনীয় পরিষেবা অস্বীকার করছে যার ফলে মূল্যবান সময় নষ্ট হচ্ছে। এটাকে আমরা 'ডেনিয়াল অফ সার্ভিস অ্যাটাক' বলি।
বাস্তব-বিশ্ব কোড উদাহরণ:
খেলায় বলা হয় ইথারের রাজাযে কেউ রাজা হতে পারে। কিন্তু রাজা হওয়ার নিয়ম হল একজন ব্যক্তিকে বর্তমান রাজার চেয়ে বেশি জমা করতে হবে। এই কল করে করা যেতে পারে claimThrone()
ইথার চুক্তির রাজার ফাংশন যেখানে ব্যক্তি পূর্ববর্তী রাজার কাছে সরাসরি ইথার পাঠায় এবং নতুন রাজা হয়।
function claimThrone() external payable { require(msg.value > balance, "Need to pay more to become the king"); (bool sent, ) = king.call{value: balance}(""); require(sent, "Failed to send Ether"); balance = msg.value; king = msg.sender; }
আপনি অনুমান করতে পারেন, এই কোডটি একটি DoS আক্রমণের জন্য ঝুঁকিপূর্ণ, কিন্তু কিভাবে? এর জন্য, আপনাকে বুঝতে হবে যে ইথেরিয়ামে দুটি ধরণের ঠিকানা রয়েছে- প্রথমটি একটি বহিরাগত ঠিকানা মালিকানাধীন অ্যাকাউন্ট বা কেবল একটি ওয়ালেটের ঠিকানা, এবং দ্বিতীয়টি হল চুক্তির ঠিকানা. এখন ইথার এই ঠিকানা প্রকারের যেকোনো একটি থেকে পাঠানো যেতে পারে।
যদি এই, ইথার চুক্তি ঠিকানা দ্বারা পাঠানো হয়, তারপর চুক্তি রাজা হয়ে যাবে. তবে ধরে নেওয়া যাক যে এই নতুন চুক্তিতে একটি নেই fallback()
চুক্তিটি ইথার গ্রহণ করতে চাইলে প্রয়োজনীয় ফাংশন। তারপর যদি একজন নতুন লোক আসে এবং ফোন করার চেষ্টা করে claimThrone()
ফাংশন, এটা সবসময় ব্যর্থ হবে!
লক্ষ্য করুন যে এটি আংশিকভাবে ঘটে কারণ claimThrone()
ফাংশন স্পষ্টভাবে পরীক্ষা করে যে ইথারের স্থানান্তর সফল হয়েছে কিনা দ্বিতীয় প্রয়োজনীয় বিবৃতিতে নয়। আপনি সম্পূর্ণ কোড খুঁজে পেতে এবং এটি একটি DoS আক্রমণ করতে পারেন এখানে.
একটি কোডের জন্য একটি DoS আক্রমণের জন্য ঝুঁকিপূর্ণ হওয়াও সম্ভব যদি কোডটির একটি বড় আকারের অ্যারের উপর লুপ থাকে। এই ঘটবে কারণ গ্যাস সীমা এই ধরনের ক্ষেত্রে অতিক্রম করা যেতে পারে. আপনি এটি সম্পর্কে পড়তে পারেন এখানে.
প্রভাবঃ
একটি খেলা বলা হয় গভর্নমেন্টাল, যা দৃশ্যত একটি পঞ্জি স্কিম ছিল, 1100 ইথারের সাথে আটকে গেছে কারণ পেআউট প্রক্রিয়া করার জন্য প্রচুর পরিমাণে গ্যাসের প্রয়োজন ছিল।
অনিরাপদ এলোমেলোতা
বাস্তব-বিশ্বের দৃশ্যকল্প:
একবার হেস্কি নামে এক লোক ছিল যে সবসময় তার বানর পেস্কির সাথে থাকত। হেস্কি লটারি গেম পরিচালনা করে এবং ভাল লাভ করেছিল। একদিন এলিস লক্ষ্য করলেন হেস্কি তার বানর পেস্কির দিকে তীক্ষ্ণ দৃষ্টিতে তাকিয়ে আছে। তারপর তিনি তাকে কাগজের টুকরোতে কিছু লিখতে দেখেন এবং একটি খামে সিল করে রেখেছিলেন। কৌতূহলী, তিনি আরও তদন্ত করার সিদ্ধান্ত নেন।
পরে সেই সন্ধ্যায়, অ্যালিস দেখলেন যে লটারির বিজয়ী সিদ্ধান্ত নেওয়া হয়েছে প্রকাশ্যে সিল করা খামটি খোলার মাধ্যমে। কয়েকদিন ধরে তাকে দেখার পর, অ্যালিস বুঝতে পেরেছিল যে হেস্কি পেস্কির অঙ্গভঙ্গি দেখে বিজয়ী লটারি নম্বরটি নির্ধারণ করেছে (উদাহরণস্বরূপ যদি বানরটি তার মাথা আঁচড়ে দেয়, হেস্কি 10 লিখেছিলেন)! এখন অ্যালিসের কাছে প্রতিটি লটারি জেতার সূত্র ছিল এবং সঠিক নম্বর দিয়ে লটারির টিকিট কিনতে হয়েছিল!
হেস্কি ধরে নিয়েছিলেন যে লটারির বিজয়ী সিদ্ধান্ত নেওয়ার তার "এলোমেলো" উপায় কখনই বের করা যাবে না, তবে তিনি আসলেই ভুল ছিলেন।
বাস্তব-বিশ্ব কোড উদাহরণ:
এই উদাহরণে, একটি ব্লকের নম্বর এবং এর ব্লক টাইমস্ট্যাম্পের সমন্বয়ের হ্যাশের উপর ভিত্তি করে একটি র্যান্ডম নম্বর তৈরি করা হয়। এই হ্যাশ তারপর উত্তর পরিবর্তনশীল বরাদ্দ করা হয়. এখন যে কেউ এই (আপাতদৃষ্টিতে) এলোমেলো সংখ্যা অনুমান করে, তাকে 1 ইথার পুরস্কৃত করা হয়। আপনি কি মনে করেন এটি হ্যাক করা যায় না?
function guess(uint _guess) public { uint answer = uint( keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)) ); if (_guess == answer) { (bool sent, ) = msg.sender.call{value: 1 ether}(""); require(sent, "Failed to send Ether"); } }
না! একজন আক্রমণকারী উত্তর ভেরিয়েবলের জন্য নির্ধারিত মান তৈরি করতে কোডটি কপি পেস্ট করে এবং একই উত্তর ভেরিয়েবলটি পাস করার মাধ্যমে এই র্যান্ডম সংখ্যাটি অনুমান করতে পারে guess()
ফাংশন!
guessTheRandomNumber.guess(answer);
আপনি সম্পূর্ণ কোড খুঁজে পেতে পারেন এখানে. এই আক্রমণ এড়াতে, এটি একটি যাচাইযোগ্য র্যান্ডম ফাংশন ব্যবহার করার সুপারিশ করা হয় যেমন চেইনলিংক ভিআরএফ.
প্রভাবঃ
আক্রমণের কারণে প্রায় 400 ETH হারিয়ে গেছে স্মার্ট বিলিয়নস লটারি চুক্তি আশ্চর্যজনকভাবে, এমনকি চুক্তি লটারি নিজেই একটি পঞ্জি স্কিম ছিল (আহা!)
সময়ের হেরফের
বাস্তব-বিশ্বের দৃশ্যকল্প:
সাতোশি কুকিজ খেতে ভালোবাসে। তিনি তার মায়ের তৈরি সব ধরনের কুকি পছন্দ করেন। কিন্তু তার মা খুবই কঠোর এবং মনে করেন যে অনেক বেশি কুকি খাওয়া তার জন্য ভালো নয়। তাই তার মা নিয়ম করে দেন যে তিনি রাত ৮টায় কুকিজ পাবেন।
সেদিনই সন্ধ্যা ৭:৪৫ মিনিটে, সাতোশি তার মায়ের কাছে দৌড়ে কুকিজ চায়। তার মা জিজ্ঞেস করে- "কতটা বাজে?"
"ঘড়িতে 8 টা বাজে!" - তিনি জবাব দেন.
"ঠিক আছে. তারপর আমার আলমারি থেকে কুকিজ নাও।"
এবং এইভাবে, সাতোশি 15 মিনিটের মধ্যে সফলভাবে সময় পরিচালনা করতে সক্ষম হয়েছিল যাতে সে তার কুকিজ পেতে পারে! কি কুকি-ক্ষুধার্ত চ্যাপ!
বাস্তব-বিশ্ব কোড উদাহরণ:
একটি ব্লকের টাইমস্ট্যাম্প প্রায় দ্বারা ম্যানিপুলেট করা যেতে পারে 15 সেকেন্ড একজন খনি শ্রমিক দ্বারা। এইভাবে, একজন খনি শ্রমিক একটি অনুকূল টাইমস্ট্যাম্প সেট করতে পারে এবং তার লেনদেন সেই একই ব্লকে অন্তর্ভুক্ত করতে পারে যা সে খনি করে। কাজ play()
G-Dot নামক একটি গেম চুক্তির অন্তর্গত।
function play() public { require(now > 1640392200 && neverPlayed == true); neverPlayed = false; msg.sender.transfer(1500 ether);
}
এই চুক্তিটি প্লেয়ারকে 1500 ইথার পুরস্কৃত করে যে প্লে ফাংশনটি প্রথম কল করে। কিন্তু আপনি দেখতে পাচ্ছেন, প্লে ফাংশনটি কেবল তখনই কল করা যেতে পারে যদি লেনদেনের এখন বা ব্লক.টাইমস্ট্যাম্পে কল থাকে play()
ফাংশন, এর চেয়ে বড় যুগের সময় 1640392200.
একজন খনি শ্রমিক সহজেই এই টাইমস্ট্যাম্পটি পরিচালনা করতে পারে এবং তার কল করার লেনদেন অন্তর্ভুক্ত করতে পারে play()
একই ব্লকে ফাংশন যেমন তিনি নিজেই প্রথম খেলোয়াড়। এইভাবে এটা নিশ্চিত যে খনির খেলা জিতবে!
প্রভাবঃ
ব্লক.টাইমস্ট্যাম্পটি এলোমেলো সংখ্যা তৈরি করতে ব্যবহৃত হয়েছিল৷ সরকারি এবং এইভাবে সময় ম্যানিপুলেশন আক্রমণের জন্য ঝুঁকিপূর্ণ ছিল।
কুইল অডিটসের কাছে পৌঁছান
QuillAudits হল একটি সুরক্ষিত স্মার্ট কন্ট্রাক্ট অডিট প্ল্যাটফর্ম যা ডিজাইন করেছে কুইলহ্যাশ
প্রযুক্তি।
এটি একটি অডিটিং প্ল্যাটফর্ম যা স্থিতিশীল এবং গতিশীল বিশ্লেষণ সরঞ্জাম, গ্যাস বিশ্লেষক এবং পাশাপাশি অ্যাসিমুলেটরগুলির সাথে কার্যকর ম্যানুয়াল পর্যালোচনার মাধ্যমে সুরক্ষা দুর্বলতাগুলি পরীক্ষা করার জন্য স্মার্ট চুক্তিগুলি কঠোরভাবে বিশ্লেষণ করে এবং যাচাই করে৷ অধিকন্তু, অডিট প্রক্রিয়ার মধ্যে বিস্তৃত ইউনিট পরীক্ষার পাশাপাশি কাঠামোগত বিশ্লেষণও অন্তর্ভুক্ত।
সম্ভাব্যতা খুঁজে পেতে আমরা স্মার্ট চুক্তি নিরীক্ষা এবং অনুপ্রবেশ পরীক্ষা উভয়ই পরিচালনা করি
নিরাপত্তা দুর্বলতা যা প্ল্যাটফর্মের অখণ্ডতার ক্ষতি করতে পারে।
স্মার্ট কন্ট্রাক্ট অডিটে আপনার যদি কোনো সহায়তার প্রয়োজন হয়, তাহলে নির্দ্বিধায় আমাদের বিশেষজ্ঞদের সাথে যোগাযোগ করুন এখানে!
আমাদের কাজের সাথে আপ টু ডেট থাকতে, আমাদের কমিউনিটিতে যোগ দিন:-
Twitter | লিঙ্কডইন | ফেসবুক | Telegram
পোস্টটি স্মার্ট কন্ট্রাক্ট অডিট করার জন্য নতুনদের গাইড: পার্ট 1 প্রথম দেখা কুইলহ্যাশ ব্লগ.
সূত্র: https://blog.quillhash.com/2022/01/19/beginners-guide-to-smart-contract-auditing-part-1/
- "
- &
- 000
- 2016
- 7
- সম্পর্কে
- হিসাব
- ঠিকানা
- সব
- ইতিমধ্যে
- যদিও
- বিশ্লেষণ
- নিরীক্ষা
- স্বশাসিত
- শুরু
- সর্বোত্তম
- Bitcoin
- blockchain
- নম
- কেনা
- কল
- মামলা
- চেক
- সর্বোত্তম
- কোড
- মুদ্রা
- সমাহার
- সাধারণ
- সম্প্রদায়
- ধারণ
- চুক্তি
- চুক্তি
- বিস্কুট
- পারা
- তৈরি করা হচ্ছে
- ক্রিপ্টো
- বর্তমান
- দাও
- দিন
- বিকেন্দ্রীভূত
- সেবা দিতে অস্বীকার করা
- বিস্তারিত
- Dex
- নিচে
- সহজে
- খাওয়া
- ETH
- থার
- ethereum
- ইথেরিয়াম ব্লকচেইন
- Ethereum ক্লাসিক
- উদাহরণ
- কাজে লাগান
- ফেসবুক
- জরিমানা
- প্রথম
- বিনামূল্যে
- ক্রিয়া
- খেলা
- গেম
- গ্যাস
- উত্পাদন করা
- GitHub
- চালু
- ভাল
- কৌশল
- টাট্টু ঘোড়া
- হ্যাক
- কাটা
- মাথা
- এখানে
- কিভাবে
- HTTPS দ্বারা
- তদন্ত করা
- IT
- জাভা
- যোগদানের
- ঝাঁপ
- রাজা
- ভাষা
- বড়
- লাইন
- লিঙ্কডইন
- দীর্ঘ
- খুঁজছি
- লটারি
- এক
- মিলিয়ন
- মা
- সংখ্যার
- সংগঠন
- কাগজ
- প্যাটার্ন
- বেতন
- সম্প্রদায়
- টুকরা
- মাচা
- খেলা
- খেলোয়াড়
- পনজী
- পনজী প্রকল্প
- ক্ষমতা
- প্রক্রিয়া
- প্রোগ্রামাররা
- প্রোগ্রামিং
- প্রকাশ্য
- বিপরীত
- এখানে ক্লিক করুন
- পুরস্কার
- নিয়ম
- Satoshi
- নিরাপত্তা
- সেট
- স্মার্ট
- স্মার্ট চুক্তি
- স্মার্ট চুক্তি
- So
- ঘনত্ব
- কিছু
- ঘূর্ণন
- বিভক্ত করা
- শুরু
- বিবৃতি
- কৌশল
- সফল
- সফলভাবে
- প্রযুক্তি
- পরীক্ষা
- দ্বারা
- সময়
- সরঞ্জাম
- লেনদেন
- আর্থিক অন্তর্ভুক্তির বাইরে
- বিশ্ববিদ্যালয়
- আপডেট
- মূল্য
- দুর্বলতা
- দুর্বলতা
- জেয়
- মানিব্যাগ
- কি
- চাকা
- হু
- জয়
- হয়া যাই ?
- লেখা