RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

ہر کسی کو خوش!

В پہلے حصہ، ہم نے تفصیل سے جائزہ لیا ہے کہ ڈی اے پی پی (وکندریقرت ایپلی کیشن) کو کیسے بنایا جائے اور اس کے ساتھ کیسے کام کیا جائے۔ لہروں کی سواری IDE.

آئیے اب الگ الگ کو تھوڑا سا ٹیسٹ کرتے ہیں۔ مثال کے طور پر.

مرحلہ 3۔ dApp اکاؤنٹ کی جانچ

RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

کیا مسائل فوری طور پر ایلس کے ساتھ آوازوں پر پہنچ جاتے ہیں۔ ڈی اے پی اکاؤنٹ؟
اول:
بوب اور کوپر غلطی سے عام استعمال کرتے ہوئے ڈی اے پی ایڈریس پر فنڈز بھیج سکتے ہیں۔ منتقل لین دین اور اس طرح ان تک واپس رسائی حاصل نہیں کر سکیں گے۔

دوم:
ہم کسی بھی طرح ایلس کو بوب اور/یا کوپر کی رضامندی کے بغیر فنڈز نکالنے سے منع نہیں کرتے ہیں۔ چونکہ، تصدیق کرنے پر توجہ دیں، ایلس سے تمام لین دین پر عمل درآمد کیا جائے گا۔

آئیے ایلس پر پابندی لگا کر 2 کو ٹھیک کریں۔ منتقل لین دین درست اسکرپٹ کو تعینات کریں:
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

ہم dApp ایلس اور اس کے دستخط کے ساتھ سکے واپس لینے کی کوشش کر رہے ہیں۔ ہمیں ایک غلطی ملتی ہے:
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

واپسی کے ذریعے واپس لینے کی کوشش کرنا:

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

اسکرپٹ کام کرتا ہے اور ہم نے دوسرا نکتہ نکال لیا!

مرحلہ 4۔ ووٹنگ کے ساتھ ایک DAO بنائیں

بدقسمتی سے، RIDE زبان ابھی تک مجموعوں (ڈکشنری، لغات، تکرار کرنے والے، کم کرنے والے، وغیرہ) کے ساتھ کام کرنے کی صلاحیت فراہم نہیں کرتی ہے۔ تاہم، فلیٹ جمع کرنے پر کسی بھی کارروائی کے لیے کلیدی قیمت ہم تاروں کے ساتھ کام کرنے کے لیے ایک نظام ترتیب دے سکتے ہیں، بالترتیب چابیاں اور ان کی ڈکرپشن کے ساتھ۔

سٹرنگز کو جوڑنا بہت آسان ہے، سٹرنگز کو اشاریہ جات سے الگ کیا جا سکتا ہے۔
آئیے ایک ٹیسٹ کیس کے طور پر سٹرنگ کو جمع اور پارس کریں اور چیک کریں کہ یہ لین دین کے نتائج کو کیسے متاثر کرے گا۔
ہم نے اس حقیقت پر طے کیا کہ ایلس ٹرانسفر ٹرانزیکشن پر دستخط نہیں کر سکتی، کیونکہ اس قسم کے ٹرانزیکشن کے لیے @verifier میں اس امکان کو بلاک کر دیا گیا تھا۔

آئیے ڈور کے ساتھ مشق کریں اور پھر اسے حل کریں۔

RIDE سٹرنگز

ٹرانزیکشن دوبارہ ممکن ہے، ہم جانتے ہیں کہ ڈور کے ساتھ کیسے کام کرنا ہے۔
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)


مجموعی طور پر، ہمارے پاس وہ سب کچھ ہے جو آپ کو پیچیدہ منطق لکھنے کے لیے درکار ہے۔ ڈی اے او ڈی ایپ.

ڈیٹا ٹرانزیکشنز

ڈیٹا ٹرانزیکشنز:
"کسی کلید کے لیے زیادہ سے زیادہ سائز 100 حروف ہے، اور ایک کلید میں صوابدیدی یونیکوڈ کوڈ پوائنٹس شامل ہو سکتے ہیں جن میں خالی جگہیں اور دیگر ناقابل پرنٹ علامتیں شامل ہیں۔ سٹرنگ ویلیو کی حد 32,768 بائٹس ہے اور ڈیٹا ٹرانزیکشن میں ممکنہ اندراجات کی زیادہ سے زیادہ تعداد 100 ہے۔ مجموعی طور پر، ڈیٹا ٹرانزیکشن کا زیادہ سے زیادہ سائز تقریباً 140kb ہے — حوالے کے لیے، شیکسپیئر کے ڈرامے 'رومیو اینڈ جولیٹ' کی لمبائی تقریباً بالکل ٹھیک ہے۔ '۔

ہم درج ذیل شرائط کے ساتھ ڈی اے او بناتے ہیں۔
ایک سٹارٹ اپ کے لیے کال کر کے فنڈ حاصل کرنے کے لیے فنڈز حاصل کریں() کم از کم 2 شرکاء - 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 smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

ہمارے ڈپازٹ فنکشن میں قدرے تبدیلی آئی ہے:
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 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 smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

ڈیٹا اسٹور میں، ہم نیلی ایڈریس کے لیے تمام ضروری اندراجات دیکھتے ہیں:
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)
کوپر نے بھی نیلی پروجیکٹ کو ووٹ دیا۔
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

آئیے فنکشن کوڈ پر ایک نظر ڈالتے ہیں۔ فنڈز حاصل کریں۔. DAO سے فنڈز نکالنے کے قابل ہونے کے لیے Neli کو کم از کم 2 ووٹ جمع کرنے چاہئیں۔
RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (DAO - وکندریقرت خود مختار تنظیم)

نیلی اپنے سپرد کی گئی رقم کا نصف واپس لینے جا رہی ہے:

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

RIDE اور RIDE4DAPPS پر Waves smart Contracts لکھنے کا طریقہ سیکھنا۔ حصہ 2 (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
    }
}

پہلا حصہ
گیتھب پر کوڈ
لہروں کی سواری IDE
گرانٹ پروگرام کا اعلان

ماخذ: www.habr.com

نیا تبصرہ شامل کریں