Kugwiritsa ntchito ma akaunti anzeru a Waves: kuchokera kumisika kupita ku mapulogalamu a bonasi

Kugwiritsa ntchito ma akaunti anzeru a Waves: kuchokera kumisika kupita ku mapulogalamu a bonasi

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 apa. Ndipo apa - nkhani pamutuwu pa Habr.

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 mitundu yamalonda.

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 PANO amakulolani kuti muwone malingaliro ophatikizidwa a mgwirizano (ngati aphatikizidwa), pangani akaunti zatsopano ndikuyika zolemba zake, komanso kutumiza zochitika kudzera pamzere wolamula.

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 thandizo pakuchita ndi smart assets:

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

Kuwonjezera ndemanga