Մշակող Քրիստոֆ Վերդոն խոսում է առցանց դասընթացի մասին.», որը նա վերջերս է անցել:

Մի փոքր պատմիր քո մասին։ Ի՞նչն էր ձեզ հետաքրքրում այս դասընթացում:
Ես զբաղվում եմ վեբ մշակմամբ մոտ 15 տարի, հիմնականում որպես ֆրիլանսեր:
Բանկային խմբի համար զարգացող երկրների համար երկարաժամկետ ռեգիստրի համար վեբ հավելված մշակելիս ես կանգնած էի դրա մեջ բլոկչեյն սերտիֆիկացումն ինտեգրելու խնդրի առաջ: Այն ժամանակ ես շատ բան չգիտեի բլոկչեյնի սերտիֆիկացման մասին, թեև արդեն հետաքրքրված էի կրիպտո տեխնոլոգիաներով, հիմնականում որպես ներդրող։
Արդյունքում այս գործառույթը չիրականացվեց, բայց մտածելով, որ կազմակերպություններն ու բանկերը շահագրգռված են իրենց հայտերի նման լուծումով, ես սկսեցի ուսումնասիրել խնդիրը և շուտով գործարկեցի նախագիծը։ .
Ես մշակեցի դրա բետա տարբերակը, որն արդեն հասանելի է mainnet-ում: Այն ժամանակ [Waves ծրագրավորման լեզու] Ride-ը չկար, այնպես որ ես ամեն ինչ անում էի ամենապարզ ձևով՝ օգտագործելով թարգմանչական գործարքներ տեղադրված JSON-ով։ Բայց հիմնական նպատակը Ride-ի գործարկումից հետո ավելի առաջադեմ գործառույթներ ավելացնելն էր: Եվ սա է հիմնական պատճառը, թե ինչու ես միացա դասընթացին. նախագծի զարգացման հաջորդ փուլը ներառում էր ապակենտրոնացված հավելվածի ստեղծումը (dApp):
Դասընթացի ո՞ր կողմերն եք համարել ամենահեշտը և որոնք են ամենադժվարը:
Ամենապարզն այն էր, որ մենք բավական ժամանակ ունեինք բոլոր առաջադրանքների համար: Դասընթացի իմաստը ինչ-որ բան սովորելն է, այլ ոչ թե միմյանց հետ մրցել։ Բացատրությունները շատ մատչելի էին, իսկ նկարազարդումները՝ պարզ, բայց համապարփակ: Սա օգնեց պատկերացնել և հասկանալ տարբեր թեմաներ:
Առաջադրանքները կատարելիս մեզ խրախուսում էին ինքնուրույն մտածել և երբեմն ինքնուրույն ինչ-որ բան ուսումնասիրել: Սա լավագույն միջոցն է՝ սովորելու և հասկանալու դասի ընթացքում ընդգրկված գաղափարները:
Մի քանի անգամ ես լիովին չէի հասկանում տեսական մասը, մինչև որ սկսեցի գրել կոդ՝ առաջադրանք կատարելիս: Մեզ թույլ չէին տալիս «copy/paste» անել, մենք պետք է ինքներս գրեինք ամբողջ ծածկագիրը, և դա նաև օգնեց մեզ ամեն ինչ ավելի լավ հասկանալու:
Ամենադժվարն այն էր, որ բազմակի ընտրությամբ առաջադրանքի հարցերը միշտ չէ, որ պարզ էին։ Իմ անգլերենը կատարյալ չէ, իսկ հարցերը գրված էին ոչ մայրենի լեզվով, ուստի երբեմն թյուրիմացություններ էին լինում:
Թերևս դասընթացի այն մասը, որը նվիրված է օրակուլներին և NFT-ներին, կարող է ավելի մանրամասն լինել: Բայց, ամեն դեպքում, դասընթացի հիմնական նպատակը ծրագրավորողներին հետաքրքրելն է։ Այնուհետև դրա բոլոր ասպեկտները լիովին հասկանալու համար, իհարկե, պետք է որոշ ժամանակ ծախսեք փորձերի և պրակտիկայի վրա:
Կպատմե՞ք մեզ ավելին այն լուծման մասին, որի վրա աշխատել եք դասընթացի ընթացքում՝ «Կտրոնների բազար»: Կարո՞ղ եմ տեսնել նաև կոդերի օրինակներ:
Այո, մենք աշխատել ենք «Կտրոնների շուկայի» վրա, սա շուկա է, որտեղ մարդիկ վաճառում և գնում են կտրոններ, որոնք նրանց իրավունք են տալիս ավելի ցածր գնով գնել ապրանքներ և ծառայություններ: Յուրաքանչյուր կտրոն ներկայացված է թվային ակտիվով, որն առաջարկում է հատուկ զեղչ մատակարարից:

Ծրագրի մի քանի բաղադրիչներ պետք է մշակվեն: Նախ անհրաժեշտ էր ստեղծել մատակարարների գրանցման և կտրոնների կառավարման համակարգ։ Այնուհետև մեզ անհրաժեշտ էր ստուգման գործառույթ և օգտատերերի համար կտրոններ որոնելու հնարավորություն:

Դասընթացի ընթացքում մենք նաև ավելացրեցինք մի քանի նոր հնարավորություններ, այդ թվում՝ քվեարկության համակարգ և հնարավորություն, որը թույլ է տալիս ստուգել և սև ցուցակագրել մատակարարներին:
Նախ, մենք սովորեցինք խելացի ակտիվների, խելացի հաշիվների և dApp հաշիվների տարբերությունը և ստուգիչ գործառույթների հետ աշխատելու հիմունքները: Ստուգիչ գործառույթները թույլ են տալիս փոխել ձեր հաշվի լռելյայն վարքագիծը: Լռելյայնորեն նրանք ստուգում են գործարքների ստորագրությունները, սակայն ստուգիչի հատկությունը թույլ է տալիս սահմանել այլ «կանոններ»:
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M'
@Verifier(tx)
funcverify() = {
matchtx {
cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey)
cased: DataTransaction=>true
case_ =>false
}
}Հետո սկսեցինք կտրոններ ավելացնել։ Մենք օգտագործեցինք dApp-ի ամենակարևոր գործառույթներից մեկը, որը թույլ է տալիս բլոկչեյնում գրանցել ցանկացած տեսակի տվյալներ բանալի-արժեք զույգերի տեսքով՝ տվյալների գործարք: Մենք այն համակցեցինք նոր գործարքի՝ invokeScript-ի հետ, որն օգտագործվում է dApp-ում բլոկչեյնից դուրս կանչվող ֆունկցիա կանչելու համար:
Դասընթացի ընթացքում մեր օգտագործած տվյալների գործարքի տեսակը շուկայում կտրոններ ավելացնելն էր.
letdatajson = {
"title": "t-shirt with , vote 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universe",
"description": "I want you to make love, not war, i know you've heard it before",
"image": "https://bit.ly/2EXTghg"
}
it('add item', asyncfunction(){
letts = invokeScript({
dApp: dappAddress,
call:{
function:"addItem",
args:[
{ type:"string", value: datajson.title },
{ type:"integer", value: datajson.coupon_price },
{ type:"string", value: JSON.stringify(datajson) }
]},
payment: []
}, accountSupplierSeed)
lettx = awaitbroadcast(ts)
awaitwaitForTx(tx.id)
})Այս տվյալները addItem ֆունկցիայի միջոցով մշակելու և գնումների գործառույթը և այլ տարբերակներ մշակելու համար մենք օգտագործել ենք կանչվող ֆունկցիա, որը օգտատերը կարող է զանգահարել բլոկչեյնից դուրս։ Արդյունքում, այն կարող է կատարել տարբեր առաջադրանքներ, ինչպիսիք են միջոցների փոխանցումը նախաձեռնելը, dApp տվյալների պահեստում տվյալների գրելը կամ թարմացումը և այլն:
Ահա addItem ֆունկցիայի մեջ օգտագործվող կանչված ֆունկցիայի օրինակ.
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("purchase amount cannot be less than item price")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}Մենք հետագայում մշակեցինք քվեարկության համակարգ, որը թույլ է տալիս քվեարկել որոշակի ապրանքներ գովազդելու կամ հեռացնելու համար: Քվեարկության գործընթացի վրա դրսի ազդեցությունը կանխելու համար այն օգտագործում է «Հանձնարարել-բացահայտել» սխեման:
«Կատարել» փուլն օգտագործվում է կոդավորված ձայները հավաքելու համար՝ օգտագործելով հեշ ֆունկցիան և «աղը»:
«Բացահայտման» փուլն օգտագործվում է կոդավորված ձայներ հավաքելու և դրանց հեշերը համեմատելու համար։
Ահա այստեղ օգտագործվող կանչված ֆունկցիայի օրինակ.
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >=VOTERS) thenthrow("reached max num of voters")
elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist")
elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
])
}
}
>Էլ ի՞նչ սովորեցիք դասընթացից:
Դասընթացը ներառում էր նաև նշանավորում և չփոխարինվող նշաններ (NFT)՝ նշաններ, որոնք ներկայացնում են եզակի բան և, հետևաբար, փոխանակելի չեն:
Վերջին դասը նվիրված էր պատգամներին։ Քանի որ բլոկչեյնը չի կարող տվյալներ ստանալ արտաքին աշխարհից, մեզ պետք են օրակուլներ՝ այս տվյալները նրան ուղարկելու համար:
Մեր շուկայի համար օրակուլներ էին անհրաժեշտ՝ ստուգելու և, անհրաժեշտության դեպքում, սև ցուցակագրելու մատակարարին, ով, օրինակ, չէր ընդունում վաճառված կտրոնը:
Ահա մի օրինակ.
funcgetExtValueItemWhiteListStatus(item:String) = {
item +"_verifier_status"
}
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "verified"
letBLACKLISTED = "blacklist"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
letaccount = toBase58String(i.caller.bytes)
if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
Ո՞րն էր ձեզ համար ամենաօգտակարը:
Ամենաօգտակար մասը առաջադրանքներն են։ Նրանց շնորհիվ դասախոսության նյութը դարձավ ավելի պարզ, իսկ նոր ձեռք բերված գիտելիքները համախմբվեցին փորձի ու սխալի միջոցով։ Գործնական աշխատանք , и .
Ինչպե՞ս եք նախատեսում ձեր սովորածը գործնականում կիրառել:
Հենց սկզբից ես ակնկալում էի, որ դասընթացը կօգնի իմ նախագիծը բարձրացնել հաջորդ մակարդակ: Գաղափարն այն էր, որ հիմա գրվեր կոդը RIDE-ում: Առկա տարբերակն արդեն ունի փաստաթղթերի հավաստագրման գործառույթներ, սակայն RIDE-ի շնորհիվ այն կարող է զգալիորեն բարելավվել: Նոր տարբերակը կլինի ավելի ճկուն և ինտուիտիվ և կունենա ավելի շատ հնարավորություններ, այդ թվում՝ նամակների հավաստագրում, բազմակողմ համաձայնագրեր և այլն:
Դասընթացը նաև մտածելու տեղիք տվեց և ինձ շատ նոր գաղափարներ տվեց: Վստահ եմ, որ արդյունքները կշարունակեն ի հայտ գալ ապագայում։
Source: www.habr.com
