I-Blockchain ihlala idityaniswa kuphela kunye ne-cryptocurrencies, kodwa iindawo zokusetyenziswa kweteknoloji ye-DLT zibanzi kakhulu. Enye yezona ndawo zithembisayo zokusetyenziswa kwe-blockchain yinkontileka ehlakaniphile eyenziwa ngokuzenzekelayo kwaye ayifuni ukuthembana phakathi kwamaqela angenayo.
RIDE - ulwimi lweekontraki ezihlakaniphile
Amaza aphuhlise ulwimi olukhethekileyo kwiikontraki ezihlakaniphile - RIDE. Amaxwebhu apheleleyo akhoyo
Ikhontrakthi ye-RIDE sisivisa kwaye ibuyisela "inyani" okanye "ubuxoki" njengemveliso. Ngokufanelekileyo, intengiselwano irekhodwa kwi-blockchain okanye yaliwe. Ikhontrakthi ehlakaniphile iqinisekisa ngokupheleleyo ukuzaliseka kweemeko ezichaziweyo. Ukuvelisa iitransekshini kwikhontrakthi kwi-RIDE okwangoku akunakwenzeka.
Namhlanje kukho iindidi ezimbini zeekhontrakthi ze-Waves smart: ii-akhawunti ezihlakaniphile kunye ne-smart assets. I-akhawunti ehlakaniphile yi-akhawunti yomsebenzisi eqhelekileyo, kodwa iskripthi simiselwe sona esilawula zonke iintengiselwano. Iskripthi seakhawunti ehlakaniphile sinokujongeka ngolu hlobo, umzekelo:
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
I-tx yintengiselwano eyenziwayo esiyivumelayo ukusebenzisa indlela yokulinganisa ipateni kuphela ukuba ayiludluliselo lwentengiselwano. Ipateni ehambelanayo kwi-RIDE isetyenziselwa ukujonga uhlobo lwentengiselwano. Zonke ii-akhawunti ezikhoyo zinokucutshungulwa kwiskripthi se-akhawunti ehlakaniphile
Iskripthi sinokuphinda sibhengeze izinto eziguquguqukayo, sebenzisa "ukuba-ke-enye" ββukwakha kunye nezinye iindlela zokujonga ngokupheleleyo iimeko. Ukuqinisekisa ukuba iikhontrakthi zinokugqibelela okungqinwayo kunye nokuntsonkotha (iindleko) ekulula ukuqikelela phambi kokuba kuqaliswe ukuphunyezwa kwekhontrakthi, i-RIDE ayiqulathanga i-loops okanye i- jump statements.
Ezinye iimpawu zeeakhawunti ze-Waves ziquka ubukho be "state," oko kukuthi, imeko ye-akhawunti. Ungabhala inani elingapheliyo lamabini (isitshixo, ixabiso) kwisimo se-akhawunti usebenzisa ukuthengiselana kwedatha (DataTransaction). Olu lwazi lunokuthi luqhutywe zombini nge-REST API kwaye ngokuthe ngqo kwinkontileka ehlakaniphile.
Intengiselwano nganye inokuqulatha uluhlu lobungqina, apho utyikityo lomthathi-nxaxheba, i-ID yetransekshini efunekayo, njl.njl.
Ukusebenza nge-RIDE nge
Ngomjikelezo opheleleyo, kubandakanywa ukudala i-akhawunti, ukufaka inkontileka ehlakaniphile kuyo kunye nokuthumela ukuthengiselana, ungasebenzisa kwakhona ilayibrari ngokusebenzisana ne-REST API (umzekelo, C #, C, Java, JavaScript, Python, Rust, Elixir) . Ukuqala ukusebenza nge-IDE, nqakraza nje iqhosha ENTSHA.
Amathuba okusebenzisa iikhontrakthi ezihlakaniphile zibanzi: ukusuka ekunqandeni ukuthengiselana ukuya kwiidilesi ezithile ("uluhlu olumnyama") ukuya kwii-dApps ezinzima.
Ngoku makhe sijonge imizekelo ethile yokusetyenziswa kwezivumelwano ezihlakaniphile kwishishini: xa uqhuba iifandesi, i-inshurensi, kunye nokudala iinkqubo zokunyaniseka.
Iifandesi
Enye yeemeko zefandesi eyimpumelelo kukwenza izinto elubala: abathathi-nxaxheba kufuneka baqiniseke ukuba akunakwenzeka ukukhohlisa iibhidi. Oku kunokufezekiswa ngokubonga kwi-blockchain, apho idatha engenakuguquguquka malunga nayo yonke ibheji kunye nexesha apho zenziwe khona ziya kufumaneka kubo bonke abathathi-nxaxheba.
Kwi-Waves blockchain, iibhidi zinokurekhodwa kwi-akhawunti ye-auction state nge-DataTransaction.
Ungaseta kwakhona ixesha lokuqala kunye nokuphela kwefandesi usebenzisa amanani ebhloko: ukuphindaphindwa kokuveliswa kwebhloko kwi-Waves blockchain iphantse ilingane 60 imizuzwana.
1. Ifandesi yexabiso yokunyuka kwesiNgesi
Abathathi-nxaxheba kwifandesi yesiNgesi babeka iibhidi kukhuphiswano omnye nomnye. Ubhejo olutsha ngalunye kufuneka lugqithe koludlulileyo. Ifandesi iyaphela xa kungekho baniki maxabiso abangakumbi ukuba bagqithise kwibhidi yokugqibela. Kule meko, oyena mntu uthengisa ngexabiso eliphezulu kufuneka abonelele ngesixa-mali esichaziweyo.
Kukho nenketho yefandesi apho umthengisi abeka ixabiso elincinci kwiqashiso, kwaye ixabiso lokugqibela kufuneka lidlule. Kungenjalo, iqashiso lihlala lingathengiswanga.
Kulo mzekelo, sisebenza ngeakhawunti eyenzelwe ngokukodwa ifandesi. Ubude befandesi yi-3000 iibhloko, kwaye ixabiso lokuqala leqashiso yi-0,001 WAVES. Umthathi-nxaxheba unokubeka ibhidi ngokuthumela iDathaTransaction kunye "nexabiso" eliphambili kunye nexabiso lebhidi yabo.
Ixabiso lebhidi elitsha kufuneka libe phezulu kunexabiso langoku lesi sitshixo, kwaye umthathi-nxaxheba kufuneka abe ubuncinane [i-new_bid + commission] amathokheni kwi-akhawunti yakhe. Idilesi yomthengisi kufuneka irekhodwe kwibala elithi "umthumeli" kwiDathaTransaction, kwaye ukuphakama kwebhloko yebhidi yangoku kufuneka kube ngaphakathi kwexesha lefandesi.
Ukuba ekupheleni kwefandesi umthathi-nxaxheba ubeke ixabiso eliphezulu, unokuthumela i-ExchangeTransaction ukuhlawula iqashiso elihambelanayo kwixabiso elichaziweyo kunye nesibini semali.
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. Ifandesi yamaDatshi yamaxabiso ahlayo
Kwifandesi yaseDatshi, kuninzi kuqala kunikezelwa ngexabiso eliphezulu kunelo umthengi azimisele ukulihlawula. Ixabiso liyancipha inyathelo ngenyathelo de omnye wabathathi-nxaxheba avume ukuthenga iqashiso ngexabiso langoku.
Kulo mzekelo sisebenzisa i-constants efanayo naleyo yangaphambili, kunye nesinyathelo sexabiso xa i-delta iyancipha. Iskripthi se-akhawunti sijonga ukuba ngaba umthathi-nxaxheba ngokwenene ungowokuqala ukubeka ukubheja. Ngaphandle koko, i-DataTransaction ayimkelwanga yi-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. Ifandesi βintlawulo yonkeβ
βYonke-intlawuloβ yifandesi apho bonke abathathi-nxaxheba bahlawula ibhidi, nokuba ngubani ophumelele iqashiso. Umthathi-nxaxheba ngamnye omtsha uhlawula ibhidi, kwaye umthathi-nxaxheba owenza ibhidi ephezulu uya kuphumelela iqashiso.
Kumzekelo wethu, umthathi-nxaxheba ngamnye wefandesi ubeka ibhidi ngeDathaTransaction kunye (isitshixo, ixabiso) * = ("ophumeleleyo", idilesi), ("ixabiso", ixabiso). I-DataTransaction enjalo ivunyiwe kuphela ukuba lo mthathi-nxaxheba sele sele eneTransferTransaction kunye nesignesha yakhe kwaye ibhidi yakhe iphezulu kunazo zonke zangaphambili. Ifandesi iyaqhubeka de i-endHeight ifikelelwe.
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)
}
I-inshurensi / Ukuxhaswa ngemali ngabantu abaninzi
Masithathele ingqalelo imeko apho kufuneka ukhusele ii-asethi zabasebenzisi ngokuchasene nelahleko yemali. Ngokomzekelo, umsebenzisi ufuna isiqinisekiso sokuba ukuba ithokheni iyancipha, uya kukwazi ukubuyisela imali epheleleyo ehlawulwe la mathokheni, kwaye uzimisele ukuhlawula imali efanelekileyo yomshuwalense.
Ukuphumeza oku, "iithokheni ze-inshurensi" kufuneka zikhutshwe. Emva koko iskripthi sifakwe kwi-akhawunti yomnini-polisi, ukuvumela kuphela ezo ExchangeTransactions ezihlangabezana neemeko ezithile ukuba zenziwe.
Ukuthintela inkcitho ephindwe kabini, kufuneka ucele umsebenzisi ukuba athumele i-DataTransaction kwi-akhawunti yomnini-polisi kwangaphambili kunye (isitshixo, ixabiso) = (purchaseTransactionId, sellOrderId) kwaye unqabele ukuthumela i-DataTransactions ngesitshixo esele sisetyenzisiwe.
Ke ngoko, ubungqina bomsebenzisi kufuneka buqulathe i-ID yokuthengiselana yokuthenga ithokheni ye-inshurensi. Isibini semali kufuneka sifane nakwintengiselwano yokuthenga. Iindleko kufuneka zilingane naleyo imiselweyo ngexesha lokuthenga, kuthatyathwe ixabiso le-inshorensi.
Kuyaqondwa ukuba emva koko i-akhawunti ye-inshorensi ithenga amathokheni e-inshurensi kumsebenzisi ngexabiso elingekho ngaphantsi kwelo athenge ngalo: i-akhawunti ye-inshurensi idala i-ExchangeTransaction, umsebenzisi usayine umyalelo (ukuba ukuthengiselana kugqitywe ngokuchanekileyo), I-akhawunti ye-inshurensi isayina umyalelo wesibini kunye nentengiselwano yonke kwaye uyithumele kwi-blockchain.
Ukuba akukho kuthengwa kwenzekayo, umsebenzisi unokudala i-ExchangeTransaction ngokwemigaqo echazwe kwiskripthi kwaye uthumele ukuthengiselana kwi-blockchain. Ngale ndlela umsebenzisi unokubuyisela imali echithwe ekuthengeni amathokheni e-inshorensi.
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)
}
Ithokheni ye-inshurensi inokwenziwa i-asethi ehlakaniphile, umzekelo, ukunqanda ukudluliselwa kwayo kubantu besithathu.
Esi sikimu sinokuphunyezwa kwiithokheni ze-crowdfunding, ezibuyiselwa kubanini ukuba isixa esifunekayo asiqokelelwanga.
Iirhafu zentengiselwano
Iikhontrakthi ze-Smart nazo ziyasebenza kwiimeko apho kuyimfuneko ukuqokelela irhafu kwintengiselwano nganye kunye neentlobo ezininzi zee-asethi. Oku kunokwenziwa nge-asethi entsha efakiweyo
1. Sikhupha i-FeeCoin, eya kuthunyelwa kubasebenzisi ngexabiso elimiselweyo: 0,01 WAVES = 0,001 FeeCoin.
2. Beka inkxaso ye-FeeCoin kunye nezinga lokutshintshiselana: 0,001 WAVES = 0,001 FeeCoin.
3. Seta esi script silandelayo se-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
}
Ngoku ngalo lonke ixesha umntu ehambisa i-N smart assets, uya kukunika i-FeeCoin kwisixa se-N/taxDivisor (enokuthengwa kuwe kwi-10 * N/taxDivisor WAVES), kwaye uya kunika umvukuzi N/taxDivisor WAVES. Ngenxa yoko, inzuzo yakho (irhafu) iya kuba yi-9*N / taxDivisor WAVES.
Unokwenza irhafu usebenzisa iskripthi se-asethi ehlakaniphile kunye ne-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
}
Ukubuyisela imali kunye neenkqubo zokunyaniseka
I-Cashback luhlobo lwenkqubo yokunyaniseka apho umthengi afumana inxalenye yemali echithwe kwimveliso okanye inkonzo.
Xa ukuphumeza le meko usebenzisa i-akhawunti ehlakaniphile, kufuneka sihlolisise ubungqina ngendlela efanayo njengoko senzayo kwimeko ye-inshurensi. Ukuthintela inkcitho ephindwe kabini, umsebenzisi kufuneka athumele iDathaTransaction kunye (isitshixo, ixabiso) = (purchaseTransactionId, cashbackTransactionId) ngaphambi kokufumana i-cashback.
Kufuneka kwakhona simise ukuvinjelwa kwezitshixo ezikhoyo usebenzisa i-DataTransaction. cashbackDivisor - iyunithi eyahlulwe ngesabelo semali ebuyisiweyo. Ezo. ukuba i-cashback share yi-0.1, ngoko ke 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)
}
Ukutshintsha kweAtomic
Ukutshintsha kwe-atomic kuvumela abasebenzisi ukuba batshintshiselane ngempahla ngaphandle koncedo lotshintshiselwano. Ngokutshintshwa kwe-athomu, bobabini abathathi-nxaxheba kwintengiselwano bayafuneka ukuba bayiqinisekise ngexesha elithile.
Ukuba ubuncinci omnye wabathathi-nxaxheba akaboneleli ngokuchanekileyo kwintengiselwano ngexesha elibekelwe ukuthengiselana, ukuthengiselana kucinyiwe kwaye utshintshiselwano alukwenzeka.
Kumzekelo wethu, siya kusebenzisa i-akhawunti yeskripthi elandelayo:
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
}
Kwinqaku elilandelayo siza kujonga ukusetyenziswa kweeakhawunti ezihlakaniphile kwizixhobo zemali ezifana nokhetho, ikusasa kunye neebhilikhwe.
umthombo: www.habr.com