Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Салом хама!

В аввал қисми, мо ба таври муфассал дида баромадем, ки чӣ гуна эҷод ва кор бо dApp (барномаи ғайримарказӣ) дар Waves RIDE IDE.

Биёед ҳоло қисмҳои ҷудошударо каме санҷем намуна.

Марҳилаи 3. Санҷиши ҳисоби dApp

Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Кадом мушкилот фавран ба овозҳо бо Алис шитофтанд dapper Ҳисоб?
Якум:
Boob ва Cooper метавонанд тасодуфан ба суроғаи dApp бо истифодаи муқаррарӣ маблағ фиристанд интиқол додан транзаксияҳо ва аз ин рӯ ба онҳо баргашта наметавонанд.

Дуюм:
Мо ба ҳеҷ ваҷҳ Алисаро аз гирифтани маблағ бе розигии Боб ва/ё Купер маҳдуд намекунем. Азбаски, ба тафтиш диққат диҳед, ҳама амалиётҳо аз Алис иҷро карда мешаванд.

Биёед 2-ро бо манъ кардани Алис ислоҳ кунем интиқол додан муомилот. Скрипти ислоҳшударо ҷойгир кунед:
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Мо кӯшиш мекунем, ки тангаҳоро бо dApp Алиса ва имзои ӯ бигирем. Мо хато мегирем:
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Кӯшиши бозхонд тавассути бозхонд:

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

Скрипт кор мекунад ва мо нуқтаи 2-ро фаҳмидем!

Марҳилаи 4. Эҷоди DAO бо овоздиҳӣ

Мутаассифона, забони RIDE то ҳол қобилияти кор бо коллексияҳоро (лугатҳо, луғатҳо, итераторҳо, редукторҳо ва ғайра) таъмин намекунад. Бо вуҷуди ин, барои ҳама гуна амалиёт оид ба коллексияҳои ҳамвор арзиши калидӣ мо метавонем системаи кор бо сатр, мутаносибан бо калидҳо ва рамзкушоии онҳоро тарҳрезӣ кунем.

Пайваст кардани сатрҳо хеле осон аст, сатрҳоро бо индексҳо ҷудо кардан мумкин аст.
Биёед сатрро ҳамчун ҳолати санҷишӣ ҷамъоварӣ ва таҳлил кунем ва бифаҳмем, ки ин ба натиҷаи транзаксия чӣ гуна таъсир мерасонад.
Мо ба он хулоса омадем, ки Алис наметавонад амалиёти интиқолро имзо кунад, зеро ин имкон дар @verifier барои ин намуди транзаксия баста шудааст.

Биёед бо сатр машқ кунем ва сипас инро ҳал кунем.

Сатрҳои RIDE

Муомилот боз имконпазир аст, мо медонем, ки чӣ тавр бо сатр кор кардан лозим аст.
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)


Дар маҷмӯъ, мо ҳама чизеро дорем, ки барои навиштани мантиқи мураккаб лозим аст DAO dApp.

Амалиётҳои маълумот

Амалиётҳои маълумот:
"Андозаи ҳадди ниҳоии калид 100 аломат аст ва калид метавонад дорои нуқтаҳои худсаронаи коди Юникод, аз ҷумла фосилаҳо ва дигар рамзҳои чопнашаванда бошад. Қиматҳои сатр маҳдудияти 32,768 байт доранд ва шумораи ниҳоии вурудоти имконпазир дар транзакси додаҳо 100 аст. Дар маҷмӯъ, андозаи максималии транзаксияи додаҳо тақрибан 140 кб аст — барои истинод, тақрибан маҳз ба дарозии пьесаи Шекспир «Ромео ва Ҷулетта» '. ”

Мо DAO-ро бо шартҳои зерин эҷод мекунем:
Барои он ки стартап тавассути занг задан маблағ ба даст орад getFunds () дастгирии на камтар аз 2 иштирокчиён - сармоягузорони DAO талаб карда мешавад. Боздорад ба кадри маблаге, ки дар он нишон дода шудааст, имконпазир мегардад овоздиҳӣ Соҳибони DAO.

Биёед 3 намуди калидҳоро созем ва мантиқи кор бо тавозунро дар 2 функсияи нав илова кунем овоз ва getFunds:
хх...хх_ia = сармоягузорон, тавозуни дастрас (овоз, амонат, бозхонд)
хх...хх_св = стартапҳо, шумораи овозҳо (овоз додан, getFunds)
хх...хх_sf = стартапҳо, шумораи овозҳо (овоз додан, getFunds)
xx…xx = суроғаи умумӣ (35 аломат)

Огоҳӣ дар Овоздиҳӣ ба мо лозим буд, ки якбора якчанд майдонро навсозӣ кунем:

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

WriteSet ба мо имкон медиҳад, ки дар як вақт якчанд сабтҳоро созем invokeScript муомилот.

Пас аз пур кардани Боб ва Купер он дар мағозаи калидии DAO dApp чунин ба назар мерасад. ia- амонатҳо:
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Функсияи амонатии мо каме тағйир ёфт:
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Ҳоло лаҳзаи муҳимтарин дар фаъолияти DAO фаро мерасад - овоздиҳӣ барои лоиҳаҳо барои маблағгузорӣ.

Боб ба лоиҳаи Нели дар 500000 XNUMX мавҷ овоз медиҳад:

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

Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Дар мағозаи маълумот, мо ҳама сабтҳои заруриро барои суроғаи Нели мебинем:
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)
Купер инчунин ба лоиҳаи Нели овоз дод.
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Биёед рамзи функсияро дида бароем getFunds. Нели бояд ҳадди аққал 2 овоз ҷамъоварӣ кунад, то тавонанд маблағро аз DAO бозпас гирад.
Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Нели нисфи маблаги ба у бовар кардашударо гирифтанй мешавад:

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

Омӯзиши тарзи навиштани шартномаҳои интеллектуалии Waves дар RIDE ва RIDE4DAPPS. Қисми 2 (DAO - Ташкилоти худмухтори ғайримарказӣ)

Вай муваффак мешавад, яъне ДАО кор мекунад!

Мо раванди эҷоди DAO-ро дар забон баррасӣ кардем RIDE4DAPPS.
Дар қисмҳои зерин, мо ба рефакторинги код ва санҷиши парванда бодиққат назар хоҳем кард.

Рамзи пурра дар Waves RIDE 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
Waves RIDE IDE
Эълони барномаи грантӣ

Манбаъ: will.com

Илова Эзоҳ