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