Orain aktibo adimendunak eta haien erabileraren hainbat kasu aztertuko ditugu, besteak beste, aktiboak izoztea eta zehaztutako helbideetan transakzioen murrizketak sortzea.
Waves Smart Assets-ek erabiltzaileei scriptak gainjar ditzakete aktiboetan, kontu adimendunen mekanika bera jarraituz. Aktibo adimendun bat erabiliz sortutako transakzio berri bakoitza script-ak berretsiko du lehenik, eta gero bloke-kateak.
Azpimarratzekoa da aktibo adimendunen eta kontu adimendunen arteko desberdintasun hauek:
Aktibo adimendun baten kodean, ezinezkoa da frogak egiaztatzea (horiei buruz hitz egin dugu lehen artikuluan).
Kontu adimendunaren kodean, ExchangeTransaction egiazta dezakezu zure kontua pareko kontua bada bakarrik. Bestela, eskaera bakarrik egiaztatuko da. Aktibo adimendunen kodean, ezin duzu eskaera zuzenean egiaztatu; ExchangeTransaction egiazta dezakezu, eta, behar izanez gero, eskaera bat atera.
Aktibo adimendun batek, kontu adimendun batek ez bezala, ez du egoerarik, baina oraindik ere kontu-egoeretarako sarbidea dugu scriptetik.
Aktibo adimendunek asko errazten dute kontratuen idazketa, kasu askoren ezarpena zehatza eta dotorea eginez.
Aktiboak izoztea
Aktiboak blokearen altuera jakin batera izozteko xedeAltuera, balio hau ezar dezakezu ondoko aktibo adimendunaren scriptean:
let targetHeight = 1500000
height >= targetHeight
height - функция языка, возращающая текущую высоту.
Matcher Baldintza Espezifikoa
Parekatzaile zehatz bat nahi den moduan ezartzeko, bere helbidea igorle gisa ezar dezakezu honelako itxura duen aktibo adimendunaren script batean:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
Hartzaileen "zerrenda zuria".
Tokenak kontu jakin batzuetara soilik bidaltzeko - hartzaileen "zerrenda zuria" sortzeko - aktibo adimendun bat erabil dezakezu zerrendan sartzea egiaztatzen duen eskema honekin:
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
}
Segurtasun arrazoiengatik eta hizkuntzaren osotasun frogagarria dela eta, zerrendak ez du iteratzaileen inplementaziorik. Beraz, hormigoizko elementuen multzo gisa definitzen da.
Hartzaileen "zerrenda beltza".
Era berean, zenbait kontutara tokenak bidaltzea debekatzeko, "zerrenda beltza" sor dezakezu. Kasu honetan, aktibo adimendun bera erabiltzen da, baina helbidea egiaztatuta zerrenda beltzean ez dagoela ziurtatzeko:
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
}
Igorlearen baimenarekin bidaltzea
Aktibo adimendun bat erabiliz, aktibo adimendun bat igorlearen baimenarekin soilik bidaltzeko aukera ere ezar dezakezu (konpromisoa/zorra etiketa). Jaulkitzaileak bere baimena adierazten du transakzio IDa bere kontuaren egoeran jarriz:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#убеждаемся, что в стейте эмитента содержится ID текущей транзакции
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Trukatu txanpon batzuengatik soilik
Aktibo adimendun batek txanpon batzuengatik soilik trukatzeko baimena ematen du. Adibidez, Bitcoins trukea soilik baimentzeko, honako kodea erabil dezakezu:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Orakuluaren prezioaren arabera negoziatzea
Aktibo adimendunen scriptean, orakulu fidagarri baten egoeran finkatutako prezioan soilik negoziatzeko baimena ezar dezakezu. Hona hemen horrelako gidoi baten adibide bat:
let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
match tx {
#запрещаем передачу ассета
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
#убеждаемся, что торговля происходит по цене, заданной в стейте оракла для этого ассета
let correctPrice = e.price == extract(getInteger(oracle, assetId))
#убеждаемся, что торговля происходит в обмен на WAVES
let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset)
correctPrice && correctPriceAsset
case _ => true
}
Hemen begi-bistakoa ez den puntu baten aurrean gaude merkataritza egiten den aktiboaren IDa egiaztatzean. Kontua da aktiboaren IDa definituta ez badago, WAVES buruz ari garela. Gidoian, merkataritza WAVESekin batera egiten dela ziurtatzen dugu, zehazki modu honetan.
Prezio finkoaren igoera
Prezio finko bat ezar dezakezu aktibo adimendun baterako, pausoz pauso igoko dena proportzio jakin batean. Hona hemen prezioa 5 bloke bakoitzeko % 1000 igoko den aktibo script baten adibide bat:
let startPrice = 10
let startHeight = 1000
let interval = 1000
#на сколько процентов цена увеличивается за один шаг
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
}
Tartekako merkataritza
Gainera, gidoiari esker, aktibo adimendun baten merkataritza aurrez zehaztutako tarteetara muga daiteke. Hona hemen horrelako gidoi baten adibide bat:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval < limit
case _ => true
}
Gidoian hori ziurtatzen dugu merkataritzaren hasieratik hasierakoAltuera baino gehiago ez muga tarteak. Tartearen luzera eremuan zehaztutako bloke kopuruaren berdina da tarte.