Hola a tots!
Més recentment, Waves Labs
Hem escollit el cas DAO perquè
Hem començat amb un exemple senzill a
Vegem aquest exemple, comprovem hipòtesis i observem algunes curiositats:
Tinguem Alice - propietari d'App
Boob i Cooper són socis d'Alice, cofundadors d'Alice-BC DAO
Neli és un empresari que necessita finançament
Banc: un banc que distribueix fitxes
Etapa 1. Inicialització de balanços
Per rebre fitxes a la xarxa de proves d'onades, cal que us poseu en contacte
Podeu trobar l'adreça a l'IDE obrint les dades del vostre compte.
Destaquem Bank 10 WAVES. A continuació, comprovem que han arribat a través del navegador de blocs i transaccions:
Ara distribuirem fitxes del banc a la resta de participants. (Notes: totes les transaccions a la xarxa waves no són gratuïtes, per la qual cosa es requereix un saldo positiu mínim perquè tots els participants facin transaccions).
1 ONDES = 100000000 unitats (onades), ja que les quantitats només poden ser senceres
0.01 WAVES (Comissió de transacció) = 1000000
Banc -> [3 ONDES] -> Alice, mitjançant TransferTransaction (Tipus: 4).
Comprovem que l'env.SEED des del qual es signen les transaccions coincideix amb el nostre Banc:

Si no teniu cap frase inicial que coincideixi, només cal que canvieu-hi a la pestanya Comptes i torneu a comprovar-ho.
Després d'això, creem, anunciem i signem una transacció per a la transferència de 3 WAVES Alice.
També podeu conèixer les dades de l'Alice a través de la variable env.accounts. La numeració comença des de 0, de manera que Alice és env.accounts[1].
broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
El resultat també es pot observar al navegador, un enllaç al mateix ens tornarà immediatament després de l'execució
Ens assegurem que el saldo de l'Alice es reompli amb 3 ONDES i que el saldo bancari es mantingui en 10 - 3 - 0.01 = 0.699.
Enviem a Boob i Cooper 3 ONDES cadascun, i la Neli, la Xena i la Mark 0.2 ONDES cadascuna de la mateixa manera.
(Notes: vam cometre un error d'un caràcter i vam enviar a Neli 0.02 ONDES. Aneu amb compte!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Després de reposar els saldos de tots els participants, veiem:
Etapa 2. Crear un compte dApp
Vam acordar que l'Alice seria la creadora i propietaria de l'aplicació descentralitzada.
Aneu a Comptes, configureu-lo com a SEED i comproveu que env.SEED coincideix amb l'Alice.
Intentem instal·lar l'script (contracte) més senzill possible al compte de l'Alice.
Els contactes intel·ligents a Waves són predicats que prohibeixen o permeten que qualsevol tipus de transacció sortint es produeixi sota determinades condicions. En aquest cas, aquesta condició és SEMPRE. El codi del contracte és cert. Truqueu a desplegar().
Tarifa per transacció setScript 1400000/100000000 = 0.014 WAVES. A l'Alice li queden 2.986 ONDES a la seva balança.
Ara intentem instal·lar una lògica de contracte intel·ligent més complexa al compte d'Alice, descrit a
Ride4Dapps ara inclou 2 nous tipus d'anotacions:
- @Callable(i) — pren com a paràmetre i, les dades sobre quin compte ha trucat/ha signat la transacció. És el resultat d'aquesta funció el que determina el canvi en l'estat del compte dApp. Altres comptes poden crear transaccions i executar funcions amb aquesta anotació i canviar l'estat del compte dApp.
- @Verifier(tx) — Verificador de transaccions amb el paràmetre de transacció tx. Correspon a la lògica de predicats de RIDE. És en aquesta expressió que podeu permetre o prohibir més canvis a la lògica dels contractes intel·ligents al compte dApp.
Fem-ho dApp compte com a cartera comú per a tots els participants.
Per comprovar quin contracte està actiu actualment al vostre compte, podeu copiar el codi base64 del contracte intel·ligent a l'explorador de blocs i reconèixer-lo mitjançant un descompilador (
Ens assegurem que la lògica del contracte intel·ligent coincideixi amb el que esperem.
A l'Alice li queden 2.972 ONDES a la seva balança.
Aquesta dApp fa un seguiment de quant contribueix cada participant al fons comú mitjançant un mecanisme transacció de dades — DataEntry(currentKey, newAmount), on currentKey és el compte que crida a la funció de dipòsit i newAmount és el valor del saldo reposat.
Boob i Cooper fan els seus dipòsits al compte dApp amb 1 WAVES.
Ens equivoquem i la transacció no es realitza. Ja que, malgrat que estàvem convençuts que estàvem fent una transacció en nom d'en Bob, vam cometre un error a l'índex i vam indicar un compte bancari que no té un contracte intel·ligent. Val la pena assenyalar un punt important aquí: hi ha una tarifa per intents infructuosos d'iniciar transaccions no es pot eliminar! A l'Alice li queden 2.972 ONDES a la seva balança. Bob té 3 ONDES.
En Bob ha enviat 1 WAVES al compte dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
A Bob li queden 1.99 ONDES. És a dir, Bob va pagar 0.01 comissió WAVES
L'Alice tenia 2.972 ONDES al seu saldo, ara són 3.972. També es va registrar una transacció al compte d'Alice, però no es va cobrar cap comissió des del compte dApp (Alice).
Després que Cooper també va reposar el compte, el saldo d'Alice es va convertir en 4.972 ONDES.
Podeu esbrinar qui és el propietari de quantes WAVES a la cartera comuna a l'explorador de blocs a la pestanya Dades.
Cooper va canviar d'opinió sobre deixar la quantitat d'1 ONADA a la cartera general i va decidir retirar la meitat de l'afinitat. Per fer-ho, ha de cridar la funció de retirada.
Tanmateix, ens vam equivocar de nou, ja que la funció de retirada té paràmetres completament diferents i una signatura diferent. Quan dissenyeu contractes intel·ligents a RIDE4DAPPS, hauríeu de prestar atenció a aquest punt
Cooper té ara 2.48 ONDES al seu balanç. En conseqüència, 3 ONDES - 1 - 0.01, i després + 0.5 - 0.01. En conseqüència, cada trucada per dipositar i retirar costa 0.01 ONDES. Com a resultat, les entrades de la taula de propietaris dApps van canviar de la següent manera.
Bob també va decidir retirar una mica de diners de la cartera compartida, però va cometre un error i va intentar retirar 1.5 ONDES.
Tanmateix, el contracte intel·ligent tenia un control per a aquesta situació.
La Xena és una estafadora, va intentar retirar 1 ONADA del total del compte.
A ella tampoc li va sortir bé.
A la següent part, veurem qüestions més complexes relacionades amb la imperfecció del compte d'Alice dApp.
Font: www.habr.com