سلام هر!
В
راځئ چې اوس یو څه جلا شوي ازموینه وکړو
مرحله 3. د dApp حساب ازموینه
د الیس سره سمدلاسه کومې ستونزې ستاسو په وړاندې راپورته کیږي؟ dApp حساب؟
لومړی:
بوب او کوپر ممکن په ناڅاپي ډول د منظم په کارولو سره dApp پتې ته فنډونه واستوي لیږد لیږدونه او پدې توګه به ونشي کولی بیرته دوی ته لاسرسی ومومي.دوهم:
موږ په هیڅ ډول الیس د بوب او/یا کوپر له تصویب پرته د پیسو ایستلو څخه منع نه کوو. له هغه وخته چې، تایید ته پاملرنه وکړئ، د ایلیس څخه ټولې معاملې به اجرا شي.
راځئ چې د ایلیس بندیز په واسطه 2nd حل کړو لیږد معاملې راځئ چې سم شوی سکریپټ ځای په ځای کړو:

موږ هڅه کوو چې د dApp الیس او د هغې لاسلیک څخه سکې وباسو. موږ یوه تېروتنه ترلاسه کوو:
راځئ چې د وتلو له لارې د وتلو هڅه وکړو:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))
سکریپټ کار کوي او موږ دوهم ټکی معلوم کړ!
څلورمه مرحله. د رایې ورکولو سره DAO جوړ کړئ
له بده مرغه، د RIDE ژبه لا تر اوسه دا وړتیا نه ورکوي چې د راټولولو سره کار وکړي (لغت لغتونه، تکرارونکي، کمونکي، او نور). په هرصورت، د فلیټ راټولولو سره د هر ډول عملیاتو لپاره کیلي ارزښت موږ کولی شو د تارونو سره د کار کولو لپاره یو سیسټم ډیزاین کړو، د دې مطابق د کیلي او د دوی ډیکریپشن سره.
تارونه یوځای کول خورا اسانه دي؛ تارونه د شاخصونو لخوا جلا کیدی شي.
راځئ چې د ازموینې مثال په توګه یو تار راټول او تجزیه کړو او وګورو چې دا څنګه د لیږد پایلې اغیزه کوي.
موږ په دې حقیقت بسیا شو چې ایلیس نشي کولی د لیږد لیږد لاسلیک کړي، ځکه چې دا فرصت د دې ډول لیږد لپاره په @verifier کې بند شوی و.
راځئ چې د تارونو سره تمرین وکړو او بیا دا حل کړو.
RIDE تارونه
معامله بیا ممکنه ده، موږ پوهیږو چې څنګه د تارونو سره کار وکړو.

په مجموع کې، موږ د پیچلي منطق لیکلو لپاره اړین هرڅه لرو DAO dApp.
د معلوماتو لیږد
د معلوماتو لیږد:
"د کیلي لپاره اعظمي اندازه 100 حروف دي، او یوه کیلي کولی شي د یونیکوډ کوډ پوائنټونه ولري چې پکې ځایونه او نور د نه چاپ وړ سمبولونه شامل دي. د سټرینګ ارزښتونه د 32,768 بایټس حد لري او د ډیټا لیږد کې د ممکنه ننوتلو اعظمي شمیره 100 ده. په ټولیز ډول د ډیټا لیږد اعظمي اندازه شاوخوا 140kb دی - د حوالې لپاره ، نږدې دقیقا د شکسپیر د لوبې 'رومیو او جولیټ اوږدوالی' '.
موږ د لاندې شرایطو سره DAO جوړوو:
د پیل کولو لپاره د تلیفون له لارې تمویل ترلاسه کولو لپاره فنډونه ترلاسه کړئ() لږ تر لږه د 2 برخه اخیستونکو ملاتړ ته اړتیا ده - د DAO پانګوالو -. وتل دا به په سمه توګه ممکن وي څومره چې ټول په ګوته شوي رایه ورکول د DAO مالکین.
راځئ چې 3 ډوله کیلي جوړ کړو او په 2 نوي فنکشنونو کې د بیلانس سره کار کولو لپاره منطق اضافه کړو ووټ او فنډونه:
xx…xx_ia = پانګه اچوونکي، موجود توازن (رایه، جمع، ایستل)
xx…xx_sv = پیل کول، د رایو شمیر (رایه، د پیسو ترلاسه کول)
xx…xx_sf = پیل کول، د رایو شمیر (رایه، د پیسو ترلاسه کول)
xx…xx = عامه پته (۳۵ حروف)
مهرباني وکړئ په یاد ولرئ چې په رایه کې موږ اړتیا لرو په یوځل کې څو ساحې تازه کړو:
WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),
WriteSet موږ ته اجازه راکوي چې په یوځل کې څو ریکارډونه جوړ کړو invokeScript معاملې
دا هغه څه دي چې د باب او کوپر له ډکولو وروسته د DAO dApp کلیدي ارزښت ذخیره کې ښکاري iaزیرمې:
زموږ د زیرمو فعالیت یو څه بدل شوی دی:
اوس د DAO په فعالیتونو کې ترټولو مهم شیبه راځي - رایه د پروژو د تمویل لپاره.
باب د نیلي د 500000 موجونو پروژې ته رایه ورکوي:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
د ډیټا ذخیره کې موږ د نیلي پتې لپاره ټولې اړینې ننوتنې ګورو:
کوپر هم د نیلي پروژې ته رایه ورکړه.
راځئ چې د فعالیت کوډ ته یو نظر وګورو فنډونه ترلاسه کړئ. نیلي باید لږترلږه 2 رایې راټولې کړي ترڅو وکوالی شي د DAO څخه فنډونه وباسي.
نیلي به د هغې نیمایي پیسې بیرته واخلي چې هغې ته سپارل شوي:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
هغه بریالی کیږي، دا دی، DAO کار کوي!
موږ په ژبه کې د DAO جوړولو پروسې ته کتنه وکړه RIDE4DAPPS.
په لاندې برخو کې به موږ د کوډ بیاکتنې او د قضیې ازموینې ته نږدې کتنه وکړو.
د کوډ بشپړ نسخه
# In this example multiple accounts can deposit their funds to DAO and safely take them back, no one can interfere with this.
# DAO participants can also vote for particular addresses and let them withdraw invested funds then quorum has reached.
# An inner state is maintained as mapping `address=>waves`.
# https://medium.com/waves-lab/waves-announces-funding-for-ride-for-dapps-developers-f724095fdbe1
# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
# deploy()
# From account #1: deposit funds
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
# From account #2: deposit funds
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
# From account #1: vote for startup
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
# From account #2: vote for startup
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
# From account #3: get invested funds
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func deposit() = {
let pmt = extract(i.payment)
if (isDefined(pmt.assetId)) then throw("can hodl waves only at the moment")
else {
let currentKey = toBase58String(i.caller.bytes)
let xxxInvestorBalance = currentKey + "_" + "ib"
let currentAmount = match getInteger(this, xxxInvestorBalance) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount + pmt.amount
WriteSet([DataEntry(xxxInvestorBalance, newAmount)])
}
}
@Callable(i)
func withdraw(amount: Int) = {
let currentKey = toBase58String(i.caller.bytes)
let xxxInvestorBalance = currentKey + "_" + "ib"
let currentAmount = match getInteger(this, xxxInvestorBalance) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount - amount
if (amount < 0)
then throw("Can't withdraw negative amount")
else if (newAmount < 0)
then throw("Not enough balance")
else ScriptResult(
WriteSet([DataEntry(xxxInvestorBalance, newAmount)]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Callable(i)
func getFunds(amount: Int) = {
let quorum = 2
let currentKey = toBase58String(i.caller.bytes)
let xxxStartupFund = currentKey + "_" + "sf"
let xxxStartupVotes = currentKey + "_" + "sv"
let currentAmount = match getInteger(this, xxxStartupFund) {
case a:Int => a
case _ => 0
}
let totalVotes = match getInteger(this, xxxStartupVotes) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount - amount
if (amount < 0)
then throw("Can't withdraw negative amount")
else if (newAmount < 0)
then throw("Not enough balance")
else if (totalVotes < quorum)
then throw("Not enough votes. At least 2 votes required!")
else ScriptResult(
WriteSet([
DataEntry(xxxStartupFund, newAmount)
]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Callable(i)
func vote(amount: Int, address: String) = {
let currentKey = toBase58String(i.caller.bytes)
let xxxInvestorBalance = currentKey + "_" + "ib"
let xxxStartupFund = address + "_" + "sf"
let xxxStartupVotes = address + "_" + "sv"
let currentAmount = match getInteger(this, xxxInvestorBalance) {
case a:Int => a
case _ => 0
}
let currentVotes = match getInteger(this, xxxStartupVotes) {
case a:Int => a
case _ => 0
}
let currentFund = match getInteger(this, xxxStartupFund) {
case a:Int => a
case _ => 0
}
if (amount <= 0)
then throw("Can't withdraw negative amount")
else if (amount > currentAmount)
then throw("Not enough balance")
else ScriptResult(
WriteSet([
DataEntry(xxxInvestorBalance, currentAmount - amount),
DataEntry(xxxStartupVotes, currentVotes + 1),
DataEntry(xxxStartupFund, currentFund + amount)
]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Verifier(tx)
func verify() = {
match tx {
case t: TransferTransaction =>false
case _ => true
}
}
سرچینه: www.habr.com