Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Hello sa tanan!

В ang una bahin, among gisusi sa detalye kon sa unsang paagi sa paghimo ug pagtrabaho uban sa usa ka dApp (desentralisadong aplikasyon) sa Waves RIDE IDE.

Atong sulayan karon ang nadisassemble gamay usa ka panig-ingnan.

Stage 3. Pagsulay sa dApp account

Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Unsang mga problema ang nagdali dayon sa mga tingog uban ni Alice dapp Account?
Una:
Si Boob ug Cooper mahimong aksidenteng magpadala og mga pundo ngadto sa adres sa dApp gamit ang usa ka normal pagbalhin mga transaksyon ug sa ingon dili na ma-access kini balik.

Ikaduha:
Wala namo gipugngan si Alice sa bisan unsang paagi sa pag-withdraw sa mga pundo nga walay pagtugot ni Boob ug/o Cooper. Tungod kay, pagtagad sa pag-verify, ang tanan nga mga transaksyon gikan sa Alice ipatuman.

Ayuhon nato ang 2 pinaagi sa pagdili kang Alice pagbalhin mga transaksyon. I-deploy ang gitul-id nga script:
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Gisulayan namon nga i-withdraw ang mga sensilyo gamit ang dApp Alice ug ang iyang pirma. Nakakuha kami usa ka sayup:
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Pagsulay sa pag-withdraw pinaagi sa pag-withdraw:

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

Ang script nagtrabaho ug nahibal-an namon ang ika-2 nga punto!

Stage 4. Paghimo ug DAO nga adunay pagboto

Ikasubo, ang pinulongang RIDE wala pa maghatag ug katakus sa pagtrabaho sa mga koleksyon (mga diksyonaryo, diksyonaryo, iterator, reducer, ug uban pa). Bisan pa, alang sa bisan unsang operasyon sa mga patag nga koleksyon hinungdanon nga yawi kita makahimo sa pagdesinyo sa usa ka sistema alang sa pagtrabaho uban sa mga kuwerdas, sa tinagsa uban sa mga yawe ug sa ilang decryption.

Ang mga kuwerdas dali ra nga madugtong, ang mga kuwerdas mahimong mabulag sa mga indeks.
Atong kolektahon ug i-parse ang string isip usa ka test case ug susihon kung unsa kini makaapekto sa resulta sa transaksyon.
Gihusay namo ang kamatuoran nga si Alice dili makapirma sa Transaksyon sa Pagbalhin, tungod kay kini nga posibilidad gibabagan sa @verifier alang niining matang sa transaksyon.

Magpraktis ta gamit ang mga kuwerdas ug dayon sulbaron kini.

RIDE Strings

Posible na usab ang transaksyon, nahibal-an namon kung giunsa ang pagtrabaho sa mga kuldas.
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)


Sa kinatibuk-an, naa namo ang tanan nga imong gikinahanglan sa pagsulat sa komplikadong lohika DAO dApp.

Mga Transaksyon sa Data

Mga Transaksyon sa Data:
“Ang kinatas-an nga gidak-on sa usa ka yawe kay 100 ka karakter, ug ang usa ka yawe mahimong adunay arbitraryong mga punto sa Unicode code lakip ang mga luna ug uban pang dili ma-print nga mga simbolo. Ang string values ​​adunay limitasyon nga 32,768 bytes ug ang maximum nga gidaghanon sa posibleng entries sa data transaction kay 100. Sa kinatibuk-an, ang maximum nga gidak-on sa usa ka data transaction kay mga 140kb — alang sa pakisayran, halos eksakto ang gitas-on sa dula ni Shakespeare nga 'Romeo and Juliet '."

Naghimo kami og DAO nga adunay mosunod nga mga kondisyon:
Aron ang usa ka startup makakuha og pondo pinaagi sa pagtawag getFunds() ang suporta sa labing menos 2 ka partisipante - gikinahanglan ang mga tigpamuhunan sa DAO. Pag-atras kini mahimong posible nga eksakto sama sa kantidad nga gipakita sa pagboto Mga tag-iya sa DAO.

Himoon nato ang 3 ka matang sa mga yawe ug idugang ang lohika alang sa pagtrabaho uban sa mga balanse sa 2 ka bag-ong mga gimbuhaton pagboto ug pagkuhaFunds:
xx…xx_ia = mga tigpamuhunan, anaa nga balanse (boto, deposito, withdrawal)
xx…xx_sv = mga pagsugod, gidaghanon sa mga boto (boto, getFunds)
xx…xx_sf = mga pagsugod, gidaghanon sa mga boto (boto, getFunds)
xx…xx = adres sa publiko (35 ka karakter)

Matikdi sa Boto kinahanglan namong i-update ang pipila ka field sa usa ka higayon:

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

Gitugotan kami sa WriteSet nga maghimo daghang mga rekord sa usa ka higayon invokeScript mga transaksyon.

Ingon niini ang hitsura sa key-value store sa DAO dApp pagkahuman napuno si Bob ug Cooper ia- mga deposito:
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Ang among deposit function nausab gamay:
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Karon moabut ang labing hinungdanon nga higayon sa mga kalihokan sa DAO - pagboto alang sa mga proyekto alang sa pondo.

Giboto ni Bob ang proyekto sa Neli sa 500000 ka wavelet:

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

Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Sa data store, atong makita ang tanang gikinahanglan nga mga entry para sa Neli address:
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)
Giboto usab ni Cooper ang proyekto sa Neli.
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Atong tan-awon ang function code getFunds. Kinahanglang mangolekta ug labing menos 2 ka boto si Neli aron maka-withdraw og pundo gikan sa DAO.
Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

I-withdraw ni Neli ang katunga sa kantidad nga gipiyal kaniya:

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

Pagkat-on unsaon pagsulat sa Waves smart nga mga kontrata sa RIDE ug RIDE4DAPPS. Bahin 2 (DAO - Desentralisado nga Autonomous Organization)

Nagmalampuson siya, sa ato pa, nagtrabaho ang DAO!

Among gisusi ang proseso sa paghimo og DAO sa pinulongan RIDE4DAPPS.
Sa mosunod nga mga bahin, atong susihon pag-ayo ang code refactoring ug case testing.

Bug-os nga code sa 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
    }
}

Una nga bahin
Code sa github
Waves RIDE IDE
Pagpahibalo sa Grant Program

Source: www.habr.com

Idugang sa usa ka comment