توسعه قراردادهای هوشمند ارتقا پذیر با متد uups: قسمت دوم

قسمت اول این آموزش را میتوانید از اینجا بخوانید.

در بخش اول درباره شیوه ارتقا پذیری قراردادهای هوشمند خواندیم و یک قرارداد ساده SimpleStorage را نوشتیم. در این قسمت همان قرارداد قبلی را به شیوه UUPS بازنویسی خواهیم کرد و در قسمت بعدی نیز نسخه جدیدی از قرارداد را دیپلوی میکنیم.

برای شروع، نیاز داریم تا یک پروژه جدید truffle بسازیم:

mkdir UUPS_SimpleStorage
cd UUPS_SimpleStorage

# init npm project
npm init -y

# init truffle config
truffle init

----------------------------
# if you use npm
npm i @openzeppelin/contracts-upgradeable
----------------------------
# if you use yarn
yarn add @openzeppelin/contracts-upgradeable

# create a new contract using truffle
truffle create contract SimpleStorageV1

تا اینجا یک پروژه جدید ترافل با یک قرارداد داریم. برای ایجاد قابلیت ارتقا پذیری در فریمورک ترافل باید از تنظیمات migration مختص UUPS استفاده کنیم. برای اینکار ماژول آپگرید uups برای ترافل را نصب و سپس یک migration جدید میسازیم:

----------------------------
# if you use npm
npm i @openzeppelin/truffle-upgrades
----------------------------
# if you use yarn
yarn add @openzeppelin/truffle-upgrades

# create a new migration using truffle
truffle create migration SimpleStorage

اکنون در پوشه migrations بایستی فایل جدید ایجاد شده را باز و ویرایش کنیم. ترجیحا نام فایل را نیز به 2_simple_storage.js تغییر میدهیم و ترافل را تنظیم میکنیم تا با ماژول deployProxy اوپن زپلین قرارداد را دیپلوی کند:


مشاهده کد در github gist
مشاهده کد در bitbucket snippet

ترافل اکنون آماده دیپلوی کردن یک قرارداد هوشمند ارتقا پذیر است. حالا باید قرارداد قبلی خود را به شکل ارتقا پذیر در بیاوریم:

مشاهده کد در github gist
مشاهده کد در bitbucket snippet

برای ایجاد قرارداد ارتقا پذیر، ارث بری از قراردادهای Initializable.sol و UUPSUpgradeable.sol ضروری است. قراداد ما حتما باید یک تابع initialize دارای یک modifier به نام initializer باشد. این تابع در واقع حکم constructor را در قراردادهای معمولی ایفا میکند. دقت کنید که در این قراردادهای ارتقا پذیر حق استفاده از constructor را نداریم و باید مقداردهی اولیه و نیز فراخوانی initializer قراردادهای ارث بری شده نیز در همین تابع صورت گیرد.
بر همین اساس، 2 متد __Ownable_init() و __UUPSUpgradeable_init() را از قراردادهایی که در بالا ذکر شد، در این تابع فراخوانی میکنیم. اکنون قرارداد قابلیت ارتقا پذیری و استفاده از onlyOwner modifier را داراست.
تا اینجا ما یک قرارداد هوشمند ارتقا پذیر داریم و میتوانیم آن را با استفاده از ترافل یا گناش و… دیپلوی کنیم. من شخصا از truffle به این صورت برای دیپلوی قرارداد استفاده میکنم:

# spin-up a truffle development environment
truffle develop

# deploy on dev env
'truffle(develop)>' migrate

میتوانید با قرارداد ارتباط برقرار کنید و مقادیر را در آن بنویسید یا بخوانید (این آموزش، یک آموزش پایه نیست بنابراین فرض شده که شما میدانید چگونه از طریق کامندلاین با قرارداد دیپلوی شده ارتباط برقرار کنید).

آدرس قرارداد دیپلوی شده رو یک گوشه یادداشت کنید بعدا کارش داریم :wink:
در قسمت بعدی آموزش، یک متد جدید به قرارداد اضافه میکنیم و دوباره دیپلوی میکنیم…

1 پسندیده