Écrire une application décentralisée pour Ethereum – Partie 1 : le smart contract

Sébastien Castiel

Développeur web, je m'intéresse énormément au Bitcoin, à la blockchain, et donc tout naturellement à Ethereum. Tip : Ξ 0x7f897a773891a1A20302400170D62e34491A34F5, Ƀ 1HuRJD2MkPkGWUUKx4wnRuNds6CVQrkXyn

23 réponses

  1. m2p76 dit :

    Bonjour! Super tuto! Parc contre j’ai un souci à l’étape pour importer le module web3 : var Web3 = require(‘web3’). J’ai le message « undefined » ça vous parle..?

    • Bonjour,
      Ce n’est pas une erreur, la valeur retournée par une instruction ‘var …’ est toujours ‘undefined’ 😉
      Si vous tapez ensuite simplement ‘Web3’ vous devriez visualiser le contenu de la variable ‘Web3’.

  2. Shazz dit :

    Tres interessant !
    Par contre moi aussi j’ai un petit souci, depuis la console Truffle, tous les appels a Test RPC plantent:

    truffle(development)> Roulette.new(10, { from: web3.eth.accounts[0], value: web3.toWei(100, « ether ») }).then(function(_contract) { contract = _contract; });
    Error: CONNECTION ERROR: Couldn’t connect to node http://localhost:8545.
    at Object.module.exports.InvalidConnection (/usr/lib/node_modules/truffle/node_modules/web3/lib/web3/errors.js:28:16)

    Alors que le Test RPC tourne bien sur localhost:8545, depuis node,js aucun pb pour y acceder via web3..

    Une idee ?

    • Shazz dit :

      Pour info si Test RPC n’est pas lancé l’erreur est differente :

      truffle(development)> Roulette.new(10, { from: web3.eth.accounts[0], value: web3.toWei(100, « ether ») }).then(function(_contract) { contract = _contract; });
      Error: Invalid JSON RPC response: undefined
      at Object.module.exports.InvalidResponse (/usr/lib/node_modules/truffle/node_modules/web3/lib/web3/errors.js:35:16)

      Pb de version entre truffle et Test RPC ?

  3. Kevin dit :

    Bonjour,

    Je découvre Ethereum et le principe des dApps, le concept est très intéressant.
    Je souhaite savoir comment pouvons-nous monétiser les dApps que nous développons, c’est à dire comment le développeur peut gagner de l’Ether grâce aux utilisateurs qui consomment son dApps ?

    Merci d’avance.
    Cdt,
    Kévin.

  4. bobricard dit :

    De la branlette cette techno…on sait même pas à quoi ça sert !

  5. Sept Cinquante dit :

    super tuto, merci

  6. Hamdi369 dit :

    Bonjour
    Merci pour ce tres clair tutoriel an français
    Bien que totalment novice; je suis tres interessé par les smart-contracts

    j’ai executé toutes les etapes, installé node.js Truffle et TestRPC, cependant je but à l’etape ou je dois me connecter :
    « Créez un nouveau répertoire quelque part sur votre machine, et rendez-y-vous dans votre terminal : mkdir -p ~/Documents/testweb3 ; cd $_ ;
    Installez localement le module web3 pour Node.js : npm install web3 ;
    Lancez l’invite de commande Node.js (node) et importez le module web3 : var Web3 = require(‘web3’). »

    dans le repertoire j’ai bien un dossier « node_modules » et à l’interieur plusieurs autres dossiers dont « web3 » mais dans le command prompt j’ai « >… »

    seriez-vous pourquoi?

    merci pour votre reponse

  7. Redja dit :

    Bonjour,
    Merci beaucoup pour le tuto. Excellent travail.
    Cependant en suivant à la lettre le tuto, j’ai deux erreurs (un à la compilation que j’ai contourné comme un bon débutant en annulant la ligne en question. C’est la ligne « bets[i].player.send(bets[i].value * getPayoutForType(bets[i].betType)); » de la fonction launch.
    le message d’erreur est le suivant:
    « Roulette.sol:71:5: Warning: Return value of low-level calls not used. »

    La deuxième erreur est au moment de l’exécution de la fonction suivante:
    > contract.betEven({ from: web3.eth.accounts[1], value: web3.toWei(1, « ether ») })
    Error: VM Exception while processing transaction: invalid JUMP

    Avez-vous une idée d’où peuvent venir ces erreurs?

    Merci par avance pour votre aide fort précieuse.

  8. jl dit :

    Le programme complet:
    pragma solidity ^0.4.0;

    contract Roulette {
    uint public lastRoundTimestamp;
    uint public nextRoundTimestamp;
    uint _interval;
    address _creator;
    enum BetType { Single, Odd, Even }
    struct Bet {
    BetType betType;
    address player;
    uint number;
    uint value;
    }
    Bet[] public bets;
    event Finished(uint number, uint nextRoundTimestamp);
    function Roulette(uint interval) {
    _interval = interval;
    _creator = msg.sender;
    nextRoundTimestamp = now + _interval;
    }

    modifier transactionMustContainEther() {
    if (msg.value == 0) throw;
    _;
    }

    modifier bankMustBeAbleToPayForBetType(BetType betType) {
    uint necessaryBalance = 0;
    for (uint i = 0; i this.balance) throw;
    _;
    }

    function betSingle(uint number) public payable transactionMustContainEther() bankMustBeAbleToPayForBetType(BetType.Single) {
    if (number > 36) throw;
    bets.push(Bet({
    betType: BetType.Single,
    player: msg.sender,
    number: number,
    value: msg.value
    }));
    }

    function getBetsCountAndValue() public constant returns(uint, uint) {
    uint value = 0;
    for (uint i = 0; i < bets.length; i++) {
    value += bets[i].value;
    }
    return (bets.length, value);
    }
    function launch() public {
    if (now < nextRoundTimestamp) throw;

    uint number = uint(block.blockhash(block.number – 1)) % 37;

    for (uint i = 0; i 0 && number % 2 == 0) {
    won = true;
    }
    } else if (bets[i].betType == BetType.Odd) {
    if (number > 0 && number % 2 == 1) {
    won = true;
    }
    }
    if (won) {
    if (bets[i].player.send(bets[i].value * getPayoutForType(bets[i].betType)))
    throw;
    }
    }

    uint thisRoundTimestamp = nextRoundTimestamp;
    nextRoundTimestamp = thisRoundTimestamp + _interval;
    lastRoundTimestamp = thisRoundTimestamp;

    bets.length = 0;

    Finished(number, nextRoundTimestamp);
    }
    function getPayoutForType(BetType betType) constant returns(uint) {
    if (betType == BetType.Single) return 35;
    if (betType == BetType.Even || betType == BetType.Odd) return 2;
    return 0;
    }
    }

  9. jl dit :

    truffle deploy n’existe plus, il faut faire truffle migrate, qui lui necessite le fichier contracts/Migrations.sol ci-dessous et des directives de deployements dans le repertoire migrations

    ————— contracts/Migrations.sol ——————
    pragma solidity ^0.4.0;

    contract Migrations {
    address public owner;

    // A function with the signature `last_completed_migration()`, returning a uint, is required.
    uint public last_completed_migration;

    modifier restricted() {
    if (msg.sender == owner) _;
    }

    function Migrations() {
    owner = msg.sender;
    }

    // A function with the signature `setCompleted(uint)` is required.
    function setCompleted(uint completed) restricted {
    last_completed_migration = completed;
    }

    function upgrade(address new_address) restricted {
    Migrations upgraded = Migrations(new_address);
    upgraded.setCompleted(last_completed_migration);
    }
    }

    ————– migrations/1_initial_migration.js
    var Migrations = artifacts.require(« ./Migrations.sol »);

    module.exports = function(deployer) {
    deployer.deploy(Migrations);
    };

    —————————— migrations/2_deploy_contracts.js
    var Roulette = artifacts.require(« ./Roulette »);

    module.exports = function(deployer) {
    deployer.deploy(Roulette);
    };

  10. Amine dit :

    S’il y’a des gens qui ont eu un problème d’installation de l’environnement de type:

    npm can’t find python executable python you can set the python env variable

    voici la solution:

    vous pouvez installer python via la commande: $ npm install –global –production windows-build-tools

    Source: http://stackoverflow.com/questions/21365714/nodejs-error-installing-with-npm

  11. xavier dit :

    A la fin de la fonction launch on réinitialise toutes les variables. mais si on voulait conserver les jeux et les mises pour d’autres besoins fonctionnels Est-ce que la techno du Smart Contrat permet de le faire ou Est-ce qu’il y aura un prb de volume de données

  12. Brel dit :

    Bonjour,

    lors de l’installation de web3 je recois cette erreur après la commande : « npm install web3 »

    « > web3@1.0.0-beta.7 postinstall C:\Users\arbrel\node_modules\web3

    ./node_modules/lerna/bin/lerna.js bootstrap

    ‘.’ n’est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.
    npm WARN enoent ENOENT: no such file or directory, open ‘C:\Users\arbrel\package.json’
    npm WARN arbrel No description
    npm WARN arbrel No repository field.
    npm WARN arbrel No README data
    npm WARN arbrel No license field.

    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! web3@1.0.0-beta.7 postinstall: ./node_modules/lerna/bin/lerna.js bootstrap
    npm ERR! Exit status 1
    npm ERR!
    npm ERR! Failed at the web3@1.0.0-beta.7 postinstall script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in:
    npm ERR! C:\Users\arbrel\AppData\Roaming\npm-cache_logs\2017-07-24T15_27_02_937Z-debug.log »

    Quelqu’un peut m’aider ou a une idée de mon erreur j’ai bient tout installé préalablement.

  13. Stéphane Le Brun dit :

    Bonjour,

    merci beaucoup pour ce tuto, qui est effectivement très bien fait.

    Pour ceux qui le suivent à la lettre, et qui débutent (comme moi) avec des versions plus récentes de solidity, il faut rajouter des « ; » après les « _ » des modifiers, et le modifier « payable » aux fonctions « Roulette », « betSingle », « betEven » et « betOdd », sinon la console refuse d’exécuter le contrat (en tout cas c’est l’erreur que j’ai eue).

    Encore merci
    Stéphane

    • Elsa dit :

      Salut , quand tu dis « le modifier « payable » aux fonctions « Roulette », « betSingle », « betEven » et « betOdd » » c’est à dire ? car je crois que c’est ca mon soucis
      merci ! 🙂

  14. Phil dit :

    Merci pour ce tuto.
    Je viens de le lire jusqu’au bout, mais je ne l’ai pas encore mis en pratique. il donne une idée assez peécise de ce qu’on peut réaliser aves des smart contracts.
    A propos du tirage au sort, est-il possible de lancer automatiquement la fonction launch quand un nouveau bloc est miné?

    Philippe.

  15. Pascal DUVAL dit :

    Bonjour et merci pour ce tuto.
    Je suis plutôt passer avec ce code par l’Ethereum Wallet avec quelques soucis var le compilateur est zélé.
    Mais je pense que j’y suis arrivé. J’ai pu lancer, faire des paris, jusqu’à ce que l’interface complète disparaisse et ne me laisse que l’adresse du contrat et quelques paramètres dans une liste dont on me dit qu’il fut que je la communique à qui veut jouer mais je ne trouve pas cela très convivial et je ne sais même pas qu’en faire.
    Comment on déploie tout cela sur une interface web ?
    Quelqu’un a essayé ?

    Question annexe : je récupèrerais bien le JSON ou la clé privée de mon Etherem Wallet pour entrer tout cela sur metamask mais où diable se trouvent ces paramètres ?

    Si quelqu’un a besoin du code approuvé par le compilateur zélé, je peux le fournir.

    Bien à vous

  16. Célestin dit :

    Bonjour,

    Je souhaiterai intégrer l’outil smart contract dans l’appli mobile que je développe actuellement.
    Je souhaite savoir si le fait d’intégrer cette fonctionnalité va me permettre de générer des ETH que je pourrais ensuite récupérer et convertir ?

    Est ce que ça va limiter mes utilisateurs à uniquement ceux qui ont des ETH ?

    Mon but final étant d’intégrer une fonctionnalité déjà existante pour générer des revenus sur mon application mobile, pouvez-vous m’orienter ?

    Cordialement,

  17. TRUONG dit :

    Bonjour,

    Merci pour ce super tuto.

    « Créez un nouveau répertoire quelque part sur votre machine, et rendez-y-vous dans votre terminal : mkdir -p ~/Documents/testweb3 ; cd $_ ;
    Installez localement le module web3 pour Node.js : npm install web3 ;
    Lancez l’invite de commande Node.js (node) et importez le module web3 : var Web3 = require(‘web3’).
    À présent, vous pouvez vous connecter à votre serveur Test RPC, et vérifiez que les adresses initialisées sont bien présentes, et disposent bien du bon solde d’Ether :

    var Web3 = require(‘web3’);
    var web3 = new Web3(new Web3.providers.HttpProvider(« http://localhost:8545 »));
    web3.eth.accounts
    [ ‘0x00ae1858ea41f5667cda17c7915c2f289c4ee819’,
    ‘0x7f8105da4dd1af61da7bf587766103ba8534fcdc’ ]
    web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]), « ether »).toNumber()
    10000″

    J’ai fait ce comme vous, je laisse testrpc tournant aussi, mais je n’obtiens pas la même chose. Lorsque j’appelle la fonction web3.eth.accounts, j’obtiens un truc bizarre :

    Accounts {
    currentProvider: [Getter/Setter],
    _requestManager:
    RequestManager {
    provider:
    HttpProvider {
    host: ‘http://localhost:8545’,
    timeout: 0,
    connected: false,
    headers: undefined },
    providers:
    { WebsocketProvider: [Function: WebsocketProvider],
    HttpProvider: [Function: HttpProvider],
    IpcProvider: [Function: IpcProvider] },
    subscriptions: {} },
    givenProvider: null,
    providers:
    { WebsocketProvider: [Function: WebsocketProvider],
    HttpProvider: [Function: HttpProvider],
    IpcProvider: [Function: IpcProvider] },
    _provider:
    HttpProvider {
    host: ‘http://localhost:8545’,
    timeout: 0,
    connected: false,
    headers: undefined },
    setProvider: [Function],
    _ethereumCall:
    { getId:
    { [Function: send]
    method: [Object],
    request: [Function: bound ],
    call: ‘net_version’ },
    getGasPrice:
    { [Function: send]
    method: [Object],
    request: [Function: bound ],
    call: ‘eth_gasPrice’ },
    getTransactionCount:
    { [Function: send]
    method: [Object],
    request: [Function: bound ],
    call: ‘eth_getTransactionCount’ } },
    wallet:
    Wallet {
    _accounts: [Circular],
    length: 0,
    defaultKeyName: ‘web3js_wallet’ } }

    Est-ce que vous savez pourquoi et comment le corriger ? Merci beaucoup

  1. 19 janvier 2018

    […] monnaies, puisque Ethereum, Litecoin et Ripple ont aussi accusé le coup. Ainsi, l’Ethereum, (la Blockchain permettant de développer des dApps et Smart Contract) après avoir atteint un sommet historique de 1423 $, a perdu plus de 20 % de sa valeur en séance […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

X

En continuant à utiliser le site, vous acceptez l’utilisation des cookies. Plus d’informations

Les paramètres des cookies sur ce site sont définis sur « accepter les cookies » pour vous offrir la meilleure expérience de navigation possible. Si vous continuez à utiliser ce site sans changer vos paramètres de cookies ou si vous cliquez sur "Accepter" ci-dessous, vous consentez à cela.

Fermer