Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Әрі қарай, біз Move тілінің негізгі сипаттамаларын егжей -тегжейлі қарастырамыз және оның ақылды келісімшарттардың басқа танымал тілінен - ​​Solidity (Ethereum платформасында) айырмашылығы неде екенін егжей -тегжейлі қарастырамыз. Материал қол жетімді 26 беттен тұратын ақ қағазды зерттеуге негізделген.

Кіріспе

Move — пайдаланушы транзакцияларын және смарт келісімшарттарды орындау үшін пайдаланылатын орындалатын байт код тілі. Екі тармаққа назар аударыңыз:

  1. Move-бұл виртуалды машинада Move тікелей орындалатын байт-код тілі болса да, Solidity (Ethereum-дың ақылды келісімшарт тілі)-бұл EVM-де (Ethereum Virtual Machine) орындалмас бұрын байт-кодқа жинақталатын жоғары деңгейлі тіл.
  2. Move тек ақылды келісімшарттарды жүзеге асыру үшін ғана емес, сонымен қатар реттелетін транзакциялар үшін де қолданылуы мүмкін (бұл туралы толығырақ кейінірек), ал Solidity-ақылды келісімшартқа арналған тіл.


Аударманы INDEX Protocol жобасының тобы жүзеге асырды. Біз аударып қойғанбыз Таразы жобасын сипаттайтын үлкен материал, енді Move тілін толығырақ қарастыратын кез келді. Аударма Хабраузермен бірлесіп жүргізілді салқын

Жылжыту функциясының негізгі ерекшелігі сызықтық логикаға негізделген семантикасы бар реттелетін ресурс түрлерін анықтау мүмкіндігі болып табылады: ресурс ешқашан көшірілмейді немесе жанама түрде жойылмайды, тек жылжытылады. Функционалды түрде бұл Rust тілінің мүмкіндіктеріне ұқсас. Rust ішіндегі мәндерді бір уақытта тек бір атқа тағайындауға болады. Басқа атқа мән тағайындау оны алдыңғы атаумен қолжетімсіз етеді.

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Мысалы, келесі код үзіндісі қате жібереді: Жылжытылған 'x' мәнін қолдану. Себебі, Рустада қоқыс жинау жоқ. Айнымалылар ауқымнан шыққанда, олар жады да босатылады. Қарапайым тілмен айтқанда, деректердің бір ғана «иесі» болуы мүмкін. Бұл мысалда x бастапқы иесі, содан кейін y жаңа иесі болады. Бұл мінез-құлық туралы толығырақ мына жерден оқыңыз.

Ашық жүйелерде цифрлық активтерді ұсыну

Сандық түрде көрсету қиын физикалық активтердің екі қасиеті бар:

  • Сирек (Жетіспеушілік, бастапқыда тапшылық). Жүйедегі активтердің санын (эмиссиясын) бақылау керек. Қолданыстағы активтерді қайталауға тыйым салу керек, ал жаңаларын құру - бұл артықшылықты операция.
  • Кіруді бақылау... Жүйеге қатысушы қатынауды бақылау саясатын қолдана отырып активтерді қорғай білуі керек.

Физикалық активтер үшін табиғи болып табылатын бұл екі сипаттаманы, егер біз оларды активтер ретінде қарастырғымыз келсе, цифрлық объектілерге енгізілуі керек. Мысалы, сирек кездесетін металл - табиғи жетіспеушілігі бар, және оған сіз ғана қол жеткізе аласыз (мысалы, оны қолыңызда ұстаңыз) және оны сатуға немесе жұмсауға болады.

Бұл екі мүлікке қалай жеткенімізді көрсету үшін келесі сөйлемдерден бастайық:

№1 ұсыныс: тапшылықсыз және қатынауды басқарусыз ең қарапайым ереже

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

  • G [K]: = n кілт арқылы қол жетімді нөмірге жаңартуды білдіреді К жаһандық блокчейн күйінде, жаңа мағынада n.
  • транзакция Алиса, 100 Алисаның шотындағы балансты 100 -ге қоюды білдіреді.

Жоғарыда келтірілген шешімде бірнеше маңызды мәселелер бар:

  • Алиса жөнелту арқылы шексіз монеталарды ала алады транзакция «Алиса, 100».
  • Алиса Бобқа жіберетін тиындар пайдасыз, өйткені Боб өзіне дәл осындай техниканы қолдана отырып, шексіз монеталар жібере алады.

№2 ұсыныс: Тапшылықты ескеру

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Енді біз монеталар саны болуы үшін жағдайды бақылап отырмыз Ka кем дегенде тең болды n аударым операциясы алдында. Алайда, бұл тапшылық мәселесін шешсе де, Алисаның монеталарын кім жібере алатыны туралы ақпарат жоқ (әзірше мұны кез келген адам жасай алады, ең бастысы - соманы шектеу ережесін бұзбау).

№3 ұсыныс: тапшылық пен кіруді бақылауды біріктіру

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Біз бұл мәселені ЭЦҚ механизмімен шешеміз тексеру_тіркеу балансты тексермес бұрын, бұл Элис транзакцияға қол қою үшін өзінің жеке кілтін қолданады және оның монеталардың иесі екенін растайды.

Блокчейн бағдарламалау тілдері

Қолданыстағы блокчейн тілдері келесі проблемаларға тап болады (олардың барлығы Move бағдарламасында шешілген (ескерту: өкінішке орай, мақала авторы өзінің салыстыруларында Ethereum -ге ғана жүгінеді, сондықтан оларды тек осы контекстте қабылдаған жөн. Мысалы, келесілердің көпшілігі EOS -те шешіледі.)))

Активтерді жанама түрде ұсыну. Актив бүтін сан арқылы кодталады, бірақ бүтін сан активпен бірдей емес. Шын мәнінде, Bitcoin/Ether/<Кез келген монета> ұсынатын түрі немесе мәні жоқ! Бұл активтерді пайдаланатын бағдарламаларды жазуды қиындатады және қателесуге бейім. Активтерді процедураларға жіберу немесе құрылымдарда сақтау сияқты үлгілер тілден арнайы қолдауды қажет етеді.

Жетіспеушілікті кеңейту мүмкін емес... Тіл бір ғана жетіспейтін активті білдіреді. Сонымен қатар, тапшылыққа қарсы құралдар тікелей тілдің семантикасына енгізілген. Әзірлеуші, егер ол жеке актив құрғысы келсе, ресурстың барлық аспектілерін мұқият бақылауы керек. Бұл дәл Ethereum ақылды келісімшарттарының проблемалары.

Пайдаланушылар ERC-20 таңбалауыштарын құндылықты да, жалпы жеткізуді де анықтау үшін бүтін сандарды қолдана отырып шығарады. Жаңа таңбалауыштар жасалған кезде, ақылды келісімшарт коды эмиссиялық ережелердің сақталуын дербес тексеруі керек. Сонымен қатар, активтерді жанама түрде ұсыну кейбір жағдайларда елеулі қателіктерге әкеледі - қайталану, екі есе жұмсау немесе тіпті активтердің толық жоғалуы.

Икемді қатынауды басқарудың болмауы... Қолдануды басқарудың жалғыз саясаты - бұл асимметриялық криптографияны қолданатын қол қою схемасы. Жетіспеушілікті қорғау сияқты қол жеткізуді бақылау саясаты тілдің семантикасына терең енген. Бірақ бағдарламашыларға кіруді бақылау саясатын анықтауға мүмкіндік беру үшін тілді қалай кеңейту керек - бұл өте күрделі мәселе.

Бұл ақылды келісім-шарттарда қол жеткізуді басқару үшін жергілікті криптографиялық қолдау жоқ Ethereum-ға да қатысты. Әзірлеушілер рұқсатты басқаруды қолмен орнатуы керек, мысалы, onlyOwner модификаторын пайдаланып.

Мен Ethereum-ның үлкен жанкүйері болсам да, қауіпсіздік мақсаттары үшін активтердің қасиеттеріне тілде қолдау көрсету керек деп есептеймін. Атап айтқанда, Эфирді смарт келісімшартқа көшіру динамикалық жіберуді қамтиды, ол қайта кіру осалдықтары ретінде белгілі қателердің жаңа сыныбын енгізді. Мұндағы динамикалық жіберу кодтың орындалу логикасы компиляция уақытында (статикалық) емес, орындалу уақытында (динамикалық) анықталатынын білдіреді.

Осылайша, Solidity бағдарламасында, А келісімшарты В келісіміндегі функцияны шақырған кезде, В келісімшарты А келісімшартының әзірлеушісі арнамаған кодты іске қоса алады, бұл қайта кіру осалдықтары (А келісім-шарты шоттағы қалдықтар нақты шегерілгенге дейін ақшаны алу үшін кездейсоқ В келісім-шартының рөлін атқарады).

Move тіл дизайнының негіздері

Бірінші ретті ресурстар

Жоғары деңгейде Move тіліндегі модульдер / ресурстар / процедуралар арасындағы өзара әрекеттестік OOP тілдеріндегі сыныптар / объектілер мен әдістер арасындағы қатынасқа өте ұқсас.
Жылжыту модульдері басқа блокчейндердегі ақылды келісімшарттарға ұқсас. Модуль жарияланған ресурстарды құру, жою және жаңарту ережелерін анықтайтын ресурстардың түрлері мен процедураларын жариялайды. Бірақ мұның бәрі тек конвенциялар («jargon») Қозғалыста. Біз бұл мәселені сәл кейінірек түсіндіреміз.

Икемділік

Move сценарий арқылы Libra-ға икемділік қосады. Libra-дағы әрбір транзакция сценарийді қамтиды, ол транзакцияның негізгі процедурасы болып табылады. Сценарий бір көрсетілген әрекетті орындай алады, мысалы, алушылардың көрсетілген тізіміне төлемдерді немесе басқа ресурстарды қайта пайдалана алады - мысалы, жалпы логика көрсетілген процедураны шақыру арқылы. Сондықтан Move транзакция сценарийлері үлкен икемділікті ұсынады. Сценарий бір реттік және қайталанатын әрекеттерді де пайдалана алады, ал Ethereum тек қайталанатын сценарийлерді орындай алады (смарт келісімшарт әдісі бойынша бір әдісті шақырады). Оның «қайта пайдалануға болатын» деп аталу себебі, смарт келісім-шарттың функциялары бірнеше рет орындалуы мүмкін. (Ескерту: Мұндағы мәселе өте нәзік. Бір жағынан, псевдобайткод түріндегі транзакция сценарийлері Bitcoin-де де бар. Екінші жағынан, менің түсінуімше, Move бұл тілді толыққанды смарт келісімшарт тілі деңгейіне дейін кеңейтеді.).

Қауіпсіздік

Move орындалатын пішімі байт код болып табылады, ол бір жағынан ассемблер тіліне қарағанда жоғары деңгейлі тіл, бірақ бастапқы кодқа қарағанда төмен деңгей. Байт-код байт-код тексерушісі арқылы ресурстар, түрлер және жад қауіпсіздігі үшін орындалу уақытында (тізбекте) тексеріледі, содан кейін интерпретатор орындайды. Бұл тәсіл Move бағдарламасына бастапқы кодтың қауіпсіздігін қамтамасыз етуге мүмкіндік береді, бірақ компиляция процесінсіз және жүйеге компиляторды қосу қажеттілігінсіз. Move байт-код тілін жасау - бұл өте жақсы шешім. Оны Solidity сияқты дереккөзден құрастырудың қажеті жоқ және компилятор инфрақұрылымына ықтимал сәтсіздіктер немесе шабуылдар туралы алаңдаудың қажеті жоқ.

Тексеру

Біз тексерулерді мүмкіндігінше оңай орындауға бағытталғанбыз, өйткені мұның бәрі тізбекте жасалады (ескерту: желіде, әрбір транзакцияны орындау кезінде, сондықтан кез келген кідіріс бүкіл желінің баяулауына әкеледі), дегенмен, бастапқыда тіл дизайны тізбектен тыс статикалық тексеру құралдарын пайдалануға дайын. Бұл тиімдірек болса да, әзірге тексеру құралдарын әзірлеу (жеке құралдар жинағы ретінде) болашаққа кейінге қалдырылды, енді тек орындау уақытында (тізбекте) динамикалық тексеруге қолдау көрсетіледі.

Модульдік

Жылжыту модульдері деректерді алуды қамтамасыз етеді және ресурстардағы маңызды операцияларды локализациялайды. Модуль ұсынған инкапсуляция, Move типті жүйемен қамтамасыз етілген қорғаныспен бірге, модуль типтерінде орнатылған қасиеттер модульден тыс кодпен бұзылмайтындығына кепілдік береді. Бұл абстракцияның жақсы ойластырылған дизайны, яғни келісімшарттағы деректерді тек келісім шеңберінде ғана өзгертуге болады, бірақ сыртқы емес.

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Жылжыту

Транзакция сценарийінің мысалы бағдарламашының модульден тыс зиянды немесе абайсыз әрекеттері модуль ресурстарының қауіпсіздігіне нұқсан келтірмейтінін көрсетеді. Әрі қарай, Libra блокчейнін бағдарламалау үшін модульдер, ресурстар мен процедуралар қалай қолданылатыны туралы мысалдарды қарастырамыз.

Тең-тең бойынша төлемдер

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Сомада көрсетілген монеталардың саны жіберушінің балансынан алушыға аударылады.
Мұнда бірнеше жаңа нәрсе бар (қызыл түспен белгіленген):

  • 0x0: модуль сақталатын шоттың мекенжайы
  • валюта: модуль атауы
  • монета: ресурс түрі
  • Процедура арқылы қайтарылған монетаның мәні 0x0.Currency.Coin түріндегі ресурстық мән болып табылады
  • жылжу (): мәнді қайтадан пайдалану мүмкін емес
  • көшірме (): мәнін кейін қолдануға болады

Кодты талдаңыз: бірінші қадамда жіберуші аталған процедураны шақырады жіберушіден_қабылдау ішінде сақталған модульден 0x0.Валюта. Екінші қадамда жіберуші монета ресурсының мәнін модульдің депозиттік процедурасына жылжыту арқылы алушыға ақша аударады. 0x0.Валюта.

Мұнда тексерулер қабылдамайтын кодтағы қателердің үш мысалы келтірілген:
Қоңырауды өзгерту арқылы қаражатты қайталаңыз жылжыту (тиын) туралы көшірме (монета). Ресурстарды тек жылжытуға болады. Ресурс санын қайталауға әрекет жасау (мысалы, қоңырау шалу арқылы көшірме (монета) жоғарыдағы мысалда) байт -кодты тексеру кезінде қатеге әкеледі.

Көрсету арқылы қаражатты қайта пайдалану жылжыту (тиын) екі рет . Жолды қосу 0x0.Currency.deposit (көшірме (кейбір_басқа_төлем), жылжыту (тиын)) мысалы, жоғарыда аталғандар жіберушіге монеталарды екі рет «жұмсауға» мүмкіндік береді - бірінші рет алушымен, екіншісі басқа_төлеуші. Бұл физикалық активпен мүмкін емес жағымсыз мінез-құлық. Бақытымызға орай, Move бұл бағдарламаны қабылдамайды.

Бас тартуға байланысты қаражаттың жоғалуы жылжыту (тиын). Ресурсты жылжытпасаңыз (мысалы, бар жолды жою арқылы жылжыту (тиын)), байт кодты тексеру қатесі жіберіледі. Бұл Move бағдарламашыларын ақшаны кездейсоқ немесе зиянды жоғалтудан қорғайды.

Валюта модулі

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Әрбір тіркелгіде 0 немесе одан да көп модуль (тіктөртбұрыштар ретінде көрсетілген) және бір немесе бірнеше ресурс мәндері (цилиндрлер ретінде көрсетілген) болуы мүмкін. Мысалы, шот 0x0 модульді қамтиды 0x0.Валюта және ресурс түрінің мәні 0x0.Currency.Coin. Мекенжайдағы шот 0x1 екі ресурс пен бір модуль бар; Мекенжайдағы шот 0x2 екі модуль және бір ресурс мәні бар.

Кейбір сәттер:

  • Транзакция сценарийі атомдық болып табылады - ол толығымен орындалады немесе мүлде орындалмайды.
  • Модуль – жаһандық қолжетімді кодтың ұзақ өмір сүретін бөлігі.
  • Жаһандық күй хэш-кесте ретінде құрылымдалған, мұнда кілт тіркелгі мекенжайы болып табылады
  • Тіркелгілерде берілген түрдегі бір ресурс мәнінен көп емес және берілген аты бар бір модульден артық болмауы керек (шот 0x0 қосымша ресурсты қамтуы мүмкін емес 0x0.Currency.Coin немесе басқа модуль деп аталады валюта)
  • Жарияланған модульдің мекенжайы түрдің бөлігі болып табылады (0x0.Currency.Coin и 0x1.Currency.Coin бір-бірінің орнына қолдануға болмайтын бөлек түрлер)
  • Бағдарламашылар өздерінің реттелетін ресурсын анықтау арқылы тіркелгіде осы ресурс түрінің бірнеше данасын сақтай алады - (ресурс TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Ресурсқа қайшылықтарсыз оның аты бойынша сілтеме жасай аласыз, мысалы, пайдалану арқылы екі ресурсқа сілтеме жасай аласыз TwoCoins.c1 и TwoCoins.c2.

Монета ресурсы туралы хабарландыру

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі
Модуль аталды валюта және аталған ресурс түрі монета

Кейбір сәттер:

  • монета бір типті өрісі бар құрылым болып табылады u64 (64 биттік таңбасыз бүтін сан)
  • Тек модуль процедуралары валюта түрінің мәндерін жасай немесе жоя алады монета.
  • Басқа модульдер мен сценарийлер тек модуль қамтамасыз ететін жалпы процедуралар арқылы мән өрісін жаза немесе сілтеме жасай алады.

Депозитті сату

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Бұл процедура ресурсты қабылдайды монета кіріс ретінде және оны ресурспен біріктіреді монетаалушының шотында сақталады:

  1. Coin кіріс ресурсын жою және оның мәнін жазу.
  2. Алушының есептік жазбасында сақталған бірегей Coin ресурсына сілтеме алу.
  3. Монеталар санының мәнін процедураны шақыру кезінде параметрде берілген мән бойынша өзгерту.

Кейбір сәттер:

  • Қаптаманы ашыңыз, BorrowGlobal - кірістірілген процедуралар
  • Қаптаманы ашу Бұл T түріндегі ресурсты жоюдың жалғыз жолы. Процедура ресурсты кіріс ретінде қабылдайды, оны жояды және ресурс өрістерімен байланысты мәнді қайтарады.
  • BorrowGlobal мекенжайды кіріс ретінде қабылдайды және сол мекенжай арқылы жарияланған (меншіктелген) T бірегей данасына сілтемені қайтарады
  • &mut Монета бұл ресурсқа сілтеме монета

Жіберушіден_шығаруды жүзеге асыру

Dive into Move - Facebook-тің Libra блокчейн бағдарламалау тілі

Бұл процедура:

  1. Бірегей ресурсқа сілтеме алады монета, жіберушінің есептік жазбасымен байланыстырылған
  2. Ресурстың мәнін төмендетеді монета сілтеме арқылы көрсетілген сомаға
  3. Жаңа ресурс жасайды және қайтарады монета жаңартылған теңгеріммен.

Кейбір сәттер:

  • салым кез келген адам себеп болуы мүмкін, бірақ жіберушіден_қабылдау тек қоңырау шалушы шоттың монеталарына қол жеткізе алады
  • GetTxnSenderAddress ұқсас msg.sender беріктікте
  • Қабылдамау ұқсас талап беріктікте. Бұл тексеру орындалмаса, транзакция тоқтатылады және барлық өзгерістер кері қайтарылады.
  • Пакет бұл сонымен қатар T түріндегі жаңа ресурс жасайтын кірістірілген процедура.
  • Сонымен қатар Қаптаманы ашу, Пакет ресурс сипатталған модуль ішінде ғана шақырылуы мүмкін T

қорытынды

Біз Move тілінің негізгі сипаттамаларын қарастырдық, оны Ethereum-пен салыстырдық, сонымен қатар сценарийлердің негізгі синтаксисімен таныстық. Ақырында, мен тексеруді ұсынамын түпнұсқа ақ қағаз. Ол бағдарламалау тілін жобалау принциптеріне қатысты көптеген мәліметтерді, сондай-ақ көптеген пайдалы сілтемелерді қамтиды.

Ақпарат көзі: www.habr.com

пікір қалдыру