Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Sawubona wonke umuntu!

В owokuqala ingxenye sibheke ngokuningiliziwe ukuthi kwenziwa kanjani futhi kusetshenzwe nge-dApp (uhlelo lokusebenza olusabalalisiwe) kuyo Amagagasi RIDE IDE.

Ake siyihlole kancane le ehlakaziwe isibonelo.

Isigaba 3. Ukuhlola i-akhawunti ye-dApp

Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Yiziphi izinkinga ezivele zivele kuwena no-Alice? I-dApp I-Akhawunti?
Okokuqala:
U-Boob no-Cooper bangase bathumele izimali ngephutha ekhelini le-dApp besebenzisa njalo ukudluliselwa imisebenzi futhi ngaleyo ndlela ngeke ukwazi ukufinyelela kuzo futhi.

Okwesibili:
Asimkhawuleli u-Alice nganoma iyiphi indlela ekukhipheni izimali ngaphandle kwemvume ka-Boob kanye/noma u-Cooper. Njengoba, qaphela ukuqinisekisa, konke ukuthengiselana okuvela ku-Alice kuzokwenziwa.

Masilungise okwesibili ngokuvimba u-Alice ukudluliselwa ukuthengiselana. Masisebenzise iskripthi esilungisiwe:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Sizama ukukhipha izinhlamvu zemali ku-dApp Alice nesiginisha yakhe. Sithola iphutha:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Ake sizame ukuhoxa ngokuhoxiswa:

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

Umbhalo uyasebenza futhi sithole iphuzu lesi-2!

Isigaba 4. Dala i-DAO ngokuvota

Ngeshwa, ulimi lwe-RIDE alukanikezi ikhono lokusebenza namaqoqo (izichazamazwi, iziphindaphindo, izinciphisi, njll.). Nokho, nganoma imiphi imisebenzi ngamaqoqo ayisicaba inani lokhiye singakwazi ukuklama isistimu yokusebenza ngezintambo, ngokuhambisana nezihluthulelo kanye nokuqanjwa kwazo.

Izintambo zilula kakhulu ukuhlanganisa; izintambo zingahlukaniswa ngezinkomba.
Ake siqoqe futhi sihlukanise iyunithi yezinhlamvu njengesibonelo sokuhlola futhi sihlole ukuthi lokhu kuwuthinta kanjani umphumela wokwenziwe.
Savumelana neqiniso lokuthi u-Alice akakwazanga ukusayina umsebenzi Wokudluliswa, njengoba leli thuba livinjiwe ku-@verifier kulolu hlobo lomsebenzi.

Masizilolonge ngezintambo bese sikuxazulula lokhu.

RIDE Strings

Ukuthengiselana kungenzeka futhi, siyazi ukuthi kusebenza kanjani ngezintambo.
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)


Sekukonke, sinakho konke okudingekayo ukuze sibhale i-logic eyinkimbinkimbi I-DAO dApp.

Ukuthengiselana Ngedatha

Ukuthengiselana Ngedatha:
“Usayizi omkhulu wokhiye yizinhlamvu eziyi-100, futhi ukhiye ungaqukatha amaphoyinti ekhodi ye-Unicode ngokunganaki okuhlanganisa izikhala nezinye izimpawu ezingaphrinteki. Amanani eyunithi yezinhlamvu anomkhawulo wamabhayithi angu-32,768 futhi inani eliphezulu lokufakwa okungenzeka ekwenziweni kwedatha ngu-100. Sekukonke, umkhawulo kasayizi wokwenziwa kwedatha ucishe ube ngu-140kb - njengereferensi, cishe ubude bomdlalo kaShakespeare 'Romeo and Juliet. '."

Sakha i-DAO enemibandela elandelayo:
Ukuze isiqalo sithole uxhaso ngokushaya ucingo getFunds() ukusekelwa okungenani kwabahlanganyeli abangu-2 - abatshalizimali be-DAO - kuyadingeka. Khipha kuyokwenzeka ngokufana ncamashi nenani eliphelele elikhonjisiwe ukuvota Abanikazi be-DAO.

Masenze izinhlobo ezi-3 zokhiye futhi sengeze ingqondo yokusebenza ngamabhalansi kumavoti emisebenzi emi-2 emisha kanye ne-getFunds:
xx…xx_i = abatshalizimali, ibhalansi etholakalayo (ivoti, idiphozi, ukuhoxiswa)
xx…xx_sv = ukuqala, inani lamavoti (vote, getFunds)
xx…xx_sf = ukuqala, inani lamavoti (vote, getFunds)
xx…xx = ikheli lomphakathi (izinhlamvu ezingu-35)

Sicela uqaphele ukuthi kuVoti besidinga ukubuyekeza izinkambu ezimbalwa ngesikhathi esisodwa:

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

I-WritSet isivumela ukuthi senze amarekhodi amaningana ngesikhathi esisodwa invokeScript ukuthengiselana.

Lokhu kubonakala kunjani ekugcinweni kwenani elingukhiye le-DAO dApp, ngemva kokugcwalisa u-Bob no-Cooper ia- amadiphozithi:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Umsebenzi wethu wediphozithi ushintshe kancane:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Manje kufika isikhathi esibaluleke kakhulu emisebenzini ye-DAO - ukuvota ukuze amaphrojekthi axhaswe ngezimali.

U-Bob uvotela iphrojekthi kaNeli yamagagasi angu-500000:

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

Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Esitolo sedatha sibona konke okudingekile ekhelini likaNeli:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)
UCooper naye wavotela iphrojekthi kaNeli.
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Ake sibheke ikhodi yomsebenzi getFunds. UNeli kufanele aqoqe okungenani amavoti angu-2 ukuze akwazi ukukhipha izimali ku-DAO.
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

UNeli uzokhipha ingxenye yemali ayiphathisiwe:

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

Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Uyaphumelela, okungukuthi, i-DAO iyasebenza!

Sibheke inqubo yokwakha i-DAO ngolimi I-RIDE4DAPPS.
Ezingxenyeni ezilandelayo sizobhekisisa ukuphinda kwenziwe kabusha ikhodi kanye nokuhlolwa kwecala.

Inguqulo ephelele yekhodi ku Amagagasi 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
    }
}

Ingxenye yokuqala
Ikhodi ku-GitHub
Amagagasi RIDE IDE
Isimemezelo sohlelo lwesibonelelo

Source: www.habr.com

Engeza amazwana