CREARE DAPP

INTRO

Per creare una Decentralized Application abbiamo a dispozione diversi strumenti qui prendiamo in considerazione i seguenti framework:
TRUFFLE GANACHE MOCHA CHAI
Questi strumenti sono molto utili per effettuare i test che sono molto importanti.
Per i test anche se effettuati in testnet bisogna attendere il mining del block ove è stato inserito il contract ogni volta che si effettua una minima variazione per cui è bene dopo aver compilato il contract con solidity fare dei testi in locale.
Per fare i test possiamo utilizzare GANACHE che usa test-RPC.
Per il riutilizzo e pubblicazione dei moduli è previso ERC190 come standard e per utilizzarli e pubblicarli si può utilizzare NPM o ETHPM.

GANACHE

Ganache può essere utilizzato sia via CLI che con una user interface e ci permette di eseguire test, eseguire comandi, ispezionare lo stato e controllare la blockchain mentre eseguiamo le operazioni.. Per installare la CLI version

npm install -g ganache-cli
poi
$ganache-cli --help //per help
Per install ganache user interface fare il download.

STRUMENTI PER I TEST

Per fare i test si possono utilizzare i framework MOCHA e CHAI.
Con MOCHA si utilizzano assert anche multipli in nodejs usando function describe() e it() poi ci sono le function before() beforeEach() after() e afterEach()

CHAI ci offre fli assert, expect e should. Vediamone alcuni esempi.

var assert = chai.assert;
assert.typeOf(variabile, 'number')
assert.equal(varialibe, 5)
assert.lenghtOf(variabile, 7)

var expect = chai.exspect:
expect.(variabile).to.be.a.('string')
expect.(variabile).to.equal('5')

var should = chai.should();
variabile.should.be.a.('string')
variabile.should.equal('5')

TRUFFLE

Con Truffle possiamo creare lo scaffolding del progetto più la compilazione del programma solidity più la fase di testing ed il deployement del contract.

La TRUFFLE SUITE si compone di altri strumenti per smart contract come i boxes con componenti da utilizzare anche per interagire con altri framewok es. angular o react.
Il comando per installare Truffle è il seguente:
npm install -g truffle

CREARE DAPP con TRUFFLE e GANACHE

Ora creiamo una DAPP con TRUFFLE e la colleghaimo con GANACHE per visualizzare cosa succede quando operiamo nella blockchain.
Per iniziare creare una directory ed aprire la CLI e posizionarsi all'interno della directory crrata.
truffle init //se windows truffle.cmd init
Nella directory TRUFFLE ha creato le 3 directory sottostanti ed il file di configurazione.
contracts migrations test truffle-config.js
Per questo esempio utilizziamo il programma primo.sol già utilizzato in GETH.
All'interno di truffle-config.js inserire i parametri seguenti per comunicare con Ganache:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port:7545,
network_id: "*" //per tuuti i network possibili
}
}
};
poi per creare un contract
truffle create contract primo
Nella directory contract viene creato primo.sol e manualmente si va ad inserire il contenuto del contract
truffle compile primo

Compiling your contracts...
===========================
> Compiling ./contracts/primo.sol
> Artifacts written to /home/mecbar/MyChainTruffle/build/contracts
> Compiled successfully using:
- solc: 0.5.16+commit.9c3226ce.Emscripten.clang
Questo comando crea directory build con la rappresentazione in json del contract.
Ora nella directory migrations inserisco il file 2_deploy_contract.js (mettere numero sequenziale) con all'interno :
var primo = artifacts.require("./primo.sol");
module.exports = function(deployer) {
deployer.deploy(primo);
};
Adesso è il momento di migrare il contract in Ganache.
truffle migrate

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.

Starting migrations...
====================== > Network name: 'development'
> Network id: 5777
> Block gas limit: 6721975 (0x6691b7)

1_initial_migration.js
======================

Deploying 'Migrations'
----------------------
> transaction hash: 0xa5096ce699d426ae88d155fa865d6c9b30e08320405c7e4be79a7b778f7b586c
> Blocks: 0 Seconds: 0
> contract address: 0x3477F00F13409faBE2BD879e62975d0563e9c3aA
> block number: 1
> block timestamp: 1597594511
> account: 0x6830Cb2A6ebbaA6e80A0603A31e404eE8B1ba64B
> balance: 99.99616138
> gas used: 191931 (0x2edbb)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00383862 ETH

> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00383862 ETH

2_deploy_primo.js
=================

Deploying 'primo'
-----------------
> transaction hash: 0xf910503a93e37d144fe6c896a6e4c70cd1d9acd097579aef4dcd6e4c219ecc02
> Blocks: 0 Seconds: 0
> contract address: 0x72d0CB766d194ad69cbC2a956231B5b66862d08A
> block number: 3
> block timestamp: 1597594511
> account: 0x6830Cb2A6ebbaA6e80A0603A31e404eE8B1ba64B
> balance: 99.99297544
> gas used: 116959 (0x1c8df)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00233918 ETH

> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00233918 ETH

Summary
=======
> Total deployments: 2
> Final cost: 0.0061778 ETH
Vediamo adesso cosa è successo nella user interface di Ganache con le transazioni registrate nella blockchain.



Nella figura sottostante vediamo le transazioni registrate nel Block 3 tra transazioni e registrazione del contract



Infine vediamo la creazione del contract nel Block 3

TEST CONTRACT DEPLOYED

Analizziamo ora le funzioni di test che Truffle ci mette a disposizione creando il file js di test
truffle create test primo
Vediamo che nella directory test viene creato il file test.js



Apporto le modifiche al file test per personalizzare il mio test
const primo = artifacts.require("./primo.sol");

contract("primo", function() {
it("should assert true", async function() {
var testa;
return primo.deployed().then(function(istanza1) {
testa = istanza1;
return testa.moltiplica.call(7,5);

}).then(function (risultato) {
assert.equal(risultato.valueOf(),35,'7*5 mi aspetto risultato = 35')
});
});

});
Lanciamo il comando per effettuare il test appena scritto.
truffle test ./test/primo.js
e vediamo l'esito che ci conferma che il risulato atteso di 35 è corretto.
Using network 'development'.

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.

Contract: primo
✓ should assert true

1 passing (96ms)
Se il contract viene modificato rieseguire il comando Truffle compile in modo che qualsiasi contratto sia stato modificato verrà ricompilato. Ricordare di effettuare il comando Truffle migrate se vengono modificati i parametri di configurazione nel nostro esempio i dati inseriti in truffle.js

DEPLOY

Quando abbiamo terminato i test descritti con Ganache si può passare al livello successivo che può essere quello di fare il deploy del contract in una testnet ad esempio Rospen o Rinkeby oppure una propria private network e dopo che anche questa fase abbia dato esito positivo si può passare al deploy sulla blockchain live la rete Ethereum MainNET.
Per effettuare questa operazione si può utilizzare anche Truffle. Vediamo la sintassi del comando migrate con tutte le possibili opzioni.
truffle migrate [--reset] [--f ] [--to ] [--network ] [--compile-all] [--verbose-rpc] [--dry-run] [--interactive] [--skip-dry-run] [--describe-json]
Options:

--reset: Run all migrations from the beginning, instead of running from the last completed migration.
--f : Run contracts from a specific migration. The number refers to the prefix of the migration file.
--to : Run contracts to a specific migration. The number refers to the prefix of the migration file.
--network : Specify the network to use, saving artifacts specific to that network. Network name must exist in the configuration.
--compile-all: Compile all contracts instead of intelligently choosing which contracts need to be compiled.
--verbose-rpc: Log communication between Truffle and the Ethereum client.
--dry-run: Fork the network specified and only perform a test migration.
--skip-dry-run: Skip the test migration performed before the real migration.
--interactive: Prompt to confirm that the user wants to proceed after the dry run.
--describe-json: Prints additional status messages.
Per migrare in una rete diversa usare il comando truttle migrate --network ma prima bisogna modificare nel file truffle.js o truffle-config.js il parametro network.