I uppmärksamhetsekonomin (Web 2.0) "pushas" användare att betala för prenumerationer för att få tillgång till exklusivt innehåll (allt slags innehåll, inklusive vuxet innehåll), men ingenting säkerställer att du får de fördelar du betalar för, antingen eftersom innehållet creator fortsätter inte skapa nya saker eller så måste du prenumerera under längre perioder när du bara vill betala för det du konsumerar.
Web 3.0, avsiktsekonomin, ger dock möjligheten för användare att endast betala för det de konsumerar, istället för under längre perioder, genom mikrobetalningar. I sin tur uppmuntrar det innehållsskapare att hålla sig uppdaterade med fler skapelser och få sina inkomster omedelbart, med mycket låga kostnader, utan att vara beroende av centraliserade gateways.
Monetizado är en on-chain pay-per-view-plattform som låter dig tjäna pengar på alla webbsidor och statiskt innehåll (om du inte har tillgång till backend för att göra ändringar) via Web3.
Du kan implementera Monetizado på nyhetssajter, sociala nätverk, exklusiva innehållsportaler och mer. Du kan också använda den för att uppmuntra användare att betala och inte se reklam på dina webbplatser.
Monetizado låter dig:
Du kan använda intäktsgenererande för att skydda sidor så att endast prenumeranter kan se det, som i:
För att bygga den här plattformen använde vi:
Vårt smarta kontrakt är ganska grundläggande, vilket gör att du kan ange ett namn på innehåll som ska tjäna pengar på, ett belopp (i rBTC) och flera funktioner för att aktivera/inaktivera innehåll och betala och ta emot betalningar, bland annat.
MonetizadoLibrary.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; } }
Dessutom skapade vi en Javascript SDK som tillåter användning av det smarta kontraktet på alla webbplatser, särskilt för användare som vill betala för att få åtkomst till specifikt innehåll.
<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>
Lägg till en länktagg i huvudet på HTML-koden på din sida, med attributet "rel" med värdet "monetized" och i href följer den följande struktur:
Till exempel:
<link rel="monetizado" href="rootstock:testnet://0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5/0" />
Det tidigare exemplet betyder att innehållet skyddas (av Id 0), av skaparen (0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5 till exempel), och den kombinationen är att betalningen måste göras för att låsa upp det.
Det här projektet är redan utplacerat på Rootstock testnet, och du kan utforska de olika länkarna nedan, inklusive repositories och en demo:
Specifikt för denna idé ställde vi oss själva utmaningen att kunna tjäna pengar på Web 2.0-plattformar med hjälp av Web3, utan någon större inverkan på både innehållsskaparen och användaren.
Därför var vi tvungna att skapa SDK i Javascript som skulle tillåta att tjäna pengar på innehåll med få ändringar på webbplatsen, eftersom det är mycket troligt att de flesta innehållsskapare skulle ha svårt att redigera sina webbplatser (eller så använder de externa plattformar där de inte har mycket utrymme att redigera).
Med den lösningen var vi sedan tvungna att se hur vi identifierade innehållet som tjänade pengar på, och där utnyttjade vi HTML-länktaggen för att specificera innehållet, och SDK:n skulle upptäcka beloppet i rBTC, om användaren redan hade betalat och hade tillgång eller var tvungen att betala.
Rootstock representerar en enorm möjlighet inom BitcoinFi, och drar fördel av dess kapacitet och robusthet som ett decentraliserat nätverk. I detta sammanhang att göra mikrobetalningar och koppla det till skapelseekonomin.
Det här exemplet, Monetized, visar hur enkelt det är att använda Web3 på Web2-plattformar, där det finns ett enormt utrymme för alla typer av användare, vilket minskar friktionen för att integrera dessa teknologier.