
Sawubona wonke umuntu!
В Kule ngxenye sibheke ngokuningiliziwe indlela yokudala nokusebenza nge-dApp (uhlelo lokusebenza oluhlukaniswe phakathi) ku .
Ake sihlole le ehlukanisiwe kancane manje .
Isinyathelo 3: Ukuhlola i-akhawunti ye-dApp

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:


Sizama ukukhipha izinhlamvu zemali ku-dApp ka-Alice kanye nesiginesha yayo. Sithola iphutha:

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.


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:

Umsebenzi wethu wokufaka imali ushintshe kancane:

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: []}))
Endlini yokugcina idatha, sibona wonke amarekhodi adingekayo ekheli likaNeli:

UCooper uphinde wavotela iphrojekthi kaNeli.

Ake sibheke ikhodi yomsebenzi i-getFundsUNeli kumele aqoqe okungenani amavoti amabili ukuze akwazi ukukhipha imali kwi-DAO.

UNeli uzokhipha ingxenye yemali ayiphathisiwe:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
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-
# 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
}
}
Source: www.habr.com
