Waves سمارٽ اثاثا: ڪارو ۽ اڇو فهرستون، وقفي واپار

Waves سمارٽ اثاثا: ڪارو ۽ اڇو فهرستون، وقفي واپار

پوئين ٻن مضمونن ۾ اسان سمارٽ اڪائونٽس بابت ڳالهايو ۽ انهن کي ڪيئن استعمال ڪري سگهجي ٿو نيلامي منعقد ڪرڻ ۽ وفاداري پروگرام ٺاهڻ لاءِ۽ پڻ مدد مالي اوزار جي شفافيت کي يقيني بڻائي.

هاڻي اسان سمارٽ اثاثن ۽ انهن جي استعمال جي ڪيترن ئي ڪيسن تي نظر ڪنداسين، بشمول اثاثن کي منجمد ڪرڻ ۽ مخصوص پتي تي ٽرانزيڪشن تي پابنديون شامل آهن.

Waves Smart Assets صارفين کي اثاثن تي اسڪرپٽ اوورلي ڪرڻ جي اجازت ڏئي ٿو، سمارٽ اڪائونٽس جي ساڳي ميڪانيڪس جي پٺيان. سمارٽ اثاثو استعمال ڪندي ٺاهيل هر نئين ٽرانزيڪشن جي تصديق ڪئي ويندي پهرين اسڪرپٽ طرفان، ۽ صرف پوءِ بلاڪچين طرفان.

اهو سمارٽ اثاثن ۽ سمارٽ اڪائونٽن جي وچ ۾ هيٺين فرق کي ڌيان ڏيڻ جي قابل آهي:

  1. سمارٽ اثاثن جي ڪوڊ ۾، ثبوت چيڪ ڪرڻ ناممڪن آهي (اسان انهن بابت ڳالهايو پهرين مضمون ۾).
  2. سمارٽ اڪائونٽ ڪوڊ ۾، توهان چيڪ ڪري سگهو ٿا ExchangeTransaction صرف ان صورت ۾ جيڪڏهن توهان جو اڪائونٽ هڪ ميچر اڪائونٽ آهي. ٻي صورت ۾، رڳو حڪم چيڪ ڪيو ويو آهي. سمارٽ اثاثن واري ڪوڊ ۾، توهان سڌو آرڊر چيڪ نه ٿا ڪري سگهو؛ توهان چيڪ ڪري سگهو ٿا ExchangeTransaction، ۽، جيڪڏهن ضروري هجي ته، ان مان آرڊر ڪڍو.
  3. هڪ سمارٽ اثاثو، هڪ سمارٽ اڪائونٽ جي برعڪس، رياست ناهي، پر اسان وٽ اڃا تائين اسڪرپٽ مان اڪائونٽ رياستن تائين رسائي آهي.

سمارٽ اثاثا وڏي پئماني تي معاهدي جي لکڻين کي آسان بڻائي ٿو، ڪيترن ئي ڪيسن تي عملدرآمد کي جامع ۽ خوبصورت بڻائي ٿو.

اثاثو منجمد

هڪ خاص بلاڪ جي اوچائي تائين اثاثن کي منجمد ڪرڻ ٽارگيٽ جي اوچائي، توھان ھيٺ ڏنل سمارٽ اثاثن جي اسڪرپٽ ۾ ھن قدر کي آسان بڻائي سگھو ٿا:

let targetHeight = 1500000
height >= targetHeight
 
height - функция языка, возращающая текущую высоту.

ملائيندڙ مخصوص حالت

هڪ مخصوص ميچر کي گهربل طور مقرر ڪرڻ لاءِ، توهان ان جو پتو سيٽ ڪري سگهو ٿا موڪليندڙ جي طور تي هڪ سمارٽ اثاثو اسڪرپٽ ۾ جيڪو هن طرح نظر اچي ٿو:

match tx {
    case t : ExchangeTransaction =>
        t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
    case _ => true
}

"وائيٽ لسٽ" وصول ڪندڙن جي

ٽوڪن کي موڪلڻ جي اجازت ڏيڻ لاءِ صرف ڪجهه اڪائونٽن ڏانهن - وصول ڪندڙن جي "وائيٽ لسٽ" ٺاهڻ لاءِ - توهان هيٺ ڏنل اسڪيم سان هڪ سمارٽ اثاثو استعمال ڪري سگهو ٿا جيڪو فهرست ۾ شامل ٿيڻ جي جانچ ڪري ٿو:

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
}

حفاظتي سببن ۽ ٻوليءَ جي ثابتي مڪمل ٿيڻ جي ڪري، فهرست ۾ هڪ اڀرندڙ عمل شامل ناهي. تنهن ڪري ان کي ڪنڪريٽ عناصر جي هڪ سيٽ جي طور تي بيان ڪيو ويو آهي.

وصول ڪندڙن جي "ڪارو فهرست".

اهڙي طرح، ڪجهه اڪائونٽن ڏانهن ٽوڪن موڪلڻ کان منع ڪرڻ لاء، توهان ٺاهي سگهو ٿا "ڪارو فهرست". انهي صورت ۾، بلڪل ساڳيو سمارٽ اثاثو استعمال ڪيو ويو آهي، پر پتي سان چيڪ ڪيو ويو آهي انهي کي يقيني بڻائڻ لاء ته اهو بليڪ لسٽ تي نه آهي:

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
}

جاري ڪندڙ جي اجازت سان موڪلڻ

هڪ سمارٽ اثاثو استعمال ڪندي، توهان صرف جاري ڪندڙ جي اجازت سان سمارٽ اثاثو موڪلڻ جو اختيار پڻ سيٽ ڪري سگهو ٿا (عزم/قرض ليبل). جاري ڪندڙ پنهنجي رضامندي جو اظهار ڪري ٿو ٽرانزيڪشن ID کي پنهنجي اڪائونٽ جي حالت ۾ رکڻ سان:

match tx {
  case t : TransferTransaction =>
    let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
    #убеждаемся, что в стейте эмитента содержится ID текущей транзакции
    isDefined(getInteger(issuer, toBase58String(t.id)))
  case _ => false
}

مٽا سٽا صرف ڪجهه سڪن لاءِ

هڪ سمارٽ اثاثو اجازت ڏئي ٿو ته ان کي صرف ڪجهه سڪن لاء مٽائڻ جي اجازت ڏئي ٿي. مثال طور، صرف Bitcoins جي بدلي جي اجازت ڏيڻ لاء، توھان ھيٺ ڏنل ڪوڊ استعمال ڪري سگھو ٿا:

let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
  case t : ExchangeTransaction =>
    t.sellOrder.assetPair.priceAsset == BTCId ||
     t.sellOrder.assetPair.amountAsset == BTCId
  case _ => true
}

اوريڪل کان قيمت سان واپار

سمارٽ اثاثن جي اسڪرپٽ ۾، توهان واپار ڪرڻ جي اجازت مقرر ڪري سگهو ٿا صرف هڪ قابل اعتماد اوريڪل جي حالت ۾ مقرر ڪيل قيمت تي. هتي اهڙي رسم الخط جو هڪ مثال آهي:

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
}

هتي اسان کي هڪ غير واضع نقطي سان منهن ڏيڻو پوي ٿو جڏهن اثاثن جي سڃاڻپ کي جانچيو وڃي ٿو جنهن سان واپار ڪيو ويندو آهي. نقطي اهو آهي ته جيڪڏهن اثاثن جي ID وضاحت نه ڪئي وئي آهي، ته پوء اسان WAVES بابت ڳالهائي رهيا آهيون. اسڪرپٽ ۾، اسان پڪ ڪريون ٿا ته واپار WAVES سان گڏ، بلڪل هن طريقي سان ڪيو ويندو آهي.

مقرر قيمت ۾ واڌارو

توهان هڪ سمارٽ اثاثن لاء هڪ مقرر ڪيل قيمت مقرر ڪري سگهو ٿا، جيڪا ڏنل تناسب ۾ قدم قدم وڌائي ويندي. هتي هڪ اثاثو اسڪرپٽ جو هڪ مثال آهي جنهن جي قيمت 5٪ هر 1000 بلاڪ کان وڌي ويندي:

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
}


وقفي واپار

انهي سان گڏ، اسڪرپٽ جي مهرباني، هڪ سمارٽ اثاثن جو واپار اڳوڻو وقفو تائين محدود ٿي سگهي ٿو. هتي اهڙي رسم الخط جو هڪ مثال آهي:

let startHeight = 10000
let interval = 44000
let limit = 1500
 
match tx {
  case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
    (height - startHeight) % interval < limit
  case _ => true
}

رسم الخط ۾ اسان يقين رکون ٿا ته واپار جي شروعات کان شروعاتي اونچائي کان وڌيڪ نه حد وقفا وقفي جي ڊيگهه فيلڊ ۾ بيان ڪيل بلاڪ جي تعداد جي برابر آهي وقار.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو