Kushandiswa kweWaves smart account: kubva kumaokisheni kuenda kumabhonasi zvirongwa

Kushandiswa kweWaves smart account: kubva kumaokisheni kuenda kumabhonasi zvirongwa

Blockchain inowanzobatanidzwa chete necryptocurrencies, asi nzvimbo dzekushandiswa kweDLT tekinoroji dzakapamhama. Imwe yenzvimbo dzinonyanya kuvimbisa kushandiswa kwe blockchain chibvumirano chakangwara chinoitwa otomatiki uye chisingade kuvimbana pakati pemapato akapinda mairi.

RIDE - mutauro wezvibvumirano zvakangwara

Mafungu akagadzira mutauro wakasarudzika wezvibvumirano zvakangwara - RIDE. Zvinyorwa zvaro zvakakwana zviripo pano. Uye pano - chinyorwa pamusoro penyaya iyi pana Habr.

Kondirakiti yeRIDE ishoko uye inodzorera "chokwadi" kana "nhema" sekubuda. Saizvozvo, kutengeserana kungave kwakanyorwa mu blockchain kana kurambwa. Iyo smart contract inovimbisa zvizere kuzadzikiswa kwemamiriro akatsanangurwa. Kugadzira kutengeserana kubva muchibvumirano muRIDE parizvino hazvigoneke.

Nhasi kune marudzi maviri eWaves smart makondirakiti: smart account uye smart assets. A smart account inguva dzose mushandisi account, asi script yakaisirwa iyo inodzora zvese zvekutengesa. Iyo smart account script inogona kutaridzika seizvi, semuenzaniso:

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

tx kutengeserana kuri kugadziriswa kwatinobvumira kushandisa maitiro ekufananidza nzira chete kana isiri yekufambisa. Patani yekufananidza muRIDE inoshandiswa kutarisa mhando yekutengeserana. Maakaundi ese aripo anogona kugadziriswa mune smart account script mhando dzekutengeserana.

Iyo script inogona zvakare kuzivisa akasiyana, shandisa "kana-zvino-zvimwe" inovaka uye dzimwe nzira dzekunyatso tarisa mamiriro. Kuti ive nechokwadi chekuti zvibvumirano zvinogoneka kuzara uye kuoma (mutengo) zviri nyore kufanotaura kusati kwaitwa kondirakiti, RIDE haina zvishwe kana kusvetuka zvirevo.

Mamwe maficha eWaves account anosanganisira kuvapo kwe "nyika," kureva, mamiriro eaccount. Iwe unogona kunyora nhamba isingaperi yemaviri (kiyi, kukosha) kune iyo account state uchishandisa data transaction (DataTransaction). Ruzivo urwu runogona kugadziridzwa zvese kuburikidza neREST API uye zvakananga muchibvumirano chakangwara.

Kutengeserana kwega kwega kunogona kuve nehumbowo hwakawanda, umo siginecha yemutori wechikamu, ID yekutengeserana kunodiwa, nezvimwe zvinogona kuiswa.

Kushanda neRIDE kuburikidza HERE inokubvumira kuti uone maonero akabatanidzwa echibvumirano (kana ichinyorwa), gadzira maakaunti matsva uye uise zvinyorwa zvayo, pamwe nekutumira kutengeserana kuburikidza nemutsara wemirairo.

Kutenderera kuzere, kusanganisira kugadzira account, kuisa kondirakiti yakangwara pairi uye kutumira kutengeserana, unogona zvakare kushandisa raibhurari yekudyidzana neREST API (semuenzaniso, C #, C, Java, JavaScript, Python, Rust, Elixir) . Kuti utange kushanda neIDE, ingobaya bhatani ITSVA.

Mikana yekushandisa smart makondirakiti yakakura: kubva pakurambidza kutengeserana kune mamwe makero ("black list") kusvika kune yakaoma dApps.

Zvino ngatitarisei mienzaniso chaiyo yekushandiswa kwezvibvumirano zvakangwara mubhizinesi: pakuita maokisheni, inishuwarenzi, uye kugadzira zvirongwa zvekuvimbika.

Auctions

Imwe yemamiriro ekutengesa yakabudirira ndeyekujeka: vatori vechikamu vanofanirwa kuve nechivimbo chekuti hazvibviri kushandura mabhidhi. Izvi zvinogona kuwanikwa nekuda kwe blockchain, uko isingachinjike data nezve ese mabheti uye nguva yaakaitwa ichave inowanikwa kune vese vatori vechikamu.

PaWaves blockchain, mabheti anogona kurekodhwa muakauction account state kuburikidza neDataTransaction.

Iwe unogona zvakare kuseta yekutanga uye yekupedzisira nguva yeauction uchishandisa block nhamba: iyo frequency ye block block muWaves blockchain inenge yakaenzana 60 seconds.

1. Chirungu ichikwira mutengo okisheni

Vatori vechikamu muokisheni yeChirungu vanoisa mabhidhi mumakwikwi nemumwe. Beti idzva rega rega rinofanira kudarika rakapfuura. Okisheni yacho inopera kana pasisina vateki vanodarika iyo yekupedzisira bhidhi. Muchiitiko ichi, mutengi wepamusoro anofanira kupa huwandu hwakataurwa.

Iko kune zvakare okisheni sarudzo umo mutengesi anoisa mutengo wakaderera wemujenya, uye mutengo wekupedzisira unofanirwa kuudarika. Zvikasadaro, mijenya inoramba isina kutengeswa.

Mumuenzaniso uyu, tiri kushanda neakaundi yakanyatsogadzirirwa iyo auction. Nguva yeokisheni ndeye 3000 zvidhinha, uye mutengo wekutanga weiyo mijenya ndeye 0,001 WAVES. Mumwe mutori wechikamu anogona kuisa bhidhi nekutumira DataTransaction nekiyi "mutengo" uye kukosha kwebhidhiro yavo.

Mutengo webhidhi idzva unofanirwa kunge wakakwira kupfuura mutengo wazvino wekiyi iyi, uye mubati wacho anofanira kunge aine [new_bid + commission] tokens muaccount yake. Kero yemutengi inofanirwa kurekodhwa mundima ye "sender" muDataTransaction, uye iyo yazvino bhidhiti block urefu inofanira kunge iri mukati menguva yekutengesa.

Kana pakupera kweokisheni mutori wechikamu akaisa mutengo wepamusoro, anogona kutumira ExchangeTransaction kubhadhara iyo inoenderana mujenya pamutengo wakatarwa uye mari peya.

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. Okisheni yechiDutch yemitengo iri kuderera

Muchitoro cheDutch, zvakawanda zvinotanga kupihwa nemutengo wakakwira kupfuura izvo mutengi anoda kubhadhara. Mutengo unodzikira nhanho nhanho kudzamara mumwe wevatori vechikamu abvuma kutenga mijenya pamutengo uripo.

Mumuenzaniso uyu tinoshandisa zvigadziriso zvakafanana sezvakaitwa mune yakapfuura, pamwe nedanho remutengo apo delta inoderera. Chinyorwa cheakaundi chinotarisa kana ari kutora chikamu ari iye wekutanga kuisa kubheja. Zvikasadaro, iyo DataTransaction haigamuchirwe neiyo 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. Auction "yose-kubhadhara"

"Yese-kubhadhara" ndeye auction iyo vatori vechikamu vanobhadhara bhidhi, zvisinei nekuti ndiani anohwina mujenya. Mumwe nemumwe mutsva anotora chikamu anobhadhara bhidhi, uye mubati anoita iyo yakanyanya bhidhiro anohwina mujenya.

Mumuenzaniso wedu, mumwe nemumwe anotora chikamu anoisa bhidhi kuburikidza neDataTransaction ne (kiyi, kukosha) * = ("mukundi", kero), ("mutengo", mutengo). DhataTransaction yakadaro inobvumirwa chete kana mutori wechikamu uyu atova neTransferTransaction nesignature yake uye bhidhiyo yake yakakwirira kudarika yose yapfuura. The auction inoenderera kusvika endHeight yasvikwa.

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

Inishuwarenzi / Crowdfunding

Ngatitarisei mamiriro ezvinhu apo iwe unofanirwa kuisa inishuwarenzi yevashandisi zvinhu zvinopesana nekurasikirwa kwemari. Semuenzaniso, mushandisi anoda vimbiso yekuti kana chiratidzo chikadzikira, achakwanisa kudzorera mari yakazara yakabhadharwa yezviratidzo izvi, uye anoda kubhadhara mari inonzwisisika yeinishuwarenzi.

Kuti uite izvi, "mainishuwarenzi tokens" anofanira kubudiswa. Ipapo script inoiswa pane accountholder's account, ichibvumira chete iyo ExchangeTransactions inosangana nemamwe mamiriro kuti iitwe.

Kuti udzivise kushandisa kaviri, unofanirwa kukumbira mushandisi kuti atumire DataTransaction kune accountholder's account in advance ne (kiyi, kukosha) = (purchaseTransactionId, sellOrderId) uye kurambidza kutumira DataTransactions nekiyi yakatoshandiswa.

Naizvozvo, humbowo hwemushandisi hunofanirwa kuve neiyo transaction ID yekutenga tokeni yeinishuwarenzi. Mari mbiri dzinofanira kunge dzakafanana nekutengesa kwekutenga. Mari yacho inofanirawo kuenzana neyakagadziriswa panguva yekutenga, kubvisa mutengo weinishuwarenzi.

Zvinonzwisisika kuti gare gare iyo inishuwarenzi account inotenga zviratidzo zveinishuwarenzi kubva kumushandisi pamutengo usiri wakaderera pane waakavatenga: iyo inishuwarenzi account inogadzira iyo ExchangeTransaction, mushandisi anosaina kurongeka (kana kutengeserana kwapera nemazvo), iyo Inishuwarenzi account inosaina yechipiri odha uye iyo yese kutengeserana uye inotumira kune iyo blockchain.

Kana pasina kutenga kunoitika, mushandisi anogona kugadzira ExchangeTransaction maererano nemitemo inotsanangurwa mune script uye kutumira kutengeserana kune blockchain. Nenzira iyi mushandisi anogona kudzorera mari yakashandiswa pakutenga ma tokens ane insured.

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

Chiratidzo cheinishuwarenzi chinogona kuitwa chakangwara asset, semuenzaniso, kurambidza kuendeswa kune vechitatu mapato.

Ichi chirongwa chinogona zvakare kushandiswa kune crowdfunding tokens, iyo inodzoserwa kune varidzi kana mari inodiwa isati yaunganidzwa.

Mutero wekutengesa

Zvibvumirano zveSmart zvinoshandawo mumamiriro ezvinhu apo zvakakosha kuunganidza mutero pane imwe neimwe kutengeserana nemhando dzinoverengeka dzezvinhu. Izvi zvinogona kuitwa kuburikidza nechinhu chitsva chakaiswa rubatsiro yekutengeserana ne smart assets:

1. Tinobudisa FeeCoin, iyo ichatumirwa kuvashandisi pamutengo wakatarwa: 0,01 WAVES = 0,001 FeeCoin.

2. Isa rubatsiro rweFeeCoin uye chiyero chekuchinjana: 0,001 WAVES = 0,001 FeeCoin.

3. Seta chinyorwa chinotevera che 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
}

Iye zvino pese munhu paanotamisa N smart assets, anokupa FeeCoin muhuwandu hweN/taxDivisor (iyo inogona kutengwa kubva kwauri pa10 *N/taxDivisor WAVES), uye iwe uchapa mucheri N/taxDivisor WAVES. Nekuda kweizvozvo, purofiti yako (mutero) ichave 9 * N / muteroDivisor WAVES.

Iwe unogona zvakare kuita mutero uchishandisa smart asset script uye 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 uye zvirongwa zvekuvimbika

Cashback imhando yechirongwa chekuvimbika umo mutengi anodzoserwa chikamu chemari yakashandiswa pane chigadzirwa kana sevhisi.

Pakuita nyaya iyi uchishandisa smart account, isu tinofanirwa kutarisa humbowo nenzira imwechete sezvatakaita mune inishuwarenzi kesi. Kuti udzivise kushandisa kaviri, mushandisi anofanira kutumira DataTransaction ne (kiyi, kukosha) = (kutengaTransactionId, cashbackTransactionId) asati agamuchira mari yekudzoserwa.

Isu tinofanirawo kuseta kurambidzwa kwemakiyi aripo tichishandisa DataTransaction. cashbackDivisor - chikamu chakakamurwa necashback share. Avo. kana iyo cashback share iri 0.1, then 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)
}

Atomic swap

Atomic swap inobvumira vashandisi kuchinjana midziyo pasina rubatsiro rwekuchinjana. Nekuchinjanisa kweatomu, vese vatori vechikamu mukutengeserana vanodiwa kuti vazvisimbise mukati meimwe nguva yenguva.

Kana imwe yevatori vechikamu isingapi kuvimbiswa kwakarurama kwekutengeserana mukati menguva yakagoverwa yekutengeserana, kutengeserana kunobviswa uye kuchinjana hakuitiki.

Mumuenzaniso wedu, isu tichashandisa inotevera smart account script:

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
}

Muchinyorwa chinotevera tichatarisa mashandisirwo eakaunzi akaunzi mune zvemari zviridzwa senge sarudzo, ramangwana uye mabhiri.

Source: www.habr.com

Voeg