No ka hoʻohana ʻana i nā moʻolelo akamai ʻo Waves: mai nā mea kūʻai aku i nā polokalamu bonus

No ka hoʻohana ʻana i nā moʻolelo akamai ʻo Waves: mai nā mea kūʻai aku i nā polokalamu bonus

Hoʻopili pinepine ʻia ʻo Blockchain me nā cryptocurrencies, akā ʻoi aku ka nui o nā wahi o ka noi ʻana o ka ʻenehana DLT. ʻO kekahi o nā wahi hoʻohiki maikaʻi loa no ka hoʻohana ʻana i ka blockchain he ʻaelike akamai i hoʻokō ʻia a ʻaʻole koi i ka hilinaʻi ma waena o nā ʻaoʻao i komo i loko.

RIDE - he ʻōlelo no nā ʻaelike akamai

Ua hoʻomohala ʻo Waves i kahi ʻōlelo kūikawā no nā ʻaelike akamai - RIDE. Aia kona palapala piha maanei. A maanei - ʻatikala e pili ana i kēia kumuhana ma Habr.

He predicate ka ʻaelike RIDE a hoʻihoʻi i ka "ʻoiaʻiʻo" a i ʻole "fase" ma ke ʻano he puka. No laila, ua hoʻopaʻa ʻia ke kālepa ma ka blockchain a i ʻole e hōʻole ʻia. Hoʻopaʻa piha ka ʻaelike akamai i ka hoʻokō ʻana i nā kūlana i kuhikuhi ʻia. ʻAʻole hiki ke hana i nā hana mai kahi ʻaelike ma RIDE i kēia manawa.

I kēia lā, ʻelua ʻano o nā ʻaelike akamai Waves: nā moʻokāki akamai a me nā waiwai akamai. ʻO ka moʻokāki akamai he moʻokāki mea hoʻohana maʻamau, akā ua hoʻonohonoho ʻia kahi palapala no ia e hoʻomalu i nā hana āpau. E like paha ke ʻano o kahi palapala moʻokāki akamai, no ka laʻana:

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

ʻO tx kahi hana e hana ʻia ana e ʻae mākou i ka hoʻohana ʻana i ke ʻano hana hoʻohālikelike inā ʻaʻole ia he hana hoʻoili. Hoʻohana ʻia ka hoʻohālikelike ʻana ma RIDE e nānā i ke ʻano o ke kālepa. Hiki ke hana ʻia nā moʻokāki a pau i ka moʻohelu moʻokāki akamai ʻano kālepa.

Hiki i ka ʻatikala ke haʻi aku i nā ʻano like ʻole, hoʻohana i nā kūkulu "inā-a laila-else" a me nā ʻano hana ʻē aʻe no ka nānā piha ʻana i nā kūlana. No ka hōʻoia ʻana i ka piha a me ka paʻakikī o nā ʻaelike i maʻalahi ke wānana ma mua o ka hoʻomaka ʻana o ka ʻaelike, ʻaʻole i loko o RIDE nā puka lou a lele paha.

ʻO nā hiʻohiʻona ʻē aʻe o nā moʻohelu Waves ka loaʻa ʻana o kahi "mokuʻāina," ʻo ia hoʻi, ke kūlana o ka moʻokāki. Hiki iā ʻoe ke kākau i kahi helu pau ʻole o nā pālua (kī, waiwai) i ka mokuʻāina me ka hoʻohana ʻana i nā hana ʻikepili (DataTransaction). Hiki ke hana ʻia kēia ʻike ma o ka REST API a pololei i ka ʻaelike akamai.

Hiki i kēlā me kēia kālepa ke komo i nā hōʻike hōʻoia, kahi e hoʻokomo ʻia ai ka pūlima o ka mea komo, ka ID o ka hana i koi ʻia, a pēlā aku.

Hana pū me RIDE ma o ʻaneʻi hiki iā ʻoe ke ʻike i ka ʻike i hōʻuluʻulu ʻia o ka ʻaelike (inā i hui ʻia), hana i nā moʻolelo hou a hoʻonohonoho i nā palapala no ia, a me ka hoʻouna ʻana i nā kālepa ma o ka laina kauoha.

No ke kaʻina holoʻokoʻa, me ka hoʻokumu ʻana i kahi moʻokāki, ke kau ʻana i kahi ʻaelike akamai ma luna a me ka hoʻouna ʻana i nā kālepa, hiki iā ʻoe ke hoʻohana i kahi waihona no ka launa pū ʻana me ka REST API (no ka laʻana, C#, C, Java, JavaScript, Python, Rust, Elixir) . No ka hoʻomaka ʻana e hana me ka IDE, e kaomi wale i ke pihi HOU.

He ākea nā mea hiki ke hoʻohana i nā ʻaelike akamai: mai ka pāpā ʻana i nā kālepa i kekahi mau helu ("black list") i nā dApps paʻakikī.

I kēia manawa, e nānā kākou i nā hiʻohiʻona kikoʻī o ka hoʻohana ʻana i nā ʻaelike akamai i ka ʻoihana: i ka wā e alakaʻi ana i nā kudala, ʻinikua, a me ka hoʻokumu ʻana i nā papahana kūpaʻa.

Na Kudala

ʻO kekahi o nā kūlana no ke kūʻai kūleʻa ʻana ʻo ia ka ʻike: pono e hilinaʻi nā poʻe komo ʻaʻole hiki ke hoʻololi i nā noi. Hiki ke hoʻokō ʻia kēia ma muli o ka blockchain, kahi e loaʻa ai nā ʻikepili i hoʻololi ʻole e pili ana i nā bets āpau a me ka manawa i hana ʻia ai i nā poʻe āpau.

Ma ka Waves blockchain, hiki ke hoʻopaʻa ʻia nā noi ma ka mokuʻāina kūʻai kūʻai ma o DataTransaction.

Hiki iā ʻoe ke hoʻonohonoho i ka manawa hoʻomaka a me ka hopena o ke kūʻai aku me ka hoʻohana ʻana i nā helu poloka: ʻo ke alapine o ka hoʻokumu ʻana o ka poloka i ka Waves blockchain ua like ia me 60 kekona.

1. ʻŌlelo Pelekane ke kūʻai kūʻai piʻi

ʻO ka poʻe i komo i kahi kūʻai kūʻai Pelekania e hoʻokūkū me kekahi i kekahi. Pono kēlā me kēia bet hou ma mua o ka mua. Hoʻopau ke kūʻai ʻana i ka wā ʻaʻohe mea kūʻai aku e ʻoi aku ma mua o ke kumukūʻai hope loa. I kēia hihia, pono e hāʻawi ka mea kūʻai kiʻekiʻe i ka nui i ʻōlelo ʻia.

Aia kekahi koho kūʻai aku kahi e kau ai ka mea kūʻai aku i ke kumu kūʻai liʻiliʻi no ka hailona, ​​a ʻo ke kumu kūʻai hope e pono ma mua o ia. A i ʻole, ʻaʻole kūʻai ʻia ka hailona.

Ma kēia laʻana, ke hana nei mākou me kahi moʻokāki i hana ʻia no ke kūʻai aku. ʻO ka lōʻihi o ke kūʻai ʻana he 3000 poloka, a ʻo ke kumukūʻai hoʻomaka o ka hailona ʻo 0,001 WAVES. Hiki i ka mea komo ke waiho i kahi koho ma ka hoʻouna ʻana i kahi DataTransaction me ke kī "kumukūʻai" a me ka waiwai o kā lākou uku.

Pono e ʻoi aku ke kiʻekiʻe o ke kumu kūʻai hou ma mua o ke kumu kūʻai o kēia kī, a pono e loaʻa i ka mea komo nā hōʻailona [new_bid + komisina] ma kāna moʻokāki. Pono e hoʻopaʻa ʻia ka helu wahi o ka mea nāna e hoʻouna aku ma ke kahua "mea hoʻouna" ma ka DataTransaction, a ʻo ke kiʻekiʻe o ka poloka koho i kēia manawa pono i loko o ka manawa kūʻai.

Inā i ka pau ʻana o ke kūʻai ʻana ua kau ka mea komo i ke kumukūʻai kiʻekiʻe loa, hiki iā ia ke hoʻouna i kahi ExchangeTransaction e uku no ka ʻāpana kūpono ma ke kumu kūʻai a me nā pālua kālā.

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. Kūʻai kūʻai ʻo Dutch i ka emi ʻana o nā kumukūʻai

Ma kahi kūʻai kūʻai Dutch, hāʻawi mua ʻia ka nui ma ke kumukūʻai kiʻekiʻe ma mua o ka mea a ka mea kūʻai aku e makemake e uku. E emi ana ke kumukūʻai i kēlā me kēia pae a hiki i ka ʻae ʻana o kekahi o nā mea komo e kūʻai i ka hailona ma ke kumukūʻai o kēia manawa.

Ma kēia laʻana, hoʻohana mākou i nā mea like me ka mea ma mua, a me ke kumu kūʻai i ka wā e emi ai ka delta. E nānā ka moʻolelo moʻohelu inā ʻo ka mea komo ka mea mua e kau i ka bet. A i ʻole, ʻaʻole ʻae ʻia ka DataTransaction e ka 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. Ke kūʻai aku i ka "uku a pau"

ʻO "All-pay" kahi kūʻai kūʻai kahi e uku ai nā mea komo a pau i ke kumukūʻai, me ka ʻole o ka mea i lanakila i ka hailona. E uku ana kēlā me kēia mea hou i ke kumu kūʻai, a ʻo ka mea i hoʻokō i ka uku kiʻekiʻe e lanakila i ka hailona.

Ma kā mākou laʻana, hāʻawi kēlā me kēia mea komo i ke kūʻai aku ma o DataTransaction me (key, value)* = ("winner", address),("price", price). Ua ʻae ʻia kēlā DataTransaction inā loaʻa i kēia mea komo kahi TransferTransaction me kāna pūlima a ʻoi aku ka kiʻekiʻe o kāna noi ma mua o nā mea mua. Ke hoʻomau nei ke kūʻai aku a hiki i ka endHeight.

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

Inikua / Crowdfunding

E noʻonoʻo kākou i kahi kūlana kahi e pono ai ʻoe e hōʻoia i ka waiwai o nā mea hoʻohana i nā poho kālā. No ka laʻana, makemake ka mea hoʻohana i kahi hōʻoia inā e emi ka hōʻailona, ​​​​e hiki iā ia ke hoʻihoʻi i ka nui o ka uku i uku ʻia no kēia mau hōʻailona, ​​​​a makemake ʻo ia e uku i kahi ʻinikua kūpono.

No ka hoʻokō ʻana i kēia, pono e hoʻopuka ʻia nā "hōʻailona hōʻailona". A laila hoʻokomo ʻia kahi palapala ma ka moʻokāki o ka mea kuleana, e ʻae wale i kēlā mau ExchangeTransactions e kū i kekahi mau kūlana e hoʻokō ʻia.

No ka pale ʻana i ka hoʻolilo pālua, pono ʻoe e noi i ka mea hoʻohana e hoʻouna i kahi DataTransaction i ka moʻokāki o ka mea kuleana ma mua me (key, value) = (purchaseTransactionId, sellOrderId) a pāpā i ka hoʻouna ʻana i DataTransactions me kahi kī i hoʻohana ʻia.

No laila, pono e loaʻa i nā hōʻike o ka mea hoʻohana ka ID kālepa o ke kūʻai ʻana i ka hōʻailona ʻinikua. Pono e like ka pai kālā me ke kūʻai kūʻai. Pono e like ke kumukūʻai me ka mea i hoʻopaʻa ʻia i ka manawa kūʻai, hoʻemi ʻia ke kumukūʻai o ka ʻinikua.

Ua hoʻomaopopo ʻia ma hope o ke kūʻai ʻana o ka ʻinikua i nā hōʻailona ʻinikua mai ka mea hoʻohana ma ke kumukūʻai ʻaʻole i emi iho ma mua o ka mea āna i kūʻai ai iā lākou: hoʻokumu ka waihona ʻinikua i kahi ExchangeTransaction, hoʻopaʻa inoa ka mea hoʻohana i ke kauoha (inā hoʻopau pololei ke kālepa), ka hōʻailona ka moʻokāki ʻinikua i ke kauoha ʻelua a me ke kālepa holoʻokoʻa a hoʻouna iā ia i ka blockchain.

Inā ʻaʻohe kūʻai, hiki i ka mea hoʻohana ke hana i kahi ExchangeTransaction e like me nā lula i wehewehe ʻia ma ka palapala a hoʻouna i ke kālepa i ka blockchain. Ma kēia ala e hiki ai i ka mea hoʻohana ke hoʻihoʻi i ke kālā i hoʻolilo ʻia ma ke kūʻai ʻana i nā hōʻailona hōʻoia.

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

Hiki ke hoʻolilo ʻia kahi hōʻailona ʻinikua i waiwai akamai, no ka laʻana, e pāpā i kāna hoʻoili ʻana i nā ʻaoʻao ʻekolu.

Hiki ke hoʻokō ʻia kēia kumumanaʻo no nā hōʻailona crowdfunding, i hoʻihoʻi ʻia i ka poʻe nona inā ʻaʻole i hōʻiliʻili ʻia ka nui i koi ʻia.

ʻauhau ʻauhau

Hoʻohana ʻia nā ʻaelike akamai i nā hihia kahi e pono ai e hōʻiliʻili i ka ʻauhau ma kēlā me kēia kālepa me nā ʻano waiwai. Hiki ke hana i kēia ma o kahi waiwai hou me ka hoʻokomo kākoʻo no nā hana me nā waiwai akamai:

1. Hoʻopuka mākou i ka FeeCoin, e hoʻouna ʻia i nā mea hoʻohana ma ke kumukūʻai paʻa: 0,01 WAVES = 0,001 FeeCoin.

2. E hoʻonohonoho i ke kākoʻo no FeeCoin a me ka uku hoʻololi: 0,001 WAVES = 0,001 FeeCoin.

3. E hoʻonoho i kēia palapala no ka waiwai akamai:

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
}

I kēia manawa i kēlā me kēia manawa e hoʻololi kekahi i nā waiwai akamai N, e hāʻawi lākou iā FeeCoin i ka nui o N/taxDivisor (hiki ke kūʻai ʻia mai iā ʻoe ma 10 *N/taxDivisor WAVES), a hāʻawi ʻoe i ka mea miner N/taxDivisor WAVES. ʻO ka hopena, ʻo kāu loaʻa kālā (ʻauhau) ʻo 9*N / taxDivisor WAVES.

Hiki iā ʻoe ke hana i ka ʻauhau me ka hoʻohana ʻana i kahi palapala waiwai akamai a me 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 a me nā polokalamu kūpaʻa

ʻO ka Cashback kahi ʻano papahana kūpaʻa kahi e hoʻihoʻi ai ka mea kūʻai mai i ka hapa o ka nui i hoʻolilo ʻia ma kahi huahana a lawelawe paha.

I ka hoʻokō ʻana i kēia hihia me ka hoʻohana ʻana i kahi moʻokāki akamai, pono mākou e nānā i nā hōʻoia e like me kā mākou i hana ai i ka hihia inikua. No ka pale ʻana i ka hoʻolilo pālua, pono ka mea hoʻohana e hoʻouna i kahi DataTransaction me (ki, waiwai) = (purchaseTransactionId, cashbackTransactionId) ma mua o ka loaʻa ʻana o ke kālā.

Pono mākou e hoʻopaʻa i nā kī i loaʻa me ka hoʻohana ʻana i DataTransaction. cashbackDivisor - ʻāpana i puʻunaue ʻia e ka ʻāpana cashback. ʻO kēlā mau mea. inā he 0.1 ka puʻu kālā, a laila 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)
}

Hoʻololi atomika

Hāʻawi ka Atomic swap i nā mea hoʻohana e hoʻololi i nā waiwai me ke kōkua ʻole o kahi hoʻololi. Me kahi swap atomic, pono nā mea ʻelua i ke kālepa e hōʻoia i loko o kekahi manawa.

Inā ʻaʻole i hāʻawi ka liʻiliʻi o hoʻokahi o nā mea komo i ka hōʻoia pololei o ke kālepa i loko o ka manawa i hoʻokaʻawale ʻia no ke kālepa, hoʻopau ʻia ke kālepa a ʻaʻole hiki ke hoʻololi.

Ma kā mākou hiʻohiʻona, e hoʻohana mākou i kēia ʻatikala moʻokāki akamai:

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
}

Ma ka ʻatikala aʻe e nānā mākou i ka hoʻohana ʻana i nā moʻolelo akamai i nā mea kālā e like me nā koho, nā wā e hiki mai ana a me nā bila.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka