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