Pag-aplikar sa mga Waves smart account: gikan sa mga subasta hangtod sa mga programa sa bonus

Pag-aplikar sa mga Waves smart account: gikan sa mga subasta hangtod sa mga programa sa bonus

Ang Blockchain kanunay nga nalangkit sa mga cryptocurrencies, apan ang mga lugar sa aplikasyon sa teknolohiya sa DLT labi ka lapad. Usa sa labing gisaad nga mga lugar alang sa paggamit sa blockchain mao ang usa ka intelihente nga kontrata nga awtomatik nga gipatuman ug wala magkinahanglan og pagsalig tali sa mga partido nga misulod niini.

RIDE – usa ka pinulongan alang sa mga smart nga kontrata

Ang mga Waves nakahimo og usa ka espesyal nga pinulongan alang sa mga smart nga kontrata - RIDE. Ang kompleto nga dokumentasyon niini nahimutang dinhi. Ug dinhi- artikulo bahin niini nga topiko sa Habr.

Ang kontrata sa RIDE usa ka predicate ug nagbalik sa "tinuod" o "bakak" isip output. Tungod niini, ang transaksyon mahimong natala sa blockchain o gisalikway. Ang intelihente nga kontrata hingpit nga naggarantiya sa katumanan sa mga piho nga kondisyon. Ang paghimo og mga transaksyon gikan sa usa ka kontrata sa RIDE sa pagkakaron dili mahimo.

Karon adunay duha ka klase sa Waves smart contracts: smart accounts ug smart assets. Ang usa ka intelihenteng account usa ka regular nga account sa gumagamit, apan usa ka script ang gitakda alang niini nga nagkontrol sa tanan nga mga transaksyon. Ang usa ka smart account script mahimong sama niini, pananglitan:

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

Ang tx usa ka transaksyon nga giproseso nga gitugotan namon nga gamiton ang mekanismo sa pagpares sa pattern kung dili kini usa ka transaksyon sa pagbalhin. Ang pattern matching sa RIDE gigamit sa pagsusi sa matang sa transaksyon. Ang tanan nga kasamtangan nga mga account mahimong maproseso sa smart account script matang sa transaksyon.

Mahimo usab nga ipahayag sa script ang mga variable, gamita ang "kon-then-else" nga mga pagtukod ug uban pang mga pamaagi alang sa hingpit nga pagsusi sa mga kondisyon. Aron masiguro nga ang mga kontrata adunay mapamatud-an nga pagkakompleto ug pagkakomplikado (gasto) nga dali matagna sa dili pa magsugod ang pagpatuman sa kontrata, ang RIDE wala’y sulud nga mga loop o mga pahayag sa paglukso.

Ang ubang mga bahin sa mga account sa Waves naglakip sa presensya sa usa ka "estado," nga mao, ang kahimtang sa account. Mahimo nimong isulat ang usa ka walay kinutuban nga gidaghanon sa mga pares (key, bili) sa estado sa account gamit ang mga transaksyon sa datos (DataTransaction). Kini nga impormasyon mahimong maproseso pinaagi sa REST API ug direkta sa smart contract.

Ang matag transaksyon mahimong maglangkob sa daghang mga pruweba, diin ang pirma sa partisipante, ID sa gikinahanglan nga transaksyon, ug uban pa mahimong masulod.

Pagtrabaho uban sa RIDE pinaagi sa HERE nagtugot kanimo nga makita ang gihugpong nga pagtan-aw sa kontrata (kung kini gihugpong), paghimo og bag-ong mga account ug pagtakda og mga script alang niini, ingon man usab sa pagpadala sa mga transaksyon pinaagi sa command line.

Alang sa usa ka bug-os nga siklo, lakip ang paghimo og usa ka account, pag-instalar sa usa ka smart nga kontrata niini ug pagpadala sa mga transaksyon, mahimo ka usab nga mogamit usa ka librarya alang sa pakigsulti sa REST API (pananglitan, C #, C, Java, JavaScript, Python, Rust, Elixir) . Aron magsugod sa pagtrabaho uban sa IDE, i-klik lang ang BAG-O nga buton.

Ang mga posibilidad sa paggamit sa mga smart nga kontrata kay lapad: gikan sa pagdili sa mga transaksyon ngadto sa pipila ka mga adres (β€œitom nga listahan”) ngadto sa mga komplikadong dApps.

Karon atong tan-awon ang piho nga mga pananglitan sa paggamit sa mga smart nga kontrata sa negosyo: sa pagpahigayon sa mga subasta, insurance, ug paghimo sa mga programa sa pagkamaunongon.

Mga subasta

Usa sa mga kondisyon alang sa usa ka malampuson nga subasta mao ang transparency: ang mga partisipante kinahanglan nga masaligon nga imposible ang pagmaniobra sa mga bid. Mahimo kini nga makab-ot salamat sa blockchain, diin ang dili mausab nga datos bahin sa tanan nga mga pusta ug ang oras kung kanus-a kini gihimo magamit sa tanan nga mga partisipante.

Sa Waves blockchain, ang mga bid mahimong marekord sa estado sa auction account pinaagi sa DataTransaction.

Mahimo usab nimo nga itakda ang oras sa pagsugod ug pagtapos sa subasta gamit ang mga numero sa block: ang frequency sa block generation sa Waves blockchain gibana-bana nga katumbas sa 60 segundos.

1. English ascending price auction

Ang mga partisipante sa usa ka subasta sa Ingles nagbutang og mga bid sa kompetisyon sa usag usa. Ang matag bag-ong pusta kinahanglang molapas sa nauna. Ang subasta matapos kung wala nay mga bidder nga molapas sa katapusang bid. Sa kini nga kaso, ang labing taas nga bidder kinahanglan maghatag sa gipahayag nga kantidad.

Adunay usab usa ka kapilian sa subasta diin ang magbabaligya nagtakda usa ka minimum nga presyo alang sa lote, ug ang katapusan nga presyo kinahanglan nga molapas niini. Kung dili, ang lote nagpabilin nga wala mabaligya.

Niini nga pananglitan, nagtrabaho kami sa usa ka account nga espesipikong gihimo alang sa subasta. Ang gidugayon sa subasta mao ang 3000 ka bloke, ug ang pagsugod nga presyo sa lote mao ang 0,001 WAVES. Ang usa ka partisipante makabutang ug bid pinaagi sa pagpadala ug DataTransaction nga adunay yawe nga "presyo" ug ang bili sa ilang bid.

Ang presyo sa bag-ong bid kinahanglang mas taas kay sa kasamtangang presyo niini nga yawe, ug ang partisipante kinahanglang adunay labing menos [new_bid + commission] nga mga token sa iyang account. Ang adres sa bidder kinahanglan nga irekord sa "nagpadala" nga field sa DataTransaction, ug ang kasamtangang bid block nga gitas-on kinahanglan nga sulod sa panahon sa subasta.

Kung sa katapusan sa subasta ang partisipante nagbutang sa labing taas nga presyo, mahimo siyang magpadala usa ka ExchangeTransaction aron mabayran ang katugbang nga lote sa gitakda nga presyo ug pares sa salapi.

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. Dutch nga subasta sa pagkunhod sa mga presyo

Sa usa ka Dutch nga subasta, daghan ang una nga gitanyag sa presyo nga mas taas kaysa kung unsa ang andam nga ibayad sa pumapalit. Ang presyo mikunhod sa matag lakang hangtod ang usa sa mga partisipante miuyon sa pagpalit sa lote sa karon nga presyo.

Sa kini nga pananglitan gigamit namon ang parehas nga mga kanunay sama sa nauna, ingon man ang lakang sa presyo kung ang delta mikunhod. Gisusi sa script sa account kung ang partisipante ba gyud ang una nga nagbutang usa ka pusta. Kung dili, ang DataTransaction dili gidawat sa blockchain.

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. Auction nga β€œall-pay”

Ang "All-pay" usa ka subasta diin ang tanan nga mga partisipante mobayad sa bid, bisan kinsa pa ang nakadaog sa lote. Ang matag bag-ong partisipante mobayad ug bid, ug ang partisipante nga mohimo sa pinakataas nga bid maoy makadaog sa lote.

Sa among pananglitan, ang matag partisipante sa subasta nagbutang ug bid pinaagi sa DataTransaction nga adunay (key, value)* = (β€œwinner”, address),(β€œprice”, price). Ang maong DataTransaction aprobahan lamang kung kini nga partisipante aduna nay TransferTransaction uban sa iyang pirma ug ang iyang bid mas taas kay sa tanan nga nauna. Nagpadayon ang subasta hangtod maabot ang endHeight.

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)
}

Insurance / Crowdfunding

Atong tagdon ang usa ka sitwasyon diin kinahanglan nimo nga masiguro ang mga kabtangan sa mga tiggamit batok sa mga pagkawala sa pinansyal. Pananglitan, ang usa ka user gusto og garantiya nga kung ang usa ka token moubos, siya makahimo sa pagbawi sa tibuok nga kantidad nga gibayad alang niini nga mga token, ug andam sa pagbayad sa usa ka makatarunganon nga kantidad sa insurance.

Aron mapatuman kini, kinahanglan nga i-isyu ang "mga token sa seguro". Unya ang usa ka script gi-install sa account sa policyholder, nga gitugotan lamang ang mga ExchangeTransactions nga nagtagbo sa pipila ka mga kondisyon nga ipatuman.

Aron mapugngan ang doble nga paggasto, kinahanglan nimo nga hangyoon ang tiggamit nga magpadala usa ka DataTransaction sa account sa policyholder nga abante nga adunay (key, value) = (purchaseTransactionId, sellOrderId) ug idili ang pagpadala sa DataTransactions gamit ang yawe nga gigamit na.

Busa, ang mga pruweba sa tiggamit kinahanglan adunay sulod nga ID sa transaksyon sa pagpalit sa token sa insurance. Ang pares sa salapi kinahanglan nga parehas sa transaksyon sa pagpalit. Ang gasto kinahanglan usab nga katumbas sa gitakda sa panahon sa pagpalit, minus ang presyo sa insurance.

Nasabtan nga pagkahuman ang account sa seguro nagpalit mga token sa seguro gikan sa tiggamit sa usa ka presyo nga dili ubos sa usa nga iyang gipalit niini: ang account sa seguro nagmugna usa ka ExchangeTransaction, gipirmahan sa tiggamit ang order (kung nahuman ang transaksyon sa husto), ang Ang insurance account mopirma sa ikaduhang order ug sa tibuok nga transaksyon ug ipadala kini sa blockchain.

Kung walay pagpalit nga mahitabo, ang user makahimo og ExchangeTransaction sumala sa mga lagda nga gihulagway sa script ug ipadala ang transaksyon ngadto sa blockchain. Niining paagiha ang tiggamit makabalik sa salapi nga gigasto sa pagpalit sa mga nakaseguro nga mga token.

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)
}

Ang usa ka token sa seguro mahimo nga usa ka maalamon nga asset, pananglitan, aron idili ang pagbalhin niini sa mga ikatulo nga partido.

Kini nga pamaagi mahimo usab nga ipatuman alang sa mga token sa crowdfunding, nga ibalik sa mga tag-iya kung ang gikinahanglan nga kantidad wala makolekta.

Mga buhis sa transaksyon

Ang mga kontrata sa Smart magamit usab sa mga kaso diin kinahanglan nga mangolekta og buhis sa matag transaksyon nga adunay daghang mga lahi sa mga kabtangan. Mahimo kini pinaagi sa usa ka bag-ong asset nga na-install sponsorship alang sa mga transaksyon nga adunay mga smart asset:

1. Nag-isyu kami sa FeeCoin, nga ipadala sa mga tiggamit sa usa ka piho nga presyo: 0,01 WAVES = 0,001 FeeCoin.

2. Itakda ang sponsorship para sa FeeCoin ug exchange rate: 0,001 WAVES = 0,001 FeeCoin.

3. Itakda ang mosunod nga script para sa smart asset:

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
}

Karon sa matag higayon nga adunay magbalhin sa N smart assets, hatagan ka nila og FeeCoin sa kantidad nga N/taxDivisor (nga mapalit gikan kanimo sa 10 *N/taxDivisor WAVES), ug hatagan nimo ang minero nga N/taxDivisor WAVES. Ingon nga resulta, ang imong ganansya (buwis) mahimong 9*N / taxDivisor WAVES.

Mahimo ka usab nga maghimo buhis gamit ang usa ka smart asset script ug MassTransferTransaction:

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
}

Cashback ug loyalty nga mga programa

Ang cashback usa ka matang sa programa sa pagkamaunongon diin makuha sa pumapalit ang bahin sa kantidad nga gigasto sa usa ka produkto o serbisyo.

Kung gipatuman kini nga kaso gamit ang usa ka maalamon nga account, kinahanglan naton susihon ang mga pruweba sa parehas nga paagi sama sa among gihimo sa kaso sa seguro. Aron mapugngan ang doble nga paggasto, ang user kinahanglan magpadala ug DataTransaction nga adunay (key, value) = (purchaseTransactionId, cashbackTransactionId) sa dili pa makadawat ug cashback.

Kinahanglan usab nga magbutang kami usa ka pagdili sa mga naglungtad nga yawe gamit ang DataTransaction. cashbackDivisor - yunit nga gibahin sa bahin sa cashback. Mga. kung ang bahin sa cashback 0.1, unya ang cashbackDivisor 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)
}

Atomic swap

Atomic swap nagtugot sa mga tiggamit sa pagbayloay sa mga kabtangan nga walay tabang sa usa ka pagbayloay. Uban sa atomic swap, ang duha ka mga partisipante sa transaksyon gikinahanglan nga kumpirmahon kini sulod sa usa ka piho nga yugto sa panahon.

Kung labing menos usa sa mga partisipante wala maghatag sa husto nga kumpirmasyon sa transaksyon sulod sa oras nga gigahin alang sa transaksyon, kanselado ang transaksyon ug dili mahitabo ang pagbinayloay.

Sa among pananglitan, among gamiton ang mosunod nga smart account script:

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
}

Sa sunod nga artikulo atong tan-awon ang paggamit sa mga smart account sa pinansyal nga mga instrumento sama sa mga kapilian, kaugmaon ug mga bayronon.

Source: www.habr.com

Idugang sa usa ka comment