
Ciao a tutti!
Recentemente Waves Labs concorso per sviluppatori in occasione del rilascio della rete di test dell'estensione del linguaggio dei contratti smart RIDE per applicazioni decentralizzate Ride4Dapps!
Abbiamo scelto il caso DAO, poiché intende sviluppare dApp con funzioni sociali: votazioni, raccolta fondi, gestione fiduciaria, ecc.
Abbiamo iniziato a lavorare con un semplice esempio in e in — esempio con .
Esaminiamo questo esempio, verifichiamo le ipotesi e discutiamo alcune stranezze:
Supponiamo di avere Alice — dApp Owner
Boob e Cooper — partner di Alice, co-fondatori di Alice-BC DAO
Neli — proprietario di un'azienda che ha bisogno di finanziamenti
Bank — banca che distribuisce token
Fase 1. Inizializzazione dei saldi
Per ottenere token nella rete di test waves, è necessario contattare e specificare l'indirizzo a cui inviare i token.
L'indirizzo può essere trovato nell'IDE, espandendo i dati dell'account.
Assegniamo a Bank 10 WAVES. Dopo controlliamo che siano arrivati tramite l'esploratore di blocchi e transazioni:
Ora distribuiamo token dalla banca agli altri partecipanti. (Note: tutte le transazioni nella rete waves non sono gratuite, quindi è necessario avere un saldo positivo minimo per tutti i partecipanti per effettuare transazioni).
1 WAVES = 100000000 unità (wavelets), poiché gli importi possono essere solo interi
0.01 WAVES (Commissione di Transazione) = 1000000
Bank -> [3 WAVES] -> Alice, tramite TransferTransaction (Tipo: 4).
Controlliamo che env.SEED, da cui vengono firmate le transazioni, corrisponda al nostro Bank:


Se non hai corrispondenza tra le frasi seed, passa a essa nella scheda Account e controlla di nuovo.
Dopo creiamo, annunciamo e firmiamo la transazione per trasferire 3 WAVES ad Alice.
Puoi ottenere i dati di Alice anche tramite la variabile env.accounts. La numerazione inizia da 0, quindi Alice è env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Il risultato può essere osservato anche nell'esploratore, il link verrà restituito subito dopo l'esecuzione .
Ci assicuriamo che il saldo di Alice sia stato accreditato di 3 WAVES, mentre il saldo della banca è rimasto 10 — 3 — 0.01 = 0.699.


Invieremo a Boob e Cooper 3 WAVES ciascuno, mentre a Neli, Xena e Mark 0.2 WAVES nello stesso modo.
(Note: abbiamo commesso un errore di un'unità e abbiamo inviato a Neli 0.02 WAVES. Fai attenzione!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Dopo il rifornimento dei saldi di tutti i partecipanti, vediamo:

Fase 2. Creazione di un account dApp
Abbiamo concordato che il creatore e proprietario dell'applicazione decentralizzata sarà Alice.
Nella sezione Account impostiamo il suo come SEED e verifichiamo che env.SEED corrisponda ad Alice.
Proviamo a installare sul conto di Alice lo script (contratto) più semplice possibile.
I contratti intelligenti in Waves sono predicati che vietano o consentono a un certo tipo di transazione in uscita di essere eseguita a determinate condizioni. In questo caso, la condizione è ALWAYS. Il codice del contratto è true. Chiamiamo deploy().

La commissione per la transazione setScript è 1400000/100000000 = 0.014 WAVES. Alice ha un saldo residuo di 2.986 WAVES.
Proviamo ora a impostare sul conto di Alice una logica di contratto intelligente più complessa, descritta nell'
Ride4Dapps ora include 2 nuovi tipi di annotazioni:
- @Callable(i) – accetta come parametro i, informazioni su quale account ha chiamato/firmato la transazione. È proprio il risultato di questa funzione che determina la modifica dello stato del conto dApp. Altri account possono creare transazioni e eseguire funzioni con questa annotazione e modificare lo stato del conto dApp.
- @Verifier(tx) – Verificatore della transazione con il parametro tx della transazione. Corrisponde alla logica dei predicati in RIDE. È proprio in questa espressione che si può consentire o vietare ulteriori modifiche alla logica dei contratti intelligenti sul conto dApp.
Facciamo dApp il conto come portafoglio comune per tutti i partecipanti.

Per verificare quale contratto è attualmente attivo sull'account, è possibile copiare il codice base64 del contratto intelligente nell'esploratore di blocchi e riconoscerlo attraverso il decompilatore ()



Assicuriamoci che la logica del contratto intelligente corrisponda a ciò che ci aspettiamo.
Alice ha un saldo residuo di 2.972 WAVES.
Questo dApp tiene traccia di quanto ciascun partecipante contribuisce al fondo comune attraverso il meccanismo data transaction — DataEntry(currentKey, newAmount), dove currentKey è l'account che chiama la funzione deposit, e newAmount è l'importo del saldo rifornito.
Boob e Cooper contribuiscono con i loro depositi sul conto dApp di 1 WAVES.

Facciamo un errore e la transazione non va a buon fine. Nonostante ci siamo assicurati di effettuare la transazione a nome di Bob, abbiamo commesso un errore nell'indice e abbiamo indicato l'account Bank, su cui non vi è alcun contratto intelligente. Qui è importante notare un punto fondamentale: per i tentativi non riusciti di avviare transazioni, viene addebitata una commissione. non si rimuove! Alice ha 2.972 WAVES sul saldo. Bob ha 3 WAVES.
Bob ha inviato 1 WAVES all'Account dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob ha 1.99 WAVES rimasti. Quindi Bob ha pagato 0.01 WAVES di commissione.

Alice aveva origina 2.972 WAVES, ora sono 3.972. È stata registrata anche una transazione sul conto di Alice, tuttavia non è stata addebitata alcuna commissione dall'Account dApp (Alice).
Dopo che Cooper ha ricaricato anche, il saldo di Alice è diventato 4.972 WAVES.

È possibile vedere quanti WAVES appartengono a ciascuno nel portafoglio comune nel visualizzatore di blocchi nella scheda Dati.
Cooper ha cambiato idea sul lasciare 1 WAVES nel portafoglio comune e ha deciso di prelevare metà della somma. Per farlo deve chiamare la funzione withdraw.

Tuttavia, abbiamo di nuovo commesso un errore, poiché la funzione withdraw ha parametri diversi, un'altra firma. Quando progettate smart contract su RIDE4DAPPS, dovreste prestare attenzione a questo aspetto.

Cooper ha 2.48 WAVES nel saldo. Quindi 3 WAVES — 1 — 0.01, e poi + 0.5 — 0.01. Ogni chiamata a deposit e withdraw costa 0.01 WAVES. Di conseguenza, nella tabella dei proprietari delle dApp, le registrazioni sono cambiate come segue.

Anche Bob ha deciso di prelevare una certa somma dal portafoglio comune, ma ha sbagliato e ha cercato di estrarre 1.5 WAVES.

Tuttavia, nel contratto intelligente c'era un controllo per una situazione del genere.
Xena è una truffatrice, ha provato a prelevare 1 WAVES dal conto comune.

Anche lei non ci è riuscita.
Nella prossima parte esamineremo argomenti più complessi legati alle imperfezioni dell'Account dApp di Alice.
Fonte: habr.com
