Aller au contenu

Solidity

Un article de Wikipédia, l'encyclopédie libre.

Solidity
Logo.

Date de première version Voir et modifier les données sur Wikidata
Dernière version 0.8.28 ()[1]Voir et modifier les données sur Wikidata
Licence Licence publique générale GNU version 3[2]Voir et modifier les données sur Wikidata
Site web soliditylang.orgVoir et modifier les données sur Wikidata

Solidity est un langage de programmation orienté objet dédié à l'écriture de contrats intelligents[3]. Il est utilisé pour implémenter des smartcontrat sur diverses blockchains, notamment Ethereum. Il a été développé par Christian Reitwiessner, Alex Beregszaszi, Yoichi Hirai et plusieurs anciens contributeurs principaux d'Ethereum pour permettre l'écriture de contrats intelligents sur des plateformes de blockchain telles qu'Ethereum[4].

Solidity a été initialement proposée en par Gavin Wood[5],[6] ; le langage a ensuite été développé par l'équipe Solidity du projet Ethereum, dirigée par Christian Reitwiessner.

À l'heure actuelle, Solidity est le principal langage sur Ethereum ainsi que sur d'autres blockchains privées fonctionnant sur des plateformes en concurrence avec Ethereum, telles que Monax et sa blockchain Hyperledger Burrow, qui utilise Tendermint pour le consensus. SWIFT a déployé une preuve de concept à l'aide de Solidity exécuté sur Burrow. Un chercheur de l'université Cornell a déclaré que Solidity était en partie responsable du piratage de The DAO en 2016. Il a déclaré : « ce n'était en fait pas une faille ou un exploit dans le contrat DAO lui-même : techniquement, la machine virtuelle Ethereum (EVM) fonctionnait comme prévu, mais Solidity introduisait des failles de sécurité dans les contrats qui avaient échappé à la communauté, mais aussi aux concepteurs du langage eux-mêmes. » En effet, des contraintes propres à l'EVM, telles que l'impossibilité de mettre à jour un contrat intelligent (à moins d'en déployer un nouveau), ou l'absence de virgule flottante intégrée peuvent rendre certaines failles très difficiles à trouver et à corriger.

Description

[modifier | modifier le code]

Solidity est un langage de programmation de type statique conçu pour développer des contrats intelligents qui s'exécutent sur l'EVM (Ethereum Virtual Machine)[7],[8]. Solidity est compilé en bytecode lui-même exécutable sur l'EVM. Grâce à Solidity, les développeurs sont en mesure d'écrire des applications implémentant une logique commerciale s’exécutant de manière autonome au travers des contrats intelligents, laissant une trace de transactions non répudiables et faisant autorité[9]. Écrire des contrats intelligents dans des langages spécifiques aux contrats intelligents tels que Solidity est considéré comme facile (en apparence pour ceux qui ont déjà des compétences en programmation)[10].

Exemple de programme Solidity[11],[12] :

pragma solidity >=0.5.0 <0.7.0;

contract Coin {
    // Le mot-clé "public" rend les variables
    // accessibles depuis d'autres contrats
    address public minter;
    mapping (address => uint) public balances;
    mapping (address => mapping (address => uint256)) public allowed;

    // Les événements permettent aux clients de réagir à des
    // changements spécifiques du contrat que vous déclarez
    event Transfer (address from, address to, uint amount);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
    event MintingRightTransferred(address indexed oldMinter, address indexed newMinter);

    string public symbol = "WIKI";
    string public name = "WikiArticleToken";
    uint256 public totalSupply;

    // Le code du constructeur est uniquement exécuté
    // lorsque le contrat est créé
    constructor() public {
        minter = msg.sender;
    }

    // Envoie un montant de pièces nouvellement créées à une adresse
    // Peut uniquement être appelé par le créateur du contrat
    function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        require(amount <= 2**256-1); // soyez conscient des montants élevés car il existe des débordements
        balances[receiver] += amount;
        totalSupply += amount;
        emit Transfer(address(0), receiver, amount);
    }

    // Envoie un montant de pièces existantes
    // de tout appelant à une adresse
    function transfer(address receiver, uint amount) public {
        require(amount <= balances[msg.sender], "Solde insuffisant.");
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Transfer(msg.sender, receiver, amount);
    }

    function transferFrom(address from, address to, uint256 amount) public returns (bool success) {
        require((allowed[from][msg.sender]||(from == msg.sender)) >= amount, "Vous n'êtes pas autorisé à dépenser ce montant");
        require(amount <= balances[from], "Solde insuffisant");
        allowed[from][msg.sender] -= amount;
        balances[from] -= amount;
        balances[to] += amount;
        emit Transfer(from, to, amount);
        return true;
    }

    function allowance(address tokenOwner, address spender) public view returns (uint remaining) {
		return allowed[tokenOwner][spender];
    }

    function approve(address spender, uint tokens) public returns (bool success) {
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        return true;
    }

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

    function transferMinterRight(address _newMinter) public {
        require(msg.sender == minter);
        emit MintingRightTransferred(minter, _newMinter);
        minter = _newMinter;
    }
}

Disponibilité de la plateforme de développement

[modifier | modifier le code]

Plateformes Blockchain

[modifier | modifier le code]

Solidity est disponible sur:

Vyper, un autre langage destiné à la creation de smartcontrat sur la machine virtuelle Ethereum.

Références

[modifier | modifier le code]
  1. a et b « Release 0.8.28 », (consulté le )
  2. « https://github.com/ethereum/solidity/blob/develop/LICENSE.txt » (consulté le )
  3. (en) Afshar, Evangelist et Salesforce, « Ethereum Is The Second Most Valuable Digital Currency, Behind Bitcoin », HuffPost, (consulté le )
  4. « List of contributors »
  5. Benoit Schweblin, « StackEdit Viewer », stackedit.io
  6. (en) « Blockchain and big data worth watching in the coming year », sur International Business Times, (consulté le )
  7. (en-US) « Hyperledger Fabric Tutorial - Create a blockchain app for loyalty points », IBM Developer (consulté le )
  8. a et b Allison, « Microsoft adds Ethereum language Solidity to Visual Studio », International Business Times, (consulté le )
  9. Allison, « Microsoft adds Ethereum language Solidity to Visual Studio », International Business Times, (consulté le )
  10. William Mougayar, The Business Blockchain: Promise, Practice, and Application of the Next Internet Technology, Wiley Publishing, (ISBN 978-1119300311, lire en ligne), p. 58
  11. « Subcurrency Example from the Solidity documentation »
  12. (en) Karthikeyan Schneier, Antoine Schneier, Cedric Bhargavan, Anitha Delignat-Lavaud, Gollamudi Fournet, Bruce Schneier, Nadim Rastogi, Aseem Sibut-Pinote, Thomas Rastogi1, Nikhil Swamy et Santiago Zanella-Beguelin, « Short Paper: Formal Verification of Smart Contracts », Microsoft Research, Institut national de recherche en informatique et en automatique, université Harvard,‎ (lire en ligne [archive du ])
  13. (en-US) PatAltimore, « Use Visual Studio Code to connect to Azure Blockchain Service - Azure Blockchain », docs.microsoft.com (consulté le )