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

Tenga inovimbika yekutambira kwemasaiti ane DDoS dziviriro, VPS VDS maseva 🔥 Tenga webhusaiti yakavimbika ine dziviriro yeDDoS, maseva eVPS VDS | ProHoster