Blockchain ááẠáááŒá¬áá cryptocurrencies ááŸáá·áºáᬠáááºá
ááºááŸá¯ááŸááá±á¬áºáááºáž DLT áááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯ááá·áº áááºáááºáá»á¬ážááẠááá¯ááá¯áá»ááºááŒáá·áºáááºá blockchain ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœááºá¡áá¬ážá¡áá¬á¡ááŸááá¯á¶ážáááºáááºáá
áºáá¯áááºá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºáá±á¬á
áááºá
á¬áá»á¯ááºááŒá
áºááŒá®ážáááºážáá²ááá¯á·áááºáá±á¬áá«áá®áá»á¬ážá¡ááŒá¬ážáá¯á¶ááŒááºááŸá¯áááá¯á¡ááºáá«á
RIDE - á
áááºáá»áá±á¬ á
á¬áá»á¯ááºáá»á¬ážá¡ááœáẠáá¬áá¬á
áá¬áž
Waves ááẠá
áááºá
á¬áá»á¯ááºáá»á¬ážá¡ááœáẠá¡áá°ážáá¬áá¬á
áá¬ážááᯠáá®ááœááºáá²á·ááẠâ RIDEá áááºážáá
á¬ááœááºá
á¬áááºážá¡ááŒáá·áºá¡á
á¯á¶ááŸá¬áááºááŸááááºá
RIDE á
á¬áá»á¯ááºááẠááŒáá¯áááºáá±á¬áºááŒáá»ááºáá
áºáá¯ááŒá
áºááŒá®áž á¡ááœááºá¡ááŒá
Ạ"ááŸááº" ááá¯á·ááá¯áẠ"ááŸá¬áž" ááŒááºáá±ážáááºá ááá¯á·ááŒá±á¬áá·áºá ááœá±áá±ážááœá±áá°ááᯠblockchain ááœááºááŸááºáááºážáááºáá¬ážááẠááá¯á·ááá¯áẠááŒááºážáááºáá¶ááááºá á
áááºá
á¬áá»á¯ááºááẠáááºááŸááºáá¬ážáá±á¬ á¡ááŒá±á¡áá±áá»á¬áž ááŒáá·áºá
á¯á¶á
á±ááẠá¡ááŒáá·áºá¡á á¡á¬ááá¶áá«áááºá RIDE ááœáẠá
á¬áá»á¯ááºáá
áºáá¯á០ááœá±áá±ážááœá±áá°áá»á¬áž ááŒá¯áá¯ááºááŒááºážááᯠáá±á¬áá±á¬ááẠáááŒá
áºááá¯ááºáá«á
ááá±á·áá±ááºááœáẠWaves á
áááºáááºáááá¯ááºáá»á¬áž á¡áá»áá¯ážá¡á
á¬ážááŸá
áºáá»áá¯ážááŸááááº- á
áááºá¡áá±á¬áá·áºáá»á¬ážááŸáá·áº á
áááºááá¯ááºááá¯ááºááŸá¯áá»á¬ážá á
áááºá¡áá±á¬áá·áºááẠáá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯áá°á¡áá±á¬áá·áºáá
áºáá¯ááŒá
áºáá±á¬áºáááºáž ááœá±áá±ážááœá±áá°á¡á¬ážáá¯á¶ážááᯠááááºážáá»á¯ááºááá·áº áááºážá¡ááœáẠscript áá
áºáá¯áááºááŸááºáá¬ážáááºá á
áááºá¡áá±á¬áá·áº script ááẠá€áá²á·ááá¯á·áá±á¬áá¯á¶ááááºá á¥ááá¬-
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
tx ááẠááœáŸá²ááŒá±á¬ááºážáá±ážáá»á±ááŸá¯áá
áºáá¯ááá¯ááºááŸáᬠáá¯á¶á
á¶áá°ááá¹ááá¬ážááᯠá¡áá¯á¶ážááŒá¯á ááœáá·áºááŒá¯áá±ážáá±á¬ ááœá±áá±ážááœá±áá°ááᯠáá¯ááºáá±á¬ááºáá±áááºá ááœá±áá±ážááœá±áá°á¡áá»áá¯ážá¡á
á¬ážááᯠá
á
áºáá±ážááẠRIDE ááœáẠáá¯á¶á
á¶áá°ááᯠá¡áá¯á¶ážááŒá¯áááºá ááŸáááŒá®ážáá¬ážá¡áá±á¬áá·áºá¡á¬ážáá¯á¶ážááᯠsmart account script ááœáẠáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
script ááẠvariable áá»á¬ážááá¯ááŒá±ááŒá¬ááá¯ááºáááºá "if-then-else" constructs áá»á¬ážááŸáá·áº á¡ááŒá±á¡áá±áá»á¬ážááᯠá¡ááŒáá·áºá¡áá á áºáá±ážáááºá¡ááœáẠá¡ááŒá¬ážáááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá á á¬áá»á¯ááºáá»á¬ážáá áááºáá® ááá·áºááŸááºážáááœááºáá°áá±á¬ áááºáá±ááŒááá¯ááºáá±á¬ ááŒá®ážááŒáá·áºá á¯á¶ááŸá¯ááŸáá·áº ááŸá¯ááºááœá±ážááŸá¯ (áá¯ááºáá»á ááááº) ááŸáá á±ááẠáá±áá»á¬á á±áááºá RIDE ááœáẠloops ááá¯á·ááá¯áẠjump statement áá»á¬ážááá«áááºáá«á
Waves á¡áá±á¬áá·áºáá»á¬ážá á¡ááŒá¬ážá¡ááºá¹áá«áááºáá»á¬ážááŸá¬ á¡áá±á¬áá·áºáá¡ááŒá±á¡áá±á ááá¯ááá¯áááºááŸá¬ âááŒááºáááºâ ááŸááá±ááŒááºážááŒá áºáááºá áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯áá»á¬áž (DataTransaction) ááᯠá¡áá¯á¶ážááŒá¯á á¡áá±á¬áá·áºá¡ááŒá±á¡áá±ááá¯á· á¡ááá·áºá¡áááºáááŸáá¡ááœá²áá»á¬áž (áá±á¬á·á áááºááá¯áž) ááᯠáá±ážááá¯ááºáááºá ááá¯á·áá±á¬áẠá€á¡áá»ááºá¡áááºááᯠREST API ááŸáá áºááá·áº ááŸáá·áº smart á á¬áá»á¯ááºááœáẠááá¯ááºááá¯áẠááŸá áºáá»áá¯ážáá¯á¶áž áá¯ááºáá±á¬ááºááá¯ááºáááºá
ááœá±áá±ážááœá±áá°áá áºáá¯á á®ááœáẠáá«áááºáá°á áááºááŸááºá ááá¯á¡ááºáá±á¬ ááœá±áá±ážááœá±áá° ID á áááºááá¯á·ááᯠááá·áºááœááºážááá¯ááºááá·áº á¡áá±á¬ááºá¡áá¬ážáá»á¬ážá áœá¬ áá«áááºááá¯ááºáááºá
ááŸáááá·áº RIDE ááŸáá·áºá¡áá¯ááºáá¯ááºáááºá
á¡áá±á¬áá·áºáááºáá®ážááŒááºážá áááºážááœáẠá áááºáá»ááá·áºá á¬áá»á¯ááºááᯠááá·áºááœááºážááŒááºážááŸáá·áº ááœá±áá±ážááœá±áá°áá±ážááá¯á·ááŒááºážá¡áá«á¡ááẠáá¶ááá¬áá áºáá¯áá¯á¶ážá¡ááœááºá REST API ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºáááºá¡ááœáẠá á¬ááŒáá·áºááá¯ááºááá¯áááºáž áááºá¡áá¯á¶ážááŒá¯ááá¯ááºááẠ(á¥ááá¬á C#á Cá Javaá JavaScriptá Pythoná Rustá Elixir) . IDE ááŸáá·áº á áááºá¡áá¯ááºáá¯ááºááẠNEW ááá¯ááºááᯠááŸáááºáá«á
á áááºá á¬áá»á¯ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠááŒá áºááá¯ááºááŒá±áá»á¬áž áá»ááºááŒáá·áºáááº- á¡áá»áá¯á·áá±á¬ ááááºá á¬áá»á¬ážááá¯á· ááœá±áá±ážááœá±áá°áá»á¬ážááᯠáá¬ážááŒá áºááŒááºážá០(âblack listâ) á០ááŸá¯ááºááœá±ážáá±á¬ dApps áá»á¬ážá¡ááá
ááᯠá
á®ážááœá¬ážáá±ážáá¯ááºáááºážááœáẠá
áááºá
á¬áá»á¯ááºáá»á¬ážá¡áá¯á¶ážááŒá¯ááŒááºážá áá®ážááŒá¬ážá¥ááá¬áá»á¬ážááᯠááŒáá·áºááŒáá«á
áá¯á·- áá±áá¶ááœá²áá»á¬ážá á¡á¬ááá¶ááŸáá·áº áá
á¹á
á¬á
á±á¬áá·áºááááŸá¯áááá¯ááááºáá»á¬áž áááºáá®ážááá·áºá¡áá«á
áá±áá¶ááœá²
á¡á±á¬ááºááŒááºáá±á¬áá±áá¶ááœá²á¡ááœáẠá¡ááŒá±á¡áá±áá»á¬ážáá²ááŸáá áºáá¯ááŸá¬ ááœáá·áºáááºážááŒááºáá¬ááŸá¯ááŒá áºáááº- áá«áááºáá°áá»á¬ážááẠáá±áá¶ááœá²ááẠáááŒá áºááá¯ááºááŒá±á¬ááºáž áá¯á¶ááŒááºááá«áááºá á¡áá±á¬ááºážá¡á á¬ážá¡á¬ážáá¯á¶ážááŸáá·áº áááºáááºááá·áº áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áá±áá¬ááŸáá·áº áááºážááá¯á·ááᯠáá«áááºáá°á¡á¬ážáá¯á¶ážáᶠáááŸáááá¯ááºááá·áº blockchain ááŒá±á¬áá·áº áááºážááᯠá¡á±á¬ááºááŒááºááá¯ááºáááºá
Waves blockchain ááœááºá DataTransaction ááŸáááá·áºáá±áá¶á¡áá±á¬áá·áºá¡ááŒá±á¡áá±ááœááºáá±áá¶áá»á¬ážááá¯ááŸááºáááºážáááºááá¯ááºáááºá
ááááºááá¯á·áá¶áá«ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá±áá¶ááœá²áá¡á ááŸáá·áºá¡áá¯á¶ážá¡áá»áááºááá¯áááºáž áááºáááºááŸááºááá¯ááºáááº- Waves blockchain ááŸá ááááºááá¯á·áá¯ááºáá¯ááºááá·áºá¡ááŒáááºáá±ááẠááá·áºááŸááºážááŒá±á¡á¬ážááŒáá·áº áá®áá»áŸááẠ60 á áá¹ááá·áºá
1. á¡ááºá¹áááááºááᯠááŒá®ážááŒá®ážááŒáá·áºáá¬áž á á»á±ážááŸá¯ááºážáá±áá¶
á¡ááºá¹áááááºáá±áá¶ááœá²á áá«áááºáá°áá»á¬ážááẠá¡áá»ááºážáá»ááºáž ááŒáá¯ááºááá¯ááºááŸá¯ááŒáá·áº áá±áá¶áááºááŒáááºá áá±á¬ááºážááŒá±ážá¡áá áºáá áºáá¯á á®ááẠááááºáá áºáá¯áááºááá¯ááá«áááºá áá±á¬ááºáá¯á¶ážáá±áá¶ááẠáá»á±á¬áºááœááºááẠáá±áá¶ááœá²áá°áááŸááá±á¬á·ááá·áºá¡áá« áá±áá¶ááœá²ááŒá®ážáá¯á¶ážáááºá á€ááá á¹á ááœááºá á¡ááŒáá·áºáá¯á¶ážáá±áá¶ááœá²áá°ááẠáá±á¬áºááŒáá¬ážáá±á¬ ááá¬áááᯠáá±ážááááºá
áá±á¬ááºážáá»áá°ááẠá á¬áá±ážáá¶á¡ááœáẠá¡áááá·áºáá¯á¶ážá á»á±ážááŸá¯ááºážááᯠáááºááŸááºáá±ážááá·áº áá±áá¶ááœá±ážáá»ááºááœáá·áºáááºáž ááŸáááŒá®áž áá±á¬ááºáá¯á¶ážá á»á±ážááŸá¯ááºážááẠáááºážááᯠáá»á±á¬áºááœááºááááºááŒá áºáááºá ááá¯ááºááẠá á»á±ážááá±á¬ááºážááá±ážáá°ážá
á€á¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá±áá¶ááœá²á¡ááœáẠá¡áá°ážáááºáá®ážáá¬ážáá±á¬ á¡áá±á¬áá·áºáá áºáá¯ááŸáá·áº áá¯ááºáá±á¬ááºáá±áá«áááºá áá±áá¶ááœá²ááŒá¬áá»áááºááẠáá¯á¶áž 3000 ááŒá áºááŒá®áž á á¬áá±ážáá¡á áá±ážááŸá¬ 0,001 WAVES ááŒá áºáááºá áá«áááºáá°áá áºáŠážááẠáá±á¬á· âá á»á±ážááŸá¯ááºážâ ááŸáá·áº áááºážááá¯á·á áá±áá¶áááºááá¯ážááᯠDataTransaction áá±ážááá¯á·ááŒááºážááŒáá·áº áá±áá¶áááºááá¯ááºáááºá
áá±áá¶á¡áá áºáá á»á±ážááŸá¯ááºážááẠá€áá±á¬á·á¡ááœáẠáááºááŸáá á»á±ážááŸá¯ááºážááẠááá¯ááŒáá·áºááááºááŒá áºááŒá®áž áá«áááºáá°ááœáẠá¡áááºážáá¯á¶áž [new_bid + commission] ááá¯áááºáá»á¬áž ááŸáááá«áááºá áá±áá¶ááœá²áá°áááááºá á¬ááᯠDataTransaction ááŸá "áá±ážááá¯á·áá°" á¡ááœááºááœáẠááŸááºáááºážáááºáá¬ážááááºááŒá áºááŒá®áž áááºááŸááá±áá¶ááááºááá¯á·ááá·áºá¡ááŒáá·áºááẠáá±áá¶áá¬áá¡ááœááºáž ááŒá áºááá«áááºá
áá±áá¶ááœá²á¡ááŒá®ážááœáẠáá«áááºáá°ááẠá¡ááŒáá·áºáá¯á¶ážá á»á±ážááŸá¯ááºážááᯠáááºááŸááºáá«áá áááºááá¯ááºáá±á¬á¡áá»á¬ážááŒá®ážá¡ááœáẠáááºááŸááºáá¬ážáá±á¬á á»á±ážááŸá¯ááºážááŸáá·áº ááœá±ááŒá±ážá¡ááœá²á¡ááœáẠáá±ážáá»á±ááẠExchangeTransaction áá±ážááá¯á·ááá¯ááºáá«áááºá
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. áááºááºá»áá±áá¶ááœá²áá»á¬ážáá á»á±ážááŸá¯ááºážáá»á¬ážáá»áááºáž
áááºáá»áºáá±áá¶ááœááºá áááºáá°áá±ážáá±á¬ááºááá¯ááá·áºááẠááá¯ááá¯ááŒáá·áºáá¬ážáá±á¬á á»á±ážááŸá¯ááºážááŒáá·áº áááŠážáááºážááŸááºážáááºá áá«áááºáá°áá»á¬ážáá²á០áá áºáŠážá០áááºááŸááá±á«ááºáá±ážááŒáá·áº áá á¹á ááºážáááºáá°ááẠááá±á¬áá°áááºá¡áá á á»á±ážááŸá¯ááºážááẠáá áºááá·áºááŒá®ážáá áºááá·áº áá»áááºážááœá¬ážáá«áááºá
á€á¥ááá¬ááœááºá ááŒá áºááá»áœááºážáá±á«áºáá±á áá»á±á¬á·áááºážááœá¬ážáá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááááºáá¯á¶á á¶á¡ááá¯ááºáž áá°áá®áá±á¬ááááºážáá±áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá á¡áá±á¬áá·áº script ááẠáá«áááºáá°ááẠá¡áá±á¬ááºážá¡á á¬ážááŒá¯áá¯ááºááẠááááá¯á¶ážáá°áá¯ááºááá¯áẠá á áºáá±ážáá«áááºá ááá¯ááºáá«áá DataTransaction ááᯠ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. áá±áᶠâá¡á¬ážáá¯á¶ážáá±ážáá»á±â
âAll-payâ ááẠáááºáá°áááºáá«ááŒá áºáááºááᯠáááœá²ááŒá¬ážáá² áá«áááºáá°á¡á¬ážáá¯á¶áž áá±áá¶áá±ážáá»á±ááá·áº áá±áá¶ááœá²ááŒá áºáááºá áá«áááºáá°á¡áá áºááá¯ááºážááẠáá±áá¶áá áºáá¯áá±ážáá»á±ááŒá®áž á¡ááŒáá·áºáá¯á¶ážáá±áá¶ááá¯ááŒá¯áá¯ááºáá±á¬áá«áááºáá°ááẠáá»á¬ážá áœá¬á¡ááá¯ááºáááŸááááºááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá áá±áá¶ááœááºáá«áááºáá°ááá¯ááºážááẠ(áá±á¬á·á áááºááá¯áž)* = (âá¡ááá¯ááºááá°âá ááááºá á¬)á(âá á»á±ážááŸá¯ááºážâá áá±ážááŸá¯ááºáž) ááŒáá·áº áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ááŸáá áºááá·áº áá±áá¶áááºáá¬ážáááºá á€áá«áááºáá°ááẠáááºážááááºááŸááºááŒáá·áº ááœáŸá²ááŒá±á¬ááºážááœáŸá²ááŒá±á¬ááºážááŸá¯áá áºáá¯ááŸáááŸáá·áºááŒá®áž áááºážááá±áá¶ááẠááááºá¡á¬ážáá¯á¶ážááẠááá¯ááá¯ááŒáá·áºáá¬ážááŸáᬠááá¯ááá¯á·áá±á¬ Data Transaction ááᯠá¡áááºááŒá¯áá«áááºá 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)
}
á¡á¬ááᶠ/ Crowdfunding
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá ááá¯ááºááá¯ááºááŸá¯áá»á¬ážá¡á¬áž ááœá±ááŒá±ážáá¯á¶ážááŸá¯á¶ážááŸá¯á០á¡á¬ááá¶ááẠááá¯á¡ááºááá·áº á¡ááŒá±á¡áá±áá áºáá¯ááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á áá¯á·á á¥ááá¬á¡á¬ážááŒáá·áºá á¡áá¯á¶ážááŒá¯áá°áá áºáŠážááẠááá¯áááºáááºááá¯ážáá»áááºážááœá¬ážáá«á á€ááá¯áááºáá»á¬ážá¡ááœáẠáá±ážáá±á¬ááºáá¬ážááá·áº ááá¬áá¡ááŒáá·áºá¡á á¯á¶ááᯠááŒááºáááºáááŸáááá¯ááºáááºááŒá áºááŒá®áž áá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºáá±á¬ á¡á¬ááá¶ááá¬áááᯠáá±ážáá±á¬ááºááá¯ááŒá±á¬ááºáž á¡á¬ááá¶áá»ááºááá°ááá¯áá«áááºá
áááºážááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºááẠ"á¡á¬ááá¶ááá¯áááºáá»á¬áž" ááá¯áá¯ááºáá±ážáááºááá¯á¡ááºáááºá ááá¯á·áá±á¬áẠá¡áá»áá¯á·áá±á¬á¡ááŒá±á¡áá±áá»á¬ážááŸáá·áº ááá¯ááºáá®ááá·áº ExchangeTransactions áá»á¬ážááá¯áᬠáá°áá«áááá¯ááºáá±á¬ááºáá°áá¡áá±á¬áá·áºááœáẠááá·áºááœááºážááŒá®áž script ááᯠááá·áºááœááºážáá¬ážáááºá
ááŸá áºáá¡áá¯á¶ážá ááááºááᯠáá¬ážáá®ážáááºá á¡áá¯á¶ážááŒá¯áá°á¡á¬áž (áá±á¬á·á áááºááá¯áž) = (purchaseTransactionIdá sellOrderId) ááŒáá·áº áá°áá«áááá¯ááºáá±á¬ááºáá°áá¡áá±á¬áá·áºááá¯á· DataTransaction ááᯠááŒáá¯áááºáá±ážááá¯á·áááºááŸáá·áº á¡áá¯á¶ážááŒá¯ááŒá®ážáá¬ážáá±á¬á·ááŒáá·áº DataTransactions áá±ážááá¯á·ááŒááºážááᯠáá¬ážááŒá áºááẠááá¯á¡ááºáá«áááºá
ááá¯á·ááŒá±á¬áá·áºá á¡áá¯á¶ážááŒá¯áá°áá¡áá±á¬ááºá¡áá¬ážáá»á¬ážááœáẠá¡á¬ááá¶ááá¯áááºáááºáá°ááŸá¯á ááœá±áá±ážááœá±áá° ID áá«áááºááá«áááºá ááœá±ááŒá±ážá¡ááœá²ááẠáááºáá°ááŸá¯ááœááºááŸáááá·áºá¡ááá¯ááºáž ááŒá áºááá«áááºá áá¯ááºáá»á ááááºááẠáááºáá°áá»áááºááœáẠáááºááŸááºáá¬ážáá±á¬ á¡á¬ááá¶á á»á±ážááŸá¯ááºážááŸáá·áº á¡áá¯ááºááá¹ááá¬áá±á¬ááºáá±á¬ á á»á±ážááŸá¯ááºážááŸáá·áº áá®áá»áŸááá«áááºá
áá±á¬ááºááá¯ááºážááœáẠá¡á¬ááá¶á¡áá±á¬áá·áºááẠá¡áá¯á¶ážááŒá¯áá°áá¶á០á¡á¬ááá¶ááá¯áááºáá»á¬ážááᯠáá°áááºáá°áá²á·ááá·áºááẠááááá·áºáá±á¬á á»á±ážááŸá¯ááºážááŒáá·áº áááºáá°ááŒá±á¬ááºáž áá¬ážáááºááá±á¬áá±á«ááºáááº- á¡á¬ááá¶á¡áá±á¬áá·áºááẠExchangeTransaction áá áºáá¯ááᯠáááºáá®ážáááºá á¡áá¯á¶ážááŒá¯áá°ááẠá¡ááŸá¬á á¬ááᯠáááºááŸááºáá±ážááá¯ážááẠ(ááœá±áá±ážááœá±áá°ááŸááºáááºáá«á)á á¡á¬ááá¶á¡áá±á¬áá·áºááẠáá¯áááá¡ááŸá¬á á¬ááŸáá·áº ááœá±áá±ážááœá±áá°áá áºáá¯áá¯á¶ážááᯠáááºááŸááºáá±ážááá¯ážááŒá®áž blockchain ááá¯á· áá±ážááá¯á·áááºá
áááºáá°ááŸá¯áááŒá áºáá±á«áºáá«áá á¡áá¯á¶ážááŒá¯áá°ááẠscript ááœááºáá±á¬áºááŒáá¬ážáá±á¬á ááºážáá»ááºážáá»á¬ážááŸáá·áºá¡áá® ExchangeTransaction áá áºáá¯ááá¯áááºáá®ážááá¯ááºááŒá®áž blockchain ááá¯á·ááœá±áá±ážááœá±áá°áá±ážááá¯á·ááá¯ááºáááºá á€áááºážááŒáá·áº á¡áá¯á¶ážááŒá¯áá°ááẠá¡á¬ááá¶ááá¯áááºáá»á¬ážáááºáá°ááŸá¯ááœáẠá¡áá¯á¶ážááŒá¯ááá·áºááœá±ááᯠááŒááºáá±ážááá¯ááºáááºá
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)
}
á¡á¬ááᶠááá¯áááºáá áºáá¯ááᯠááŒááºáá¡ááœá²á·á¡á ááºážáá»á¬ážáᶠááœáŸá²ááŒá±á¬ááºážááŒááºážááᯠáá¬ážááŒá áºáááºá á¥ááá¬á á áááºáá á¹á ááºážáá áºáá¯á¡ááŒá Ạáááºáá®ážááá¯ááºáááºá
ááá¯á¡ááºáá±á¬ááá¬áááᯠáá á¯áá±á¬ááºážáá«á ááá¯ááºááŸááºáá»á¬ážáᶠááŒááºáá±ážááá·áº crowdfunding ááá¯áááºáá»á¬ážá¡ááœááºáááºáž á€á¡á á®á¡á ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááºá
ááœá±ááœáŸá²ááœááº
ááá¯ááºááá¯ááºááŸá¯á¡áá»áá¯ážá¡á
á¬ážáá»á¬ážá
áœá¬ááŒáá·áº ááœá±áá±ážááœá±áá°áá
áºáá¯á
á®á¡ááœáẠá¡ááœááºáá±á¬ááºáá¶ááẠááá¯á¡ááºááá·áºááá
á¹á
áá»á¬ážááœáẠá
áááºá
á¬áá»á¯ááºáá»á¬ážáááºáááºáž áááºááá¯ááºáá«áááºá áááºážááᯠááá·áºááœááºážááŒá®áž ááá¯ááºááá¯ááºááŸá¯á¡áá
áºááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáááºá
1. áá»áœááºá¯ááºááá¯á·ááẠáááºááŸááºáá¬ážáá±á¬á á»á±ážááŸá¯ááºážááŒáá·áº áá¯á¶ážá áœá²áá°áá»á¬ážáᶠáá±ážááá¯á·ááá·áº FeeCoin ááá¯áá¯ááºáá±ážáá«áááº- 0,01 WAVES = 0,001 FeeCoiná
2. FeeCoin ááŸáá·áº ááœá±áá²ááŸá¯ááºážá¡ááœáẠáá¶á·ááá¯ážáá°áá®ááŸá¯ áááºááŸááºáá«- 0,001 WAVES = 0,001 FeeCoin á
3. á áááºááá¯ááºááá¯ááºááŸá¯á¡ááœáẠá¡á±á¬ááºáá« script ááᯠáááºááŸááºáá«-
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
}
ááᯠáá áºá á¯á¶áá áºáá±á¬ááºááẠN á áááºááá¯ááºááá¯ááºááŸá¯áá»á¬ážááᯠááœáŸá²ááŒá±á¬ááºážááá·áºá¡áá«ááá¯ááºážá áááºážááá¯á·ááẠááá·áºáá¶á០N/taxDivisor WAVES (10 *N/taxDivisor WAVES) ááŒáá·áº ááá·áºáá¶ááŸáááºáá°ááá¯ááºááá·áº N/taxDivisor ááá¬áááŒáá·áº FeeCoin áá±ážáááºááŒá áºááŒá®áž áááºááá¯ááºážááœááºáž N/taxDivisor WAVES ááᯠáá±ážáááºááŒá áºáááºá ááááºá¡áá±ááŒáá·áº áááºáá¡ááŒááºááœá± (á¡ááœááº) ááẠ9*N / taxDivisor WAVES ááŒá áºáááá·áºáááºá
á áááºááá¯ááºááá¯ááºááŸá¯ script ááŸáá·áº 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 ááẠáááºáá°áá°á០áá¯ááºáá á¹á ááºáž ááá¯á·ááá¯áẠáááºáá±á¬ááºááŸá¯áá áºáá¯áá±á«áºááœáẠá¡áá¯á¶ážááŒá¯ááá·áºááá¬áá áá áºá áááºáá áºááá¯ááºážááᯠááŒááºáááºáááŸáááá·áº áá á¹á á¬á á±á¬áá·áºááááŸá¯áááá¯ááááºá¡áá»áá¯ážá¡á á¬ážáá áºáá¯ááŒá áºáááºá
á áááºá¡áá±á¬áá·áºááᯠá¡áá¯á¶ážááŒá¯á á€á¡ááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá·áºá¡áá«á á¡á¬ááá¶ááá á¹á ááœáẠáá»áœááºá¯ááºááá¯á·ááŒá¯áá¯ááºáá²á·ááá·áºá¡ááá¯ááºáž á¡áá±á¬ááºá¡áá¬ážáá»á¬ážááᯠá á áºáá±ážááá«áááºá ááŸá áºáá¡áá¯á¶ážá ááááºááᯠáá¬ážáá®ážáááºá á¡áá¯á¶ážááŒá¯áá°ááẠááœá±áá¬ážááŒááºááááŸááá® (áá±á¬á·á áááºááá¯áž) = (purchaseTransactionIdá cashbackTransactionId) ááŒáá·áº DataTransaction ááᯠáá±ážááá¯á·ááá«áááºá
DataTransaction ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž ááŸáááŒá®ážáá¬ážáá±á¬á·áá»á¬ážááá¯áááºáž ááááºáááºáá¬ážááá«áááºá cashbackDivisor - cashback ááŸááºáá¬ááŒáá·áºááá¯ááºážááŒá¬ážáá¬ážáá±á¬áá°áá áºá á¡á²áá«ááœá±á cashback share ááẠ0.1 ááŒá áºáá«á 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 ááẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡á¬áž áá²ááŸááºááŸá¯áá áºáá¯áá¡áá°á¡áá®ááá«áá² ááá¯ááºááá¯ááºááŸá¯áá»á¬ážááᯠáááŸááºááá¯ááºá á±áá«áááºá á¡ááºáááºáá²ááŸááºááŸá¯ááŒáá·áºá ááœá±áá±ážááœá±áá°ááœááºáá«áááºáá°ááŸá áºáŠážá áá¯á¶ážááẠá¡áá»áááºá¡ááá¯ááºážá¡áá¬áá áºáá¯á¡ááœááºáž áááºážááá¯á¡áááºááŒá¯ááẠááá¯á¡ááºáááºá
á¡áá±á¬ááºážá¡áááºááŒá¯áá¯ááºááẠáá»áá¬ážáá±ážááá·áºá¡áá»áááºá¡ááœááºáž á¡áááºážáá¯á¶ážáá«áááºáá° áá áºáŠážá០ááŸááºáááºáá±á¬ á¡áááºááŒá¯áá»ááºááá±ážáá²á·áá«áá ááœá±áá±ážááœá±áá°ááᯠáááºáá»ááºááŒá®áž áá²ááŸááºááŸá¯ ááŒá áºáá±á«áºáááºááá¯ááºáá«á
áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá« smart account script ááᯠá¡áá¯á¶ážááŒá¯áá«áááº-
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
}
áá±á¬ááºáá±á¬ááºážáá«ážááœáẠááœá±ážáá»ááºá áá¬áá»á¬ážá á¡áá¬áááºáá»á¬ážááŸáá·áº ááœá±áá±á¬ááºážáá¶ááœáŸá¬áá»á¬ážáá²á·ááá¯á·áá±á¬ ááá¹áá¬áá±ážáá°áááá¬áá»á¬ážááœáẠá áááºá¡áá±á¬áá·áºáá»á¬ážá¡áá¯á¶ážááŒá¯ááŸá¯ááᯠáá±á·áá¬áá«áááºá
source: www.habr.com