په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

سلام هر!

В لومړی پدې برخه کې موږ په تفصیل سره وکتل چې څنګه د dApp (غیر متمرکز غوښتنلیک) رامینځته کړو او کار وکړو د څپو سواری IDE.

راځئ چې اوس یو څه جلا شوی ازموینه وکړو مثال.

دریم ګام: د dApp حساب ازموینه کول

په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

په الیس کې کومې ستونزې سمدلاسه ستاسو پام ځانته را اړوي؟ dApp حساب؟
لومړی:
بوب او کوپر ممکن په ناڅاپي ډول د dApp پتې ته د منظم په کارولو سره فنډونه واستوي لیږد او له همدې امله به بیرته ورته لاسرسی ونشي کړای.

دوهم:
موږ الیس د بوب او/یا کوپر له اجازې پرته د پیسو ایستلو څخه نه منع کوو. لکه څنګه چې تاسو لیدلی شئ، د الیس ټولې معاملې به ترسره شي، لکه څنګه چې د تایید تڼۍ لخوا ښودل شوي.

راځئ چې د الیس په بندولو سره دوهم حل کړو لیږد معاملې. د سم شوي سکریپټ ځای پرځای کول:
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

موږ هڅه کوو چې د الیس dApp او د هغې لاسلیک څخه سکې وباسو. موږ یوه تېروتنه ترلاسه کوو:
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

راځئ چې د وتلو له لارې د وتلو هڅه وکړو:

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))

سکرېپټ کار کوي او موږ دوهمه نقطه حل کړې ده!

څلورم ګام: د رایې ورکولو سره یو DAO جوړ کړئ

له بده مرغه، د RIDE ژبه لا تر اوسه د ټولګو سره د کار کولو وړتیاوې نه ورکوي (د قاموسونو قاموسونه، تکرارونکي، کمونکي، او نور). په هرصورت، د فلیټ ټولګو سره د هر ډول عملیاتو لپاره د کیلي ارزښت موږ کولی شو د تارونو سره د کار کولو لپاره یو سیسټم ډیزاین کړو، په ترتیب سره د کیلي او د دوی د کوډ کولو سره.

تارونه سره نښلول ډېر اسانه دي، تارونه د شاخصونو له مخې ویشل کیدی شي.
د ازموینې مثال په توګه، راځئ چې یو تار راټول او تجزیه کړو او وګورو چې دا څنګه د معاملې پایله اغیزه کوي.
موږ په پای کې دې حقیقت ته ورسیدو چې الیس د لیږد معامله لاسلیک نه کړه، ځکه چې دا وړتیا په @verifier کې د دې ډول معاملې لپاره بنده شوې وه.

راځئ چې د تارونو سره تمرین وکړو او بیا دا حل کړو.

د سواری تارونه

معامله بیا ممکنه ده، موږ پوهیږو چې څنګه د تارونو سره کار وکړو.
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)


نو، موږ هر هغه څه لرو چې د پیچلي منطق لیکلو لپاره ورته اړتیا لرو. DAO dApp.

د معلوماتو راکړه ورکړه

د معلوماتو راکړه ورکړه:
"د یوې کیلي لپاره اعظمي اندازه ۱۰۰ حروف دي، او یوه کیلي کولی شي د یونیکوډ کوډ ټکي ولري چې پکې ځایونه او نور غیر چاپي سمبولونه شامل دي. د تار ارزښتونه د ۳۲،۷۶۸ بایټس حد لري او د معلوماتو لیږد کې د ممکنه ننوتلو اعظمي شمیر ۱۰۰ دی. په ټولیز ډول، د معلوماتو لیږد اعظمي اندازه شاوخوا ۱۴۰ کیلو بایټ ده - د حوالې لپاره، تقریبا د شکسپیر د ډرامې 'رومیو او جولیټ' اوږدوالی سره مساوي دی."

موږ د لاندې شرایطو سره DAO جوړوو:
د یو نوي شرکت لپاره چې د زنګ وهلو له لارې تمویل ترلاسه کړي فنډونه ترلاسه کړئ () د لږترلږه دوو ګډونوالو - د DAO پانګوالو - ملاتړ اړین دی. وتل دا به ممکنه وي چې دقیقا دومره ډیر ولرئ څومره چې په کې ښودل شوي رایه ورکول د DAO مالکین.

راځئ چې درې ډوله کیلي جوړې کړو او په دوه نویو دندو، رایه او ګیټ فنډونو کې د بیلانس سره کار کولو لپاره منطق اضافه کړو:
xx...xx_یا = پانګه اچوونکي، شته توازن (رایه ورکول، جمع کول، ایستل)
xx...xx_سلو = نوي شرکتونه، د رایو شمیر (رایه ورکړئ، فنډونه ترلاسه کړئ)
xx...xx_سیف = نوي شرکتونه، د رایو شمیر (رایه ورکړئ، فنډونه ترلاسه کړئ)
xx…xx = عامه پته (۳۵ توري)

په یاد ولرئ چې په "ووټ" کې موږ اړتیا درلوده چې په یو وخت کې څو ساحې تازه کړو:

WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),

WriteSet موږ ته اجازه راکوي چې په یو وخت کې ډیری ریکارډونه په یوه کې جوړ کړو انوویک سکریپټ معاملې.

دا هغه څه دي چې د DAO dApp کلیدي ارزښت پلورنځي کې د باب او کوپر له بیا ډکولو وروسته ښکاري. ia- زیرمې:
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

زموږ د زیرمو فعالیت یو څه بدل شوی دی:
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

اوس د DAO په فعالیتونو کې ترټولو مهمه شیبه راځي - رایه د پروژو د تمویل لپاره.

باب د نیلي د ۵۰۰،۰۰۰ ویولیټس پروژې لپاره رایه ورکوي:

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))

په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

په ډیټا ګودام کې، موږ د نیلي د پتې لپاره ټول اړین ریکارډونه ګورو:
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)
کوپر هم د نیلي پروژې لپاره رایه ورکړه.
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

راځئ چې د فعالیت کوډ ته یو نظر واچوو فنډونه ترلاسه کړئنیلي باید لږترلږه دوه رایې ترلاسه کړي ترڅو وکولی شي د DAO څخه فنډونه وباسي.
په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

نیلي به د هغه پیسو نیمایي بیرته واخلي چې هغې ته سپارل شوي دي:

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))

په RIDE او RIDE4DAPPS کې د Waves سمارټ قراردادونو لیکلو زده کړه. دویمه برخه (DAO - غیر متمرکزه خپلواکه اداره)

هغه بریالۍ کیږي، دا ده چې DAO کار کوي!

موږ په ژبه کې د DAO جوړولو پروسه پوښلې ده د RIDE4DAPPS.
په راتلونکو برخو کې، موږ به د کوډ ریفیکټورینګ او د قضیې ازموینې ته نږدې کتنه وکړو.

د کوډ بشپړ نسخه په د ویوز سواری IDE:

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

لومړۍ برخه
په GitHub کې کوډ
د څپو سواری IDE
د مرستې پروګرام اعلان

سرچینه: www.habr.com

د DDoS محافظت ، VPS VDS سرورونو سره د سایټونو لپاره معتبر کوربه توب واخلئ 🔥 د DDoS محافظت، VPS VDS سرورونو سره د باور وړ ویب پاڼې کوربه توب واخلئ | ProHoster