سمارٹ کنٹریکٹ آڈیٹنگ کے لیے Beginners گائیڈ میں خوش آمدید! سمارٹ کنٹریکٹ آڈیٹنگ کے ساتھ شروع کرنے کا ایک بہترین طریقہ یہ ہے کہ سمارٹ معاہدوں میں کچھ عام قسم کی کمزوریوں کو دیکھیں۔
اگر آپ کے پاس پہلے سے ہی Ethereum کی سولیڈیٹی پروگرامنگ زبان کی بنیادی سمجھ ہے تو یہ مددگار ثابت ہوگا۔ جیسا کہ ہم Noob solidity پروگرامرز کے لکھے ہوئے کچھ کوڈز کو دیکھیں گے۔
دوبارہ داخلہ حملہ
حقیقی دنیا کا منظر نامہ:
تصور کریں کہ آپ کے پاس 50 چاکلیٹ ہیں۔ آپ کی ایک شرارتی بہن ہے جسے آپ نے کسی بھی وقت آپ سے صرف 2 چاکلیٹ لینے کی اجازت دی ہے۔ آپ اسے ایک دن میں 10 سے زیادہ چاکلیٹ نہیں دینا چاہیں گے، اس ڈر سے کہ وہ دانتوں کی خرابی کا شکار ہو جائے گی۔ اس بات کو یقینی بنانے کے لیے، ہر شام آپ گنتے ہیں کہ آپ کے پاس کتنی چاکلیٹ باقی ہیں۔ کیا آپ کو لگتا ہے کہ یہ کام کرے گا؟ یا آپ کو اپنی چھوٹی بہن نے ہیک کر لیا ہو گا؟
بدقسمتی سے، یہ کام نہیں کرے گا! آپ کی بہن کا اندازہ ہے کہ شام ہونے تک آپ کو معلوم نہیں کہ آپ کے پاس کتنی چاکلیٹ ہیں۔ تو اگلے ہی دن، آپ کی چھوٹی بہن شام سے پہلے 6 بار آپ سے ملنے آتی ہے اور ہر بار 2 چاکلیٹ لیتی ہے! اسے ہم دوبارہ داخلے کا حملہ کہتے ہیں۔
یہاں آپ شام کے وقت آپ کے پاس موجود چاکلیٹوں کی گنتی کو اپ ڈیٹ کر رہے ہیں بجائے اس کے کہ ہر بار جب آپ کی بہن آپ سے 2 چاکلیٹ لیتی ہے تو شمار کو اپ ڈیٹ کریں۔ سمارٹ کنٹریکٹ کے ساتھ بھی یہی ہوتا ہے۔ سمارٹ کنٹریکٹ ایک خاص بیلنس سنبھالتا ہے جب کہ حملہ آور درحقیقت کئی بار کنٹریکٹ سے کرپٹو کی کچھ رقم نکالنے میں مصروف ہوتا ہے۔
حقیقی عالمی کوڈ کی مثال:
یہ کوڈ ایک سمارٹ کنٹریکٹ سے تعلق رکھتا ہے جسے کہا جاتا ہے۔ ناممکن. جب تک msg.sender کے بیلنس (یعنی کال کرنے والا withdraw
فنکشن ) واپس لینے کے لیے کہی گئی رقم سے زیادہ یا اس کے برابر ہے۔
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount;
}
نوٹ کریں کہ ایک کال کی ورڈ ہے جو ایتھر کو مطلوبہ رقم بھیجنے کے لیے استعمال کیا جاتا ہے۔ msg.sender
. ایک حملہ آور چور نامی ایک معاہدہ بنا کر اس کا فائدہ اٹھا سکتا ہے جس میں وہ ایک میں واپسی کی تقریب کو کال کرتا ہے۔ fallback()
تقریب A fallback()
سالیڈیٹی میں فنکشن ایک خاص فنکشن ہے جو اس وقت مکمل ہو جاتا ہے جب ایتھر کو سمارٹ کنٹریکٹ پر بھیجا جاتا ہے۔
اس کا مطلب ہے کہ حملہ آور اس قابل ہے۔ بار بار واپس لینے کے فنکشن کو کال کریں۔. اس طرح، سمارٹ کنٹریکٹ اپ ڈیٹ ہونے سے پہلے، کا بیلنس msg.sender
کوڈ کی آخری لائن پر، حملہ آور پہلے ہی کئی بار ایتھر واپس لے چکا ہے۔ اس سے بچا جا سکتا ہے اگر کال کی ورڈ استعمال کرنے سے پہلے بیلنس کو اپ ڈیٹ کر دیا جائے، اس طرح مندرجہ ذیل a چیک اثرات- تعاملات پیٹرن ہے
کے اثرات:
۔ پہلی بار ری اینٹرینسی حملہ 2016 میں ایک DAO (ڈی سینٹرلائزڈ خود مختار تنظیم) پر ہوا جس کے نتیجے میں تقریبا$ 50 ملین ہیکس ہوئے۔ اس ہیک کو ریورس کرنے کے لیے، Ethereum کمیونٹی نے Ethereum blockchain کو تقسیم کر دیا جس نے ETC (Ethereum Classic) اور ETH (Ethereum) کو جنم دیا۔
ریاضی کا بہاؤ اور زیر بہاؤ
حقیقی دنیا کا منظر نامہ:
آئیے ایک سوچ کا کھیل کھیلتے ہیں۔ یہ سپن دی وہیل پر مشتمل ہوتا ہے، اور جیتنے والے کا فیصلہ اس سب سے بڑی تعداد کی بنیاد پر کیا جاتا ہے جو وہ پہیے کو گھمانے پر حاصل کر سکتا ہے۔ پہیے کو 256 سے -256 تک نشان زد کیا گیا ہے۔
کھیل کے اصول یہ ہیں کہ تمام کھلاڑیوں کے لیے پوائنٹر ہر اسپن کے شروع میں 0 پر ٹکا ہوا ہے۔ اور ایک کھلاڑی کو صرف منفی نمبروں کی سمت میں گھومنے کی اجازت ہے۔ آپ یہ گیم کیسے جیتیں گے؟
ہر بار اس گیم کو جیتنے کے لیے ایک اچھی حکمت عملی یہ ہو گی کہ پہیے کو اتنی طاقت سے گھمایا جائے کہ وہیل -256 تک گھومے اور پھر ایک ہی بار میں 256 ہو جائے۔ یہ ممکن ہے کیونکہ 256 وہیل پر -256 کے عین بعد آتا ہے۔ اس کو ہم ریاضی کا زیر بہاؤ کہتے ہیں۔ اور ریاضی کا اوور فلو اس کے بالکل برعکس ہے۔
حقیقی عالمی کوڈ کی مثال:
An زیر بہاؤ یا بہاؤ اس وقت ہوتا ہے جب ریاضی کا عمل اپنی کم سے کم یا زیادہ سے زیادہ تک پہنچ جاتا ہے۔
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 میں لانچ کیا گیا تھا۔ اگرچہ یہ ایک پونزی گیم تھا، لیکن یہ خود ہی ایک ریاضی کے اوور فلو بگ کی وجہ سے ہیک ہو گیا جس کے نتیجے میں اس وقت تقریباً 866 ETH یا $950,000 کا نقصان ہوا۔ آپ اس کے بارے میں تفصیل سے پڑھ سکتے ہیں۔ یہاں.
ضرور پڑھنا: ٹائنی مین پر حملے سے سبق، الگورنڈ پر سب سے بڑا DEX
سروس حملے سے انکار
حقیقی دنیا کا منظر نامہ:
تصور کریں کہ آپ بٹ کوائن ٹیک یونیورسٹی میں ہیں۔ سب کچھ ٹھیک لگتا ہے سوائے اس کے کہ سب کے لیے ایک مشترکہ کھانے کی میز ہے۔ اور بدقسمتی سے، دوسرے طبقے کے چند لوگ ہیں جو ہمیشہ آپ کی کلاس کے کسی سے بھی پہلے کھانے کی میز پر قبضہ کرنے کا انتظام کرتے ہیں۔
عملی منظر نامے میں، وہ ہر ایک کے لیے ضروری خدمات سے انکار کر رہے ہیں جس کے نتیجے میں قیمتی وقت ضائع ہو رہا ہے۔ اسے ہم 'Denial of Service Attack' کہتے ہیں۔
حقیقی عالمی کوڈ کی مثال:
کھیل میں کہا جاتا ہے آسمان کا بادشاہکوئی بھی بادشاہ بن سکتا ہے۔ لیکن بادشاہ بننے کا قاعدہ یہ ہے کہ کوئی شخص موجودہ بادشاہ سے زیادہ رقم جمع کرے۔ یہ کال کرکے کیا جاسکتا ہے۔ 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; }
جیسا کہ آپ نے اندازہ لگایا ہوگا، یہ کوڈ ڈی او ایس اٹیک کا خطرہ ہے، لیکن کیسے؟ اس کے لیے، آپ کو یہ سمجھنے کی ضرورت ہوگی کہ Ethereum میں دو قسم کے پتے ہیں- پہلا ہے۔ ایک بیرونی کا پتہ ملکیتی اکاؤنٹ یا محض بٹوے کا پتہ، اور دوسرا ہے۔ معاہدہ کا پتہ. اب ایتھر کو ان میں سے کسی بھی قسم کے ایڈریس سے بھیجا جا سکتا ہے۔
اگر یہ، ایتھر کنٹریکٹ ایڈریس کے ذریعے بھیجا جاتا ہے، تو معاہدہ بادشاہ بن جائے گا۔ لیکن مان لیتے ہیں کہ اس نئے معاہدے میں ایک نہیں ہے۔ fallback()
فنکشن جو ضروری ہے اگر معاہدہ ایتھر کو قبول کرنا چاہتا ہے۔ پھر اگر کوئی نیا شخص ساتھ آئے اور کال کرنے کی کوشش کرے۔ claimThrone()
فنکشن، یہ ہمیشہ ناکام ہو جائے گا!
نوٹ کریں کہ یہ جزوی طور پر بھی ہوتا ہے کیونکہ claimThrone()
فنکشن واضح طور پر چیک کرتا ہے کہ آیا ایتھر کی منتقلی دوسرے مطلوبہ بیان میں کامیاب تھی یا نہیں۔ آپ مکمل کوڈ تلاش کر سکتے ہیں اور اس پر DoS حملہ کر سکتے ہیں۔ یہاں.
یہ بھی ممکن ہے کہ کوڈ کے لیے DoS حملے کا خطرہ ہو اگر کوڈ میں بڑے سائز کی ایک صف پر لوپ ہو۔ ایسا ہوتا ہے کیونکہ گیس کی حد اس طرح کے معاملات میں حد سے تجاوز کیا جا سکتا ہے. آپ اس کے بارے میں پڑھ سکتے ہیں۔ یہاں.
کے اثرات:
ایک کھیل جسے کہتے ہیں۔ گورنمنٹ مینٹلجو کہ بظاہر ایک پونزی سکیم تھی، 1100 ایتھر کے ساتھ پھنس گئی کیونکہ ادائیگی پر کارروائی کے لیے بڑی مقدار میں گیس کی ضرورت تھی۔
غیر محفوظ بے ترتیب پن
حقیقی دنیا کا منظر نامہ:
ایک دفعہ ہیسکی نام کا ایک آدمی تھا جس کے ساتھ ہر وقت اس کا بندر پیسکی ہوتا تھا۔ ہیسکی نے لاٹری گیمز کا انعقاد کیا اور اچھا منافع کمایا۔ ایک دن ایلس نے دیکھا کہ ہیسکی اپنے بندر پیسکی کو غور سے دیکھ رہا ہے۔ پھر اس نے اسے کاغذ کے ٹکڑے پر کچھ لکھتے ہوئے دیکھا اور اسے ایک لفافے میں بند کر دیا۔ متجسس، اس نے مزید تفتیش کرنے کا فیصلہ کیا۔
اس شام کے بعد، ایلس نے دیکھا کہ لاٹری کے فاتح کا فیصلہ مہر بند لفافے کو عوامی طور پر کھول کر کیا گیا تھا۔ کچھ دنوں تک اسے دیکھنے کے بعد، ایلس نے اندازہ لگایا کہ ہیسکی نے پیسکی کے اشاروں کو دیکھ کر جیتنے والے لاٹری نمبر کا فیصلہ کیا ہے (مثال کے طور پر اگر بندر اپنا سر کھجاتا ہے، تو ہیسکی نے 10 لکھ دیا)! اب ایلس کے پاس ہر لاٹری جیتنے کا فارمولا تھا اور اسے صرف صحیح نمبر کے ساتھ لاٹری ٹکٹ خریدنا تھا!
ہیسکی نے فرض کیا تھا کہ لاٹری کے فاتح کا فیصلہ کرنے کے اس کے "بے ترتیب" طریقے کا کبھی اندازہ نہیں لگایا جا سکتا، لیکن وہ واقعی غلط تھا۔
حقیقی عالمی کوڈ کی مثال:
اس مثال میں، ایک بے ترتیب نمبر بلاک کے نمبر اور اس کے بلاک ٹائم اسٹیمپ کے امتزاج کے ہیش کی بنیاد پر تیار ہوتا ہے۔ اس ہیش کو پھر جواب متغیر کو تفویض کیا جاتا ہے۔ اب جو بھی اس (بظاہر) بے ترتیب نمبر کا اندازہ لگاتا ہے، اسے 1 ایتھر کا انعام دیا جاتا ہے۔ کیا آپ کو لگتا ہے کہ یہ unhackable ہے؟
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"); } }
Nope کیا! ایک حملہ آور جوابی متغیر کو تفویض کردہ قدر پیدا کرنے کے لیے کوڈ کو کاپی پیسٹ کر کے اس بے ترتیب نمبر کا اندازہ لگا سکتا ہے، اور اسی جوابی متغیر کو guess()
تقریب!
guessTheRandomNumber.guess(answer);
آپ کو مکمل کوڈ مل سکتا ہے۔ یہاں. اس حملے سے بچنے کے لیے، قابل تصدیق رینڈم فنکشن جیسے کہ استعمال کرنے کی سفارش کی جاتی ہے۔ چینلنک وی آر ایف.
کے اثرات:
پر حملے کی وجہ سے تقریباً 400 ETH ضائع ہو گئے تھے۔ اسمارٹ بلینز کی لاٹری معاہدہ حیرت کی بات یہ ہے کہ کنٹریکٹ کی لاٹری بھی خود ایک پونزی اسکیم تھی (اوچ!)
وقت کا ہیرا پھیری
حقیقی دنیا کا منظر نامہ:
ساتوشی کوکیز کھانا پسند ہے۔ اسے ہر طرح کی کوکیز پسند ہیں جو اس کی ماں بناتی ہیں۔ لیکن اس کی والدہ بہت سخت ہیں اور انہیں لگتا ہے کہ بہت زیادہ کوکیز کھانا اس کے لیے اچھا نہیں ہے۔ اس لیے اس کی ماں نے ایک اصول بنایا ہے کہ اسے رات 8 بجے ہی کوکیز ملے گی۔
اسی دن شام 7:45 بجے، ساتوشی اپنی ماں کے پاس بھاگتا ہے اور کوکیز مانگتا ہے۔ اس کی ماں نے پوچھا- "کیا وقت ہوا ہے؟"
"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 تک پہنچیں۔
QuillAudits ایک محفوظ سمارٹ کنٹریکٹ آڈٹ پلیٹ فارم ہے جسے ڈیزائن کیا گیا ہے۔ QuillHash
ٹیکنالوجی
یہ ایک آڈیٹنگ پلیٹ فارم ہے جو مستحکم اور متحرک تجزیہ ٹولز، گیس اینالائزرز کے ساتھ ساتھ سمیولیٹر کے ساتھ موثر دستی جائزے کے ذریعے سیکیورٹی کے خطرات کو جانچنے کے لیے اسمارٹ کنٹریکٹس کا سختی سے تجزیہ اور تصدیق کرتا ہے۔ مزید یہ کہ آڈٹ کے عمل میں یونٹ کی وسیع جانچ کے ساتھ ساتھ ساختی تجزیہ بھی شامل ہے۔
ہم صلاحیت کو تلاش کرنے کے لیے سمارٹ کنٹریکٹ آڈٹ اور دخول ٹیسٹ دونوں کرتے ہیں۔
حفاظتی کمزوریاں جو پلیٹ فارم کی سالمیت کو نقصان پہنچا سکتی ہیں۔
اگر آپ کو سمارٹ کنٹریکٹس آڈٹ میں کسی مدد کی ضرورت ہو تو بلا جھجھک ہمارے ماہرین سے رابطہ کریں۔ یہاں حاصل کریں!
ہمارے کام کے ساتھ تازہ ترین رہنے کے لیے، ہماری کمیونٹی میں شامل ہوں:-
پیغام سمارٹ کنٹریکٹ آڈیٹنگ کے لیے ابتدائی رہنما: حصہ 1 پہلے شائع Quillhash بلاگ.
ماخذ: https://blog.quillhash.com/2022/01/19/beginners-guide-to-smart-contract-auditing-part-1/
- "
- &
- 000
- 2016
- 7
- ہمارے بارے میں
- اکاؤنٹ
- پتہ
- تمام
- پہلے ہی
- اگرچہ
- تجزیہ
- آڈٹ
- خود مختار
- شروع
- BEST
- بٹ کوائن
- blockchain
- بگ کی اطلاع دیں
- خرید
- فون
- مقدمات
- چیک
- کلاسک
- کوڈ
- سکے
- مجموعہ
- کامن
- کمیونٹی
- پر مشتمل ہے
- کنٹریکٹ
- معاہدے
- کوکیز
- سکتا ہے
- تخلیق
- کرپٹو
- موجودہ
- ڈی اے او
- دن
- مہذب
- سروس کا انکار
- تفصیل
- اس Dex
- نیچے
- آسانی سے
- کھانے
- ETH
- آسمان
- ethereum
- ایتیروم بلاچین
- ایتھریم کلاسیکی
- مثال کے طور پر
- دھماکہ
- فیس بک
- آخر
- پہلا
- مفت
- تقریب
- کھیل ہی کھیل میں
- کھیل
- گیس
- پیدا
- GitHub کے
- جا
- اچھا
- رہنمائی
- ہیک
- hacks
- ہیش
- سر
- یہاں
- کس طرح
- HTTPS
- کی تحقیقات
- IT
- اعلی درجے کا Java
- میں شامل
- کودنے
- بادشاہ
- زبان
- بڑے
- لائن
- لنکڈ
- لانگ
- تلاش
- لاٹری
- آدمی
- دس لاکھ
- ماں
- تعداد
- تنظیم
- کاغذ.
- پاٹرن
- ادا
- لوگ
- ٹکڑا
- پلیٹ فارم
- کھیلیں
- کھلاڑی
- ponzi
- پونزی اسکیم
- طاقت
- عمل
- پروگرامر
- پروگرامنگ
- عوامی
- اٹ
- ریورس
- کا جائزہ لینے کے
- انعامات
- قوانین
- فوروکاوا
- سیکورٹی
- مقرر
- ہوشیار
- سمارٹ معاہدہ
- سمارٹ معاہدہ
- So
- استحکام
- کچھ
- سپن
- تقسیم
- شروع
- بیان
- حکمت عملی
- کامیاب
- کامیابی کے ساتھ
- ٹیک
- ٹیسٹ
- کے ذریعے
- وقت
- اوزار
- ٹرانزیکشن
- ناجائز
- یونیورسٹی
- تازہ ترین معلومات
- قیمت
- نقصان دہ
- خطرے کا سامنا
- قابل اطلاق
- بٹوے
- کیا
- وہیل
- ڈبلیو
- جیت
- کام
- تحریری طور پر