در چشمانداز وسیع و پیچیده بلاکچین اتریوم، آدرسها به عنوان نقاط اساسی تعامل عمل میکنند. در حالی که بسیاری از کاربران با آدرسهای مخصوص ارسال و دریافت اتر (ETH) آشنا هستند، نوع متمایز و به همان اندازه حیاتی دیگری نیز وجود دارد: آدرس قرارداد اتریوم (Ethereum contract address). این شناسههای منحصربهفرد، مکان قراردادهای هوشمند — توافقنامههای خوداجرا که شرایط قرارداد مستقیماً در کد نوشته شده است — را پس از استقرار در شبکه مشخص میکنند. آدرسهای قرارداد فراتر از مکانهای ذخیرهسازی صرف برای داراییها، به عنوان رابط عمومی برای منطق، دادهها و توابعی عمل میکنند که در دل این برنامههای قدرتمند آنچین (on-chain) نهفتهاند. درک ماهیت و عملکرد آنها برای هر کسی که با وب غیرمتمرکز در تعامل است، ضروری است.
آدرس قرارداد اتریوم، مانند آدرس یک حساب با مالکیت خارجی (EOA)، یک رشته هگزادسیمال ۴۲ کاراکتری است که با "0x" شروع میشود. به عنوان مثال، 0x7a250d5630b4cf539739df2c5accb110ae07be9f میتواند نشاندهنده یک آدرس قرارداد باشد. با این حال، منشأ و مکانیسمهای کنترل زیربنایی آنها تفاوت قابل توجهی با هم دارند.
برخلاف حسابهای EOA که از یک کلید خصوصی مشتق میشوند، آدرسهای قرارداد از کلید خصوصی تولید نمیشوند. در عوض، آنها به صورت قطعی (Deterministic) در طول فرآیند استقرار قرارداد ایجاد میشوند. اتریوم دو آپکد (opcode) اصلی برای ایجاد قرارداد ارائه میدهد که هر کدام مکانیسم متفاوتی برای تولید آدرس دارند:
آپکد CREATE: این روش سنتی برای استقرار یک قرارداد هوشمند است. آدرسی که از طریق CREATE تولید میشود، تابعی از آدرس فرستنده (deployer) و نانس (nonce) تراکنش آنهاست.
keccak256(RLP([sender_address, nonce])) است. این بدان معناست که اگر همان فرستنده، همان قرارداد را با همان نانس مستقر کند، آدرس قرارداد حاصل همیشه یکسان خواهد بود. این قطعیت، سنگ بنای ماهیت پیشبینیپذیر اتریوم است.آپکد CREATE2: این آپکد که با هارد فورک کنستانتینوپل (Constantinople) معرفی شد، رویکرد متفاوتی برای تولید آدرس ارائه میدهد و اجازه میدهد آدرس یک قرارداد حتی قبل از استقرار، پیشمحاسبه شود. این قابلیت به ویژه برای برخی راهکارهای مقیاسپذیری و الگوهای کارخانهای (factory patterns) مفید است، جایی که قراردادها باید با قراردادهای دیگری تعامل داشته باشند که هنوز وجود ندارند اما آدرس آنها باید از قبل مشخص باشد.
CREATE2: برابر است با keccak256(0xff + sender_address + salt + keccak256(init_code)).
0xff: یک بایت ثابت برای جلوگیری از تداخل با CREATE.sender_address: آدرس استقراردهنده (فرستنده).salt: یک مقدار دلخواه ۳۲ بایتی که توسط فرستنده ارائه میشود. این مقدار اجازه میدهد چندین قرارداد با کد مقداردهی اولیه یکسان، توسط یک فرستنده در آدرسهای مختلف مستقر شوند.init_code: بایتکدی که در طول فرآیند ایجاد قرارداد اجرا میشود. این کد اغلب شامل منطق سازنده (constructor) و بایتکد نهایی زمان اجراست.salt در اینجا حیاتی است، زیرا اجازه میدهد آدرسهای منحصربهفردی داشته باشیم حتی اگر sender_address و init_code یکسان باشند.قطعیت در هر دو روش CREATE و CREATE2 یک ویژگی قدرتمند است که تعاملات قابل تایید و پیشبینیپذیر را در محیط غیرمتمرکز امکانپذیر میکند.
یک آدرس قرارداد پس از استقرار، به یک نقطه انتهایی (endpoint) زنده در بلاکچین اتریوم تبدیل میشود و از طریق چندین جنبه عملکردی کلیدی، خود را از EOA متمایز میکند.
آدرس قرارداد به عنوان نقطه ورود برای هر کسی که مایل به تعامل با قرارداد هوشمند زیربنایی است، عمل میکند. این تعامل میتواند از خواندن دادههای عمومی ذخیره شده در قرارداد تا اجرای توابع پیچیده، ایجاد تغییرات در وضعیت (state) یا انتقال توکنها متغیر باشد.
هر قرارداد هوشمند دارای فضای ذخیرهسازی دائمی خود است؛ یک انبار کلید-مقدار (key-value store) که میتواند دادهها را در آن ذخیره کند. این دادهها "وضعیت" (state) قرارداد را تشکیل میدهند. به عنوان مثال، یک قرارداد توکن موجودی هر دارنده توکن را ذخیره میکند، در حالی که یک پروتکل وامدهی دیفای (DeFi)، اطلاعات مربوط به وامهای فعال و وثیقهها را نگه میدارد.
علاوه بر این، یک آدرس قرارداد میتواند داراییهایی شامل ETH و توکنهای مختلف ERC-20، ERC-721 یا ERC-1155 را نگه دارد. وقتی ETH به آدرس یک قرارداد ارسال میکنید، به بخشی از موجودی آن قرارداد تبدیل میشود. وقتی توکن ERC-20 به یک قرارداد میفرستید، وضعیت داخلی قرارداد بهروز میشود تا مالکیت آن توکنها را منعکس کند. این داراییها سپس توسط منطق کد قرارداد مدیریت میشوند که زمان و نحوه جابجایی یا استفاده از آنها را تعیین میکند.
متمایزترین ویژگی یک آدرس قرارداد، ارتباط آن با بایتکد (bytecode) قابل اجرا است. هنگامی که تراکنشی به آدرس یک قرارداد ارسال میشود، ماشین مجازی اتریوم (EVM) بایتکد مرتبط با آن آدرس را اجرا میکند. این اجرا از منطق از پیش تعریف شده قرارداد هوشمند پیروی میکند.
قراردادهای هوشمند موجودات ایزولهای نیستند. آنها مکرراً با یکدیگر تعامل دارند و اکوسیستم وسیعی از پروتکلهای به هم پیوسته را تشکیل میدهند. یک پروتکل وامدهی دیفای ممکن است با یک قرارداد اوراکل قیمت تعامل کند تا ارزش فعلی داراییها را به دست آورد، و آن اوراکل نیز به نوبه خود ممکن است با یک قرارداد صرافی غیرمتمرکز برای تسهیل نقدینگی در تعامل باشد. اپلیکیشنهای غیرمتمرکز (DApps) رابطهای کاربرپسندی را برای تعامل با این قراردادهای هوشمند زیربنایی فراهم میکنند و پیچیدگیهای تعامل مستقیم با بلاکچین را از دید کاربر پنهان میکنند.
اگرچه هر دو آدرس قرارداد و EOA با همان فرمت هگزادسیمال ۴۲ کاراکتری نمایش داده میشوند، اما ماهیت و تواناییهای آنها اساساً متفاوت است.
| ویژگی | حساب با مالکیت خارجی (EOA) | آدرس قرارداد (CA) |
|---|---|---|
| کنترل | توسط یک کلید خصوصی در اختیار انسان یا نرمافزار کنترل میشود. | توسط کد قرارداد هوشمند خودش کنترل میشود. |
| ایجاد | با تولید یک کلید خصوصی ایجاد میشود. | با استقرار بایتکد در بلاکچین ایجاد میشود. |
| اجرای کد | نمیتواند کد اجرا کند؛ فقط میتواند تراکنش آغاز کند. | شامل کد قابل اجرا است؛ هنگام تعامل، منطق را اجرا میکند. |
| منبع تراکنش | همیشه آغازکننده تراکنش است. | میتواند آغازگر تراکنش باشد (فراخوانی سایر قراردادها) اما فقط زمانی که توسط یک EOA یا قرارداد دیگر تحریک شود. |
| پرداخت گاز | هزینه گاز تراکنشهای خودش را پرداخت میکند. | فقط در صورت تحریک شدن، گاز تراکنشهای "داخلی" خود را میدهد؛ فرستنده اولیه تراکنش، گاز فراخوانی قرارداد را پرداخت میکند. |
| وضعیت (State) | شامل موجودی ETH و نانس تراکنش است. | شامل موجودی ETH، فضای ذخیرهسازی و بایتکد مرتبط است. |
| "مالکیت" | در اختیار نهادی است که کلید خصوصی را دارد. | در اختیار کدی است که شامل میشود؛ رفتار آن تغییرناپذیر است (مگر اینکه از پروکسیهای ارتقاپذیر استفاده شود). |
تعامل موثر با یک قرارداد هوشمند به چیزی بیش از آدرس آن نیاز دارد؛ به ABI آن نیاز است. ABI در واقع "دفترچه راهنما" یا "رابط عمومی" یک قرارداد است که موارد زیر را تعریف میکند:
بدون ABI، یک انسان یا برنامه نمیتواند بداند که چگونه فراخوانی توابع قرارداد را به درستی فرمت کند یا دادههای بازگشتی آن را تفسیر نماید. به عنوان مثال، اگر تابعی انتظار یک uint256 و یک address را به عنوان ورودی داشته باشد، ABI این را مشخص میکند. ابزارهایی مانند Etherscan از ABI استفاده میکنند تا رابطهای انسانخوان برای تعامل با قراردادها فراهم کنند و به کاربران اجازه دهند توابع را فراخوانی کرده و رویدادها را مستقیماً از مرورگر وب مشاهده کنند.
تغییرناپذیری و ماهیت عمومی کد قرارداد هوشمند، در عین قدرتمند بودن، ملاحظات امنیتی مهمی را نیز به همراه دارد. یک باگ در کد قراردادی که مستقر شده است، میتواند پیامدهای جبرانناپذیر و پرهزینهای داشته باشد.
آدرسهای قرارداد اتریوم ستون فقرات تقریباً هر اپلیکیشن غیرمتمرکز و پروتکلی در این اکوسیستم هستند.
کاربران و توسعهدهندگان به طور روزانه از طریق روشهای مختلف با آدرسهای قرارداد تعامل دارند:
سفر یک آدرس قرارداد شامل چندین مرحله مجزا است:
CREATE یا CREATE2 تولید میکند.تمایز بین EOA و آدرسهای قرارداد برای اتریوم بنیادی است. با این حال، تحولات جاری، به ویژه در زمینه انتزاع حساب (Account Abstraction - ERC-4337)، در حال محو کردن این مرزها هستند. هدف انتزاع حساب این است که به قراردادهای هوشمند اجازه دهد به عنوان حسابهای کاربری اصلی عمل کنند و ویژگیهایی مانند موارد زیر را فعال کنند:
در این چشمانداز آینده، آدرسهای قرارداد ممکن است نه تنها نشاندهنده پروتکلها، بلکه نشاندهنده کاربران فردی باشند و انعطافپذیری و امنیت بیسابقهای را برای حسابهای شخصی ارائه دهند. این تکامل نشاندهنده نوآوری مستمر در نحوه مدیریت هویتها و تعاملات در بلاکچین اتریوم است.
در نتیجه، آدرسهای قرارداد اتریوم بسیار فراتر از رشتههای الفبایی-عددی ساده هستند. آنها مجراهای دیجیتالی هستند که جهان غیرمتمرکز از طریق آنها عمل میکند و میزبان منطق، دادهها و ارزشی هستند که قراردادهای هوشمند را تعریف میکنند. ایجاد قطعی، عملکرد پیچیده و نقش آنها به عنوان رابط عمومی برای برنامههای آنچین، اهمیت محوری آنها را در ساخت و تعامل با آینده اینترنت نشان میدهد. درک آنها گامی حیاتی به سوی پیمایش و مشارکت در اکوسیستم رو به رشد اتریوم است.



