เจฌเจฒเจพเจเจเฉเจจ เจ
เจเจธเจฐ เจธเจฟเจฐเจซ เจเฉเจฐเจฟเจชเจเฉเจเจฐเฉฐเจธเฉ เจจเจพเจฒ เจเฉเฉเจฟเจ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจชเจฐ เจกเฉเจเจฒเจเฉ เจคเจเจจเจพเจฒเฉเจเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจฆเฉ เจเฉเจคเจฐ เจฌเจนเฉเจค เจเจผเจฟเจเจฆเจพ เจตเจฟเจเจชเจ เจนเจจเฅค เจฌเจฒเฉเจเจเฉเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจฒเจ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจเฉเจคเจฐเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจเฉฑเจ เจธเจฎเจพเจฐเจ เจเจเจฐเจพเจฐเจจเจพเจฎเจพ เจนเฉ เจเฉ เจเจชเจฃเฉ เจเจช เจเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธ เจตเจฟเฉฑเจ เจฆเจพเจเจฒ เจนเฉเจฃ เจตเจพเจฒเฉเจเจ เจชเจพเจฐเจเฉเจเจ เจตเจฟเจเจเจพเจฐ เจตเจฟเจธเจผเจตเจพเจธ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
เจฐเจพเจเจก - เจธเจฎเจพเจฐเจ เจเฉฐเจเจฐเฉเจเจเจธ เจฒเจ เจเฉฑเจ เจญเจพเจธเจผเจพ
เจตเฉเจตเจเจผ เจจเฉ เจธเจฎเจพเจฐเจ เจเฉฐเจเจฐเฉเจเจเจธ - เจฐเจพเจเจก เจฒเจ เจเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผ เจญเจพเจธเจผเจพ เจตเจฟเจเจธเจฟเจค เจเฉเจคเฉ เจนเฉเฅค เจเจธ เจฆเฉ เจชเฉเจฐเฉ เจฆเจธเจคเจพเจตเฉเจเจผ เจฎเฉเจเฉเจฆ เจนเจจ
เจฐเจพเจเจก เจเจเจฐเจพเจฐเจจเจพเจฎเจพ เจเฉฑเจ เจตเจฟเจตเจนเจพเจฐเจ เจนเฉ เจ
เจคเฉ เจเจเจเจชเฉเฉฑเจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ "เจธเฉฑเจ" เจเจพเจ "เจเจฒเจค" เจตเจพเจชเจธ เจเจฐเจฆเจพ เจนเฉเฅค เจเจธ เจ
เจจเฉเจธเจพเจฐ, เจฒเฉเจฃ-เจฆเฉเจฃ เจจเฉเฉฐ เจเจพเจ เจคเจพเจ เจฌเจฒเจพเจเจเฉเจจ เจตเจฟเฉฑเจ เจฐเจฟเจเจพเจฐเจก เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ เจเจพเจ เจฐเฉฑเจฆ เจเจฐ เจฆเจฟเฉฑเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค เจธเจฎเจพเจฐเจ เจเฉฐเจเจฐเฉเจเจ เจจเจฟเจธเจผเจเจฟเจค เจธเจผเจฐเจคเจพเจ เจฆเฉ เจชเฉเจฐเจคเฉ เจฆเฉ เจชเฉเจฐเฉ เจเจพเจฐเฉฐเจเฉ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค 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