เชตเซ‡เชตเซเช เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸเซเชธเชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ: เชนเชฐเชพเชœเซ€เชฅเซ€ เชฌเซ‹เชจเชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชธเซเชงเซ€

เชตเซ‡เชตเซเช เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸเซเชธเชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ: เชนเชฐเชพเชœเซ€เชฅเซ€ เชฌเซ‹เชจเชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชธเซเชงเซ€

เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เช˜เชฃเซ€เชตเชพเชฐ เชซเช•เซเชค เช•เซเชฐเชฟเชชเซเชŸเซ‹เช•เชฐเชจเซเชธเซ€ เชธเชพเชฅเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒเซเช‚ เชนเซ‹เชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชกเซ€เชเชฒเชŸเซ€ เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€เชจเชพ เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เซเชทเซ‡เชคเซเชฐเซ‹ เชตเชงเซ เชตเซเชฏเชพเชชเช• เช›เซ‡. เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชจเชพ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡เชจเชพ เชธเซŒเชฅเซ€ เช†เชถเชพเชธเซเชชเชฆ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชฎเชพเช‚เชจเซเช‚ เชเช• เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช›เซ‡ เชœเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถเซ‡เชฒเชพ เชชเช•เซเชทเช•เชพเชฐเซ‹ เชตเชšเซเชšเซ‡ เชตเชฟเชถเซเชตเชพเชธเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชฐเชพเช‡เชก โ€“ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชฎเชพเชŸเซ‡เชจเซ€ เชญเชพเชทเชพ

เชตเซ‡เชตเซเชเซ‡ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชฎเชพเชŸเซ‡ เชเช• เช–เชพเชธ เชญเชพเชทเชพ เชตเชฟเช•เชธเชพเชตเซ€ เช›เซ‡ - RIDE. เชคเซ‡เชจเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹ เชธเซเชฅเชฟเชค เช›เซ‡ เช…เชนเซ€เช‚. เช…เชจเซ‡ เช…เชนเซ€เช‚ - เช† เชตเชฟเชทเชฏ เชชเชฐ เชฒเซ‡เช– Habr เชชเชฐ.

RIDE เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช เชชเซเชฐเชฟเชกเชฟเช•เซ‡เชŸ เช›เซ‡ เช…เชจเซ‡ เช†เช‰เชŸเชชเซเชŸ เชคเชฐเซ€เช•เซ‡ "เชธเชพเชšเซเช‚" เช…เชฅเชตเชพ "เช–เซ‹เชŸเซเช‚" เช†เชชเซ‡ เช›เซ‡. เชคเชฆเชจเซเชธเชพเชฐ, เชตเซเชฏเชตเชนเชพเชฐ เช•เชพเช‚ เชคเซ‹ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เชจเช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เชšเซ‹เช•เซเช•เชธ เชถเชฐเชคเซ‹เชจเซ€ เชชเชฐเชฟเชชเซ‚เชฐเซเชฃเชคเชพเชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฌเชพเช‚เชฏเชงเชฐเซ€ เช†เชชเซ‡ เช›เซ‡. RIDE เชฎเชพเช‚ เช•เชฐเชพเชฐเชฎเชพเช‚เชฅเซ€ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เชนเชพเชฒเชฎเชพเช‚ เชถเช•เซเชฏ เชจเชฅเซ€.

เช†เชœเซ‡ เชฌเซ‡ เชชเซเชฐเช•เชพเชฐเชจเชพ เชตเซ‡เชตเซเช เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช›เซ‡: เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸเซเชธ เช…เชจเซ‡ เชธเซเชฎเชพเชฐเซเชŸ เชเชธเซ‡เชŸ. เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸ เช เชจเชฟเชฏเชฎเชฟเชค เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช–เชพเชคเซเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒเซ€ เช›เซ‡ เชœเซ‡ เชคเชฎเชพเชฎ เชตเซเชฏเชตเชนเชพเชฐเซ‹เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชˆ เชถเช•เซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡:

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

tx เช เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซ‡เชฒ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เช›เซ‡ เชœเซ‡เชจเซ‡ เช…เชฎเซ‡ เชชเซ‡เชŸเชฐเซเชจ เชฎเซ‡เชšเชฟเช‚เช— เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ€เช เช›เซ€เช เชœเซ‹ เชคเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชจ เชนเซ‹เชฏ. RIDE เชฎเชพเช‚ เชชเซ‡เชŸเชฐเซเชจ เชฎเซ‡เชšเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเซเชฏเชตเชนเชพเชฐเชจเชพ เชชเซเชฐเช•เชพเชฐเชจเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชนเชพเชฒเชจเชพ เชคเชฎเชพเชฎ เชเช•เชพเช‰เชจเซเชŸ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชตเซเชฏเชตเชนเชพเชฐเชจเชพ เชชเซเชฐเช•เชพเชฐเซ‹.

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเซ‹เชจเซ‡ เชชเชฃ เชœเชพเชนเซ‡เชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, "เชœเซ‹-เชคเซ‹-เชฌเซ€เชœเซเช‚" เชฐเชšเชจเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชถเชฐเชคเซ‹เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ€เชคเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซเชฏ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช•เซ‹เชจเซเชŸเซเชฐเซ‡เช•เซเชŸเชจเซ€ เช…เชฎเชฒเชตเชพเชฐเซ€ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เช…เชจเซเชฎเชพเชจ เชฒเช—เชพเชตเชตเซเช‚ เชธเชฐเชณ เช›เซ‡ เช•เซ‡ เช•เซ‹เชจเซเชŸเซเชฐเซ‡เช•เซเชŸเชฎเชพเช‚ เชธเชพเชฌเชฟเชค เชฅเชˆ เชถเช•เซ‡ เชคเซ‡เชตเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃเชคเชพ เช…เชจเซ‡ เชœเชŸเชฟเชฒเชคเชพ (เช–เชฐเซเชš) เช›เซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, RIDEเชฎเชพเช‚ เชฒเซ‚เชชเซเชธ เช…เชฅเชตเชพ เชœเชฎเซเชช เชธเซเชŸเซ‡เชŸเชฎเซ‡เชจเซเชŸ เชจเชฅเซ€.

เชตเซ‡เชตเซเช เชเช•เชพเช‰เชจเซเชŸเซเชธเชจเซ€ เช…เชจเซเชฏ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชฎเชพเช‚ "เชธเซเชŸเซ‡เชŸ" เชเชŸเชฒเซ‡ เช•เซ‡ เช–เชพเชคเชพเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชคเชฎเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเซเชธ (เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเช•เชพเช‰เชจเซเชŸ เชธเซเชŸเซ‡เชŸเชฎเชพเช‚ เช…เชจเช‚เชค เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชœเซ‹เชกเซ€ (เช•เซ€, เชฎเซ‚เชฒเซเชฏ) เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹. เช† เชฎเชพเชนเชฟเชคเซ€ เชชเช›เซ€ REST API เชฆเซเชตเชพเชฐเชพ เช…เชจเซ‡ เชธเซ€เชงเชพ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชฎเชพเช‚ เชฌเช‚เชจเซ‡ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชฆเชฐเซ‡เช• เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชชเซเชฐเชพเชตเชพเช“เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชธเชนเชญเชพเช—เซ€เชจเซ€ เชธเชนเซ€, เชœเชฐเซ‚เชฐเซ€ เชตเซเชฏเชตเชนเชพเชฐเชจเซเช‚ ID เชตเช—เซ‡เชฐเซ‡ เชฆเชพเช–เชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชฆเซเชตเชพเชฐเชพ RIDE เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช…เชนเซ€เช‚ เชคเชฎเชจเซ‡ เช•เชฐเชพเชฐเชจเซเช‚ เชธเช‚เช•เชฒเชฟเชค เชฆเซƒเชถเซเชฏ เชœเซ‹เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ (เชœเซ‹ เชคเซ‡ เชธเช‚เช•เชฒเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเซ‹เชฏ), เชจเชตเชพ เชเช•เชพเช‰เชจเซเชŸเซเชธ เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชธเซ‡เชŸ เช•เชฐเซ‹, เชคเซ‡เชฎเชœ เช†เชฆเซ‡เชถ เชตเชพเช•เซเชฏ เชฆเซเชตเชพเชฐเชพ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชฎเซ‹เช•เชฒเซ‹.

เชเช•เชพเช‰เชจเซเชŸ เชฌเชจเชพเชตเชตเชพ, เชคเซ‡เชจเชพ เชชเชฐ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เช…เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชฎเซ‹เช•เชฒเชตเชพ เชธเชนเชฟเชค เชธเช‚เชชเซ‚เชฐเซเชฃ เชšเช•เซเชฐ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ REST API (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, C#, C, Java, JavaScript, Python, Rust, Elixir) เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ‹ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. . IDE เชธเชพเชฅเซ‡ เช•เชพเชฎ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชซเช•เซเชค เชจเชตเซเช‚ เชฌเชŸเชจ เช•เซเชฒเชฟเช• เช•เชฐเซ‹.

เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชถเช•เซเชฏเชคเชพเช“ เชตเชฟเชถเชพเชณ เช›เซ‡: เช…เชฎเซเช• เชธเชฐเชจเชพเชฎเชพเช‚เช“ ("เชฌเซเชฒเซ‡เช• เชฒเชฟเชธเซเชŸ") เชฅเซ€ เชœเชŸเชฟเชฒ dApps เชธเซเชงเซ€เชจเชพ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเช‚เชง เชฎเซ‚เช•เชตเซ‹.

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชตเซเชฏเชตเชธเชพเชฏเชฎเชพเช‚ เชธเซเชฎเชพเชฐเซเชŸ เช•เซ‹เชจเซเชŸเซเชฐเชพเช•เซเชŸเชจเชพ เช‰เชชเชฏเซ‹เช—เชจเชพ เชšเซ‹เช•เซเช•เชธ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชœเซ‹เชˆเช: เชœเซเชฏเชพเชฐเซ‡ เชนเชฐเชพเชœเซ€, เชตเซ€เชฎเซ‹ เช…เชจเซ‡ เชฒเซ‹เชฏเชฒเซเชŸเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡.

เชนเชฐเชพเชœเซ€

เชธเชซเชณ เชนเชฐเชพเชœเซ€ เชฎเชพเชŸเซ‡เชจเซ€ เชถเชฐเชคเซ‹เชฎเชพเช‚เชจเซ€ เชเช• เชชเชพเชฐเชฆเชฐเซเชถเชฟเชคเชพ เช›เซ‡: เชธเชนเชญเชพเช—เซ€เช“เชจเซ‡ เชตเชฟเชถเซเชตเชพเชธ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชฌเชฟเชกเชฎเชพเช‚ เชšเชพเชฒเชพเช•เซ€ เช•เชฐเชตเซ€ เช…เชถเช•เซเชฏ เช›เซ‡. เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชจเซ‡ เช†เชญเชพเชฐเซ€ เช† เชนเชพเช‚เชธเชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซเชฏเชพเช‚ เชคเชฎเชพเชฎ เชฌเซ‡เชŸเซเชธ เช…เชจเซ‡ เชคเซ‡ เช•เชฏเชพ เชธเชฎเชฏเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ เชคเซ‡ เช…เช‚เช—เซ‡เชจเซ‹ เช…เชตเชฟเชšเชฒเชฟเชค เชกเซ‡เชŸเชพ เชฌเชงเชพ เชธเชนเชญเชพเช—เซ€เช“เชจเซ‡ เช‰เชชเชฒเชฌเซเชง เชนเชถเซ‡.

เชตเซ‡เชตเซเช เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ, เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชฌเชฟเชกเชจเซ‡ เช“เช•เซเชถเชจ เชเช•เชพเช‰เชจเซเชŸ เชธเซเชŸเซ‡เชŸเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชคเชฎเซ‡ เชฌเซเชฒเซ‹เช• เชจเช‚เชฌเชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชนเชฐเชพเชœเซ€เชจเซ€ เชถเชฐเซ‚เช†เชค เช…เชจเซ‡ เชธเชฎเชพเชชเซเชคเชฟเชจเซ‹ เชธเชฎเชฏ เชชเชฃ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹: เชตเซ‡เชตเซเชธ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฌเซเชฒเซ‹เช• เชœเชจเชฐเซ‡เชถเชจเชจเซ€ เช†เชตเชฐเซเชคเชจ เชฒเช—เชญเช— เชธเชฎเชพเชจ เช›เซ‡ 60 เชธเซ‡เช•เชจเซเชก

1. เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เชšเชกเชคเซ€ เช•เชฟเช‚เชฎเชคเชจเซ€ เชนเชฐเชพเชœเซ€

เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เชนเชฐเชพเชœเซ€เชฎเชพเช‚ เชธเชนเชญเชพเช—เซ€เช“ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชธเซเชชเชฐเซเชงเชพเชฎเชพเช‚ เชฌเชฟเชก เช•เชฐเซ‡ เช›เซ‡. เชฆเชฐเซ‡เช• เชจเชตเซ€ เชถเชฐเชค เช…เช—เชพเช‰เชจเชพ เชเช• เช•เชฐเชคเชพเช‚ เชตเชงเซ€ เชœเชตเซ€ เชœเซ‹เชˆเช. เชœเซเชฏเชพเชฐเซ‡ เช›เซ‡เชฒเซเชฒเซ€ เชฌเชฟเชก เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฌเชฟเชกเชฐเซเชธ เชจ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชนเชฐเชพเชœเซ€ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชธเซŒเชฅเซ€ เชตเชงเซ เชฌเซ‹เชฒเซ€ เชฒเช—เชพเชตเชจเชพเชฐเช เชœเชฃเชพเชตเซ‡เชฒ เชฐเช•เชฎ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡.

เชเช• เชนเชฐเชพเชœเซ€ เชตเชฟเช•เชฒเซเชช เชชเชฃ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชตเซ‡เชšเชจเชพเชฐ เชฒเซ‹เชŸ เชฎเชพเชŸเซ‡ เชฒเช˜เซเชคเซเชคเชฎ เช•เชฟเช‚เชฎเชค เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เช‚เชคเชฟเชฎ เช•เชฟเช‚เชฎเชค เชคเซ‡เชจเชพเชฅเซ€ เชตเชงเซ€ เชœเชตเซ€ เชœเซ‹เชˆเช. เชจเชนเชฟเช‚เชคเชฐ, เชฒเซ‹เชŸ เชตเซ‡เชšเชพเชฏเชพ เชตเช—เชฐ เชฐเชนเซ‡ เช›เซ‡.

เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เช…เชฎเซ‡ เชนเชฐเชพเชœเซ€ เชฎเชพเชŸเซ‡ เช–เชพเชธ เชฌเชจเชพเชตเซ‡เชฒเชพ เชเช•เชพเช‰เชจเซเชŸ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชนเชฐเชพเชœเซ€เชจเซ€ เช…เชตเชงเชฟ 3000 เชฌเซเชฒเซ‹เช•เซเชธ เช›เซ‡, เช…เชจเซ‡ เชฒเซ‹เชŸเชจเซ€ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เช•เชฟเช‚เชฎเชค 0,001 เชตเซ‡เชตเซเชธ เช›เซ‡. เชธเชนเชญเชพเช—เซ€ เช•เซ€ "เช•เชฟเช‚เชฎเชค" เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชฌเชฟเชกเชจเซ€ เช•เชฟเช‚เชฎเชค เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฎเซ‹เช•เชฒเซ€เชจเซ‡ เชฌเชฟเชก เชฎเซ‚เช•เซ€ เชถเช•เซ‡ เช›เซ‡.

เชจเชตเซ€ เชฌเชฟเชกเชจเซ€ เช•เชฟเช‚เชฎเชค เช† เช•เซ€ เชฎเชพเชŸเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เช•เชฟเช‚เชฎเชค เช•เชฐเชคเชพ เชตเชงเชพเชฐเซ‡ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช เช…เชจเซ‡ เชธเชนเชญเชพเช—เซ€ เชชเชพเชธเซ‡ เชคเซ‡เชจเชพ เช–เชพเชคเชพเชฎเชพเช‚ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ [เชจเชตเซ€_เชฌเชฟเชก + เช•เชฎเชฟเชถเชจ] เชŸเซ‹เช•เชจเซเชธ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เชฌเชฟเชกเชฐเชจเซเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชฎเชพเช‚ "เชชเซเชฐเซ‡เชทเช•" เชซเซ€เชฒเซเชกเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡, เช…เชจเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชฌเชฟเชก เชฌเซเชฒเซ‹เช• เชŠเช‚เชšเชพเชˆ เชนเชฐเชพเชœเซ€เชจเชพ เชธเชฎเชฏเช—เชพเชณเชพเชจเซ€ เช…เช‚เชฆเชฐ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช.

เชœเซ‹ เชนเชฐเชพเชœเซ€เชจเชพ เช…เช‚เชคเซ‡ เชธเชนเชญเชพเช—เซ€เช เชธเซŒเชฅเซ€ เชตเชงเซ เช•เชฟเช‚เชฎเชค เชจเช•เซเช•เซ€ เช•เชฐเซ€ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡ เชšเซ‹เช•เซเช•เชธ เช•เชฟเช‚เชฎเชค เช…เชจเซ‡ เชšเชฒเชฃ เชœเซ‹เชกเซ€ เชชเชฐ เชธเช‚เชฌเช‚เชงเชฟเชค เชฒเซ‹เชŸ เชฎเชพเชŸเซ‡ เชšเซ‚เช•เชตเชฃเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เซเชธเชšเซ‡เชจเซเชœ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‡ เช›เซ‡.

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. เช˜เชŸเชคเซ€ เช•เชฟเช‚เชฎเชคเซ‹เชจเซ€ เชกเชš เชนเชฐเชพเชœเซ€

เชกเชš เชนเชฐเชพเชœเซ€เชฎเชพเช‚, เช–เชฐเซ€เชฆเชจเชพเชฐ เชœเซ‡ เชšเซ‚เช•เชตเชตเชพ เชคเซˆเชฏเชพเชฐ เชนเซ‹เชฏ เชคเซ‡เชจเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ เช•เชฟเช‚เชฎเชคเซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เช˜เชฃเซ‹ เช“เชซเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชธเชนเชญเชพเช—เซ€เช“เชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆ เชเช• เชตเชฐเซเชคเชฎเชพเชจ เชญเชพเชตเซ‡ เชฒเซ‹เชŸ เช–เชฐเซ€เชฆเชตเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชฎเชค เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เช•เชฟเช‚เชฎเชคเชฎเชพเช‚ เชเช•-เชเช• เชชเช—เชฒเซเช‚ เช˜เชŸเชพเชกเซ‹ เชฅเชพเชฏ เช›เซ‡.

เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเชพเชจเชพ เชธเชฎเชพเชจ เชธเซเชฅเชฟเชฐเชพเช‚เช•เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช, เชคเซ‡เชฎเชœ เชœเซเชฏเชพเชฐเซ‡ เชกเซ‡เชฒเซเชŸเชพ เช˜เชŸเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เช•เชฟเช‚เชฎเชคเชจเชพ เชชเช—เชฒเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช. เชเช•เชพเช‰เชจเซเชŸ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชคเชชเชพเชธเซ‡ เช›เซ‡ เช•เซ‡ เชถเซเช‚ เชธเชนเชญเชพเช—เซ€ เช–เชฐเซ‡เช–เชฐ เชถเชฐเชค เชฒเช—เชพเชตเชจเชพเชฐ เชชเซเชฐเชฅเชฎ เช›เซ‡. เชจเชนเชฟเช‚เชคเชฐ, เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชฆเซเชตเชพเชฐเชพ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชธเซเชตเซ€เช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚.

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. เชนเชฐเชพเชœเซ€ "เชฌเชงเชพ เชชเช—เชพเชฐ"

"เช“เชฒ-เชชเซ‡" เช เชเช• เชนเชฐเชพเชœเซ€ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชฌเชงเชพ เชธเชนเชญเชพเช—เซ€เช“ เชฌเชฟเชก เชšเซ‚เช•เชตเซ‡ เช›เซ‡, เชชเช›เซ€ เชญเชฒเซ‡ เชคเซ‡ เช•เซ‹เชฃ เชœเซ€เชคเซ‡. เชฆเชฐเซ‡เช• เชจเชตเชพ เชธเชนเชญเชพเช—เซ€ เชฌเชฟเชก เชšเซ‚เช•เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชœเซ‡ เชธเชนเชญเชพเช—เซ€ เชฎเชนเชคเซเชคเชฎ เชฌเชฟเชก เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชฒเซ‹เชŸ เชœเซ€เชคเซ‡ เช›เซ‡.

เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชฆเชฐเซ‡เช• เชนเชฐเชพเชœเซ€ เชธเชนเชญเชพเช—เซ€ (เช•เซ€, เชฎเซ‚เชฒเซเชฏ)* = (โ€œเชตเชฟเชœเซ‡เชคเชพโ€, เชธเชฐเชจเชพเชฎเซเช‚), (โ€œเช•เชฟเช‚เชฎเชคโ€, เช•เชฟเช‚เชฎเชค) เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชฌเชฟเชก เชฎเซ‚เช•เซ‡ เช›เซ‡. เช†เชตเชพ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ‡ เชซเช•เซเชค เชคเซเชฏเชพเชฐเซ‡ เชœ เชฎเช‚เชœเซ‚เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‹ เช† เชธเชนเชญเชพเช—เซ€ เชชเชพเชธเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชคเซ‡เชจเซ€ เชธเชนเซ€ เชธเชพเชฅเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชนเซ‹เชฏ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชฌเชฟเชก เช…เช—เชพเช‰เชจเชพ เชคเชฎเชพเชฎ เช•เชฐเชคเชพ เชตเชงเชพเชฐเซ‡ เชนเซ‹เชฏ. เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช…เช‚เชคเชฟเชฎ เชŠเช‚เชšเชพเชˆ เชจ เชชเชนเซ‹เช‚เชšเซ€ เชœเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชนเชฐเชพเชœเซ€ เชšเชพเชฒเซ เชฐเชนเซ‡ เช›เซ‡.

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

เชตเซ€เชฎเซ‹ / เช•เซเชฐเชพเช‰เชกเชซเช‚เชกเชฟเช‚เช—

เชšเชพเชฒเซ‹ เชเชตเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเช เช•เซ‡ เชœเซเชฏเชพเช‚ เชคเชฎเชพเชฐเซ‡ เชจเชพเชฃเชพเช•เซ€เชฏ เชจเซเช•เชธเชพเชจ เชธเชพเชฎเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชธเช‚เชชเชคเซเชคเชฟเชจเซ‹ เชตเซ€เชฎเซ‹ เชฒเซ‡เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช—เซ‡เชฐเช‚เชŸเซ€ เชฎเชพเช‚เช—เซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‹ เชŸเซ‹เช•เชจเชจเซเช‚ เช…เชตเชฎเซ‚เชฒเซเชฏเชจ เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เชคเซ‡ เช† เชŸเซ‹เช•เชจเซเชธ เชฎเชพเชŸเซ‡ เชšเซ‚เช•เชตเซ‡เชฒ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเช•เชฎ เชชเชพเช›เซ€ เชฎเซ‡เชณเชตเซ€ เชถเช•เชถเซ‡, เช…เชจเซ‡ เชคเซ‡ เชตเซ€เชฎเชพเชจเซ€ เชตเชพเชœเชฌเซ€ เชฐเช•เชฎ เชšเซ‚เช•เชตเชตเชพ เชคเซˆเชฏเชพเชฐ เช›เซ‡.

เช†เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡, "เชตเซ€เชฎเชพ เชŸเซ‹เช•เชจเซเชธ" เชœเชพเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเช›เซ€ เชชเซ‹เชฒเชฟเชธเซ€เชงเชพเชฐเช•เชจเชพ เช–เชพเชคเชพ เชชเชฐ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชซเช•เซเชค เชคเซ‡ เชœ เชเช•เซเชธเชšเซ‡เชจเซเชœ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเซเชธเชจเซ‡ เชœ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เชœเซ‡ เช…เชฎเซเช• เชถเชฐเชคเซ‹เชจเซ‡ เชชเซ‚เชฐเซเชฃ เช•เชฐเซ‡ เช›เซ‡.

เชฌเซ‡เชตเชกเชพ เช–เชฐเซเชšเชจเซ‡ เชฐเซ‹เช•เชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชชเซ‰เชฒเชฟเชธเซ€เชงเชพเชฐเช•เชจเชพ เช–เชพเชคเชพเชฎเชพเช‚ เช…เช—เชพเช‰เชฅเซ€ (เช•เซ€, เชฎเซ‚เชฒเซเชฏ) = (purchaseTransactionId, sellOrderId) เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชฏเซ‡เชฒเซ€ เช•เซ€ เชตเชกเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฎเซ‹เช•เชฒเชตเชพ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเช‚เชง เชฎเซ‚เช•เชตเซ‹ เชชเชกเชถเซ‡.

เชคเซ‡เชฅเซ€, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพ เชชเซเชฐเชพเชตเชพเช“เชฎเชพเช‚ เชตเซ€เชฎเชพ เชŸเซ‹เช•เชจ เช–เชฐเซ€เชฆเซ€เชจเซเช‚ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ ID เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชšเชฒเชฃเชจเซ€ เชœเซ‹เชกเซ€ เช–เชฐเซ€เชฆเซ€ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชนเซ‹เชฏ เชคเซ‡เชตเซ€ เชœ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช. เช•เชฟเช‚เชฎเชค เชชเชฃ เช–เชฐเซ€เชฆเชคเซ€ เชตเช–เชคเซ‡ เชจเชฟเชฏเชค เช•เชฐเซ‡เชฒ เชฐเช•เชฎเชจเซ€ เชฌเชฐเชพเชฌเชฐ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช, เชตเซ€เชฎเชพเชจเซ€ เช•เชฟเช‚เชฎเชค เชฌเชพเชฆ เช•เชฐเซ‹.

เชคเซ‡ เชธเชฎเชœเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช•เซ‡ เชชเช›เซ€เชฅเซ€ เชตเซ€เชฎเชพ เช–เชพเชคเซเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชพเชธเซ‡เชฅเซ€ เชตเซ€เชฎเชพ เชŸเซ‹เช•เชจเซเชธ เช–เชฐเซ€เชฆเซ‡ เช›เซ‡ เชœเซ‡ เชคเซ‡เชฃเซ‡ เช–เชฐเซ€เชฆเซเชฏเชพ เชนเซ‹เชฏ เชคเซ‡เชจเชพ เช•เชฐเชคเชพ เช“เช›เซ€ เช•เชฟเช‚เชฎเชคเซ‡ เชจ เชนเซ‹เชฏ: เชตเซ€เชฎเชพ เช–เชพเชคเซเช‚ เชเช•เซเชธเชšเซ‡เชจเซเชœ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเซ‡ เช›เซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช“เชฐเซเชกเชฐ เชชเชฐ เชธเชนเซ€ เช•เชฐเซ‡ เช›เซ‡ (เชœเซ‹ เชตเซเชฏเชตเชนเชพเชฐ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชชเซ‚เชฐเซเชฃ เชฅเชฏเซ‹ เชนเซ‹เชฏ), เชตเซ€เชฎเชพ เช–เชพเชคเซเช‚ เชฌเซ€เชœเชพ เช“เชฐเซเชกเชฐ เช…เชจเซ‡ เชธเชฎเช—เซเชฐ เชตเซเชฏเชตเชนเชพเชฐ เชชเชฐ เชธเชนเซ€ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡.

เชœเซ‹ เช•เซ‹เชˆ เช–เชฐเซ€เชฆเซ€ เชจ เชฅเชพเชฏ, เชคเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชจเชฟเชฏเชฎเซ‹ เช…เชจเซเชธเชพเชฐ เชเช•เซเชธเชšเซ‡เชจเซเชœ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‡ เช›เซ‡. เช† เชฐเซ€เชคเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชตเซ€เชฎเชพเชตเชพเชณเชพ เชŸเซ‹เช•เชจเซเชธเชจเซ€ เช–เชฐเซ€เชฆเซ€ เชชเชฐ เช–เชฐเซเชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชจเชพเชฃเชพเช‚ เชชเชฐเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

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 เชธเซเชฎเชพเชฐเซเชŸ เชเชธเซ‡เชŸ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชถเซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เช“ เชคเชฎเชจเซ‡ N/taxDivisor (เชœเซ‡ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡เชฅเซ€ 10 *N/taxDivisor WAVES เชชเชฐ เช–เชฐเซ€เชฆเซ€ เชถเช•เชพเชฏ เช›เซ‡) เชจเซ€ เชฐเช•เชฎเชฎเชพเช‚ FeeCoin เช†เชชเชถเซ‡, เช…เชจเซ‡ เชคเชฎเซ‡ เช–เชพเชฃเชฟเชฏเซ‹เชจเซ‡ N/taxDivisor WAVES เช†เชชเชถเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชคเชฎเชพเชฐเซ‹ เชจเชซเซ‹ (เช•เชฐ) 9*N / taxDivisor WAVES เชนเชถเซ‡.

เชคเชฎเซ‡ เชธเซเชฎเชพเชฐเซเชŸ เชเชธเซ‡เชŸ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช…เชจเซ‡ เชฎเชพเชธ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเชตเซ‡เชฐเชพ เชชเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

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
}

เช•เซ‡เชถเชฌเซ‡เช• เช…เชจเซ‡ เชฒเซ‹เชฏเชฒเซเชŸเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ

เช•เซ‡เชถเชฌเซ‡เช• เช เชฒเซ‹เชฏเชฒเซเชŸเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เชเช• เชชเซเชฐเช•เชพเชฐ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช–เชฐเซ€เชฆเชจเชพเชฐเชจเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เช…เชฅเชตเชพ เชธเซ‡เชตเชพ เชชเชฐ เช–เชฐเซเชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชฐเช•เชฎเชจเซ‹ เชญเชพเช— เชชเชพเช›เซ‹ เชฎเชณเซ‡ เช›เซ‡.

เชธเซเชฎเชพเชฐเซเชŸ เชเช•เชพเช‰เชจเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช† เช•เซ‡เชธเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชคเซ€ เชตเช–เชคเซ‡, เช†เชชเชฃเซ‡ เชตเซ€เชฎเชพเชจเชพ เช•เซ‡เชธเชฎเชพเช‚ เชœเซ‡ เชฐเซ€เชคเซ‡ เชชเซเชฐเชพเชตเชพ เชคเชชเชพเชธเซเชฏเชพ เชนเชคเชพ เชคเซ‡ เชœ เชฐเซ€เชคเซ‡ เชคเชชเชพเชธเชตเชพ เชœเซ‹เชˆเช. เชฌเซ‡เชตเชกเชพ เช–เชฐเซเชšเชจเซ‡ เชฐเซ‹เช•เชตเชพ เชฎเชพเชŸเซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช เช•เซ‡เชถเชฌเซ‡เช• เชฎเซ‡เชณเชตเชคเชพ เชชเชนเซ‡เชฒเชพ (เช•เซ€, เชฎเซ‚เชฒเซเชฏ) = (เชชเชฐเชšเซ‡เชเชŸเซเชฐเชพเชจเซเชธเซ‡เช•เชถเชจเช†เชˆเชกเซ€, เช•เซ‡เชถเชฌเซ‡เช•เชŸเซเชฐเชพเชจเซเชธเซ‡เช•เชถเชจเช†เชˆเชกเซ€) เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชฎเซ‹เช•เชฒเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡.

เช†เชชเชฃเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชนเชพเชฒเชจเซ€ เช•เซ€ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเช‚เชง เชชเชฃ เชธเซ‡เชŸ เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช. cashbackDivisor - เช•เซ‡เชถเชฌเซ‡เช• เชถเซ‡เชฐ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชญเชพเชœเชฟเชค เชเช•เชฎ. เชคเซ‡. เชœเซ‹ เช•เซ‡เชถเชฌเซ‡เช• เชถเซ‡เชฐ 0.1 เช›เซ‡, เชคเซ‹ เช•เซ‡เชถเชฌเซ‡เช• เชกเชฟเชตเชฟเชเชฐ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹