αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸƒαž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒ WavesαŸ– αž–αžΈαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžšαž αžΌαžαžŠαž›αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ’αžšαžΆαž€αŸ‹αžšαž„αŸ’αžœαžΆαž“αŸ‹

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸƒαž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒ WavesαŸ– αž–αžΈαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžšαž αžΌαžαžŠαž›αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ’αžšαžΆαž€αŸ‹αžšαž„αŸ’αžœαžΆαž“αŸ‹

Blockchain αž‡αžΆαžšαžΏαž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžŸαžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžšαžΌαž”αž·αž™αž”αŸαžŽαŸ’αžŽαž‚αŸ’αžšαžΈαž”αžαžΌ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ DLT αž‚αžΊαž€αžΆαž“αŸ‹αžαŸ‚αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αŸ” αž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžαŸ†αž”αž“αŸ‹αžŠαŸ‚αž›αž‡αŸ„αž‚αž‡αŸαž™αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ blockchain αž‚αžΊαž‡αžΆαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαžŠαŸαž†αŸ’αž›αžΆαžαžœαŸƒαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž αžΎαž™αž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž‡αžΏαž‘αž»αž€αž…αž·αžαŸ’αžαžšαžœαžΆαž„αž—αžΆαž‚αžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž“αŸ„αŸ‡αž‘αŸαŸ”

αž‡αž·αŸ‡ - αž—αžΆαžŸαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒ

Waves αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž—αžΆαžŸαžΆαž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒ - RIDE αŸ” αž―αž€αžŸαžΆαžšαž–αŸαž‰αž›αŸαž‰αžšαž”αžŸαŸ‹αžœαžΆαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… αž“αŸ…αž‘αžΈαž“αŸαŸ‡. αž αžΎαž™αž“αŸ…αž‘αžΈαž“αŸαŸ‡ - αž’αžαŸ’αžαž”αž‘αž›αžΎαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡αŸ” αž“αŸ…αž›αžΎ Habr αŸ”

αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆ RIDE αž‚αžΊαž‡αžΆαž€αžΆαžšαž–αŸ’αž™αžΆαž€αžšαžŽαŸ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹ "αž–αž·αž" ឬ "αž˜αž·αž“αž–αž·αž" αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αŸ” αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž αžΎαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ blockchain αž¬αž”αžŠαž·αžŸαŸαž’αŸ” αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαž’αžΆαž“αžΆαž™αŸ‰αžΆαž„αž–αŸαž‰αž›αŸαž‰αž“αžΌαžœαž€αžΆαžšαž”αŸ†αž–αŸαž‰αž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ” αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž–αžΈαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ RIDE αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž˜αž·αž“αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αž‘αŸαŸ”

αžŸαž–αŸ’αžœαžαŸ’αž„αŸƒαž“αŸαŸ‡ αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒ Waves αž˜αžΆαž“αž–αžΈαžšαž”αŸ’αžšαž—αŸαž‘αŸ– αž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒ αž“αž·αž„αž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜αž†αŸ’αž›αžΆαžαžœαŸƒαŸ” αž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒαž‚αžΊαž‡αžΆαž‚αžŽαž“αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒαž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡ αž§αž‘αžΆαž αžšαžŽαŸαŸ–

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

tx αž‚αžΊαž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžŠαŸ‚αž›αž™αžΎαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αž‚αŸ†αžšαžΌ αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž”αŸ’αžšαžΆαž€αŸ‹αŸ” αž€αžΆαžšαž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αž›αŸ†αž“αžΆαŸ†αž“αŸ…αž€αŸ’αž“αž»αž„ RIDE αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αž‚αžŽαž“αžΈαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒ αž”αŸ’αžšαž—αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš.

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸαž’αžΆαž…αž”αŸ’αžšαž€αžΆαžŸαž’αžαŸαžš αž”αŸ’αžšαžΎαžŸαŸ†αžŽαž„αŸ‹ "if-then-else" αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž–αŸαž‰αž›αŸαž‰αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž˜αžΆαž“αž—αžΆαž–αž–αŸαž‰αž›αŸαž‰ αž“αž·αž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ (αžαŸ’αž›αŸƒαžŠαžΎαž˜) αžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αžŸαŸ’αžŸαž“αŸαž‘αžΆαž™αž˜αž»αž“αž–αŸαž›αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ RIDE αž˜αž·αž“αž˜αžΆαž“αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ† αž¬αžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαž›αŸ„αžαž‘αžΎαž™αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸƒαž‚αžŽαž“αžΈ Waves αžšαž½αž˜αž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒ "αžšαžŠαŸ’αž‹" αž–αŸ„αž›αž‚αžΊαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž‚αžŽαž“αžΈαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžšαžŸαŸαžšαž…αŸ†αž“αž½αž“αž‚αžΌαžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αž€αŸ†αžŽαžαŸ‹ (αž€αžΌαž“αžŸαŸ„ αžαž˜αŸ’αž›αŸƒ) αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‚αžŽαž“αžΈαžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ (DataTransaction) αŸ” αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αžαžΆαž˜αžšαž™αŸˆ REST API αž“αž·αž„αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αž’αžΆαž…αž˜αžΆαž“αž’αžΆαžšαŸαž“αŸƒαž—αžŸαŸ’αžαž»αžαžΆαž„ αžŠαŸ‚αž›αž αžαŸ’αžαž›αŸαžαžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜ αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”αž›αŸ”

αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ RIDE αžαžΆαž˜αžšαž™αŸˆ αž‘αžΈαž“αŸαŸ‡ αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž˜αžΎαž›αžƒαžΎαž‰αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž…αž„αž€αŸ’αžšαž„αž“αŸƒαž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆ (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„) αž”αž„αŸ’αž€αžΎαžαž‚αžŽαž“αžΈαžαŸ’αž˜αžΈ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆ αž€αŸαžŠαžΌαž…αž‡αžΆαž•αŸ’αž‰αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαžΆαž˜αžšαž™αŸˆαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžŠαŸ’αžαž–αŸαž‰αž›αŸαž‰ αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‚αžŽαž“αžΈ αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαž“αŸ…αž›αžΎαžœαžΆ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‰αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž”αŸ’αžšαžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™ REST API (αž§αž‘αžΆαž αžšαžŽαŸ C#, C, Java, JavaScript, Python, Rust, Elixir) . αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ IDE αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž…αž»αž…αž”αŸŠαžΌαžαž»αž„ NEW αŸ”

αž›αž‘αŸ’αž’αž—αžΆαž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαž‚αžΊαž’αŸ†αž‘αžΌαž›αžΆαž™αŸ– αž–αžΈαž€αžΆαžšαž αžΆαž˜αžƒαžΆαžαŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ (β€œαž”αž‰αŸ’αž‡αžΈαžαŸ’αž˜αŸ…β€) αžšαž αžΌαžαžŠαž›αŸ‹ dApps αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαž€αŸ’αž“αž»αž„αž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αŸ– αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒ αž€αžΆαžšαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„ αž“αž·αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž—αž€αŸ’αžŠαžΈαž—αžΆαž–αŸ”

αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒ

αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž‡αŸ„αž‚αž‡αŸαž™αž‚αžΊαžαž˜αŸ’αž›αžΆαž—αžΆαž–αŸ– αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž‘αŸ†αž“αž»αž€αž…αž·αžαŸ’αžαžαžΆαžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαŸ” αž“αŸαŸ‡αž’αžΆαž…αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αžŠαŸ„αž™αžŸαžΆαžš blockchain αžŠαŸ‚αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αž·αž“αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“αž’αŸ†αž–αžΈαž€αžΆαžšαž—αŸ’αž“αžΆαž›αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž“αž·αž„αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αžΉαž„αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž“αŸ…αž›αžΎ Waves blockchain αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‚αžŽαž“αžΈαžŠαŸαž‰αžαŸ’αž›αŸƒαžαžΆαž˜αžšαž™αŸˆ DataTransaction αŸ”

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž”αŸ’αž›αž»αž€αŸ– αž—αžΆαž–αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αŸ’αž›αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„ Waves blockchain αž‚αžΊαž”αŸ’αžšαž αŸ‚αž›αžŸαŸ’αž˜αžΎαž“αžΉαž„ 60 αžœαž·αž“αžΆαž‘αžΈαŸ”

1. αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžαž˜αŸ’αž›αŸƒαž€αžΎαž“αž‘αžΎαž„αž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ

αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ αžŠαŸαž‰αžαŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αž‚αŸ’αž“αžΆαŸ” αž€αžΆαžšαž—αŸ’αž“αžΆαž›αŸ‹αžαŸ’αž˜αžΈαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαžαŸ‚αž›αžΎαžŸαž–αžΈαž€αžΆαžšαž—αŸ’αž“αžΆαž›αŸ‹αž˜αž»αž“αŸ” αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αž’αŸ’αž“αž€αžŠαŸαž‰αžαŸ’αž›αŸƒαž›αžΎαžŸαž–αžΈαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αžŠαŸαž‰αžαŸ’αž›αŸƒαžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αžαžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αžαž›αŸ‹αž…αŸ†αž“αž½αž“αž‘αžΉαž€αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ”

αžœαžΆαž€αŸαž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸαž‰αžαŸ’αž›αŸƒαž•αž„αžŠαŸ‚αžš αžŠαŸ‚αž›αž’αŸ’αž“αž€αž›αž€αŸ‹αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž’αž”αŸ’αž”αž”αžšαž˜αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΌαžαž·αŸ αž αžΎαž™αžαž˜αŸ’αž›αŸƒαž…αž»αž„αž€αŸ’αžšαŸ„αž™αžαŸ’αžšαžΌαžœαžαŸ‚αž›αžΎαžŸαž–αžΈαžœαžΆαŸ” αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αžŠαžΈαž‘αžΌαžαž·αŸαž“αŸ…αžαŸ‚αž˜αž·αž“αž›αž€αŸ‹αŸ”

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αž™αžΎαž„αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‚αžŽαž“αžΈαžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαŸ” αžšαž™αŸˆαž–αŸαž›αž“αŸƒαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž‚αžΊ 3000 αž”αŸ’αž›αž»αž€ αž αžΎαž™αžαž˜αŸ’αž›αŸƒαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαž‘αžΌαžαž·αŸαž‚αžΊ 0,001 WAVES αŸ” αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž’αžΆαž…αžŠαžΆαž€αŸ‹αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžŠαŸ„αž™αž•αŸ’αž‰αžΎ DataTransaction αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‚αž“αŸ’αž›αžΉαŸ‡ "αžαž˜αŸ’αž›αŸƒ" αž“αž·αž„αžαž˜αŸ’αž›αŸƒαž“αŸƒαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ”

αžαž˜αŸ’αž›αŸƒαž“αŸƒαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αžαž˜αŸ’αž›αŸƒαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž“αŸ’αž›αžΉαŸ‡αž“αŸαŸ‡ αž αžΎαž™αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ [new_bid + commission] tokens αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αŸ” αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸαž‰αžαŸ’αž›αŸƒαžαŸ’αžšαžΌαžœαžαŸ‚αž€αžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› "αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎ" αž“αŸ…αž€αŸ’αž“αž»αž„ DataTransaction αž αžΎαž™αž€αž˜αŸ’αž–αžŸαŸ‹αž”αŸ’αž›αž»αž€αžŠαŸαž‰αžαŸ’αž›αŸƒαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαžαŸ‚αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžŠαŸαž‰αžαŸ’αž›αŸƒαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒ αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αž αž‚αžΆαžαŸ‹αž’αžΆαž…αž•αŸ’αž‰αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αŸ’αžαžΌαžšαž”αŸ’αžšαžΆαž€αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΌαž‘αžΆαžαŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž“αž·αž„αž‚αžΌαžšαžΌαž”αž·αž™αž”αŸαžŽαŸ’αžŽαŸ”

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000
 
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ адрСс отправитСля
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
match tx {
case d : DataTransaction =>
  #провСряСм, Π·Π°Π΄Π°Π½Π° Π»ΠΈ Π² стСйтС Ρ†Π΅Π½Π°
  let currentPrice = if isDefined(getInteger(this, "price"))
 
                      #ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Ρ†Π΅Π½Ρƒ ΠΈΠ· стСйта
                      then extract(getInteger(this, "price"))
                      else startPrice
 
  #ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Ρ†Π΅Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
  let newPrice = extract(getInteger(d.data, "price"))
  let priceIsBigger = newPrice > currentPrice
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΄Π²Π° поля ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ совпадаСт с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
  let correctFields = size(d.data) == 2 &&      
      d.sender == addressFromString(extract(getString(d.data,"sender")))
  startHeight <= height && height <= finishHeight && priceIsBigger && hasMoney && correctFields
case e : ExchangeTransaction =>
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender"))) #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π»ΠΎΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ Π΅Π³ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
 
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

2. αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž αžΌαž‘αž„αŸ‹αž“αŸƒαž€αžΆαžšαžαž™αž…αž»αŸ‡αžαž˜αŸ’αž›αŸƒ

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž αžΌαž‘αž„αŸ‹ αž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αžŠαŸ†αž”αžΌαž„αž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž‘αž·αž‰αžŸαž»αžαž…αž·αžαŸ’αžαž”αž„αŸ‹αŸ” αžαž˜αŸ’αž›αŸƒαžαž™αž…αž»αŸ‡αž‡αžΆαž›αŸ†αžŠαžΆαž”αŸ‹ αžšαž αžΌαžαžŠαž›αŸ‹αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž˜αŸ’αž“αžΆαž€αŸ‹αž™αž›αŸ‹αž–αŸ’αžšαž˜αž‘αž·αž‰αžŠαžΈαž‘αžΌαžαž·αŸαž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”

αž€αŸ’αž“αž»αž„β€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž“αŸαŸ‡ αž™αžΎαž„β€‹αž”αŸ’αžšαžΎβ€‹αžαŸαžšβ€‹αžŠαžΌαž…β€‹αž€αŸ’αž“αž»αž„β€‹αž›αŸαžβ€‹αž˜αž»αž“ αž–αŸ’αžšαž˜β€‹αž‘αžΆαŸ†αž„β€‹αž‡αŸ†αž αžΆαž“β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž“αŸ…β€‹αž–αŸαž› delta αžαž™β€‹αž…αž»αŸ‡αŸ” αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‚αžŽαž“αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž–αž·αžαž‡αžΆαž‡αžΆαž’αŸ’αž“αž€αž—αŸ’αž“αžΆαž›αŸ‹αžŠαŸ†αž”αžΌαž„αž¬αž’αžαŸ‹αŸ” αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸ DataTransaction αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž™αž€αžŠαŸ„αž™ blockchain αž‘αŸαŸ”

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000000
let delta = 100
 
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ адрСс отправитСля
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
case d : DataTransaction =>
  let currentPrice = startPrice - delta * (height - startHeight)
 
  #ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅ΠΉ Π΄Π°Ρ‚Π°-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ "price"
  let newPrice = extract(getInteger(d.data, "price"))
 
  #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π² стСйтС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π½Π΅ содСрТится поля "sender"
  let noBetsBefore = !isDefined(getInteger(this, "sender"))
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° поля
  let correctFields = size(d.data) == 2 && newPrice == currentPrice && d.sender == addressFromString(extract(getString(d.data, "sender")))
  startHeight <= height && height <= finishHeight && noBetsBefore && hasMoney && correctFields
case e : ExchangeTransaction =>
 
  #убСТдаСмся, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Π½ Π² стСйтС Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ sender
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender")))
 
  #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π°mount ассСта ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΈ Ρ‡Ρ‚ΠΎ прайс-ассСт - waves
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

3. αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒ "αž”αž„αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹"

β€œαž€αžΆαžšαž”αž„αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€ αž‚αžΊαž‡αžΆαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αž„αŸ‹αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒ αžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαžαžΆαž’αŸ’αž“αž€αžŽαžΆαžˆαŸ’αž“αŸ‡αž†αŸ’αž“αŸ„αžαž“αŸ„αŸ‡αž‘αŸαŸ” αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžαŸ’αž˜αžΈαž˜αŸ’αž“αžΆαž€αŸ‹αŸ—αž”αž„αŸ‹αžαŸ’αž›αŸƒαžŠαŸαž‰αžαŸ’αž›αŸƒ αž αžΎαž™αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž’αžαž·αž”αžšαž˜αžΆαžˆαŸ’αž“αŸ‡αž…αŸ’αžšαžΎαž“αŸ”

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αžŠαŸαž‰αžαŸ’αž›αŸƒαž“αžΈαž˜αž½αž™αŸ—αžŠαžΆαž€αŸ‹αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžαžΆαž˜αžšαž™αŸˆ DataTransaction αž‡αžΆαž˜αž½αž™ (αž‚αž“αŸ’αž›αžΉαŸ‡ αžαž˜αŸ’αž›αŸƒ)* = ("αž’αŸ’αž“αž€αžˆαŸ’αž“αŸ‡" αž’αžΆαžŸαŸαž™αžŠαŸ’αž‹αžΆαž“)("αžαž˜αŸ’αž›αŸƒ" αžαž˜αŸ’αž›αŸƒ)αŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αž˜αŸαžαž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž αžαŸ’αžαž›αŸαžαžΆαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αžšαž½αž…αž αžΎαž™ αž αžΎαž™αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž‚αžΊαžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž˜αž»αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž€αžΆαžšαžŠαŸαž‰αžαŸ’αž›αŸƒαž”αž“αŸ’αžαžšαž αžΌαžαžŠαž›αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž–αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžˆαžΆαž“αžŠαž›αŸ‹αŸ”

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

αž€αžΆαžšαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„ / Crowdfunding

αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž’αŸ†αž–αžΈαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αž½αž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αžΆαž“αžΆαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž€αžΆαžšαžαžΆαžαž”αž„αŸ‹αž•αŸ’αž“αŸ‚αž€αž αž·αžšαž‰αŸ’αž‰αžœαžαŸ’αžαž»αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž„αŸ‹αž”αžΆαž“αž€αžΆαžšαž’αžΆαž“αžΆαžαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž’αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡ αž‚αžΆαžαŸ‹αž“αžΉαž„αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž˜αž€αžœαž·αž‰αž“αžΌαžœαž…αŸ†αž“αž½αž“αž‘αžΉαž€αž”αŸ’αžšαžΆαž€αŸ‹αž–αŸαž‰αž›αŸαž‰αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαžΌαžαžΉαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž αžΎαž™αžŸαž»αžαž…αž·αžαŸ’αžαž”αž„αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αž€αŸ’αž“αž»αž„αž…αŸ†αž“αž½αž“αž‘αžΉαž€αž”αŸ’αžšαžΆαž€αŸ‹αžŸαž˜αžšαž˜αŸ’αž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαžœαžΆ "αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„" αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž…αŸαž‰αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž€αžΆαž“αŸ‹αž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™ αžŠαŸ„αž™αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Exchange αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αžŠαŸ‚αž›αž”αŸ†αž–αŸαž‰αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž‘αŸ’αžœαŸαžŠαž„ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αž‰αžΎ DataTransaction αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž€αžΆαž“αŸ‹αž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™αž‡αžΆαž˜αž»αž“αž‡αžΆαž˜αž½αž™ (key, value) = (purchaseTransactionId, sellOrderId) αž“αž·αž„αž αžΆαž˜αžƒαžΆαžαŸ‹αž€αžΆαžšαž•αŸ’αž‰αžΎ DataTransactions αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ„αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαžšαž½αž…αž αžΎαž™αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž—αžŸαŸ’αžαž»αžαžΆαž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαž€αžΆαžšαž‘αž·αž‰αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αŸ” αž‚αžΌαžšαžΌαž”αž·αž™αž”αŸαžŽαŸ’αžŽαžαŸ’αžšαžΌαžœαžαŸ‚αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αž·αž‰αŸ” αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž€αŸαžαŸ’αžšαžΌαžœαžαŸ‚αžŸαŸ’αž˜αžΎαž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž–αŸαž›αž‘αž·αž‰ αžŠαž€αžαž˜αŸ’αž›αŸƒαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αŸ”

αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž›αŸ‹αžαžΆαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž‚αžŽαž“αžΈαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αž‘αž·αž‰αžαžΌαžαžΉαž“αž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαž˜αž·αž“αž‘αžΆαž”αž‡αžΆαž„αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž‚αžΆαžαŸ‹αž”αžΆαž“αž‘αž·αž‰αŸ– αž‚αžŽαž“αžΈαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αž”αž„αŸ’αž€αžΎαž ExchangeTransaction αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰ (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ) αž‚αžŽαž“αžΈαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αž‘αžΈαž–αžΈαžš αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž› αž αžΎαž™αž•αŸ’αž‰αžΎαžœαžΆαž‘αŸ… blockchain αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž‘αž·αž‰αž€αžΎαžαž‘αžΎαž„αž‘αŸ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž ExchangeTransaction αžŠαŸ„αž™αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž…αŸ’αž”αžΆαž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” αž αžΎαž™αž•αŸ’αž‰αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αŸ…αž€αžΆαž“αŸ‹ blockchain αŸ” αžœαž·αž’αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αžΆαž…αžαŸ’αžšαž‘αž”αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž›αžΎαž€αžΆαžšαž‘αž·αž‰αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αŸ”

let insuranceToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ адрСс отправитСля
let this = extract(tx.sender)
let freezePeriod = 150000
let insurancePrice = 10000
match tx {
 
 #убСТдаСмся, Ρ‡Ρ‚ΠΎ, Ссли поступила Π΄Π°Ρ‚Π°-транзакция, Ρ‚ΠΎ Ρƒ Π½Π΅Π΅ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ ΠΈ Π² стСйтС Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : ExchangeTransaction =>
 
   #Ссли Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ сСдьмого ΠΏΡ€ΡƒΡ„Π°, провСряСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ подписи
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
     #Ссли Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ сСдьмой ΠΏΡ€ΡƒΡ„, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ ΡƒΠ·Π½Π°Ρ‘ΠΌ Π΅Ρ‘ высоту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈΠ· ΠΏΡ€ΡƒΡ„Π°
     match purchaseTx {
       case purchase : ExchangeTransaction =>
         let correctSender = purchase.sender == e.sellOrder.sender
         let correctAssetPair = e.sellOrder.assetPair.amountAsset == insuranceToken &&
                                purchase.sellOrder.assetPair.amountAsset == insuranceToken &&
                                e.sellOrder.assetPair.priceAsset == purchase.sellOrder.assetPair.priceAsset
         let correctPrice = e.price == purchase.price - insurancePrice && e.amount == purchase.amount
         let correctHeight = height > purchaseTxHeight + freezePeriod
 
         #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ-ΠΏΡ€ΡƒΡ„Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π²Π΅Ρ€Π½Ρ‹ΠΉ ID Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.sellOrder.id
         correctSender && correctAssetPair && correctPrice && correctHeight && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

αž§αž‘αžΆαž αžšαžŽαŸ αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜αžŠαŸαž†αŸ’αž›αžΆαžαžœαŸƒ αžŠαžΎαž˜αŸ’αž”αžΈαž αžΆαž˜αžƒαžΆαžαŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αŸ…αž±αŸ’αž™αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαŸ”

αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž€αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžŠαž»αŸ†αžšαžΌαž”αžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž‚αž›αŸ‹αž‡αžΌαž“αž˜αŸ’αž…αžΆαžŸαŸ‹αžœαž·αž‰ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αŸ†αž“αž½αž“αž‘αžΉαž€αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αŸ”

αž–αž“αŸ’αž’αž›αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš

αž€αž·αž…αŸ’αž…αžŸαž“αŸ’αž™αžΆαž†αŸ’αž›αžΆαžαžœαŸƒαž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž•αž„αžŠαŸ‚αžšαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž˜αžΌαž›αž–αž“αŸ’αž’αž›αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαž—αŸαž‘αž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžαžΆαž˜αžšαž™αŸˆαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžαŸ’αž˜αžΈαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž€αžΆαžšαž§αž”αžαŸ’αžαž˜αŸ’αž— αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜αž†αŸ’αž›αžΆαžαžœαŸƒαŸ–

1. αž™αžΎαž„αž…αŸαž‰ FeeCoin αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαžαŸαžš: 0,01 WAVES = 0,001 FeeCoin αŸ”

2. αž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž§αž”αžαŸ’αžαž˜αŸ’αž—αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ FeeCoin αž“αž·αž„αž’αžαŸ’αžšαžΆαž”αŸ’αžαžΌαžšαž”αŸ’αžšαžΆαž€αŸ‹αŸ– 0,001 WAVES = 0,001 FeeCoin αŸ”

3. αž€αŸ†αžŽαžαŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜αž†αŸ’αž›αžΆαžαžœαŸƒαŸ–

let feeAssetId = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let taxDivisor = 10
 
match tx {
  case t: TransferTransaction =>
    t.feeAssetId == feeAssetId && t.fee == t.amount / taxDivisor
  case e: ExchangeTransaction | MassTransferTransaction => false
  case _ => true
}

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž•αŸ’αž‘αŸαžšαž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜ N smart αž–αž½αž€αž‚αŸαž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœ FeeCoin αž€αŸ’αž“αž»αž„αž…αŸ†αž“αž½αž“ N/taxDivisor (αžŠαŸ‚αž›αž’αžΆαž…αž‘αž·αž‰αž”αžΆαž“αž–αžΈαž’αŸ’αž“αž€αž“αŸ… 10 *N/taxDivisor WAVES) αž αžΎαž™αž’αŸ’αž“αž€αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αžšαž»αž€αžšαž€αžšαŸ‰αŸ‚ N/taxDivisor WAVES αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž”αŸ’αžšαžΆαž€αŸ‹αž…αŸ†αžŽαŸαž‰αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ (αž–αž“αŸ’αž’) αž“αžΉαž„αž˜αžΆαž“ 9*N / taxDivisor WAVES αŸ”

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž”αž„αŸ‹αž–αž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‘αŸ’αžšαž–αŸ’αž™αžŸαž€αž˜αŸ’αž˜αž†αŸ’αž›αžΆαžαžœαŸƒ αž“αž·αž„ MassTransferTransactionαŸ–

let taxDivisor = 10
 
match tx {
  case t : MassTransferTransaction =>
    let twoTransfers = size(t.transfers) == 2
    let issuerIsRecipient = t.transfers[0].recipient == addressFromString("3MgkTXzD72BTfYpd9UW42wdqTVg8HqnXEfc")
    let taxesPaid = t.transfers[0].amount >= t.transfers[1].amount / taxDivisor
    twoTransfers && issuerIsRecipient && taxesPaid
  case _ => false
}

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Cashback αž“αž·αž„αž—αž€αŸ’αžŠαžΈαž—αžΆαž–

Cashback αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž—αž€αŸ’αžŠαžΈαž—αžΆαž–αžŠαŸ‚αž›αž’αŸ’αž“αž€αž‘αž·αž‰αž‘αž‘αž½αž›αž”αžΆαž“αž˜αž€αžœαž·αž‰αž“αžΌαžœαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž…αŸ†αž“αž½αž“αž‘αžΉαž€αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž›αžΎαž•αž›αž·αžαž•αž› αž¬αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”

αž“αŸ…αž–αŸαž›αž’αž“αž»αžœαžαŸ’αžαž€αžšαžŽαžΈαž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αŸαžŸαŸ’αžαž»αžαžΆαž„αžαžΆαž˜αžœαž·αž’αžΈαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž’αžΆαž“αžΆαžšαŸ‰αžΆαž”αŸ‹αžšαž„αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž‘αŸ’αžœαŸαžŠαž„ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‰αžΎ DataTransaction with (key, value) = (purchaseTransactionId, cashbackTransactionId) αž˜αž»αž“αž–αŸαž›αž‘αž‘αž½αž›αž”αžΆαž“ cashbackαŸ”

αž™αžΎαž„αž€αŸαžαŸ’αžšαžΌαžœαžαŸ‚αž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž αžΆαž˜αžƒαžΆαžαŸ‹αž›αžΎαžŸαŸ„αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎ DataTransaction αŸ” cashbackDivisor - αž―αž€αžαžΆαž”αŸ‚αž„αž…αŸ‚αž€αžŠαŸ„αž™αž…αŸ†αžŽαŸ‚αž€ cashback αŸ” αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αŸ†αžŽαŸ‚αž€ cashback αž‚αžΊ 0.1 αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ cashbackDivisor 1 / 0.1 = 10 αŸ”

let cashbackToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ адрСс отправитСля
let this = extract(tx.sender)
let cashbackDivisor = 10
match tx {
 
 #убСТдаСмся, Ρ‡Ρ‚ΠΎ, Ссли поступила Π΄Π°Ρ‚Π°-транзакция, Ρ‚ΠΎ Ρƒ Π½Π΅Π΅ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ ΠΈ Π² стСйтС Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : TransferTransaction =>
 
   #Ссли Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ сСдьмого ΠΏΡ€ΡƒΡ„Π°, провСряСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ подписи
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
 
     #Ссли Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ сСдьмой ΠΏΡ€ΡƒΡ„, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ ΡƒΠ·Π½Π°Ρ‘ΠΌ Π΅Ρ‘ высоту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈΠ· ΠΏΡ€ΡƒΡ„Π°
     match purchaseTx {
       case purchase : TransferTransaction =>
         let correctSender = purchase.sender == e.sender
         let correctAsset = e.assetId == cashbackToken
         let correctPrice = e.amount == purchase.amount / cashbackDivisor
 
         #убСТдаСмся, Ρ‡Ρ‚ΠΎ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ-ΠΏΡ€ΡƒΡ„Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π²Π΅Ρ€Π½Ρ‹ΠΉ ID Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.id
         correctSender && correctAsset && correctPrice && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αžΆαžαžΌαž˜αž·αž…

αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αžΆαžαžΌαž˜αž·αž€αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αžΆαžαžΌαž˜αž·αž€ αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžœαžΆαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžŽαžΆαž˜αž½αž™αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž˜αŸ’αž“αžΆαž€αŸ‹αž˜αž·αž“αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ„αŸ‡ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž› αž αžΎαž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αž·αž“αž€αžΎαžαž‘αžΎαž„αž‘αŸαŸ”

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
 
let beforeHeight = 100000
 
let secret = base58'BN6RTYGWcwektQfSFzH8raYo9awaLgQ7pLyWLQY4S4F5'
match tx {
  case t: TransferTransaction =>
    let txToBob = t.recipient == Bob && sha256(t.proofs[0]) == secret && 20 + beforeHeight >= height
    let backToAliceAfterHeight = height >= 21 + beforeHeight && t.recipient == Alice
    txToBob || backToAliceAfterHeight
  case _ => false
}

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‚αžŽαž“αžΈαž†αŸ’αž›αžΆαžαžœαŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αž§αž”αž€αžšαžŽαŸαž αž·αžšαž‰αŸ’αž‰αžœαžαŸ’αžαž»αžŠαžΌαž…αž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸ αž’αž“αžΆαž‚αž αž“αž·αž„αžœαž·αž€αŸ’αž€αž™αž”αžαŸ’αžšαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹