Crowdfunding décentralisé : Les avantages de la blockchain

Esteban Reynier
7 min readJun 21, 2023
Crowdfunding example

Introduction

Le crowdfunding décentralisé et la technologie de la blockchain révolutionnent le monde de la collecte de fonds en offrant de nouvelles opportunités et en éliminant les contraintes traditionnelles. Dans cet article, nous allons explorer en détail un smart contract spécialement conçu pour le crowdfunding décentralisé.

I. Fonctionnement du smart contract de crowdfunding décentralisé

A. Présentation des événements et des structures du smart contract

Le smart contract de crowdfunding décentralisé utilise des événements et une structure pour gérer les différentes fonctionnalités. “ProjectCreated”, “ProjectFinished”, “Contribution”, “Refund”, “Withdraw”, “FeeSet”, “OwnerWithdraw” et “Received” sont utilisés pour notifier les différentes actions effectuées sur le contrat.

    event ProjectCreated(uint256 indexed projectId);
event ProjectFinished(uint256 indexed projectId);
event Contribution(uint256 indexed projectId, address indexed contributor, uint256 amount);
event Refund(uint256 indexed projectId, address indexed contributor, uint256 amount);
event Withdraw(uint256 indexed projectId, address indexed owner, uint256 amount);
event FeeSet(uint256 fee);
event OwnerWithdraw(uint256 amount);
event Received(address indexed sender, uint256 amount);

La structure “Project” permet de stocker les informations clés de chaque projet, telles que le nom, la description, l’objectif de financement, la date limite, le montant collecté, le propriétaire et l’état du projet.

struct Project {
string name;
string description;
uint256 goal;
uint256 deadline;
uint256 amountRaised;
address payable owner;
bool isClosed;
bool goalReached;
}

B. Explication des variables globales et constantes utilisées

Le smart contract utilise plusieurs variables globales et constantes pour son fonctionnement. “fee” représente le pourcentage des frais prélevés sur chaque contribution, “MAX_FEE” définit le montant maximum des frais autorisés et fixé lors du déploiement du smart contract, “DENOMINATOR” est utilisé pour le calcul des frais en pourcentage, “feeBalance” stocke les frais collectés, “projects” contient tous les projets créés, “projectByOwner” lie les projets à leur propriétaire et “contributionByProject” contient le montant investi par les participants.

    uint256 public fee;

uint256 public constant DENOMINATOR = 1000;

uint256 public immutable MAX_FEE;

uint256 public feeBalance;

Project[] public projects;

mapping(address => uint256[]) public projectsByOwner;

mapping(address => mapping(uint256 => uint256)) public contributionsByProject;

C. Présentation des fonctions de récupération des informations du projet

Le smart contract offre des fonctions permettant de récupérer des informations sur les projets. La fonction “getProjectsCount” renvoie le nombre total de projets, “getProjectsByOwner” renvoie les identifiants des projets créés par un propriétaire donné, et “getProject” renvoie les détails d’un projet spécifique.

function getProjectsCount() public view returns (uint256) {
return projects.length;
}

function getProjectsByOwner(address _owner) public view returns (uint256[] memory) {
return projectsByOwner[_owner];
}

function getProject(uint256 _projectId) external view returns (string memory name, string memory description, uint256 goal, uint256 deadline, uint256 amountRaised, address owner, bool isClosed, bool goalReached) {
require(_projectId < projects.length, "Project does not exist");
return (projects[_projectId].name, projects[_projectId].description, projects[_projectId].goal, projects[_projectId].deadline, projects[_projectId].amountRaised, projects[_projectId].owner, projects[_projectId].isClosed, projects[_projectId].goalReached);
}

function getContribution(address _contributor, uint256 _projectId) external view returns (uint256) {
require(_projectId < projects.length, "Project does not exist");
return contributionsByProject[_contributor][_projectId];
}

D. Explication des fonctions de configuration du smart contract

Le smart contract propose également des fonctions de configuration qui permettent de modifier certains paramètres. Par exemple, la fonction “setFee” permet de définir le pourcentage des frais prélevés sur chaque contribution, tandis que la fonction “ownerWithdraw” permet au propriétaire du contrat de retirer les frais collectés.

function setFee(uint256 _fee) public onlyOwner {
require(_fee <= MAX_FEE, "Fee must be less than or equal to max fee");
fee = _fee;
emit FeeSet(_fee);
}

function ownerWithdraw() public onlyOwner nonReentrant {
require(feeBalance > 0, "No fee to withdraw");
uint256 amount = feeBalance;
feeBalance = 0;

// safeTransfer
(bool success, ) = address(msg.sender).call{value: amount}("");
require(success, "Transfer failed");
emit OwnerWithdraw(amount);
}

II. Étapes du processus de crowdfunding décentralisé

A. Création d’un projet

La première étape du processus de crowdfunding décentralisé est la création d’un projet. Un utilisateur peut utiliser la fonction “createProject” pour créer un nouveau projet en fournissant le nom, la description, l’objectif de financement et la durée limite du projet. Une fois le projet créé, un identifiant unique lui est attribué, et il est ajouté à la liste des projets existants.

function createProject(string memory _name, string memory _description, uint256 _goal, uint256 _deadline) public returns(uint256) {
require(_goal > 0, "Goal must be greater than 0");
require(_deadline >= 1 minutes, "Deadline must be at least in 1 minute");
require(projectsByOwner[msg.sender].length == 0 || projects[projectsByOwner[msg.sender][projectsByOwner[msg.sender].length - 1]].isClosed, "Users can only create one project at a time");
projects.push(Project(_name, _description, _goal, block.timestamp + _deadline, 0, payable(msg.sender), false, false));
projectsByOwner[msg.sender].push(projects.length - 1);
emit ProjectCreated(projects.length - 1);
return (projects.length - 1);
}

B. Contributions au projet

Une fois qu’un projet est créé, d’autres utilisateurs peuvent contribuer en envoyant des fonds au contrat. En utilisant la fonction “contribute” et en spécifiant l’identifiant du projet auquel ils souhaitent contribuer, les utilisateurs peuvent envoyer des fonds au contrat. Le montant de la contribution est alors ajouté au montant collecté du projet. Les contributions sont enregistrées et associées à l’utilisateur et au projet correspondant.

function contribute(uint256 _projectId) public payable {
require(msg.value > 0, "Contribution must be greater than 0");
require(_projectId < projects.length, "Project does not exist");
require(projects[_projectId].deadline >= block.timestamp, "Project deadline is passed");
require(!projects[_projectId].isClosed, "Project is closed");

// Take the fees
uint256 feeAmount = (msg.value * fee) / DENOMINATOR;
feeBalance += feeAmount;

// Send the rest to the project owner
projects[_projectId].amountRaised += msg.value - feeAmount;
if (projects[_projectId].amountRaised >= projects[_projectId].goal) {
projects[_projectId].goalReached = true;
}

// update contributors
contributionsByProject[msg.sender][_projectId] += msg.value - feeAmount;
emit Contribution(_projectId, msg.sender, msg.value - feeAmount);
}

C. Remboursement en cas de non-atteinte de l’objectif

Si le projet ne parvient pas à atteindre son objectif de financement avant la date limite, les contributeurs ont la possibilité de demander un remboursement de leur contribution. En utilisant la fonction “refund” et en spécifiant l’identifiant du projet. Les fonds sont transférés depuis le contrat vers le compte du contributeur.

function refund(uint256 _projectId) public nonReentrant() {
require(_projectId < projects.length, "Project does not exist");
require(projects[_projectId].isClosed, "Project is not closed");
require(!projects[_projectId].goalReached, "Project goal is reached");
require(contributionsByProject[msg.sender][_projectId] > 0, "No contribution found");
uint256 amount = contributionsByProject[msg.sender][_projectId];
contributionsByProject[msg.sender][_projectId] = 0;

// safeTransfer
(bool success, ) = address(msg.sender).call{value: amount}("");
require(success, "Transfer failed");
emit Refund(_projectId, msg.sender, amount);
}

D. Retrait des fonds en cas de réussite de l’objectif

Si le projet atteint son objectif de financement avant la date limite, les fonds collectés sont disponibles pour le propriétaire du projet. En utilisant la fonction “withdraw” et en spécifiant l’identifiant du projet, le propriétaire peut retirer les fonds collectés vers son propre compte.

function withdraw(uint256 _projectId) public nonReentrant {
require(_projectId < projects.length, "Project does not exist");
require(projects[_projectId].isClosed, "Project is not closed");
require(msg.sender == projects[_projectId].owner, "Only owner can withdraw");
require(projects[_projectId].amountRaised > 0, "No amount to withdraw");
require(projects[_projectId].goalReached, "Project goal is not reached");
uint256 amount = projects[_projectId].amountRaised;
projects[_projectId].amountRaised = 0;

// safeTransfer
(bool success, ) = address(msg.sender).call{value: amount}("");
require(success, "Transfer failed");
emit Withdraw(_projectId, msg.sender, amount);
}

E. Clôture d’un projet

Marquer le projet comme clos avec la fonction “setFinished” permet au propriétaire de retirer les fonds ou aux contributeur de réclamer leur remboursement. Le propriétaire du projet peut le clôturer quand bon lui semble tandis que si la date limite est dépassé n’importe qui peux marquer le projet comme clôturé. Cela permet à un projet n’ayant pas atteint son objectif d’être cloturé par les utilisateurs qui pourront alors être remboursé.

function setFinished(uint256 _projectId) public {
require(_projectId < projects.length, "Project does not exist");
require(msg.sender == projects[_projectId].owner || projects[_projectId].deadline < block.timestamp, "Only owner can set project as finished or deadline must be passed");
require(!projects[_projectId].isClosed, "Project is already closed");
projects[_projectId].isClosed = true;
emit ProjectFinished(_projectId);
}

III. Avantages de l’utilisation de ce smart contract dans le crowdfunding décentralisé

A. Transparence et traçabilité des transactions

Le smart contract de crowdfunding décentralisé offre une transparence totale des transactions. Toutes les contributions, les remboursements et les retraits de fonds sont enregistrés de manière immuable sur la blockchain, accessible à tous les participants. Cela permet une visibilité complète des flux financiers et assure la confiance dans le processus de financement participatif.

B. Sécurité des transactions et prévention des fraudes

Grâce à l’utilisation de la blockchain, le smart contract garantit la sécurité des transactions. Les fonds sont gérés de manière automatisée et sécurisée, éliminant ainsi les risques de manipulation ou de détournement. De plus, l’utilisation de la blockchain offre une protection contre les tentatives de fraude, car toutes les transactions sont vérifiables et immuables.

C. Élimination des intermédiaires et des frais élevés

Dans le crowdfunding traditionnel, il existe souvent des intermédiaires tels que les plateformes de crowdfunding ou les institutions financières qui prélèvent des frais élevés sur les fonds collectés. Avec le smart contract de crowdfunding décentralisé, ces intermédiaires sont supprimés, ce qui réduit les coûts et permet aux contributeurs de maximiser l’impact de leurs contributions. Tout en rendant les frais entièrement transparent.

D. Accessibilité mondiale et inclusion financière

Grâce à la nature décentralisée de la blockchain, le crowdfunding devient accessible à tous, indépendamment de leur emplacement géographique ou de leur statut financier. Les utilisateurs du smart contract peuvent créer ou contribuer à des projets depuis n’importe où dans le monde, favorisant ainsi l’inclusion financière et offrant des opportunités de financement à des personnes qui auraient autrement été exclues du système traditionnel.

IV. Conclusion

En conclusion, le crowdfunding décentralisé basé sur la technologie de la blockchain offre de nombreux avantages qui révolutionnent le monde de la collecte de fonds. Grâce à la transparence et à la traçabilité des transactions, la sécurité accrue, l’élimination des intermédiaires et des frais élevés, ainsi que l’accessibilité mondiale, ce modèle de financement participatif ouvre de nouvelles opportunités et favorise l’inclusion financière. En adoptant un smart contract spécialement conçu pour le crowdfunding décentralisé, les participants peuvent bénéficier d’un processus plus efficace, transparent et confiant, propulsé par la blockchain.

--

--

Esteban Reynier
0 Followers

Solidity | Blockchain | Web3 Freelance Developer. Interested in audiovisual, video games and AI