เจตเฉ‡เจตเจœเจผ เจธเจฎเจพเจฐเจŸ เจ–เจพเจคเจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚: เจจเจฟเจฒเจพเจฎเฉ€ เจคเฉ‹เจ‚ เจฌเฉ‹เจจเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉฑเจ•

เจตเฉ‡เจตเจœเจผ เจธเจฎเจพเจฐเจŸ เจ–เจพเจคเจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚: เจจเจฟเจฒเจพเจฎเฉ€ เจคเฉ‹เจ‚ เจฌเฉ‹เจจเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉฑเจ•

เจฌเจฒเจพเจ•เจšเฉˆเจจ เจ…เจ•เจธเจฐ เจธเจฟเจฐเจซ เจ•เฉเจฐเจฟเจชเจŸเฉ‹เจ•เจฐเฉฐเจธเฉ€ เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจกเฉ€เจเจฒเจŸเฉ€ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจ–เฉ‡เจคเจฐ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจตเจฟเจ†เจชเจ• เจนเจจเฅค เจฌเจฒเฉŒเจ•เจšเฉˆเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจ–เฉ‡เจคเจฐเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เฉฑเจ• เจธเจฎเจพเจฐเจŸ เจ‡เจ•เจฐเจพเจฐเจจเจพเจฎเจพ เจนเฉˆ เจœเฉ‹ เจ†เจชเจฃเฉ‡ เจ†เจช เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉ‹เจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจชเจพเจฐเจŸเฉ€เจ†เจ‚ เจตเจฟเจšเจ•เจพเจฐ เจตเจฟเจธเจผเจตเจพเจธ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค

เจฐเจพเจˆเจก - เจธเจฎเจพเจฐเจŸ เจ•เฉฐเจŸเจฐเฉˆเจ•เจŸเจธ เจฒเจˆ เจ‡เฉฑเจ• เจญเจพเจธเจผเจพ

เจตเฉ‡เจตเจœเจผ เจจเฉ‡ เจธเจฎเจพเจฐเจŸ เจ•เฉฐเจŸเจฐเฉˆเจ•เจŸเจธ - เจฐเจพเจˆเจก เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจญเจพเจธเจผเจพ เจตเจฟเจ•เจธเจฟเจค เจ•เฉ€เจคเฉ€ เจนเฉˆเฅค เจ‡เจธ เจฆเฉ‡ เจชเฉ‚เจฐเฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฎเฉŒเจœเฉ‚เจฆ เจนเจจ เจ‡เฉฑเจฅเฉ‡. เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ - เจ‡เจธ เจตเจฟเจธเจผเฉ‡ 'เจคเฉ‡ เจฒเฉ‡เจ– Habr 'เจคเฉ‡.

เจฐเจพเจˆเจก เจ‡เจ•เจฐเจพเจฐเจจเจพเจฎเจพ เจ‡เฉฑเจ• เจตเจฟเจตเจนเจพเจฐเจ• เจนเฉˆ เจ…เจคเฉ‡ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš "เจธเฉฑเจš" เจœเจพเจ‚ "เจ—เจฒเจค" เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจ…เจจเฉเจธเจพเจฐ, เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจจเฉ‚เฉฐ เจœเจพเจ‚ เจคเจพเจ‚ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจตเจฟเฉฑเจš เจฐเจฟเจ•เจพเจฐเจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจพเจ‚ เจฐเฉฑเจฆ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจธเจฎเจพเจฐเจŸ เจ•เฉฐเจŸเจฐเฉˆเจ•เจŸ เจจเจฟเจธเจผเจšเจฟเจค เจธเจผเจฐเจคเจพเจ‚ เจฆเฉ€ เจชเฉ‚เจฐเจคเฉ€ เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจ—เจพเจฐเฉฐเจŸเฉ€ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค RIDE เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ‡เจ•เจฐเจพเจฐเจจเจพเจฎเฉ‡ เจคเฉ‹เจ‚ เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจคเจฟเจ†เจฐ เจ•เจฐเจจเจพ เจซเจฟเจฒเจนเจพเจฒ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจ…เฉฑเจœ เจตเฉ‡เจตเจœเจผ เจธเจฎเจพเจฐเจŸ เจ•เฉฐเจŸเจฐเฉˆเจ•เจŸ เจฆเฉ€เจ†เจ‚ เจฆเฉ‹ เจ•เจฟเจธเจฎเจพเจ‚ เจนเจจ: เจธเจฎเจพเจฐเจŸ เจ–เจพเจคเฉ‡ เจ…เจคเฉ‡ เจธเจฎเจพเจฐเจŸ เจธเฉฐเจชเจคเฉ€เจ†เจ‚เฅค เจ‡เฉฑเจ• เจธเจฎเจพเจฐเจŸ เจ–เจพเจคเจพ เจ‡เฉฑเจ• เจจเจฟเจฏเจฎเจค เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ–เจพเจคเจพ เจนเฉˆ, เจชเจฐ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ เจœเฉ‹ เจธเจพเจฐเฉ‡ เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เฉฑเจ• เจธเจฎเจพเจฐเจŸ เจ–เจพเจคเจพ เจธเจ•เฉเจฐเจฟเจชเจŸ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ:

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

tx เจ‡เฉฑเจ• เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€ เจœเจพ เจฐเจนเฉ€ เจนเฉˆ เจœเจฟเจธเจฆเฉ€ เจ…เจธเฉ€เจ‚ เจชเฉˆเจŸเจฐเจจ เจฎเฉˆเจšเจฟเฉฐเจ— เจตเจฟเจงเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‡เจ•เจฐ เจ‡เจน เจ‡เฉฑเจ• เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค 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)
}

เจฌเฉ€เจฎเจพ / Crowdfunding

เจ†เจ‰ เจ‡เฉฑเจ• เจ…เจœเจฟเจนเฉ€ เจธเจฅเจฟเจคเฉ€ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ€เจ เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฟเฉฑเจคเฉ€ เจจเฉเจ•เจธเจพเจจ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจธเฉฐเจชเฉฑเจคเฉ€ เจฆเจพ เจฌเฉ€เจฎเจพ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‡เฉฑเจ• เจ—เจพเจฐเฉฐเจŸเฉ€ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจœเฉ‡เจ•เจฐ เจ‡เฉฑเจ• เจŸเฉ‹เจ•เจจ เจ˜เจŸเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‰เจน เจ‡เจนเจจเจพเจ‚ เจŸเฉ‹เจ•เจจเจพเจ‚ เจฒเจˆ เจ…เจฆเจพ เจ•เฉ€เจคเฉ€ เจชเฉ‚เจฐเฉ€ เจฐเจ•เจฎ เจตเจพเจชเจธ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ, เจ…เจคเฉ‡ เจฌเฉ€เจฎเฉ‡ เจฆเฉ€ เจ‡เฉฑเจ• เจตเจพเจœเจฌ เจฐเจ•เจฎ เจฆเจพ เจญเฉเจ—เจคเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจนเฉˆเฅค

เจ‡เจธ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ, "เจฌเฉ€เจฎเจพ เจŸเฉ‹เจ•เจจ" เจœเจพเจฐเฉ€ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจซเจฟเจฐ เจชเจพเจฒเจฟเจธเฉ€เจงเจพเจฐเจ• เจฆเฉ‡ เจ–เจพเจคเฉ‡ 'เจคเฉ‡ เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจธเจฅเจพเจชเจค เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจœเจฟเจธ เจจเจพเจฒ เจธเจฟเจฐเจซเจผ เจ‰เจนเจจเจพเจ‚ เจเจ•เจธเจšเฉ‡เจ‚เจœ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจœเฉ‹ เจ•เฉเจ เจธเจผเจฐเจคเจพเจ‚ เจชเฉ‚เจฐเฉ€เจ†เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

เจฆเฉ‹เจนเจฐเฉ‡ เจ–เจฐเจšเฉ‡ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฃ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ (เจ•เฉเฉฐเจœเฉ€, เจฎเฉเฉฑเจฒ) = (เจ–เจฐเฉ€เจฆเจฃ เจŸเจฐเจพเจ‚เจธเฉˆเจ•เจธเจผเจจ เจ†เจˆเจกเฉ€, เจธเฉ‡เจฒ เจ†เจฐเจกเจฐ เจ†เจˆเจกเฉ€) เจฆเฉ‡ เจจเจพเจฒ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจนเฉ€ เจชเจพเจฒเจฟเจธเฉ€เจงเจพเจฐเจ• เจฆเฉ‡ เจ–เจพเจคเฉ‡ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจญเฉ‡เจœเจฃ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจตเจฐเจคเฉ€ เจœเจพ เจšเฉเฉฑเจ•เฉ€ เจ•เฉเฉฐเจœเฉ€ เจจเจพเจฒ เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚ เจฎเจจเฉเจนเจพ เจ•เจฐเฉ‹เฅค

เจ‡เจธ เจฒเจˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจธเจฌเฉ‚เจคเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉ€เจฎเจพ เจŸเฉ‹เจ•เจจ เจฆเฉ€ เจ–เจฐเฉ€เจฆ เจฆเจพ เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ 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/เจŸเฉˆเจ•เจธ เจกเจฟเจตเจพเจˆเจœเจผเจฐ เจตเฉ‡เจตเจœเจผ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจฎเจพเจฐเจŸ เจเจธเฉ‡เจŸ เจธเจ•เฉเจฐเจฟเจชเจŸ เจ…เจคเฉ‡ เจฎเจพเจธ เจŸเจฐเจพเจ‚เจธเจซเจฐ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจŸเฉˆเจ•เจธ เจตเฉ€ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

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
}

เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจ…เจคเฉ‡ เจตเจซเจผเจพเจฆเจพเจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ

เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจ‡เฉฑเจ• เจ•เจฟเจธเจฎ เจฆเจพ เจตเจซเจพเจฆเจพเจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ–เจฐเฉ€เจฆเจฆเจพเจฐ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจ‰เจคเจชเจพเจฆ เจœเจพเจ‚ เจธเฉ‡เจตเจพ 'เจคเฉ‡ เจ–เจฐเจš เจ•เฉ€เจคเฉ€ เจ—เจˆ เจฐเจ•เจฎ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจตเจพเจชเจธ เจฎเจฟเจฒเจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจธเจฎเจพเจฐเจŸ เจ–เจพเจคเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ‡เจธ เจ•เฉ‡เจธ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจธเจพเจจเฉ‚เฉฐ เจธเจฌเฉ‚เจคเจพเจ‚ เจฆเฉ€ เจ‰เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจœเจพเจ‚เจš เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ…เจธเฉ€เจ‚ เจฌเฉ€เจฎเจพ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ•เฉ€เจคเฉ€ เจธเฉ€เฅค เจฆเฉ‹เจนเจฐเฉ‡ เจ–เจฐเจš เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฃ เจฒเจˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ (เจ•เฉเฉฐเจœเฉ€, เจฎเฉเฉฑเจฒ) = (เจ–เจฐเฉ€เจฆเจฃ เจŸเจฐเจพเจ‚เจธเฉˆเจ•เจธเจผเจจ เจ†เจˆเจกเฉ€, เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจ†เจˆเจกเฉ€) เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจญเฉ‡เจœเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจธเจพเจจเฉ‚เฉฐ เจกเจพเจŸเจพ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ 'เจคเฉ‡ เจตเฉ€ เจชเจพเจฌเฉฐเจฆเฉ€ เจฒเจ—เจพเจ‰เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจกเจฟเจตเจพเจˆเจœเจผเจฐ - เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจธเจผเฉ‡เจ…เจฐ เจฆเฉเจ†เจฐเจพ เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ† เจฏเฉ‚เจจเจฟเจŸเฅค เจ‰เจน. เจœเฉ‡เจ•เจฐ เจ•เฉˆเจธเจผเจฌเฉˆเจ• เจธเจผเฉ‡เจ…เจฐ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹