
په تیرو کې موږ په سوداګرۍ کې د سمارټ حسابونو کارولو ډیری قضیې ولیدلې، په شمول د لیلامونو او وفادارۍ پروګرامونه.
نن ورځ موږ به په دې اړه وغږیږو چې څنګه سمارټ حسابونه او سمارټ شتمنۍ کولی شي د مالي وسایلو لکه اختیارونو، فیوچرونو او بیلونو شفافیت او اعتبار ته وده ورکړي.
اختیار
یو اختیار د تبادلې تړون دی چې پیرودونکي ته حق ورکوي چې په ټاکلې بیه یا د یوې ټاکلې نیټې څخه مخکې شتمني واخلي، مګر هغه مکلف نه کوي چې دا کار وکړي.
د اختیار پلي کول په لاندې ډول کیدی شي:
موږ پخپله د اختیارونو لپاره سمارټ شتمنۍ د وسیلې په توګه کاروو او د ګډون کونکي لپاره سمارټ حساب چې د تبادلې په توګه عمل کوي او اختیارونه مسله کوي. د تبادلې ګډون کونکی ژمنه کوي چې هغه به د یوې ټاکلې شتمنۍ یوه ټاکلې اندازه د پلور قیمت کې د پای ته رسیدو پیل او پای ته رسیدو بلاک لوړوالی ترمنځ وپلوري).
په سمارټ اثاثو کوډ کې، موږ به په ساده ډول وګورو چې دا یوازې د ټاکل شوي لوړوالی ترمنځ سوداګري کیږي، او نور به هیڅ شی ونه ګوري؛ موږ به د تبادلې ګډون کونکي کوډ ته د مقرراتو سره سم ټول مسؤلیت پریږدو.
د سمارټ شتمنۍ کوډ:
let expirationStart = 100000
let expirationEnd = 101440
match tx {
case some : ExchangeTransaction | TransferTransaction =>
height > expirationStart && height <= expirationEnd
case _ => false
}
موږ به فرض کړو چې عملونه په لاندې ډول ترسره کیږي: د تبادلې ګډون کونکی د ځینې شتمنیو پیرودلو لپاره اختیارونه پلوري، او نور ګډون کونکي کولی شي دا اختیارونه وړاندې کړي یا یې تجارت وکړي. د پیرودلو حق کارولو لپاره، احتمالي پیرودونکی باید د مطلوب شمیر انتخابونه د پلورونکي حساب ته انتقال کړي، دا د تبادلې برخه اخیستونکي. بیا، هغه د تبادلې ګډون کونکي دولتي حساب ته د بشپړ شوي لیږد په اړه معلومات لیکي، او یوازې بیا به د تبادلې لیږد د پیرود او پلور د ټاکلو شرایطو سره سم پرمخ ولاړ شي.
د سمارټ حساب په کوډ کې، موږ باید ډاډ ترلاسه کړو چې د پیرود او پلور وروستي عمل لپاره د تبادلې کوم لیږد چې له دې څخه تیریږي ټاکل شوي شرایط پوره کوي، او ګډون کوونکی په سمه توګه د هغه واحدونو شمیر اخلي چې د تبادلې ګډون کونکي حساب ته یې لیږلي. احتمالي پیرودونکی باید د لیږد په اړه سم ډیټا لیږد واستوي ترڅو د تبادلې ګډون کونکی د دوه ځله لګښت څخه مخنیوی وکړي. په دې ډیټا لیږد کې، پیرودونکي د هغه د پتې سره مساوي کلیدي سره سم، د تبادلې ګډون کونکي حساب ته لیږدول شوي اختیارونو شمیر سره مساوي ارزښت، دا د شتمنیو واحدونو شمیر چې هغه یې اخیستلی شي.
د سمارټ حساب کوډ:
#владелец аккаунта дает обязательство продать определенное количество юнитов ассета
#по цене 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
}
په سمارټ حسابونو کې راتلونکي
د یو اختیار برعکس، د فیوچر (د فیوچر قرارداد) حق نه دی، مګر د پیرودونکي مکلفیت دی چې په راتلونکي کې په یوه ټاکلي وخت کې د قرارداد لخوا ټاکل شوي نرخ کې شتمني واخلي.
په عموم کې، د راتلونکي لیکل د اختیار لیکلو ته ورته دي. دلته سمارټ شتمني د راتلونکي په توګه کار کوي.
تاسو اړتیا لرئ ډاډ ترلاسه کړئ چې پیرودونکي او پلورونکي دواړه د پیرود امر لاسلیک کوي. راتلونکی یو مکلفیت دی چې باید په هر حالت کې پوره شي. دا پدې مانا ده چې که چیرې پلورونکي یا ګډون کوونکی خپل مکلفیتونه رد کړي، په شبکه کې هر ګډون کوونکی کولی شي یو لیږد واستوي، پدې توګه راتلونکی اجرا کوي.
د سمارټ شتمنۍ سکریپټ د فیوچر شتمنۍ ټول لیږد لیږدونه او د تبادلې لیږد کنټرولوي، دوی یوازې هغه وخت تصویبوي چې د پیرودونکي ګډون کونکي د تبادلې ګډون کونکي څخه د راتلونکي شتمنۍ راتلونکي پیرود لپاره امر رامینځته کړي.
دا حکم باید د اعتبار وړ وي او هغه شرایط پوره کړي چې له مخې یې فیوچر صادریږي. د امر د اعتبار کولو لپاره، تاسو کولی شئ د لاسلیک شوي امر د بایټ نمایندګۍ سره د پیرودونکي حساب حالت ته د هغې ټولې ساحې داخل کړئ، او بیا بهرنۍ تایید ترسره کړئ.
په اوس وخت کې، 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
د نښه شوي ثبت ثبت (TCR)
ډیری بلاکچین پلیټ فارمونه د زهرجن شتمنیو سره ستونزه لري. د مثال په توګه، هر هغه پته چې کمیشن یې ورکړی وي کولی شي په ویوز کې شتمني رامینځته کړي.
د کاروونکو د ساتنې ستونزه او د بلاکچین پخپله د زهرجن شتمنیو څخه د ټوکن هولډرانو لخوا رامینځته شوي د ټوکن جوړ شوي راجسټری (TCR) لخوا حل کیدی شي.
په لیست کې د اضافه کولو لپاره یو ځانګړي نښه ته د رایې ورکولو لپاره، لرونکی د صادر شوي ټوکنونو ټول شمیر سره د هغه د ونډې سره مساوي داوطلبۍ وړاندې کوي. یوه نښه په راجستر کې شاملیږي که چیرې د هغې ډیری برخه اخیستونکي دې ته رایه ورکړي.
زموږ په مثال کې، موږ کاروونکي ته اجازه ورکوو چې د غور لپاره لیست ته یو نښه اضافه کړي (د "ننګونې" دورې په جریان کې) د دولت کلیدي کلیدي = asset_name په کارولو سره، یوازې که د شمېرنې اوسنی ارزښت = 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 سره د لیږد شوي پیسو اړین مقدار سره چمتو کړي، هغه کولی شي د حساب حالت ته {key: address, value:) ولیکي. رښتيا}.
دا به پدې معنی وي چې کارونکي محصول یا خدمت ته د دوی ګډون تاییدوي. کله چې د ګډون موده پای ته ورسیږي، د شبکې هر کارونکي کولی شي ارزښت په دولت کې د اړونده کیلي تر څنګ وټاکي غلط.
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
}
رایه ورکول
سمارټ حسابونه په بلاکچین کې د رایې ورکولو پلي کولو لپاره کارول کیدی شي. یو مثال به د سفیر پروګرام کې د غوره سفیر راپور لپاره رایه ورکول وي. د حساب حالت د یو ځانګړي اختیار لپاره د رایو ثبتولو لپاره د پلیټ فارم په توګه کارول کیږي.
په دې مثال کې، یوازې هغه کسان چې د "رای ورکولو" ځانګړي ټکي یې اخیستي دي د رایې ورکولو اجازه لري. ګډون کوونکی د ډیټا لیږد دمخه د جوړه (کیلي، ارزښت) = (د پیرود لیږد ID، پیرود لیږد ID) سره لیږي. د دې کیلي لپاره د بل ارزښت ترتیب کول منع دي. د خپل پته او د رای ورکولو اختیار په کارولو سره، تاسو کولی شئ یوازې یو ځل ډاټا انټری تنظیم کړئ. رایه ورکول یوازې په ټاکلې موده کې ممکن دي.
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
}
زیرمه
زیرمه په بانک کې د ځانګړو شرایطو (اصطلاح، سود) لاندې د پیسو ځای پرځای کول دي.
زموږ په مثال کې، د بانک فعالیت د سمارټ حساب لخوا ترسره کیږي. د یو ټاکلی شمیر بلاکونو وروسته، کوم چې د زیرمې دورې سره سمون لري، کاروونکي کولی شي خپلې پیسې د سود سره بیرته ورکړي. سکریپټ د بلاک لوړوالی (وروستی لوړوالی) ټاکي، وروسته له دې چې کاروونکي کولی شي له حساب څخه پیسې وباسي.
heightUnit - د وخت په یو واحد کې د بلاکونو شمیر (د مثال په توګه، میاشت، کال، او نور). لومړی موږ د جوړه سره د ننوتلو لپاره ګورو (کیلي، ارزښت) = (ابتدايي لیږد لیږد، راتلونکي ډیټا لیږد). بیا کارونکی باید د سپارلو لیږد وړاندې کړي چې د زیرمو مقدار او د زیرمې مودې لپاره ترلاسه شوي سود په اړه سم معلومات لري. دا معلومات د اصلي لیږد لیږد په وړاندې چک شوي، کوم چې د اوسني لیږد لیږد ثبوت کې شتون لري. 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)
}
د دې لړۍ په دریمه او وروستۍ مقاله کې، موږ به د سمارټ اثاثو ډیرې کارونې وګورو، په شمول د ځانګړو پتو لپاره د راکړې ورکړې منجمد او محدودول.
سرچینه: www.habr.com
