PILLOLE DI BLOCKCHAIN -- JAVASCRIPT
Connessione
Listening
Peer
Syncro
getNumber
Mining
Accounts
Balance
Unlock Account
Compile
Info Transaction
Deploy Contract
Invoke Smart Contract
NodeJs
Per comunicare con la blockchain tramite Javascript usiamo il modulo web3js che può essere richiamato da NodeJS se abbiamo una applicazione server o tramite MetaMask se ci vogliamo connettere senza server tramite il browser.

MetaMask è una extention che si può applicare ai diversi Browser Come Firefox o Chrome

Il modulo web3js ci fornisce i seguenti sottosistemi:
eth per inteagire con la ethereum blockchain
net per interagire con i node network
personal per interagire con gli accounts e send the transaction
db per fare la get/put dei dati sul local db
shh per p2p messagging con Whisper

Nelle function possiamo sempre inserire il callback oppure la Promise cioè il metodo .then che effettua la promise cioè l'impegno ad eseguire il codice inserito nella promise quando la transazione è termianta
Nell'esempio sottostante creiamo un nuovo account con la password inserita e quando l'operazione è terminata si esegue il codice inserito nella .then che in questo esempio è di inserire nella console l'esito della operazione

web3.eth.personal.newAccount(password)
.then(console.log);


CONNESSIONE

Vediamo come connettere tramite Javascript la nostra applicazione alla blockchain
Possiamo optare per una function sincrona o asincrona (callback)
var web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");

window.addEventListener('load', function() {
if (typeof web3 !== 'undefined' ) {
window.web3 = new Web3(web3.currentProvider);
} else {
console.log('web3 not found')
var provider = document.getElementById('provider1').value;
window.web3 = new Web3(new Web3.providers.HttpProvider(provider));
}
}
Vediamo ora una lista di operazioni che si possono utilizzare con il relativo risultato atteso. Per vericare se siamo connessi alla blockchain
if (web3 && web3.isConnected()) { }
Comando per verificare se siamo in ascolto nella porta assegnata
web3.net.getlistening(function(error, result) {

})
Per ottenere numero dei peer connessi
web3.net.getPeerCount()
Verificare se il nostro nodo è sincronizzato
web3.isSyncing()
Ottenere numero blocco corrente
web3.eth.getBlockNumber([callback])
Verificare se si sta minando nuovi blocchi
web3.mining/getMining
Ottenere gli accounts operativi nella chain
web3.eth.accounts

web3.eth.personal.getAccounts([callback])
Creare un nuovo account
web3.eth.personal.newAccount(password, [callback])
Ottenere il credito di un determinato account
web3.eth.getBalance(account)
Ottenere il relativo valore in wei dato un importo in ether
web3.fromWei(valore, 'ether').toFixed(2);
Sbloccare un account per eseguire delle transazioni
web3.personal.unlockAccount(account, password, function(error, result) {

})

web3.eth.personal.unlockAccount(address, password, unlockDuraction [, callback])
Creare un oggetto per eseguire ad esempio una transazione
var obj = {}
obj.from = address
obj.to = address ricevente
var importo = ether
obj.value = web3.towei(importo, 'ether')
var obj.data = web3.toHex(data) // per inserire extradata into transaction


possiamo inserire anche il gas e se vogliamo rieseguire una operazione per fare l'update dobbiamo inserire nell'oggetto anche nonce : numero nonce della vecchia transazione ancora non minata altrimenti non è possile modificare l'operazione.

web3.eth.sendTransaction(transactionObject [, callback])
l'operazione ritorna l'hash della transazione e se mettiamo il callback possiamo verificare l' esito
Comando per compilare uno smart contract in Solidity
web3.eth.compile.solidity(source_program, function() {

})
Il risultato è il codice abi e bin
Una volta compilato possiamo procedere ad inserire il codice nella Blockchain

var contract = web3.eth.contract(abi)
Poi creare una istanza del contract che va inserita nella chain, questa operazione richiede una fee ma ricordarsi che si può richiamare l'istanza solo dopo che il blocco dove viene inserita sia stato minato

var istanzaContratto = contract.new(from:account, data: bin, gas:gas ) si può inserire
callback (result = transaction hash )

Ottenere info su di una transazione di cui si possiede il codice hash
web3.eth.getTransactioReceipt(transactionHash, function(error, result) {
})
Risultato è l'address della operazione

DEPLOY contract con transaction
var ins = contract.new.getData(param, {data: bytecode(bin)})
Una volta che il contract è stato minato può essere invocato per eseguire un metodo. Si può procedre tramite la function Call o sendTransaction. Di seguito illustriamo le differenze tra i 2 metodi.
CALL
Per invocare un metodo inserito in un smart contract usare l'istanza creata quando inserito il contract
contractInstance.nome_method_dello_smart_contract.call()
la Call viene eseguita nel nodo locale, il risultato è il risultato della funzione, nulla viene modificato nel conntract e non si pagano fee
SENDTRANSACTION

Per invocare il metodo tramite una sendTRansaction il comado è il seguente
contractInstance.method.sendTransaction()
Questa operazione viene eseguita nel node del minatore ci ritorna la transaction hash e apporta una change state nel contract necessita di gas quindi c'è una fee da pagare al minatore
ESEMPIO CALL

var ABIdefinition = JSON.parse(abistring);
var contract = web3.eth.contract(ABIdefinition)
var istanza = contract.at(addtess)
var risultato = istanza.metthods.call(paramtri) //mettere nome metodo al posto di methods
ESEMPIO SENDTRANSACTION

var obj= {
from: address;
gas: gasStimato
}

istanza.methods.sendTransaction(eventuale parametro, obj, function(error,result) {} )

web3.eth.sendTransaction({from: '0x123...', data: '0x432...'})
.on('sending', function(payload){ ... })
.on('sent', function(payload){ ... })
.on('transactionHash', function(hash){ ... })
.on('receipt', function(receipt){ ... })
.on('confirmation', function(confNumber, receipt, latestBlockHash){ ... })
.on('error', function(error){ ... })
.then(function(receipt){
// will be fired once the receipt is mined
});

Vediamo come con NodeJs possiamo creare una connessione con web3js alla blockchain
var Eth = require('web3-eth');

var eth = new Eth(Eth.givenProvider || 'ws://some.local-or-remote.node:8546');
oppure
var Web3 = require('web3');
var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546');