Bitcoin Forum

Local => Discussioni avanzate e sviluppo => Topic started by: Makkara on March 25, 2018, 12:53:02 PM



Title: [Programmazione] Smart Contracts
Post by: Makkara on March 25, 2018, 12:53:02 PM
Buongiorno,

è da un pò che mi sto documentando e provando a fare esperimenti con gli smart contract. Non ho nessun fine particolare solo curiosità per il momento, visto che il tempo che ho a disposizione non è nemmeno poi tanto.  

Mi domandavo se qualcun'altro qui ha già scritto qualche smart contract, oppure vuole condividere qualcosa che ha fatto o rispondere a domande/chiedere aiuto.

Alcuni link utili per cominciare:

Tools:

- http://remix.ethereum.org/
- https://metamask.io/
- http://truffleframework.com/ganache/


Guide:

- https://medium.com/@mvmurthy/ethereum-for-web-developers-890be23d1d0c
- https://cryptozombies.io/
- http://www.cryptominando.it/2018/04/17/creare-uno-smart-contract-solidity/
- https://medium.com/@mycoralhealth/learn-to-securely-share-files-on-the-blockchain-with-ipfs-219ee47df54c - IPFS

Documentazione:

- http://solidity.readthedocs.io






Condivido qualcosa che non credo sia ovvia (almeno non per me )

Stavo cercando di creare uno smart contract per salvare un numero indeterminato di bytes nel modo piu efficente possibile in quanto i costi possono essere esorbitanti come sappiamo tutti. Dopo vari tentativi non andati a buon fine ho trovato che l'EVM utilizza come dimensione nativa word a 256bit -> 32byte, questo significa che anche se provi a salvare meno di 32byte ti ritrovi sempre a passare minimo 32byte (sticazzi!  ;D)

Ho verificato la cosa con questo smart contract usando http://remix.ethereum.org e Metamask

Code:
pragma solidity ^0.4.19;

contract SimpleStorage {
  bytes input;
  function setInput(bytes enterBytes){
    input = enterBytes;
  }
}

Provando a passare a setInput 1 byte
Code:
["0x00"]
o 32 byte
Code:
["0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa",
"0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa",
"0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa",
"0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa"]

Metamask avvisa che la dimensione non varia: Data included: 100 bytes

Infine passando 33 byte
Code:
["0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa",
"0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa",
"0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa",
"0x00","0xaa","0xff","0xaa","0xaa","0xaa","0xaa","0xaa","0xaa"]

Ottengo Data included: 132 bytes :o

 

 


Title: Re: [Programmazione] Smart Contracts
Post by: alexrossi on March 27, 2018, 06:41:36 AM
L'unica cosa che mi viene in mente è fare uno sha256 della stringa di testo che vuoi salvare, anche se hai un risultato molto diverso dall'archiviarla


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on March 27, 2018, 09:47:26 AM
L'unica cosa che mi viene in mente è fare uno sha256 della stringa di testo che vuoi salvare, anche se hai un risultato molto diverso dall'archiviarla

si, la soluzione consigliata quando devi archiviare dati ingombranti, vedo che è fare quello più usare un IPFS.


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 13, 2018, 05:40:38 PM
anche io sto studiando come utilizzare gli smart contract
mi piacerebbe interfacciarmi con voi


Title: Re: [Programmazione] Smart Contracts
Post by: picchio on April 13, 2018, 10:12:00 PM
anche io sto studiando come utilizzare gli smart contract
mi piacerebbe interfacciarmi con voi
Io ho trovato questi due articoli che aiutano ad iniziare, non so a che punto siate ma credo che un punto di partenza possa essere interessante:
- https://medium.com/@mvmurthy/ethereum-for-web-developers-890be23d1d0c
- https://cryptozombies.io/
Happy hack


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 16, 2018, 09:22:56 AM
ottimo se qualcuno ad un certo punto vuole postare qualche smart contract che ha fatto con una piccola spiegazione o domande su come fare qualcosa può essere interessante per tutti.

consiglio anche di consultare la documentazione http://solidity.readthedocs.io



Title: Re: [Programmazione] Smart Contracts
Post by: picchio on April 16, 2018, 10:29:50 AM
ottimo se qualcuno ad un certo punto vuole postare qualche smart contract che ha fatto con una piccola spiegazione o domande su come fare qualcosa può essere interessante per tutti.

consiglio anche di consultare la documentazione http://solidity.readthedocs.io


Potresti riassumere i link in OP in modo che possa diventare utile a chi legge il 3d.


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 16, 2018, 10:33:07 AM
quanti di voi hanno esperienza di programmazione ad oggetti c++etc . inoltre terrei d'occhio eos che pare sia più semplice di eth .


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 17, 2018, 10:37:01 AM
quanti di voi hanno esperienza di programmazione ad oggetti c++etc . inoltre terrei d'occhio eos che pare sia più semplice di eth .


io faccio il programmatore come lavoro, ovviamente aiuta, ma da quello che vedo l'ottica in cui devi entrare quando scrivi uno smart contract è leggermente diversa.

Può essere che nel futuro comparirà qualcos'altro meglio di ethereum a livello di SC, siamo solo all'inizio.  8)


ottimo se qualcuno ad un certo punto vuole postare qualche smart contract che ha fatto con una piccola spiegazione o domande su come fare qualcosa può essere interessante per tutti.

consiglio anche di consultare la documentazione http://solidity.readthedocs.io


Potresti riassumere i link in OP in modo che possa diventare utile a chi legge il 3d.

aggiunti


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 18, 2018, 06:20:11 AM
un'altra cosa interessante che ho scoperto/imparato:

Una volta creato un token, ad esempio con il codice standard che trovate qui: https://www.ethereum.org/token mi domandavo come fare in modo che chiunque possa interagire con lo smart contract direttamente ed ottenerli.


Per fare qualcosa di simile ho usato questa funzione, ma in realtà servirebbero altri controlli che non ho inserito, per fare qualcosa di sicuro e non abusabile:

Code:
    // Notifica generazione x tokens all'indirizzo specificato
    event TokenGenerato(address indexed _address, uint _reward);

    function getFreeTokens(){
        uint amount = 100  * 10 ** uint256(decimals);
        
        if (balanceOf[msg.sender] >= amount) throw;
      
        totalSupply += amount;
        balanceOf[msg.sender] += amount;
        
        TokenGenerato(msg.sender, amount);
        
    }

La cosa interessante è che se nell'evento TokenGenerato si inserisce un valore diverso da quello effettivo, ad esempio:

Code:
TokenGenerato(msg.sender, 1000  * 10 ** uint256(decimals));        

Il destinatario può pensare di aver ricevuto 1000 token (la transazione sui trasferimenti dei token mostra 1000 token in ingresso), ma ovviamente andando a controllare il saldo effettivo vedrebbe che ne ha solo 100.

Se non chiamiamo l'evento TokenGenerato, il destinatario ha si 100 token, ma non comprariranno nel saldo token.

Tutto questo giro di parole per far capire che gli eventi sono importanti e indispensabili per avere informazioni aggiornate  ;)
Maggiorni informazioni sugli eventi qui: http://solidity.readthedocs.io/en/v0.4.21/contracts.html#events

Potete verificare quanto sopra controllando i risultati delle transazioni e saldi su https://etherscan.io/




Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 18, 2018, 05:04:25 PM
Bravo Makkara finalmente qualcuno un po' preparato!

Non mi e' ancora chiaro cosa si intende per eventi che generano una notifica...

Volevo chiederti ancora, quando si crea uno smart contract si può' verificare... Ad esempio su myEtherScan se clicchi su Verify and Publish viene verificato. Ma in che senso? Anche questo passaggio non mi e' del tutto chiaro.

Grazie Makkara!


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 19, 2018, 07:36:03 AM
Bravo Makkara finalmente qualcuno un po' preparato!

Non mi e' ancora chiaro cosa si intende per eventi che generano una notifica...

Volevo chiederti ancora, quando si crea uno smart contract si può' verificare... Ad esempio su myEtherScan se clicchi su Verify and Publish viene verificato. Ma in che senso? Anche questo passaggio non mi e' del tutto chiaro.

Grazie Makkara!

In parole povere quando qualcosa cambia in uno smart contract, che può essere il saldo dei token ma anche altro, se necessario deve essere generato un Evento, questo ha lo scoppo di avvertire gli indirizzi/parti interessate da questo cambiamento e agire di conseguenza. Gli eventi vengono salvati sulla blockchain.

La verifica consiste nel controllare se dato un codice sorgente questo corrisponde allo smart contract pubblicato/compilato ad un certo indirizzo. Compilano il sorgente e confrontano il Bytecode generato.


Title: Re: [Programmazione] Smart Contracts
Post by: picchio on April 19, 2018, 02:01:09 PM
Ci provo ... domanda specifica ...
Come si possono fare interagire due smart contract o come è possibile modificare una procedura di uno smart contract già pubblicato (se possibile).


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 19, 2018, 05:30:22 PM
Ci provo ... domanda specifica ...
Come si possono fare interagire due smart contract o come è possibile modificare una procedura di uno smart contract già pubblicato (se possibile).

Puoi usare un pattern del genere

Crei il contratto che esegue le operazioni e contiene i dati
Code:
pragma solidity ^0.4.9;

contract Figlio {
    uint risultato;

    function Figlio(uint valore_iniziale) public {
        risultato = valore_iniziale;
    }
    function setRisultato(uint value) {
        risultato = value;
    }
    function getRisultato() constant returns (uint) {
        return risultato;
    }
}

e poi crei il contratto "Ufficiale" che verrà usato, qui devi definire l'interfaccia del contratto che hai intenzione di usare (Figlio), poi per usarlo crei una nuova istanza e chiami i metodi definiti nell'interfaccia.

Se poi vuoi cambiare la logica ma per motivi di logistica non vuoi cambiare il contratto "Ufficiale" a cui tutti si stanno gia interfacciando, puoi semplicemente cambiare l'indirizzo del figlio.
Code:
pragma solidity ^0.4.9;

contract Figlio {
    function setRisultato(uint value);
    function getRisultato() constant returns(uint);
}

contract Padre {
    address indirizzo_figlio;
    Figlio figlio;
    function Padre(address new_figliolo) public {
        indirizzo_figlio = new_figliolo;
        figlio = Figlio(indirizzo_figlio);
    }
    function setNuovoFiglio(address new_figliolo) {
        indirizzo_figlio = new_figliolo;
        figlio = Figlio(indirizzo_figlio);
    }
    function setRisultato(uint value) {
        return figlio.setRisultato(value);
    }
    function getRisultato()  constant returns(uint) {
        return figlio.getRisultato();
    }
        
}


Comunque esistono diversi pattern che permettono di cambiare il comportamento degli smart contract, se trovo qualche link esaustivo sull'argomento lo posto in seguito.


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 21, 2018, 01:49:03 PM
Comunque https://cryptozombies.io/ e' fatto davvero bene e' spiega con cura anche la questione della creazione di interfacce per far comunicare due smart contract.

Grazie Makkara per le tue spiegazioni.

Sto cercando di far comunicare uno smart contract con delle API esterne usando oraclize in questo caso. Ipotizza un contratto che risponde qualcosa solo a determinati indirizzi. Ovviamente la lista degli indirizzi chiamiamoli "whitelisted" li prenderebbe da queste API. Come imposteresti la cosa?

Altra cosa che mi chiedevo, ovviamente in questo caso la chiamata al contratto e la chiamata oraclize dovrebbe pagarla chi effettivamente chiama il contratto giusto? Come fa a capire effettivamente quanti eth servono?

Oppure e' necessario creare un indirizzo dove il contratto attinge? Sta cosa ancora non mi e' del tutto chiara.

Grazie!!


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 22, 2018, 06:20:58 AM
Se ho capito bene qualcosa del genere:

Per la lista assumo che sia così:
Code:
mapping (address => bool) whiteList;

La funzione dove controlli se il chiamante è nella lista:
Code:
   function doSomething() {
        // recupera la lista whiteList dall altro smart contract
        
        if (whiteList[msg.sender] == false) throw;

        // fai qualcosa
    }

Se la funzione che chiami internamente al tuo contratto non apporta modifiche non dovrebbe costare niente chiamarla, comunque in generale il chiamante paga tutto il gas per le operazioni che vengono eseguite.

Per verificare il costo da javascript, quindi nella tua applicazione, c'è questo, in pratica simula l'esecuzione e ti dice quanto gas serve, comunque non ho ancora sperimentato:

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethestimategas


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 22, 2018, 08:35:24 AM
io ho capito come registrare un o smart contract su rete eth sia su testnet ...sto cercando prima di capire come fare relazionare il contratto ma vedo che voi a sviluppo siete avantissimo rispetto a me ...vogliamo creare un gruppo di sviluppo?


Title: Re: [Programmazione] Smart Contracts
Post by: CryptoHelvetia on April 22, 2018, 01:28:54 PM
quanti di voi hanno esperienza di programmazione ad oggetti c++etc . inoltre terrei d'occhio eos che pare sia più semplice di eth .


io faccio il programmatore come lavoro, ovviamente aiuta, ma da quello che vedo l'ottica in cui devi entrare quando scrivi uno smart contract è leggermente diversa.

Può essere che nel futuro comparirà qualcos'altro meglio di ethereum a livello di SC, siamo solo all'inizio.  8)


ottimo se qualcuno ad un certo punto vuole postare qualche smart contract che ha fatto con una piccola spiegazione o domande su come fare qualcosa può essere interessante per tutti.

consiglio anche di consultare la documentazione http://solidity.readthedocs.io


Potresti riassumere i link in OP in modo che possa diventare utile a chi legge il 3d.

aggiunti
Ho appena letto questo articolo http://www.cryptominando.it/2018/04/17/creare-uno-smart-contract-solidity/ che mi sembra essere buono a livello di contenuti per neofiti, cioè "for dummies", come programmatore che ne pensi?


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 22, 2018, 02:35:18 PM
Se ho capito bene qualcosa del genere:

Per la lista assumo che sia così:
Code:
mapping (address => bool) whiteList;

La funzione dove controlli se il chiamante è nella lista:
Code:
   function doSomething() {
        // recupera la lista whiteList dall altro smart contract
        
        if (whiteList[msg.sender] == false) throw;

        // fai qualcosa
    }

Se la funzione che chiami internamente al tuo contratto non apporta modifiche non dovrebbe costare niente chiamarla, comunque in generale il chiamante paga tutto il gas per le operazioni che vengono eseguite.

Per verificare il costo da javascript, quindi nella tua applicazione, c'è questo, in pratica simula l'esecuzione e ti dice quanto gas serve, comunque non ho ancora sperimentato:

https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethestimategas


Grazie Makkara, molto utile web3ethestimategas esattamente quello che cercavo.

Mi chiedevo cosa succede nel caso in cui si dovessero mandare al contratto meno o più' Ethereum del necessario... Grazie!


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 23, 2018, 06:10:28 AM
io ho capito come registrare un o smart contract su rete eth sia su testnet ...sto cercando prima di capire come fare relazionare il contratto ma vedo che voi a sviluppo siete avantissimo rispetto a me ...vogliamo creare un gruppo di sviluppo?

se hai qualche idea esponila pure qui, entro i limiti di tempo conoscenze ti si può dare una mano 


Ho appena letto questo articolo http://www.cryptominando.it/2018/04/17/creare-uno-smart-contract-solidity/ che mi sembra essere buono a livello di contenuti per neofiti, cioè "for dummies", come programmatore che ne pensi?

si va bene come guida introduttiva per capire come muoversi, aggiungo alla lista dei link



Grazie Makkara, molto utile web3ethestimategas esattamente quello che cercavo.

Mi chiedevo cosa succede nel caso in cui si dovessero mandare al contratto meno o più' Ethereum del necessario... Grazie!

Questa è una questione che non mi è ancora ben chiara e mi dovrei informare, alcune volte ad esempio metamask mi avvisa subito che se imposto un valore del gas troppo alto la transazione fallirà (chiamando uno smart contract).

Comunque fai attenzione perchè a quanto pare in generale è possibile bruciare parecchi ETH in gas per errore, ci sono tanti casi come questo:
https://www.reddit.com/r/ethtrader/comments/7io2d3/someone_used_22_ether_10k_for_a_single_transaction/


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 23, 2018, 10:08:55 AM
ecco perche uso la rete testnet
io non capisco come far comunicare due contratti tipo uin token e uno che redistribuisce i token automaticamente


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 23, 2018, 11:25:16 AM
ecco perche uso la rete testnet
io non capisco come far comunicare due contratti tipo uin token e uno che redistribuisce i token automaticamente


Ti basta inserire una funzione del genere nello smart contract del tuo token, tipo nell'esempio che avevo fatto qualche posto fa per la distribuzione automatica:

Eseguibile solo dal creatore del contratto e passa i token specificati (_value) ai proprietari degli indirizzi in ingresso
Code:
function distributeToken(address[] addresses, uint256 _value) onlyOwner {
     for (uint i = 0; i < addresses.length; i++) {
         balances[owner] -= _value;
         balances[addresses[i]] += _value;
         Transfer(owner, addresses[i], _value);
     }
}

Per testarla da remix passa gli indirizzi in questo formato:

Code:
["0xindirizzo_1", "0xindirizzo_2", "0xindirizzo_3"]



Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 23, 2018, 02:53:23 PM
Qualcuno conosce OpenZeppelin? Dovrebbe essere una libreria per scrivere smart contract sicuri. Oltretutto nei servizi che svolgono e' presente anche l'audit del tuo codice...


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 24, 2018, 07:04:47 AM
Qualcuno conosce OpenZeppelin? Dovrebbe essere una libreria per scrivere smart contract sicuri. Oltretutto nei servizi che svolgono e' presente anche l'audit del tuo codice...

Interessante, quando lo smart contract diventa complesso penso che sia praticamente impossibile evitare problemi, piccoli o grossi che siano


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 25, 2018, 08:43:46 AM
perchè non organizziamo un gruppetto per studiare meglio implementazione smart contract per eth e eos? nella programmazione il gruppo è fondamentale da soli è impossibile a meno che non sei una testa quadra come buterin...e dubito che abbia sviluppato tutto da solo..


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 26, 2018, 06:36:04 AM
perchè non organizziamo un gruppetto per studiare meglio implementazione smart contract per eth e eos? nella programmazione il gruppo è fondamentale da soli è impossibile a meno che non sei una testa quadra come buterin...e dubito che abbia sviluppato tutto da solo..

io personalmente non ho molto tempo da dedicarci, ma magari qualcuno qui può.

Sto guardando altre cose interessanti nel frattempo, tra qualche giorno metto giù qualche altro esempio   :)


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 26, 2018, 09:36:12 AM
ma nenche io ho molto tempo ma per cominciare...solo nei ritagli di tempo..poi chissa


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 26, 2018, 10:21:45 AM
ma nenche io ho molto tempo ma per cominciare...solo nei ritagli di tempo..poi chissa

se hai un idea su un piccolo progetto si potrebbe sviluppare qui a tempo perso a scopo didattico


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 26, 2018, 11:24:09 AM
Secondo me gia' fare solo 2 o 3 volte https://cryptozombies.io/ ti da un'infarinatura più che dignitosa.

Comunque esatto chi vuole incolla il codice del suo smart contract qua e lo si commenta/corregge ecc.

Tanto si e' visto che telegram per queste cose non e' molto produttivo.


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 26, 2018, 05:11:09 PM
Wow mi rendo conto solo adesso delle enormi potenzialità' dei nuovi token ERC721, davvero pazzesco. Qualcuno ha già' provato a crearne qualcuno?


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 26, 2018, 07:41:01 PM
qui stiamo ancora ai 20 hahahahah spiegati


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 26, 2018, 07:43:35 PM
ma girano sempre su eth?


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 26, 2018, 10:10:52 PM
Si certo girano su Eth. Ti lascio questo articolo che sicuramente lo spiega meglio:

https://etherevolution.eu/token-non-fungibili-non-solo-gattini/

Praticamente si possono rappresentare tutti quegli asset non fungibili. Il limite ovviamente e' solo la propria immaginazione.


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 27, 2018, 05:35:34 AM
Si certo girano su Eth. Ti lascio questo articolo che sicuramente lo spiega meglio:

https://etherevolution.eu/token-non-fungibili-non-solo-gattini/

Praticamente si possono rappresentare tutti quegli asset non fungibili. Il limite ovviamente e' solo la propria immaginazione.

stavo leggendo un articolo qualche giorno fa, interessante, ma non ho provato ancora niente in dettaglio.

Con questo token per esempio in giochi online finalmente la gente potrebbe possedere realmente i pixel sullo schermo ;D


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 27, 2018, 08:34:04 AM
ma scusate ...uno scambio di gattini mi sembra limitato ...potrebbe associarsi al token un auto ..una targa..o un bene infungibile giusto?



Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 27, 2018, 08:52:55 AM
ma scusate ...uno scambio di gattini mi sembra limitato ...potrebbe associarsi al token un auto ..una targa..o un bene infungibile giusto?



si una qualsiasi cosa che ha un valore, potrebbe rappresentare il contratto di proprieta di una casa o auto.


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 27, 2018, 11:22:31 AM
Comunque il capitolo 5 di Cryptozombies.io spiega molto bene come crearne uno.


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 27, 2018, 04:13:59 PM
Comunque il capitolo 5 di Cryptozombies.io spiega molto bene come crearne uno.

Effettivamente, è fatto bene, sto provando un po anche io.


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 27, 2018, 07:33:25 PM
Dal momento che in uno smart contract e' impossibile nascondere qualcosa, nel caso non si volesse rendere pubblica una variabile e' necessario criptarla. Qualcuno ha già' avuto modo di provare? Esiste qualche soluzione decentralizzata?

Crypto le mie variabili all'interno dello smart contract, la chiave privata la tengo io, andrebbe quindi salvata "off chain". Il punto critico qua sarei io (in caso di minacce/corruzione potrei dare la chiave privata).


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on April 28, 2018, 12:08:56 PM
Dal momento che in uno smart contract e' impossibile nascondere qualcosa, nel caso non si volesse rendere pubblica una variabile e' necessario criptarla. Qualcuno ha già' avuto modo di provare? Esiste qualche soluzione decentralizzata?

Crypto le mie variabili all'interno dello smart contract, la chiave privata la tengo io, andrebbe quindi salvata "off chain". Il punto critico qua sarei io (in caso di minacce/corruzione potrei dare la chiave privata).


in pratica c'è questo per fare quello che vuoi https://ipfs.io/, però devi avere un server dove farlo girare è un altra cosa che ho nella lista "da guardare"  :)


Considera che in questo caso, partendo dai dati della transazione(input data qui (https://etherscan.io/tx/0x9e780f6ee63cd78f7b497477248e83b6226c620edd590245132337e0eeed7260) ad esempio) è possibile risalire al contenuto della variabile pass, quindi la seguente operazione non è sicura:

Code:
    
function setPass(string pass) {
        uint pass_cryptata = uint(keccak256(pass));
...
}


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 28, 2018, 04:16:26 PM

Considera che in questo caso, partendo dai dati della transazione(input data qui (https://etherscan.io/tx/0x9e780f6ee63cd78f7b497477248e83b6226c620edd590245132337e0eeed7260) ad esempio) è possibile risalire al contenuto della variabile pass, quindi la seguente operazione non è sicura:

Code:
    
function setPass(string pass) {
        uint pass_cryptata = uint(keccak256(pass));
...
}

Ah ok questo non lo sapevo. Quindi in tal caso di dovrebbe criptare il contenuto prima offchain, inviare il contenuto già' criptato, e conservare la chiave offchain.


in pratica c'è questo per fare quello che vuoi https://ipfs.io/, però devi avere un server dove farlo girare è un altra cosa che ho nella lista "da guardare"  :)



In tal caso comunque la chiave pubblica la dovrei conservare io?
Comunque tirare su il server IPFS ci metti un secondo, la problematica sta più su come effettivamente utilizzarlo con Blockchain.


Super interessante. Praticamente lo si può' usare come storage decentralizzato? Cioè' invio un contenuto hashato, ok, ma per riprenderlo mi basta avere questo hash? Quindi teoricamente chiunque disponga di questo hash può' vederne il contenuto? Dovrei quindi rinviare il contenuto criptato dal quale ipfs genera un hash per ovviare a questo problema?

Qua' c'e' un tutorial non male
https://medium.com/@mycoralhealth/learn-to-securely-share-files-on-the-blockchain-with-ipfs-219ee47df54c


Certo che Blockchain + IPFS e' qualcosa di veramente potente.


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on April 28, 2018, 09:23:40 PM
WOO ECCELLENTE QUI COME HO CAPITO SI STRUTTURA PROPRIO UN NUOVA CHAIN INTERESSANTE


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 28, 2018, 11:34:21 PM
Qualcuno ha già' provato Ganache? Permette di creare una chain Ethereum personale dove testare tutto quello che serve. In più' ha anche il block explorer.

http://truffleframework.com/ganache/


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on April 30, 2018, 12:37:33 AM
ma scusate ...uno scambio di gattini mi sembra limitato ...potrebbe associarsi al token un auto ..una targa..o un bene infungibile giusto?



Lol. CryptoKitties e' il progetto più geniale di sempre. Sai quanti milioni sono stati spesi dagli utenti per comprare sti cazzo di crypto gatti?

https://www.cnbc.com/2017/12/06/meet-cryptokitties-the-new-digital-beanie-babies-selling-for-100k.html

Oltretutto se guardi sui vari profili c'e' gente che ha oltre centinaia di k $ di cryptogatti... il che fa riflettere. Alla fine sono solo token ERC721 generati da uno smartcontract che in base ad alcuni valori creano un' IMMAGINE di un gatto di colore diverso.

Considerando che il cryptogatto più caro e' stato venduto per centomila dollari...


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on May 01, 2018, 11:31:29 AM
Qualcuno ha già' provato Ganache? Permette di creare una chain Ethereum personale dove testare tutto quello che serve. In più' ha anche il block explorer.

http://truffleframework.com/ganache/

Ne ho sentito parlare bene ma per il momento faccio ancora tutto da remix, non sono ancora arrivato al punto di avere un interfaccia "seria". Ho notato che su cryptozombie c'è anche una parte per l'UI, magari comincio a vedere da li.

Aggiunti i nuovi link che hai pubblicato


Title: Re: [Programmazione] Smart Contracts
Post by: Piggy on May 04, 2018, 09:46:37 AM
Ottimo thread per esempi, lascio qua una robetta che avevo proposto su meta e per la quale ho preso pesci in faccia  :-\, è comunque un esempio completo, con tanto di interfaccia web.

Tutte le istruzioni e codice sono qui:
https://bitcointalk.org/index.php?topic=3464730.msg36022761#msg36022761


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on May 04, 2018, 05:46:04 PM
Ottimo thread per esempi, lascio qua una robetta che avevo proposto su meta e per la quale ho preso pesci in faccia  :-\, è comunque un esempio completo, con tanto di interfaccia web.

Tutte le istruzioni e codice sono qui:
https://bitcointalk.org/index.php?topic=3464730.msg36022761#msg36022761


https://i.imgur.com/o9EoUuf.gif


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on May 05, 2018, 11:40:23 PM
Ottimo thread per esempi, lascio qua una robetta che avevo proposto su meta e per la quale ho preso pesci in faccia  :-\, è comunque un esempio completo, con tanto di interfaccia web.

Tutte le istruzioni e codice sono qui:
https://bitcointalk.org/index.php?topic=3464730.msg36022761#msg36022761


Complimenti Piggy!


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on May 07, 2018, 09:01:14 AM
qualcuno sta studiando eos?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on May 07, 2018, 03:10:28 PM
qualcuno sta studiando eos?

No, hai qualche link per vedere un pò cosa offre rispetto ad ethereum? Domani se riesco scrivo un altro entusiasmante esempio per smart contract  :o


Title: Re: [Programmazione] Smart Contracts
Post by: alexrossi on May 08, 2018, 08:44:20 AM
Bello cryptozombies! Salvato nei preferiti


Title: Re: [Programmazione] Smart Contracts
Post by: Pinty87 on May 08, 2018, 04:39:41 PM
qualcuno sta studiando eos?
Domani se riesco scrivo un altro entusiasmante esempio per smart contract  :o

Aspetto con ansia!  ;D


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on May 08, 2018, 05:34:48 PM
bankera utilizzera lo standard ERC223 Contract
https://blog.bankera.com/2018/05/07/why-is-the-bnk-token-unique/
di seguito il link per trovare il contratto
https://github.com/Bankera-token/BNK-ETH-Contract

erc223 pare abbia più alti standard di sicurezza e verifica degli errori


Title: Re: [Programmazione] Smart Contracts
Post by: pub.vale.123 on May 16, 2018, 03:32:08 AM
ho sviluppato diversi smartcontract in Solidity, e Golang, chiedi pure in pvt o email

pub.vale.123@gmail.com


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on May 16, 2018, 03:10:44 PM
ho sviluppato diversi smartcontract in Solidity, e Golang, chiedi pure in pvt o email

pub.vale.123@gmail.com

Ciao quali sono i vantaggi nello sviluppare in Golang è più semplice rispetto ad usare Solidity ?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on May 24, 2018, 11:37:09 AM
in questi giorni sto cercando di capire come mandare token ad uno smart contract e poi fare in modo di riprenderli, la prima parte è piuttosto semplice e ci sono diversi modi per farlo ma la seconda mi sta facendo smadonnare non poco.
Appena riesco a capire per bene il tutto metto qua un esempio funzionante :/


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on May 25, 2018, 01:59:43 PM
la funzione di redistribuzione è un casotto hahaha alemno per me


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on May 28, 2018, 01:03:05 PM
Come gestire token in uno smart contract:

Dopo tanta pazienza sono riuscito a capire come funzionano i trasferimenti, quindi cerco di spiegarvi come funziona il tutto, come al solito con esempi che potete provare da voi.

Contratto:

Code:
pragma solidity ^0.4.4;

contract SafeMath {
  function safeMul(uint a, uint b) internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeSub(uint a, uint b) internal returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint a, uint b) internal returns (uint) {
    uint c = a + b;
    assert(c>=a && c>=b);
    return c;
  }

  function assert(bool assertion) internal {
    if (!assertion) throw;
  }
}

contract Token {
  
  function balanceOf(address _owner) constant returns (uint256 balance) {}
  function transfer(address _to, uint256 _value) returns (bool success) {}
  function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {}
  function approve(address _spender, uint256 _value) returns (bool success) {}
}


contract Banca is SafeMath{
  mapping (address => mapping (address => uint)) public tokens; //questo mappa un indirizzo di un token con un la mappatura di un indirizzo di un proprietario e la quantità di quei tokens
  
  event Deposit(address token, address user, uint amount, uint balance);
  event Withdraw(address token, address user, uint amount, uint balance);
  
  function Banca(){
  
  }
  
  function depositoToken(address token, uint amount) {
    if (token==0) throw;
    if (!Token(token).transferFrom(msg.sender, this, amount)) throw;
    tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount);
    Deposit(token, msg.sender, amount, tokens[token][msg.sender]);
  }
  
  function prelievoToken(address token, uint amount) {
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(msg.sender, amount)) throw;
    Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
  }
}  
 

Contratto token per i test:
https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20


Come depositare i token nel vostro smart contract?

I tokens possono essere spediti direttamente all’indirizzo dello smart contract con il vostro client preferito, però questo modo non permette allo smart contract di tenere traccia di chi ha mandato i token, quindi non è ottimale. Per il risolvere il problema dobbiamo prima mappare un indirizzo di un token con la mappatura di un indirizzo di un proprietario e la quantità di tokens:

Code:
mapping (address => mapping (address => uint)) public tokens; 

e permettere allo smart contract di spendere parte dei nostri token, questo avviene tramite il metodo approve del contratto del token che volete trasferire. Interfacciandosi direttamente al contratto del token basta chiamare:
   
Code:
approve(address _spender, uint256 _value)

A questo punto il contratto può spendere parte dei vostri token, fino a raggiungere l’ammontare specificato. In questo modo lo smart contract prende in consegna i tokens e può salvare il mittente e la quantità di tokens depositati tramite la seguente funzione:

Code:
 function depositoToken(address token, uint amount) {
    if (token==0) throw;
    if (!Token(token).transferFrom(msg.sender, this, amount)) throw;
    tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount);
    Deposit(token, msg.sender, amount, tokens[token][msg.sender]);
  }


Come prelevare i token dal vostro smart contract?

Per prelevare i token dallo smart contract non dobbiamo far altro che chiamare dal nostro smart contract la funzione transfer del contratto del token:

Code:
function transfer(address _to, uint256 _value) returns (bool success) {}

Che compare nella nostra funzione per il prelievo:

Code:
function prelievoToken(address token, uint amount) public payable{
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(msg.sender, amount)) throw;
    Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
  }










Piccola parentesi:
In un primo momento per generare un token velocemente avevo utilizzato il codice presente qui, senza guardarci troppo: https://www.ethereum.org/token

Come potete vedere questo in questo contratto la funzione transfer non ritorna un boolean, quindi in questo caso quando chiamo la funzione transfer dal mio contratto mi ritorna sempre false e metamask mi avvisa che c’e’ un errore nel contratto, senza specificare dove. Dopo un pò che ci ho sbattuto la testa mi sono reso conto del problema e preso un contratto standard da qui https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20 anche se per risolvere il problema nel vecchio contratto basta aggiungere:

Code:
    function transfer(address _from, address _to, uint256 _value) public returns (bool success) {
        _transfer(_from, _to, _value);
        return true;
    }

Questo è tutto. Se qualcosa non ho chiaro chiedete pure.


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on May 31, 2018, 09:58:02 PM
 :P ;)grazie ma quindi questi consentono di trasferre automaticamente i token a chi invia eth
?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on June 01, 2018, 05:14:31 AM
:P ;)grazie ma quindi questi consentono di trasferre automaticamente i token a chi invia eth
?

si, basterebbe aggiungerci la parte dove lo smart contract riceve gli eth, che qui non c'è. Appena ho un po di tempo vedo di fare un esempio, perchè lo smart contract non può ricevere direttamente ethereum se non è abilitato a farlo.


Title: Re: [Programmazione] Smart Contracts
Post by: il_minatore on June 12, 2018, 04:19:24 PM
Buongiorno,
giusto per cazzeggio volevo provare a inviare dei token B a tutti gli indirizzi che possiedono il token A. Avete spunti?  ;D
Grazie


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on June 12, 2018, 07:18:53 PM
Buongiorno,
giusto per cazzeggio volevo provare a inviare dei token B a tutti gli indirizzi che possiedono il token A. Avete spunti?  ;D
Grazie

In pratica non c'è un modo semplice per farlo, una volta che hai deciso a che blocco prendere lo snapshot, dovresti andare a vederti gli eventi Transfer lanciati dal contratto del token A.

Quindi:

Ti passi tutti gli eventi Transfer che vanno dal blocco di creazione del token al blocco dello snapshot, a mano a mano dovresti tenere il conto dei bilanci fino ad arrivare ad avere una lista completa con indirizzo - quantità di tokens.

Altrimenti passi tutti gli eventi e salvi tutti gli indirizzi che incontri, poi con web3js dovrebbe essere possibile passare come parametro il numero del blocco del tuo snapshot e verificare in quel momento il saldo token.

Buona fortuna  ;)

EDIT: Piggy aveva postato un esempio e li leggeva gli eventi:

Code:
function checkOwnershipEvents() {
                  document.getElementById("response3").innerHTML = ""
                 
                  var pf = web3.eth.contract(scAbi).at(scAddress);
                  // watch for an event with {some: 'args'}
                  var myEvent = pf.ProofOfOwnership({ some: 'args' }, { fromBlock: 0, toBlock: 'latest' });
                  // would get all past logs again.
                  var myResults = myEvent.get(function (error, logs) {
                      console.log(logs);
                      var event1;
                      for (var i = 0; i < logs.length ; i++) {
                          event1 = JSON.stringify(logs[i].args);
                          document.getElementById("response3").innerHTML += '<font color="green">Proof of ownership received: </font>' + JSON.stringify(event1) + '<br>'
                      }
                  });
              }



Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on June 17, 2018, 11:18:47 AM
Si parla molto degli smart contract di EOS ma sembra che anche Ripple ha tirato su un bel sistema:

https://cdn-images-1.medium.com/max/2000/0*RIJX5JW7p_r6mR-i

Qui trovate degli articoli che spiegano un po il funzionamento:

https://xrpcommunity.blog/codius-smart-contracts-done-right/

https://medium.com/coil/codius-smart-contracts-made-from-containers-b3b16c3e3890


Alcuni punti chiave:

Quote
Codius works differently than smart contracts in Bitcoin or Ethereum. The contracts run on independent hosts without an underlying blockchain, similar to traditional hosting. This allows them to interact with any service or API, scale infinitely, and read from or write to any blockchain

Quote
Another biggest difference, perhaps one of the most important, is that Codius can keep secrets while Ethereum can't. That means Codius can, for example, control a bitcoin wallet while an Ethereum smart contract can't


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on June 18, 2018, 07:49:41 PM
ecco perche uso la rete testnet
io non capisco come far comunicare due contratti tipo uin token e uno che redistribuisce i token automaticamente


Ti basta inserire una funzione del genere nello smart contract del tuo token, tipo nell'esempio che avevo fatto qualche posto fa per la distribuzione automatica:

Eseguibile solo dal creatore del contratto e passa i token specificati (_value) ai proprietari degli indirizzi in ingresso
Code:
function distributeToken(address[] addresses, uint256 _value) onlyOwner {
     for (uint i = 0; i < addresses.length; i++) {
         balances[owner] -= _value;
         balances[addresses[i]] += _value;
         Transfer(owner, addresses[i], _value);
     }
}

Per testarla da remix passa gli indirizzi in questo formato:

Code:
["0xindirizzo_1", "0xindirizzo_2", "0xindirizzo_3"]




se tengo un contratto già in test genero altro contratto che redistribuisce il n 100 tokenA a tutti gli indirizzi che inviano a questo contratto tpo 0.01 eth quale funzione uso?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on June 19, 2018, 11:26:13 AM
devi aggiungere al tuo contratto questa funzione:

Code:
   function () payable{

        // Qui dentro poi usi msg.sender per sapere chi e' il destinatario dei token e msg.value per calcolare quanti token spedirgli


        LogReceivedFunds(msg.sender, msg.value);


    }

Una volta che dichiari questa funzione e' possibile mandare direttamente gli ETH allo smart contract (come succede per le ICO), senza il bisogno per l'utente di chiamare una funzione specifica dello smart contract.

Se invece vuoi avere una funzione chiamabile che accetta ETH devi usare:

Code:
function pay() payable 
        public
        returns(bool success)
    {
        //Operazioni ...

        LogReceivedFunds(msg.sender, msg.value);
        return true;
    }

Questa e' un po' piu complicata da usare lato utente


Title: Re: [Programmazione] Smart Contracts
Post by: dvd14986 on June 21, 2018, 08:45:02 PM
Ciao a tutti.

Felice di aver trovato questo topic!

Ho iniziato da poco a smanettare con gli smart contract anche io.

L'approccio è un po particolare, ma credo che basti cominciare ad entrare nell'ottica del sistema.
Ho trovato molto utili dei link trovati sotto un video di youtube.
https://www.youtube.com/watch?v=gSQXq2_j-mw

Sotto ci sono diversi link anche al repository github con tutto il materiale del video.

Comunque grazie a tutti, ho trovato in 2 minuti milioni di info utili in un unico post!


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on June 22, 2018, 04:54:46 PM
Benvenuto a bordo  8), se hai appena cominciato e non vuoi preoccuparti troppo dell interfaccia ti consiglio di usare semplicemente metamask e remix sulla rete ropsten, trovi i link nel primo post


Title: Re: [Programmazione] Smart Contracts
Post by: dvd14986 on June 24, 2018, 01:40:30 AM
Benvenuto a bordo  8), se hai appena cominciato e non vuoi preoccuparti troppo dell interfaccia ti consiglio di usare semplicemente metamask e remix sulla rete ropsten, trovi i link nel primo post

Grazie!

Diciamo che mi piacciono le cose difficili, quindi ho settato tutto offline, quindi ganache, truffle, solc, web3 e ovvimente metamask per la gestione delle tx su web. Devo dire che ci è voluto un pò, però poi capito il meccanismo è relativamente semplice.
Ho fatto anche qualche test e funziona tutto, ora devo metterci le mani seriamente per un progettino un po più complesso.

Poi una volta testato "offline" devo passarlo per forza su ropsten e a quel punto è probabile che vi dia fastidio qui  :D


Title: Re: [Programmazione] Smart Contracts
Post by: Piggy on July 09, 2018, 09:25:30 PM
Chiedo qui se qualcuno ha qualche idea:

Come si potrebbe sviluppare un sistema che blocca una certa quantità di token?

Mi spiego meglio: imagginiamo che per accedere ad un servizio al posto di pagare con dei token, mi venga richiesto di avere una certa quantità di token e l'obbligo di tenerli bloccati fino a che il servizio non termina. Qualche idea su come impostare gli smart contract a grandi linee?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on July 10, 2018, 05:29:52 AM
Chiedo qui se qualcuno ha qualche idea:

Come si potrebbe sviluppare un sistema che blocca una certa quantità di token?

Mi spiego meglio: imagginiamo che per accedere ad un servizio al posto di pagare con dei token, mi venga richiesto di avere una certa quantità di token e l'obbligo di tenerli bloccati fino a che il servizio non termina. Qualche idea su come impostare gli smart contract a grandi linee?

problema interessante  8) proverò a guardarci un pò appena ho tempo


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on July 12, 2018, 06:34:20 AM
Gestire Lock & Unlock dei tokens

Partendo da qui: https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20

Ho modificato il contratto per permettere di lockare i token, se noti ho messo dei commenti dove ho modificato il codice.

Ho creato una nuova variabile che contine la quantita dei token in lock:

Code:
mapping (address => uint256) public locked;

Aggiunto i controlli durante i trasferimenti per essere sicuri che ci siano abbastanza tokens disponibili per i trasferimenti, considerando l'ammontare in lock.

Aggiunti gli eventi nel momento in cui viene effettuato il lock e unlock:

Code:
    event Lock(address indexed _owner, uint256 _value);
    event Unlock(address indexed _owner, uint256 _value);

Aggiunto funzioni per effettuare lock/unlock e verificare quanti token si hanno in lock, il proprietario dei token in questo caso ha il potere di fare lock ed unlock ma è facilmente possibile cambiare il codice per permettere ad una terza parte di effettuare il solo unlock, lock o entrambi:

Code:
    function lock(uint256 _value) public returns (bool success){
        require(safeSub(balances[msg.sender], locked[msg.sender]) >= _value); // New check for token availability - Makkara
        locked[msg.sender] = _value;
        emit Lock(msg.sender, _value); // Raise event for locked tokens.
        return true;
    }
    
    function locked() public view returns (uint256 _value){
        return locked[msg.sender];
    }
    
    function unlock(uint256 _value) public returns (bool success){
        require(locked[msg.sender] >= _value);
        locked[msg.sender]-=_value;
        return true;
    }

Questo è il contratto completo pronto per l'uso. Ho fatto alcuni test e funziona, ma non posso garantire che sia esente da problemi, o possa soffrire in futuro per via di eventuali bug o exploit :)
Code:
// Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
pragma solidity ^0.4.21;

contract SafeMath {
  function safeMul(uint256 a, uint256 b) internal returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeSub(uint256 a, uint256 b) internal returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint256 a, uint256 b) internal returns (uint256) {
    uint256 c = a + b;
    assert(c>=a && c>=b);
    return c;
  }

  function assert(bool assertion) internal {
    if (!assertion) throw;
  }
}

contract EIP20Interface {
    /* This is a slight change to the ERC20 base standard.
    function totalSupply() constant returns (uint256 supply);
    is replaced with:
    uint256 public totalSupply;
    This automatically creates a getter function for the totalSupply.
    This is moved to the base contract since public getter functions are not
    currently recognised as an implementation of the matching abstract
    function by the compiler.
    */
    /// total amount of tokens
    uint256 public totalSupply;

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) public view returns (uint256 balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint256 _value) public returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);

    /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of tokens to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint256 _value) public returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) public view returns (uint256 remaining);

    /// @notice `msg.sender` locks the amount of `_value` tokens
    /// @param _value The amount of tokens to be locked
    /// @return Whether the lock was successful or not
    function lock(uint256 _value) public returns (bool success);
    
    /// @notice `msg.sender` check the amount of tokens locked
    /// @return The amount of tokens locked
    function locked() public view returns (uint256 _value);

    /// @notice `msg.sender` unlocks the amount of `_value` tokens
    /// @param _value The amount of tokens to be unlocked
    /// @return Whether the unlock was successful or not
    function unlock(uint256 _value) returns (bool success);

    // solhint-disable-next-line no-simple-event-func-name
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    event Lock(address indexed _owner, uint256 _value);
    event Unlock(address indexed _owner, uint256 _value);
}


contract EIP20 is EIP20Interface, SafeMath {

    uint256 constant private MAX_UINT256 = 2**256 - 1;
    mapping (address => uint256) public balances;
    mapping (address => mapping (address => uint256)) public allowed;
    mapping (address => uint256) public locked;
    /*
    NOTE:
    The following variables are OPTIONAL vanities. One does not have to include them.
    They allow one to customise the token contract & in no way influences the core functionality.
    Some wallets/interfaces might not even bother to look at this information.
    */
    string public name;                   //fancy name: eg Simon Bucks
    uint8 public decimals;                //How many decimals to show.
    string public symbol;                 //An identifier: eg SBX

    function EIP20(
        uint256 _initialAmount,
        string _tokenName,
        uint8 _decimalUnits,
        string _tokenSymbol
    ) public {
        balances[msg.sender] = _initialAmount * 10 ** uint256(_decimalUnits);               // Give the creator all initial tokens
        totalSupply = _initialAmount * 10 ** uint256(_decimalUnits);                        // Update total supply
        name = _tokenName;                                   // Set the name for display purposes
        decimals = _decimalUnits;                            // Amount of decimals for display purposes
        symbol = _tokenSymbol;                               // Set the symbol for display purposes
        locked[msg.sender] = 0;  //Initialize locked tokens for the creator - Makkara
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {
        require(safeSub(balances[msg.sender], locked[msg.sender]) >= _value); // New check for token availability - Makkara
        balances[msg.sender] -= _value;
        balances[_to] += _value;
        emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        uint256 allowance = allowed[_from][msg.sender];
        require(safeSub(balances[_from], locked[_from]) >= _value && allowance >= _value);
        balances[_to] += _value;
        balances[_from] -= _value;
        if (allowance < MAX_UINT256) {
            allowed[_from][msg.sender] -= _value;
        }
        emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
        return true;
    }

    function balanceOf(address _owner) public view returns (uint256 balance) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        require(safeSub(balances[msg.sender], locked[msg.sender]) >= _value); // New check for token availability - Makkara
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
        return true;
    }

    function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
    
    function lock(uint256 _value) public returns (bool success){
        require(safeSub(balances[msg.sender], locked[msg.sender]) >= _value); // New check for token availability - Makkara
        locked[msg.sender] = _value;
        emit Lock(msg.sender, _value); // Raise event for locked tokens.
        return true;
    }
    
    function locked() public view returns (uint256 _value){
        return locked[msg.sender];
    }
    
    function unlock(uint256 _value) public returns (bool success){
        require(locked[msg.sender] >= _value);
        locked[msg.sender]-=_value;
        emit Unlock(msg.sender, _value); // Raise event for unlocked tokens.
        return true;
    }
    
}


Title: Re: [Programmazione] Smart Contracts
Post by: Piggy on July 12, 2018, 09:46:38 AM
Ottimo grazie, soluzione semplice e chiara, ora devo solo capire come è meglio impostare le cose, ma nel mio caso penso il gestore del servizio sblocca i token e l'utente li blocca.


Title: Re: [Programmazione] Smart Contracts
Post by: Piggy on July 15, 2018, 01:43:09 PM
Un altro soggetto che varrebbe la pena discutere o avere qualche esempio in questo thread, sarebbe qualcosa sui nuovi token non fungibili. Stavo giusto cominciando a leggere qualcosa a riguardo.


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on July 17, 2018, 08:57:46 AM
sono incuriosito dai token stabili tipo eurt come fa a rimanere stabile ?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on July 17, 2018, 04:19:02 PM
Un altro soggetto che varrebbe la pena discutere o avere qualche esempio in questo thread, sarebbe qualcosa sui nuovi token non fungibili. Stavo giusto cominciando a leggere qualcosa a riguardo.

Concordo se vuoi scrivere qualche esempio, welcome  ;) io non li ho ancora guardati comunque mi interessa la cosa

sono incuriosito dai token stabili tipo eurt come fa a rimanere stabile ?


Semplicemente avranno un equivalente in € depositato da qualche parte a garanzia, tipo usdt, che poi sia vero o no non si sa. >:(


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on July 21, 2018, 11:35:34 AM
si ma se oggetto di speculazione possono scendere e salire ....quindi non soggetto a fluttuazioni


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on September 27, 2018, 11:51:36 AM
Tra qualche giorno, a grande richiesta,  arriva un nuovo e fantastico episodio sui token erc-721, completo di esempi e spiegazioni come al solito  8)



Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on September 28, 2018, 11:52:38 AM
Token ERC-721 o token non fungibili

A differenza dei token ERC-20, i quali non hanno differenze l’uno dall’altro, i token non fungibili hanno principalmente lo scopo di rappresentare il possesso di un un'entità con caratteristiche uniche.

Partendo da github ho trovato questa implementazione: https://github.com/m0t0k1ch1/ERC721-token-sample/tree/master/contracts che ho provveduto a modificare e semplificare per rendere più semplice la spiegazione e il funzionamento.
Avendo già illustrato in esempi precedenti come funzionano i token ERC-20 potrete notare come questi due standard condividono parte delle funzionalità.

Questa è l’interfaccia da implementare per usare lo standard ERC-721:

Code:

contract ERC721 {
    
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);
}



come potete vedere a prima vista è molto simile alla ERC-20 (https://theethereum.wiki/w/index.php/ERC20_Token_Standard) e, controllando in dettaglio noterete che tutte le operazioni che riguardano i token non “parlano” di quantità ma di un Id (_tokenId).



Definizione generale sulle informazioni che il token detiene e informazioni su chi li possiede:

Code:
string public constant name = "Tokenized Item";
  string public constant symbol = "NFTI";

  struct Token { // Definizione delle informazioni mantenute dal token
    address mintedBy;
    uint64 mintedAt;
    string description; /*Aggiunta allo scopo di rendere più comprensibile l’esempio, in realtà questo potrebbe essere un hash di un link IPFS o maggiori informazioni sul token senza incidere troppo sui costi derivanti dall’utilizzo delle informazioni all’interno dello smart contract*/
  }

  Token[] tokens; // Array dei token in esistenza

   //Mappature
  mapping (uint256 => address) public tokenIndexToOwner; //Token -> User
  mapping (address => uint256) ownershipTokenCount; //User -> Token
  mapping (uint256 => address) public tokenIndexToApproved; //Token -> User approvato a spendere il token

//Evento
  event Mint(address owner, uint256 tokenId, string description);

Funzioni interne sono per lo più simili a quelle di un ERC-20, gestiscono internamente le operazioni per tenere traccia di:
  • chi possiede un token
  • a chi appartiene un token
  • chi è autorizzato a spendere o muovere un token

tramite i mapping sopra citati.
Code:
function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
    return tokenIndexToOwner[_tokenId] == _claimant;
  }

  function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
    return tokenIndexToApproved[_tokenId] == _claimant;
  }

  function _approve(address _to, uint256 _tokenId) internal {
    tokenIndexToApproved[_tokenId] = _to;

    Approval(tokenIndexToOwner[_tokenId], tokenIndexToApproved[_tokenId], _tokenId);
  }

  function _transfer(address _from, address _to, uint256 _tokenId) internal {
    ownershipTokenCount[_to]++;
    tokenIndexToOwner[_tokenId] = _to;

    if (_from != address(0)) {
      ownershipTokenCount[_from]--;
      delete tokenIndexToApproved[_tokenId];
    }

    Transfer(_from, _to, _tokenId);
  }


è presente una funzione _mint per creare un nuovo token e assegnarnlo all’indirizzo specificato, che in questo caso, osservando la funzione pubblica mint coincide con chi esegue il metodo mint.
Code:
  function _mint(address _owner, string description) internal returns (uint256 tokenId) {
    Token memory token = Token({
      mintedBy: _owner,
      mintedAt: uint64(now),
      description: description
    });
    tokenId = tokens.push(token) - 1;

    Mint(_owner, tokenId, description);

    _transfer(0, _owner, tokenId);
  }


Queste sono le funzioni principali per testare la creazione e visualizzare delle informazioni del token tramite Remix (https://remix.ethereum.org):
Code:
  function mint(string description) external returns (uint256) {
    return _mint(msg.sender,description);
  }

  function getToken(uint256 _tokenId) external view returns (address mintedBy, uint64 mintedAt,string description) {
    Token memory token = tokens[_tokenId];

    mintedBy = token.mintedBy;
    mintedAt = token.mintedAt;
    description = token.description;
  }


Codice completo per test su Remix:

Se avete domande o volete chiarimenti sono disponibile.

Code:
pragma solidity ^0.4.18;

contract ERC721 {
    
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);
}

contract NFTItem is ERC721 {
 
  string public constant name = "Tokenized Item";
  string public constant symbol = "NFTI";

  /*** DATA TYPES ***/

  struct Token {
    address mintedBy;
    uint64 mintedAt;
    string description;
  }

  Token[] tokens;

  mapping (uint256 => address) public tokenIndexToOwner;
  mapping (address => uint256) ownershipTokenCount;
  mapping (uint256 => address) public tokenIndexToApproved;

  event Mint(address owner, uint256 tokenId, string description);


  /*** INTERNAL FUNCTIONS ***/

  function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
    return tokenIndexToOwner[_tokenId] == _claimant;
  }

  function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
    return tokenIndexToApproved[_tokenId] == _claimant;
  }

  function _approve(address _to, uint256 _tokenId) internal {
    tokenIndexToApproved[_tokenId] = _to;

    Approval(tokenIndexToOwner[_tokenId], tokenIndexToApproved[_tokenId], _tokenId);
  }

  function _transfer(address _from, address _to, uint256 _tokenId) internal {
    ownershipTokenCount[_to]++;
    tokenIndexToOwner[_tokenId] = _to;

    if (_from != address(0)) {
      ownershipTokenCount[_from]--;
      delete tokenIndexToApproved[_tokenId];
    }

    Transfer(_from, _to, _tokenId);
  }

  function _mint(address _owner, string description) internal returns (uint256 tokenId) {
    Token memory token = Token({
      mintedBy: _owner,
      mintedAt: uint64(now),
      description: description
    });
    tokenId = tokens.push(token) - 1;

    Mint(_owner, tokenId, description);

    _transfer(0, _owner, tokenId);
  }


  /*** ERC721 IMPLEMENTATION ***/

  function totalSupply() public view returns (uint256) {
    return tokens.length;
  }

  function balanceOf(address _owner) public view returns (uint256) {
    return ownershipTokenCount[_owner];
  }

  function ownerOf(uint256 _tokenId) external view returns (address owner) {
    owner = tokenIndexToOwner[_tokenId];

    require(owner != address(0));
  }

  function approve(address _to, uint256 _tokenId) external {
    require(_owns(msg.sender, _tokenId));

    _approve(_to, _tokenId);
  }

  function transfer(address _to, uint256 _tokenId) external {
    require(_to != address(0));
    require(_to != address(this));
    require(_owns(msg.sender, _tokenId));

    _transfer(msg.sender, _to, _tokenId);
  }

  function transferFrom(address _from, address _to, uint256 _tokenId) external {
    require(_to != address(0));
    require(_to != address(this));
    require(_approvedFor(msg.sender, _tokenId));
    require(_owns(_from, _tokenId));

    _transfer(_from, _to, _tokenId);
  }

  function tokensOfOwner(address _owner) external view returns (uint256[]) {
    uint256 balance = balanceOf(_owner);

    if (balance == 0) {
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](balance);
      uint256 maxTokenId = totalSupply();
      uint256 idx = 0;

      uint256 tokenId;
      for (tokenId = 1; tokenId <= maxTokenId; tokenId++) {
        if (tokenIndexToOwner[tokenId] == _owner) {
          result[idx] = tokenId;
          idx++;
        }
      }
    }

    return result;
  }

  function mint(string description) external returns (uint256) {
    return _mint(msg.sender,description);
  }

  function getToken(uint256 _tokenId) external view returns (address mintedBy, uint64 mintedAt,string description) {
    Token memory token = tokens[_tokenId];

    mintedBy = token.mintedBy;
    mintedAt = token.mintedAt;
    description = token.description;
  }
}









Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on October 01, 2018, 04:06:00 PM
grazie makkara ...dai dei contributi davvero importanti. ma per caso sai come interfaccaire un token con un app android? vorrei creare un token rc20 e un semplice wallet app per scambiarlo


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on October 04, 2018, 08:56:40 AM
grazie makkara ...dai dei contributi davvero importanti. ma per caso sai come interfaccaire un token con un app android? vorrei creare un token rc20 e un semplice wallet app per scambiarlo

Non ne ho idea, su github potrebbe esserci qualcosa


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on October 05, 2018, 07:47:39 AM
grazie


Title: Re: [Programmazione] Smart Contracts
Post by: Piggy on October 28, 2018, 08:46:28 AM
Segnalo questo thread in inglese dove si tratta di testamenti ed è saltato fuori qualcosa di interessante di cui non ero a conoscenza https://bitcointalk.org/index.php?topic=5052754.0

Il succo è: creando con un nuovo indirizzo ethereum un certo numero di smart contract in una rete di test e poi nella main net ethereum, questi avranno gli stessi indirizzi.

https://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed/761#761

Quote
The address for an Ethereum contract is deterministically computed from the address of its creator (sender) and how many transactions the creator has sent (nonce). The sender and nonce are RLP encoded and then hashed with Keccak-256.


Title: Re: [Programmazione] Smart Contracts
Post by: picchio on October 28, 2018, 10:16:03 AM
Segnalo questo thread in inglese dove si tratta di testamenti ed è saltato fuori qualcosa di interessante di cui non ero a conoscenza https://bitcointalk.org/index.php?topic=5052754.0

Il succo è: creando con un nuovo indirizzo ethereum un certo numero di smart contract in una rete di test e poi nella main net ethereum, questi avranno gli stessi indirizzi.

https://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed/761#761

Quote
The address for an Ethereum contract is deterministically computed from the address of its creator (sender) and how many transactions the creator has sent (nonce). The sender and nonce are RLP encoded and then hashed with Keccak-256.
E' per queste cose che adoro il modo crypto-blockchain.
E' come quando qualcuno scopre l'acqua calda :) (*)
EDIT: bisogna però osservare che ethereum ha già dato segni di non immutabilità delle regole.
EDIT2: (*) e scopre un utilizzo interessante dell'acqua calda ...


Title: Re: [Programmazione] Smart Contracts
Post by: lorecoincoin on October 28, 2018, 04:38:21 PM
a dirla ll' inglese OMG


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on October 29, 2018, 07:32:59 AM
Segnalo questo thread in inglese dove si tratta di testamenti ed è saltato fuori qualcosa di interessante di cui non ero a conoscenza https://bitcointalk.org/index.php?topic=5052754.0

Il succo è: creando con un nuovo indirizzo ethereum un certo numero di smart contract in una rete di test e poi nella main net ethereum, questi avranno gli stessi indirizzi.

https://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed/761#761

Quote
The address for an Ethereum contract is deterministically computed from the address of its creator (sender) and how many transactions the creator has sent (nonce). The sender and nonce are RLP encoded and then hashed with Keccak-256.

Non la sapevo questa cosa degli indirizzi, ed è vero che potrebbe tornare utile  8)

Per l'utilizzo che ne fà nel suo caso, forse avrebbe potuto bloccare il testamento usando il numero del blocco corrente ( 10 - 20 o 30 anni nel futuro contando un tempo di creazione per blocco di 10 minuti) e ritardando la scandenza nel caso fosse ancora in vita. Ci sono un sacco di modi magari piu semplici per fare un testamento.


Title: Re: [Programmazione] Smart Contracts
Post by: picchio on November 10, 2018, 11:12:29 PM
Cercano un programmatore smart contract waves,
https://bitcointalk.org/index.php?topic=5066539.0
non sapevo esistessero e ho iniziato a guardare ...
Vi copio/incollo gli appunti che ho preso ...

Code:
Smart contract (waves - appunti sparsi)
    white paper <https://wavesplatform.com/files/docs/white_paper_waves_smart_contracts.pdf>
    video esempio <https://hooktube.com/watch?v=sOZuE9Ebfko>
    documentazione <https://docs.wavesplatform.com/en/technical-details/waves-contracts-language-description.html>
        Associ uno scrip ad un account
        Le transazioni sono valide se lo script approva
            Firme e altri dati
            proofs
                ?
            Numero blocchi della catena
            dati presenti nella catena, oracoli
                Inseriti con DataTransaction
            Gli script possono essere sostituiti o annullati associandone uno nuovo
                A meno che lo script precedente non lo vieti
            Default script di un account
                sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk)
           
        Costo script
            Dipendono dalla complessità
            max 8kByte
            minimo: 0.004 WAVES
            Costi minimi (non script) <https://docs.wavesplatform.com/en/technical-details/transactions-fees.html>
        Esempi
            Vedi documentazione <https://docs.wavesplatform.com/en/technical-details/waves-contracts-language-description/approach-and-capabilities.html>
                Account scambia solo BTC
                    let cooperPubKey = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6A8'
                    let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
                    match tx {
                        case o: Order =>
                            sigVerify(tx.bodyBytes, tx.proofs[0], cooperPubKey ) && (o.assetPair.priceAsset == BTCId || o.assetPair.amountAsset == BTCId)
                        case _ => sigVerify(tx.bodyBytes, tx.proofs[0], cooperPubKey )
                    }
                Buy back ad uno specifico prezzo in WAVES
                    let myAssetId = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6B9'
                    let cooperPubKey = base58'BVqYXrapgJP9atQccdBPAgJPwHDKkh6A8'
                    match tx {
                        case o: Order =>
                            o.assetPair.priceAsset == base58'' && o.assetPair.amountAsset == myAssetId && o.price == 500000 && o.amount == 1000 && o.orderType == Buy
                        case _ => sigVerify(tx.bodyBytes, tx.proofs[0], cooperPubKey )
                    }
        come associare uno script ad un account
            ...
        DataTransaction
            Da capire
Sembrano interessanti, l'impressione è che, forse, sono relativamente semplici da capire e implementare.


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on November 11, 2018, 06:11:56 AM
Se hai qualche informazione base o link che spiegano qualcisa in generale e come pubblicarli e interagire. Potrebbe essere utile come alternativa.


Title: Re: [Programmazione] Smart Contracts
Post by: picchio on November 11, 2018, 11:21:29 AM
Se hai qualche informazione base o link che spiegano qualcisa in generale e come pubblicarli e interagire. Potrebbe essere utile come alternativa.
Se parli di waves ho riportato i link che ho trovato utili. Sono molto lento ad approfondire e alla fine mi perdo. ....


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on November 12, 2018, 05:23:33 AM
Se hai qualche informazione base o link che spiegano qualcisa in generale e come pubblicarli e interagire. Potrebbe essere utile come alternativa.
Se parli di waves ho riportato i link che ho trovato utili. Sono molto lento ad approfondire e alla fine mi perdo. ....

Penso di aver bevuto un pò troppo ieri, pensavo fosse un esempio  8. Poi riporto nel primo post i link.

È uscito cryptozombie season 2

https://medium.com/loom-network/cryptozombies-season-2-is-here-and-introducing-zombie-battleground-custom-game-modes-f1f09efa24f4


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on January 23, 2019, 07:00:59 PM
Come gestire token in uno smart contract:

Code:
function prelievoToken(address token, uint amount) public payable{
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(msg.sender, amount)) throw;
    Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
  }

Ciao, come aggiungere la seguente funzione a questo smart contract:

Code:
function withdrawToken_to(address _token, address _to, uint _amount) 



Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on January 23, 2019, 10:17:08 PM
Non l'ho provato ma dovrebbe funzionare. Basta semplicemente sostituire il proprio indirizzo in questa parte sotto

Code:
if (!Token(token).transfer(msg.sender, amount)) throw;

con l'indirizzo a cui vogiamo mandare i token:

Code:
if (!Token(token).transfer(_to, amount)) throw;

Code:
function withdrawToken_to(address token, address _to, uint amount) public payable{
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(_to, amount)) throw;
    Withdraw(token, _to, amount, tokens[token][msg.sender]);
  }


Appena ho un pò di tempo verifico se è corretto. Comunque è importante ricordarsi di aver dato l'approvazione allo smart contract di spendere i token, chiamando il metodo approve direttamente dal contratto del token.


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on January 23, 2019, 10:48:51 PM
Code:
if (!Token(token).transfer(_to, amount)) throw;
Code:
function withdrawToken_to(address token, address _to, uint amount) public payable{
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(_to, amount)) throw;
    Withdraw(token, _to, amount, tokens[token][msg.sender]);
  }

Ieri ho provato a fare qualcosa di simile.

Comunque è importante ricordarsi di aver dato l'approvazione allo smart contract di spendere i token, chiamando il metodo approve direttamente dal contratto del token.

Apparentemente me ne sono dimenticato. Domani farò dei test.
Grazie.
Mi scuso per la traduzione scadente.


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on January 24, 2019, 11:19:50 PM
Code:
function withdrawToken_to(address token, address _to, uint amount) public payable{
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(_to, amount)) throw;
    Withdraw(token, _to, amount, tokens[token][msg.sender]);
  }

Tutto è andato, grazie.

Ma non riesco a capire cosa sia e cosa fare al riguardo?
Che cosa fa questa funzione e come usarla?

https://i.imgur.com/sJi558V.jpg


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on January 25, 2019, 01:29:10 PM
Code:
function withdrawToken_to(address token, address _to, uint amount) public payable{
    if (token==0) throw;
    if (tokens[token][msg.sender] < amount) throw;
    tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
    if (!Token(token).transfer(_to, amount)) throw;
    Withdraw(token, _to, amount, tokens[token][msg.sender]);
  }

Tutto è andato, grazie.

Ma non riesco a capire cosa sia e cosa fare al riguardo?
Che cosa fa questa funzione e come usarla?

https://i.imgur.com/sJi558V.jpg

quello serve per tenere conto dei token presenti nel contratto e chi è il proprietario, gli passi l'indirizzo token e indirizzo personale e ti ritorna il totale.

Code:
mapping (address => mapping (address => uint)) public tokens; //questo mappa un indirizzo di un token con un la mappatura di un indirizzo di un proprietario e la quantità di quei tokens


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on January 26, 2019, 03:35:22 PM
Da tempo desideravo aggiungere una funzione interessante a un contratto di token. Ho cercato di capire funzioni simili nei contratti ED (https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819#code) e TS (https://etherscan.io/address/0x1ce7ae555139c5ef5a57cc8d814a867ee6ee33d8#code). Grazie, Google ha trovato questo argomento. Grazie a Makkara per avermi aiutato a capire queste funzioni, grazie alle quali sono riuscito a creare la funzione utile desiderata.


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on June 03, 2019, 10:40:51 PM
Ciao.
Trovato un argomento interessante:

"Vyper"

"Vyper" è un linguaggio di sviluppo smart contract.
Documentazione:
https://vyper.readthedocs.io/en/v0.1.0-beta.10/index.html
GitHub:
https://github.com/ethereum/vyper
Online compiler:
https://vyper.online
https://etherscan.io/vyper
https://rinkeby.etherscan.io/vyper
Vasto link GitHub alle risorse Vyper:
https://github.com/ethereum/vyper/wiki/Vyper-tools-and-resources

Ad esempio, su Smart Contracts vyper, lo scambio di Uniswap (https://uniswap.io) funziona.

Qualcuno ha studiato questa zona?


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on June 05, 2019, 07:26:27 PM
Ciao.
Trovato un argomento interessante:

"Vyper"

"Vyper" è un linguaggio di sviluppo smart contract.
Documentazione:
https://vyper.readthedocs.io/en/v0.1.0-beta.10/index.html
GitHub:
https://github.com/ethereum/vyper
Online compiler:
https://vyper.online
https://etherscan.io/vyper
https://rinkeby.etherscan.io/vyper
Vasto link GitHub alle risorse Vyper:
https://github.com/ethereum/vyper/wiki/Vyper-tools-and-resources

Ad esempio, su Smart Contracts vyper, lo scambio di Uniswap (https://uniswap.io) funziona.

Qualcuno ha studiato questa zona?


Non lo conosco, è da un pò che non metto mano agli smart contract. A prima vista sembra una figata. Magari faccio qualche prova per vedere come funziona.


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on October 25, 2019, 05:23:23 PM
Ciao.
Come scrivere un semplice contratto intelligente come 'Hello World', ma in modo che possa essere creato solo da un indirizzo specifico?
Cioè, sarà impossibile distribuirlo da un altro indirizzo.
Dovrei in qualche modo scrivere l'indirizzo nel smart contract?
Grazie.


Title: Re: [Programmazione] Smart Contracts
Post by: Makkara on October 28, 2019, 08:43:10 AM
Ciao.
Come scrivere un semplice contratto intelligente come 'Hello World', ma in modo che possa essere creato solo da un indirizzo specifico?
Cioè, sarà impossibile distribuirlo da un altro indirizzo.
Dovrei in qualche modo scrivere l'indirizzo nel smart contract?
Grazie.

Dovresti creare uno smart contract "padre" in grado di fare il deploy di smart contract "figli", non ho provato ma a quanto pare si può fare.

Code:
function newPurchase()
public
payable
returns(address newContract)
{
Purchase c = (new Purchase).value(msg.value)(address(msg.sender));
contracts.push(c);
lastContractAddress = address(c);
emit newPurchaseContract(c);
return c;
}

https://github.com/jacksonng77/StartEscrow/blob/master/Solidity/StartEscrow.sol

Il tuo SC padre sarà customizzabile e potrai decidere a quale indirizzo permettere di fare il deploy di un certo SC figlio

Qui c'è un esempio per qualcosa di simile
https://medium.com/coinmonks/creating-smart-contracts-with-smart-contract-d54e21d26e00


Title: Re: [Programmazione] Smart Contracts
Post by: bomj on November 05, 2019, 08:10:15 PM
Grazie makkara, ma questa è comunque una soluzione leggermente diversa.
Voglio provare a finire:
https://bitcointalk.org/index.php?topic=5052754.0
Smart contract per il calcolo dell'indirizzo del contratto:
Code:
pragma solidity 0.4.18;
contract Balls {
    function addressFrom(address _origin, uint _nonce) public pure returns (address) {
        if(_nonce == 0x00)     return address(keccak256(byte(0xd6), byte(0x94), _origin, byte(0x80)));
        if(_nonce <= 0x7f)     return address(keccak256(byte(0xd6), byte(0x94), _origin, byte(_nonce)));
        if(_nonce <= 0xff)     return address(keccak256(byte(0xd7), byte(0x94), _origin, byte(0x81), uint8(_nonce)));
        if(_nonce <= 0xffff)   return address(keccak256(byte(0xd8), byte(0x94), _origin, byte(0x82), uint16(_nonce)));
        if(_nonce <= 0xffffff) return address(keccak256(byte(0xd9), byte(0x94), _origin, byte(0x83), uint24(_nonce)));
        return address(keccak256(byte(0xda), byte(0x94), _origin, byte(0x84), uint32(_nonce))); // more than 2^32 nonces not realistic
    }    
}
;-)))
https://rinkeby.etherscan.io/address/0x156e6451d6d1cf1a3cb3be03b229b71e58ce2774#readContract