paint-brush
Comment créer un protocole de paiement à la séance en chaîne sur Rootstockpar@nescampos
Nouvelle histoire

Comment créer un protocole de paiement à la séance en chaîne sur Rootstock

par Néstor Campos9m2024/11/30
Read on Terminal Reader

Trop long; Pour lire

Monetizado est un protocole de paiement à la séance en chaîne. Il vous permet de monétiser n'importe quelle page Web et contenu statique via Web3.0. Il peut être utilisé pour protéger les pages afin que seuls les abonnés puissent les voir.
featured image - Comment créer un protocole de paiement à la séance en chaîne sur Rootstock
Néstor Campos HackerNoon profile picture

Dans l'économie de l'attention (Web 2.0), les utilisateurs sont « poussés » à payer des abonnements pour accéder à des contenus exclusifs (tout type de contenu, y compris du contenu pour adultes), mais rien ne garantit que vous obtiendrez les avantages pour lesquels vous payez, soit parce que le créateur de contenu ne continue pas à créer de nouvelles choses, soit parce que vous devez vous abonner pendant des périodes prolongées alors que vous ne souhaitez payer que pour ce que vous consommez.


Cependant, le Web 3.0, l'économie de l'intention, offre aux utilisateurs la possibilité de payer uniquement ce qu'ils consomment, au lieu de payer sur des périodes prolongées, grâce à des micropaiements. En retour, cela incite les créateurs de contenu à se tenir au courant de plus de créations, en recevant leurs revenus immédiatement, à des coûts très bas, sans dépendre de passerelles centralisées.

Monetizado, un protocole de paiement à la séance en chaîne

Monetizado est une plateforme de paiement à la séance en chaîne qui vous permet de monétiser n'importe quelle page Web et contenu statique (si vous n'avez pas accès au backend pour effectuer des modifications) via Web3.


Vous pouvez implémenter Monetizado sur des sites d'actualités, des réseaux sociaux, des portails de contenu exclusif, etc. Vous pouvez également l'utiliser pour inciter les utilisateurs à payer et à ne pas voir de publicité sur vos sites.

Caractéristiques

Monetizado vous permet de :

  • Spécifiez le contenu protégé avec un montant spécifique que les utilisateurs doivent payer pour y accéder.
  • Consultez le contenu protégé que vous avez créé.
  • À vos abonnés/utilisateurs, payez pour voir votre contenu.
  • Vérifiez si un utilisateur a accès à votre contenu.
  • Modifiez le coût d'accès au contenu si nécessaire.
  • Déprotégez le contenu (si vous souhaitez le diffuser à tout le monde pendant un certain temps).
  • Retirez l'argent collecté pour votre contenu.

Cas d'utilisation

Vous pouvez utiliser la monétisation pour protéger les pages afin que seuls les abonnés puissent les voir, comme dans :

  • Portails d'information.
  • Vidéos.
  • Audios.
  • Fichiers
  • Blogues.
  • Réseaux sociaux.
  • Et bien plus encore.

Pile de développement

Pour construire cette plateforme, nous avons utilisé :


  • Solidité, pour le smart contract
  • Remix, pour déployer le smart contract
  • Rootstock testnet , comme réseau pour le projet
  • Javascript, pour créer un SDK et l'intégrer aux sites Web.


Notre contrat intelligent est assez basique, vous permettant de spécifier un nom de contenu à monétiser, un montant (en rBTC) et plusieurs fonctions pour activer/désactiver le contenu, payer et recevoir des paiements, entre autres.


Bibliothèque monétisée.sol

 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library MonetizadoLibrary { struct ProtectedContent { string name; uint256 accessCost; bool isProtected; uint256 sequenceId; address creator; uint256 amountAvailable; uint256 amountCollected; mapping(address => Subscriber) subscribers; } struct Subscriber { bool paid; uint256 amount; } }


Monetizadov1.sol

 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./MonetizadoLibrary.sol"; contract Monetizadov1 { // Struct with info about the protected content (for paying to access) struct ProtectedContentInfo { string name; uint256 accessCost; bool isProtected; uint256 sequenceId; address creator; uint256 amountAvailable; uint256 amountCollected; } mapping(address => bool) private creators; mapping(address => bool) public hosting; mapping(address => MonetizadoLibrary.ProtectedContent[]) private paginasProtegidas; event GrantedAccess(address usuario, address creator, uint256 sequenceId); address private _owner; uint256 private _platformFeePercentage; uint256 private _platformBalance; modifier onlyOwner() { require(msg.sender == _owner, "Only the owner can call this function"); _; } constructor() { _owner = msg.sender; _platformFeePercentage = 0; _platformBalance = 0; } function addProtectedContent(string memory name, uint256 accessCost) public returns (uint256) { uint256 cantidadPaginasCreador = paginasProtegidas[msg.sender].length; MonetizadoLibrary.ProtectedContent[] storage paginas = paginasProtegidas[msg.sender]; MonetizadoLibrary.ProtectedContent storage pagina = paginas.push(); pagina.name = name; pagina.accessCost = accessCost; pagina.isProtected = true; pagina.sequenceId = cantidadPaginasCreador; pagina.creator = msg.sender; pagina.amountCollected = 0; pagina.amountAvailable = 0; creators[msg.sender] = true; return cantidadPaginasCreador; } function getProtectedContentsForCurrentUser() public view returns (ProtectedContentInfo[] memory) { uint256 cantidadPaginasPorCreador = paginasProtegidas[msg.sender].length; ProtectedContentInfo[] memory paginas = new ProtectedContentInfo[](cantidadPaginasPorCreador); for (uint256 i = 0; i < cantidadPaginasPorCreador; i++) { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[msg.sender][i]; paginas[i] = ProtectedContentInfo(pagina.name, pagina.accessCost, pagina.isProtected, pagina.sequenceId, pagina.creator, pagina.amountAvailable, pagina.amountCollected); } return paginas; } function getProtectedContentByAddressAndId(address creator, uint256 sequenceId) public view returns (ProtectedContentInfo memory) { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[creator][sequenceId]; ProtectedContentInfo memory paginas = ProtectedContentInfo(pagina.name, pagina.accessCost, pagina.isProtected, pagina.sequenceId, pagina.creator, pagina.amountAvailable, pagina.amountCollected); return paginas; } function payAccess(address creator, uint256 sequenceId) external payable { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[creator][sequenceId]; require(msg.value == pagina.accessCost, "Incorrect payment amount"); require(pagina.isProtected == true, "The page is not protected and you do not need to pay access"); MonetizadoLibrary.Subscriber storage subscriber = pagina.subscribers[msg.sender]; subscriber.paid = true; subscriber.amount = msg.value; pagina.amountCollected += msg.value; pagina.amountAvailable += msg.value; emit GrantedAccess(msg.sender, creator, sequenceId); } function currentUserHasAccess(address creator, uint256 sequenceId) public view returns(bool) { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[creator][sequenceId]; return pagina.subscribers[msg.sender].paid; } function changeAccessCost(uint256 sequenceId, uint256 newCost) external { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[msg.sender][sequenceId]; pagina.accessCost = newCost; } function unprotectContent(uint256 sequenceId) external { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[msg.sender][sequenceId]; pagina.isProtected = false; } function protectContent(uint256 sequenceId) external { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[msg.sender][sequenceId]; pagina.isProtected = true; } function changePlatformFee(uint256 feePlatform) external onlyOwner { require(feePlatform <= 100, "The fee should be between 0.01 to 1% (1 - 100 in a 10000 scale)"); _platformFeePercentage = feePlatform; } function withdrawMoneyFromContent(uint256 sequenceId,uint256 amount) external { MonetizadoLibrary.ProtectedContent storage pagina = paginasProtegidas[msg.sender][sequenceId]; require(pagina.amountAvailable >= amount, "Insufficient balance"); uint256 amountForPlatform = amount * _platformFeePercentage / 10000; _platformBalance += amountForPlatform; payable(_owner).transfer(amountForPlatform); payable(msg.sender).transfer(amount - amountForPlatform); pagina.amountAvailable -= amount; } function getPlatformFee() public view returns(uint256) { return _platformFeePercentage; } function getPlatformBalance() public view returns(uint256) { return _platformBalance; } function withdrawMoneyPlatform(uint256 amount) external onlyOwner { require(_platformBalance >= amount, "Insufficient balance"); payable(msg.sender).transfer(amount); _platformBalance -= amount; } }


De plus, nous avons créé un SDK Javascript qui permet l'utilisation du contrat intelligent sur plusieurs sites Web, en particulier pour les utilisateurs qui souhaitent payer pour accéder à un contenu spécifique.

Comment utiliser

  1. Sur la page que vous souhaitez monétiser, importez Web3.JS et Ethers.JS. Vous pouvez le faire depuis un CDN, par exemple :
 <script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script> <script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js" type="application/javascript"></script>


  1. Téléchargez et importez monetizadov1.js
 <script src="./monetizado.js"></script>
  1. Créez le contenu protégé à l'aide du contrat intelligent ou dans le Directeur .


  2. Ajoutez une balise de lien dans l'en-tête du code HTML de votre page, avec l'attribut "rel" avec la valeur "monétisé" et dans href elle suit la structure suivante :


  • réseau : C'est le réseau sur lequel le contenu a été protégé.


  • creator_address : Il s'agit de l'adresse (0x..) du créateur du contenu. Il peut s'agir de votre adresse si vous êtes le créateur.


  • sequence_id : Il s'agit de l'ID selon lequel le contrat a été résilié lorsque vous avez spécifié le nouveau contenu protégé (commence à partir de 0, il est numérique).


Par exemple:

 <link rel="monetizado" href="rootstock:testnet://0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5/0" />


L'exemple précédent signifie que le contenu est protégé (par l'Id 0), par le créateur (0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5 par exemple), et que la combinaison est le paiement doit être effectué pour le débloquer.


  1. Utilisez la propriété window.monetizado ( instructions ici ).


Présentation du projet

Ce projet est déjà déployé sur le testnet Rootstock, et vous pouvez explorer les différents liens ci-dessous, y compris les référentiels et une démo :

  1. Instructions pour les contrats intelligents : https://github.com/Monetizado/Contracts
  2. Kit de développement logiciel (SDK) Javascript : https://github.com/Monetizado/monetizadojs
  3. SDK Proxy Monetizado (pour permettre de monétiser des pages complètes en utilisant une page intermédiaire pour payer et vérifier) : https://github.com/Monetizado/proxyjs
  4. Gestionnaire de monétisation (pour gérer votre contenu, collecter de l'argent et bien plus encore sans interagir avec le contrat intelligent) : https://monetizado.github.io/manager/
  5. Démo avec Rootstock : <https://monetizado.github.io/demosmonetizado/demo_rootstock.html ](https://monetizado.github.io/demosmonetizado/demo_rootstock.html)
  6. Vidéo de démonstration :


Défis et solutions

Spécifiquement pour cette idée, nous nous sommes lancés le défi de pouvoir monétiser les plateformes Web 2.0 en utilisant le Web3, sans impact majeur ni sur le créateur de contenu ni sur l'utilisateur.


Nous avons donc dû créer le SDK en Javascript qui permettrait de monétiser le contenu avec peu de modifications sur le site Web, car il est très probable que la plupart des créateurs de contenu auraient des difficultés à éditer leurs sites Web (ou qu'ils utilisent des plateformes externes où ils n'ont pas beaucoup d'espace pour éditer).


Avec cette solution, nous devions ensuite voir comment identifier le contenu qui était monétisé, et là nous avons profité de la balise de lien HTML pour spécifier ce contenu, et le SDK détecterait le montant en rBTC, si l'utilisateur avait déjà payé et avait accès, ou devait payer.

Conclusion

Rootstock représente une énorme opportunité pour BitcoinFi, en tirant parti de ses capacités et de sa robustesse en tant que réseau décentralisé. Dans ce contexte, pour effectuer des micropaiements et le connecter à l'économie de la création.


Cet exemple, Monetized, montre la simplicité d'utilisation du Web3 sur les plateformes Web2, où il existe un espace immense pour tous les types d'utilisateurs, réduisant ainsi les frictions pour intégrer ces technologies.