Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

Ciao a tutti!

Recentemente Waves Labs ha annunciato 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é Ventuary intende sviluppare dApp con funzioni sociali: votazioni, raccolta fondi, gestione fiduciaria, ecc.
Abbiamo iniziato a lavorare con un semplice esempio in sessioni Q&A e in RIDE IDE — esempio con portafoglio comune.

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 faucet 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: esploratore

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:
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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].
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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 della transazione.

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.
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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:
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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().

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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' esempio

Ride4Dapps ora include 2 nuovi tipi di annotazioni:

  1. @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.
  2. @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.
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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 (ad esempio)
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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.
Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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 }]}))

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

Bob ha 1.99 WAVES rimasti. Quindi Bob ha pagato 0.01 WAVES di commissione.

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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.

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

È 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.

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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.

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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.

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

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.

Impariamo a scrivere contratti smart Waves in RIDE e RIDE4DAPPS. Parte 1 (Portafoglio multiutente)

Anche lei non ci è riuscita.

Nella prossima parte esamineremo argomenti più complessi legati alle imperfezioni dell'Account dApp di Alice.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster