ΠΠ»ΠΎΠΊΡΠ΅ΠΉΠ½ ΡΠ°ΡΡΠΎ Π°ΡΡΠΎΡΠΈΠΈΡΡΠ΅ΡΡΡ Π»ΠΈΡΡ Ρ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡΠ°ΠΌΠΈ, Π½ΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ 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 ΡΠ΅ΡΠ΅Π·
ΠΠ»Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°, Π²ΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π½Π° Π½Π΅Π³ΠΎ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ 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