ΠŸΡ€ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈ смСтки Π½Π° Waves: ΠΎΠ΄ Π°ΡƒΠΊΡ†ΠΈΠΈ Π΄ΠΎ бонус ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Π½ΠΈ смСтки Π½Π° Waves: ΠΎΠ΄ Π°ΡƒΠΊΡ†ΠΈΠΈ Π΄ΠΎ бонус ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ

Π‘Π»ΠΎΠΊΡ‡Π΅Ρ˜Π½ чСсто сС ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π° само со ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡƒΡ‚ΠΈ, Π½ΠΎ областитС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π° Π½Π° 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€