ΠΠ»ΠΎΠΊΡΠ΅ΡΠ½ ΡΠ΅ΡΡΠΎ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π° ΡΠ°ΠΌΠΎ ΡΠΎ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡΠΈ, Π½ΠΎ ΠΎΠ±Π»Π°ΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅Π½Π° Π½Π° DLT ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΡΠΈΡΠΎΠΊΠΈ. ΠΠ΄Π½Π° ΠΎΠ΄ Π½Π°ΡΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ Π΅ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ ΠΊΠΎΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΠΈ Π½Π΅ Π±Π°ΡΠ° Π΄ΠΎΠ²Π΅ΡΠ±Π° ΠΌΠ΅ΡΡ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΎ Π³ΠΎ ΡΠΊΠ»ΡΡΠΈΠ»Π΅.
RIDE β ΡΠ°Π·ΠΈΠΊ Π·Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ
Waves ΡΠ°Π·Π²ΠΈ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π΅Π½ ΡΠ°Π·ΠΈΠΊ Π·Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ - RIDE. Π‘Π΅ Π½Π°ΠΎΡΠ° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠ½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°
ΠΠΎΠ³ΠΎΠ²ΠΎΡΠΎΡ RIDE Π΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ ΠΈ Π²ΡΠ°ΡΠ° βΡΠΎΡΠ½ΠΎβ ΠΈΠ»ΠΈ βΠ½Π΅ΡΠΎΡΠ½ΠΎβ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π»Π΅Π·. Π‘ΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ Π½Π° ΡΠΎΠ°, ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° Π΅ ΠΈΠ»ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°Π½Π° Π²ΠΎ Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ ΠΈΠ»ΠΈ ΠΎΡΡΡΠ»Π΅Π½Π°. ΠΠ°ΠΌΠ΅ΡΠ½ΠΈΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ ΡΠ΅Π»ΠΎΡΠ½ΠΎ Π³ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΠΈΡΠΏΠΎΠ»Π½ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈ. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² Π½Π΅ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ ΠΎΠ΄ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ Π²ΠΎ RIDE.
ΠΠ΅Π½Π΅Ρ ΠΏΠΎΡΡΠΎΡΠ°Ρ Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° Waves: ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ ΡΠΌΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°. ΠΠ°ΠΌΠ΅ΡΠ½Π°ΡΠ° ΡΠΌΠ΅ΡΠΊΠ° Π΅ ΡΠ΅Π΄ΠΎΠ²Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠ° ΡΠΌΠ΅ΡΠΊΠ°, Π½ΠΎ Π·Π° Π½Π΅Π° Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° ΡΠΊΡΠΈΠΏΡΠ° ΡΡΠΎ Π³ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΡΠΈΡΠ΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ. Π‘ΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΏΠ°ΠΌΠ΅ΡΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ:
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
tx Π΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΡΡΠΎ ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠ²Π° ΠΈ ΠΊΠΎΡΠ° Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΎΡ Π·Π° ΡΠΎΠ²ΠΏΠ°ΡΠ°ΡΠ΅ Π½Π° ΡΠ°Π±Π»ΠΎΠ½ΠΈ ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ Π½Π΅ Π΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° Π·Π° ΠΏΡΠ΅Π½ΠΎΡ. Π£ΡΠΎΠ³Π»Π°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΎΠ½ΠΈΡΠ΅ Π²ΠΎ RIDE ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²ΠΈΠ΄ΠΎΡ Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ°. Π‘ΠΈΡΠ΅ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ ΡΠΌΠ΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° Π·Π° ΠΏΠ°ΠΌΠ΅ΡΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°
Π‘ΠΊΡΠΈΠΏΡΠ°ΡΠ° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ βΠ°ΠΊΠΎ-ΡΠΎΠ³Π°Ρ-ΠΈΠ½Π°ΠΊΡβ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΠ΅Π»ΠΎΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΠ΅. ΠΠ° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠ° Π΄Π΅ΠΊΠ° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΠΈΠΌΠ°Π°Ρ Π΄ΠΎΠΊΠ°ΠΆΠ»ΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠ½ΠΎΡΡ ΠΈ ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ (ΡΡΠΎΡΠΎΠΊ) ΡΡΠΎ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π°Ρ ΠΏΡΠ΅Π΄ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΎΡ, RIDE Π½Π΅ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΈΠΊΠ»ΡΡΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΡΠ°Π²ΠΈ Π·Π° ΡΠΊΠΎΠΊΠΎΠ²ΠΈ.
ΠΡΡΠ³ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅ Π½Π° Waves Π²ΠΊΠ»ΡΡΡΠ²Π°Π°Ρ ΠΏΡΠΈΡΡΡΡΠ²ΠΎ Π½Π° βΡΠΎΡΡΠΎΡΠ±Π°β, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠΎΡΡΠΎΡΠ±Π° Π½Π° ΡΠΌΠ΅ΡΠΊΠ°ΡΠ°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ΅Π½ Π±ΡΠΎΡ Π½Π° ΠΏΠ°ΡΠΎΠ²ΠΈ (ΠΊΠ»ΡΡ, Π²ΡΠ΅Π΄Π½ΠΎΡΡ) Π²ΠΎ ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° Π½Π° ΡΠΌΠ΅ΡΠΊΠ°ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (DataTransaction). ΠΠ²ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Ρ ΠΈ ΠΏΡΠ΅ΠΊΡ REST API ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈΠΎΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ.
Π‘Π΅ΠΊΠΎΡΠ° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΎΠ΄ΡΠΆΠΈ Π½ΠΈΠ·Π° Π΄ΠΎΠΊΠ°Π·ΠΈ, Π²ΠΎ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²Π½Π΅ΡΠ΅ ΠΏΠΎΡΠΏΠΈΡΠΎΡ Π½Π° ΡΡΠ΅ΡΠ½ΠΈΠΊΠΎΡ, ID Π½Π° ΠΏΠΎΡΡΠ΅Π±Π½Π°ΡΠ° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΠΈΡΠ½.
Π Π°Π±ΠΎΡΠ° ΡΠΎ RIDE ΠΏΡΠ΅ΠΊΡ
ΠΠ° ΡΠ΅Π»ΠΎΡΠ΅Π½ ΡΠΈΠΊΠ»ΡΡ, Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΌΠ΅ΡΠΊΠ°, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΌΠ΅ΡΠ΅Π½ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ Π½Π° Π½Π΅Π° ΠΈ ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ REST API (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, C#, C, Java, JavaScript, Python, Rust, Elixir) . ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ IDE, ΡΠ°ΠΌΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠΏΡΠ΅ΡΠΎ NEW.
ΠΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ ΡΠ΅ ΡΠΈΡΠΎΠΊΠΈ: ΠΎΠ΄ Π·Π°Π±ΡΠ°Π½Π° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π΄ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ Π°Π΄ΡΠ΅ΡΠΈ (βΡΡΠ½Π° Π»ΠΈΡΡΠ°β) Π΄ΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈ dApps.
Π‘Π΅Π³Π° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ Π²ΠΎ Π±ΠΈΠ·Π½ΠΈΡΠΎΡ: ΠΏΡΠΈ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π°ΡΠΊΡΠΈΠΈ, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ΅ ΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° Π»ΠΎΡΠ°Π»Π½ΠΎΡΡ.
ΠΡΠΊΡΠΈΠΈ
ΠΠ΄Π΅Π½ ΠΎΠ΄ ΡΡΠ»ΠΎΠ²ΠΈΡΠ΅ Π·Π° ΡΡΠΏΠ΅ΡΠ½Π° Π°ΡΠΊΡΠΈΡΠ° Π΅ ΡΡΠ°Π½ΡΠΏΠ°ΡΠ΅Π½ΡΠ½ΠΎΡΡΠ°: ΡΡΠ΅ΡΠ½ΠΈΡΠΈΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ ΡΠΈΠ³ΡΡΠ½ΠΈ Π΄Π΅ΠΊΠ° Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ° ΡΠΎ ΠΏΠΎΠ½ΡΠ΄ΠΈΡΠ΅. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ΠΎΡ, ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΡΠΈΡΠ΅ ΠΎΠ±Π»ΠΎΠ·ΠΈ ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΊΠΎΠ³Π° Π±ΠΈΠ»Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΡΠΈΡΠ΅ ΡΡΠ΅ΡΠ½ΠΈΡΠΈ.
ΠΠ° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ΠΎΡ 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β
β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) ΠΈ Π΄Π° Π·Π°Π±ΡΠ°Π½ΠΈ ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ DataTransaction ΡΠΎ Π²Π΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅Π½ ΠΊΠ»ΡΡ.
ΠΠ°ΡΠΎΠ°, Π΄ΠΎΠΊΠ°Π·ΠΈΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΌΠΎΡΠ° Π΄Π° Π³ΠΎ ΡΠΎΠ΄ΡΠΆΠ°Ρ 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)
}
Π’ΠΎΠΊΠ΅Π½ Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠ°ΠΌΠ΅ΡΠ½ΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π΄Π° ΡΠ΅ Π·Π°Π±ΡΠ°Π½ΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ΅ΡΠΈ Π»ΠΈΡΠ°.
ΠΠ²Π°Π° ΡΠ΅ΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΠΈ Π·Π° ΡΠΎΠΊΠ΅Π½ΠΈ Π·Π° Π³ΡΡΠΏΠ½ΠΎ ΡΠΈΠ½Π°Π½ΡΠΈΡΠ°ΡΠ΅, ΠΊΠΎΠΈ ΡΠ΅ Π²ΡΠ°ΡΠ°Π°Ρ Π½Π° ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈΡΠΈΡΠ΅ Π΄ΠΎΠΊΠΎΠ»ΠΊΡ Π½Π΅ Π΅ ΡΠΎΠ±ΡΠ°Π½Π° ΠΏΠΎΡΡΠ΅Π±Π½Π°ΡΠ° ΡΡΠΌΠ°.
ΠΠ°Π½ΠΎΡΠΈ Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ
ΠΠ°ΠΌΠ΅ΡΠ½ΠΈΡΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ²Π°Π°Ρ ΠΈ Π²ΠΎ ΡΠ»ΡΡΠ°ΠΈ ΠΊΠΎΠ³Π° Π΅ Π½Π΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠ»Π°ΡΠΈ Π΄Π°Π½ΠΎΠΊ Π½Π° ΡΠ΅ΠΊΠΎΡΠ° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²ΠΈΠ΄ΠΎΠ²ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠ΅ΠΊΡ Π½ΠΎΠ²ΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΎ
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 - Π΅Π΄ΠΈΠ½ΠΈΡΠ° ΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΡΠΎ ΡΠ΄Π΅Π»ΠΎΡ Π·Π° Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π° Π³ΠΎΡΠΎΠ²ΠΈΠ½Π°. ΠΠ½ΠΈΠ΅. Π°ΠΊΠΎ ΡΠ΄Π΅Π»ΠΎΡ Π·Π° Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π° Π³ΠΎΡΠΎΠ²ΠΈΠ½Π° Π΅ 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