
Në dy artikujt e kaluar, ne folëm për llogaritë inteligjente dhe se si ato mund të përdoren , si dhe ndihmojnë .
Tani do të shqyrtojmë asestët inteligjente dhe disa raste të aplikimit të tyre, duke përfshirë ndalimin e aktiveve dhe krijimin e kufizimeve për transaksionet në adresat e caktuara.
AsestĂ«t inteligjente Waves lejojnĂ« pĂ«rdoruesit tĂ« aplikojnĂ« skripta mbi asestĂ«, duke ndjekur tĂ« njĂ«jtĂ«n mekanikĂ« si nĂ« rastin e llogarive inteligjente. Ădo transaksion i ri, i krijuar duke pĂ«rdorur asetin inteligjent, do tĂ« verifikohet fillimisht nga skripta, dhe vetĂ«m pastaj nga blockchain.
Duhet theksuar dallimet e mëposhtme midis aseteve inteligjente dhe llogarive inteligjente:
- Në kodin e asetit inteligjent nuk mund të kryhet një verifikim provash (për të cilat ne folëm ).
- Në kodin e llogarisë inteligjente, mund të kontrolloni ExchangeTransaction vetëm nëse llogaria juaj është një llogari për përputhje. Ndryshe, kontrollohet vetëm porosia. Në kodin e asetit inteligjent, nuk mund të kontrolloni direkt porosinë, por mund të kontrolloni ExchangeTransaction dhe nga ajo për nevojë të nxirrni porosinë.
- Në asetin inteligjent, ndryshe nga llogaria inteligjente, nuk ka gjendje, por ne ende kemi qasje në gjendjet e llogarive nga skripti.
Asetet inteligjente e thjeshtojnë ndjeshëm shkruarjen e kontratave, duke e bërë zbatimin e shumë rasteve të qartë dhe të elegant.
Bllokimi i aktivëve
Për të bllokuar aktivet deri në një lartësi të caktuar blloku targetHeight, thjesht mund të caktoni këtë vlerë në skriptin e asetit inteligjent të mëposhtëm:
let targetHeight = 1500000
height >= targetHeight
height - funksioni i gjuhës që kthen lartësinë aktuale.
Kushti i caktuar për përputhjen
Për të vendosur si dëshiruar një përputhje të caktuar, mund të caktoni adresën e saj si dërgues në skriptin e asetit inteligjent të këtij formati:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
«Lista e bardhë» e marrësve
PĂ«r tĂ« lejuar dĂ«rgimin e tokeneve vetĂ«m nĂ« llogari tĂ« caktuara â pĂ«r tĂ« krijuar njĂ« "listĂ« tĂ« bardhĂ«" tĂ« marrĂ«sve â mund tĂ« pĂ«rdorni njĂ« smart-asset me skemĂ«n e mĂ«poshtme qĂ« verifikon pĂ«rfshirjen nĂ« listĂ«:
match tx {
case t : TransferTransaction =>
let trustedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")
let trustedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K")
let trustedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx")
t.recipient == trustedRecipient1 || t.recipient == trustedRecipient2 || t.recipient == trustedRecipient3
case _ => false
}
Për arsye sigurie dhe provueshmërie të përfundimeve të gjuhës, lista nuk përmban implementimin e një iteratori. Prandaj, ajo është e caktuar si një set i elementeve të caktuara.
"Lista e zezë" e marrësve
Po ashtu, për të ndaluar dërgimin e tokeneve në llogari të caktuara, mund të krijoni një "listë të zezë". Këtë e realizon sërish një smart-asset identik, por me verifikimin e adresës për mos përfshirjen në listën e zezë:
match tx {
case t : TransferTransaction =>
let bannedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")
let bannedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K")
let bannedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx")
t.recipient != bannedRecipient1 && t.recipient != bannedRecipient2 && t.recipient != bannedRecipient3
case _ => false
}
Dërgimi me lejen e emitentit
Me ndihmën e smart-asset-it, gjithashtu mund të vendosni opsionin e dërgimit të smart-asset-it vetëm me miratimin e emetuesit (etiketë angazhimi/borxhi). Emetuesi shpreh dakordësinë e tij duke vendosur ID-në e transaksionit në gjendjen e llogarisë së tij:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#sigurohemi që në gjendjen e emetuesit përmban ID-në e transaksionit aktual
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Këmbimi vetëm për monedha të caktuara
Smart-asset-i lejon miratimin që ta shkëmbeni vetëm për monedha të caktuara. Për shembull, për të lejuar këmbimin vetëm për bitcoin, mund të përdorni këtë kod:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Tregtimi sipas çmimit nga orakulli
Në skriptin e smart-asset-it, mund të përcaktoni lejen për tregtim vetëm sipas çmimit të regjistruar në gjendjen e orakullit të besueshëm. Ja një shembull i këtij skripti:
let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
match tx {
#ndalojmë transferimin e asetëve
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
#sigurohemi që tregtimi bëhet sipas çmimit të caktuar në aktin e orakullit për këtë aset
let correctPrice = e.price == extract(getInteger(oracle, assetId))
#sigurohemi që tregtimi bëhet në këmbim të WAVES
let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset)
correctPrice && correctPriceAsset
case _ => true
}
Këtu ne përballemi me një moment të paqartë gjatë verifikimit të ID-së së asetëve me të cilat bëhet tregti. E vërteta është se, nëse ID-ja e asetëve nuk është e përcaktuar, atëherë bëhet fjalë për WAVES. Në skript, ne sigurohemi që tregtimi bëhet në çift me WAVES, pikërisht në këtë mënyrë.
Rritje e fikstuar e çmimit
ĂshtĂ« e mundur tĂ« vendosni njĂ« çmim fikst qĂ« do tĂ« rritet hap pas hapi nĂ« njĂ« proporcion tĂ« caktuar. Ja njĂ« shembull skripti tĂ« asetĂ«ve, çmimi i tĂ« cilit do tĂ« rritet me 5% çdo 1000 bllokĂ«:
let startPrice = 10
let startHeight = 1000
let interval = 1000
#sa sa sa herë rritet çmimi për një hap
let raise = 5
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
e.price == startPrice + ((height - startHeight) / interval) * (100 + raise) / 100
&& !isDefined(e.sellOrder.assetPair.priceAsset)
case _ => true
}
Tregtimi me intervale
Gjithashtu, falë skriptit, tregtia e asetit inteligjent mund të kufizohet në intervale të përcaktuara paraprakisht. Ja një shembull i tillë skripti:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval true
}
Në skript ne sigurohemi që nga fillimi i tregtisë startHeight nuk ka kaluar më shumë se limit intervalesh. Gjatësia e intervalit është e barabartë me numrin e bllokave të përcaktuar në fushën interval.
Burimi: habr.com
