Les smart contracts pour non développeurs

Voici pour un public non technique quelques éléments pour saisir la notion de smart contracts. La première partie est constituée de brefs rappels pour les personnes ayant déja assisté à un atelier ou conférence sur la blockchain. Sinon je vous invite à lire par exemple cette introduction. La seconde partie introduit quelques notions de rédaction de smart contracts autour d'un exemple simple.

Petits rappels sur la blockchain

La blockchain est une base de données distribuée. Elle est constitué

  • D'un réseau de "Nœuds", connectés entre eux
  • D'un ensembles de messages, les "transactions"
  • D'un registre unique des transactions validées, la "blockchain"

Caractéristiques fondamentales

  • Le registre ne peut pas être falsifié
  • Les identité sont pseudonymales sous la forme d'une "adresse", une suite d'une trentaine de caractères
  • Les identités sont systématiquement vérifiées via un système de clés publiques et clés privées
  • Les modifications du code qui régit l'infrastructure requièrent l'accord de la majorité des acteurs du réseau

Fonctionnement

  1. Un acteur du réseau rédige un message, par exemple je donne 0,3 bitcoin de mon adresse 12uAK à l'adresse 3Re32, le signe et le transmet
  2. Les noeuds environnants relayent l'information
  3. Les mineurs
    • Rassemblent les dernières transactions et les vérifient
    • Résolvent un problème mathématique
    • Proposent au réseau le block constitué de la réponse à ce problème, des transactions validées et de l'identifiant du block précédent
  4. Les autres acteurs du réseau vérifient que le block est le premier block valide et l'adoptent.

Les smart contracts

Les smart contracts sont du code exécuté par une blockchain. Cette notion a été populariseé par le projet Ethereum dont l'objet est de proposer une blockchain où n'importe quel type de code peut s'exécuter. Les smart contracts tiennent du code informatique classique mais reprennent les caractéristiques des blockchains, notamment des comptes identifiés et un historique infalsifiable. C'est leur capacité à établir un rapport automatique entre comptes (humains, logiciels ou autres contrats) sans coût de mise en relation préalable ni tiers de confiance qui leur vaut cette dénomination.

Structure générale d'un smart contract

Les smart contracts regroupent des données et les traitements qui peuvent leur être appliqués :

Un ensemble de données, chacune identifiée par un nom et un type. On les annonce au début du contrat. Par exemple:

address AdresseDunActeurDuContrat

Les types courants sont:

  • uint pour un entier
  • address pour l'adresse d'un compte Ethereum ou d'un autre contrat
  • string pour une chaîne de caractères

Des fonctions qui agissent sur ces données et avec le reste de la blockchain (via les adresses). On les annonce à la suite :

function distribuerDesDividendes(uint montant) {
	for (uint i = 0; i < actionnaires.length; ++i) {
		actionnaires[i].addr.send(montant/actionnaires[i].parts);  
	}
}

Cette fonction par exemple, nommée "distribuer des dividendes", distribue le montant aux actionnaire enregistrés dans la liste actionnaires. Montant est un paramètre de la fonction. L'utilisateur, ou une autre partie du code aura à renseigner le montant à distribuer.

distribuerDesDividendes(34000)

Le montant sera alors automatiquement réparti entre les actionnaires en fonction de leur parts. "For" est une suite répétitive d'action, qui pour chaque actionnaire, calcul puis envoi la part du montant due.

Un exemple d'usage d'un smart contract

Un exemple de smart contrat simple, au coeur de la philosophie qui guide le projet Ethereum, une campagne de crowdfunding pour un album de musique. Ce code est à visée pédagogique, ne lancez pas une campagne de plusieurs millions avec.

Dans cette première partie sont définies les variables : l'adresse de l'artiste, la liste des contributeurs à l'album ("contributors"), et pour chaque élément de cette liste l'adresse et le montant du contributeur:

contract AlbumFunding {
	address public artist;
	uint public fundingGoal; uint public amountRaised; uint public deadline; 

	Contributor[] public contributors;
	bool endCampaign = false;

	struct Contributor {
		address addr;
		uint amount;
	}

Cette fonction du même nom que le contrat est lancée au moment de son déploiement. Elle fixe l'adresse de l'artiste et son objectif de financement. La durée de la campagne est fixée à 90 jours.

	function AlbumFunding(
		address creator,
		uint fundingGoalInEthers 
	) {
		artist = creator;
		fundingGoal = fundingGoalInEthers *1 ether;
		deadline = now + 90 days;
	} 

La fonction suivante, sans nom, est activée à chaque fois que de l'argent est envoyé au contrat:

  • Si la campagne est en cours, le contributeur est ajouté à la liste contributors avec le montant du don.
  • Si la campagne est terminée, elle refuse l'argent et s'arrête.

throw est un mot clé qui renvoie l'argent à l'émetteur

	function () {
		if (endCampaign) throw;
		uint amount = msg.value;
		contributors[contributors.length++] = Contributor({addr: msg.sender, amount: amount});
		amountRaised += amount;
	}

Cette dernière fonction peut être déclenchée par n'importe qui. Si la campagne est terminée et réussie, elle envoie l'argent de la campagne à l'artiste. Si elle est en cours, elle ne fait rien. Si elle a échoué, elle rembourse alors tous les contributeurs.

	function testEndCampaign() {
		if (now >= deadline) {
			if (amountRaised >= fundingGoal){ 
				artist.send(this.balance);
				endCampaign = true;
			} else {
				for (uint i = 0; i < contributors.length; ++i) {
					contributors[i].addr.send(contributors[i].amount);  
				}                      
				artist.send(this.balance);  
			}
			endCampaign = true;
		}
	}

Et enfin, la fermeture de la première accolade, pour signaler la fin du contrat :

	}

En savoir plus ? Rejoignez nos meetups avec Open Law et Cellabz ou contactez nous. Pour quelques cas d'usages, voici le retour du premier festival blockchain.