paint-brush
Hur man bygger ett on-chain Pay-Per-View-protokoll på Rootstockförbi@nescampos
175 avläsningar

Hur man bygger ett on-chain Pay-Per-View-protokoll på Rootstock

förbi Néstor Campos9m2024/11/30
Read on Terminal Reader

För länge; Att läsa

Monetizado är ett on-chain pay-per-view-protokoll. Det låter dig tjäna pengar på vilken webbsida och statiskt innehåll som helst genom Web3.0. Den kan användas för att skydda sidor så att endast prenumeranter kan se den.
featured image - Hur man bygger ett on-chain Pay-Per-View-protokoll på Rootstock
Néstor Campos HackerNoon profile picture

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, ett on-chain Pay-Per-View-protokoll

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.

Drag

Monetizado låter dig:

  • Ange skyddat innehåll med ett specifikt belopp som användarna måste betala för att få tillgång till.
  • Granska det skyddade innehållet du har skapat.
  • Till dina följare/användare, betala för att se ditt innehåll.
  • Kontrollera om en användare har tillgång till ditt innehåll.
  • Ändra kostnaden för åtkomst till innehåll vid behov.
  • Ta bort skyddet för innehållet (om du vill släppa det till alla under en tid).
  • Ta ut pengarna som samlats in för ditt innehåll.

Användningsfall

Du kan använda intäktsgenererande för att skydda sidor så att endast prenumeranter kan se det, som i:

  • Nyhetsportaler.
  • Videor.
  • Ljud.
  • Filer
  • Bloggar.
  • Sociala nätverk.
  • Och mycket mer.

Utvecklingsstapel

För att bygga den här plattformen använde vi:


  • Soliditet, för det smarta kontraktet
  • Remix, för att distribuera det smarta kontraktet
  • Rootstock testnet , som nätverk för projektet
  • Javascript, för att skapa en SDK och integrera med webbplatser.


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.

Hur man använder

  1. Importera Web3.JS och Ethers.JS på sidan du vill tjäna pengar på. Du kan göra det från CDN, till exempel:
 <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. Ladda ner och importera monetizadov1.js
 <script src="./monetizado.js"></script>
  1. Skapa det skyddade innehållet med det smarta kontraktet eller i Chef .


  2. 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:


  • nätverk: Det är nätverket där innehållet har skyddats.


  • creator_address: Det är adressen (0x..) till innehållsskaparen. Det kan vara din adress om du är skaparen.


  • sequence_id: Det är ID:t som kontraktet avslutades när du angav det nya skyddade innehållet (börjar från 0 och framåt, det är numeriskt).


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.


  1. Använd egenskapen window.monetizado ( instruktioner här ).


Projektgenomgång

Det här projektet är redan utplacerat på Rootstock testnet, och du kan utforska de olika länkarna nedan, inklusive repositories och en demo:

  1. Smarta kontraktsinstruktioner: https://github.com/Monetizado/Contracts
  2. Javascript SDK: https://github.com/Monetizado/monetizadojs
  3. Monetizado Proxy SDK (för att tillåta intäktsgenerering av helsidor med hjälp av en mellansida för att betala och verifiera): https://github.com/Monetizado/proxyjs
  4. Monetizado Manager (för att hantera ditt innehåll, samla in pengar och mer utan att interagera med det smarta kontraktet): https://monetizado.github.io/manager/
  5. Demo med Rootstock: <https://monetizado.github.io/demosmonetizado/demo_rootstock.html ](https://monetizado.github.io/demosmonetizado/demo_rootstock.html)
  6. Videodemo:


Utmaningar och lösningar

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.

Slutsats

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.