แแแแแฉแแแแ แฎแจแแ แแ แแกแแชแแ แแแแ แแฎแแแแ แแ แแแขแแแแแฃแขแแแแแ, แแแแ แแ DLT แขแแฅแแแแแแแแก แแแแแงแแแแแแก แกแคแแ แแแแ แแแชแแแแแแ แคแแ แแแ. แแแแแฉแแแแแก แแแแแงแแแแแแก แแ แ-แแ แแ แงแแแแแแ แแแ แกแแแฅแขแแฃแแ แกแคแแ แ แแ แแก แญแแแแแแ แแแแขแ แแฅแขแ, แ แแแแแแช แกแ แฃแแแแแ แแแขแแแแขแฃแ แแ แแ แแ แกแแญแแ แแแแก แแแแแแก แแแกแจแ แจแแกแฃแ แแฎแแ แแแแก แจแแ แแก.
RIDE โ แญแแแแแแ แแแแขแ แแฅแขแแแแก แแแ
Waves-แแ แจแแแแฃแจแแแ แกแแแชแแแแฃแ แ แแแ แญแแแแแแ แแแแขแ แแฅแขแแแแกแแแแก - RIDE. แแแกแ แกแ แฃแแ แแแแฃแแแแขแแชแแ แแแแแแแกแแแฃแแแ
RIDE แแแแขแ แแฅแขแ แแ แแก แแ แแแแแแขแ แแ แแแ แฃแแแแก "true" แแ "false" แ แแแแ แช แแแแแแแแแแ. แจแแกแแแแแแกแแ, แขแ แแแแแฅแชแแ แแ แฉแแแฌแแ แแแ แแแแแฉแแแแจแ, แแ แฃแแ แงแแคแแแแ. แกแแแ แข แแแแขแ แแฅแขแ แกแ แฃแ แแแ แแแขแแแก แแซแแแแ แแแแแแแแฃแแ แแแ แแแแแแก แจแแกแ แฃแแแแแก. RIDE-แจแ แแแแขแ แแฅแขแแแแ แขแ แแแแแฅแชแแแแแก แแแแแ แแ แแแ แแแแแแแ แจแแฃแซแแแแแแแ.
แแฆแแก แแ แกแแแแแก Waves-แแก แญแแแแแแ แแแแขแ แแฅแขแแแแก แแ แ แขแแแ: แญแแแแแแ แแแแแ แแจแแแ แแ แญแแแแแแ แแฅแขแแแแแ. แญแแแแแแ แแแแแ แแจแ แแ แแก แฉแแแฃแแแแ แแแ แแแแฎแแแ แแแแแก แแแแแ แแจแ, แแแแ แแ แแแกแแแแก แแแงแแแแแฃแแแ แกแแ แแแขแ, แ แแแแแแช แแแแแขแ แแแแแก แงแแแแ แขแ แแแแแฅแชแแแก. แญแแแแแแ แแแแแ แแจแแก แกแแ แแแขแ แจแแแซแแแแ แแกแ แแแแแแงแฃแ แแแแแแก, แแแแแแแแแ:
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
tx แแ แแก แแแแฃแจแแแแแฃแแ แขแ แแแแแฅแชแแ, แ แแแแแกแแช แฉแแแ แแแแฃแจแแแแ แจแแแแแแแก แจแแกแแขแงแแแกแ แแแฅแแแแแแแก แแแแแงแแแแแแก แแฎแแแแ แแ แจแแแแฎแแแแแจแ, แแฃ แแก แแ แแ แแก แแแแแชแแแแก แขแ แแแแแฅแชแแ. แจแแแแแแแก แจแแกแแขแงแแแกแ RIDE-แจแ แแแแแแงแแแแแ แขแ แแแแแฅแชแแแก แขแแแแก แจแแกแแแแฌแแแแแแ. แงแแแแ แแ แกแแแฃแแ แแแแแ แแจแแก แแแแฃแจแแแแแ แจแแกแแซแแแแแแแ แญแแแแแแ แแแแแ แแจแแก แกแแ แแแขแจแ
แกแแ แแแขแก แจแแฃแซแแแ แแกแแแ แแแแแแชแฎแแแแก แชแแแแแแแ, แแแแแแงแแแแก โif-then-elseโ แแแแกแขแ แฃแฅแขแแแ แแ แกแฎแแ แแแแแแแแ แแแ แแแแแแก แกแ แฃแแแ แจแแกแแแแฌแแแแแแ. แแแแก แฃแแ แฃแแแแแกแแงแแคแแ, แ แแ แแแแขแ แแฅแขแแแก แฐแฅแแแแแ แแแกแแแขแแแชแแแแแ แกแแกแ แฃแแ แแ แกแแ แแฃแแ (แฆแแ แแแฃแแแแ), แ แแแแแก แแ แแแแแแแ แแแ แแแแแแแ แแแแขแ แแฅแขแแก แจแแกแ แฃแแแแแก แแแฌแงแแแแแแ, RIDE แแ แจแแแชแแแก แแแ แงแฃแแแแก แแ แแแฎแขแแแแก แแแแชแฎแแแแแแแก.
Waves แแแแแ แแจแแแแก แกแฎแแ แแแฎแแกแแแแแแแแแก แแแแแฃแแแแแแ โแแแแแแแ แแแแแกโ แแ แกแแแแแ, แแแฃ แแแแแ แแจแแก แแแแแแแ แแแแ. แแฅแแแ แจแแแแซแแแแ แฉแแฌแแ แแ แฃแกแแกแ แฃแแ แ แแแแแแแแแก แฌแงแแแแ (แแแกแแฆแแแ, แแแแจแแแแแแแ) แแแแแ แแจแแก แแแแแแแ แแแแแแ แแแแแชแแแแ แขแ แแแแแฅแชแแแก แแแแแงแแแแแแ (DataTransaction). แจแแแแแ แแก แแแคแแ แแแชแแ แจแแแซแแแแ แแแแฃแจแแแแแก แ แแแแ แช REST API-แแ, แแกแแแ แฃแจแฃแแแแ แกแแแ แข แแแแขแ แแฅแขแจแ.
แแแแแแฃแแ แขแ แแแแแฅแชแแ แจแแแซแแแแ แจแแแชแแแแแก แแขแแแชแแแฃแแแแแแ แแแกแแแก, แ แแแแแจแแช แจแแแซแแแแ แจแแแงแแแแแ แแแแแฌแแแแก แฎแแแแแฌแแ แ, แกแแญแแ แ แขแ แแแแแฅแชแแแก ID แแ แ.แจ.
แแฃแจแแแแ RIDE-แแแ แแแจแแแแแแ
แกแ แฃแแ แชแแแแแกแแแแก, แแแ แจแแ แแก แแแแแ แแจแแก แจแแฅแแแ, แแแกแแ แญแแแแแแ แแแแขแ แแฅแขแแก แแแงแแแแแ แแ แขแ แแแแแฅแชแแแแแก แแแแแแแแ, แแกแแแ แจแแแแซแแแแ แแแแแแงแแแแ แแแแแแแแแแ REST API-แกแแแ แฃแ แแแแ แแแแแกแแแแก (แแแแแแแแแ, C#, C, Java, JavaScript, Python, Rust, Elixir) . IDE-แกแแแ แแฃแจแแแแแก แแแกแแฌแงแแแแ, แฃแแ แแแแ แแแแญแแ แแ แฆแแแแแก NEW.
แญแแแแแแ แแแแขแ แแฅแขแแแแก แแแแแงแแแแแแก แจแแกแแซแแแแแแแแแ แคแแ แแแ: แขแ แแแแแฅแชแแแแแก แแแ แซแแแแแแแ แแแ แแแแฃแ แแแกแแแแ แแแแแแแ (โแจแแแ แกแแโ) แแแแแแแฅแกแฃแ dApp-แแแแแแ.
แแฎแแ แแแแแ แแแแแแฎแแแแ แแแแแแกแจแ แญแแแแแแ แแแแขแ แแฅแขแแแแก แแแแแงแแแแแแก แแแแแ แแขแฃแ แแแแแแแแแแก: แแฃแฅแชแแแแแแแก แฉแแขแแ แแแแกแแก, แแแแฆแแแแแกแ แแ แแแแแแแแแก แแ แแแ แแแแแแก แจแแฅแแแแกแแก.
แแฃแฅแชแแแแแแ
แฌแแ แแแขแแแฃแแ แแฃแฅแชแแแแแก แแ แ-แแ แแ แแแ แแแ แแ แแก แแแแญแแแ แแแแแแ: แแแแแฌแแแแแแ แฃแแแ แแงแแแแ แแแ แฌแแฃแแแแฃแแแ, แ แแ แจแแฃแซแแแแแแแ แฌแแแแแแแแแแแแก แแแแแแฃแแแ แแแ. แแแแก แแแฆแฌแแแ แจแแกแแซแแแแแแแ แแแแแฉแแแแแก แฌแงแแแแแแ, แกแแแแช แฃแชแแแแแ แแแแแชแแแแแ แงแแแแ แคแกแแแแกแ แแ แแแแ แแแแแแแก แแ แแแก แจแแกแแฎแแ แฎแแแแแกแแฌแแแแแ แแฅแแแแ แงแแแแ แแแแแฌแแแแกแแแแก.
Waves แแแแแฉแแแแแ, แจแแแแแแแแแแแ แจแแแซแแแแ แฉแแแฌแแ แแก แแฃแฅแชแแแแแก แแแแแ แแจแแก แแแแแแแ แแแแแจแ DataTransaction-แแก แกแแจแฃแแแแแแ.
แแฅแแแ แแกแแแ แจแแแแซแแแแ แแแแงแแแแ แแฃแฅแชแแแแแก แแแฌแงแแแแก แแ แแแกแ แฃแแแแแก แแ แ แแแแแแก แแแแ แแแแก แแแแแงแแแแแแ: แแแแแแแแก แฌแแ แแแฅแแแแก แกแแฎแจแแ แ Waves แแแแแฉแแแแจแ แแแแฎแแแแแแ แขแแแแ 60 แฌแแแ.
1. แแแแแแกแฃแ แ แแฆแแแแแแ แคแแกแแก แแฃแฅแชแแแแ
แแแแแแกแฃแ แแฃแฅแชแแแแจแ แแแแแฌแแแแแแ แแ แแแแแแแก แแแแแฃแ แแแชแแแก แฃแฌแแแแ. แงแแแแแ แแฎแแแ แคแกแแแ แฃแแแ แแฆแแแแขแแแแแแก แฌแแแ แคแกแแแก. แแฃแฅแชแแแแ แแแแแ แแแแ, แ แแแแกแแช แแฆแแ แแฅแแแแ แแ แแขแแแแแแขแ, แ แแแแแแช แแแแแแญแแ แแแแก แแแแ แฌแแแแแแแแแแก. แแ แจแแแแฎแแแแแจแ แงแแแแแแ แแแฆแแแแ แแ แแขแแแแแแขแแ แฃแแแ แฌแแ แแแแแแแแแก แแแแแแแแฃแแ แแแแฎแ.
แแกแแแ แแ แกแแแแแก แแฃแฅแชแแแแแก แแแ แแแแขแ, แ แแแแแก แแ แแกแแช แแแแงแแแแแแ แแแแแแก แแแขแแก แแแแแแแแฃแ แคแแกแก แแ แกแแแแแแ แคแแกแ แแแก แฃแแแ แแฆแแแแขแแแแแแก. แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ, แแแขแ แ แฉแแแ แแแฃแงแแแแแแ.
แแ แแแแแแแแจแ แฉแแแ แแแฃแจแแแแ แกแแแชแแแแฃแ แแ แแฃแฅแชแแแแแกแแแแก แจแแฅแแแแ แแแแแ แแจแแแ. แแฃแฅแชแแแแแก แฎแแแแ แซแแแแแแแ 3000 แแแแแ, แฎแแแ แแแขแแก แกแแฌแงแแกแ แคแแกแ 0,001 WAVES. แแแแแฌแแแแก แจแแฃแซแแแ แแแแแแแแกแแก แฌแแแแแแแแแ DataTransaction-แแก แแแแแแแแแ, แ แแแแแจแแช แแแแแแแแฃแแแ แกแแแแแแซแ โแคแแกแโ แแ แแแแ แจแแแแแแแแแแก แฆแแ แแแฃแแแแ.
แแฎแแแ แแแแแก แคแแกแ แฃแแแ แแงแแก แแ แแแกแแฆแแแแก แแแแแแแแ แ แคแแกแแ แแแฆแแแ แแ แแแแแฌแแแแก แฃแแแ แฐแฅแแแแแก แแแแแแฃแ [new_bid + แกแแแแแแกแแแก] แขแแแแแแแ แแแแแก แแแแแ แแจแแ. แแ แแขแแแแแแขแแก แแแกแแแแ แแ แฃแแแ แแงแแก แฉแแฌแแ แแแ 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. แแแแแแแ แคแแกแแแแก แฐแแแแแแแฃแ แ แแฃแฅแชแแแแ
แฐแแแแแแแฃแ แแฃแฅแชแแแแแ แแแแแแแแ แแแแแ แแแแ แ แกแแแแแแแแแ แฃแคแ แ แแแฆแแ แคแแกแก, แแแแ แ แแงแแแแแแ แแแแ แแ แแก แแแแแแฎแแแแก. แคแแกแ แแขแแแแแ แแแแ แแชแแ แแแแ, แกแแแแ แแ แ-แแ แแ แแแแแฌแแแ แแ แแแแแแฎแแแแแ แแแขแแก แงแแแแแก แแแแแแแแ แ แคแแกแแ.
แแ แแแแแแแแจแ แฉแแแ แแแงแแแแแ แแแแแ แแฃแแแแแแแก, แ แแแแ แช แฌแแแแจแ, แแกแแแ แคแแกแแก แกแแคแแฎแฃแ แก, แ แแแแกแแช แแแแขแ แแชแแ แแแแ. แแแแแ แแจแแก แกแแ แแแขแ แแแแฌแแแแก, แแ แแก แแฃ แแ แ แแแแแฌแแแ แแแ แแแแ, แแแแช แคแกแแแก แแแแก. แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ, DataTransaction แแ แแแแฆแแแ แแแแแฉแแแแแก แแแแ .
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" แแ แแก แแฃแฅแชแแแแ, แ แแแแแจแแช แงแแแแ แแแแแฌแแแ แแฎแแแก แแแแก, แแแฃแฎแแแแแแ แแแแกแ, แแฃ แแแ แแแแแแแก แแแขแก. แงแแแแแ แแฎแแแ แแแแแฌแแแ แแฎแแแก แแแแก, แฎแแแ แแแแแฌแแแ, แ แแแแแแช แแแฅแกแแแแแฃแ แฌแแแแแแแแแแก แแแแแแแแแก, แแแแแก แแแขแก.
แฉแแแแก แแแแแแแแจแ, แแฃแฅแชแแแแแก แแแแแแฃแแ แแแแแฌแแแ แแแแแแแแกแแแก แฌแแแแแแแแแแก DataTransaction-แแก แแแจแแแแแแ (แแแกแแฆแแแ, แแแแจแแแแแแแ)* = (โแแแแแ แฏแแแแฃแแโ, แแแกแแแแ แแ), (โแคแแกแโ, แคแแกแ). แแกแแแ แแแแแชแแแแ แขแ แแแแแฅแชแแ แแแแขแแแชแแแแ แแฎแแแแ แแ แจแแแแฎแแแแแจแ, แแฃ แแ แแแแแฌแแแแก แฃแแแ แแฅแแก แแแแแ แแชแฎแแแก แขแ แแแแแฅแชแแ แแแกแ แฎแแแแแฌแแ แแ แแ แแแกแ แคแแกแ แงแแแแ แฌแแแแแ แแแฆแแแแ. แแฃแฅแชแแแแ แแ แซแแแแแแ แแแแแแแ แกแแแแฆแแแแแ.
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, แ แแแแแแแช แแแแแงแแคแแแแแแ แแแ แแแแฃแ แแแ แแแแแก.
แแ แแแแ แฎแแ แฏแแแก แแแแแแแ แแกแแชแแแแแแแ, แแฅแแแ แฃแแแ แกแแฎแแแแ แแแแฎแแแ แแแแแก แฌแแแแกแฌแแ แแแแแแแแแแแแก DataTransaction แแแแฆแแแฃแแแก แแแแแ แแจแแ (แแแกแแฆแแแ, แฆแแ แแแฃแแแแ) = (purchaseTransactionId, sellOrderId) แแ แแแ แซแแแแก DataTransactions แแแแแแแแ แฃแแแ แแแแแงแแแแแฃแแ แแแกแแฆแแแแ.
แแแแขแแ, แแแแฎแแแ แแแแแก แแขแแแชแแแฃแแแแแแ แฃแแแ แจแแแชแแแแแก แกแแแแแฆแแแแ แแแจแแแก แจแแกแงแแแแแก แขแ แแแแแฅแชแแแก ID-แก. แแแแฃแขแแก แฌแงแแแแ แฃแแแ แแงแแก แแแแแ, แ แแช แจแแกแงแแแแแก แขแ แแแแแฅแชแแแจแ. แฆแแ แแแฃแแแแ แแกแแแ แฃแแแ แแงแแก แจแแซแแแแก แแ แแก แแแคแแฅแกแแ แแแฃแแแก แขแแแ แแแแฆแแแแแก แคแแกแแก แแแแแแแแแแ.
แแแกแแแแแแ, แ แแ แจแแแแแแแจแ แกแแแแแฆแแแแ แแแแแ แแจแ แงแแแฃแแแแก แแแแฆแแแแแก แขแแแแแแแก แแแแฎแแแ แแแแแกแแแ แแ แคแแกแแ, แ แแแแแแแช แแแ แแงแแแ แแกแแแ: แกแแแแแฆแแแแ แแแแแ แแจแ แฅแแแแก ExchangeTransaction-แก, แแแแฎแแแ แแแแแ แฎแแแก แแฌแแ แก แจแแแแแแแก (แแฃ แขแ แแแแแฅแชแแ แกแฌแแ แแ แแ แแก แแแกแ แฃแแแแฃแแ), แกแแแแแฆแแแแ แแแแแ แแจแแ แฎแแแก แแฌแแ แก แแแแ แ แจแแแแแแแก แแ แแแแ แขแ แแแแแฅแชแแแก แแ แแแแแแแแก แแแก แแแแแฉแแแแจแ.
แแฃ แจแแกแงแแแแ แแ แแแฎแแ, แแแแฎแแแ แแแแแก แจแแฃแซแแแ แจแแฅแแแแก ExchangeTransaction แกแแ แแแขแจแ แแฆแฌแแ แแแ แฌแแกแแแแก แแแฎแแแแแ แแ แแแแแแแแแแก แขแ แแแแแฅแชแแ แแแแแฉแแแแจแ. แแ แแแแ แแแแฎแแแ แแแแแก แจแแฃแซแแแ แแแแแ แฃแแแก แแแแฆแแแฃแแ แขแแแแแแแแก แจแแซแแแแแ แแแฎแแ แฏแฃแแ แแแแฎแ.
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. แแแแงแแแแ แจแแแแแแ แกแแ แแแขแ แญแแแแแแ แแฅแขแแแแกแแแแก:
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 แกแแแ แข แแฅแขแแแแแก, แแแแชแแแ FeeCoin-แก N/taxDivisor-แแก แแแแแแแแ (แ แแแแแก แงแแแแ แจแแแแซแแแแ แแฅแแแแแแ 10 *N/taxDivisor WAVES) แแ แแฅแแแ แแซแแแแ แแแแแแ แก N/taxDivisor WAVES. แจแแแแแแ, แแฅแแแแ แแแแแแ (แแแแแกแแฎแแแ) แแฅแแแแ 9*N / taxDivisor WAVES.
แแฅแแแ แแกแแแ แจแแแแซแแแแ แแแแแฎแแ แชแแแแแ แแแแแแแ แ แญแแแแแแ แแฅแขแแแแแแก แกแแ แแแขแแก แแ 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 แแ แแก แแแแแแแแแก แแ แแแ แแแ, แ แแแแแก แแ แแกแแช แแงแแแแแแ แฃแแ แฃแแแแแ แแ แแแฃแฅแขแแ แแ แแแแกแแฎแฃแ แแแแแ แแแฎแแ แฏแฃแแ แแแแฎแแก แแแฌแแแก.
แกแแแ แข แแแแแ แแจแแก แแแแแงแแแแแแ แแ แจแแแแฎแแแแแก แแแแฎแแ แชแแแแแแแกแแก แฉแแแ แฃแแแ แจแแแแแแฌแแแ แแขแแแชแแแฃแแแแแแ แแกแแแ, แ แแแแ แช แกแแแแแฆแแแแ แกแแฅแแแจแ. แแ แแแแ แฎแแ แฏแแแก แแแแแแแ แแกแแชแแแแแแแ, แแแแฎแแแ แแแแแแ แฃแแแ แแแแแแแแแแแแก DataTransaction (แแแกแแฆแแแ, แแแแจแแแแแแแ) = (purchaseTransactionId, cashbackTransactionId) แฅแแจแแแฅแแก แแแฆแแแแแแ.
แฉแแแ แแกแแแ แฃแแแ แแแแแฌแแกแแ แแแ แซแแแแ แแ แกแแแฃแ แแแกแแฆแแแแแแ DataTransaction-แแก แแแแแงแแแแแแ. cashbackDivisor - แแ แแแฃแแ แแแงแแคแแแ แฅแแจแแแฅแแก แฌแแแแ. แแแแ. แแฃ cashback แฌแแแ แแ แแก 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)
}
แแขแแแฃแ แ แแแชแแแ
แแขแแแฃแ แ แกแแแแ แแแแฎแแแ แแแแแแก แกแแจแฃแแแแแแก แแซแแแแก แแแชแแแแแ แแฅแขแแแแแ แแแ แแแก แแแฎแแแ แแแแก แแแ แแจแ. แแขแแแฃแ แ แกแแแแแ, แแแ แแแแแแก แแ แแแ แแแแแฌแแแ แแแแแแแฃแแแ แแแแแแกแขแฃแ แแก แแแ แแแ แแแแฃแแ แแแ แแแแแก แแแแแแแแแแแจแ.
แแฃ แแ แ-แแ แแ แแแแแฌแแแ แแแแแช แแ แฃแแ แฃแแแแแงแแคแก แขแ แแแแแฅแชแแแก แกแฌแแ แแแแแกแขแฃแ แแแแก แขแ แแแแแฅแชแแแกแแแแก แแแแแงแแคแแ แแ แแจแ, แขแ แแแแแฅแชแแ แฃแฅแแแแแ แแ แแแชแแแ แแ แฎแแแแ.
แฉแแแแก แแแแแแแแจแ, แฉแแแ แแแแแแแงแแแแแ แจแแแแแแ แญแแแแแแ แแแแแ แแจแแก แกแแ แแแขแก:
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
}
แแแแแแแแ แกแขแแขแแแจแ แแแแแแฎแแแแแ แกแแแ แข แแแแแ แแจแแแแก แแแแแงแแแแแแก แคแแแแแกแฃแ แแแกแขแ แฃแแแแขแแแจแ, แ แแแแ แแชแแ แแคแชแแแแ, แคแแฃแฉแแ แกแแแ แแ แแแแแกแแฎแแแแแ.
แฌแงแแ แ: www.habr.com