انجمن توسعه قرارداد هوشمند

آشنایی با Bytecode در اتریوم

فقط دو تایپ بایت کد در اتریوم وجود دارد اما پنج نام مختلف برای توصیف آنها وجود دارد.*

Name Description On-chain Retrival Off-chain Retrieval
Creation بایت‌کد کدی که در زمان اجرا ایجاد می‌شود type(ContractName).creationCode getTransactionByHash
Runtime بایت‌کد کدی که بصورت آنچین ذخیره می شود و یک قرارداد هوشمند را توصیف می کند extcodecopy(a) or type(ContractName).runtimeCode getCode
بایت‌کد Umbrella اصطلاح چتر که هم Creation بایت‌کد و هم Runtime بایت‌کد را شامل می شود بایت‌کد NA NA
Deployed بایت‌کد شبیه runtime بایت‌کد است extcodecopy(a) or type(ContractName).runtimeCode getCode
Init Code شبیه creation بایت‌کد type(ContractName).creationCode getTransactionByHash

توسعه دهندگان اتریوم هنگام نوشتن قراردادهای هوشمند هیچ شکی به بایت کد ندارند. خوشبختانه برای اکثر مواقع ، این کد فقط توسط EVM استفاده می شود و بنابراین نیازی به درک کامل آن توسط ما نیست. با این حال ، تعداد کمی از افراد هستند که این سطح از جزئیات را درک می کنند و می توانند از آن به نفع خود استفاده کنند. یکی از این مثالها سیستم شناسایی برای قراردادهایی است که توسط کارخانه پروکسی آثریوم(Authereum proxy factory) ایجاد شده است.

نامگذاری پیرامون بایت‌کدی در جامعه اتریوم انجام می‌شود، تنها بر پیچیدگی می افزاید. نام های متفاوتی با انواع مختلف بایت‌کد مرتبط است. این مقاله سعی نمی کند بایت‌کد مورد استفاده در EVM را به تفصیل شرح دهد ، بلکه اصطلاحاتی را که اعضای جامعه اتریوم هنگام مراجعه به بایت‌کد یک قرارداد هوشمند استفاده می‌کنند را توضیح می دهد.

تایپ کد توصیف شده در این مقاله به شرح زیر است:

  • Creation Bytecode
  • Runtime Bytecode
  • Bytecode
  • Deployed Bytecode
  • Init Code

Creation Bytecode

این کدی است که اکثر مردم هنگام گفتن بایت‌کد به آن اشاره می کنند. این کدی است که runtime bytecode را تولید می کند که شامل منطق سازنده (constructor logic) و پارامترهای constructor یک قرارداد هوشمند است. creation bytecode معادل داده های ورودی تراکنشی است که قرارداد را ایجاد می کند ، مشروط بر اینکه تنها هدف تراکنش ایجاد قرارداد باشد.

هنگامی که یک قرارداد را کامپایل می کنید ، Creation Bytecode برای شما ایجاد می شود. ABI تولید شده توسط ترافل به کد Creation Bytecode اشاره می کند. این همچنین بایت‌کدی است که هنگام کلیک روی “compilation details” برای یک قرارداد در Remix نشان داده می شود.

با استفاده از اطلاعات تایپ Solidity ، Creation Bytecode را می توان بصورت آن‌چین بازیابی کرد . کد سالدیتی برای بازیابی این کد type(ContractName).creationCode است.

Creation Bytecode را می توان با کد getTransactionByHashفراخوانی JSON RPC به صورت آف‌چین بازیابی کرد .

Runtime Bytecode

این کدی است که آن‌چین ذخیره می شود و یک قرارداد هوشمند را توصیف می کند. این کد شامل constructor logic یا constructor parameters از قرارداد نیست، آنچنان که آنها مربوط به کدی که در واقع برای ایجاد قرارداد استفاده می‌شد، نیستند.

با استفاده از یک بلاک مونتاژ(assembly block) و با فراخوانی extcodecopy(a) ، می توان runtime bytecode قرارداد را بصورت آن‌چین بازیابی کرد . هش runtime bytecode از بازگشت extcodehash(a) است . این آپکد با EIP 1052 معرفی شد و در هارد فورک قسطنطنیه گنجانده شد.

این کد را می توان با استفاده از type(ContractName).runtimeCode به صورت آن‌چین بازیابی کرد.

در نهایت ، این کد را می توان با فراخوانی JSON RPC بصورت آف‌چین بازیابی کرد ، getCode .

Bytecode

این باید به عنوان اصطلاح چتر(umbrella) که شامل Runtime Bytecode و بایت کد است ، استفاده شود ، اما بیشتر برای توصیف Runtime Bytecode استفاده می شود.

بایت‌کدی مستقر شده است

این اصطلاح منحصراً توسط ABI های تولید شده توسط ترافل استفاده می شود و به Runtime Bytecodeی قرارداد اشاره دارد. من ندیدم که خارج از این فایلها استفاده شود.

کد اولیه

این کد همان Creation Bytecode است. این کد است که بایت‌کدی را ایجاد می کند که روی زنجیره ذخیره می شود.

این اصطلاح معمولاً در مقاله هایی استفاده می شود که به بایت‌کد مورد نیاز هنگام استفاده از create2 کد کد اشاره می کنند.

نتیجه

به نظر من تنها اصطلاحاتی که باید مورد استفاده قرار گیرند عبارتند از زمان اجرا و بایت کد ، زیرا آنها به صراحت توصیف می کنند که کد چیست. من معتقدم بایت‌کد باید یک اصطلاح چتر باشد که شامل هر دو این اصطلاح فوق باشد.

tl؛ dr - فقط دو تایپ بایت کد در اتریوم وجود دارد اما پنج نام مختلف برای توصیف آنها وجود دارد.

Name Description On-chain Retrival Off-chain Retrieval
Creation بایت‌کد کدی که در زمان اجرا ایجاد می‌شود type(ContractName).creationCode getTransactionByHash
Runtime بایت‌کد کدی که بصورت آنچین ذخیره می شود و یک قرارداد هوشمند را توصیف می کند extcodecopy(a) or type(ContractName).runtimeCode getCode
بایت‌کد Umbrella اصطلاح چتر که هم Creation بایت‌کد و هم Runtime بایت‌کد را شامل می شود بایت‌کد NA NA
Deployed بایت‌کد شبیه runtime بایت‌کد است extcodecopy(a) or type(ContractName).runtimeCode getCode
Init Code شبیه creation بایت‌کد type(ContractName).creationCode getTransactionByHash

توسعه دهندگان اتریوم هنگام نوشتن قراردادهای هوشمند هیچ شکی به بایت کد ندارند. خوشبختانه برای اکثر مواقع ، این کد فقط توسط EVM استفاده می شود و بنابراین نیازی به درک کامل آن توسط ما نیست. با این حال ، تعداد کمی از افراد هستند که این سطح از جزئیات را درک می کنند و می توانند از آن به نفع خود استفاده کنند. یکی از این مثالها سیستم شناسایی Authereum برای قراردادهایی است که توسط کارخانه پروکسی آثریوم(Authereum proxy factory) ایجاد شده است.

نامگذاری پیرامون بایت‌کدی در جامعه اتریوم انجام می‌شود، تنها بر پیچیدگی می افزاید. نام های متفاوتی با انواع مختلف بایت‌کد مرتبط است. این مقاله سعی نمی کند بایت‌کد مورد استفاده در EVM را به تفصیل شرح دهد ، بلکه اصطلاحاتی را که اعضای جامعه اتریوم هنگام مراجعه به بایت‌کد یک قرارداد هوشمند استفاده می‌کنند را توضیح می دهد.

تایپ کد توصیف شده در این مقاله به شرح زیر است:

  • Creation Bytecode
  • Runtime Bytecode
  • Bytecode
  • Deployed Bytecode
  • Init Code

Creation Bytecode

این کدی است که اکثر مردم هنگام گفتن بایت‌کد به آن اشاره می کنند. این کدی است که runtime bytecode را تولید می کند که شامل منطق سازنده (constructor logic) و پارامترهای constructor یک قرارداد هوشمند است. creation bytecode معادل داده های ورودی تراکنشی است که قرارداد را ایجاد می کند ، مشروط بر اینکه تنها هدف تراکنش ایجاد قرارداد باشد.

هنگامی که یک قرارداد را کامپایل می کنید ، Creation Bytecode برای شما ایجاد می شود. ABI تولید شده توسط ترافل به کد Creation Bytecode اشاره می کند. این همچنین بایت‌کدی است که هنگام کلیک روی “compilation details” برای یک قرارداد در Remix نشان داده می شود.

با استفاده از اطلاعات تایپ سالدیتی، Creation Bytecode را می توان بصورت آن‌چین بازیابی کرد . کد سالدیتی برای بازیابی این کد type(ContractName).creationCode است.

Creation Bytecode را می توان با کد getTransactionByHashفراخوانی JSON RPC به صورت آف‌چین بازیابی کرد .

Runtime Bytecode

این کدی است که آن‌چین ذخیره می شود و یک قرارداد هوشمند را توصیف می کند. این کد شامل constructor logic یا constructor parameters از قرارداد نیست، آنچنان که آنها مربوط به کدی که در واقع برای ایجاد قرارداد استفاده می‌شد، نیستند.

با استفاده از یک بلاک مونتاژ(assembly block) و با فراخوانی extcodecopy(a) ، می توان runtime bytecode قرارداد را بصورت آن‌چین بازیابی کرد . هش runtime bytecode از بازگشت extcodehash(a) است . این آپکد با EIP 1052 معرفی شد و در هارد فورک قسطنطنیه گنجانده شد.

این کد را می توان با استفاده از type(ContractName).runtimeCode به صورت آن‌چین بازیابی کرد.

در نهایت ، این کد را می توان با فراخوانی JSON RPC بصورت آف‌چین بازیابی کرد ، getCode .

Bytecode

این باید به عنوان اصطلاح چتر(umbrella) که شامل Runtime Bytecode و Creation Bytecode است استفاده شود ، اما بیشتر برای توصیف Runtime Bytecode استفاده می شود.

Deployed Bytecode

این اصطلاح منحصراً توسط ABI های تولید شده توسط ترافل استفاده می شود و به Runtime Bytecode قرارداد اشاره دارد. من ندیدم که خارج از این فایلها استفاده شود.

Init Code

این کد همان Creation Bytecode است. این کدی است که بایت‌کدی را ایجاد می کند که روی زنجیره ذخیره می شود.

این اصطلاح معمولاً در مقاله هایی استفاده می شود که به بایت‌کد مورد نیاز هنگام استفاده از create2 کد کد اشاره می کنند.

نتیجه

به نظر من تنها اصطلاحاتی که باید مورد استفاده قرار گیرند عبارتند از runtime bytecode و creation bytecode ، زیرا آنها به صراحت توصیف می کنند که کد چیست. من معتقدم بایت‌کد باید یک اصطلاح چتری(umbrella term) باشد که شامل هر دو این اصطلاحات باشد.

3 Likes

سلام ببخشید من چطور میتونم بایت اکانت هش کد را تغییر بدم؟یا اصلا نیازی نیست تغییر بدم؟

@Sarem
سلام ببخشید من چطور میتونم بایت اکانت هش کد را تغییر بدم؟یا اصلا نیازی نیست تغییر بدم؟

سلام دوست عزیز نه بایت کد رو نباید تغییر بدین. با استفاده از کامپایلر اتریوم، کدهای نوشته شده ی سالیدیتی به زبان سطح پایین و قابل فهم برای کامپیوتر که همون بایت کدها هستند تبدیل میشن. و هر گونه تغییر دادن توی اونها، باعث عملکرد اشتباه یا اصلاً اجرا نشدن قرارداد میشه.