خلاصه
استاندارد EIP712 از سوی جامعه ی اتریم برای یک پارچه کردن نحوه ی امضای پیام ها، خارج از شبکه بلاک چین و استفاده از آن در شبکه به وسیله ی واسط، معرفی شد. این استاندارد به سرعت توسط جامعه Decentralized مورد قبول واقع شد و کیف پول Metamask از اولین کیف پول هایی بود که این روش رو پیاده کرد. توی این مقاله قراره بیشتر باهاش آشنا بشیم.
هش (Hash)
یک تابع یک-طرفه که در ازای هر ورودی، مقادیرخروجی با اندازه یکسان میده. الگوریتم های متفاوتی برای هش گرفتن وجود دارن و میتونید راجبشون بیشتر بخونید. شبکه اتریم و زبان های EVM-base از الگوریتم Keccak-256 برای هش استفاده میکنن.هر گونه تغییر توی پیام اصلی، خروجی رو به کل عوض میکنه.
امضای دیجیتال (Crypto Signature)
یک الگوریتم تایید صلاحیت منبع ارسال کننده اطلاعات، به این صورت که کاربر یک کلید عمومی و یک کلید خصوصی در اختیار داره. کاربر با استفاده از کلید خصوصی یک پیام رو امضا و به همراه اصل پیام ارسال میکنه. دریافت کننده با استفاده از کلید عمومی ارسال کننده ، میتونه مطمئن بشه که آیا پیامِ امضا شده، توسط کلید خصوصی ارسال کننده امضا شده و از طرف دیگه هر گونه تغییر پیام توسط افراد واسطه رو تغریبا غیر ممکن میکنه.
پس امضای دیجیتال چیز جدیدی نیست! پس چرا استاندارد EIP712 معرفی شد؟
مگه با همین روند نمیشه از ارسال کننده پیام مطمئن شد؟
درسته که با همین روند موجود میشه از ارسال کننده پیام و تغییر نکردنش مطمئن شد، اما این کار جلوی بقیه حملات رو نمیگیره
فرض کنید که شما ، یک پیام انتقال توکن USDT رو امضا کردید. اگر این پیام فقط شامل مقدار و مقصد باشه، هر کسی با دزدیدن این پیام میتونه به جای شما هر توکن دیگه ای رو به همون مقدار، و همون مقصد انتقال بده! یا همون دریافت کننده اولیه میتونه به جای شما به همون مقدار از حساب شما به حساب خودش انتقال بده! به این نوع حمله میگن Replay Attack.
پس ساختار پیام هم مهمه! حالا که اهمیت ساختار پیام رو هم فهمیدیم، لازمه به این اشاره کنیم که استاندارد EIP712 درواقع یک استاندارد برای ساختار پیام امضا شده از طرف کاربر برای جلوگیری از حمله های متعدده!
ساختار EIP712
ساختار EIP712 شامل بخش های زیره :
- EIP712 prefix
- Domain
- Main Message
پیشونداصلی استاندارد EIP712
این پیشوند در اول پیام استفاده میشه و نشانه اینه که استاندارد پیام EIP712 هست.
prefix : \x19\x01
دامنه (Domain)
این بخش از پیام، قرارداد هوشمند مقصد مورد نظر ارسال کننده است. با فرمت عمومی (لازم و کافی) زیر:
struct EIP712Domain {
string name;
string version;
uint256 chainId;
address verifyingContract;
}
نام (name) : نام قرارداد هوشمند
ورژن (version) : ورژن قرارداد هوشمند
شماره شبکه (ChainId) : هرشبکه ، شماره مخصوص به خودش رو داره. برای مثال شبکه اتریم با شبکه BSC شماره های متفاوتی دارن و هدف از ذکر این شماره توی این ساختار، جلوگیری از کپی کردن این پیام ها بر روی شبکه های مختلفه
آدرس قرارداد هوشمند (verifyingContract) : آدرس قرارداد هوشمند مقصد.
پیام اصلی (Main Message)
این قسمت پیام اصلی که کاربر باید امضا کنه. برای مثال برای یک پیام شخصی ، ساختار به این صورته :
struct PrivateMail {
string message;
uint256 date;
}
توجه کنید که علاوه بر مقادیر struct های اشاره شده، خود فرمت هم مهمه و داخل این پروسه استفاده میشه
این ساختار پیامی که بالا بهش اشاره شد، در ابتدا Hash میشه و بعد، توسط کاربر امضا میشه. این پیام به صورت خام امضا نمیشه.
در آخر هم امضای کاربر به سه قسمت V,R,S تقسیم میشه.
این پیام داخل قرارداد هوشمند هم ساخته میشه و به همین ترتیب hash میشه. در آخر قرارداد هوشمند با استفاده از پیام امضا شده و پیام hash شده، آدرس کاربر امضا کننده رو محاسبه میکنه و متوجه میشه که آیا شخص مورد نظر پیام رو امضا کرده یا نه.
روند کلی رفتار کاربر، واسطه و قرارداد هوشمند به صورت زیر خواهد بود :
تهیه شده توسط: عطا طاهری و مصطفی مرادی