Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΡ ΠΈ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ ΡΠ°ΠΊΠΈΡ
ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠ°ΠΊ ΠΎΠΏΡΠΈΠΎΠ½Ρ, ΡΡΡΡΠ΅ΡΡΡ ΠΈ Π²Π΅ΠΊΡΠ΅Π»Ρ.
ΠΠΏΡΠΈΠΎΠ½
ΠΠΏΡΠΈΠΎΠ½ β Π±ΠΈΡΠΆΠ΅Π²ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, Π΄Π°ΡΡΠΈΠΉ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΡΠ°Π²ΠΎ ΠΊΡΠΏΠΈΡΡ Π°ΠΊΡΠΈΠ² ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΠ΅Π½Π΅ ΠΈΠ»ΠΈ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π΄Π°ΡΡ, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ Π΅Π³ΠΎ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ:
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅Ρ Π΄Π»Ρ ΡΠ°ΠΌΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½ΠΎΠ² ΠΊΠ°ΠΊ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΠΈ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½Ρ Π΄Π»Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΠ»Ρ Π±ΠΈΡΠΆΠΈ ΠΈ Π²ΡΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠΏΡΠΈΠΎΠ½Ρ. Π£ΡΠ°ΡΡΠ½ΠΈΠΊ-Π±ΠΈΡΠΆΠ° ΠΎΠ±Π΅ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠ΄Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π°ΡΡΠ΅ΡΠ° ΠΏΠΎ ΡΠ΅Π½Π΅ sellPrice ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΡΠΎΡΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΎΠ² expirationStart ΠΈ expirationEnd).
Π ΠΊΠΎΠ΄Π΅ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅ΡΠ° ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΡΠΎ ΠΎΠ½ ΡΠΎΡΠ³ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Π²ΡΡΠΎΡΠ°ΠΌΠΈ, ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, ΠΎΡΡΠ°Π²ΠΈΠΌ Π²ΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ» Π½Π° ΠΊΠΎΠ΄ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°-Π±ΠΈΡΠΆΠΈ.
ΠΠΎΠ΄ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅ΡΠ°:
let expirationStart = 100000
let expirationEnd = 101440
match tx {
case some : ExchangeTransaction | TransferTransaction =>
height > expirationStart && height <= expirationEnd
case _ => false
}
ΠΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ: ΡΡΠ°ΡΡΠ½ΠΈΠΊ-Π±ΠΈΡΠΆΠ° ΠΏΡΠΎΠ΄Π°Π΅Ρ ΠΎΠΏΡΠΈΠΎΠ½Ρ Π½Π° ΠΏΠΎΠΊΡΠΏΠΊΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π°ΡΡΠ΅ΡΠ°, ΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ»Π°ΡΡ ΡΡΠΈ ΠΎΠΏΡΠΈΠΎΠ½Ρ ΠΈΠ»ΠΈ ΡΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΠΈΠΌΠΈ. Π§ΡΠΎΠ±Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΏΡΠ°Π²ΠΎΠΌ Π½Π° ΠΏΠΎΠΊΡΠΏΠΊΡ, ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΡΠΈΠΎΠ½ΠΎΠ² Π½Π° ΡΡΠ΅Ρ ΠΏΡΠΎΠ΄Π°Π²ΡΠ°, ΡΠΎ Π΅ΡΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°-Π±ΠΈΡΠΆΠΈ. ΠΠ°Π»Π΅Π΅ ΠΎΠ½ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎΠΌ ΡΡΠ°Π½ΡΡΠ΅ΡΠ΅ Π² ΡΡΠ΅ΠΉΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°-Π±ΠΈΡΠΆΠΈ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠ΅ΠΌ ExchangeTransaction ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ ΠΏΠΎΠΊΡΠΏΠΊΠΈ-ΠΏΡΠΎΠ΄Π°ΠΆΠΈ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΉΡΠΈ.
Π ΠΊΠΎΠ΄Π΅ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π»ΡΠ±Π°Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡΠ°Ρ ΡΠ΅ΡΠ΅Π· Π½Π΅Π³ΠΎ ExchangeTransaction Π΄Π»Ρ ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π°ΠΊΡΠ° ΠΏΠΎΠΊΡΠΏΠΊΠΈ-ΠΏΡΠΎΠ΄Π°ΠΆΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, ΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊ ΠΏΠΎΠΊΡΠΏΠ°Π΅Ρ ΡΠΎΠ²Π½ΠΎ ΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠ½ΠΈΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» Π½Π° ΡΡΠ΅Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°-Π±ΠΈΡΠΆΠΈ. ΠΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ DataTransaction ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠ΅ΠΌ ΡΡΠ°Π½ΡΡΠ΅ΡΠ΅, ΡΡΠΎΠ±Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊ-Π±ΠΈΡΠΆΠ° ΠΌΠΎΠ³ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΡΡΠ°ΡΡ. Π ΡΡΠΎΠΉ DataTransaction ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΊΠ»Π°Π΄Π΅Ρ ΠΏΠΎ ΠΊΠ»ΡΡΡ, ΡΠ°Π²Π½ΠΎΠΌΡ Π΅Π³ΠΎ Π°Π΄ΡΠ΅ΡΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ°Π²Π½ΠΎΠ΅ ΡΠΈΡΠ»Ρ ΠΎΠΏΡΠΈΠΎΠ½ΠΎΠ² ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π½ΡΡ Π½Π° ΡΡΠ΅Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°-Π±ΠΈΡΠΆΠΈ, ΡΠΎ Π΅ΡΡΡ ΡΠΈΡΠ»Ρ ΡΠ½ΠΈΡΠΎΠ² Π°ΡΡΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΊΡΠΏΠΈΡΡ.
ΠΠΎΠ΄ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°:
#Π²Π»Π°Π΄Π΅Π»Π΅Ρ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ ΠΏΡΠΎΠ΄Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ½ΠΈΡΠΎΠ² Π°ΡΡΠ΅ΡΠ°
#ΠΏΠΎ ΡΠ΅Π½Π΅ sellPrice ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΡΠΎΡΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΎΠ² expirationStart ΠΈ expirationEnd
let expirationStart = 100000
let expirationEnd = 101440
let sellPrice = 10000
let amountAsset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let priceAsset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#ID Π°ΡΡΠ΅ΡΠ°-ΠΎΠΏΡΠΈΠΎΠ½Π°
let optionsAsset = base58'7jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π°Π΄ΡΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ
let this = tx.sender
match tx {
case dataTx : DataTransaction =>
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ½ΠΈΡΠΎΠ² ΠΈΠ· Π΄Π°ΡΠ°-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΠΎ ΠΊΠ»ΡΡΡ (ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ)
let units = extract(getInteger(dataTx.data, dataTx.data[0].key))
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΡΡΠ°Π½ΡΡΠ΅Ρ-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½ΠΎΠ² ΠΈΠ· ΠΏΡΡΡΠ°
let e = transactionById(dataTx.proofs[2]) #
match e {
case transferTx : TransferTransaction =>
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΡΡΠ°Π½ΡΡΠ΅Ρ Π±ΡΠ» Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ Π°Π΄ΡΠ΅Ρ
(transferTx.recipient == this) &&
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π½Π°ΠΏΠΈΡΠ°Π» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΡΡΠ° ΡΠ²ΠΎΠΉ ID
dataTx.data[0].key == toBase58String(transferTx.sender.bytes) &&
sigVerify(dataTx.bodyBytes, dataTx.proofs[0], transferTx.senderPublicKey) &&
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ½ΠΈΡΠΎΠ² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΡΠ»Π°Π½Π½ΠΎΠΌΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ ΠΎΠΏΡΠΈΠΎΠ½ΠΎΠ²
(units == transferTx.amount) &&
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ Π±ΡΠ» ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ Π°ΡΡΠ΅Ρ-ΠΎΠΏΡΠΈΠΎΠ½
(transferTx.assetId == optionsAsset)
case _ => false
} &&
size(dataTx.data) == 1 && !isDefined(getInteger(this, dataTx.data[0].key))
&& height > expirationStart && height <= expirationEnd
case exchangeTx : ExchangeTransaction =>
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ ΠΎΠ±ΠΌΠ΅Π½ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ
let correctAssetPair = exchangeTx.sellOrder.assetPair.amountAsset == amountAsset &&
exchangeTx.sellOrder.assetPair.priceAsset == priceAsset
let correctPrice = exchangeTx.sellOrder.price == sellPrice
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°ΡΠ°-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΈΠ· ΠΏΡΡΡΠ°
let d = transactionById(exchangeTx.proofs[2])
match d{
case dataTx : DataTransaction =>
let buyOrderSender = dataTx.data[0].key
toBase58String(exchangeTx.buyOrder.sender.bytes) == buyOrderSender &&
exchangeTx.amount == extract(getInteger(dataTx.data, buyOrderSender))
case _ => false
} &&
exchangeTx.sellOrder.sender == this &&
correctAssetPair && correctPrice &&
height > expirationStart && height <= expirationEnd
case _ => false
}
Π€ΡΡΡΠ΅ΡΡΡ Π½Π° ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°Ρ
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠΏΡΠΈΠΎΠ½Π°, ΡΡΡΡΠ΅ΡΡ (ΡΡΡΡΠ΅ΡΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ) β ΡΡΠΎ Π½Π΅ ΠΏΡΠ°Π²ΠΎ, Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΡΠΎΠ²Π΅ΡΡΠΈΡΡ ΠΏΠΎΠΊΡΠΏΠΊΡ Π°ΠΊΡΠΈΠ²Π° ΠΏΠΎ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠΌ ΡΠ΅Π½Π΅ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ.
Π ΡΠ΅Π»ΠΎΠΌ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΡΠ΅ΡΡΠ° ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½Π°. ΠΠ΄Π΅ΡΡ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅Ρ Π²ΡΡΡΡΠΏΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΡΡΠ΅ΡΡΠ°.
Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΈ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ, ΠΈ ΠΏΡΠΎΠ΄Π°Π²Π΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Ρ Π½Π° ΠΏΠΎΠΊΡΠΏΠΊΡ. Π€ΡΡΡΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. ΠΠ½Π°ΡΠΈΡ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ΄Π°Π²Π΅Ρ ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊ ΠΎΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΎΡ ΡΠ²ΠΎΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ², Π»ΡΠ±ΠΎΠΉ ΡΡΠ°ΡΡΠ½ΠΈΠΊ ΡΠ΅ΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΠΈΡΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΡΡΡΠ΅ΡΡ.
Π‘ΠΊΡΠΈΠΏΡ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ Π²ΡΠ΅ TransferTransaction ΠΈ ExchangeTransaction Π°ΡΡΠ΅ΡΠ°-ΡΡΡΡΠ΅ΡΡΠ°, ΠΎΠ΄ΠΎΠ±ΡΡΡ ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊ-ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΡΠΎΠ·Π΄Π°Π» ΠΎΡΠ΄Π΅Ρ Π½Π° Π±ΡΠ΄ΡΡΡΡ ΠΏΠΎΠΊΡΠΏΠΊΡ Π°ΡΡΠ΅ΡΠ°-ΡΡΡΡΠ΅ΡΡΠ° Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°-Π±ΠΈΡΠΆΠΈ.
ΠΡΠΎΡ ΠΎΡΠ΄Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠΏΡΡΠ΅Π½ ΡΡΡΡΠ΅ΡΡ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΡΠ΄Π΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅ΡΡΠΈ Π²ΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠ»Ρ Π² ΡΡΠ΅ΠΉΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°-ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π±Π°ΠΉΡΠΎΠ²ΡΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠ΄Π΅ΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΈΠ·Π²Π½Π΅.
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ RIDE Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π°ΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³Π° Π±Π°ΠΉΡΠΎΠ² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π½ΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠΊΠΊΠ°ΡΠ½Ρ Ρ ΠΌΡΠ»ΡΡΠΈ-ΠΏΠΎΠ΄ΠΏΠΈΡΡΡ / ΠΡΠΊΡΠΎΡ
ΠΠΊΠΊΠ°ΡΠ½Ρ Ρ ΠΌΡΠ»ΡΡΠΈ-ΠΏΠΎΠ΄ΠΏΠΈΡΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π°ΠΊΡΠΈΠ²Π°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π°ΠΊΡΠΈΠ²Π°ΠΌΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π»ΠΈΡΡ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ΅ΠΉ ΡΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ· ΡΠ΅ΡΡΡΠ΅Ρ ). ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² Ρ ΠΌΡΠ»ΡΡΠΈ-ΠΏΠΎΠ΄ΠΏΠΈΡΡΡ Π² ΡΠ·ΡΠΊΠ΅ RIDE ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ.
ΠΠΊΠΊΠ°ΡΠ½Ρ Ρ ΠΌΡΠ»ΡΡΠΈ-ΠΏΠΎΠ΄ΠΏΠΈΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΡΠΊΡΠΎΡ-ΡΡΠ΅ΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π΅Π½Π΅ΠΆΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Ρ ΡΠ°Π½ΡΡΡΡ Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΡΠΎΠ½Π°ΠΌΠΈ, Π·Π°ΠΊΠ»ΡΡΠΈΠ²ΡΠΈΠΌΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ, Π²Π·ΡΡΡΡ Π½Π° ΡΠ΅Π±Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ².
let alicePubKey = base58'5AzfA9UfpWVYiwFwvdr77k6LWupSTGLb14b24oVdEpMM'
let bobPubKey = base58'2KwU4vzdgPmKyf7q354H9kSyX9NZjNiq4qbnH2wi2VDF'
let cooperPubKey = base58'GbrUeGaBfmyFJjSQb9Z8uTCej5GzjXfRDVGJGrmgt5cD'
#Π²ΡΡΡΠ½ΡΠ΅ΠΌ, ΠΊΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ» ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ
let aliceSigned = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey)) then 1 else 0
let bobSigned = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey)) then 1 else 0
let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey)) then 1 else 0
#ΡΡΠΌΠΌΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΈΡ
ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ
aliceSigned + bobSigned + cooperSigned >= 2
Π£ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ ΡΠ΅Π΅ΡΡΡ β token curated registry (TCR)
ΠΠ° ΠΌΠ½ΠΎΠ³ΠΈΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎΠΊΡΠΈΡΠ½ΡΡ Π°ΡΡΠ΅ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°ΡΡ Π°ΡΡΠ΅Ρ Π½Π° Waves ΠΌΠΎΠΆΠ΅Ρ Π»ΡΠ±ΠΎΠΉ Π°Π΄ΡΠ΅Ρ, Π·Π°ΠΏΠ»Π°ΡΠΈΠ²ΡΠΈΠΉ ΠΊΠΎΠΌΠΈΡΡΠΈΡ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Π·Π°ΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΡΠ°ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΠΎΡ ΡΠΎΠΊΡΠΈΡΠ½ΡΡ Π°ΡΡΠ΅ΡΠΎΠ² ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ΅ΡΠΈΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ ΡΠ΅Π΅ΡΡΡ β token curated registry (TCR), β Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΠΉ Π΄Π΅ΡΠΆΠ°ΡΠ΅Π»ΡΠΌΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ².
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°ΡΡ Π·Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π° Π² ΡΠΏΠΈΡΠΎΠΊ, Π΄Π΅ΡΠΆΠ°ΡΠ΅Π»Ρ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠ°Π²ΠΊΡ, ΡΠ°Π²Π½ΡΡ Π΅Π³ΠΎ Π΄ΠΎΠ»Π΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΎΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π° Π²ΡΠΏΡΡΠ΅Π½Π½ΡΡ . Π’ΠΎΠΊΠ΅Π½ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠ΅Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π·Π° ΡΡΠΎ ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π΅Π³ΠΎ Π΄Π΅ΡΠΆΠ°ΡΠ΅Π»Π΅ΠΉ.
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π² ΡΠΏΠΈΡΠΎΠΊ Π½Π° ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ (Π² ΠΏΠ΅ΡΠΈΠΎΠ΄ Β«challengeΒ») ΠΏΠΎ ΠΊΠ»ΡΡΡ ΡΡΠ΅ΠΉΡΠ° key = asset_name, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ count = 0.
Π’Π°ΠΊΠΆΠ΅ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΊΠΎΡΠ΅Π»ΡΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ Π±Π°Π»Π°Π½Ρ ΡΡΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π°. ΠΠ°ΡΠ΅ΠΌ Π½Π°ΡΡΡΠΏΠ°Π΅Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ΄Π°ΡΡ Π³ΠΎΠ»ΠΎΡ Π·Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π°ΡΡΠ΅Ρ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΊΠΎΡΠ΅Π»ΡΠΊΠ΅, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ°Π·Ρ, ΠΏΠΎΡΡΠ°Π²ΠΈΠ² ΠΎΡΠ΅Π½ΠΊΡ ΠΎΡ 1 Π΄ΠΎ 10. ΠΠΎΠ»ΠΎΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΊΠ»ΡΡΠ°ΠΌΠΈ Π²ΠΈΠ΄Π° user_address+assetID.
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let addingStartHeight = 1000
let votingStartHeight = 2000
let votingEndHeight = 3000
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π°Π΄ΡΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ
let this = extract(tx.sender)
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π°Π΄ΡΠ΅Ρ ΠΈΠ· ΠΏΡΡΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
let address = addressFromPublicKey(tx.proofs[1])
match tx {
case t: DataTransaction =>
if(height > addingStartHeight)
then(
if(height < votingStartHeight)
then(
#adding
#Π²ΡΡΡΠ½ΡΠ΅ΠΌ, Π΅ΡΡΡ Π»ΠΈ ΡΡΠΎΡ Π°ΡΡΠ΅Ρ Ρ ΡΡΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ°
let hasTokens = assetBalance(address, asset) > 0
size(t.data) == 1
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΡΡΠΎΡ Π°ΡΡΠ΅Ρ Π΅ΡΠ΅ Π½Π΅ Π±ΡΠ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
&& !isDefined(getInteger(this, toBase58String(asset)))
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΠΏΠΎ ΠΊΠ»ΡΡΡ-Π°ΡΡΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎΠ΅ 0
&& extract(getInteger(t.data, toBase58String(asset))) == 0
&& hasTokens
)
else(
if(height < votingEndHeight)
then
(
#voting
#ΡΠ·Π½Π°Π΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π³ΠΎΠ»ΠΎΡΠΎΠ² Π·Π° Π΄Π°Π½Π½ΡΠΉ Π°ΡΡΠ΅Ρ ΠΈ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ
let currentAmount = extract(getInteger(this, toBase58String(asset)))
let newAmount = extract(getInteger(t.data, toBase58String(asset)))
let betString = toBase58String(address.bytes) + toBase58String(asset)
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΡΡΠΎΡ Π°Π΄ΡΠ΅Ρ Π΅ΡΠ΅ Π½Π΅ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π» Π·Π° ΡΡΠΎΡ Π°ΡΡΠ΅Ρ
let noBetBefore = !isDefined(getInteger(this, betString))
let isBetCorrect = extract(getInteger(t.data, betString)) > 0
&& extract(getInteger(t.data, betString)) <= 10
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ Ρ Π³ΠΎΠ»ΠΎΡΡΡΡΠ΅Π³ΠΎ Π΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠΎΠΊΠ΅Π½Ρ
let hasTokens = assetBalance(address, asset) > 0
#ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
size(t.data) == 2 && isDefined(getInteger(this, toBase58String(asset)))
&& newAmount == currentAmount + 1
&& noBetBefore && isBetCorrect && hasTokens
)
else false
) && sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1])
)
else false
case _ => false
}
ΠΠ±ΠΎΠ½Π΅Π½ΡΡΠΊΠ°Ρ ΠΏΠ»Π°ΡΠ°
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ² Π΄Π»Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ
ΠΏΠ»Π°ΡΠ΅ΠΆΠ΅ΠΉ Π·Π° ΡΠΎΠ²Π°Ρ ΠΈΠ»ΠΈ ΡΡΠ»ΡΠ³Ρ ΡΠ΅ΡΠ΅Π· Π·Π°Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ β Β«Π°Π±ΠΎΠ½Π΅Π½ΡΡΠΊΠΎΠΉ ΠΏΠ»Π°ΡΡΒ».
ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΡ (ΡΠ΅ΡΠ΅Π· ΠΏΡΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ) ID TransferTransaction Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π½ΡΡ
ΡΡΠ΅Π΄ΡΡΠ², ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² ΡΡΠ΅ΠΉΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° {key: address, value: true}.
ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π° ΡΠΎΠ²Π°Ρ ΠΈΠ»ΠΈ ΡΡΠ»ΡΠ³Ρ. ΠΠΎΠ³Π΄Π° ΡΡΠΎΠΊ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ ΠΈΡΡΠ΅ΡΠ΅Ρ, Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΅ΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π°ΠΏΡΠΎΡΠΈΠ² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠ»ΡΡΠ° Π² ΡΡΠ΅ΠΉΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ false.
let subscriptionPeriod = 44000
let signature = tx.proofs[0]
let pk = tx.proofs[1]
let requiredAmount = 100000
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π°Π΄ΡΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ
let this = extract(tx.sender)
match tx {
case d: DataTransaction =>
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠ»Π°ΡΠ΅ΠΆΠ°
let lastPaymentHeight = extract(getInteger(this, d.data[0].key + "_lastPayment"))
size(d.data) == 1 && d.data[0].value == "false" && lastPaymentHeight + subscriptionPeriod < height
||
(
let address = d.data[0].key
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΡΡΠ°Π½ΡΡΠ΅Ρ-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΏΠΎ ID, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π² ΠΏΡΡΡΠ°Ρ
let ttx = transactionById(d.proofs[0])
size(d.data) == 2
&& d.data[0].value == "true"
&& d.data[1].key == address + "_lastPayment"
&& match ttx {
case purchase : TransferTransaction =>
d.data[1].value == transactionHeightById(purchase.id)
&& toBase58String(purchase.sender.bytes) == address
&& purchase.amount == requiredAmount
&& purchase.recipient == this
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ Π°ΡΡΠ΅Ρ waves
&& !isDefined(purchase.assetId)
case _ => false
}
)
case _ => false
}
ΠΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΠ΅
Π‘ΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½ΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅. ΠΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π° Π»ΡΡΡΠΈΠΉ ΠΎΡΡΠ΅Ρ Π°ΠΌΠ±Π°ΡΡΠ°Π΄ΠΎΡΠ° Π² ΡΠ°ΠΌΠΊΠ°Ρ Π°ΠΌΠ±Π°ΡΡΠ°Π΄ΠΎΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π‘ΡΠ΅ΠΉΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π³ΠΎΠ»ΠΎΡΠΎΠ² Π·Π° ΡΠΎΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌ, ΠΊΡΠΎ ΠΏΡΠΈΠΎΠ±ΡΠ΅Π» ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ βΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅β ΡΠΎΠΊΠ΅Π½Ρ. Π£ΡΠ°ΡΡΠ½ΠΈΠΊ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ DataTransaction Ρ ΠΏΠ°ΡΠΎΠΉ (key, value) = (purchaseTransactionId, buyTransactionId). Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΊΠ»ΡΡΡ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΠΎΠΉ Π°Π΄ΡΠ΅Ρ ΠΈ Π²Π°ΡΠΈΠ°Π½Ρ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ DataEntry ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·. ΠΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄.
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let address = addressFromPublicKey(tx.proofs[1])
let votingStartHeight = 2000
let votingEndHeight = 3000
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π°Π΄ΡΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ
let this = extract(tx.sender)
match tx {
case t: DataTransaction =>
(height > votingStartHeight && height < votingEndHeight) &&
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡ
sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1]) &&
#ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠ΄Π°Π΅Ρ ΡΠ²ΠΎΠΉ Π³ΠΎΠ»ΠΎΡ Π½Π°ΠΏΡΠΎΡΠΈΠ² ΡΠ²ΠΎΠ΅Π³ΠΎ Π°Π΄ΡΠ΅ΡΠ°
if (t.data[0].key == toBase58String(address.bytes))
then (
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π° ΠΈΠ· ΠΏΡΡΡΠΎΠ²
let purchaseTx = transactionById(t.proofs[7])
match purchaseTx {
case purchase : TransferTransaction =>
let correctSender = purchase.sender == t.sender
let correctAsset = purchase.assetId == asset
let correctPrice = purchase.amount == 1
let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == t.id
correctSender && correctAsset && correctPrice && correctProof
case _ => false
}
)
else
size(t.data) == 1 && !isDefined(getBinary(this, t.data[0].key))
case _ => false
}
ΠΠ΅ΠΊΡΠ΅Π»Ρ
ΠΠ΅ΠΊΡΠ΅Π»Ρ β ΠΏΠΈΡΡΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΠ΄Π½Π° ΡΡΠΎΡΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠ»Π°ΡΠΈΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠΌΠΌΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ Π² Π·Π°ΡΠ°Π½Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π΄Π°ΡΡ.
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½Ρ, Π΄Π°ΡΠ° ΡΠΊΡΠΏΠΈΡΠ°ΡΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π΄Π°ΡΠ΅ Π²ΡΠΏΠ»Π°ΡΡ ΠΏΠΎ Π²Π΅ΠΊΡΠ΅Π»Ρ.
let expiration = 100000
let amount = 10
let asset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
match tx {
case t: TransferTransaction =>
(t.assetId == asset)&&
(t.amount == amount)&&
(t.sender == Bob)&&
(t.recipient == Alice)&&
(sigVerify(t.bodyBytes, t.proofs[0], t.senderPublicKey))&&
(height >= expiration)
case _ => false
}
ΠΠ΅ΠΏΠΎΠ·ΠΈΡ
ΠΠ΅ΠΏΠΎΠ·ΠΈΡ β ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π΅Π½Π΅ΠΆΠ½ΡΡ
ΡΡΠ΅Π΄ΡΡΠ² Π² Π±Π°Π½ΠΊΠ΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
ΡΡΠ»ΠΎΠ²ΠΈΡΡ
(ΡΡΠΎΠΊ, ΠΏΡΠΎΡΠ΅Π½Ρ).
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π±Π°Π½ΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΌΠ°ΡΡ-Π°ΠΊΠΊΠ°ΡΠ½Ρ. ΠΠΎΡΠ»Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π±Π»ΠΎΠΊΠΎΠ², ΡΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠΎΠΊΡ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ°, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΠΈ Π΄Π΅Π½ΡΠ³ΠΈ Ρ ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠΌ. Π ΡΠΊΡΠΈΠΏΡΠ΅ Π·Π°Π΄Π°Π½Π° Π²ΡΡΠΎΡΠ° Π±Π»ΠΎΠΊΠ° (finalHeight), ΠΏΠΎΡΠ»Π΅ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ½ΡΡΡ Π΄Π΅Π½ΡΠ³ΠΈ ΡΠΎ ΡΡΠ΅ΡΠ°.
heightUnit β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π»ΠΎΠΊΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΡΡ, Π³ΠΎΠ΄ ΠΈ Ρ. Π΄.). Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ Ρ ΠΏΠ°ΡΠΎΠΉ (key, value) = (initialTransferTransaction, futureDataTransaction). ΠΠ°ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ TransferTransaction Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΡΡΠΌΠΌΠ΅ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ° ΠΈ ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠ², Π½Π°ΡΠΈΡΠ»Π΅Π½Π½ΡΡ Π·Π° ΠΏΠ΅ΡΠΈΠΎΠ΄ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ°. ΠΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ²Π΅ΡΡΠ΅ΡΡΡ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ TransferTransaction, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΡΡΠ΅ TransferTransaction. depositDivisor β ΡΠΈΡΠ»ΠΎ, ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅ Π΄ΠΎΠ»Π΅ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ° (Π΅ΡΠ»ΠΈ Π΄Π΅ΠΏΠΎΠ·ΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΠΎΠ΄ 10%, Π΄ΠΎΠ»Ρ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ° ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 0,1, Π° depositDevisor = 1/0,1 = 10).
let this = extract(tx.sender)
let depositDivisor = 10
let heightUnit = 1000
let finalHeight = 100000
match tx {
case e : TransferTransaction =>
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π²ΡΡΠΎΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΠΎ ID ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π² ΡΠ΅Π΄ΡΠΌΠΎΠΌ ΠΏΡΡΡΠ΅
let depositHeight = extract(transactionHeightById(e.proofs[7]))
#ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ°
let purchaseTx = transactionById(e.proofs[7])
match purchaseTx {
case deposit : TransferTransaction =>
let correctSender = deposit.sender == e.sender
#ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΡΠ΅Π±Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΡΡΠΌΠΌΡ Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠ° + ΠΏΡΠΎΡΠ΅Π½ΡΡ
let correctAmount = deposit.amount + deposit.amount / depositDivisor * (height - depositHeight) / heightUnit == e.amount
let correctProof = extract(getBinary(this, toBase58String(deposit.id))) == e.id
correctSender && correctProof && correctAmount
case _ => false
}
&& finalHeight <= height
case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}
Π ΡΡΠ΅ΡΡΠ΅ΠΉ ΠΈ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΡΠΎΠΉ ΡΠ΅ΡΠΈΠΈ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΅ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΌΠ°ΡΡ-Π°ΡΡΠ΅ΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ Π·Π°ΠΌΠΎΡΠΎΠ·ΠΊΡ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ².
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com