เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบต smart Waves: เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบกเบนเบ™เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เป‚เบšเบ™เบฑเบ”

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบต smart Waves: เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบกเบนเบ™เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เป‚เบšเบ™เบฑเบ”

Blockchain เบกเบฑเบเบˆเบฐเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš cryptocurrencies, เปเบ•เปˆเบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบต DLT เปเบกเปˆเบ™เบเบงเป‰เบฒเบ‡เบเบงเปˆเบฒ. เบซเบ™เบถเปˆเบ‡เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเป‚เบ”เบ”เป€เบ”เบฑเปˆเบ™เบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ blockchain เปเบกเปˆเบ™เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบšเปเปˆเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเป„เบงเป‰เบงเบฒเบ‡เปƒเบˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเปˆเบฒเบเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™.

RIDE - เบžเบฒเบชเบฒเบชเปเบฒเบฅเบฑเบšเบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”

Waves เป„เบ”เป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบชเบฒเบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบšเบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ” โ€“ RIDE. เป€เบญเบเบฐเบชเบฒเบ™เบ„เบปเบšเบ–เป‰เบงเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบ•เบฑเป‰เบ‡เบขเบนเปˆ เบ—เบตเปˆเบ™เบตเป‰. เปเบฅเบฐโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰ - เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบซเบปเบงโ€‹เบ‚เปเป‰โ€‹เบ™เบตเป‰โ€‹ เบชเบธเบ” Habr.

เบชเบฑเบ™เบเบฒ RIDE เปเบกเปˆเบ™เบ•เบปเบงเบŠเบตเป‰เบšเบญเบเปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™ "เบ„เบงเบฒเบกเบˆเบดเบ‡" เบซเบผเบท "เบœเบดเบ”" เป€เบ›เบฑเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบˆเบฐเบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™ blockchain เบซเบผเบทเบ–เบทเบเบ›เบฐเบ•เบดเป€เบชเบ”. เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบชเปˆเบงเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰. เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ—เบธเบฅเบฐเบเปเบฒเบˆเบฒเบเบชเบฑเบ™เบเบฒเปƒเบ™ RIDE เปเบกเปˆเบ™เบšเปเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰.

เบกเบทเป‰เบ™เบตเป‰เบกเบตเบชเบญเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบชเบฐเบซเบผเบฒเบ” Waves: เบšเบฑเบ™เบŠเบตเบญเบฑเบ”เบชเบฐเบฅเบดเบเบฐ เปเบฅเบฐเบŠเบฑเบšเบชเบดเบ™เบญเบฑเบ”เบชเบฐเบฅเบดเบเบฐ. เบšเบฑเบ™เบŠเบตเบญเบฑเบ”เบชเบฐเบฅเบดเบเบฐเปเบกเปˆเบ™เบšเบฑเบ™เบŠเบตเบœเบนเป‰เปƒเบŠเป‰เบ›เบปเบเบเบฐเบ•เบด, เปเบ•เปˆเบชเบฐเบ„เบฃเบดเบšเบ–เบทเบเบ•เบฑเป‰เบ‡เปƒเบซเป‰เบกเบฑเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบฑเบ‡เปเบปเบ”. เบชเบฐเบ„เบฃเบดเบšเบšเบฑเบ™เบŠเบตเบญเบฑเบ”เบชเบฐเบฅเบดเบเบฐเบญเบฒเบ”เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰, เบ•เบปเบงเบขเปˆเบฒเบ‡:

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

tx เปเบกเปˆเบ™เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เปเบฒเปƒเบŠเป‰เบเบปเบ™เป„เบเบเบฒเบ™เบˆเบฑเบšเบ„เบนเปˆเบฎเบนเบšเปเบšเบšเบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เป‚เบญเบ™เบเป‰เบฒเบ. เบเบฒเบ™เบˆเบฑเบšเบ„เบนเปˆเบฎเบนเบšเปเบšเบšเปƒเบ™ RIDE เปเบกเปˆเบ™เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบงเบ”เบชเบญเบšเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒ. เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบขเบนเปˆโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบกเบงเบ™โ€‹เบœเบปเบ™โ€‹เปƒเบ™โ€‹เบชเบฐโ€‹เบ„เบฃเบดโ€‹เบšโ€‹เบšเบฑเบ™โ€‹เบŠเบต smartโ€‹ เบ›เบฐเป€เบžเบ”เบ—เบธเบฅเบฐเบเปเบฒ.

เบชเบฐเบ„เบฃเบดเบšเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฐเบเบฒเบ”เบ•เบปเบงเปเบ›เป„เบ”เป‰, เปƒเบŠเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ "เบ–เป‰เบฒเปเบฅเป‰เบง-เบญเบทเปˆเบ™" เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป†เป€เบžเบทเปˆเบญเบเบงเบ”เบชเบญเบšเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™. เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบชเบฑเบ™เบเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบกเบšเบนเบ™เบ—เบตเปˆเบžเบดเบชเบนเบ”เป„เบ”เป‰ เปเบฅเบฐเบŠเบฑเบšเบŠเป‰เบญเบ™ (เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบ) เบ—เบตเปˆเบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบ„เบฒเบ”เบ„เบฐเป€เบ™เบเปˆเบญเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฑเบ™เบเบฒเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, RIDE เบšเปเปˆเบกเบตเบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบเบฒเบ™ loops เบซเบผเบท jumped.

เบฅเบฑเบเบชเบฐเบ™เบฐเบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบšเบฑเบ™เบŠเบต Waves เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡ "เบฅเบฑเบ”", เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบต. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ‚เบฝเบ™โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™ infinite เบ‚เบญเบ‡โ€‹เบ„เบนเปˆ (เบเบฐโ€‹เปเบˆโ€‹, เบกเบนเบ™โ€‹เบ„เปˆเบฒโ€‹) เบเบฑเบšโ€‹เบชเบฐโ€‹เบ–เบฒโ€‹เบ™เบฐโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบเบฒเบ™โ€‹เป‚เบญเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ (DataTransactionโ€‹)โ€‹. เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบธเบ‡เปเบ•เปˆเบ‡เบ—เบฑเบ‡เบœเปˆเบฒเบ™ REST API เปเบฅเบฐเป‚เบ”เบเบเบปเบ‡เปƒเบ™เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”.

เปเบ•เปˆเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเบชเบฒเบกเบฒเบ”เบกเบต array เบ‚เบญเบ‡เบซเบผเบฑเบเบ–เบฒเบ™, เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเป€เบŠเบฑเบ™เบ‚เบญเบ‡เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก, ID เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš RIDE เบœเปˆเบฒเบ™ เบ—เบตเปˆเบ™เบตเป‰ เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบซเบฑเบ™เบกเบธเบกเป€เบšเบดเปˆเบ‡เบ—เบตเปˆเบฅเบงเบšเบฅเบงเบกเบ‚เบญเบ‡เบชเบฑเบ™เบเบฒ (เบ–เป‰เบฒเบกเบฑเบ™เบ–เบทเบเบฅเบงเบšเบฅเบงเบก), เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเปƒเบซเบกเปˆเปเบฅเบฐเบเปเบฒเบ™เบปเบ” scripts เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเบปเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡.

เบชเปเบฒเบฅเบฑเบšเบฎเบญเบšเบงเบฝเบ™เป€เบ•เบฑเบก, เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบต, เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”เปƒเบชเปˆเบกเบฑเบ™เปเบฅเบฐเบเบฒเบ™เบชเบปเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒ, เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบเบฑเบš REST API (เบ•เบปเบงเบขเปˆเบฒเบ‡: C#, C, Java, JavaScript, Python, Rust, Elixir) . เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš IDE, เบžเบฝเบ‡เปเบ•เปˆเบเบปเบ”เบ›เบธเปˆเบก NEW.

เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”เปเบกเปˆเบ™เบเบงเป‰เบฒเบ‡: เบˆเบฒเบเบเบฒเบ™เบซเป‰เบฒเบกเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™ ("เบšเบฑเบ™เบŠเบตเบ”เปเบฒ") เป„เบ›เบซเบฒ dApps เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”เปƒเบ™เบ—เบธเบฅเบฐเบเบดเบ”: เป€เบกเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ›เบฐเบกเบนเบ™, เบเบฒเบ™เบ›เบฐเบเบฑเบ™เป„เบž, เปเบฅเบฐเบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบชเบฑเบ”เบŠเบทเปˆ.

เบเบฒเบ™เบ›เบฐเบกเบนเบ™

เบซเบ™เบถเปˆเบ‡เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบนเบ™เบ—เบตเปˆเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เปเบกเปˆเบ™เบ„เบงเบฒเบกเป‚เบ›เปˆเบ‡เปƒเบช: เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ•เป‰เบญเบ‡เบซเบกเบฑเป‰เบ™เปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบ›เบฐเบกเบนเบ™. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เบเป‰เบญเบ™ blockchain, เบšเปˆเบญเบ™เบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบ”เบตเบกเบžเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เบˆเบฐเบกเบตเปƒเบซเป‰เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบฑเบ‡เบซเบกเบปเบ”.

เปƒเบ™ Waves blockchain, เบเบฒเบ™เบ›เบฐเบกเบนเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบšเบฑเบ™เบŠเบตเบเบฒเบ™เบ›เบฐเบกเบนเบ™เบœเปˆเบฒเบ™ DataTransaction.

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเป€เบงเบฅเบฒเบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบกเบนเบ™เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบเบ•เบฑเบ™: เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ•เบฑเบ™เปƒเบ™ Waves blockchain เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš. 60 เบงเบดเบ™เบฒเบ—เบต.

1. English ascending price auction

เบœเบนเป‰โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบกเบนเบ™โ€‹เบ‚เบญเบ‡โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบญเบฑเบ‡โ€‹เบเบดเบ”โ€‹เบชเบฐโ€‹เบ–เบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ›เบฐโ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เปเบ‚เปˆเบ‡โ€‹เบ‚เบฑเบ™โ€‹เบเบฑเบ™โ€‹. เปเบ•เปˆเบฅเบฐเบเบฒเบ™เป€เบ”เบตเบกเบžเบฑเบ™เปƒเบซเบกเปˆเบ•เป‰เบญเบ‡เป€เบเบตเบ™เบญเบฑเบ™เบ—เบตเปˆเปเบฅเป‰เบง. เบเบฒเบ™เบ›เบฐเบกเบนเบ™เบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เป€เบกเบทเปˆเบญเบšเปเปˆเบกเบตเบœเบนเป‰เบ›เบฐเบกเบนเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบกเบนเบ™เบ„เบฑเป‰เบ‡เบชเบธเบ”เบ—เป‰เบฒเบ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบœเบนเป‰เบ›เบฐเบกเบนเบ™เบชเบนเบ‡เบชเบธเบ”เบ•เป‰เบญเบ‡เปƒเบซเป‰เบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰.

เบ™เบญเบเบ™เบฑเป‰เบ™เบเบฑเบ‡เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบเบฒเบ™เบ›เบฐเบกเบนเบ™เบ—เบตเปˆเบœเบนเป‰เบ‚เบฒเบเบเปเบฒเบ™เบปเบ”เบฅเบฒเบ„เบฒเบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบš lots, เปเบฅเบฐเบฅเบฒเบ„เบฒเบชเบธเบ”เบ—เป‰เบฒเบเบ•เป‰เบญเบ‡เป€เบเบตเบ™เบกเบฑเบ™. เบ–เป‰เบฒโ€‹เบšเปเปˆโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™โ€‹, lots เบเบฑเบ‡โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ‚เบฒเบโ€‹.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบšเบฑเบ™เบŠเบตเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบนเบ™. เป„เบฅเบเบฐเป€เบงเบฅเบฒเบเบฒเบ™เบ›เบฐเบกเบนเบ™เปเบกเปˆเบ™ 3000 เบ•เบฑเบ™, เปเบฅเบฐเบฅเบฒเบ„เบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡ lots เปเบกเปˆเบ™ 0,001 WAVES. เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบชเบฒเบกเบฒเบ”เบงเบฒเบ‡เบเบฒเบ™เบชเบฐเป€เบซเบ™เบตเบฅเบฒเบ„เบฒเป‚เบ”เบเบเบฒเบ™เบชเบปเปˆเบ‡ DataTransaction เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ” "เบฅเบฒเบ„เบฒ" เปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเป€เบซเบ™เบตเบฅเบฒเบ„เบฒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ.

เบฅเบฒเบ„เบฒเบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเป€เบซเบ™เบตเบฅเบฒเบ„เบฒเปƒเบซเบกเปˆเบ•เป‰เบญเบ‡เบชเบนเบ‡เบเบงเปˆเบฒเบฅเบฒเบ„เบฒเบ›เบฐเบˆเบธเบšเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฐเปเบˆเบ™เบตเป‰, เปเบฅเบฐเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ•เป‰เบญเบ‡เบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ [new_bid + commission] tokens เปƒเบ™เบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบฅเบฒเบง. เบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เบœเบนเป‰เบ›เบฐเบกเบนเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบŠเปˆเบญเบ‡ "เบœเบนเป‰เบชเบปเปˆเบ‡" เปƒเบ™ DataTransaction, เปเบฅเบฐเบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเป€เบซเบ™เบตเบฅเบฒเบ„เบฒเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ•เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบเบฒเบ™เบ›เบฐเบกเบนเบ™.

เบ–เป‰เบฒเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบกเบนเบ™เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบฅเบฒเบ„เบฒเบ—เบตเปˆเบชเบนเบ‡เบ—เบตเปˆเบชเบธเบ”, เบฅเบฒเบงเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡ ExchangeTransaction เป€เบžเบทเปˆเบญเบˆเปˆเบฒเบเบ„เปˆเบฒ lots เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เปƒเบ™เบฅเบฒเบ„เบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เปเบฅเบฐเบ„เบนเปˆเบชเบฐเบเบธเบ™เป€เบ‡เบดเบ™.

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 เบ”เป‰เบงเบ (key, value)* = ("เบœเบนเป‰เบŠเบฐเบ™เบฐ", เบ—เบตเปˆเบขเบนเปˆ), ("เบฅเบฒเบ„เบฒ", เบฅเบฒเบ„เบฒ). 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)
}

เบเบฒเบ™เบ›เบฐเบเบฑเบ™เป„เบž / Crowdfunding

เปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบŠเบฑเบšเบชเบดเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบเบฒเบ™เป€เบ‡เบดเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ„เปเป‰เบฒเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบ–เป‰เบฒ token depreciates, เบฅเบฒเบงเบˆเบฐเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบ„เบทเบ™เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบกเบ—เบตเปˆเบˆเปˆเบฒเบเบชเปเบฒเบฅเบฑเบš tokens เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เปเบฅเบฐเป€เบ•เบฑเบกเปƒเบˆเบ—เบตเปˆเบˆเบฐเบˆเปˆเบฒเบเบ„เปˆเบฒเบ›เบฐเบเบฑเบ™เป„เบžเบ—เบตเปˆเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™.

เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™, "เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเบเบฒเบ™เบ›เบฐเบเบฑเบ™เป„เบž" เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบญเบญเบ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, script เบˆเบฐเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบœเบนเป‰เบ–เบทเบ™เบฐเป‚เบเบšเบฒเบ, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆ ExchangeTransactions เบ—เบตเปˆเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™.

เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เปƒเบŠเป‰เบˆเปˆเบฒเบเบชเบญเบ‡เป€เบ—เบปเปˆเบฒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เบชเบปเปˆเบ‡ DataTransaction เบเบฑเบšเบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบœเบนเป‰เบ–เบทเบ™เบฐเป‚เบเบšเบฒเบเบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเบ”เป‰เบงเบ (key, value) = (purchaseTransactionId, sellOrderId) เปเบฅเบฐเบซเป‰เบฒเบกเบชเบปเปˆเบ‡ DataTransactions เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเปƒเบŠเป‰เปเบฅเป‰เบง.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบซเบผเบฑเบเบ–เบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เบกเบต ID เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ‚เบญเบ‡เบเบฒเบ™เบŠเบทเป‰เป€เบ„เบทเปˆเบญเบ‡เบ›เบฐเบเบฑเบ™เป„เบž. เบ„เบนเปˆเบชเบฐเบเบธเบ™เป€เบ‡เบดเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ„เบทเบเบฑเบ™เบเบฑเบšเปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒเบเบฒเบ™เบŠเบทเป‰. เบ„เปˆเบฒโ€‹เปƒเบŠเป‰โ€‹เบˆเปˆเบฒเบโ€‹เบเบฑเบ‡โ€‹เบ•เป‰เบญเบ‡โ€‹เป€เบ—เบปเปˆเบฒโ€‹เบเบฑเบšโ€‹เบ—เบตเปˆโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบŠเบทเป‰โ€‹, เบฅเบปเบšโ€‹เบฅเบฒโ€‹เบ„เบฒโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบเบฑเบ™โ€‹เป„เบžโ€‹.

เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ•เปเปˆเบกเบฒเบšเบฑเบ™เบŠเบตเบ›เบฐเบเบฑเบ™เป„เบžเบŠเบทเป‰ tokens เบ›เบฐเบเบฑเบ™เป„เบžเบˆเบฒเบเบœเบนเป‰เปƒเบŠเป‰เปƒเบ™เบฅเบฒเบ„เบฒเบšเปเปˆเบ•เปˆเปเบฒเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเป€เบ‚เบปเบฒเบŠเบทเป‰เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ: เบšเบฑเบ™เบŠเบตเบ›เบฐเบเบฑเบ™เป„เบžเบชเป‰เบฒเบ‡ ExchangeTransaction, เบœเบนเป‰เปƒเบŠเป‰เป€เบŠเบฑเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ (เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบชเปเบฒเป€เบฅเบฑเบ”เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡), เป„เบ”เป‰. เบšเบฑเบ™เบŠเบตเบ›เบฐเบเบฑเบ™เป„เบžเป€เบŠเบฑเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเบชเบญเบ‡เปเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™เป„เบ› blockchain .

เบ–เป‰เบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบŠเบทเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡ ExchangeTransaction เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบชเบฐเบ„เบดเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบเบฑเบš blockchain. เบงเบดเบ—เบตเบ™เบตเป‰เบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ„เบทเบ™เป€เบ‡เบดเบ™เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบŠเบทเป‰ tokens เบ›เบฐเบเบฑเบ™เป„เบž.

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)
}

เป‚เบ—เป€เบ„เบฑเบ™เบ›เบฐเบเบฑเบ™เป„เบžเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป€เบ›เบฑเบ™เบŠเบฑเบšเบชเบดเบ™เบ—เบตเปˆเบชเบฐเบซเบผเบฒเบ”, เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเบซเป‰เบฒเบกเบเบฒเบ™เป‚เบญเบ™เป€เบ‡เบดเบ™เบ‚เบญเบ‡เบ•เบปเบ™เปƒเบซเป‰เบเบฑเบšเบšเบธเบเบ„เบปเบ™เบ—เบตเบชเบฒเบก.

เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบฐเบ”เบปเบกเบ—เบถเบ™ tokens, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบซเป‰เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เป‰เบฒเบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เป€เบเบฑเบšเบเปเบฒ.

เบžเบฒเบชเบตเบ—เบธเบฅเบฐเบเปเบฒ

เบชเบฑเบ™เบเบฒเบชเบฐเบซเบกเบฒเบ”เปเบกเปˆเบ™เบเบฑเบ‡เปƒเบŠเป‰เป„เบ”เป‰เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบžเบฒเบชเบตเปƒเบ™เปเบ•เปˆเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบกเบตเบŠเบฑเบšเบชเบดเบ™เบซเบผเบฒเบเบ›เบฐเป€เบžเบ”. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™เบŠเบฑเบšเบชเบดเบ™เปƒเบซเบกเปˆเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ เบเบฒเบ™เบชเบฐเปœเบฑเบšเบชเบฐเปœเบธเบ™ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบเบฑเบšเบŠเบฑเบšเบชเบดเบ™เบญเบฑเบ”เบชเบฐเบฅเบดเบเบฐ:

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 เปเบกเปˆเบ™เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบชเบฑเบ”เบŠเบทเปˆเบ—เบตเปˆเบœเบนเป‰เบŠเบทเป‰เป„เบ”เป‰เบฎเบฑเบšเบ„เบทเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เป€เบ‡เบดเบ™เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบซเบผเบทเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™.

เป€เบกเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰เบšเบฑเบ™เบŠเบต smart, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบซเบผเบฑเบเบ–เบฒเบ™เบชเบฐเปเบ”เบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเปเบฅเบฐเบ™เบตเบ›เบฐเบเบฑเบ™เป„เบž. เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เปƒเบŠเป‰เบˆเปˆเบฒเบเบชเบญเบ‡เป€เบ—เบปเปˆเบฒ, เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เบชเบปเปˆเบ‡ DataTransaction เบเบฑเบš (key, value) = (purchaseTransactionId, cashbackTransactionId) เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเป€เบ‡เบดเบ™เบ„เบทเบ™.

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบซเป‰เบฒเบกเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเป‚เบ”เบเปƒเบŠเป‰ DataTransaction. cashbackDivisor - เบซเบปเบงเปœเปˆเบงเบเปเบšเปˆเบ‡เบญเบญเบเป‚เบ”เบเบชเปˆเบงเบ™เปเบšเปˆเบ‡เป€เบ‡เบดเบ™เบ„เบทเบ™. เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เบ–เป‰เบฒเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™ 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
}

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบšเบฑเบ™เบŠเบต smart เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบเบฒเบ™เป€เบ‡เบดเบ™เป€เบŠเบฑเปˆเบ™: เบ—เบฒเบ‡เป€เบฅเบทเบญเบ, เบญเบฐเบ™เบฒเบ„เบปเบ”เปเบฅเบฐเปƒเบšเบšเบดเบ™เบ„เปˆเบฒ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™