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 à suivre 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 désigne en réalité deux choses. D'une part l'ensemble du protocole d'échange et de validation de transactions et d'autre part le registre de ces transactions, sous la forme d'une chaine de block. L'ensemble d'un réseau blockchain comprend ainsi :

  • Un réseau d'ordinateurs connectés entre eux avec logiciel client "blockchain"( les Nœuds)
  • Un ensembles de transactions
  • Un registre des transactions validées, unique et répliqué sur l'ensemble des noeuds du réseau.

Caractéristiques fondamentales

  • Le registre ne peut pas être falsifié
  • Les identité sont pseudonymales sous la forme d'une "adresse", une chaine 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 des programmes informatiques exécutés de façon autonome par un réseau blockchain. Cette notion a été populariseé par le projet Ethereum dont l'objet est de proposer une blockchain permettant à des programmes informatiques complets d'être exécuté ( jusque là, notamment dans le réseau bitcoin, seul certaines fonctionnalités pouvaient être programmées).

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, en référence au travail de Nick Szabo.

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 envoie la part du montant due (Leur utilisation est généralement déconseillée dans le cadre des smart contracts néanmoins)

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 sur le réseau. 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 annule la transaction et renvoie l'argent à l'émetteur ( excepté les frais de transaction)

	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 rencontres et contactez nous. Pour quelques cas d'usages, voici le retour du premier festival blockchain.