Blockchain nthawi zambiri imagwirizanitsidwa ndi ma cryptocurrencies, koma madera ogwiritsira ntchito ukadaulo wa DLT ndiwambiri. Imodzi mwamagawo odalirika kwambiri pakugwiritsa ntchito blockchain ndi mgwirizano wanzeru womwe umangochitika zokha ndipo sufuna kukhulupirirana pakati pa magulu omwe adalowamo.
RIDE β chinenero cha makontrakitala anzeru
Mafunde apanga chilankhulo chapadera pamakontrakitala anzeru - RIDE. Zolemba zake zonse zilipo
Mgwirizano wa RIDE ndi predicate ndipo umabwezera "zoona" kapena "zabodza" monga zotuluka. Chifukwa chake, kugulitsako kumalembedwa mu blockchain kapena kukanidwa. Mgwirizano wanzeru umatsimikizira kwathunthu kukwaniritsidwa kwa zikhalidwe zomwe zafotokozedwa. Kupanga zochitika kuchokera ku mgwirizano mu RIDE sikutheka.
Masiku ano pali mitundu iwiri yamakontrakitala anzeru a Waves: maakaunti anzeru ndi katundu wanzeru. Akaunti yanzeru ndi akaunti yogwiritsa ntchito nthawi zonse, koma script yakhazikitsidwa yomwe imawongolera zochitika zonse. Zolemba zanzeru za akaunti zitha kuwoneka motere, mwachitsanzo:
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
tx ndi ntchito yomwe ikukonzedwa kuti timalola kugwiritsa ntchito njira yofananira pokhapokha ngati sikusintha. Kufananiza kwamitundu mu RIDE kumagwiritsidwa ntchito kuyang'ana mtundu wamalonda. Maakaunti onse omwe alipo amatha kusinthidwa muakaunti yanzeru
Zolemba zimathanso kulengeza zosinthika, gwiritsani ntchito zomanga za "ngati-ndiye" ndi njira zina zowunikira bwino. Kuwonetsetsa kuti makontrakitala ali ndi kuthekera kokwanira komanso zovuta (mtengo) zomwe ndizosavuta kuneneratu ntchito isanayambe, RIDE ilibe malupu kapena kudumpha mawu.
Zina mwa maakaunti a Waves zikuphatikiza kukhalapo kwa "boma," ndiye kuti, momwe akauntiyo ilili. Mutha kulemba nambala yopanda malire ya awiriawiri (kiyi, mtengo) ku akaunti yanu pogwiritsa ntchito ma data (DataTransaction). Zambirizi zitha kukonzedwa kudzera mu REST API komanso mwachindunji mu mgwirizano wanzeru.
Kugulitsa kulikonse kumatha kukhala ndi maumboni angapo, momwe siginecha ya omwe atenga nawo mbali, ID ya zomwe mukufuna, ndi zina zotero.
Kugwira ntchito ndi RIDE kudzera
Pakuzungulira kwathunthu, kuphatikiza kupanga akaunti, kukhazikitsa mgwirizano wanzeru ndi kutumiza zotuluka, mutha kugwiritsanso ntchito laibulale yolumikizana ndi REST API (mwachitsanzo, C #, C, Java, JavaScript, Python, Rust, Elixir) . Kuti muyambe kugwira ntchito ndi IDE, ingodinani batani LATSOPANO.
Mwayi wogwiritsa ntchito makontrakitala anzeru ndi ambiri: kuyambira pakuletsa kugulitsa kupita ku ma adilesi ena ("mndandanda wakuda") mpaka ma dApps ovuta.
Tsopano tiyeni tiwone zitsanzo zenizeni za kugwiritsa ntchito makontrakitala anzeru mubizinesi: pochita malonda, inshuwaransi, ndikupanga mapulogalamu okhulupilika.
Zogulitsa
Chimodzi mwazofunikira pakugulitsa kopambana ndikuwonetsetsa: otenga nawo mbali ayenera kukhala ndi chidaliro kuti ndizosatheka kusokoneza mabizinesi. Izi zitha kutheka chifukwa cha blockchain, pomwe deta yosasinthika yokhudza kubetcha konse ndi nthawi yomwe idapangidwa ipezeka kwa onse omwe atenga nawo mbali.
Pa blockchain ya Waves, zotsatsa zitha kujambulidwa muakaunti yogulitsa malonda kudzera pa DataTransaction.
Mutha kukhazikitsanso nthawi zoyambira ndi zomaliza zogulitsira pogwiritsa ntchito manambala a block: kuchuluka kwa blockchain mu Waves blockchain ndi pafupifupi ofanana ndi 60 masekondi.
1. Chingelezi kukwera mtengo kwamalonda
Otenga nawo gawo mu malonda a Chingerezi amatsatsa malonda akupikisana wina ndi mnzake. Kubetcha kulikonse kwatsopano kukuyenera kupitilira m'mbuyomu. Kugulitsako kumatha ngati palibenso otsatsa kuti apitirire ndalama zomaliza. Pamenepa, wobwereketsa kwambiri ayenera kupereka ndalama zomwe zanenedwa.
Palinso njira yogulitsira yomwe wogulitsa amaika mtengo wocheperako pagawo, ndipo mtengo womaliza uyenera kupitilira. Apo ayi, maere amakhalabe osagulitsidwa.
Muchitsanzo ichi, tikugwira ntchito ndi akaunti yomwe idapangidwa kuti igulitse. Nthawi yogulitsa ndi 3000 midadada, ndipo mtengo woyambira malowa ndi 0,001 WAVES. Wotenga nawo mbali atha kuyitanitsa potumiza DataTransaction ndi kiyi "mtengo" ndi mtengo wake.
Mtengo wa bid yatsopano uyenera kukhala wapamwamba kuposa mtengo wapano wa kiyi iyi, ndipo wophunzirayo ayenera kukhala ndi zizindikiro zosachepera [new_bid + commission] mu akaunti yake. Adilesi ya wotsatsayo iyenera kulembedwa m'munda wa "wotumiza" mu DataTransaction, ndipo kutalika kwaposachedwa kwa bid block kuyenera kukhala mkati mwa nthawi yogulitsa.
Ngati kumapeto kwa malonda omwe akutenga nawo mbali akhazikitsa mtengo wapamwamba kwambiri, akhoza kutumiza ExchangeTransaction kuti alipire gawo lofananira pamtengo womwe watchulidwa komanso ndalama ziwiri.
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. Kugulitsa kwamitengo yaku Dutch yotsika mtengo
Mumsika waku Dutch, zambiri zimaperekedwa pamtengo wokwera kuposa zomwe wogula akufuna kulipira. Mtengo umachepa pang'onopang'ono mpaka m'modzi mwa omwe atenga nawo gawo avomereze kugula maere pamtengo womwe ulipo.
Muchitsanzo ichi timagwiritsa ntchito zosinthika zomwezo monga kale, komanso mtengo wamtengo wapatali pamene delta imachepa. Zolemba zaakaunti zimayang'ana ngati wotenga nawo mbali ndiye woyamba kubetcha. Apo ayi, DataTransaction sivomerezedwa ndi 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. Kugulitsa βmalipiro onseβ
"Malipiro onse" ndi malonda omwe otenga nawo mbali amalipira ndalama zonse, mosasamala kanthu kuti ndani wapambana maere. Wotenga nawo mbali watsopano aliyense amalipira bid, ndipo wotenga nawo mbali yemwe apanga ndalama zambiri amapambana maere.
Muchitsanzo chathu, aliyense wochita nawo malonda amayika ndalama kudzera pa DataTransaction ndi (kiyi, mtengo)* = ("wopambana", adilesi),("mtengo", mtengo). DataTransaction yotereyi imavomerezedwa pokhapokha ngati wophunzirayo ali kale ndi TransferTransaction ndi siginecha yake ndipo ndalama zake ndi zapamwamba kuposa zonse zam'mbuyo. Kugulitsaku kumapitilira mpaka endHeight ifika.
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)
}
Inshuwaransi / Crowdfunding
Tiyeni tilingalire momwe mungafunikire kutsimikizira katundu wa ogwiritsa ntchito kuti asawononge ndalama. Mwachitsanzo, wogwiritsa ntchito akufuna chitsimikiziro chakuti ngati chizindikiro chikuchepa, adzatha kubweza ndalama zonse zolipiridwa pa zizindikiro izi, ndipo ali wokonzeka kulipira ndalama zokwanira za inshuwalansi.
Kuti izi zitheke, "zizindikiro za inshuwaransi" ziyenera kuperekedwa. Ndiye script imayikidwa pa akaunti ya policyholder, kulola okha ExchangeTransactions omwe amakwaniritsa zinthu zina kuti aphedwe.
Pofuna kupewa kuwononga ndalama kawiri, muyenera kupempha wogwiritsa ntchito kutumiza DataTransaction ku akaunti ya mwiniwakeyo pasadakhale ndi (kiyi, mtengo) = (purchaseTransactionId, sellOrderId) ndikuletsa kutumiza DataTransactions ndi kiyi yomwe yagwiritsidwa ntchito kale.
Chifukwa chake, maumboni a wogwiritsa ntchito ayenera kukhala ndi ID ya transaction ya kugula chizindikiro cha inshuwaransi. Ndalama ziwirizi ziyenera kukhala zofanana ndi zomwe mumagula. Mtengowo uyeneranso kukhala wofanana ndi womwe unakhazikitsidwa panthawi yogula, kuchotsera mtengo wa inshuwaransi.
Zimamveka kuti pambuyo pake akaunti ya inshuwaransi imagula zizindikiro za inshuwaransi kwa wogwiritsa ntchito pamtengo wosatsika kuposa womwe adawagulira: akaunti ya inshuwaransi imapanga ExchangeTransaction, wogwiritsa ntchito amasayina dongosolo (ngati ntchitoyo yamalizidwa molondola), akaunti ya inshuwaransi imasaina dongosolo lachiwiri ndi zochitika zonse ndikuzitumiza ku blockchain.
Ngati palibe kugula komwe kumachitika, wogwiritsa ntchito akhoza kupanga ExchangeTransaction malinga ndi malamulo omwe akufotokozedwa mu script ndikutumiza malonda ku blockchain. Mwanjira iyi wogwiritsa ntchito amatha kubweza ndalama zomwe zidagwiritsidwa ntchito pogula zizindikiro za inshuwaransi.
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)
}
Chizindikiro cha inshuwaransi chikhoza kupangidwa kukhala chuma chanzeru, mwachitsanzo, kuletsa kusamutsidwa kwa anthu ena.
Chiwembuchi chikhoza kugwiritsidwanso ntchito pa zizindikiro za crowdfunding, zomwe zimabwezeretsedwa kwa eni ake ngati ndalama zomwe zimafunikira sizinasonkhanitsidwe.
Misonkho yamalonda
Makontrakitala anzeru amagwiranso ntchito ngati kuli kofunikira kutolera msonkho pazochitika zilizonse ndi mitundu ingapo ya katundu. Izi zitha kuchitika pogwiritsa ntchito chida chatsopano chomwe chayikidwa
1. Timapereka FeeCoin, yomwe idzatumizidwa kwa ogwiritsa ntchito pamtengo wokhazikika: 0,01 WAVES = 0,001 FeeCoin.
2. Khazikitsani ndalama za FeeCoin ndi mtengo wosinthira: 0,001 WAVES = 0,001 FeeCoin.
3. Khazikitsani zolembedwa zotsatirazi za 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
}
Tsopano nthawi iliyonse munthu akasamutsa N anzeru katundu, adzakupatsani FeeCoin mu kuchuluka kwa N/taxDivisor (omwe angagulidwe kwa inu pa 10 * N/ taxDivisor WAVES), ndipo inu mupatsa mgodi N/taxDivisor WAVES. Zotsatira zake, phindu lanu (msonkho) lidzakhala 9 * N / taxDivisor WAVES.
Muthanso kupereka msonkho pogwiritsa ntchito script yanzeru komanso 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 ndi kukhulupirika mapulogalamu
Cashback ndi mtundu wa pulogalamu yokhulupirika yomwe wogula amapezanso gawo la ndalama zomwe zagwiritsidwa ntchito pa chinthu kapena ntchito.
Mukamagwiritsa ntchito nkhaniyi pogwiritsa ntchito akaunti yanzeru, tiyenera kuyang'ana maumboni mofanana ndi momwe tidachitira pa inshuwaransi. Pofuna kupewa kuwononga ndalama kawiri, wogwiritsa ntchitoyo ayenera kutumiza DataTransaction ndi (kiyi, mtengo) = (purchaseTransactionId, cashbackTransactionId) asanalandire ndalama.
Tiyeneranso kuletsa makiyi omwe alipo kale pogwiritsa ntchito DataTransaction. cashbackDivisor - gawo logawidwa ndi gawo lobwezera ndalama. Iwo. ngati gawo lobwezera ndalama ndi 0.1, ndiye 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)
}
Kusintha kwa atomiki
Kusinthana kwa atomiki kumalola ogwiritsa ntchito kusinthanitsa katundu popanda thandizo la kusinthanitsa. Ndi kusintha kwa atomiki, onse omwe akutenga nawo mbali pakuchitapo ayenera kutsimikizira mkati mwa nthawi inayake.
Ngati osachepera mmodzi mwa omwe akutenga nawo mbali sapereka chitsimikizo cholondola cha malondawo mkati mwa nthawi yomwe yaperekedwa pazochitikazo, ntchitoyo imathetsedwa ndipo kusinthanitsa sikuchitika.
Muchitsanzo chathu, tigwiritsa ntchito mawu anzeru awa:
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
}
M'nkhani yotsatira tiwona kugwiritsa ntchito ma akaunti anzeru pazida zachuma monga zosankha, zam'tsogolo ndi zolipira.
Source: www.habr.com