RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

سلام هر!

В پهرين حصو اسان تفصيل سان ڏٺو ته ڪيئن ٺاهجي ۽ ڪم ڪجي dApp (decentralized application) in in موج سواري IDE.

اچو ته ھاڻي ٿورڙي جدا ٿيل ھڪڙي کي جانچيون مثال.

اسٽيج 3. ڊي ايپ اڪائونٽ کي جانچڻ

RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

اليس سان توهان کي فوري طور تي ڪهڙا مسئلا نڪرندا آهن؟ ڊي اي پي کاتو؟
پهرين:
بوب ۽ ڪوپر شايد اتفاقي طور تي فنڊ موڪلي سگھن ٿا ڊي ايپ ايڊريس تي باقاعده استعمال ڪندي منتقلي ٽرانزيڪشن ۽ اهڙيء طرح انهن کي واپس رسائي ڪرڻ جي قابل نه هوندا.

ٻيو:
اسان بوب ۽/يا ڪوپر جي منظوري کان سواءِ رقم ڪڍڻ کان سواءِ ايلس کي ڪنهن به طريقي سان محدود نٿا ڪريون. جيئن ته، تصديق ڪرڻ تي ڌيان ڏيو، ايلس کان سڀ ٽرانزيڪشن تي عمل ڪيو ويندو.

اچو ته ايلس تي پابندي لڳائي 2nd کي درست ڪريون منتقلي ٽرانزيڪشن اچو ته درست ٿيل اسڪرپٽ کي ترتيب ڏيو:
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

اسان ڪوشش ڪري رهيا آهيون dApp ايلس ۽ ان جي دستخط مان سڪا ڪڍڻ. اسان کي هڪ غلطي ملي ٿي:
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

اسان واپس وٺڻ جي ذريعي واپس وٺڻ جي ڪوشش ڪندا آهيون:

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

اسڪرپٽ ڪم ڪري ٿو ۽ اسان 2nd پوائنٽ کي ڳولي ورتو!

اسٽيج 4. ووٽنگ سان هڪ DAO ٺاهيو

بدقسمتي سان، RIDE ٻولي اڃا تائين مجموعن سان ڪم ڪرڻ جي صلاحيت نه ڏني آهي (ڊڪشنري ڊڪشنري، آئٽرٽر، گهٽائيندڙ، وغيره). بهرحال، ڪنهن به آپريشن لاء فليٽ گڏ ڪرڻ سان اهم قدر اسان تارن سان ڪم ڪرڻ لاءِ هڪ سسٽم ٺاهي سگهون ٿا، ان مطابق ڪنجين ۽ انهن جي ڊيڪرپشن سان.

سٽون ڳنڍڻ تمام آسان آهن؛ تارن کي انگن اکرن سان الڳ ڪري سگھجي ٿو.
اچو ته هڪ اسٽرنگ کي گڏ ڪريون ۽ پارس ڪريون ٽيسٽ مثال طور ۽ چيڪ ڪريون ته اهو ڪيئن اثر انداز ٿئي ٿو ٽرانزيڪشن جي نتيجي تي.
اسان ان حقيقت تي آباد ٿياسون ته ايلس ٽرانسفر ٽرانزيڪشن تي دستخط نه ڪري سگهي، ڇاڪاڻ ته هي صلاحيت هن قسم جي ٽرانزيڪشن لاءِ @verifier ۾ بلاڪ ڪئي وئي هئي.

اچو ته اسٽرنگ سان مشق ڪريو ۽ پوء ان کي حل ڪريو.

RIDE اسٽرنگس

ٽرانزيڪشن ٻيهر ممڪن آهي، اسان ڄاڻون ٿا ته تارن سان ڪيئن ڪم ڪجي.
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)


مجموعي طور تي، اسان وٽ تمام ضروري آهي پيچيده منطق لکڻ لاءِ ڊي اي او ڊي ايپ.

ڊيٽا ٽرانزيڪشن

ڊيٽا ٽرانزيڪشن:
”هڪ چاٻي جي وڌ ۾ وڌ سائيز 100 اکر هوندي آهي، ۽ هڪ ڪيئي صوابديدي يونيڪوڊ ڪوڊ پوائنٽس تي مشتمل ٿي سگهي ٿي جنهن ۾ اسپيس ۽ ٻيون غير پرنٽ لائق علامتون شامل آهن. اسٽرنگ ويلز جي حد آهي 32,768 بائيٽس ۽ ڊيٽا ٽرانزيڪشن ۾ ممڪن داخلن جو وڌ ۾ وڌ تعداد 100 آهي. مجموعي طور تي، ڊيٽا ٽرانزيڪشن جي وڌ ۾ وڌ ماپ 140kb جي لڳ ڀڳ آهي - حوالي لاءِ، شيڪسپيئر جي ڊرامي 'روميو ۽ جوليٽ' جي لڳ ڀڳ بلڪل ڊگھائي. '.

اسان هيٺ ڏنل شرطن سان DAO ٺاهيندا آهيون:
هڪ شروعاتي لاءِ فون ذريعي فنڊ حاصل ڪرڻ لاءِ فنڊ حاصل ڪريو() گھٽ ۾ گھٽ 2 شرڪت ڪندڙن جي مدد - DAO سيڙپڪار - گھربل آھي. واپس وٺڻ اهو بلڪل ممڪن ٿيندو جيترو مجموعي طور تي اشارو ڪيو ويو آهي ووٽ ڏيڻ DAO مالڪن.

اچو ته 3 قسم جي چابيون ٺاهيون ۽ 2 نون فنڪشن ووٽ ۽ حاصل ڪريو فنڊز ۾ بيلنس سان ڪم ڪرڻ لاءِ منطق شامل ڪريو:
xx…xx_ia = سيڙپڪار، موجود توازن (ووٽ، جمع، واپسي)
xx…xx_sv = شروعات، ووٽن جو تعداد (ووٽ، فنڊ حاصل ڪريو)
xx…xx_sf = شروعات، ووٽن جو تعداد (ووٽ، فنڊ حاصل ڪريو)
xx…xx = عوامي پتو (35 اکر)

مهرباني ڪري نوٽ ڪريو ته ووٽ ۾ اسان کي هڪ ئي وقت ڪيترن ئي شعبن کي اپڊيٽ ڪرڻ جي ضرورت آهي:

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

WriteSet اسان کي اجازت ڏئي ٿو ته هڪ ئي وقت ۾ ڪيترائي رڪارڊ ٺاهڻ invokeScript ٽرانزيڪشن

اھو اھو آھي جيڪو DAO dApp جي اھم قدر واري اسٽوريج ۾ نظر اچي ٿو، باب ۽ ڪوپر جي ڀرڻ کان پوءِ ia- جمع:
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

اسان جي جمع ڪرڻ جو ڪم ٿورو تبديل ڪيو آهي:
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

هاڻي DAO جي سرگرمين ۾ سڀ کان اهم لمحو اچي ٿو - ووٽ ڏيو منصوبن جي مالي مدد لاء.

باب نيلي جي 500000 ويجليٽ پروجيڪٽ لاءِ ووٽ ڏئي ٿو:

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

RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

ڊيٽا اسٽور ۾ اسان ڏسون ٿا نيلي جي ايڊريس لاءِ تمام ضروري داخلائون:
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)
ڪوپر پڻ نيلي پروجيڪٽ لاءِ ووٽ ڏنو.
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

اچو ته فنڪشن ڪوڊ تي هڪ نظر رکون فنڊ حاصل ڪريو. نيلي کي DAO کان فنڊ ڪڍڻ جي قابل ٿيڻ لاءِ گهٽ ۾ گهٽ 2 ووٽ گڏ ڪرڻ گهرجن.
RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (DAO - غير مرڪزي خودمختيار تنظيم)

نيلي هن جي حوالي ڪيل رقم جو اڌ واپس وٺڻ وارو آهي:

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

RIDE ۽ RIDE4DAPPS تي Waves سمارٽ ڪانٽريڪٽ لکڻ سکڻ. حصو 2 (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

تبصرو شامل ڪريو