Te tono mo nga kaute atamai Waves: mai i nga hokohoko ki nga kaupapa bonus

Te tono mo nga kaute atamai Waves: mai i nga hokohoko ki nga kaupapa bonus

He maha nga wa e hono ana te Poraka ki nga moni crypto anake, engari ko nga waahi o te whakamahinga o te hangarau DLT he nui ake te whanui. Ko tetahi o nga waahi tino pai mo te whakamahi poraka he kirimana maamaa ka mahia aunoa me te kore e hiahia kia whakawhirinaki ki waenga i nga roopu i uru ki roto.

RIDE – he reo mo nga kirimana atamai

Kua whakawhanakehia e Waves he reo motuhake mo nga kirimana atamai - RIDE. Kei roto ona tuhinga katoa konei. Na konei - tuhinga mo tenei kaupapa i runga i a Habr.

He tohu te kirimana RIDE me te whakahoki "pono" ranei "teka" hei putanga. No reira, ka tuhia te tauwhitinga ki roto i te poraka poraka, ka paopaohia ranei. Ko te kirimana atamai ka tino whakamanahia te whakatutukitanga o nga tikanga kua tohua. Ko te whakaputa whakawhitinga mai i te kirimana i RIDE kaore e taea i tenei wa.

I enei ra e rua nga momo kirimana atamai Waves: nga kaute atamai me nga rawa atamai. Ko te kaute atamai he kaute kaiwhakamahi auau, engari kua whakaritea he tuhinga hei whakahaere i nga whakawhitinga katoa. He penei pea te ahua o te tuhinga kaute atamai, hei tauira:

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

Ko te tx he tauwhitinga e tukatukahia ana ka whakaaehia e matou te whakamahi i te tikanga whakarite tauira mena ehara i te whakawhitinga whakawhiti. Ka whakamahia te whakataurite tauira i RIDE ki te tirotiro i te momo tauwhitinga. Ka taea te tukatuka i nga kaute katoa i roto i te tuhinga kaute atamai momo tauwhitinga.

Ka taea hoki e te tuhinga te whakaatu i nga taurangi, te whakamahi i nga hanganga "mehemea-ka-ake" me etahi atu tikanga mo te tirotiro i nga tikanga. Hei whakapumau i nga kirimana ka taea te whakaoti me te uaua (utu) he ngawari ki te matapae i mua i te tiimata o te mahi kirimana, karekau a RIDE i roto i nga koropiko, i nga korero peke.

Ko etahi atu ahuatanga o nga kaute Waves ko te waahi o te "ahua," ara, te ahua o te kaute. Ka taea e koe te tuhi i te maha o nga takirua (matua, uara) ki te ahua o te kaute ma te whakamahi i nga whakawhitinga raraunga (DataTransaction). Ko enei korero ka taea te tukatuka ma te REST API me te tika i roto i te kirimana atamai.

Ka taea e ia tauwhitinga he huinga tohu, ka taea te whakauru i te hainatanga o te kaiuru, te ID o te tauwhitinga e hiahiatia ana, me etahi atu.

Mahi tahi me RIDE ma HERE ka taea e koe te kite i te tirohanga whakahiato o te kirimana (mehemea ka whakahiatohia), hangahia he kaute hou me te whakatakoto i nga tuhinga mo taua mea, me te tuku i nga whakawhitinga ma te raina whakahau.

Mo te huringa katoa, tae atu ki te hanga i tetahi kaute, te whakauru i tetahi kirimana atamai ki runga me te tuku whakawhitinga, ka taea hoki e koe te whakamahi i te whare pukapuka mo te taunekeneke me te REST API (hei tauira, C #, C, Java, JavaScript, Python, Rust, Elixir) . Hei timata ki te mahi me te IDE, paato noa te paatene HOU.

He whanui nga huarahi mo te whakamahi i nga kirimana atamai: mai i te aukati i nga whakawhitinga ki etahi wahitau ("rarangi pango") ki nga dApps uaua.

Inaianei me titiro ki nga tauira motuhake o te whakamahinga o nga kirimana atamai i roto i nga pakihi: i te wa e whakahaere ana i nga hokohoko, inihua, me te hanga kaupapa pono.

Auctions

Ko tetahi o nga tikanga mo te hokohoko angitu ko te marama: me tino maia nga kaiuru kaore e taea te raweke i nga tono. Ka taea tenei ma te mihi ki te poraka, kei reira nga raraunga koretake mo nga peti katoa me te wa i mahia ai ka waatea ki nga kaiuru katoa.

I runga i te Waves poraka, ka taea te tuhi i nga tono ki roto i te ahua putea hokohoko ma te DataTransaction.

Ka taea hoki e koe te whakarite i te wa tiimata me te mutunga o te hokohoko ma te whakamahi i nga nama poraka: ko te auau o te hanga poraka i roto i te Waves poraka he rite tonu ki te 60 hēkona.

1. English piki piki hokohoko hokohoko

Ko nga kaiuru ki tetahi hokohoko Ingarihi ka tuku tono ki te whakataetae tetahi ki tetahi. Me nui ake ia peti hou i te mea o mua. Ka mutu te hokohoko ina karekau he kaitono kia nui ake i te tuku whakamutunga. I roto i tenei take, me whakarato e te kaitono teitei te moni kua kiia.

He whiringa hokohoko ano hoki ka whakatauhia e te kaihoko te utu iti mo te rota, a ko te utu whakamutunga me nui ake. Ki te kore, ka noho kore te rota.

I tenei tauira, kei te mahi matou me tetahi kaute i hangaia mo te hokohoko. Ko te roanga o te hokohoko he 3000 poraka, a ko te utu timata o te rota ko te 0,001 NGA NGARU. Ka taea e te kaiuru te tuku tono ma te tuku i te DataTransaction me te "utu" matua me te uara o ta raatau tono.

Ko te utu o te tono hou me teitei ake i te utu o naianei mo tenei matua, me te kaiuru me whai tohu [new_bid + commission] i roto i tana kaute. Me tuhi te wahitau o te kaitono ki te mara "kaituku" i roto i te RaraungaTransaction, a me noho te teitei o te poraka tono o naianei i roto i te waa hokohoko.

Mena i te mutunga o te hokohoko kua whakatauhia e te kaiuru te utu nui rawa atu, ka taea e ia te tuku ExchangeTransaction hei utu mo te rota e rite ana ki te utu kua tohua me te takirua moni.

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. Te hokohoko Tatimana o nga utu whakaheke

I roto i te hokohoko Tatimana, he maha nga utu ka tukuna i te tuatahi ki te utu nui ake i ta te kaihoko e pai ana ki te utu. Ka whakahekehia te utu i ia taahiraa kia whakaae tetahi o nga kaiuru ki te hoko i te rota i te utu o naianei.

I roto i tenei tauira ka whakamahia e matou nga taurite rite ki te waa o mua, me te utu utu ina heke te delta. Ka tirohia e te tuhinga kaute mena ko te kaiuru te tangata tuatahi ki te whakatakoto peti. Ki te kore, kaore e whakaaetia te DataTransaction e te poraka.

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 "utu-katoa"

Ko te "utu-katoa" he hokohoko ka utua e nga kaiuru katoa te tono, ahakoa ko wai te toa i te rota. Ka utua e ia kaiuru hou he tono, a ko te kaiuru nana te utu nui ka riro te rota.

I roto i ta maatau tauira, ka tukuna e ia kaiuru hokohoko he tono ma te DataTransaction me te (matua, uara)* = ("winner", address),("utu", utu). Ko taua RaraungaTransaction ka whakaaetia mena he WhakawhitiTransaction kua ta tenei kaiuru me tana hainatanga me tana tono he teitei ake i nga mea katoa o mua. Ka haere tonu te hokohoko kia tae ra ano ki te mutungaHeight.

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

Inihua / Crowdfunding

Me whai whakaaro koe ki tetahi ahuatanga e hiahia ana koe ki te inihua i nga rawa a nga kaiwhakamahi ki nga mate putea. Hei tauira, e hiahia ana te kaiwhakamahi ki te taurangi mehemea ka heke te utu o tetahi tohu, ka taea e ia te whakahoki mai i te moni katoa i utua mo enei tohu, me te pai ki te utu i te nui o te inihua.

Hei whakatinana i tenei, me tuku nga "tohu inihua". Na ka whakauruhia he tuhinga ki runga i te kaute a te kaipupuri kaupapa here, ka tuku noa i nga Whakawhitiwhiti e tutuki ana etahi tikanga kia mahia.

Hei aukati i nga whakapaunga takirua, me tono koe ki te kaiwhakamahi kia tukuna he RaraungaTransaction ki te kaute a te kaipupuri kaupapa here i mua me te (matua, uara) = (purchaseTransactionId, sellOrderId) me te aukati i te tuku RaraungaTransactions me te kii kua whakamahia kee.

Na reira, ko nga tohu a te kaiwhakamahi me whakauru te ID tauwhitinga o te hoko tohu inihua. Ko te takirua moni me rite ki te tauwhitinga hoko. Me rite ano te utu ki tera i whakaritea i te wa o te hokonga, haunga te utu o te inihua.

E mohiohia ana i muri mai ka hokona e te kaute inihua nga tohu inihua mai i te kaiwhakamahi i te utu kaore i iti iho i te utu i hokona e ia: ka hangaia e te putea inihua he ExchangeTransaction, ka hainatia e te kaiwhakamahi te ota (mehemea kua oti tika te whakawhitinga), te Ka hainatia e te kaute inihua te ota tuarua me te tauwhitinga katoa ka tukuna atu ki te poraka.

Mena kaore he hoko ka puta, ka taea e te kaiwhakamahi te hanga ExchangeTransaction kia rite ki nga ture e whakaahuatia ana i roto i te tuhinga me te tuku i te whakawhitinga ki te poraka. Ma tenei ka taea e te kaiwhakamahi te whakahoki i nga moni kua pau mo te hoko o nga tohu inihua.

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

Ka taea te hanga i tetahi tohu inihua hei taonga atamai, hei tauira, hei aukati i tana whakawhiti ki te hunga tuatoru.

Ka taea hoki te whakatinana i tenei kaupapa mo nga tohu roopu moni, ka whakahokia ki nga kaipupuri mehemea kaore i kohia te moni e hiahiatia ana.

Taake tauwhitinga

E tika ana hoki nga kirimana atamai i roto i nga keehi e tika ana ki te kohi taake mo ia tauwhitinga me etahi momo rawa. Ka taea tenei ma tetahi rawa hou kua whakauruhia tautoko mo nga whakawhitinga me nga rawa atamai:

1. Ka tukuna e matou te FeeCoin, ka tukuna ki nga kaiwhakamahi i te utu tuturu: 0,01 WAVES = 0,001 FeeCoin.

2. Whakaritea te tautoko mo te FeeCoin me te utu utu: 0,001 WAVES = 0,001 FeeCoin.

3. Tautuhia te tuhinga e whai ake nei mo te rawa atamai:

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
}

Inaianei i nga wa katoa ka whakawhitia e te tangata nga taonga atamai N, ka hoatu e ratou a FeeCoin ki a koe i te nui o te N/taxDivisor (ka taea te hoko mai i a koe i te 10 *N/taxDivisor WAVES), ka hoatu e koe te miner N/taxDivisor WAVES. Ko te mutunga, ko to hua (taake) ka 9*N / taakeDivisor WAVES.

Ka taea hoki e koe te mahi taake ma te whakamahi i te tuhinga taonga atamai me te 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
}

Te hokinga moni me nga kaupapa pono

Ko te Cashback he momo kaupapa piripono ka whakahokia e te kaihoko tetahi wahi o te moni i pau mo tetahi hua, ratonga ranei.

I te wa e whakatinanahia ana tenei keehi ma te whakamahi i te kaute atamai, me tirotiro e matou nga tohu kia rite ki ta matou i mahi i roto i te keehi inihua. Hei aukati i nga whakapaunga takirua, me tuku e te kaiwhakamahi he RaraungaTransaction me te (matua, uara) = (purchaseTransactionId, cashbackTransactionId) i mua i te whakahoki moni.

Me whakarite hoki he aukati i nga taviri o naianei ma te whakamahi i te DataTransaction. cashbackDivisor - te waeine kua wehea e te hea putea. Ko era. Mena he 0.1 te wahanga o te moni whakahoki, katahi ka wehea te putea 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)
}

Huri ngota

Ko te Huri Atomic ka taea e nga kaiwhakamahi te whakawhiti taonga me te kore awhina o te whakawhiti. Ma te whakawhiti ngota, me whakau nga kaiuru e rua ki te tauwhitinga i roto i tetahi waa.

Mena kaore tetahi o nga kaiuru e whakarato i te whakapumautanga tika o te tauwhitinga i roto i te wa i whakaritea mo te tauwhitinga, ka whakakorehia te whakawhitinga me te kore e puta te whakawhitinga.

I roto i ta maatau tauira, ka whakamahia e matou te tuhinga kaute atamai e whai ake nei:

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
}

I roto i te tuhinga e whai ake nei ka titiro tatou ki te whakamahi i nga kaute atamai i roto i nga taputapu putea penei i nga whiringa, nga wa kei te heke mai me nga pire.

Source: will.com

Tāpiri i te kōrero