వేవ్స్ స్మార్ట్ ఖాతాల అప్లికేషన్: వేలం నుండి బోనస్ ప్రోగ్రామ్‌ల వరకు

వేవ్స్ స్మార్ట్ ఖాతాల అప్లికేషన్: వేలం నుండి బోనస్ ప్రోగ్రామ్‌ల వరకు

బ్లాక్‌చెయిన్ తరచుగా క్రిప్టోకరెన్సీలతో మాత్రమే అనుబంధించబడుతుంది, అయితే DLT సాంకేతికత యొక్క అప్లికేషన్ యొక్క ప్రాంతాలు చాలా విస్తృతంగా ఉంటాయి. బ్లాక్‌చెయిన్ వినియోగానికి అత్యంత ఆశాజనకమైన ప్రాంతాలలో ఒకటి స్మార్ట్ ఒప్పందం, ఇది స్వయంచాలకంగా అమలు చేయబడుతుంది మరియు దానిలోకి ప్రవేశించిన పార్టీల మధ్య నమ్మకం అవసరం లేదు.

రైడ్ - స్మార్ట్ ఒప్పందాల కోసం ఒక భాష

వేవ్స్ స్మార్ట్ కాంట్రాక్టుల కోసం ఒక ప్రత్యేక భాషను అభివృద్ధి చేసింది - RIDE. దీని పూర్తి డాక్యుమెంటేషన్ ఉంది ఇక్కడ. మరియు ఇక్కడ - ఈ అంశంపై వ్యాసం Habr న.

RIDE ఒప్పందం ఒక సూచన మరియు అవుట్‌పుట్‌గా "నిజం" లేదా "తప్పు"ని అందిస్తుంది. దీని ప్రకారం, లావాదేవీ బ్లాక్‌చెయిన్‌లో నమోదు చేయబడుతుంది లేదా తిరస్కరించబడుతుంది. స్మార్ట్ ఒప్పందం పేర్కొన్న షరతుల నెరవేర్పుకు పూర్తిగా హామీ ఇస్తుంది. RIDEలో ఒప్పందం నుండి లావాదేవీలను రూపొందించడం ప్రస్తుతం సాధ్యం కాదు.

నేడు రెండు రకాల వేవ్స్ స్మార్ట్ కాంట్రాక్టులు ఉన్నాయి: స్మార్ట్ ఖాతాలు మరియు స్మార్ట్ ఆస్తులు. స్మార్ట్ ఖాతా అనేది సాధారణ వినియోగదారు ఖాతా, అయితే అన్ని లావాదేవీలను నియంత్రించే స్క్రిప్ట్ దాని కోసం సెట్ చేయబడింది. స్మార్ట్ ఖాతా స్క్రిప్ట్ ఇలా ఉండవచ్చు, ఉదాహరణకు:

match tx {
  case t: TransferTransaction | MassTransferTransaction => false
  case _ => true
}

tx అనేది ప్రాసెస్ చేయబడుతున్న లావాదేవీ, ఇది బదిలీ లావాదేవీ కానట్లయితే మాత్రమే నమూనా సరిపోలిక మెకానిజంను ఉపయోగించడానికి మేము అనుమతిస్తాము. లావాదేవీ రకాన్ని తనిఖీ చేయడానికి RIDEలో నమూనా సరిపోలిక ఉపయోగించబడుతుంది. ఇప్పటికే ఉన్న అన్ని ఖాతాలను స్మార్ట్ ఖాతా స్క్రిప్ట్‌లో ప్రాసెస్ చేయవచ్చు లావాదేవీ రకాలు.

స్క్రిప్ట్ వేరియబుల్స్‌ని కూడా డిక్లేర్ చేయగలదు, కండిషన్‌లను పూర్తిగా తనిఖీ చేయడం కోసం “if-then-else” నిర్మాణాలు మరియు ఇతర పద్ధతులను ఉపయోగించవచ్చు. ఒప్పందాలను అమలు చేయడం ప్రారంభమయ్యే ముందు సులభంగా అంచనా వేయగల ఒప్పందాలు నిరూపితమైన సంపూర్ణత మరియు సంక్లిష్టత (ఖర్చు) కలిగి ఉన్నాయని నిర్ధారించడానికి, RIDEలో లూప్‌లు లేదా జంప్ స్టేట్‌మెంట్‌లు ఉండవు.

వేవ్స్ ఖాతాల యొక్క ఇతర లక్షణాలు "స్టేట్" ఉనికిని కలిగి ఉంటాయి, అంటే ఖాతా యొక్క స్థితి. మీరు డేటా లావాదేవీలను (డేటా ట్రాన్సాక్షన్) ఉపయోగించి ఖాతా స్థితికి అనంతమైన జతల (కీ, విలువ) వ్రాయవచ్చు. ఈ సమాచారాన్ని REST API ద్వారా మరియు నేరుగా స్మార్ట్ ఒప్పందంలో ప్రాసెస్ చేయవచ్చు.

ప్రతి లావాదేవీ రుజువుల శ్రేణిని కలిగి ఉంటుంది, అందులో పాల్గొనేవారి సంతకం, అవసరమైన లావాదేవీ యొక్క ID మొదలైనవాటిని నమోదు చేయవచ్చు.

RIDE ద్వారా పని చేస్తోంది ఇక్కడ ఒప్పందం యొక్క సంకలన వీక్షణను చూడటానికి మిమ్మల్ని అనుమతిస్తుంది (అది కంపైల్ చేయబడితే), కొత్త ఖాతాలను సృష్టించండి మరియు దాని కోసం స్క్రిప్ట్‌లను సెట్ చేయండి, అలాగే కమాండ్ లైన్ ద్వారా లావాదేవీలను పంపండి.

ఖాతాను సృష్టించడం, దానిపై స్మార్ట్ ఒప్పందాన్ని ఇన్‌స్టాల్ చేయడం మరియు లావాదేవీలను పంపడం వంటి పూర్తి చక్రం కోసం, మీరు REST APIతో పరస్పర చర్య చేయడానికి లైబ్రరీని కూడా ఉపయోగించవచ్చు (ఉదాహరణకు, C#, C, Java, JavaScript, Python, Rust, Elixir) . IDEతో పని చేయడం ప్రారంభించడానికి, కొత్త బటన్‌ను క్లిక్ చేయండి.

స్మార్ట్ కాంట్రాక్టులను ఉపయోగించే అవకాశాలు విస్తృతంగా ఉన్నాయి: లావాదేవీలను నిషేధించడం నుండి నిర్దిష్ట చిరునామాలకు ("బ్లాక్ లిస్ట్") సంక్లిష్టమైన dAppల వరకు.

ఇప్పుడు వ్యాపారంలో స్మార్ట్ కాంట్రాక్టుల ఉపయోగం యొక్క నిర్దిష్ట ఉదాహరణలను చూద్దాం: వేలం, భీమా మరియు లాయల్టీ ప్రోగ్రామ్‌లను రూపొందించేటప్పుడు.

వేలంపాటలు

విజయవంతమైన వేలం కోసం షరతుల్లో ఒకటి పారదర్శకత: పాల్గొనేవారు బిడ్‌లను మార్చడం అసాధ్యం అని నమ్మకంగా ఉండాలి. బ్లాక్‌చెయిన్‌కు కృతజ్ఞతలు తెలుపుతూ ఇది సాధించవచ్చు, ఇక్కడ అన్ని పందాలు మరియు అవి చేసిన సమయం గురించి మార్పులేని డేటా పాల్గొనే వారందరికీ అందుబాటులో ఉంటుంది.

వేవ్స్ బ్లాక్‌చెయిన్‌లో, వేలం ఖాతా స్థితిలో డేటాట్రాన్సాక్షన్ ద్వారా బిడ్‌లను రికార్డ్ చేయవచ్చు.

మీరు బ్లాక్ నంబర్‌లను ఉపయోగించి వేలం ప్రారంభ మరియు ముగింపు సమయాన్ని కూడా సెట్ చేయవచ్చు: వేవ్స్ బ్లాక్‌చెయిన్‌లో బ్లాక్ జనరేషన్ యొక్క ఫ్రీక్వెన్సీ సుమారుగా సమానంగా ఉంటుంది 60 సెకన్లు.

1. ఇంగ్లీష్ ఆరోహణ ధర వేలం

ఆంగ్ల వేలంలో పాల్గొనేవారు ఒకరికొకరు పోటీగా వేలం వేస్తారు. ప్రతి కొత్త పందెం తప్పనిసరిగా మునుపటిదాని కంటే ఎక్కువగా ఉండాలి. చివరి బిడ్ కంటే ఎక్కువ బిడ్డర్లు లేనప్పుడు వేలం ముగుస్తుంది. ఈ సందర్భంలో, అత్యధిక బిడ్డర్ తప్పనిసరిగా పేర్కొన్న మొత్తాన్ని అందించాలి.

ఒక వేలం ఎంపిక కూడా ఉంది, దీనిలో విక్రేత లాట్‌కి కనీస ధరను నిర్ణయిస్తాడు మరియు తుది ధర తప్పనిసరిగా దానిని మించి ఉండాలి. లేకపోతే, లాట్ అమ్మబడకుండా మిగిలిపోతుంది.

ఈ ఉదాహరణలో, మేము వేలం కోసం ప్రత్యేకంగా సృష్టించిన ఖాతాతో పని చేస్తున్నాము. వేలం వ్యవధి 3000 బ్లాక్‌లు మరియు లాట్ యొక్క ప్రారంభ ధర 0,001 వేవ్‌లు. ఒక పాల్గొనే వ్యక్తి "ధర" కీ మరియు వారి బిడ్ విలువతో డేటా లావాదేవీని పంపడం ద్వారా బిడ్ వేయవచ్చు.

కొత్త బిడ్ ధర తప్పనిసరిగా ఈ కీ కోసం ప్రస్తుత ధర కంటే ఎక్కువగా ఉండాలి మరియు పాల్గొనే వారి ఖాతాలో కనీసం [new_bid + కమిషన్] టోకెన్‌లు ఉండాలి. బిడ్డర్ యొక్క చిరునామా తప్పనిసరిగా డేటా ట్రాన్సాక్షన్‌లోని "పంపినవారు" ఫీల్డ్‌లో నమోదు చేయబడాలి మరియు ప్రస్తుత బిడ్ బ్లాక్ ఎత్తు తప్పనిసరిగా వేలం వ్యవధిలో ఉండాలి.

వేలం ముగింపులో పాల్గొనే వ్యక్తి అత్యధిక ధరను నిర్ణయించినట్లయితే, అతను పేర్కొన్న ధర మరియు కరెన్సీ జతలో సంబంధిత లాట్ కోసం చెల్లించడానికి ఎక్స్ఛేంజ్ లావాదేవీని పంపవచ్చు.

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
match tx {
case d : DataTransaction =>
  #проверяем, задана ли в стейте цена
  let currentPrice = if isDefined(getInteger(this, "price"))
 
                      #извлекаем цену из стейта
                      then extract(getInteger(this, "price"))
                      else startPrice
 
  #извлекаем цену из транзакции
  let newPrice = extract(getInteger(d.data, "price"))
  let priceIsBigger = newPrice > currentPrice
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убеждаемся, что в текущей транзакции два поля и что отправитель совпадает с указанным в транзакции
  let correctFields = size(d.data) == 2 &&      
      d.sender == addressFromString(extract(getString(d.data,"sender")))
  startHeight <= height && height <= finishHeight && priceIsBigger && hasMoney && correctFields
case e : ExchangeTransaction =>
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender"))) #убеждаемся, что лот обменивает тот, кто его выиграл
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
 
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

2. తగ్గుతున్న ధరల డచ్ వేలం

డచ్ వేలంలో, కొనుగోలుదారు చెల్లించడానికి సిద్ధంగా ఉన్న దాని కంటే చాలా ఎక్కువ ధరకు ప్రారంభంలో అందించబడుతుంది. పాల్గొనేవారిలో ఒకరు ప్రస్తుత ధరకు లాట్‌ను కొనుగోలు చేయడానికి అంగీకరించే వరకు ధర అంచెలంచెలుగా తగ్గుతుంది.

ఈ ఉదాహరణలో మేము మునుపటి దానిలో అదే స్థిరాంకాలను ఉపయోగిస్తాము, అలాగే డెల్టా తగ్గినప్పుడు ధర దశను ఉపయోగిస్తాము. ఖాతా స్క్రిప్ట్ పందెంలో పాల్గొనే మొదటి వ్యక్తి కాదా అని తనిఖీ చేస్తుంది. లేకపోతే, బ్లాక్‌చెయిన్ ద్వారా డేటా ట్రాన్సాక్షన్ ఆమోదించబడదు.

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000000
let delta = 100
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
case d : DataTransaction =>
  let currentPrice = startPrice - delta * (height - startHeight)
 
  #извлекаем из поступившей дата-транзакции поле "price"
  let newPrice = extract(getInteger(d.data, "price"))
 
  #убеждаемся, что в стейте текущего аккаунта не содержится поля "sender"
  let noBetsBefore = !isDefined(getInteger(this, "sender"))
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убеждаемся, что в текущей транзакции только два поля
  let correctFields = size(d.data) == 2 && newPrice == currentPrice && d.sender == addressFromString(extract(getString(d.data, "sender")))
  startHeight <= height && height <= finishHeight && noBetsBefore && hasMoney && correctFields
case e : ExchangeTransaction =>
 
  #убеждаемся, что отправитель текущей транзакции указан в стейте аккаунта по ключу sender
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender")))
 
  #убеждаемся, что аmount ассета указан корректно, и что прайс-ассет - waves
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

3. వేలం "ఆల్-పే"

"ఆల్-పే" అనేది వేలం, దీనిలో ఎవరు లాట్‌ను గెలుచుకున్నారనే దానితో సంబంధం లేకుండా పాల్గొనే వారందరూ బిడ్‌ను చెల్లిస్తారు. ప్రతి కొత్త పార్టిసిపెంట్ బిడ్ చెల్లిస్తారు మరియు గరిష్ట బిడ్ చేసిన పార్టిసిపెంట్ లాట్ గెలుస్తారు.

మా ఉదాహరణలో, ప్రతి వేలంలో పాల్గొనేవారు (కీ, విలువ)* = (“విజేత”, చిరునామా), (“ధర”, ధర)తో డేటా ట్రాన్సాక్షన్ ద్వారా బిడ్ వేస్తారు. ఈ పార్టిసిపెంట్ ఇప్పటికే తన సంతకంతో బదిలీ లావాదేవీని కలిగి ఉంటే మరియు అతని బిడ్ మునుపటి అన్నింటి కంటే ఎక్కువగా ఉంటే మాత్రమే అటువంటి డేటా లావాదేవీ ఆమోదించబడుతుంది. ఎండ్‌హెయిట్ చేరుకునే వరకు వేలం కొనసాగుతుంది.

let startHeight = 1000
let endHeight = 2000
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
 case d: DataTransaction =>
   #извлекаем из поступившей дата-транзакции поле "price"
   let newPrice = extract(getInteger(d.data, "price"))
 
   #извлекаем из пруфов транзакции публичный ключ аккаунта
   let pk = d.proofs[1]
   let address = addressFromPublicKey(pk)
 
   #извлекаем транзакцию доказательство из пруфов поступившей дата транзакции
   let proofTx = extract(transactionById(d.proofs[2]))
   
   height > startHeight && height < endHeight
   && size(d.data) == 2
   #убеждаемся, что адрес победителя, извлеченный из текущей транзакции, совпадает с адресом, извлеченным из пруфов
   && extract(getString(d.data, "winner")) == toBase58String(address.bytes)
   && newPrice > extract(getInteger(this, "price"))
   #проверяем, что транзакция подписана
   && sigVerify(d.bodyBytes, d.proofs[0], d.proofs[1])
   #проверяем корректность транзакции, указанной в пруфах
   && match proofTx {
     case tr : TransferTransaction =>
       tr.sender == address &&
       tr.amount == newPrice
     case _ => false
   }
 case t: TransferTransaction =>
 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
 || (
   height > endHeight
   && extract(getString(this, "winner")) == toBase58String((addressFromRecipient(t.recipient)).bytes)
   && t.assetId == token
   && t.amount == 1
 )
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

భీమా / క్రౌడ్ ఫండింగ్

మీరు ఆర్థిక నష్టాలకు వ్యతిరేకంగా వినియోగదారుల ఆస్తులను బీమా చేయాల్సిన పరిస్థితిని పరిశీలిద్దాం. ఉదాహరణకు, టోకెన్ విలువ తగ్గితే, అతను ఈ టోకెన్‌ల కోసం చెల్లించిన పూర్తి మొత్తాన్ని తిరిగి పొందగలడని మరియు సహేతుకమైన బీమా మొత్తాన్ని చెల్లించడానికి సిద్ధంగా ఉంటాడని వినియోగదారు హామీని కోరుకుంటున్నారు.

దీన్ని అమలు చేయడానికి, "భీమా టోకెన్లు" జారీ చేయాలి. అప్పుడు పాలసీదారు ఖాతాలో స్క్రిప్ట్ ఇన్‌స్టాల్ చేయబడుతుంది, కొన్ని షరతులకు అనుగుణంగా ఉన్న ఎక్స్ఛేంజ్ లావాదేవీలను మాత్రమే అమలు చేయడానికి అనుమతిస్తుంది.

రెట్టింపు ఖర్చులను నిరోధించడానికి, మీరు (కీ, విలువ) = (purchaseTransactionId, sellOrderId)తో పాలసీదారు ఖాతాకు డేటా లావాదేవీని పంపమని వినియోగదారుని అభ్యర్థించాలి మరియు ఇప్పటికే ఉపయోగించిన కీతో డేటా లావాదేవీలను పంపడాన్ని నిషేధించాలి.

అందువల్ల, వినియోగదారు రుజువులలో తప్పనిసరిగా బీమా టోకెన్ కొనుగోలు యొక్క లావాదేవీ ID ఉండాలి. కరెన్సీ జత తప్పనిసరిగా కొనుగోలు లావాదేవీలో వలెనే ఉండాలి. ఖరీదు కూడా తప్పనిసరిగా కొనుగోలు సమయంలో నిర్ణయించిన దానితో సమానంగా ఉండాలి, బీమా ధర మైనస్.

బీమా ఖాతా వినియోగదారు నుండి బీమా టోకెన్‌లను అతను కొనుగోలు చేసిన ధర కంటే తక్కువ ధరకు కొనుగోలు చేస్తుందని అర్థం చేసుకోవచ్చు: బీమా ఖాతా ఎక్స్ఛేంజ్ లావాదేవీని సృష్టిస్తుంది, వినియోగదారు ఆర్డర్‌పై సంతకం చేస్తారు (లావాదేవీ సరిగ్గా పూర్తయితే), భీమా ఖాతా రెండవ ఆర్డర్ మరియు మొత్తం లావాదేవీపై సంతకం చేసి బ్లాక్‌చెయిన్‌కు పంపుతుంది.

కొనుగోలు జరగనట్లయితే, వినియోగదారు స్క్రిప్ట్‌లో వివరించిన నియమాల ప్రకారం ExchangeTransactionని సృష్టించవచ్చు మరియు లావాదేవీని బ్లాక్‌చెయిన్‌కు పంపవచ్చు. ఈ విధంగా వినియోగదారు బీమా చేయబడిన టోకెన్ల కొనుగోలు కోసం ఖర్చు చేసిన డబ్బును తిరిగి పొందవచ్చు.

let insuranceToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let freezePeriod = 150000
let insurancePrice = 10000
match tx {
 
 #убеждаемся, что, если поступила дата-транзакция, то у нее ровно одно поле и в стейте еще нет такого ключа
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : ExchangeTransaction =>
 
   #если у транзакции нет седьмого пруфа, проверяем корректность подписи
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
     #если у транзакции есть седьмой пруф, извлекаем из него транзакцию и узнаём её высоту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #обрабатываем транзакцию из пруфа
     match purchaseTx {
       case purchase : ExchangeTransaction =>
         let correctSender = purchase.sender == e.sellOrder.sender
         let correctAssetPair = e.sellOrder.assetPair.amountAsset == insuranceToken &&
                                purchase.sellOrder.assetPair.amountAsset == insuranceToken &&
                                e.sellOrder.assetPair.priceAsset == purchase.sellOrder.assetPair.priceAsset
         let correctPrice = e.price == purchase.price - insurancePrice && e.amount == purchase.amount
         let correctHeight = height > purchaseTxHeight + freezePeriod
 
         #убеждаемся, что в транзакции-пруфе указан верный ID текущей транзакции
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.sellOrder.id
         correctSender && correctAssetPair && correctPrice && correctHeight && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

భీమా టోకెన్‌ను స్మార్ట్ ఆస్తిగా మార్చవచ్చు, ఉదాహరణకు, మూడవ పక్షాలకు దాని బదిలీని నిషేధించడానికి.

క్రౌడ్‌ఫండింగ్ టోకెన్‌ల కోసం కూడా ఈ పథకాన్ని అమలు చేయవచ్చు, అవసరమైన మొత్తం సేకరించబడకపోతే యజమానులకు తిరిగి ఇవ్వబడుతుంది.

లావాదేవీ పన్నులు

అనేక రకాల ఆస్తులతో ప్రతి లావాదేవీపై పన్ను వసూలు చేయడానికి అవసరమైన సందర్భాల్లో కూడా స్మార్ట్ ఒప్పందాలు వర్తిస్తాయి. ఇన్‌స్టాల్ చేయబడిన కొత్త ఆస్తి ద్వారా ఇది చేయవచ్చు స్పాన్సర్షిప్ స్మార్ట్ ఆస్తులతో లావాదేవీల కోసం:

1. మేము FeeCoinని జారీ చేస్తాము, ఇది వినియోగదారులకు నిర్ణీత ధరతో పంపబడుతుంది: 0,01 WAVES = 0,001 FeeCoin.

2. FeeCoin మరియు మార్పిడి రేటు కోసం స్పాన్సర్‌షిప్ సెట్ చేయండి: 0,001 WAVES = 0,001 FeeCoin.

3. స్మార్ట్ ఆస్తి కోసం కింది స్క్రిప్ట్‌ని సెట్ చేయండి:

let feeAssetId = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let taxDivisor = 10
 
match tx {
  case t: TransferTransaction =>
    t.feeAssetId == feeAssetId && t.fee == t.amount / taxDivisor
  case e: ExchangeTransaction | MassTransferTransaction => false
  case _ => true
}

ఇప్పుడు ఎవరైనా N స్మార్ట్ ఆస్తులను బదిలీ చేసిన ప్రతిసారీ, వారు మీకు N/taxDivisor మొత్తంలో FeeCoinని అందిస్తారు (దీనిని మీ నుండి 10 *N/taxDivisor WAVESలో కొనుగోలు చేయవచ్చు), మరియు మీరు మైనర్ N/taxDivisor WAVESని అందిస్తారు. ఫలితంగా, మీ లాభం (పన్ను) 9*N / taxDivisor WAVES అవుతుంది.

మీరు స్మార్ట్ అసెట్ స్క్రిప్ట్ మరియు మాస్ ట్రాన్స్‌ఫర్ ట్రాన్సాక్షన్‌ని ఉపయోగించి కూడా పన్ను విధించవచ్చు:

let taxDivisor = 10
 
match tx {
  case t : MassTransferTransaction =>
    let twoTransfers = size(t.transfers) == 2
    let issuerIsRecipient = t.transfers[0].recipient == addressFromString("3MgkTXzD72BTfYpd9UW42wdqTVg8HqnXEfc")
    let taxesPaid = t.transfers[0].amount >= t.transfers[1].amount / taxDivisor
    twoTransfers && issuerIsRecipient && taxesPaid
  case _ => false
}

క్యాష్‌బ్యాక్ మరియు లాయల్టీ ప్రోగ్రామ్‌లు

క్యాష్‌బ్యాక్ అనేది ఒక రకమైన లాయల్టీ ప్రోగ్రామ్, దీనిలో కొనుగోలుదారు ఒక ఉత్పత్తి లేదా సేవపై ఖర్చు చేసిన మొత్తంలో కొంత భాగాన్ని తిరిగి పొందుతాడు.

స్మార్ట్ ఖాతాను ఉపయోగించి ఈ కేసును అమలు చేస్తున్నప్పుడు, మేము బీమా విషయంలో చేసిన విధంగానే రుజువులను తనిఖీ చేయాలి. రెండుసార్లు ఖర్చు చేయడాన్ని నిరోధించడానికి, క్యాష్‌బ్యాక్‌ను స్వీకరించడానికి ముందు వినియోగదారు తప్పనిసరిగా (కీ, విలువ) = (కొనుగోలు లావాదేవీలు, క్యాష్‌బ్యాక్‌ట్రాన్సాక్షన్ ఐడి)తో డేటా లావాదేవీని పంపాలి.

మేము డేటా ట్రాన్సాక్షన్ ఉపయోగించి ఇప్పటికే ఉన్న కీలపై నిషేధాన్ని కూడా సెట్ చేయాలి. క్యాష్‌బ్యాక్ డివైజర్ - క్యాష్‌బ్యాక్ షేర్‌తో భాగించబడిన యూనిట్. ఆ. క్యాష్‌బ్యాక్ షేర్ 0.1 అయితే, క్యాష్‌బ్యాక్ డివైజర్ 1 / 0.1 = 10.

let cashbackToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
let cashbackDivisor = 10
match tx {
 
 #убеждаемся, что, если поступила дата-транзакция, то у нее ровно одно поле и в стейте еще нет такого ключа
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : TransferTransaction =>
 
   #если у транзакции нет седьмого пруфа, проверяем корректность подписи
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
 
     #если у транзакции есть седьмой пруф, извлекаем из него транзакцию и узнаём её высоту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #обрабатываем транзакцию из пруфа
     match purchaseTx {
       case purchase : TransferTransaction =>
         let correctSender = purchase.sender == e.sender
         let correctAsset = e.assetId == cashbackToken
         let correctPrice = e.amount == purchase.amount / cashbackDivisor
 
         #убеждаемся, что в транзакции-пруфе указан верный ID текущей транзакции
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.id
         correctSender && correctAsset && correctPrice && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

అటామిక్ స్వాప్

అటామిక్ స్వాప్ వినియోగదారులు మార్పిడి సహాయం లేకుండా ఆస్తులను మార్పిడి చేసుకోవడానికి అనుమతిస్తుంది. అటామిక్ స్వాప్‌తో, లావాదేవీలో పాల్గొనే ఇద్దరూ నిర్దిష్ట వ్యవధిలో దాన్ని నిర్ధారించాలి.

లావాదేవీ కోసం కేటాయించిన సమయంలో కనీసం పాల్గొనేవారిలో ఒకరు లావాదేవీ యొక్క సరైన నిర్ధారణను అందించకపోతే, లావాదేవీ రద్దు చేయబడుతుంది మరియు మార్పిడి జరగదు.

మా ఉదాహరణలో, మేము క్రింది స్మార్ట్ ఖాతా స్క్రిప్ట్‌ని ఉపయోగిస్తాము:

let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
 
let beforeHeight = 100000
 
let secret = base58'BN6RTYGWcwektQfSFzH8raYo9awaLgQ7pLyWLQY4S4F5'
match tx {
  case t: TransferTransaction =>
    let txToBob = t.recipient == Bob && sha256(t.proofs[0]) == secret && 20 + beforeHeight >= height
    let backToAliceAfterHeight = height >= 21 + beforeHeight && t.recipient == Alice
    txToBob || backToAliceAfterHeight
  case _ => false
}

తదుపరి ఆర్టికల్‌లో ఆప్షన్‌లు, ఫ్యూచర్‌లు మరియు బిల్లులు వంటి ఆర్థిక సాధనాల్లో స్మార్ట్ ఖాతాల వినియోగాన్ని చూద్దాం.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి