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 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.
Monetizado vous permet de :
Vous pouvez utiliser la monétisation pour protéger les pages afin que seuls les abonnés puissent les voir, comme dans :
Pour construire cette plateforme, nous avons utilisé :
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.
<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>
<script src="./monetizado.js"></script>
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 :
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.
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 :
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.
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.