Yerləşdirmədən əvvəl ağıllı müqavilənin ünvanını necə müəyyənləşdirmək olar: kripto mübadiləsi üçün CREATE2 istifadə edərək

Blockchain mövzusu nəinki hər cür şırınga, həm də texnoloji baxımdan çox dəyərli ideyaların mənbəyi olmaqda davam edir. Buna görə də o, günəşli şəhərin sakinlərini yan keçmədi. İnsanlar yaxından baxır, öyrənir, ənənəvi infobazadakı təcrübələrini blokçeyn sistemlərinə keçirməyə çalışırlar. İndiyə qədər, nöqtə baxımından: Rostelecom-Solar-ın inkişaflarından biri blokçeyn əsasında proqram təminatının təhlükəsizliyini yoxlamağa qadirdir. Və bu yolda blokçeyn cəmiyyətinin tətbiqi problemlərinin həlli ilə bağlı bəzi fikirlər yaranır. Bu həyat hiylələrindən biri - CREATE2 istifadə edərək yerləşdirmədən əvvəl ağıllı müqavilənin ünvanını necə müəyyənləşdirmək olar - bu gün mən sizinlə kəsik altında bölüşmək istəyirəm.

Yerləşdirmədən əvvəl ağıllı müqavilənin ünvanını necə müəyyənləşdirmək olar: kripto mübadiləsi üçün CREATE2 istifadə edərək
CREATE2 əməliyyat kodu bu il fevralın 28-də Konstantinopol sərt çəngəlinə əlavə edildi. EIP-də qeyd edildiyi kimi, bu əməliyyat kodu ilk növbədə dövlət kanalları üçün təqdim edilmişdir. Ancaq biz ondan fərqli bir problemi həll etmək üçün istifadə etdik.

Birjada balansı olan istifadəçilər var. Biz hər bir istifadəçiyə Ethereum ünvanı təqdim etməliyik ki, bu ünvana hər kəs token göndərə və bununla da hesabını doldura bilər. Gəlin bu ünvanları “cüzdan” adlandıraq. Tokenlər cüzdanlara gəldikdə, biz onları tək pul kisəsinə (hotwallet) göndərməliyik.

Növbəti bölmələrdə mən CREATE2 olmadan bu problemin həlli variantlarını təhlil edirəm və onlardan niyə imtina etdiyimizi izah edirəm. Əgər sizi yalnız yekun nəticə maraqlandırırsa, onu Yekun Həll bölməsində tapa bilərsiniz.

Ethereum ünvanları

Ən sadə həll yolu yeni istifadəçilər üçün yeni ethereum ünvanları yaratmaqdır. Bu ünvanlar pul kisələri olacaq. Tokenləri cüzdandan hotwalletə köçürmək üçün funksiyaya zəng edərək əməliyyatı imzalamalısınız transfer() arxa hissədən pul kisəsinin şəxsi açarı ilə.

Bu yanaşma aşağıdakı üstünlüklərə malikdir:

  • bu yalnız
  • pul kisəsindən hotwallet-ə tokenlərin köçürülməsinin dəyəri funksiyaya zəng etmək qiymətinə bərabərdir transfer()

Bununla belə, biz bu yanaşmadan imtina etdik, çünki onun bir əhəmiyyətli çatışmazlığı var: şəxsi açarları haradasa saxlamaq lazımdır. Və yalnız onların itirilə biləcəyi deyil, həm də bu açarlara girişi diqqətlə idarə etməlisiniz. Əgər onlardan ən azı biri pozulubsa, o zaman müəyyən istifadəçinin tokenləri isti cüzdana çatmayacaq.

Yerləşdirmədən əvvəl ağıllı müqavilənin ünvanını necə müəyyənləşdirmək olar: kripto mübadiləsi üçün CREATE2 istifadə edərək

Hər bir istifadəçi üçün ayrıca ağıllı müqavilə yaradın

Hər bir istifadəçi üçün ayrıca ağıllı müqavilənin yerləşdirilməsi, cüzdanlardan şəxsi açarları serverdə saxlamamağa imkan verir. Birja, tokenləri hotwallet-ə köçürmək üçün bu ağıllı müqaviləyə zəng edəcək.

İstifadəçiyə ağıllı bir müqavilə tətbiq etmədən pul kisəsinin ünvanını göstərmək mümkün olmadığı üçün bu həlli də tərk etdik (bu, əslində mümkündür, lakin burada müzakirə etməyəcəyimiz digər çatışmazlıqlarla olduqca mürəkkəb bir şəkildə). Birjada istifadəçi ehtiyac duyduğu qədər hesab yarada bilər və hər kəsin öz pul kisəsi lazımdır. Bu o deməkdir ki, istifadəçinin bu hesabdan istifadə edəcəyinə belə əmin olmadan müqavilənin tətbiqinə pul xərcləməliyik.

Əməliyyat kodu CREATE2

Əvvəlki metodun problemini həll etmək üçün CREATE2 əməliyyat kodundan istifadə etmək qərarına gəldik. CREATE2, ağıllı müqavilənin yerləşdiriləcəyi ünvanı əvvəlcədən müəyyən etməyə imkan verir. Ünvan aşağıdakı düsturla hesablanır:

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


harada:

  • ünvan — CREATE2 çağıracaq ağıllı müqavilənin ünvanı
  • duz - təsadüfi dəyər
  • init_code - yerləşdirmə üçün ağıllı müqavilə bayt kodu

Bu, istifadəçiyə təqdim etdiyimiz ünvanın həqiqətən istədiyiniz bayt kodunu ehtiva etməsini təmin edir. Həmçinin, bu ağıllı müqavilə ehtiyac duyduğumuz zaman tətbiq edilə bilər. Məsələn, istifadəçi cüzdanından ilk dəfə istifadə etmək qərarına gəldikdə.
Yerləşdirmədən əvvəl ağıllı müqavilənin ünvanını necə müəyyənləşdirmək olar: kripto mübadiləsi üçün CREATE2 istifadə edərək
Üstəlik, ağıllı müqavilə ünvanını saxlamaq əvəzinə hər dəfə hesablaya bilərsiniz, çünki:

  • ünvan düsturda pul kisəsi fabrikimizin ünvanı olduğu üçün sabitdir
  • duz - user_id hash
  • init_code eyni cüzdandan istifadə etdiyimiz üçün daimidir

Daha çox təkmilləşdirmələr

Əvvəlki həllin hələ də bir çatışmazlığı var: ağıllı müqavilənin yerləşdirilməsi üçün ödəniş etməlisiniz. Bununla belə, ondan qurtula bilərsiniz. Bunun üçün funksiyanı çağıra bilərsiniz transfer()və sonra özünü məhv et() cüzdan konstruktorunda. Və sonra smart müqavilənin yerləşdirilməsi üçün qaz geri qaytarılacaq.

Məşhur inancın əksinə olaraq, CREATE2 əməliyyat kodu ilə eyni ünvana bir neçə dəfə ağıllı müqavilə yerləşdirə bilərsiniz. Bunun səbəbi, CREATE2-nin hədəf ünvanının sıfır olduğunu yoxlayır (konstruktorun əvvəlində ona "1" qiyməti təyin olunur). Eyni zamanda, funksiya özünü məhv et() hər dəfə nonce ünvanı sıfırlayır. Beləliklə, eyni arqumentlərlə CREATE2-ni yenidən çağırsanız, bir dəfə yoxlanılacaq.

Nəzərə alın ki, bu həll ethereum ünvan həllinə bənzəyir, lakin şəxsi açarları saxlamağa ehtiyac yoxdur. Pul kisəsindən hotwalletə pul köçürmə dəyəri təxminən bir funksiyaya zəng etmək qiymətinə bərabərdir transfer(), çünki biz ağıllı müqavilənin yerləşdirilməsi üçün pul ödəmirik.

Son qərar

Yerləşdirmədən əvvəl ağıllı müqavilənin ünvanını necə müəyyənləşdirmək olar: kripto mübadiləsi üçün CREATE2 istifadə edərək

Əvvəlcə hazırlanır:

  • duz əldə etmək funksiyası user_id
  • CREATE2 əməliyyat kodunu müvafiq duzla çağıracaq ağıllı müqavilə (məsələn, pul kisəsi fabriki)
  • aşağıdakı konstruktorla müqaviləyə uyğun olan pul kisəsinin bayt kodu:

constructor () {
    address hotWallet = 0x…;
    address token = 0x…;
    token.transfer (hotWallet, token.balanceOf (address (this)));
    selfdestruct (address (0));
}


Hər bir yeni istifadəçi üçün hesablayaraq pul kisəsinin ünvanını göstəririk

keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]


İstifadəçi tokenləri müvafiq pul kisəsi ünvanına köçürdükdə, bizim backend parametrlə Transfer hadisəsini görür. _topul kisəsinin ünvanına bərabərdir. Bu nöqtədə, pul kisəsini yerləşdirməzdən əvvəl istifadəçinin birjada balansını artırmaq artıq mümkündür.

Pul kisəsinin ünvanında kifayət qədər token yığıldıqda, biz onların hamısını bir anda hotwallet-ə köçürə bilərik. Bunu etmək üçün arxa plan aşağıdakı hərəkətləri yerinə yetirən ağıllı müqavilə fabriki funksiyasını çağırır:

function deployWallet (соль uint256) {
    bytes memory walletBytecode =…;
    // invoke CREATE2 with wallet bytecode and salt
}


Beləliklə, pul kisəsinin smart müqavilə konstruktoru çağırılır, o, bütün tokenlərini hotwallet ünvanına köçürür və sonra özünü məhv edir.

Tam kodu tapa bilərsiniz burada. Nəzərə alın ki, bu, bizim istehsal kodumuz deyil, çünki biz pul kisəsinin bayt kodunu optimallaşdırmağa və onu əməliyyat kodlarına yazmağa qərar verdik.

Müəllif Pavel Kondratenkov, Ethereum mütəxəssisi

Mənbə: www.habr.com

Добавить комментарий