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