Fa'aaogaina o tala atamai a Waves: mai fa'atautu'i i polokalame ponesi

Fa'aaogaina o tala atamai a Waves: mai fa'atautu'i i polokalame ponesi

Blockchain e masani ona fesoʻotaʻi ma cryptocurrencies, ae o vaega o le faʻaogaina o tekonolosi DLT e sili atu le lautele. O se tasi o vaega sili ona faʻamoemoeina mo le faʻaogaina o poloka poloka o se konekarate atamai e faʻatinoina aunoa ma e le manaʻomia ai le faʻalagolago i le va o itu na ulufale i ai.

RIDE – ose gagana mo konekarate atamai

Ua atiaʻe e Waves se gagana faʻapitoa mo konekarate atamai - RIDE. O lo'o maua uma ana fa'amaumauga iinei. Ma iinei - tusiga i lenei autu i luga o Habr.

O le konekarate RIDE o se fa'ata'ita'iga ma toe fa'afo'i mai le "moni" po'o le "sese" e fai ma galuega. E tusa ai, o le fefaʻatauaiga o loʻo faʻamaumau i totonu o le poloka poloka pe teena. O le konekarate atamai e faʻamaonia atoatoa le faʻataunuʻuina o tulaga faʻapitoa. O le fa'atupuina o fefa'atauaiga mai se konekarate i le RIDE e le'o mafai nei.

I aso nei e lua ituaiga o konekarate atamai Waves: faʻamatalaga atamai ma aseta atamai. O se fa'amatalaga atamai o se fa'amatalaga masani a tagata fa'aoga, ae o lo'o fa'atulaga se fa'amaumauga e fa'atonutonu ai fefa'atauaiga uma. O se tusitusiga atamai e ono foliga faapenei, mo se faataitaiga:

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

tx ose fefa'ataua'iga o lo'o fa'agasolo ina ia matou fa'atagaina le fa'aogaina o le faiga fa'atusa pe afai e le o se fefa'ataua'iga fa'aliliu. Fa'atusa fa'atusa ile RIDE e fa'aoga e siaki ai le ituaiga fefa'ataua'iga. O fa'amatalaga uma o lo'o iai e mafai ona fa'agaoioia ile fa'amaumauga atamai ituaiga fefa'ataua'iga.

E mafai foʻi e le tusitusiga ona faʻaalia suiga, faʻaoga "pe afai-ona-ese" fausia ma isi metotia mo le siakiina atoatoa o tulaga. Ina ia mautinoa o konekarate o loʻo faʻamaonia atoatoa ma lavelave (tau) e faigofie ona vaʻai aʻo leʻi amataina konekarate, e le o iai ni matasele poʻo ni faʻamatalaga oso.

O isi vaega o tala a Waves e aofia ai le iai o se "setete," o lona uiga, le tulaga o le tala. E mafai ona e tusia se numera e le i'u o paga (ki, tau) i le setete o tala e faʻaaoga ai faʻamatalaga faʻamatalaga (DataTransaction). O nei fa'amatalaga e mafai ona fa'agasolo uma e ala ile REST API ma tuusa'o ile konekarate atamai.

O fefaʻatauaiga taʻitasi e mafai ona aofia ai le tele o faʻamaoniga, lea e mafai ona faʻapipiʻi ai le saini a le tagata auai, ID o le fefaʻatauaiga manaʻomia, ma isi.

Galulue ma RIDE e ala i IINEI faʻatagaina oe e vaʻai i le vaʻaiga tuʻufaʻatasia o le konekarate (pe a faʻapipiʻiina), fatuina tala fou ma seti tusitusiga mo ia, faʻapea foʻi ma le auina atu o fefaʻatauaiga e ala i le laina o le poloaiga.

Mo se taamilosaga atoa, e aofia ai le fatuina o se teugatupe, faʻapipiʻi se konekarate atamai i luga ma le lafoina o fefaʻatauaiga, e mafai foi ona e faʻaogaina se faletusi mo le fegalegaleai ma le REST API (mo se faʻataʻitaʻiga, C #, C, Java, JavaScript, Python, Rust, Elixir) . Ina ia amata galue ma le IDE, naʻo le kiliki i le NEW button.

O avanoa mo le faʻaaogaina o konekarate atamai e lautele: mai le faʻasaina o fefaʻatauaiga i nisi tuatusi ("lisi uliuli") i dApps lavelave.

Seʻi o tatou vaʻavaʻai i faʻataʻitaʻiga faʻapitoa o le faʻaogaina o konekarate atamai i pisinisi: pe a faʻatautaia faʻatau, inisiua, ma le fatuina o polokalama faʻamaoni.

Fa'atautu'i

O se tasi o aiaiga mo se fa'atautu'i manuia o le manino: e tatau i tagata auai ona mautinoa e le mafai ona fa'aogaina tauofo. E mafai ona ausia lenei mea faʻafetai i le poloka poloka, lea o faʻamatalaga e le masuia e uiga i peti uma ma le taimi na faia ai o le a avanoa mo tagata auai uma.

I luga o le Waves blockchain, o tauofoga e mafai ona faʻamaumau i le faʻamatalaga faʻatau oloa e ala i DataTransaction.

E mafai foʻi ona e setiina le amataga ma le faʻaiʻuga o le taimi o le faʻatautuʻi e faʻaaoga ai numera poloka: o le taimi ole faʻatupuina poloka i le Waves blockchain e tusa ma le tutusa. 60 sekone.

1. Fa'atautu'i tau a'e ile Igilisi

O tagata e auai i se fa'atautu'i fa'aPeretania e tu'uina atu tauofoga i le tauvaga a le tasi ma le isi. O peti fou taitasi e tatau ona sili atu i le peti muamua. E fa'ai'u le fa'atautu'i pe a leai se isi tauofo e sili atu i le tauofoga mulimuli. I lenei tulaga, e tatau i le tagata tauofo sili ona tuʻuina atu le aofaʻi o loʻo taʻua.

O lo'o iai fo'i le fa'atautu'i e fa'atulaga ai e le tagata fa'atau se tau maualalo mo le lotoa, ma o le tau mulimuli e tatau ona sili atu. A leai, e tumau pea le le fa'atauina o le fanua.

I lenei faʻataʻitaʻiga, o loʻo matou galulue faʻatasi ma se tala faʻapitoa na faia mo le faʻatau. Ole umi ole fa'atautu'i ole 3000 poloka, ma ole tau amata ole loto ole 0,001 WAVES. E mafai e se tagata auai ona tuʻuina se tauofo e ala i le lafoina o se DataTransaction ma le "tau" autu ma le tau o la latou ofo.

O le tau o le tauofoga fou e tatau ona maualuga atu nai lo le tau o loʻo i ai nei mo lenei ki, ma e tatau i le tagata auai ona i ai a itiiti ifo [new_bid + commission] faʻailoga i lana teugatupe. E tatau ona fa'amaumau le tuatusi o le tagata fa'atau i le "sender" field i le DataTransaction, ma o le maualuga o le poloka o lo'o i ai nei e tatau ona i totonu o le vaitaimi fa'atau.

Afai i le faaiuga o le faʻatautuʻi ua seti e le tagata auai le tau sili ona maualuga, e mafai ona ia auina atu se ExchangeTransaction e totogi ai le lotoa tutusa i le tau faʻamaonia ma le paʻu tupe.

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. Fa'atautu'i a Dutch o tau fa'aititia

I se fa'atautu'i Dutch, e tele naua muamua e ofoina atu i se tau e maualuga atu nai lo le mea e naunau le tagata fa'atau e totogi. O le tau e faʻaitiitia i lea laasaga ma lea laasaga seʻia malie se tasi o le au auai e faʻatau le lotoa i le tau o loʻo i ai nei.

I lenei faʻataʻitaʻiga matou te faʻaogaina tutusa tutusa e pei ona i ai muamua, faʻapea foʻi ma le laʻasaga tau pe a faʻaitiitia le delta. E siaki e le tala o le tala pe o le tagata auai o le tagata muamua lea e fai se peti. A leai, o le DataTransaction e le taliaina e le poloka poloka.

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. Fa'atautu'i "totogi uma"

“All-pay” o se fa'atautu'i lea e totogi uma ai e sui auai le tauofo, tusa lava po'o ai e manumalo i le vili. E totogi e sui fou ta'ito'atasi se tauofo, ma o le sui e faia le tau maualuga e manumalo i le vili.

I la matou faʻataʻitaʻiga, o tagata fai faʻatautuʻi taʻitasi e tuʻuina atu se tauofo e ala i DataTransaction ma (ki, tau)* = ("manumalo", tuatusi),("tau", tau). O lea Fa'amatalaga Fa'amatalaga e fa'amaonia pe afai o lenei sui auai ua uma ona i ai se TransferTransaction ma lana saini ma o lana ofo e maualuga atu nai lo mea uma na muamua atu. E fa'aauau pea le fa'atautu'i se'ia o'o i le 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)
}

Inisiua / Fa'atupega o Tagata

Se'i tatou mafaufau i se tulaga e te mana'omia e fa'amautu ai aseta a tagata fa'aoga mai tupe gau. Mo se faʻataʻitaʻiga, e manaʻo le tagata faʻaoga i se faʻamaoniga e faapea afai e faʻaititia se faʻailoga, o le a mafai ona ia toe maua le aofaʻi atoa na totogiina mo nei faʻailoga, ma e naunau e totogi se aofaʻiga talafeagai o inisiua.

Ina ia faʻatinoina lenei mea, e manaʻomia ona tuʻuina atu "faailoga inisiua". Ona faʻapipiʻi lea o se faʻamaumauga i luga o le teugatupe a le tagata fai inisiua, faʻatagaina naʻo na ExchangeTransactions e fetaui ma tulaga faʻapitoa e faʻatinoina.

Ina ia taofia faʻaalu faʻalua, e tatau ona e talosagaina le tagata faʻaoga e lafo se DataTransaction i le teugatupe a le tagata fai inisiua i le taimi muamua ma (key, value) = (purchaseTransactionId, sellOrderId) ma faʻasa le auina atu o DataTransactions ma se ki ua uma ona faʻaaogaina.

O le mea lea, o faʻamaoniga a le tagata faʻaoga e tatau ona i ai le ID fefaʻatauaʻiga o le faʻatauga faʻailoga inisiua. O le pa'aga tupe e tatau ona tutusa ma le fa'atauga fa'atau. E tatau fo'i ona tutusa le tau ma le tau na fa'amauina i le taimi o le fa'atau, to'ese le tau o le inisiua.

O loʻo malamalama mulimuli ane e faʻatau e le inisiua inisiua mai le tagata faʻaoga i se tau e le maualalo ifo nai lo le mea na ia faʻatau mai ai: o le inisiua e fatuina ai se ExchangeTransaction, e sainia e le tagata faʻaoga le poloaiga (pe a maeʻa saʻo le fefaʻatauaiga), le saini le teugatupe inisiua le poloaiga lona lua ma le fefaʻatauaiga atoa ma auina atu i le poloka poloka .

Afai e leai se faʻatauga e tupu, e mafai e le tagata faʻaoga ona fatuina se ExchangeTransaction e tusa ai ma tulafono o loʻo faʻamatalaina i totonu o le tusitusiga ma auina atu le fefaʻatauaiga i le poloka poloka. O le auala lea e mafai ai e le tagata faʻaoga ona toe faʻafoʻi tupe na faʻaalu i le faʻatauina o faʻailoga inisiua.

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

O se faʻailoga inisiua e mafai ona avea ma aseta atamai, mo se faʻataʻitaʻiga, e faʻasa ai lona faʻafeiloaʻi atu i isi vaega.

O lenei polokalame e mafai foi ona faʻatinoina mo faʻailoga faʻaputugatupe, lea e toe faʻafoʻi atu i tagata e ona pe afai e leʻi aoina le tupe manaʻomia.

Lafoga o fefa'atauaiga

O konekarate atamai e fa'aoga foi i mataupu e mana'omia ai le aoina o lafoga i fefa'atauaiga ta'itasi ma le tele o ituaiga aseta. E mafai ona faia lenei mea e ala i se aseta fou ma faʻapipiʻi lagolago mo fefa'atauaiga ma aseta atamai:

1. Matou te tuʻuina atu FeeCoin, lea o le a tuʻuina atu i tagata faʻaoga i se tau tumau: 0,01 WAVES = 0,001 FeeCoin.

2. Seti le lagolago mo le FeeCoin ma le fesuiaiga o tau: 0,001 WAVES = 0,001 FeeCoin.

3. Seti le mau lenei mo le aseta 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
}

I le taimi nei o taimi uma e faʻafeiloaʻi ai e se tasi N aseta atamai, o le a latou tuʻuina atu ia te oe le FeeCoin i le aofaʻi o N/taxDivisor (lea e mafai ona faʻatau mai ia te oe ile 10 *N/taxDivisor WAVES), ma o le ae tuʻuina atu i le miner N/taxDivisor WAVES. O le i'uga, o lau tupe mama (lafoga) o le a 9*N / taxDivisor WAVES.

E mafai fo'i ona e fa'atinoina lafoga e fa'aaoga ai se tusi aseta atamai ma 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 ma polokalame faamaoni

Cashback o se ituaiga o polokalama faamaoni lea e toe maua ai e le tagata faʻatau se vaega o le aofaʻi na faʻaalu i se oloa poʻo se tautua.

Pe a faʻatinoina lenei mataupu e faʻaaoga ai se tala atamai, e tatau ona tatou siaki faʻamaoniga i le auala tutusa e pei ona tatou faia i le inisiua. Ina ia taofia faʻaalu faʻalua, e tatau i le tagata faʻaoga ona tuʻuina atu se DataTransaction ma le (ki, tau) = (purchaseTransactionId, cashbackTransactionId) aʻo leʻi mauaina le cashback.

E tatau foi ona tatou setiina se faʻasaina o ki o loʻo iai e faʻaaoga ai le DataTransaction. cashbackDivisor - iunite vaevaeina i le tupe toe fa'asoa. O na. afai o le cashback sea e 0.1, o le 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 e mafai ai e tagata fa'aoga ona fesuiai aseta e aunoa ma le fesoasoani a se fesuiaiga. Faatasi ai ma se swap atomic, e manaʻomia uma tagata auai i le fefaʻatauaiga e faʻamaonia i totonu o se vaitaimi patino.

Afai e le itiiti ifo ma le tasi o tagata auai e le tuʻuina atu faʻamaoniga saʻo o le fefaʻatauaiga i totonu o le taimi atofaina mo le fefaʻatauaiga, e faʻaleaogaina le fefaʻatauaiga ma e le tupu le fesuiaiga.

I la matou faʻataʻitaʻiga, o le a matou faʻaogaina le faʻamatalaga atamai lea:

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 le isi tusiga o le a tatou vaʻavaʻai i le faʻaogaina o tala faʻapitoa i mea tau tupe e pei o filifiliga, lumanaʻi ma pili.

puna: www.habr.com

Faaopoopo i ai se faamatalaga