Dive into Move - Facebookтун Libra блокчейн программалоо тили

Андан кийин, биз Move тилинин негизги мүнөздөмөлөрүн жана акылдуу келишимдер үчүн популярдуу башка тилден эмнеси менен айырмаланарын карап чыгабыз - Solidity (Ethereum платформасында). Материал 26 беттен турган онлайн баракчанын изилдөөсүнө негизделген.

тааныштыруу

Move - бул колдонуучу транзакцияларын жана акылдуу контракттарды аткаруу үчүн колдонулган аткарылуучу байт-код тили. Сураныч, эки пунктка көңүл буруңуз:

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


Которууну INDEX Protocol долбоорунун командасы ишке ашырган. Биз буга чейин которгонбуз Libra долбоорун сүрөттөгөн чоң материал, азыр Move тилин бир аз майда-чүйдөсүнө чейин карап чыгууга убакыт келди. Котормо Хабраузер менен биргеликте ишке ашырылган салкын

Кыймылдын негизги өзгөчөлүгү сызыктуу логикага негизделген семантика менен ыңгайлаштырылган ресурс түрлөрүн аныктоо мүмкүнчүлүгү болуп саналат: ресурс эч качан көчүрүлүп же кыйыр түрдө жок кылынбайт, бир гана жылдырылбайт. Функционалдык жактан бул Rust тилинин мүмкүнчүлүктөрүнө окшош. Rust'тун маанилери бир эле учурда бир атка ыйгарылышы мүмкүн. Башка атка маани ыйгаруу аны мурунку ат менен жеткиликсиз кылат.

Dive into Move - Facebookтун Libra блокчейн программалоо тили

Мисалы, төмөнкү код үзүндүсү ката кетирет: Көчүрүлгөн 'x' маанисин колдонуу. Себеби, Руста таштанды чогултуу жок. Качан өзгөрмөлөр масштабдан чыкканда, алар айткан эс да бошойт. Жөнөкөй сөз менен айтканда, маалыматтын бир гана "ээси" болушу мүмкүн. Бул мисалда x баштапкы ээси болуп саналат, андан кийин y жаңы ээси болуп калат. Бул жүрүм-турум тууралуу бул жерден окуңуз.

Ачык тутумдарда санарип активдерди көрсөтүү

Санариптик түрдө көрсөтүү кыйын болгон физикалык активдердин эки касиети бар:

  • сейрек (Тартыштык, башында тартыштык). Системанын активдеринин саны (эмиссия) көзөмөлгө алынышы керек. Учурдагы активдерди кайталоого тыюу салынышы керек, ал эми жаңыларын түзүү - бул артыкчылыктуу иш.
  • Кирүүнү көзөмөлдөө... Системанын катышуучусу кирүүнү башкаруу саясатын колдонуу менен активдерди коргоого жөндөмдүү болушу керек.

Физикалык активдер үчүн табигый болгон бул эки мүнөздөмө, эгерде биз аларды актив катары карагыбыз келсе, санарип объектилер үчүн ишке ашырылышы керек. Мисалы, сейрек кездешүүчү металл табигый тартыштыкка ээ жана ага сиз гана киресиз (мисалы, колуңузда кармап) жана аны сатсаңыз же сарптай аласыз.

Бул эки касиетке кантип жеткенибизди көрсөтүү үчүн, төмөнкү сүйлөмдөр менен баштайлы:

Сунуш # 1: Тартыштык жана кирүүнү көзөмөлдөө жок эң жөнөкөй эреже

Dive into Move - Facebookтун Libra блокчейн программалоо тили

  • G [K]: = n ачкыч аркылуу жеткиликтүү санды жаңыртууну билдирет К жаңы мааниси менен blockchain глобалдык абалында n.
  • бүтүм "Алиса, 100" Алисанын эсебиндеги балансты 100гө коюуну билдирет.

Жогорудагы чечимдин бир нече негизги көйгөйлөрү бар:

  • Алиса жөн эле жөнөтүү менен чексиз сандагы монеталарды ала алат бүтүм "Алиса, 100".
  • Элис Бобго жөнөткөн тыйындар эч нерсеге жарабайт, анткени Боб өзүнө ушул эле ыкманы колдонуу менен чексиз монеталарды жөнөтө алган.

Сунуш # 2: Тартыштыкты эске алуу

Dive into Move - Facebookтун Libra блокчейн программалоо тили

Азыр биз монеталардын саны ушунчалык абалды көзөмөлдөп жатабыз Ka жок дегенде бирдей болгон n өткөрүп берүү бүтүм алдында. Бирок, бул тартыштык көйгөйүн чечсе да, Алисанын монеталарын ким жөнөтө алары тууралуу маалымат жок (азырынча муну ким кыла алат, эң башкысы - сумманы чектөө эрежесин бузбоо).

Сунуш # 3: Жетишпегендикти жана жетүүнү көзөмөлдөөнү айкалыштыруу

Dive into Move - Facebookтун Libra блокчейн программалоо тили

Биз бул маселени санарип кол тамга механизми менен чечебиз текшерүү_сиг балансты текшерүүдөн мурун, Алиса транзакцияга кол коюу жана анын монеталарынын ээси экенин ырастоо үчүн жеке ачкычын колдонот дегенди билдирет.

Blockchain программалоо тилдери

Учурдагы blockchain тилдери төмөнкү көйгөйлөргө туш болушат (алардын баары Moveда чечилген (эскертүү: тилекке каршы, макаланын автору Ethereumга өзүнүн салыштырууларында гана кайрылат, андыктан аларды ушул контекстте гана алууга арзыйт. Мисалы, төмөнкүлөрдүн көбү EOSто чечилет.)))

Активдерди кыйыр түрдө көрсөтүү. Актив бүтүн сан аркылуу коддолгон, бирок бүтүн сан актив менен бирдей эмес. Чынында, Bitcoin / Этер / <Ар кандай Монета> өкүлү эч кандай түрү же мааниси жок! Бул активдерди колдонгон программаларды жазууну кыйындатат жана ката кетирет. Активдерди процедураларга өткөрүү же структураларда активдерди сактоо сыяктуу үлгүлөр тилден өзгөчө колдоону талап кылат.

Тартыштыкты кеңейтүү мүмкүн эмес... Тил бир гана жетишпеген мүлктү билдирет. Мындан тышкары, тартыштыктан коргоо каражаттары тилдин семантикасына түздөн -түз киргизилген. Иштеп чыгуучу, эгерде ал бажы активин түзгүсү келсе, ресурстун бардык аспектилерин кылдат көзөмөлдөшү керек. Бул так Ethereum акылдуу келишимдердин көйгөйлөрү.

Колдонуучулар ERC-20 токендерин, бүтүн сандарды колдонуп, наркын да, жалпы сунушту да аныкташат. Жаңы энбелгилер түзүлгөндө, акылдуу келишим коду эмиссиянын эрежелеринин сакталышын өз алдынча текшериши керек. Мындан тышкары, активдерди кыйыр түрдө көрсөтүү кээ бир учурларда олуттуу каталарга алып келет - кайталануу, эки эсе сарптоо, ал тургай активдерди толук жоготуу.

Жеткиликтүүлүктү ийкемдүү башкаруунун жоктугу... Бүгүнкү күндө колдонулуп жаткан кирүүнү башкаруу саясаты асимметриялык криптографияны колдонгон кол коюу схемасы. Жетишсиздикти коргоо сыяктуу эле, кирүүнү башкаруу саясаты тилдин семантикасына терең сиңирилген. Бирок тилди программисттерге кирүүнү көзөмөлдөө саясатын аныктоого кантип кеңейтүү керек, бул көбүнчө өтө татаал иш.

Бул акылдуу контракттарда кирүү мүмкүнчүлүгүн көзөмөлдөө үчүн түпнуска криптографиялык колдоо жок Ethereum боюнча да туура. Иштеп чыгуучулар, мисалы, onlyOwner модификаторун колдонуу менен, кирүү көзөмөлүн кол менен орнотуулары керек.

Мен Ethereumдун чоң күйөрманы болсом да, мен активдердин касиеттери коопсуздук максатында тил тарабынан колдоого алынышы керек деп эсептейм. Атап айтканда, Этерди акылдуу келишимге өткөрүү динамикалык жөнөтүүнү камтыйт, ал кайра кирүү алсыздыктары деп аталган жаңы класстын мүчүлүштүктөрүн киргизди. Динамикалык жөнөтүү бул жерде коддун аткарылышынын логикасы компиляция убагында эмес (статикалык) иштөө убагында (динамикалык) аныкталат дегенди билдирет.

Ошентип, Solidityде, А келишими В келишиминдеги функцияны чакырганда, В келишими А келишиминин иштеп чыгуучусу пландабаган кодду иштетиши мүмкүн, бул кайра кирүү алсыздыктары (Келишим А кокусунан эсептин калдыктары эсептен алынганга чейин акчаны алуу үчүн Б келишими катары иштейт).

Move Language Design негиздери

Биринчи даражадагы ресурстар

Жогорку деңгээлде, Move тилиндеги модулдар / ресурстар / процедуралардын ортосундагы өз ара аракеттенүү OOP тилдериндеги класстар / объекттер жана методдордун ортосундагы мамилеге абдан окшош.
Кыймыл модулдары башка блокчейндеги акылдуу келишимдерге окшош. Модуль жарыяланган ресурстарды түзүү, жок кылуу жана жаңыртуу эрежелерин аныктаган ресурстардын түрлөрүн жана процедураларын жарыялайт. Бирок мунун баары жөн гана конвенциялар ("шарттуу") Кыймылда. Биз бул ойду бир аздан кийин түшүндүрөбүз.

ийкемдүүлүк

Move скрипт аркылуу Libraга ийкемдүүлүк кошот. Таразадагы ар бир транзакцияда транзакциянын негизги процедурасы болгон скрипт камтылган. Скрипт белгилүү бир аракетти аткара алат, мисалы, алуучулардын көрсөтүлгөн тизмесине төлөмдөрдү жасай алат же башка ресурстарды кайра колдоно алат - мисалы, жалпы логика көрсөтүлгөн процедураны чакыруу менен. Мына ошондуктан Move транзакциясынын скрипттери көбүрөөк ийкемдүүлүктү сунуштайт. Скрипт бир жолку жана кайталануучу жүрүм-турумду колдоно алат, ал эми Ethereum кайталануучу скрипттерди гана аткара алат (акылдуу контракт ыкмасы боюнча бир ыкманы чакырат). Анын "кайра колдонулуучу" деп аталышынын себеби, акылдуу келишимдин функциялары бир нече жолу аткарылышы мүмкүн. (Эскертүү: Бул жерде сөз өтө кылдат. Бир жагынан, псевдобайткод түрүндөгү транзакция скрипттери Биткойндо да бар. Башка жагынан алганда, мен түшүнгөндөй, Move бул тилди, чындыгында, толук кандуу акылдуу келишим тилинин деңгээлине чейин кеңейтет.).

коопсуздук

Move аткарылуучу форматы байт код, ал бир жагынан ассемблер тилине караганда жогорку деңгээлдеги тил, бирок баштапкы коддон төмөн деңгээл. Байткод байт-код текшерүүчүсү аркылуу ресурстар, типтер жана эстутум коопсуздугу үчүн иштөө убагында (чынжыр боюнча) текшерилет, андан кийин котормочу тарабынан аткарылат. Бул ыкма Moveга баштапкы коддун коопсуздугун камсыз кылууга мүмкүндүк берет, бирок компиляция процессисиз жана системага компиляторду кошуунун зарылдыгы жок. Move байт-код тилин жасоо чындыгында жакшы чечим. Аны Solidity сыяктуу булактан түзүүнүн кереги жок жана компилятордун инфраструктурасына мүмкүн болгон мүчүлүштүктөр же чабуулдар жөнүндө тынчсыздануунун кереги жок.

Ырасталышы

Биз текшерүүлөрдү мүмкүн болушунча оңой жүргүзүүгө багытталган, анткени мунун баары чынжырчада (эскертүү: онлайн, ар бир бүтүмдүн аткарылышы учурунда, андыктан кандайдыр бир кечигүү бүтүндөй тармактын жайлашына алып келет), бирок, алгач тил дизайны чынжырдан тышкары статикалык текшерүү куралдарын колдонууга даяр. Бул көбүрөөк артыкчылыктуу болсо да, азырынча текшерүү куралдарын иштеп чыгуу (өзүнчө инструмент катары) келечекке жылдырылды жана азыр иштөө убакытында динамикалык текшерүү гана (чынжыр боюнча) колдоого алынат.

Модулдуулук

Жылдыруу модулдары маалыматтарды абстракциялоону камсыз кылат жана ресурстар боюнча маанилүү операцияларды локалдаштырат. Модул тарабынан берилген инкапсуляция, Move түрү системасы тарабынан корголгону менен бирге, модулдун түрлөрүнө коюлган касиеттер модулдун сыртындагы код менен бузулбасын камсыз кылат. Бул абдан жакшы ойлонулган абстракция дизайны, башкача айтканда келишимдин ичиндеги маалыматтар келишимдин алкагында гана өзгөрүшү мүмкүн, бирок сыртта эмес.

Dive into Move - Facebookтун Libra блокчейн программалоо тили

Обзорду жылдыруу

Транзакциянын скриптинин мисалы программисттин модулдан тышкаркы зыяндуу же этиятсыз аракеттери модулдун ресурстарынын коопсуздугуна зыян келтире албастыгын көрсөтөт. Андан кийин, Libra blockchainди программалоо үчүн модулдар, ресурстар жана процедуралар кандай колдонулганын мисалдарды карайбыз.

Peer-to-Peer төлөмдөрү

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. Киргизүү ресурсун жок кылуу Монета жана анын наркын жазуу.
  2. Алуучунун эсебинде сакталган уникалдуу Coin ресурсуна шилтеме алуу.
  3. Процедураны чакырууда Монеталардын санынын маанисин параметрде өткөн мааниге өзгөртүү.

Некоторий учурлар:

  • Unpack, BorrowGlobal - орнотулган процедуралар
  • Таңылганын ачуу Бул T түрүндөгү ресурсту жок кылуунун бирден-бир жолу. Процедура ресурсту киргизүү катары кабыл алып, аны жок кылат жана ресурстун талаалары менен байланышкан маанини кайтарат.
  • BorrowGlobal киргизүү катары даректи алат жана ошол дарек тарабынан жарыяланган (менчиктелген) T уникалдуу инстанциясына шилтемени кайтарат
  • &mut Coin бул ресурска шилтеме тыйын

Жөнөтүүчүдөн_ алып чыгууну ишке ашыруу

Dive into Move - Facebookтун Libra блокчейн программалоо тили

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

  1. Уникалдуу булакка шилтеме алат тыйын, жөнөтүүчүнүн эсебине байланышкан
  2. Ресурстун баасын төмөндөтөт тыйын шилтеме аркылуу көрсөтүлгөн суммага
  3. Жаңы ресурсту түзөт жана кайтарат тыйын жаңыртылган баланс менен.

Некоторий учурлар:

  • депозиттик кимдир бирөө себеп болушу мүмкүн, бирок жөнөтүүчүдөн алып салуу чалуу эсебинин тыйындарына гана мүмкүнчүлүгү бар
  • GetTxnSenderAddress окшош msg.sender Solidity жылы
  • RejectUnless окшош талап кылуу Solidity жылы. Бул текшерүү ишке ашпай калса, транзакция токтотулуп, бардык өзгөртүүлөр артка кайтарылат.
  • Пакет ал ошондой эле Т тибиндеги жаңы ресурсту түзгөн орнотулган процедура.
  • Ошондой эле Таңылганын ачуу, Пакет ресурс сүрөттөлгөн модулдун ичинде гана чакырылышы мүмкүн T

жыйынтыктоо

Биз Move тилинин негизги мүнөздөмөлөрүн карап чыктык, аны Ethereum менен салыштырдык, ошондой эле скрипттердин негизги синтаксиси менен таанышып чыктык. Акыр-аягы, мен абдан текшерип сунуштайбыз оригиналдуу ак кагаз. Ал программалоо тилинин дизайн принциптерине байланыштуу көптөгөн деталдарды, ошондой эле көптөгөн пайдалуу шилтемелерди камтыйт.

Source: www.habr.com

Комментарий кошуу