
I le taimi muamua Na matou vaʻavaʻai i le tele o mataupu o le faʻaogaina o tala faʻapitoa i pisinisi, e aofia ai faʻatautuʻi ma polokalama faʻamaoni.
O le asō o le a tatou talanoa ai pe faʻafefea ona faʻaleleia e tala faʻamatalaga ma aseta atamai le manino ma le faʻamaoni o mea tau tupe e pei o filifiliga, lumanaʻi ma pili.
Filifiliga
O se filifiliga o se konekarate faafesuiaiga lea e tuʻuina atu ai i le tagata faʻatau le aia tatau e faʻatau ai se aseta i se tau faʻapitoa poʻo leʻi oʻo i se aso patino, ae e le faʻatagaina o ia e faia.
O le faʻatinoga o le filifiliga e mafai ona faʻapea:
Matou te faʻaaogaina se aseta atamai mo filifiliga lava latou o se meafaigaluega ma se tala atamai mo le tagata auai o loʻo galue o se fefaʻatauaʻiga ma tuʻuina atu filifiliga. Ua folafola e le sui auai o le fesuiaiga o le a ia faatauina atu se aofaiga o se aseta faapitoa i se tau faatau atu i le va o le maeʻa o le amataga ma le maeʻa o le poloka maualuga).
I totonu o le tulafono o aseta atamai, o le a matou siakiina na o le fefaʻatauaʻiga i le va o maualuga faʻamaonia, ma o le a le siakiina se isi mea; matou te tuʻuina atu tiute uma mo le tausisia o tulafono i le tulafono a le sui auai.
Tulafono o aseta atamai:
let expirationStart = 100000
let expirationEnd = 101440
match tx {
case some : ExchangeTransaction | TransferTransaction =>
height > expirationStart && height <= expirationEnd
case _ => false
}
O le a tatou manatu o gaioiga e faia e pei ona taʻua i lalo: e faʻatau atu e se sui auai faʻatau filifiliga e faʻatau ai se aseta, ma e mafai e isi tagata auai ona tuʻuina atu nei filifiliga pe fefaʻatauaʻi. Ina ia faʻaaogaina lana aia tatau e faʻatau ai, e tatau i le tagata faʻatau faʻatau ona tuʻuina atu le numera manaʻomia o filifiliga i le teugatupe a le tagata faʻatau, o lona uiga, o le sui sui. O le isi, na te tusia faʻamatalaga e uiga i le maeʻa o le fesiitaiga i le setete o le sui auai, ma na o le taimi lava e mafai ai e le ExchangeTransaction ona faʻagasolo e tusa ai ma tulaga faʻamaonia o le faʻatau ma le faʻatau.
I totonu o le tulafono faʻamatalaga atamai, e tatau ona tatou mautinoa o soʻo se ExchangeTransaction e ui atu i ai mo le gaioiga mulimuli o le faʻatau ma le faʻatau atu e fetaui ma tulaga faʻamaonia, ma e faʻatau e le tagata auai le numera o iunite na ia lafoina i le teugatupe a le sui auai. E tatau i le tagata faʻatau faʻatau ona tuʻuina atu le DataTransaction saʻo e uiga i le fesiitaiga ina ia mafai ai e le sui o le fesuiaiga ona aloese mai tupe faʻaalu faalua. I lenei DataTransaction, e tuʻuina e le tagata faʻatau, e tusa ai ma le ki e tutusa ma lona tuatusi, o se tau e tutusa ma le numera o filifiliga na tuʻuina atu i le teugatupe a le sui auai, o lona uiga, le numera o aseta e mafai ona ia faʻatau.
Smart account code:
#владелец аккаунта дает обязательство продать определенное количество юнитов ассета
#по цене sellPrice между высотами блоков expirationStart и expirationEnd
let expirationStart = 100000
let expirationEnd = 101440
let sellPrice = 10000
let amountAsset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let priceAsset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#ID ассета-опциона
let optionsAsset = base58'7jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#извлекаем из транзакции адрес отправителя
let this = tx.sender
match tx {
case dataTx : DataTransaction =>
#извлекаем количество юнитов из дата-транзакции по ключу (ID пользователя)
let units = extract(getInteger(dataTx.data, dataTx.data[0].key))
#извлекаем трансфер-транзакцию опционов из пруфа
let e = transactionById(dataTx.proofs[2]) #
match e {
case transferTx : TransferTransaction =>
#убеждаемся, что трансфер был на текущий адрес
(transferTx.recipient == this) &&
#убеждаемся, что отправитель транзакции написал в качестве ключа свой ID
dataTx.data[0].key == toBase58String(transferTx.sender.bytes) &&
sigVerify(dataTx.bodyBytes, dataTx.proofs[0], transferTx.senderPublicKey) &&
#убеждаемся, что указанное количество юнитов соответствует посланному количеству опционов
(units == transferTx.amount) &&
#убеждаемся, что был переведен именно ассет-опцион
(transferTx.assetId == optionsAsset)
case _ => false
} &&
size(dataTx.data) == 1 && !isDefined(getInteger(this, dataTx.data[0].key))
&& height > expirationStart && height <= expirationEnd
case exchangeTx : ExchangeTransaction =>
#убеждаемся, что итоговый обмен происходит по указанным заранее правилам
let correctAssetPair = exchangeTx.sellOrder.assetPair.amountAsset == amountAsset &&
exchangeTx.sellOrder.assetPair.priceAsset == priceAsset
let correctPrice = exchangeTx.sellOrder.price == sellPrice
#извлекаем дата-транзакцию из пруфа
let d = transactionById(exchangeTx.proofs[2])
match d{
case dataTx : DataTransaction =>
let buyOrderSender = dataTx.data[0].key
toBase58String(exchangeTx.buyOrder.sender.bytes) == buyOrderSender &&
exchangeTx.amount == extract(getInteger(dataTx.data, buyOrderSender))
case _ => false
} &&
exchangeTx.sellOrder.sender == this &&
correctAssetPair && correctPrice &&
height > expirationStart && height <= expirationEnd
case _ => false
}
Lumanai i luga o tala atamai
E le pei o se filifiliga, o le lumanaʻi (konekarate i le lumanaʻi) e le o se aia tatau, ae o se noataga a le tagata faʻatau e faʻatau se aseta i se tau na faʻatulagaina e le konekarate i se taimi i le lumanaʻi.
I se tulaga lautele, o le tusiaina o se lumanaʻi e tutusa ma le tusiaina o se filifiliga. O iinei o le aseta atamai e galue o se lumanaʻi.
E tatau fo'i ona e fa'amautinoa e saini uma e le fa'atau ma le fa'atau le fa'atauga fa'atau. O le lumana'i o se matafaioi e tatau ona fa'ataunu'uina i so'o se tulaga. O lona uiga afai e teena e le tagata faʻatau poʻo le tagata auai a latou noataga, soʻo se tagata auai i le fesoʻotaʻiga e mafai ona auina atu se fefaʻatauaiga, ma faʻataunuʻu ai le lumanaʻi.
O le tusi aseta atamai e pulea uma TransferTransactions ma ExchangeTransactions o le aseta i le lumanaʻi, faʻamaonia i latou pe a fai na faia e le tagata faʻatau se faʻatonuga mo se faʻatauga o le lumanaʻi aseta mai le sui sui.
O lenei poloaiga e tatau ona faʻamaonia ma faʻamalieina tulaga o loʻo tuʻuina atu ai le lumanaʻi. Ina ia faʻamaonia se faʻatonuga, e mafai ona e ulufale i ona fanua uma i le setete o le faʻatau a le faʻatau faʻatasi ma le faʻataʻitaʻiga o le byte o le faʻatonuga sainia, ona faʻatino lea o faʻamaoniga i fafo.
I le taimi nei, o le RIDE e le o iai se galuega faʻapitoa mo le faʻavasegaina o fefaʻatauaiga, ae aofia ai meafaigaluega uma e manaʻomia mo lona faʻatinoga. O le mea lea, e mafai e le au atinaʻe ona taumafai e faʻatino lenei uiga ia i latou lava.
Fa'amatalaga e tele saini / Escrow
O le tele o saini fa'amatalaga e mafai ai e le to'atele o tagata fa'aoga ona pulea fa'atasi aseta (fa'ata'ita'iga, fefa'ataua'iga fa'atasi ma aseta e na'o le mafai pe a fai e tolu mai le to'afa tagata fa'aoga e iai saini). Ina ia fatuina tala e tele-saini i le gagana RIDE, e mafai ona matou faʻaogaina faʻamaoniga o fefaʻatauaiga.
E mafai fo'i ona fa'aoga se fa'amatalaga e tele saini e fai ma fa'amaumauga e teu ai tupe se'ia fa'ataunu'u e itu o le konekarate a latou matafaioi.
let alicePubKey = base58'5AzfA9UfpWVYiwFwvdr77k6LWupSTGLb14b24oVdEpMM'
let bobPubKey = base58'2KwU4vzdgPmKyf7q354H9kSyX9NZjNiq4qbnH2wi2VDF'
let cooperPubKey = base58'GbrUeGaBfmyFJjSQb9Z8uTCej5GzjXfRDVGJGrmgt5cD'
#выясняем, кто предоставил корректные подписи
let aliceSigned = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey)) then 1 else 0
let bobSigned = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey)) then 1 else 0
let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey)) then 1 else 0
#суммируем все корректные подписи и проверяем их количество
aliceSigned + bobSigned + cooperSigned >= 2
Token curated resitala (TCR)
Ole tele ole poloka poloka e iai se fa'afitauli ile aseta oona. Mo se faʻataʻitaʻiga, soʻo se tuatusi na totogi se komisi e mafai ona fatuina se aseta i luga ole Waves.
O le faʻafitauli o le puipuia o tagata faʻaoga ma le poloka poloka lava ia mai aseta oona e mafai ona foia e se tusi resitala faʻamaonia (TCR) faʻatupuina e tagata e umia faʻailoga.
Ina ia palota mo se faʻailoga patino e faʻaopoopo i le lisi, e tuʻuina atu e le tagata e umia se tauofo e tutusa ma lana vaega o le aofaʻi o faʻailoga na tuʻuina atu. E iai se fa'ailoga i totonu o le tusi resitala pe a palota le to'atele oi latou e umia.
I la matou faʻataʻitaʻiga, matou te faʻatagaina le tagata faʻaoga e faʻaopoopo se faʻailoga i le lisi mo le iloiloga (i le taimi o le "luʻitau" vaitaimi) e faʻaaoga ai le ki o le setete = asset_name, pe a fai o le tau o le taimi nei o le numera = 0.
E le gata i lea, e tatau i le tagata faʻaoga ona i ai se paleni e le zero o lenei faʻailoga i totonu o lana atotupe. Ona oʻo mai ai lea o le taimi palota, lea e mafai ai e le tagata faʻaoga ona palota mo aseta taʻitasi i totonu o lana atotupe, ae naʻo le tasi, tuʻuina atu se faʻailoga mai le 1 i le 10. O palota a le tagata e faʻatusalia e ki o le fomu user_address+assetID.
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let addingStartHeight = 1000
let votingStartHeight = 2000
let votingEndHeight = 3000
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
#извлекаем адрес из пруфа транзакции
let address = addressFromPublicKey(tx.proofs[1])
match tx {
case t: DataTransaction =>
if(height > addingStartHeight)
then(
if(height < votingStartHeight)
then(
#adding
#выясняем, есть ли этот ассет у этого адреса
let hasTokens = assetBalance(address, asset) > 0
size(t.data) == 1
#убеждаемся, что этот ассет еще не был добавлен
&& !isDefined(getInteger(this, toBase58String(asset)))
#убеждаемся, что по ключу-ассету добавляется значение равное 0
&& extract(getInteger(t.data, toBase58String(asset))) == 0
&& hasTokens
)
else(
if(height < votingEndHeight)
then
(
#voting
#узнаем текущее количество голосов за данный ассет и задаваемое количество
let currentAmount = extract(getInteger(this, toBase58String(asset)))
let newAmount = extract(getInteger(t.data, toBase58String(asset)))
let betString = toBase58String(address.bytes) + toBase58String(asset)
#убеждаемся, что этот адрес еще не голосовал за этот ассет
let noBetBefore = !isDefined(getInteger(this, betString))
let isBetCorrect = extract(getInteger(t.data, betString)) > 0
&& extract(getInteger(t.data, betString)) <= 10
#убеждаемся, что у голосующего есть необходимые токены
let hasTokens = assetBalance(address, asset) > 0
#проверяем корректность значений транзакции
size(t.data) == 2 && isDefined(getInteger(this, toBase58String(asset)))
&& newAmount == currentAmount + 1
&& noBetBefore && isBetCorrect && hasTokens
)
else false
) && sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1])
)
else false
case _ => false
}
Totogi totogi
I lenei faʻataʻitaʻiga, o le a tatou vaʻavaʻai i le faʻaogaina o faʻamatalaga atamai e fai ai totogi masani mo se oloa poʻo se tautua i taimi faʻapitoa - "totogifuapauina o le lesitala".
Afai e tuʻuina atu e le tagata faʻaoga le tala atamai (e ala i faʻamaoniga tau fefaʻatauaiga) ma se ID TransferTransaction ma le aofaʻi manaʻomia o tupe faʻafeiloaʻi, e mafai ona ia tusia {key: address, value :) i le setete o tala. moni}.
O lona uiga e fa'amaonia e le tagata fa'aoga a latou saofaga i le oloa po'o le tautua. A maeʻa le saofaga, soʻo se tagata faʻaoga fesoʻotaʻiga e mafai ona seti le tau i tafatafa o le ki fetaui i le setete sese.
let subscriptionPeriod = 44000
let signature = tx.proofs[0]
let pk = tx.proofs[1]
let requiredAmount = 100000
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
match tx {
case d: DataTransaction =>
#извлекаем дату последнего платежа
let lastPaymentHeight = extract(getInteger(this, d.data[0].key + "_lastPayment"))
size(d.data) == 1 && d.data[0].value == "false" && lastPaymentHeight + subscriptionPeriod < height
||
(
let address = d.data[0].key
#извлекаем трансфер-транзакцию по ID, указанному в пруфах
let ttx = transactionById(d.proofs[0])
size(d.data) == 2
&& d.data[0].value == "true"
&& d.data[1].key == address + "_lastPayment"
&& match ttx {
case purchase : TransferTransaction =>
d.data[1].value == transactionHeightById(purchase.id)
&& toBase58String(purchase.sender.bytes) == address
&& purchase.amount == requiredAmount
&& purchase.recipient == this
#убеждаемся, что ассет waves
&& !isDefined(purchase.assetId)
case _ => false
}
)
case _ => false
}
Faiga palota
E mafai ona fa'aoga tala atamai e fa'atino ai le palota ile poloka poloka. O se faʻataʻitaʻiga o le palota mo le lipoti sili a le amepasa i totonu o le polokalame amepasa. O lo'o fa'aogaina le tulaga fa'amaumauga e fai ma fa'avae mo le fa'amauina o palota mo se filifiliga fa'apitoa.
I lenei faʻataʻitaʻiga, naʻo i latou na faʻatauina faʻailoga faʻapitoa "palota" e faʻatagaina e palota. E auina atu muamua e le tagata auai se DataTransaction ma le paga (key, value) = (purchaseTransactionId, buyTransactionId). Fa'asa le setiina o se isi tau mo lenei ki. I le fa'aogaina o lau tuatusi ma le filifiliga palota, e mafai ona e setiina le DataEntry na'o le tasi. Fa'ato'a mafai ona palota ile vaitaimi fa'amaoti.
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let address = addressFromPublicKey(tx.proofs[1])
let votingStartHeight = 2000
let votingEndHeight = 3000
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
match tx {
case t: DataTransaction =>
(height > votingStartHeight && height < votingEndHeight) &&
#убеждаемся, что у транзакции правильная подпись
sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1]) &&
#проверяем, что пользователь отдает свой голос напротив своего адреса
if (t.data[0].key == toBase58String(address.bytes))
then (
#извлекаем транзакцию перевод голосовательного токена из пруфов
let purchaseTx = transactionById(t.proofs[7])
match purchaseTx {
case purchase : TransferTransaction =>
let correctSender = purchase.sender == t.sender
let correctAsset = purchase.assetId == asset
let correctPrice = purchase.amount == 1
let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == t.id
correctSender && correctAsset && correctPrice && correctProof
case _ => false
}
)
else
size(t.data) == 1 && !isDefined(getBinary(this, t.data[0].key))
case _ => false
}
Pili o le fesuiaiga
O le promissory note ose noataga tusitusia e mana'omia ai le isi itu e totogi le isi vaega i se aofaiga tumau pe a mana'omia po'o se aso ua fa'atulaga.
I la matou faʻataʻitaʻiga, matou te faʻaaogaina se teugatupe atamai, o le aso e muta ai e fetaui ma le aso totogi o le pili.
let expiration = 100000
let amount = 10
let asset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
match tx {
case t: TransferTransaction =>
(t.assetId == asset)&&
(t.amount == amount)&&
(t.sender == Bob)&&
(t.recipient == Alice)&&
(sigVerify(t.bodyBytes, t.proofs[0], t.senderPublicKey))&&
(height >= expiration)
case _ => false
}
Faletupe
O le teuina o le tu'uina atu lea o tupe i totonu o se faletupe i lalo o nisi tulaga (vaitaimi, tului).
I la tatou faʻataʻitaʻiga, o le galuega a se faletupe e faʻatinoina e se faʻamatalaga atamai. A maeʻa se numera o poloka, e fetaui ma le taimi e teu ai, e mafai e le tagata faʻaoga ona toe faʻafoʻi a latou tupe ma le tului. O loʻo faʻamaoti mai e le tusitusiga le maualuga o poloka (finalHeight), pe a uma ona oʻo atu e mafai e le tagata faʻaoga ona aveese tupe mai le teugatupe.
maualugaUnit - le numera o poloka i le tasi iunite o le taimi (mo se faʻataʻitaʻiga, masina, tausaga, ma isi). Muamua matou te siaki mo se faʻamatalaga ma le paga (key, value) = (initialTransferTransaction, futureDataTransaction). E tatau i le tagata faʻaoga ona tuʻuina atu se TransferTransaction ma faʻamatalaga saʻo e uiga i le aofaʻi o tupe teu ma le tului na faʻaputuina mo le vaitaimi teu. O lenei faʻamatalaga e siakiina e faasaga i le uluai TransferTransaction, lea o loʻo i totonu o le faʻamaoniga TransferTransaction o loʻo iai nei. depositDivisor o le numera faafeagai o le tupe teu sea (afai e talia le tupe teu i le 10%, o le tupe teu sea o le 0,1, ma depositDevisor = 1/0,1 = 10).
let this = extract(tx.sender)
let depositDivisor = 10
let heightUnit = 1000
let finalHeight = 100000
match tx {
case e : TransferTransaction =>
#извлекаем высоту транзакции по ID транзакции в седьмом пруфе
let depositHeight = extract(transactionHeightById(e.proofs[7]))
#извлекаем транзакцию депозита
let purchaseTx = transactionById(e.proofs[7])
match purchaseTx {
case deposit : TransferTransaction =>
let correctSender = deposit.sender == e.sender
#убеждаемся, что пользователь переводит себе корректную сумму депозита + проценты
let correctAmount = deposit.amount + deposit.amount / depositDivisor * (height - depositHeight) / heightUnit == e.amount
let correctProof = extract(getBinary(this, toBase58String(deposit.id))) == e.id
correctSender && correctProof && correctAmount
case _ => false
}
&& finalHeight <= height
case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}
I le mataupu lona tolu ma le mulimuli i lenei faasologa, o le a tatou vaʻavaʻai i le tele o faʻaoga o aseta atamai, e aofia ai le faʻamaisaina ma le faʻatapulaʻaina o fefaʻatauaiga mo tuatusi patino.
puna: www.habr.com
