فقط دو تایپ بایت کد در اتریوم وجود دارد اما پنج نام مختلف برای توصیف آنها وجود دارد.*
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) باشد که شامل هر دو این اصطلاحات باشد.