اگرچه صنعت ارز دیجیتال در حال بلوغ است، اما توسعه قرارداد هوشمند هنوز حوزه جدیدی است و از منظر امنیتی پیوسته در حال تغییر است. هنوز ریسکهای امنیتی و باگهای جدیدی در این حیطه کشف میشوند و هر روز اقدامات امنیتی جدیدی برای بهبود کار پیشنهاد میشود. یادگیری این اقدامات جدید و عمل بر طبق آنها تنها شروع کار امنیتی یک توسعهدهنده قرارداد هوشمند اتریوم است.
برنامهنویسی قرارداد هوشمند نیازمند نگرش متفاوتی است و وجود اشکال در این قراردادها باعث ایجاد هزینه و مشکلات بسیار میشود. برنامهنویسی قرارداد هوشمند تا حدود زیادی شبیه برنامهنویسی سخت افزار و سرویسهای مالی است و زیاد شبیه توسعه موبایل یا وب نیست. در اینجا تنها کافی نیست که برای دفاع در برابر آسیبپذیریها آماده باشید، بلکه در عوض لازم است که یک فلسفه جدید توسعه را یاد بگیرید.
در برنامهنویسی قرارداد هوشمند اتریوم باید آمادگی شکست را داشت
هر قرارداد هوشمند مهم اتریوم قطعا دارای خطاها و معایبی خواهد بود. بنابراین کد شما باید قادر باشد به خوبی به باگها و آسیبپذیریهای موجود پاسخ دهد.
وقتی که اوضاع به خوبی پیش نمیرود، قرارداد را متوقف کنید.
مقدار پولی که در معرض ریسک است را مدیریت کنید.
دارای یک مسیر ارتقای موثر برای اصلاح باگها و بهبود وضعیت باشید.
محصول را با دقت بیرون دهید
همیشه بهتر است که قبل از بیرون دادن کامل محصول با باگها مواجه شوید.
قراردادها را با دقت آزمایش کنید و هر زمان که مسیرهای جدید حمله کشف شد، آزمایشهای دیگری را اضافه کنید.
از همان ابتدای کار برای پیدا کردن باگ پاداش تعیین کنید و به این ترتیب کمک دیگران را برای توسعه محصول به سوی خود سرازیر نمایید.
محصول را به صورت مرحله به مرحله بیرون دهید و در هر مرحله استفاده و آزمایش را بیشتر کنید.
قراردادهای هوشمند اتریوم را ساده نگه دارید
پیچیدگی احتمال خطا را افزایش میدهد.
اطمینان حاصل کنید که لوجیک (logic) قرارداد هوشمند مورد نظر ساده باشد.
کد را به صورت بخشهایی جداگانه طراحی کنید تا قراردادها و توابع کوچک باشند.
اگر امکان دارد، از ابزارها و یا کد از قبل نوشته شده استفاده کنید.
هر زمان که امکان دارد، شفافیت را بر عملکرد ترجیح دهید.
از بلاک چین تنها برای بخشهایی از سیستمتان استفاده کنید که لازم است غیر متمرکز باشند.
به روز باشید
همیشه در جریان توسعههای امنیتی اخیر باشید.
همواره قرارداد هوشمند اتریوم خود را برای کشف خطا و باگ مورد بررسی قرار دهید.
در اولین زمان ممکن، ابزار خود را به آخرین نسخه موجود ارتقا دهید.
فنون امنیتی جدید را که به نظر مفید میرسند، همواره بپذیرید.
مواظب خصوصیات منحصر به فرد ماشین مجازی اتریوم باشید
در حالی که بسیاری از تجربه برنامهنویسی شما مرتبط با برنامهنویسی اتریوم خواهد بود، اما هشدارهایی در این میان مطرح است که باید به آنها توجه داشته باشید:
- بسیار مراقب فراخوانیهای قرارداد خارجی باشید که ممکن است کد بدکاری را اجرا کنند و جریان کنترل را تغییر دهند.
- توجه داشته باشید که توابع عمومی شما عمومی هستند و ممکن است در هر صورتی به صورت بدخواهانه فراخوانی شوند. دادههای خصوصی در یک قرارداد هوشمند نیز توسط همه قابل مشاهده است.
- هزینه گس و محدوده گس بلاک را در نظر داشته باشید.
- به یاد داشته باشید که برچسبهای زمانی در بلاک چین دقیق نیستند؛ ماینرها میتوانند زمان اجرای یک تراکنش را در عرض چند ثانیه تحت تاثیر قرار دهند.
- تصادف و غیر مترقبگی در بلاک چین مهم است و اکثر رویکردها به نسبت ایجاد عدد تصادفی در بلاک چین قابل دستکاری است.
ریسکهای بنیادین
وقتی که ساختار و امنیت یک قرارداد هوشمند اتریوم را مورد ارزیابی قرار میدهیم، ریسکهای بنیادین زیادی وجود دارد که باید در نظر گرفته شوند و برای آنها چارهاندیشی شود. یک سیستم قرارداد هوشمند ایدهال اتریوم از منظر مهندسی نرم افزار باید مدولار (modular) باشد و به جای کپی کردن کد باید از آن استفاده مجدد شود. این سیستم باید از مولفههای قابل ارتقا پشتیبانی کند. چنین نگرشی مخصوصا در سیستمهای قرارداد هوشمند پیچیده باید لحاظ شود.
البته استثناهای مهمی وجود دارد که در آنجا امنیت و بهترین اقدامات مهندسی نرم افزار ممکن است در کنار هم قرار نگرفته باشند. در چنین وضعیتی، توازن درست از طریق شناسایی ترکیب بهینه خصوصیات در ابعاد سیستم قرارداد حاصل میشود.
عدم ارتقا در برابر ارتقاپذیری
اگرچه همواره بر انعطافپذیری تاکید میشود و ویژگیهایی مانند قابلیت ارتقا مورد تحسین قرار میگیرد، اما مخاطراتی بنیادین در این میان مطرح است و انعطافپذیری ممکن است از امنیت بکاهد. انعطافپذیری ذاتا باعث افزایش پیچیدگی میشود و این احتمال ظاهر شدن حملات را بیشتر میکند. باید تا آنجا که امکان دارد سادگی را بر پیچیدگی ترجیح دهیم.
یکپارچگی در برابر طراحی مدولار
یک قرارداد هوشمند یکپارچه اتریوم تمامی اطلاعات را به صورت محلی قابل شناسایی و خواندن نگه میدارد. در حالی که سیستمهای قرارداد هوشمند کمی این یکپارچگی را حفظ میکنند، بحث در مورد محل افراطی دادهها و جریان مطرح است. در قراردادهای کوتاه مدت و ساده، اقدامات امنیتی مناسب و اقدامات مهندسی مناسب در تطابق با یکدیگر قرار نمیگیرند. اقدامات امنیتی مناسب معمولا تمایل دارند که در سیستمهای پیچیده در تطابق با اقدامات مناسب نرم افزاری قرار بگیرند.
کپی در مقابل استفاده مجدد
یک سیستم قرارداد هوشمند اتریوم از منظر مهندسی نرم افزار تمایل دارد که استفاده مجدد را در هر جا که معقول باشد به حداکثر برساند. روشهای زیادی برای استفاده مجدد از کد قرارداد در زبان برنامهنویسی سالیدیتی (solidity) وجود دارد. استفاده از قراردادهای هوشمندی که قبلا استفاده شدهاند و خود را اثبات کردهاند، معمولا ایمنترین روش برای استفاده مجدد از کد است.
کپی معمولا زمانی لازم میشود که قرارداد هوشمند قبلا توسعه یافته توسط خود فرد موجود نباشد. تلاشهایی مانند openZeppelin`s Solidity Library