Blockchain ααΆααΏααααααΌαααΆαααααΆαααααΆααααΆαα½αααΉαααΌαα·ααααααααααΈαααΌ ααα»αααααααααααααΆαα’αα»αααααα
αα
αααα·ααααΆ DLT ααΊααΆααααααΌααααΌααΆαα ααααααα½ααααα»αα
αααααααααααααααααααααα»ααααααΆααααΆαααααΎααααΆαα blockchain ααΊααΆαα·α
αα
αααααΆααααααΆααααααααααΌαααΆαααααα·ααααα·αααααααααααααααα· α αΎααα·ααααααΌαα±ααααΆαααΆαααΏαα»αα
α·ααααααΆαααΆααΈαααααΆααααα
αΌαααΆαααααα
αα·α - ααΆααΆαααααΆαααα·α
αα
αααααΆααααΆααα
Waves ααΆααααααΎαααΆααΆαα·ααααααααΆαααα·α
αα
αααααΆααααΆααα - RIDE α α―αααΆαααααααααααααΆααΆαααΈααΆαααα
αα·α
αα
αααααΆ RIDE ααΊααΆααΆαααααΆαααα α αΎααααα‘αα "αα·α" α¬ "αα·ααα·α" ααΆααααααα ααΌα
ααααα αΎαααααα·ααααα·ααΆαααααΌαααΆααααααααΆαα
αααα»α blockchain α¬ααα·αααα αα·α
αα
αααααΆααααΆαααααΆααΆαααΆαααααααααΌαααΆαααααααααααααααααααΆααααααΆααα ααΆααααααΎαααααα·ααααα·ααΆαααΈαα·α
αα
αααααΆαα
αααα»α RIDE αα
αα
α»αααααααα·αα’αΆα
ααααΎαα
ααΆαααα
ααααααααααα αα·α
αα
αααααΆααααΆααα Waves ααΆαααΈαααααααα ααααΈααααΆααα αα·ααααααααααααααααΆαααα ααααΈααααΆαααααΊααΆααααΈα’αααααααΎααααΆααααααααΆ ααα»ααααααααααΈαααααΌαααΆαααααααααααΆααααΆααααααααααααααααα·ααααα·ααΆαααΆααα’ααα ααααααΈαααααΈααααΆαααα’αΆα
ααΎααα
ααΌα
ααα α§ααΆα αααα
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
tx ααΊααΆααααα·ααααα·ααΆαααααααα»αααααΎαααΆα αααααΎαα’αα»ααααΆαα±ααααααΎααααααΆαααααΌααααααααΌ αα»αααααΆααααΆαα·ααααααΆααααα·ααααα·ααΆααααααααααΆααα ααΆαααααΌααααααααΆααα
αααα»α RIDE ααααΌαααΆαααααΎααΎααααΈαα·αα·αααααΎαααααααααααααα·ααααα·ααΆαα ααααΈαααααΆαααααΆααααΆααα’ααα’αΆα
ααααΌαααΆαααααΎαααΆααα
αααα»αααααααΈαααααΈααααΆααα
ααααααΈαααα’αΆα αααααΆαα’ααα ααααΎααααα "if-then-else" αα·ααα·ααΈααΆααααααααααααααααααΆαααα·αα·αααααααααααααααααα ααΎααααΈααΆααΆααΆαα·α αα αααααΆααΆαααΆααααααα αα·αααΆααααα»αααααΆα (ααααααΎα) αααααΆααααα½ααααα»αααΆαααααααααΆααα»ααααααΆαα’αα»αααααα·α αα αααααΆα αΆααααααΎα RIDE αα·αααΆαααααα·ααα»α α¬ααα ααααΈαααααααΆααααα‘αΎαα
αααααααα·αααααααααααααααααΈ Waves αα½αααΆαααααααΆααα "αααα" αααααΊααααΆαααΆαααααααΈα α’αααα’αΆα αααααα ααα½αααΌαααααααΆαααααα (ααΌααα ααααα) αα ααΆααααααΆαααΆαααααΈαααααααΎααααα·ααααα·ααΆααα·αααααα (DataTransaction) α ααααααΆααααα’αΆα ααααΌαααΆαααααΎαααΆαααΆααααΆαααα REST API αα·ααααααααΆαααα αααα»ααα·α αα αααααΆααααΆαααα
ααααα·ααααα·ααΆαααΈαα½ααα’αΆα ααΆαα’αΆααααααααα»ααΆα αααα αααααααΆααααα’αααα αΌααα½α ααααααααΆααααααααα·ααααα·ααΆααααααααΌαααΆαααα
ααααΎααΆαααΆαα½α RIDE ααΆαααα
αααααΆαααααααααααα αα½αααΆααααΆααααααΎαααααΈ ααΆαααα‘αΎααα·α αα αααααΆααααΆααααα ααΎααΆ αα·αααΆαααααΎααααα·ααααα·ααΆα α’αααααα’αΆα ααααΎαααααΆααααααααΆααα’ααααααααααΆαα½α REST API (α§ααΆα ααα C#, C, Java, JavaScript, Python, Rust, Elixir) . ααΎααααΈα αΆααααααΎαααααΎααΆαααΆαα½α IDE ααααΆααααα α»α αααΌαα»α NEW α
ααααααΆααααααΆααααΆαααααΎααααΆαααα·α αα αααααΆααααΆαααααΊααααΌααΆαα ααΈααΆαα αΆαααΆααααααα·ααααα·ααΆααα ααΆααα’αΆααααααΆαααΆααααΆαα (βαααααΈαααα β) αα αΌαααα dApps αααα»αααααΆαα
α₯α‘αΌαααα ααΌααααα‘ααααΎαα§ααΆα αααααΆααααΆααααααΆαααααΎααααΆαααα·α
αα
αααααΆααααΆααααααα»αα’αΆααΈαααααα αα
αααααααΎααΆαααααααα ααΆαααΆααΆαααΆαααα αα·αααΆααααααΎααααααα·ααΈαααααΈααΆαα
ααΆαααααααα
αααααααααα½ααααααΆααααΆααααααααααααααααΊαααααΆααΆαα α’αααα αΌααα½αααααΌαααααΆααααα»αα α·αααααΆααΆαα·αα’αΆα αα αα½α αααααα»αααΆααααα αααΆααααααααα αααα’αΆα αααααα ααΆααααααΆα blockchain ααααα·ααααααααααα·αα’αΆα ααααΆααααααΌαααΆαα’αααΈααΆαααααΆααααΆααα’αα αα·ααααααααΆααααα½αααααααΌαααΆααααααΎαα‘αΎαααΉαααΆααααααΆααα’αααα αΌααα½αααΆααα’ααα
αα ααΎ Waves blockchain ααΆααααααααα’αΆα ααααΌαααΆααααααααΆαα αααα»αααααΆαααΆαααααΈαααααααααΆαααα DataTransaction α
α’αααααα’αΆα ααααααααααααΆα αΆααααααΎα αα·ααααα ααααααΆαααααααααααααααΎααααααα»αα ααΆαααΉαααΆααααααΆααααααΎααααα»ααα αααα»α Waves blockchain ααΊαααα ααααααΎααΉα 60 αα·ααΆααΈα
1. ααΆαααααααααααααααΎαα‘αΎαααΆααΆααΆα’ααααααα
α’αααα αΌααα½ααααα»αααΆααααααααααΆααΆααΆα’ααααααα ααααααααααα»αααΆαααααα½αααααααααααΆα ααΆαααααΆααααααΈααΈαα½ααααααΌαααααΎαααΈααΆαααααΆαααα»αα ααΆαααααααααααα αααα ααααααααααΆαα’ααααααααααααΎαααΈααΆααααααααα α»ααααααα αααα»αααααΈααα α’ααααααααααααααααααα»αααααΌααααααααα ααα½αααΉαααααΆαααααααΆααααααΆααα
ααΆααααΆααααααΎααααααααααααα αααα’ααααααααααααααααα’αααααααΆαααααΆααα‘αΌαα·α α αΎααααααα α»ααααααααααΌαααααΎαααΈααΆα ααΎαα·αααΌα αααααα ααΈα‘αΌαα·ααα αααα·ααααα
αααα»αα§ααΆα αααααα ααΎααααα»αααααΎααΆαααΆαα½αααααΈααααααααΎαααΆαα·ααααααααΆααααΆααααααααα ααααααααααΆααααααααααΊ 3000 αααα»α α αΎααααααα αΆααααααΎαααα‘αΌαα·αααΊ 0,001 WAVES α α’αααα αΌααα½αα’αΆα ααΆααααΆαααααααααααααααΎ DataTransaction ααΆαα½αααΉααααααΉα "ααααα" αα·ααααααααααΆαααααααααααααα½αααα
αααααααααΆααααααααααααΈααααΌααααααααααΆαααααααα αα α»αααααααααααΆαααααααΉαααα α αΎαα’αααα αΌααα½αααααΌαααααΆααααΆαα αα ααΆαα [new_bid + commission] tokens αα αααα»αααααΈααααααΆααα α’αΆααααααΆαααααα’ααααααααααααααΌααααααααααΆαα αααα»αααΆα "α’αααααααΎ" αα αααα»α DataTransaction α αΎααααααααααα»αααααααααα αα α»ααααααααααΌααααααα·ααα αααα»ααααααααααααααα
ααααα·αααΎαα α α»ααααα ααααααΆαααααααα α’αααα αΌααα½αααΆαααααααααααααααααααα»α ααΆααα’αΆα ααααΎααααα·ααααα·ααΆαααααΌαααααΆααααΎααααΈααΌααΆααααααΆαααααααααΌαααααΆαααα»ααααααααΆααααΆαα αα·αααΌααΌαα·ααααααα
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. ααΆααααααααα αΌα‘ααααααΆαααα α»αααααα
αα αααα»αααΆααααααααααααα αΌα‘αα ααΆα αααΎαααααΌαααΆααααααααΌαααααΌααααα»αααααααααααααΆαα’αααΈαααα’ααααα·ααα»αα α·ααααααα αααααααα α»αααΆααααΆαα αα αΌααααα’αααα αΌααα½αααααΆααααααααααα·αααΈα‘αΌαα·ααααα»αααααααα αα α»ααααααα
αααα»αβα§ααΆα αααβααα ααΎαβααααΎβαααβααΌα βαααα»αβαααβαα»α ααααβααΆααβααα αΆαβαααααβαα βααα delta ααβα α»αα ααααααΈαααααΈαα·αα·αααααΎαααΆααΎα’αααα αΌααα½ααα·αααΆααΆα’αααααααΆααααααΌαα¬α’ααα ααΎαα·αααΌα αααααα 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. ααΆαααααααα "αααααΆααα’αα"
βααΆααααααααΆααααΆααα’ααβ ααΊααΆααΆαααααααααααα’αααα αΌααα½αααΆααα’αααααααΆαααααααα ααααα·ααα·αααΆα’αααααΆααααααααααααααα α’αααα αΌααα½αααααΈααααΆααααααααααααααααα α αΎαα’αααα αΌααα½ααααααααΎααΆααααααααα’αα·ααααΆααααα αααΎαα
αααα»αα§ααΆα αααααααααΎα α’αααα αΌααα½ααααααααααΈαα½ααααΆααααΆααααααααααΆαααα 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
α αΌαααΎααα·α αΆαααΆα’αααΈααααΆαααΆααα½ααααα’αααααααΌαααΆααΆαααααααααααααα·ααααα’αααααααΎααααΆαααααααΆααααΉαααΆαααΆαααααααααα α·ααααααααα»α ααΆα§ααΆα ααα α’αααααααΎααααΆααα ααααΆαααΆαααΆααΆααΆααααα·αααΎαααααΆαααααΆααααααΆααα α»α ααΆααααΉαα’αΆα ααα½αααΆααααα·αααΌαα ααα½αααΉαααααΆαααααααααααααΆαααααααααΆααααΌααΉαααΆααααα α αΎααα»αα α·ααααααααααΆααααΆααΆαααΆαααααααα»αα ααα½αααΉαααααΆααααααααα
ααΎααααΈα’αα»ααααααΆ "αα·αα·ααααααααΆααΆααΆαααΆαααα" α αΆαααΆα αααααΌαα ααα αααααΆαααα ααααααΈααα½αααααΌαααΆαααα‘αΎααα ααΎααααΈααααα’αααααΆααααααααααΆα αααα’αα»ααααΆαα±ααααααααα·ααααα·ααΆα Exchange ααΆαααααααααααααααααααααααΆααααΆααααα»ααααααααααααΌαααααα·ααααα·α
ααΎααααΈαααααααΆααααΆαα αααΆααααααα α’αααααααΌαααααΎαα»αα±ααα’αααααααΎααααΆααααααΎ DataTransaction αα ααΆααααααΈααααα’αααααΆααααααααααΆαααΆαα»αααΆαα½α (key, value) = (purchaseTransactionId, sellOrderId) αα·αα αΆαααΆααααΆαααααΎ DataTransactions ααΆαα½αααΉααααααααΆαααααΎαα½α α αΎαα
ααΌα αααα ααααα»ααΆαααααα’αααααααΎααααΆααααααΌαααααΆαααααααααΆααααααα·ααααα·ααΆαααααΆααα·ααα·αα·ααααααααΆααΆααΆαααΆααααα ααΌααΌαα·ααααααααααΌαααααΌα ααααΆαα ααΉαααααα·ααααα·ααΆααα·αα ααΆαα αααΆαααααααΌαααααααΎααΉαααααααααααΆαααααααα ααααα·α αααααααααΆααΆαααΆααααα
ααΆααααΌαααΆααααααΆααΆαααααααααΆαα ααααΈααΆααΆαααΆαααααα·αααΌααΉαααΆααΆαααΆααααααΈα’αααααααΎααααΆαααααα»αααααααα·αααΆαααΆαααααααααααΆααααΆααα·αα ααααΈααΆααΆαααΆαααααααααΎα ExchangeTransaction α’αααααααΎααααΆααα α»αα αααααααΆααΎααΆααααααΆαα·α (ααααα·αααΎααααα·ααααα·ααΆαααααΌαααΆααααα ααααααΉαααααΌα) ααααΈααΆααΆαααΆααααα α»αα αααααααΆααΎααΆααααααΆαα·αααΈααΈα αα·αααααα·ααααα·ααΆαααΆααααΌα α αΎαααααΎααΆαα blockchain α
ααααα·αααΎααααΆαααΆααα·αααΎαα‘αΎααα α’αααααααΎααααΆααα’αΆα αααααΎα 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)
}
α§ααΆα ααα αα·αα·ααααααααΆααΆααΆαααΆααααα’αΆα ααααΌαααΆααααααΎαααΆαααααααααααααααααΆααα ααΎααααΈα αΆαααΆααααΆαααααααα α±ααααΆααΈααΈααΈα
αααααααΆααααααααα’αΆα ααααΌαααΆαα’αα»αααααααααΆααααΆααααααΌααααα»αααΌααααααΆαααααααΌαααΆαααααααααΌαααα αΆαααα·α ααααα·αααΎα ααα½αααΉαααααΆαααααααααΌαααΆααα·αααααΌαααΆααααααΌαα
ααααααΎααααα·ααααα·ααΆα
αα·α
αα
αααααΆααααΆαααααααααΌαααΆαα’αα»ααααααααααααα»αααααΈαααα
αΆαααΆα
αααααΌααααααΌαααααααΎααααα·ααααα·ααΆαααΈαα½ααααΆαα½αααΉααααααααααααααααααααΆα
αααΎαα αααα’αΆα
ααααΌαααΆαααααΎααΆαααααααααααααααααα·ααααΈααΆαα½αααΉαααΆαααα‘αΎα
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 smart αα½αααααΉααααααα±ααα’αααααΌα 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 αα·ααααααΈααΆα
Cashback ααΊααΆαααααααααααααα·ααΈαααααΈααΆααααα’ααααα·αααα½αααΆααααα·αααΌααααααααα ααα½αααΉαααααΆαααααααΆαα αααΆαααΎααα·ααα α¬ααααΆααααα
αα αααα’αα»ααααααααΈααααααααααΎααααΈααααΆααα ααΎαααααΌααα·αα·αααααΎααααααα»ααΆαααΆααα·ααΈααΌα ααααΆαααααΎαααΆαααααΎαα αααα»αααααΈααΆααΆαααΆααααα ααΎααααΈαααααααΆααααΆαα αααΆααααααα α’αααααααΎααααΆααααααΌαααααααΎ DataTransaction with (key, value) = (purchaseTransactionId, cashbackTransactionId) αα»ααααααα½αααΆα cashbackα
ααΎαααααααΌααααααααααΆαα αΆαααΆααααΎαααααααΆαααααΆαααααααααΎ DataTransaction α cashbackDivisor - α―αααΆαααα αααααα αααα cashback α ααΆαααααα ααααα·αααΎα αααα 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