Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Hello kowa da kowa!

В na farko Sashen mun duba dalla-dalla yadda ake ƙirƙira da aiki tare da dApp (application ɗin da ba a san shi ba) a ciki Waves RIDE IDE.

Bari mu gwada wanda aka tarwatsa kadan yanzu misali.

Mataki na 3. Gwada asusun dApp

Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Wadanne matsaloli nan da nan suka yi muku tsalle tare da Alice? dApp Asusun?
Da fari dai:
Boob da Cooper na iya aika kuɗi da gangan zuwa adireshin dApp ta amfani da na yau da kullun canja wurin ma'amaloli don haka ba za su sami damar dawo da su ba.

Abu na biyu:
Ba mu ƙuntata Alice ta kowace hanya daga cire kuɗi ba tare da amincewar Boob da/ko Cooper ba. Tunda, kula da tabbatarwa, duk ma'amaloli daga Alice za a aiwatar da su.

Mu gyara na 2 ta hanyar hana Alice canja wurin ma'amaloli. Mu tura rubutun da aka gyara:
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Muna ƙoƙarin cire tsabar kudi daga dApp Alice da sa hannun ta. Muna samun kuskure:
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Mu yi ƙoƙarin janyewa ta hanyar janyewa:

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

Rubutun yana aiki kuma mun gano batu na 2!

Mataki na 4. Ƙirƙiri DAO tare da jefa kuri'a

Abin takaici, har yanzu harshen RIDE bai ba da ikon yin aiki tare da tarin abubuwa ba (kamus na ƙamus, masu ƙira, masu ragewa, da sauransu). Koyaya, ga kowane aiki tare da tarin lebur maɓallin-maɓalli za mu iya tsara tsarin aiki tare da kirtani, daidai da maɓallai da ƙaddamar da su.

Zaɓuɓɓuka suna da sauƙin haɗawa; Za a iya raba igiyoyi ta fihirisa.
Bari mu tattara mu rarraba kirtani azaman misali na gwaji kuma duba yadda wannan ke shafar sakamakon ciniki.
Mun daidaita kan gaskiyar cewa Alice ba za ta iya sanya hannu kan cinikin Canja wurin ba, tunda an toshe wannan ikon a @verifier don irin wannan ma'amala.

Bari mu yi aiki da igiyoyi sannan mu warware wannan.

Ride igiyoyi

Ma'amala yana yiwuwa kuma, mun san yadda ake aiki tare da kirtani.
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)


Gabaɗaya, muna da duk abin da ake buƙata don rubuta dabaru masu rikitarwa DAO dApp.

Kasuwancin Bayanai

Ma'amalolin Bayanai:
"Mafi girman girman maɓalli shine haruffa 100, kuma maɓalli na iya ƙunsar makirufo na Unicode na sabani gami da sarari da sauran alamomin da ba a iya bugawa ba. Adadin kirtani suna da iyaka na 32,768 bytes kuma matsakaicin adadin yuwuwar shigarwar a cikin ma'amalar bayanai shine 100. Gabaɗaya, matsakaicin girman ma'amalar bayanai yana kusa da 140kb - don tunani, kusan daidai tsayin wasan Shakespeare 'Romeo da Juliet '."

Mun ƙirƙiri DAO tare da yanayi masu zuwa:
Domin farawa don karɓar kuɗi ta hanyar kira samunFunds() goyon bayan akalla 2 mahalarta - DAO masu zuba jari - ake bukata. Karbo zai yiwu daidai gwargwadon jimlar da aka nuna akan zabe Masu DAO.

Bari mu yi nau'ikan maɓallai guda 3 kuma mu ƙara dabaru don yin aiki tare da ma'auni a cikin sabbin zaɓen ayyuka 2 da samunFunds:
xx…xx_iya = masu zuba jari, akwai ma'auni (zabi, ajiya, janyewa)
xx…xx_sv = farawa, adadin kuri'u (zabe, samunFunds)
xx…xx_sf = farawa, adadin kuri'u (zabe, samunFunds)
xx…xx = adireshin jama'a (haruffa 35)

Lura cewa a cikin Kuri'a muna buƙatar sabunta filayen da yawa lokaci guda:

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

WriteSet yana ba mu damar yin rikodin da yawa lokaci ɗaya a cikin ɗaya kiraScript ma'amaloli.

Wannan shine abin da yake kama a cikin ma'ajin ƙima na DAO dApp, bayan Bob da Cooper sun cika. ia- ajiya:
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Ayyukan ajiyanmu ya ɗan canza kaɗan:
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Yanzu ya zo mafi mahimmanci lokacin a cikin ayyukan DAO - jefa kuri'a don ayyukan da za a ba da kuɗi.

Bob ya jefa kuri'a don aikin Neli 500000 na igiyar ruwa:

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

Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

A cikin kantin sayar da bayanai muna ganin duk abubuwan da ake buƙata don adireshin Neli:
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)
Cooper kuma ya zabi aikin Neli.
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Bari mu kalli lambar aikin samunFunds. Dole Neli ya tattara mafi ƙarancin ƙuri'u 2 don samun damar cire kuɗi daga DAO.
Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Neli za ta cire rabin kudin da aka damka mata:

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

Koyon rubuta kwangilar Waves smart akan RIDE da RIDE4DAPPS. Kashi na 2 (DAO - Ƙungiya mai cin gashin kai)

Ta yi nasara, wato DAO yana aiki!

Mun duba tsarin samar da DAO a cikin harshe RIDE4DAPPS.
A cikin ɓangarorin masu zuwa za mu yi nazari sosai kan gyaran lamba da gwajin harka.

Cikakken sigar lambar a ciki 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
    }
}

Kashi na farko
Code akan GitHub
Waves RIDE IDE
Sanarwa na shirin tallafin

source: www.habr.com

Add a comment