ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Waves: ΠΎΡ‚ Π°ΡƒΠΊΡ†ΠΈΠΎΠ½ΠΎΠ² Π΄ΠΎ бонусных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Waves: ΠΎΡ‚ Π°ΡƒΠΊΡ†ΠΈΠΎΠ½ΠΎΠ² Π΄ΠΎ бонусных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ

Π‘Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ часто ассоциируСтся лишь с ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Π°ΠΌΠΈ, Π½ΠΎ области примСнСния Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ DLT Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡˆΠΈΡ€Π΅. Одно ΠΈΠ· самых пСрспСктивных Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ для примСнСния Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° – смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ автоматичСски ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ довСрия ΠΌΠ΅ΠΆΠ΄Ρƒ сторонами, Π΅Π³ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠΈΠΌΠΈ.

RIDE – язык для смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²

Waves Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ язык для смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² – RIDE. Π•Π³ΠΎ полная докумСнтация находится здСсь. А Π²ΠΎΡ‚ – ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π° эту Ρ‚Π΅ΠΌΡƒ Π½Π° Π₯Π°Π±Ρ€Π΅.

ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° RIDE являСтся ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Β«trueΒ» ΠΈΠ»ΠΈ Β«falseΒ». БоотвСтствСнно, транзакция Π»ΠΈΠ±ΠΎ записываСтся Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½, Π»ΠΈΠ±ΠΎ отвСргаСтся. Π‘ΠΌΠ°Ρ€Ρ‚-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ исполнСниС Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… условий. ГСнСрация Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² RIDE Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°.

На сСгодня сущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Waves: смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹ ΠΈ смарт-ассСты. Π‘ΠΌΠ°Ρ€Ρ‚-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ β€” это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½ΠΎ для Π½Π΅Π³ΠΎ задаСтся скрипт, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ всС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π‘ΠΊΡ€ΠΈΠΏΡ‚ смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:

match tx {
  case t: TransferTransaction | MassTransferTransaction => false
  case _ => true
}

tx β€” обрабатываСмая транзакция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½-ΠΌΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, Ссли ΠΎΠ½Π° Π½Π΅ являСтся Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½-ΠΌΠ°Ρ‚Ρ‡ΠΈΠ½Π³ Π² RIDE ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠ° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π’ скриптС смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

Π’Π°ΠΊΠΆΠ΅ Π² скриптС ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ конструкции Β«if-then-elseΒ» ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ условий. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π»ΠΈ Π΄ΠΎΠΊΠ°Π·ΡƒΠ΅ΠΌΡƒΡŽ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ (ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° выполнСния ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, RIDE Π½Π΅ содСрТит Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚ΠΈΠΏΠ° jump.

Π‘Ρ€Π΅Π΄ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… особСнностСй Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Waves β€” Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ «стСйта», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ состояния Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. Π’ стСйт Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ бСсконСчноС количСство ΠΏΠ°Ρ€ (ΠΊΠ»ΡŽΡ‡, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Ρ‚Π°-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ (DataTransaction). Π”Π°Π»Π΅Π΅ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π΅Π· REST API, Ρ‚Π°ΠΊ ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅.

КаТдая транзакция ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ массив ΠΏΡ€ΡƒΡ„ΠΎΠ² (proofs), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ внСсти подпись участника, ID Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.Π΄.

Π Π°Π±ΠΎΡ‚Π° с RIDE Ρ‡Π΅Ρ€Π΅Π· IDE позволяСт Π²ΠΈΠ΄Π΅Ρ‚ΡŒ скомпилированный Π²ΠΈΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° (Ссли ΠΎΠ½ компилируСтся), ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹ ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ скрипты, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку.

Для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ созданиС Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°, установку Π½Π° Π½Π΅Π³ΠΎ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для взаимодСйствия с REST API (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C#, C, Java, JavaScript, Python, Rust, Elixir). Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с IDE достаточно Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ NEW.

ВозмоТности примСнСния смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² ΡˆΠΈΡ€ΠΎΠΊΠΈ: ΠΎΡ‚ Π·Π°ΠΏΡ€Π΅Ρ‚Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ адрСса (Β«Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ список») Π΄ΠΎ слоТносоставных dApps.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Π² бизнСсС: ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π°ΡƒΠΊΡ†ΠΈΠΎΠ½ΠΎΠ², страховании ΠΈ создании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π»ΠΎΡΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Аукционы

Одно ΠΈΠ· условий ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ провСдСния Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π° – ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: участники Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² нСвозмоТности манипуляций ставками. Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ благодаря Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Ρƒ, Π³Π΄Π΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΠΎ всСх ставках ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ сдСланы, Π±ΡƒΠ΄ΡƒΡ‚ доступны всСм участникам.

На Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ Waves ставки ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π² стСйт Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π° посрСдством DataTransaction.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ врСмя Π½Π°Ρ‡Π°Π»Π° ΠΈ окончания Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π±Π»ΠΎΠΊΠΎΠ²: частота Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠ° Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ Waves ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π²Π½Π° 60 сСкундам.

1. Английский Π°ΡƒΠΊΡ†ΠΈΠΎΠ½ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅ΠΉΡΡ Ρ†Π΅Π½Ρ‹

Участники английского Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π° Π΄Π΅Π»Π°ΡŽΡ‚ ставки, ΡΠΎΡ€Π΅Π²Π½ΡƒΡΡΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. КаТдая новая ставка Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ. Аукцион заканчиваСтся, ΠΊΠΎΠ³Π΄Π° большС Π½Π΅Ρ‚ ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΡ‚ΡŒ послСднюю ставку. Π’ этом случаС участник, сдСлавший ΡΠ°ΠΌΡƒΡŽ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ставку, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π°ΡΠ²Π»Π΅Π½Π½ΡƒΡŽ сумму.

БущСствуСт ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠ΄Π°Π²Π΅Ρ† устанавливаСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ†Π΅Π½Ρƒ Π»ΠΎΡ‚Π°, ΠΈ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ Ρ†Π΅Π½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π΅Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π»ΠΎΡ‚ остаСтся Π½Π΅ΠΏΡ€ΠΎΠ΄Π°Π½Π½Ρ‹ΠΌ.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠΌ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ созданным для провСдСния Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π°. Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π° составляСт 3000 Π±Π»ΠΎΠΊΠΎΠ², Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ†Π΅Π½Π° Π»ΠΎΡ‚Π° β€” 0,001 WAVES. Участник ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ставку, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ² DataTransaction с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Β«priceΒ» ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ своСй ставки.

Π¦Π΅Π½Π° Π½ΠΎΠ²ΠΎΠΉ ставки Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ тСкущая Ρ†Π΅Π½Π° ΠΏΠΎ этому ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΈ участник Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π° счСту ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ [новая_ставка + комиссия] Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². АдрСс участника Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ записан Π² ΠΏΠΎΠ»Π΅ Β«senderΒ» Π² 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. Голландский Π°ΡƒΠΊΡ†ΠΈΠΎΠ½ ΡΠ½ΠΈΠΆΠ°ΡŽΡ‰Π΅ΠΉΡΡ Ρ†Π΅Π½Ρ‹

На голландском Π°ΡƒΠΊΡ†ΠΈΠΎΠ½Π΅ Π»ΠΎΡ‚ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ прСдлагаСтся ΠΏΠΎ Ρ†Π΅Π½Π΅, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅ΠΉ Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ Π³ΠΎΡ‚ΠΎΠ² Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ. Π¦Π΅Π½Π° пошагово сниТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· участников Π½Π΅ согласится ΠΊΡƒΠΏΠΈΡ‚ΡŒ Π»ΠΎΡ‚ ΠΏΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ†Π΅Π½Π΅.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Π΅ ΠΆΠ΅ константы, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ шаг Ρ†Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½ΠΈΠΈ delta. Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° провСряСт, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ участник являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ сдСлал ставку. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС 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 с (key, value)* = (Β«winnerΒ», address),(Β«priceΒ», price). Вакая DataTransaction одобряСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, Ссли для этого участника ΡƒΠΆΠ΅ имССтся TransferTransaction с Π΅Π³ΠΎ подписью ΠΈ Π΅Π³ΠΎ ставка Π²Ρ‹ΡˆΠ΅ всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ…. Аукцион продолТаСтся Π΄ΠΎ достиТСния высоты endHeight.

let startHeight = 1000
let endHeight = 2000
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
 case d: DataTransaction =>
   #ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅ΠΉ Π΄Π°Ρ‚Π°-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ "price"
   let newPrice = extract(getInteger(d.data, "price"))
 
   #ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΠΏΡ€ΡƒΡ„ΠΎΠ² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°
   let pk = d.proofs[1]
   let address = addressFromPublicKey(pk)
 
   #ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΈΠ· ΠΏΡ€ΡƒΡ„ΠΎΠ² ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅ΠΉ Π΄Π°Ρ‚Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
   let proofTx = extract(transactionById(d.proofs[2]))
   
   height > startHeight && height < endHeight
   && size(d.data) == 2
   #убСТдаСмся, Ρ‡Ρ‚ΠΎ адрСс побСдитСля, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, совпадаСт с адрСсом, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ· ΠΏΡ€ΡƒΡ„ΠΎΠ²
   && extract(getString(d.data, "winner")) == toBase58String(address.bytes)
   && newPrice > extract(getInteger(this, "price"))
   #провСряСм, Ρ‡Ρ‚ΠΎ транзакция подписана
   && sigVerify(d.bodyBytes, d.proofs[0], d.proofs[1])
   #провСряСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ΠΏΡ€ΡƒΡ„Π°Ρ…
   && match proofTx {
     case tr : TransferTransaction =>
       tr.sender == address &&
       tr.amount == newPrice
     case _ => false
   }
 case t: TransferTransaction =>
 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
 || (
   height > endHeight
   && extract(getString(this, "winner")) == toBase58String((addressFromRecipient(t.recipient)).bytes)
   && t.assetId == token
   && t.amount == 1
 )
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

Π‘Ρ‚Ρ€Π°Ρ…ΠΎΠ²Π°Π½ΠΈΠ΅ / ΠšΡ€Π°ΡƒΠ΄Ρ„Π°Π½Π΄ΠΈΠ½Π³

Рассмотрим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΡΡ‚Ρ€Π°Ρ…ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‚ финансовых ΠΏΠΎΡ‚Π΅Ρ€ΡŒ. НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ, Ρ‡Ρ‚ΠΎ Π² случаС обСсцСнивания Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΎΠ½ смоТСт Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сумму, ΡƒΠΏΠ»Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Π·Π° эти Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΈ Π³ΠΎΡ‚ΠΎΠ² Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΡƒΠΌΠ½ΡƒΡŽ сумму страховки.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ «страховыС Ρ‚ΠΎΠΊΠ΅Π½Ρ‹Β». Π—Π°Ρ‚Π΅ΠΌ Π½Π° Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ страховатСля устанавливаСтся скрипт, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ExchangeTransactions, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ условиям.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ Ρ‚Ρ€Π°Ρ‚Ρƒ, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π·Π°Π±Π»Π°Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ DataTransaction Π½Π° Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ страховатСля с (key, value) = (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)
}

Π‘Ρ‚Ρ€Π°Ρ…ΠΎΠ²ΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ смарт-ассСтом β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π»ΠΈΡ†Π°ΠΌ.

Π­Ρ‚Π° схСма ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΈ для Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΊΡ€Π°ΡƒΠ΄Ρ„Π°Π½Π΄ΠΈΠ½Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°ΠΌ, Ссли нСобходимая сумма Π½Π΅ Π±Ρ‹Π»Π° собрана.

Налоги с Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π‘ΠΌΠ°Ρ€Ρ‚-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΈ Π² случаях, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π°Π»ΠΎΠ³ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΎΠ². Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π½ΠΎΠ²Ρ‹ΠΉ ассСт с установлСнным спонсорством для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ со смарт-ассСтами:

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
}

Кэшбэк ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π»ΠΎΡΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Кэшбэк β€” Ρ‚ΠΈΠΏ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π»ΠΎΡΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŽ возвращаСтся Ρ‡Π°ΡΡ‚ΡŒ суммы, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠΉ Π½Π° Ρ‚ΠΎΠ²Π°Ρ€ ΠΈΠ»ΠΈ услугу.

ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого кСйса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΡƒΡ„Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Π»ΠΈ это Π² кСйсС страхования. Для прСдотвращСния Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ кэшбэка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ DataTransaction с (key, value) = (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
}

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ смарт-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Π² финансовых инструмСнтах – Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ ΠΎΠΏΡ†ΠΈΠΎΠ½Ρ‹, Ρ„ΡŒΡŽΡ‡Π΅Ρ€ΡΡ‹ ΠΈ вСксСля.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ