Aplikasi akun cerdas Waves: saka lelang nganti program bonus

Aplikasi akun cerdas Waves: saka lelang nganti program bonus

Blockchain asring digandhengake mung karo cryptocurrencies, nanging area aplikasi teknologi DLT luwih akeh. Salah sawijining wilayah sing paling njanjeni kanggo nggunakake blockchain yaiku kontrak cerdas sing ditindakake kanthi otomatis lan ora mbutuhake kapercayan ing antarane pihak sing mlebu.

RIDE - basa kanggo kontrak pinter

Gelombang wis ngembangake basa khusus kanggo kontrak cerdas - RIDE. Dokumentasi lengkap dumunung kene. Lan kene- artikel babagan topik iki ing Habr.

Kontrak RIDE minangka predikat lan ngasilake "bener" utawa "palsu" minangka output. Mulane, transaksi kasebut dicathet ing pamblokiran utawa ditolak. Kontrak cerdas kanthi lengkap njamin syarat sing ditemtokake. Ngasilake transaksi saka kontrak ing RIDE saiki ora bisa ditindakake.

Saiki ana rong jinis kontrak cerdas Waves: akun cerdas lan aset cerdas. Akun cerdas minangka akun pangguna biasa, nanging skrip disetel kanggo ngontrol kabeh transaksi. Skrip akun cerdas bisa katon kaya iki, contone:

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

tx minangka transaksi sing diproses sing ngidini nggunakake mekanisme pencocokan pola mung yen dudu transaksi transfer. Pencocokan pola ing RIDE digunakake kanggo mriksa jinis transaksi. Kabeh akun sing ana bisa diproses ing skrip akun pinter jinis transaksi.

Skrip uga bisa ngumumake variabel, nggunakake konstruksi "yen-banjur-liyane" lan cara liyane kanggo mriksa kahanan kanthi lengkap. Kanggo mesthekake yen kontrak nduweni kelengkapan lan kerumitan (biaya) sing bisa dibuktekake sing gampang diprediksi sadurunge eksekusi kontrak diwiwiti, RIDE ora ngemot pernyataan puteran utawa lompat.

Fitur liyane saka akun Waves kalebu anane "negara", yaiku, negara akun kasebut. Sampeyan bisa nulis pasangan tanpa wates (kunci, nilai) menyang negara akun nggunakake transaksi data (DataTransaction). Informasi iki banjur bisa diproses liwat REST API lan langsung ing kontrak pinter.

Saben transaksi bisa ngemot macem-macem bukti, sing bisa dilebokake tanda tangan peserta, ID transaksi sing dibutuhake, lsp.

Nggarap RIDE liwat kene ngidini sampeyan ndeleng tampilan kontrak sing dikompilasi (yen dikompilasi), nggawe akun anyar lan nyetel skrip kasebut, uga ngirim transaksi liwat baris printah.

Kanggo siklus lengkap, kalebu nggawe akun, nginstal kontrak pinter lan ngirim transaksi, sampeyan uga bisa nggunakake perpustakaan kanggo sesambungan karo REST API (contone, C #, C, Java, JavaScript, Python, Rust, Elixir). . Kanggo miwiti nggarap IDE, mung klik tombol NEW.

Kemungkinan kanggo nggunakake kontrak pinter amba: saka nglarang transaksi menyang alamat tartamtu ("dhaftar ireng") kanggo dApps Komplek.

Saiki ayo goleki conto tartamtu babagan panggunaan kontrak cerdas ing bisnis: nalika nindakake lelang, asuransi, lan nggawe program kesetiaan.

Lelang

Salah sawijining syarat kanggo lelang sing sukses yaiku transparansi: peserta kudu yakin manawa ora bisa ngapusi tawaran. Iki bisa digayuh amarga pamblokiran, ing ngendi data sing ora bisa diganti babagan kabeh taruhan lan wektu nalika digawe bakal kasedhiya kanggo kabeh peserta.

Ing pamblokiran Waves, tawaran bisa direkam ing negara akun lelang liwat DataTransaction.

Sampeyan uga bisa nyetel wektu wiwitan lan pungkasan lelang nggunakake nomer blok: frekuensi produksi blok ing blok Waves kira-kira padha karo 60 detik.

1. Inggris lelangan rega munggah

Peserta ing lelang Inggris nggawe tawaran ing kompetisi karo saben liyane. Saben taruhan anyar kudu ngluwihi sing sadurunge. Lelang rampung nalika ora ana penawar sing ngluwihi tawaran pungkasan. Ing kasus iki, penawar paling dhuwur kudu menehi jumlah sing wis kasebut.

Ana uga pilihan lelangan sing bakul nyetel rega minimal kanggo lot, lan rega final kudu ngluwihi. Yen ora, akeh tetep ora bisa didol.

Ing conto iki, kita nggarap akun sing digawe khusus kanggo lelang. Durasi lelangan yaiku 3000 blok, lan rega wiwitan lot yaiku 0,001 WAVES. Peserta bisa nggawe tawaran kanthi ngirim DataTransaction kanthi "rega" kunci lan nilai tawaran.

Rega tawaran anyar kudu luwih dhuwur tinimbang rega saiki kanggo tombol iki, lan peserta kudu paling ora [new_bid + komisi] token ing akun. Alamat penawar kudu dicathet ing kolom "pangirim" ing DataTransaction, lan dhuwure pamblokiran tawaran saiki kudu ana ing wektu lelang.

Yen ing pungkasan lelangan, peserta wis nyetel rega paling dhuwur, dheweke bisa ngirim ExchangeTransaction kanggo mbayar lot sing cocog ing rega sing ditemtokake lan pasangan mata uang.

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. Lelang Walanda kang mudun prices

Ing lelangan Walanda, akeh sing ditawakake kanthi rega sing luwih dhuwur tinimbang sing dituku dening panuku. Rega dikurangi langkah demi langkah nganti salah sijine peserta setuju tuku lot kanthi rega saiki.

Ing conto iki, kita nggunakake konstanta sing padha karo sing sadurunge, uga langkah rega nalika delta mudhun. Skrip akun mriksa manawa peserta kasebut pancen dadi wong pertama sing nggawe taruhan. Yen ora, DataTransaction ora ditampa dening pamblokiran.

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. Lelang "bayar kabeh"

"Kabeh-mbayar" iku sawijining lelangan kang kabeh peserta mbayar tawaran, preduli saka sing menang akèh. Saben peserta anyar mbayar tawaran, lan peserta sing nggawe tawaran maksimum menang akèh.

Ing conto kita, saben peserta lelang nggawe tawaran liwat DataTransaction kanthi (kunci, nilai) * = ("pemenang", alamat), ("rega", rega). DataTransaction kasebut mung disetujoni yen peserta iki wis duwe TransferTransaction kanthi teken lan tawarane luwih dhuwur tinimbang kabeh sadurunge. Lelang terus nganti endHeight tekan.

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

Asuransi / Crowdfunding

Ayo dipikirake kahanan nalika sampeyan kudu ngasuransiake aset pangguna marang kerugian finansial. Contone, pangguna pengin njamin yen token depreciate, dheweke bakal bisa mbalekake jumlah lengkap sing dibayar kanggo token kasebut, lan gelem mbayar asuransi sing cukup.

Kanggo ngleksanakake iki, "token asuransi" kudu ditanggepi. Banjur skrip diinstal ing akun pemegang polis, mung ngidini ExchangeTransactions sing nyukupi syarat tartamtu kanggo dieksekusi.

Kanggo nyegah mbuwang kaping pindho, sampeyan kudu njaluk pangguna ngirim DataTransaction menyang akun pemegang polis luwih dhisik kanthi (kunci, nilai) = (purchaseTransactionId, sellOrderId) lan nglarang ngirim DataTransactions nganggo kunci sing wis digunakake.

Mulane, bukti pangguna kudu ngemot ID transaksi saka tuku token asuransi. Pasangan mata uang kudu padha karo ing transaksi tuku. Biaya uga kudu padha karo sing tetep nalika tuku, dikurangi rega asuransi.

Dimangerteni yen sabanjure akun asuransi tuku token asuransi saka pangguna kanthi rega sing ora luwih murah tinimbang sing dituku: akun asuransi nggawe ExchangeTransaction, pangguna menehi tandha pesenan (yen transaksi rampung kanthi bener), akun insurance mlebu urutan kapindho lan kabeh transaksi lan dikirim menyang blockchain.

Yen ora ana tuku, pangguna bisa nggawe ExchangeTransaction miturut aturan sing diterangake ing skrip lan ngirim transaksi kasebut menyang pamblokiran. Kanthi cara iki pangguna bisa ngasilake dhuwit kanggo tuku token sing diasuransiake.

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

Token asuransi bisa digawe aset cerdas, contone, kanggo nglarang transfer menyang pihak katelu.

Skema iki uga bisa dileksanakake kanggo token crowdfunding, sing bali menyang pemilik yen jumlah sing dibutuhake durung diklumpukake.

Pajak transaksi

Kontrak cerdas uga ditrapake ing kasus sing kudu ngumpulake pajak ing saben transaksi kanthi sawetara jinis aset. Iki bisa ditindakake liwat aset anyar kanthi diinstal sponsor kanggo transaksi karo aset cerdas:

1. We ngetokake FeeCoin, sing bakal dikirim menyang pangguna kanthi rega tetep: 0,01 WAVES = 0,001 FeeCoin.

2. Setel sponsor kanggo FeeCoin lan kurs: 0,001 WAVES = 0,001 FeeCoin.

3. Setel skrip ing ngisor iki kanggo aset cerdas:

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
}

Saiki saben wong nransfer aset pinter N, bakal menehi FeeCoin ing jumlah N / taxDivisor (sing bisa dituku saka sampeyan ing 10 * N / taxDivisor WAVES), lan sampeyan bakal menehi penambang N / taxDivisor WAVES. AkibatΓ©, bathi (pajak) sampeyan bakal dadi 9*N / taxDivisor WAVES.

Sampeyan uga bisa nindakake pajak nggunakake skrip aset cerdas lan 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 lan program kasetyan

Cashback minangka jinis program kesetiaan ing ngendi panuku entuk maneh bagean saka jumlah sing digunakake kanggo produk utawa layanan.

Nalika ngetrapake kasus iki nggunakake akun cerdas, kita kudu mriksa bukti kanthi cara sing padha kaya ing kasus asuransi. Kanggo nyegah mbuwang kaping pindho, pangguna kudu ngirim DataTransaction kanthi (kunci, nilai) = (purchaseTransactionId, cashbackTransactionId) sadurunge nampa cashback.

Kita uga kudu nglarang tombol sing ana nggunakake DataTransaction. cashbackDivisor - unit dibagi dening nuduhake cashback. Sing. yen bagean cashback 0.1, banjur 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)
}

Pertukaran atom

Pertukaran atom ngidini pangguna ngganti aset tanpa bantuan ijol-ijolan. Kanthi swap atom, loro peserta ing transaksi kudu konfirmasi ing wektu tartamtu.

Yen paling ora siji peserta ora menehi konfirmasi sing bener babagan transaksi ing wektu sing diwenehake kanggo transaksi kasebut, transaksi kasebut dibatalake lan ijol-ijolan ora kedadeyan.

Ing conto kita, kita bakal nggunakake skrip akun pinter ing ngisor iki:

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
}

Ing artikel sabanjure kita bakal ndeleng panggunaan akun cerdas ing instrumen finansial kayata opsi, berjangka lan tagihan.

Source: www.habr.com

Add a comment