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 Kule ngxenye sibheke ngokuningiliziwe indlela yokudala nokusebenza nge-dApp (uhlelo lokusebenza oluhlukaniswe phakathi) ku Amagagasi e-RIDE IDE.

Ake sihlole le ehlukanisiwe kancane manje isibonelo.

Isinyathelo 3: Ukuhlola i-akhawunti ye-dApp

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

Yiziphi izinkinga ezikudonsela amehlo ngokushesha ngo-Alice? I-dApp I-Akhawunti?
Okokuqala:
UBoob noCooper bangase bathumele imali ngephutha ekhelini le-dApp besebenzisa i-ejwayelekile ukudluliselwa ukuthengiselana ngakho ngeke bakwazi ukukufinyelela futhi.

Okwesibili:
Asimvimbeli u-Alice ekukhipheni imali ngaphandle kwemvume evela ku-Boob noma ku-Cooper. Njengoba ubona, zonke izinkokhelo ezivela ku-Alice zizokwenziwa.

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

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

Ake sizame ukuhoxa ngokuhoxa:

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

Iskripthi siyasebenza futhi sesilungisile iphuzu lesi-2!

Isinyathelo 4: Dala i-DAO ngokuvota

Ngeshwa, ulimi lwe-RIDE alukanikezi amakhono okusebenza ngamaqoqo (izichazamazwi zezichazamazwi, iziphindaphindi, izinciphisi, njll.). Kodwa-ke, kunoma yimiphi imisebenzi enamaqoqo ayisicaba inani lokhiye Singaklama uhlelo lokusebenza ngezintambo, ngokufanele ngezihluthulelo kanye nokususwa kwazo.

Izintambo kulula kakhulu ukuzihlanganisa, izintambo zingahlukaniswa ngama-indexes.
Njengesibonelo sokuhlola, ake sihlanganise futhi sihlaziye umucu bese sihlola ukuthi lokhu kuthinta kanjani umphumela wokuthengiselana.
Sigcine singakwazi ukusayina intengiselwano yokudlulisa imali ngoba leli khono lalivinjelwe ku-@verifier ngalolu hlobo lwentengiselwano.

Ake sizijwayeze ngezintambo bese sixazulula lokhu.

Izintambo ze-RIDE

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


Ngakho-ke, sinazo zonke izinto esizidingayo ukuze sibhale i-logic eyinkimbinkimbi. I-DAO dApp.

Ukuthengiselana Kwedatha

Ukuthengiselana Kwedatha:
"Usayizi omkhulu wenkinobho yizinhlamvu eziyi-100, futhi inkinobho ingaqukatha amaphuzu ekhodi ye-Unicode angenasidingo kufaka phakathi izikhala nezinye izimpawu ezingaphrinteki. Amanani entambo anomkhawulo wama-byte angu-32,768 kanti inani eliphezulu lokufakwa okungenzeka ekuthengisweni kwedatha lingu-100. Sekukonke, usayizi omkhulu wokuthengiselana kwedatha ucishe ube ngu-140kb - njengereferensi, cishe ubude bomdlalo kaShakespeare othi 'Romeo and Juliet'."

Sakha i-DAO enemibandela elandelayo:
Ukuze inkampani entsha ithole uxhaso ngokushayela ucingo i-getFunds() Ukusekelwa okungenani kwabahlanganyeli ababili – abatshalizimali be-DAO – kuyadingeka. Khipha kuzoba khona inani elilingana ncamashi nenani eliboniswe ku- ukuvota Abanikazi be-DAO.

Ake sakhe izinhlobo ezintathu zezinkinobho bese sengeza i-logic yokusebenza ngamabhalansi emisebenzini emi-2 emisha, i-vote kanye ne-getFunds:
xx…xx_ia = abatshalizimali, ibhalansi etholakalayo (ivoti, idiphozithi, ukuhoxiswa)
xx…xx_sv = izinkampani ezintsha, inani lamavoti (vota, thola i-GetFunds)
xx…xx_sf = izinkampani ezintsha, inani lamavoti (vota, thola i-GetFunds)
xx…xx = ikheli lomphakathi (izinhlamvu ezingu-35)

Qaphela ukuthi ku-Vote sidinga ukubuyekeza izinkambu eziningana ngesikhathi esisodwa:

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

I-WriteSet isivumela ukuthi senze amarekhodi amaningi ngesikhathi esisodwa i-invokeScript ukuthengiselana.

Yilokhu okubukeka ngakho esitolo se-DAO dApp ngemuva kokuthi uBob noCooper sebegcwalise kabusha. ia-idiphozithi:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

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

Manje kuza umzuzu obaluleke kakhulu emisebenzini ye-DAO - ukuvota ukuze amaphrojekthi axhaswe ngezimali.

UBob uvotela iphrojekthi kaNeli yama-wavelets 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)

Endlini yokugcina idatha, sibona wonke amarekhodi adingekayo ekheli likaNeli:
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)
UCooper uphinde wavotela iphrojekthi kaNeli.
Ukufunda ukubhala izinkontileka ezihlakaniphile ze-Waves ku-RIDE naku-RIDE4DAPPS. Ingxenye 2 (DAO - Inhlangano Ezimele Emisiwe)

Ake sibheke ikhodi yomsebenzi i-getFundsUNeli kumele aqoqe okungenani amavoti amabili ukuze akwazi ukukhipha imali kwi-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!

Sihlanganise inqubo yokwakha i-DAO ngolimi I-RIDE4DAPPS.
Ezingxenyeni ezilandelayo, sizobheka kabanzi ukuhlelwa kabusha kwekhodi kanye nokuhlolwa kwamacala.

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

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

Source: www.habr.com

Thenga ukusingathwa okuthembekile kwamasayithi anokuvikelwa kwe-DDoS, amaseva e-VPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekile ngokuvikelwa kwe-DDoS, amaseva e-VPS VDS | ProHoster