ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธื ืก ืคื•ืŸ ื•ื•ืึทื•ื•ืขืก ืงืœื•ื’ ืึทืงืึทื•ื ืฅ: ืคื•ืŸ ืึธืงืฉืึทื ื– ืฆื• ื‘ืึธื ื•ืก ืžื’ื™ืœื”

ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธื ืก ืคื•ืŸ ื•ื•ืึทื•ื•ืขืก ืงืœื•ื’ ืึทืงืึทื•ื ืฅ: ืคื•ืŸ ืึธืงืฉืึทื ื– ืฆื• ื‘ืึธื ื•ืก ืžื’ื™ืœื”

ื‘ืœืึธืงื˜ืฉื™ื™ืŸ ืื™ื– ืึธืคื˜ ืคืืจื‘ื•ื ื“ืŸ ื‘ืœื•ื™ื– ืžื™ื˜ ืงืจื™ืคึผื˜ืึธืงื•ืจืจืขื ืกื™, ืึธื‘ืขืจ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืคื•ืŸ DLT ื˜ืขื›ื ืึธืœืึธื’ื™ืข ื–ืขื ืขืŸ ืคื™ืœ ื‘ืจื™ื™ื˜. ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขืจืกื˜ ืคึผืจืึทืžืึทืกื™ื ื’ ื’ืขื‘ื™ื˜ืŸ ืคึฟืึทืจ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืื™ื– ืึท ืงืœื•ื’ ืงืึธื ื˜ืจืึทืงื˜ ื•ื•ืึธืก ืื™ื– ืขืงืกืึทืงื™ื•ื˜ืึทื“ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืื•ืŸ ื˜ื•ื˜ ื ื™ืฉื˜ ื“ืึทืจืคืŸ ืฆื•ื˜ืจื•ื™ ืฆื•ื•ื™ืฉืŸ ื“ื™ ืคึผืึทืจื˜ื™ืขืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืืจื™ื™ืŸ ืื™ืŸ ืขืก.

RIDE - ืึท ืฉืคึผืจืึทืš ืคึฟืึทืจ ืงืœื•ื’ ืงืึทื ื˜ืจืึทืงืฅ

ื•ื•ืึทื•ื•ืขืก ื”ืื˜ ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืึท ืกืคึผืขืฆื™ืขืœ ืฉืคึผืจืึทืš ืคึฟืึทืจ ืงืœื•ื’ ืงืึทื ื˜ืจืึทืงืฅ - RIDE. ื–ื™ื™ึทืŸ ื’ืึทื ืฅ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืื™ื– ืœื™ื’ืŸ ื“ืึธ. ืื•ืŸ ื“ืึธ - ืึทืจื˜ื™ืงืœ ืื•ื™ืฃ ื“ืขื ื˜ืขืžืข ืื•ื™ืฃ ื”ืื‘ืจ.

ื“ื™ RIDE ืงืึธื ื˜ืจืึทืงื˜ ืื™ื– ืึท ืคึผืจืขื“ื™ืงืึทื˜ ืื•ืŸ ืงืขืจื˜ "ืืžืช" ืึธื“ืขืจ "ืคืึทืœืฉ" ื•ื•ื™ ืจืขื–ื•ืœื˜ืึทื˜. ืึทืงืงืึธืจื“ื™ื ื’ืœื™, ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื™ื– ืึธื“ืขืจ ืจืขืงืึธืจื“ืขื“ ืื™ืŸ ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืึธื“ืขืจ ืคืืจื•ื•ืืจืคืŸ. ื“ืขืจ ืงืœื•ื’ ืงืึธื ื˜ืจืึทืงื˜ ื’ืึธืจ ื’ืขืจืึทื ื˜ื™ื– ื“ื™ ืžืงื™ื™ื ืคื•ืŸ ืกืคึผืขืกื™ืคื™ืขื“ ื˜ื ืึธื™ื. ืขืก ืื™ื– ื“ืขืจื•ื•ื™ื™ึทืœ ื ื™ื˜ ืžืขื’ืœืขืš ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืคื•ืŸ ืึท ืงืึธื ื˜ืจืึทืงื˜ ืื™ืŸ RIDE.

ื”ื™ื™ึทื ื˜ ืขืก ื–ืขื ืขืŸ ืฆื•ื•ื™ื™ ื˜ื™ื™ืคึผืก ืคื•ืŸ ื•ื•ืึทื•ื•ืขืก ืงืœื•ื’ ืงืึทื ื˜ืจืึทืงืฅ: ืงืœื•ื’ ืึทืงืึทื•ื ืฅ ืื•ืŸ ืงืœื•ื’ ืึทืกืขืฅ. ื ืงืœื•ื’ ื—ืฉื‘ื•ืŸ ืื™ื– ืึท ืจืขื’ื•ืœืขืจ ื‘ืึทื ื™ืฆืขืจ ื—ืฉื‘ื•ืŸ, ืึธื‘ืขืจ ืึท ืฉืจื™ืคื˜ ืื™ื– ื‘ืึทืฉื˜ื™ืžื˜ ืคึฟืึทืจ ืื™ื ื•ื•ืึธืก ืงืึธื ื˜ืจืึธืœ ืึทืœืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–. ื ืงืœื•ื’ ื—ืฉื‘ื•ืŸ ืฉืจื™ืคื˜ ืงืขืŸ ืงื•ืงืŸ ื•ื•ื™ ื“ืึธืก, ืœืžืฉืœ:

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

tx ืื™ื– ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืคึผืจืึทืกืขืกื˜ ืึทื– ืžื™ืจ ืœืึธื–ืŸ ื ื™ืฆืŸ ื“ื™ ืžื•ืกื˜ืขืจ ื•ื•ืึธืก ืจื™ื›ื˜ืŸ ืžืขืงืึทื ื™ื–ืึทื ื‘ืœื•ื™ื– ืื•ื™ื‘ ืขืก ืื™ื– ื ื™ืฉื˜ ืึท ืึทืจื™ื‘ืขืจืคื™ืจืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ. ืžื•ืกื˜ืขืจ ื•ื•ืึธืก ืจื™ื›ื˜ืŸ ื–ื™ืš ืื™ืŸ RIDE ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ืขื ื˜ื™ืคึผ ืคื•ืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ. ื›ืœ ื™ื’ื–ื™ืกื˜ื™ื ื’ ืึทืงืึทื•ื ืฅ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคึผืจืึทืกืขืกื˜ ืื™ืŸ ื“ื™ ืงืœื•ื’ ื—ืฉื‘ื•ืŸ ืฉืจื™ืคื˜ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื˜ื™ื™ืคึผืก.

ื“ืขืจ ืฉืจื™ืคื˜ ืงืขื ืขืŸ ืื•ื™ืš ื“ืขืจืงืœืขืจืŸ ื•ื•ืขืจื™ืึทื‘ืึทืœื–, ื ื•ืฆืŸ "ืื•ื™ื‘-ื“ืขืžืึธืœื˜-ืื ื“ืขืจืข" ืงืึทื ืกื˜ืจืึทืงืฉืึทื ื– ืื•ืŸ ืื ื“ืขืจืข ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ื’ืึธืจ ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื˜ื ืึธื™ื. ืฆื• ืขื ืฉื•ืจ ืึทื– ืงืึทื ื˜ืจืึทืงืฅ ื”ืึธื‘ืŸ ืคึผืจืึทื•ื•ื™ื–ืึทื‘ืึทืœ ืงืึทืžืคึผืœื™ื˜ื ืึทืก ืื•ืŸ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ (ืคึผืจื™ื™ึทื–) ื•ื•ืึธืก ืื™ื– ื’ืจื™ื ื’ ืฆื• ืคืึธืจื•ื™ืกื–ืึธื’ืŸ ืื™ื™ื“ืขืจ ื“ื™ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคื•ืŸ ืงืึธื ื˜ืจืึทืงื˜ ื”ื™ื™ื‘ื˜, RIDE ื˜ื•ื˜ ื ื™ืฉื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ืœื•ืคึผืก ืึธื“ืขืจ ืฉืคึผืจื™ื ื’ืขืŸ ืกื˜ื™ื™ื˜ืžืึทื ืฅ.

ืื ื“ืขืจืข ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืคื•ืŸ ื•ื•ืึทื•ื•ืขืก ืึทืงืึทื•ื ืฅ ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื“ื™ ื‘ื™ื™ึทื–ื™ื™ึทืŸ ืคื•ืŸ ืึท "ืฉื˜ืึทื˜," ื•ื•ืึธืก ืื™ื–, ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื—ืฉื‘ื•ืŸ. ืื™ืจ ืงืขื ืขืŸ ืฉืจื™ื™ึทื‘ืŸ ืึท ื™ื ืคืึทื ืึทื˜ ื ื•ืžืขืจ ืคื•ืŸ ืคึผืขืจื– (ืฉืœื™ืกืœ, ื•ื•ืขืจื˜) ืฆื• ื“ื™ ื—ืฉื‘ื•ืŸ ืฉื˜ืึทื˜ ื ื™ืฆืŸ ื“ืึทื˜ืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– (DataTransaction). ื“ื™ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคึผืจืึทืกืขืกื˜ ื‘ื™ื™ื“ืข ื“ื•ืจืš ื“ื™ REST API ืื•ืŸ ื’ืœื™ื™ึทืš ืื™ืŸ ื“ื™ ืงืœื•ื’ ืงืึธื ื˜ืจืึทืงื˜.

ื™ืขื“ืขืจ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืงืขื ืขืŸ ืึทื ื˜ื”ืึทืœื˜ืŸ ืึท ืงื™ื™ื˜ ืคื•ืŸ ืคึผืจืึธื•ื•ืขืก, ืื™ืŸ ื•ื•ืึธืก ื“ื™ ื›ืกื™ืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ, ื“ื™ ID ืคื•ืŸ ื“ื™ ืคืืจืœืื ื’ื˜ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ืืื–"ื• ื•.

ืืจื‘ืขื˜ืŸ ืžื™ื˜ RIDE ื“ื•ืจืš ื™ื™ื“ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื–ืขืŸ ื“ื™ ืงืึทืžืคึผื™ื™ืœื“ ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ื“ื™ ืงืึธื ื˜ืจืึทืงื˜ (ืื•ื™ื‘ ืขืก ืื™ื– ืงืึทืžืคึผื™ื™ืœื“), ืฉืึทืคึฟืŸ ื ื™ื™ึทืข ืึทืงืึทื•ื ืฅ ืื•ืŸ ืฉื˜ืขืœืŸ ืกืงืจื™ืคึผืก ืคึฟืึทืจ ืขืก, ืื•ืŸ ืฉื™ืงืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ื“ื•ืจืš ื“ื™ ื‘ืึทืคึฟืขืœืŸ ืฉื•ืจื”.

ืคึฟืึทืจ ืึท ื’ืึทื ืฅ ืฆื™ืงืœ, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืงืจื™ื™ื™ื˜ื™ื ื’ ืึท ื—ืฉื‘ื•ืŸ, ื™ื ืกื˜ืึธืœื™ื ื’ ืึท ืงืœื•ื’ ืงืึธื ื˜ืจืึทืงื˜ ืื•ื™ืฃ ืขืก ืื•ืŸ ืฉื™ืงืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–, ืื™ืจ ืงืขื ืขืŸ ืื•ื™ืš ื ื•ืฆืŸ ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ืคึฟืึทืจ ื™ื ื˜ืขืจืึทืงื˜ื™ื ื’ ืžื™ื˜ ื“ื™ REST API (ืœืžืฉืœ C #, C, Java, JavaScript, Python, Rust, Elixir) . ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ IDE, ื ืึธืจ ื’ื™ื˜ ื“ื™ ื ื™ื™ึท ืงื ืขืคึผืœ.

ื“ื™ ืคึผืึทืกืึทื‘ื™ืœืึทื˜ื™ื– ืคึฟืึทืจ ื ื™ืฆืŸ ืงืœื•ื’ ืงืึทื ื˜ืจืึทืงืฅ ื–ืขื ืขืŸ ื‘ืจื™ื™ื˜: ืคื•ืŸ ืคึผืจืึธื•ื›ื™ื‘ืึทื˜ื™ื ื’ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืฆื• ื–ื™ื›ืขืจ ืึทื“ืจืขืกืขืก ("ืฉื•ื•ืึทืจืฅ ืจืฉื™ืžื”") ืฆื• ืงืึธืžืคึผืœืขืงืก ื“ืึทืคึผืคึผืก.

ืื™ืฆื˜ ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ืกืคึผืขืฆื™ืคื™ืฉ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืงืœื•ื’ ืงืึทื ื˜ืจืึทืงืฅ ืื™ืŸ ื’ืขืฉืขืคื˜: ื•ื•ืขืŸ ืงืึทื ื“ืึทืงื˜ื™ื ื’ ืึธืงืฉืึทื ื–, ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ืื•ืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ืœื•ื™ืึทืœื˜ื™ ืžื’ื™ืœื”.

ืึธืงืฉืึทื ื–

ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื‘ืื“ื™ื ื’ื•ื ื’ืขืŸ ืคึฟืึทืจ ืึท ืžืฆืœื™ื— ืœื™ืฆื™ื˜ืึทืฆื™ืข ืื™ื– ื“ื•ืจื›ื–ืขื™ืงื™ื™ึทื˜: ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ ืžื•ื–ืŸ ื–ื™ื™ืŸ ื–ื™ื›ืขืจ ืึทื– ืขืก ืื™ื– ืื•ืžืžืขื’ืœืขืš ืฆื• ืžืึทื ื™ืคึผื•ืœื™ืจืŸ ื‘ื™ื“ืก. ื“ืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื˜ืฉื™ื•ื•ื“ ื“ืึทื ืง ืฆื• ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ, ื•ื•ื• ื™ืžื™ื•ื˜ืึทื‘ืึทืœ ื“ืึทื˜ืŸ ื•ื•ืขื’ืŸ ืึทืœืข ื‘ืขืฅ ืื•ืŸ ื“ื™ ืฆื™ื™ื˜ ื•ื•ืขืŸ ื–ื™ื™ ื–ืขื ืขืŸ ื’ืขืžืื›ื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืคึฟืึทืจ ืึทืœืข ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ.

ืื•ื™ืฃ ื“ื™ ื•ื•ืึทื•ื•ืขืก ื‘ืœืึธืงื˜ืฉื™ื™ืŸ, ื‘ื™ื“ืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขืงืึธืจื“ืขื“ ืื™ืŸ ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข ื—ืฉื‘ื•ืŸ ืฉื˜ืึทื˜ ื“ื•ืจืš DataTransaction.

ืื™ืจ ืงืขื ืขืŸ ืื•ื™ืš ืฉื˜ืขืœืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืื•ืŸ ืกื•ืฃ ืฆื™ื™ื˜ ืคื•ืŸ ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข ืžื™ื˜ ื‘ืœืึธืง ื ื•ืžืขืจืŸ: ื“ื™ ืึธืคื˜ืงื™ื™ึทื˜ ืคื•ืŸ ื‘ืœืึธืง ื“ื•ืจ ืื™ืŸ ื“ื™ ื•ื•ืึทื•ื•ืขืก ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืื™ื– ื‘ืขืขืจืขืš ื’ืœื™ื™ึทืš ืฆื• 60 ืกืขืงื•ื ื“ืขืก.

1. ืขื ื’ืœื™ืฉ ืึทืกืขื ื“ื™ื ื’ ืคึผืจื™ื™ึทื– ืœื™ืฆื™ื˜ืึทืฆื™ืข

ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ ืื™ืŸ ืึทืŸ ืขื ื’ืœื™ืฉ ืœื™ืฆื™ื˜ืึทืฆื™ืข ืฉื˜ืขืœืŸ ื‘ื™ื“ืก ืื™ืŸ ืคืึทืจืžืขืกื˜ ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ. ื™ืขื“ืขืจ ื ื™ื™ึท ื’ืขื•ื•ืขื˜ ืžื•ื–ืŸ ื™ืงืกื™ื“ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข. ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข ืขื ื“ืก ื•ื•ืขืŸ ืขืก ื–ืขื ืขืŸ ื ื™ื˜ ืžืขืจ ื‘ื™ื“ื“ืขืจืก ืฆื• ื™ืงืกื™ื“ ื“ื™ ืœืขืฆื˜ืข ื‘ืึทืคืขืœืŸ. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ื”ืขื›ืกื˜ืŸ ื‘ื™ื“ืขืจ ืžื•ื–ืŸ ืฆื•ืฉื˜ืขืœืŸ ื“ื™ ืกื˜ื™ื™ื˜ื™ื“ ืกื•ืžืข.

ืขืก ืื™ื– ืื•ื™ืš ืึท ืœื™ืฆื™ื˜ืึทืฆื™ืข ืึธืคึผืฆื™ืข ืื™ืŸ ื•ื•ืึธืก ื“ื™ ื˜ืจืขื’ืขืจ ืฉื˜ืขืœื˜ ืึท ืžื™ื ื™ืžื•ื ืคึผืจื™ื™ึทื– ืคึฟืึทืจ ื“ื™ ืคึผืœืึทืฅ, ืื•ืŸ ื“ื™ ืœืขืฆื˜ ืคึผืจื™ื™ึทื– ืžื•ื–ืŸ ื™ืงืกื™ื“ ืขืก. ืึทื ื“ืขืจืฉ, ื“ื™ ืคึผืœืึทืฅ ื‘ืœื™ื™ื‘ื˜ ืึทื ืกืึธื•ืœื“.

ืื™ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ, ืžื™ืจ ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ืึท ื—ืฉื‘ื•ืŸ ืกืคึผืึทืกื™ืคื™ืงืœื™ ื‘ืืฉืืคืŸ ืคึฟืึทืจ ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข. ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข ื’ืขื“ื•ื™ืขืจ ืื™ื– 3000 ื‘ืœืึทืงืก, ืื•ืŸ ื“ื™ ืกื˜ืึทืจื˜ื™ื ื’ ืคึผืจื™ื™ึทื– ืคื•ืŸ ื“ื™ ืคึผืœืึทืฅ ืื™ื– 0,001 ื•ื•ืึทื•ื•ืขืก. ื ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ืงืขื ืขืŸ ืฉื˜ืขืœืŸ ืึท ื‘ืึทืคืขืœืŸ ื“ื•ืจืš ืฉื™ืงืŸ ืึท ื“ืึทื˜ืึทื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืžื™ื˜ ื“ื™ ืฉืœื™ืกืœ "ืคึผืจื™ื™ึทื–" ืื•ืŸ ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื–ื™ื™ืขืจ ื‘ืึทืคืขืœืŸ.

ื“ื™ ืคึผืจื™ื™ึทื– ืคื•ืŸ ื“ื™ ื ื™ื™ึทืข ื‘ืึทืคืขืœืŸ ืžื•ื–ืŸ ื–ื™ื™ืŸ ื”ืขื›ืขืจ ื•ื•ื™ ื“ื™ ืงืจืึทื ื˜ ืคึผืจื™ื™ึทื– ืคึฟืึทืจ ื“ืขื ืฉืœื™ืกืœ, ืื•ืŸ ื“ืขืจ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ืžื•ื–ืŸ ื”ืึธื‘ืŸ ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ [new_bid + ืงืึธืžื™ืกื™ืข] ื˜ืึธืงืขื ืก ืื™ืŸ ื–ื™ื™ืŸ ื—ืฉื‘ื•ืŸ. ื“ื™ ื‘ื™ื“ืขืจ ืก ืึทื“ืจืขืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ืจืขืงืึธืจื“ืขื“ ืื™ืŸ ื“ื™ "ืึธืคึผืฉื™ืงืขืจ" ืคืขืœื“ ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ืื•ืŸ ื“ื™ ืงืจืึทื ื˜ ื‘ืึทืคืขืœืŸ ื‘ืœืึธืง ื”ื™ื™ืš ืžื•ื–ืŸ ื–ื™ื™ืŸ ืื™ืŸ ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข ืฆื™ื™ื˜.

ืื•ื™ื‘ ืื™ืŸ ื“ื™ ืกื•ืฃ ืคื•ืŸ ื“ื™ ืœื™ืฆื™ื˜ืึทืฆื™ืข ื“ืขืจ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ื”ืื˜ ื‘ืึทืฉื˜ื™ืžื˜ ื“ืขื ื”ืขื›ืกื˜ืŸ ืคึผืจื™ื™ึทื–, ืขืจ ืงืขื ืขืŸ ืฉื™ืงืŸ ืึทืŸ ืขืงืกื˜ืฉืึทื ื’ืข ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืฆื• ื‘ืึทืฆืึธืœืŸ ืคึฟืึทืจ ื“ื™ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืคึผืœืึทืฅ ืื™ืŸ ื“ื™ ืกืคึผืขืกื™ืคื™ืขื“ ืคึผืจื™ื™ึทื– ืื•ืŸ ืงืจืึทื ื˜ืงื™ื™ึทื˜ ืคึผืึธืจ.

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

ืคืึทืจื–ื™ื›ืขืจื•ื ื’ / ืงืจืึทื•ื“ืคืึทื ื“ื™ื ื’

ื–ืืœ ืก ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืึท ืกื™ื˜ื•ืึทืฆื™ืข ื•ื•ื• ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคืึทืจื–ื™ื›ืขืจืŸ ื“ื™ ืึทืกืขืฅ ืคื•ืŸ ื ื™ืฆืขืจืก ืงืขื’ืŸ ืคื™ื ืึทื ืฆื™ืขืœ ืœืึธืกืกืขืก. ืฆื•ื ื‘ื™ื™ืฉืคื™ืœ, ื ื‘ืื ื•ืฆืขืจ ื•ื•ื™ืœ ื ื’ืืจืื ื˜ื™ืข ืื– ืื•ื™ื‘ ื ืกื™ืžืขืŸ ื•ื•ืขืจื˜ ื“ื™ืคึผืจื™ืฉื™ื™ืจื˜, ื•ื•ืขื˜ ืขืจ ืงืขื ืขืŸ ืฆื•ืจื™ืง ื‘ืืงื•ืžืขืŸ ื“ื™ ืคื•ืœืข ืกื›ื•ื ื•ื•ืืก ืื™ื– ื‘ืืฆืืœื˜ ื’ืขื•ื•ืืจืŸ ืคืืจ ื“ื™ ื˜ืืงืขื ืก, ืื•ืŸ ืื™ื– ื’ืจื™ื™ื˜ ืฆื• ืฆืืœืŸ ื ื’ืขื”ืขืจื™ื’ืข ืกื•ืžืข ืื™ื ืฉื•ืจืขื ืก.

ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ืขื, "ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ื˜ืึธืงืขื ืก" ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ืืจื•ื™ืก. ื“ืขืจื ืึธืš ืึท ืฉืจื™ืคื˜ ืื™ื– ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื™ืฃ ื“ื™ ืคึผืึทืœืึทืกื™ื›ืึธื•ืœื“ืขืจ ืก ื—ืฉื‘ื•ืŸ, ืึทืœืึทื•ื™ื ื’ ื‘ืœื•ื™ื– ื“ื™ ืขืงืกื˜ืฉืึทื ื’ืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ื•ื•ืึธืก ื˜ืจืขืคืŸ ื–ื™ื›ืขืจ ื˜ื ืึธื™ื ืฆื• ื–ื™ื™ืŸ ืขืงืกืึทืงื™ื•ื˜ืึทื“.

ืฆื• ืคืึทืจืžื™ื™ื“ืŸ ื˜ืึธืคึผืœ ืกืคึผืขื ื“ื™ื ื’, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืขื˜ืŸ ื“ืขื ื‘ืึทื ื™ืฆืขืจ ืฆื• ืฉื™ืงืŸ ืึท ื“ืึทื˜ืึทื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืฆื• ื“ื™ ืคึผืึทืœืึทืกื™ื›ืึธื•ืœื“ืขืจ ืก ื—ืฉื‘ื•ืŸ ืื™ืŸ ืฉื˜ื™ื™ึทื’ืŸ ืžื™ื˜ (ืฉืœื™ืกืœ, ื•ื•ืขืจื˜) = (ืคึผื•ืจื˜ืฉืึทืกืขื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸื™ื“, ืกืขืœืœืึธืจื“ืขืจื™ื“) ืื•ืŸ ืคืึทืจื•ื•ืขืจืŸ ืฉื™ืงืŸ ื“ืึทื˜ืึทื˜ืจืึทื ืกืึทืงื˜ื™ืึธื ืก ืžื™ื˜ ืึท ืฉืœื™ืกืœ ื•ื•ืึธืก ืื™ื– ืฉื•ื™ืŸ ื’ืขื ื™ืฆื˜.

ื“ืขืจื™ื‘ืขืจ, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืก ืคึผืจืึธื•ื•ืขืก ืžื•ื–ืŸ ืึทื ื˜ื”ืึทืœื˜ืŸ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืฉื™ื™ึทืŸ ืคื•ืŸ ื“ื™ ืงื•ื™ืคืŸ ืคื•ืŸ ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ื˜ืึธืงืขืŸ. ื“ื™ ืงืจืึทื ื˜ืงื™ื™ึทื˜ ืคึผืึธืจ ืžื•ื–ืŸ ื–ื™ื™ืŸ ื“ื™ ื–ืขืœื‘ืข ื•ื•ื™ ืื™ืŸ ื“ื™ ืงื•ื™ืคืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ. ื“ื™ ืคึผืจื™ื™ึทื– ืžื•ื–ืŸ ืื•ื™ืš ื–ื™ื™ืŸ ื’ืœื™ื™ึทืš ืฆื• ื“ื™ ืคืึทืจืคืขืกื˜ื™ืงื˜ ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืงื•ื™ืคืŸ, ืžื™ื ื•ืก ื“ื™ ืคึผืจื™ื™ึทื– ืคื•ืŸ ืคืึทืจื–ื™ื›ืขืจื•ื ื’.

ืขืก ืื™ื– ืคืืจืฉื˜ืื ืขืŸ ืึทื– ื“ืขืจื ืึธืš, ื“ืขืจ ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ื—ืฉื‘ื•ืŸ ืงื•ื™ืคื˜ ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ื˜ืึธืงืขื ืก ืคื•ืŸ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืื™ืŸ ืึท ืคึผืจื™ื™ึทื– ื ื™ื˜ ื ื™ื“ืขืจื™ืงืขืจ ื•ื•ื™ ื“ื™ ื•ื•ืึธืก ืขืจ ืคึผืขืจื˜ืฉืึทืกื˜ ื–ื™ื™: ื“ื™ ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ื—ืฉื‘ื•ืŸ ืงืจื™ื™ื™ืฅ ืึทืŸ ืขืงืกื˜ืฉืึทื ื’ืข ื˜ืจืึทื ื–ืึทืงืฉืึทืŸ, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืฆื™ื™ื›ืŸ ื“ื™ ืกื“ืจ (ืื•ื™ื‘ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืจื™ื›ื˜ื™ืง), ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ื—ืฉื‘ื•ืŸ ืฆื™ื™ื›ืŸ ื“ื™ ืจื’ืข ืกื“ืจ ืื•ืŸ ื“ื™ ื’ืื ืฆืข ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื•ืŸ ืกืขื ื“ื– ืขืก ืฆื• ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ.

ืื•ื™ื‘ ืงื™ื™ืŸ ืงื•ื™ืคืŸ ืึทืงืขืจื–, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ืึทืŸ ืขืงืกื˜ืฉืึทื ื’ืข ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืœื•ื™ื˜ ื“ื™ ื›ึผืœืœื™ื ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ื™ ืฉืจื™ืคื˜ ืื•ืŸ ืฉื™ืงืŸ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืฆื• ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ. ื“ืขื ื•ื•ืขื’ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืงืขื ืขืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ ื“ื™ ื’ืขืœื˜ ืคืืจื‘ืจืื›ื˜ ืื•ื™ืฃ ื“ื™ ืงื•ื™ืคืŸ ืคื•ืŸ ืคืึทืจื–ื™ื›ืขืจื˜ ื˜ืึธืงืขื ืก.

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

ืึท ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ืกื™ืžืขืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืžืื›ื˜ ืึท ืงืœื•ื’ ืึทืกืขื˜, ืœืžืฉืœ, ืฆื• ืคืึทืจื•ื•ืขืจืŸ ื“ื™ ืึทืจื™ื‘ืขืจืคื™ืจืŸ ืฆื• ื“ืจื™ื˜ ืคึผืึทืจื˜ื™ืขืก.

ื“ืขืจ ืกื›ืขืžืข ืงืขื ืขืŸ ืื•ื™ืš ื–ื™ื™ืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืคึฟืึทืจ crowdfunding ื˜ืึธืงืขื ืก, ื•ื•ืึธืก ื–ืขื ืขืŸ ืื•ืžื’ืขืงืขืจื˜ ืฆื• ื“ื™ ืึธื•ื ืขืจื– ืื•ื™ื‘ ื“ื™ ืคืืจืœืื ื’ื˜ ืกื•ืžืข ืื™ื– ื ื™ืฉื˜ ื’ืขื–ืืžืœื˜.

ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื˜ืึทืงืกื™ื–

ืกืžืึทืจื˜ ืงืึทื ื˜ืจืึทืงืฅ ื–ืขื ืขืŸ ืื•ื™ืš ืึธื ื•ื•ืขื ื“ืœืขืš ืื™ืŸ ืงืึทืกืขืก ื•ื•ื• ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ื–ืึทืžืœืขืŸ ืฉื˜ื™ื™ึทืขืจ ืื•ื™ืฃ ื™ืขื“ืขืจ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืžื™ื˜ ืขื˜ืœืขื›ืข ื˜ื™ื™ืคึผืก ืคื•ืŸ ืึทืกืขืฅ. ื“ืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ื“ื•ืจืš ืึท ื ื™ื™ึท ืึทืกืขื˜ ืžื™ื˜ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื ื˜ืขืจืฉื˜ื™ืฆื•ื ื’ ืคึฟืึทืจ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืžื™ื˜ ืงืœื•ื’ ืึทืกืขืฅ:

1. ืžื™ืจ ืึทืจื•ื™ืกื’ืขื‘ืŸ FeeCoin, ื•ื•ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืฉื™ืงื˜ ืฆื• ื™ื•ื–ืขืจื– ืื™ืŸ ืึท ืคืึทืจืคืขืกื˜ื™ืงื˜ ืคึผืจื™ื™ึทื–: 0,01 ื•ื•ืึทื•ื•ืขืก = 0,001 ืคืขืขืงืึธื™ืŸ.

2. ืฉื˜ืขืœืŸ ืกืคึผืึธื ืกืึธืจืฉื™ืคึผ ืคึฟืึทืจ FeeCoin ืื•ืŸ ื•ื•ืขืงืกืœ ืงื•ืจืก: 0,001 ื•ื•ืึทื•ื•ืขืก = 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
}

ืื™ืฆื˜ ื™ืขื“ืขืจ ืžืึธืœ ื•ื•ืขืŸ ืขืžืขืฆืขืจ ื˜ืจืึทื ืกืคืขืจืก ืขืŸ ืงืœื•ื’ ืึทืกืขืฅ, ื–ื™ื™ ื•ื•ืขื˜ ื’ืขื‘ืŸ ืื™ืจ ืคืขืขืงืึธื™ืŸ ืื™ืŸ ื“ื™ ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืขืŸ / ื˜ืึทืงืกื“ื™ื•ื•ื™ืกืึธืจ (ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืคึผืขืจื˜ืฉืึทืกื˜ ืคื•ืŸ ืื™ืจ ื‘ื™ื™ึท 10 * ืขืŸ / ืฉื˜ื™ื™ึทืขืจ ื“ื™ื•ื•ื™ืกืึธืจ ื›ื•ื•ืืœื™ืขืก), ืื•ืŸ ืื™ืจ ื•ื•ืขื˜ ื’ืขื‘ืŸ ื“ื™ ืžื™ื™ื ืขืจ ืขืŸ / ืฉื˜ื™ื™ึทืขืจ ื“ื™ื•ื•ื™ืกืึธืจ ื›ื•ื•ืืœื™ืขืก. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื“ื™ื™ืŸ ื ื•ืฅ (ืฉื˜ื™ื™ึทืขืจ) ื•ื•ืขื˜ ื–ื™ื™ืŸ 9 * ืขืŸ / ื˜ืึทืงืกื“ื™ื•ื•ื™ืกืึธืจ ื›ื•ื•ืืœื™ืขืก.

ืื™ืจ ืงืขื ื˜ ืื•ื™ืš ื“ื•ืจื›ืคื™ืจืŸ ื‘ืึทืฉื˜ื™ื™ึทืขืจื•ื ื’ ื ื™ืฆืŸ ืึท ืงืœื•ื’ ืึทืกืขื˜ ืฉืจื™ืคื˜ ืื•ืŸ MassTransferTransaction:

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

ืงืึทืฉื‘ืึทืงืง ืื•ืŸ ืœื•ื™ืึทืœื˜ื™ ืžื’ื™ืœื”

ืงืึทืฉื‘ืึทืงืง ืื™ื– ืึท ื˜ื™ืคึผ ืคื•ืŸ ืœื•ื™ืึทืœื˜ื™ ืคึผืจืึธื’ืจืึทื ืื™ืŸ ื•ื•ืึธืก ื“ื™ ืงื•ื™ื ืข ื‘ืึทืงื•ืžืขืŸ ืฆื•ืจื™ืง ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ืกื•ืžืข ืคืืจื‘ืจืื›ื˜ ืื•ื™ืฃ ืึท ืคึผืจืึธื“ื•ืงื˜ ืึธื“ืขืจ ื“ื™ื ืกื˜.

ื•ื•ืขืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ื“ืขื ืคืึทืœ ืžื™ื˜ ืึท ืงืœื•ื’ ื—ืฉื‘ื•ืŸ, ืžื™ืจ ืžื•ื–ืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืคึผืจืึธื•ื•ืขืก ืื•ื™ืฃ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขื’ ื•ื•ื™ ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื˜ืืŸ ืื™ืŸ ื“ื™ ืคืึทืจื–ื™ื›ืขืจื•ื ื’ ืคืึทืœ. ืฆื• ืคืึทืจืžื™ื™ึทื“ืŸ ื˜ืึธืคึผืœ ืกืคึผืขื ื“ื™ื ื’, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืžื•ื–ืŸ ืฉื™ืงืŸ ืึท ื“ืึทื˜ืึทื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืžื™ื˜ (ืฉืœื™ืกืœ, ื•ื•ืขืจื˜) = (ืคึผื•ืจื˜ืฉืึทืกืขื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸื™ื“, ืงืึทืฉื‘ืึทืงืงื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸื™ื“) ืื™ื™ื“ืขืจ ืขืจ ื‘ืืงื•ืžืขืŸ ืงืึทืฉื‘ืึทืงืง.

ืžื™ืจ ืžื•ื–ืŸ ืื•ื™ืš ืฉื˜ืขืœืŸ ืึท ืคืึทืจื‘ืึธื˜ ืื•ื™ืฃ ื™ื’ื–ื™ืกื˜ื™ื ื’ ืฉืœื™ืกืœืขืŸ ื ื™ืฆืŸ DataTransaction. 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’