paint-brush
Sådan opbygger du en on-Chain Pay-Per-View-protokol på Rootstockved@nescampos
376 aflæsninger
376 aflæsninger

Sådan opbygger du en on-Chain Pay-Per-View-protokol på Rootstock

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

For langt; At læse

Monetizado er en on-chain pay-per-view protokol. Det giver dig mulighed for at tjene penge på enhver webside og statisk indhold gennem Web3.0. Det kan bruges til at beskytte sider, så kun abonnenter kan se det.
featured image - Sådan opbygger du en on-Chain Pay-Per-View-protokol på Rootstock
Néstor Campos HackerNoon profile picture

I opmærksomhedsøkonomien (Web 2.0) bliver brugerne "skubbet" til at betale for abonnementer for at få adgang til eksklusivt indhold (al slags indhold, inklusive voksenindhold), men intet sikrer, at du får de fordele, du betaler for, enten fordi indholdet creator fortsætter ikke med at skabe nye ting, eller du skal tegne abonnement i længere perioder, når du kun vil betale for det, du forbruger.


Men Web 3.0, intentionsøkonomien, giver brugerne mulighed for kun at betale for det, de forbruger, i stedet for i længere perioder, gennem mikrobetalinger. Til gengæld tilskynder det indholdsskabere til at holde sig opdateret med flere kreationer og modtage deres indkomst med det samme, med meget lave omkostninger, uden at være afhængig af centraliserede gateways.

Monetizado, en on-chain Pay-Per-View-protokol

Monetizado er en on-chain pay-per-view platform, der giver dig mulighed for at tjene penge på enhver webside og statisk indhold (hvis du ikke har adgang til backend for at foretage ændringer) gennem Web3.


Du kan implementere Monetizado på nyhedssider, sociale netværk, eksklusive indholdsportaler og mere. Du kan også bruge det til at tilskynde brugerne til at betale og ikke se reklamer på dine websteder.

Funktioner

Monetizado giver dig mulighed for at:

  • Angiv beskyttet indhold med et bestemt beløb, som brugerne skal betale for at få adgang til.
  • Gennemgå det beskyttede indhold, du har oprettet.
  • Til dine følgere/brugere, betal for at se dit indhold.
  • Tjek, om en bruger har adgang til dit indhold.
  • Ændre omkostningerne ved adgang til indhold, hvis det kræves.
  • Fjern beskyttelsen af indholdet (hvis du vil frigive det til alle i nogen tid).
  • Træk de indsamlede penge til dit indhold.

Use Case

Du kan bruge indtægtsgenereret til at beskytte sider, så kun abonnenter kan se det, som i:

  • Nyhedsportaler.
  • Videoer.
  • Lyd.
  • Filer
  • Blogs.
  • Sociale netværk.
  • Og meget mere.

Udviklingsstak

For at bygge denne platform brugte vi:


  • Soliditet, for den smarte kontrakt
  • Remix for at implementere den smarte kontrakt
  • Rootstock testnet , som netværk for projektet
  • Javascript, til at oprette et SDK og integrere med websteder.


Vores smarte kontrakt er ret grundlæggende, hvilket giver dig mulighed for at angive et navn på indhold, der skal tjene penge på, et beløb (i rBTC) og flere funktioner til at aktivere/deaktivere indhold og betale og modtage betalinger, blandt andre.


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; } }


Derudover har vi skabt et Javascript SDK , der tillader brugen af den smarte kontrakt på tværs af websteder, især for brugere, der ønsker at betale for at få adgang til specifikt indhold.

Sådan bruges

  1. På den side, du vil tjene penge på, skal du importere Web3.JS og Ethers.JS. Du kan gøre det fra CDN, for eksempel:
 <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. Download og importer monetizadov1.js
 <script src="./monetizado.js"></script>
  1. Opret det beskyttede indhold ved hjælp af den smarte kontrakt eller i Bestyrer .


  2. Tilføj et link-tag i hovedet af HTML-koden på din side med attributten "rel" med værdien "monetized", og i href følger det følgende struktur:


  • netværk: Det er netværket, hvor indholdet er blevet beskyttet.


  • creator_address: Det er adressen (0x..) på indholdsskaberen. Det kan være din adresse, hvis du er skaberen.


  • sequence_id: Det er ID'et, som kontrakten blev opsagt, da du specificerede det nye beskyttede indhold (starter fra 0 og fremefter, det er numerisk).


For eksempel:

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


Det foregående eksempel betyder, at indholdet er beskyttet (af Id 0), af skaberen (f.eks. 0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5), og den kombination er, at betalingen skal foretages for at låse det op.


  1. Brug egenskaben window.monetizado ( vejledning her ).


Projektgennemgang

Dette projekt er allerede implementeret på Rootstock testnet, og du kan udforske de forskellige links nedenfor, herunder repositories og en demo:

  1. Smart kontraktinstruktioner: https://github.com/Monetizado/Contracts
  2. Javascript SDK: https://github.com/Monetizado/monetizadojs
  3. Monetizado Proxy SDK (for at gøre det muligt at tjene penge på hele sider ved hjælp af en mellemside til at betale og bekræfte): https://github.com/Monetizado/proxyjs
  4. Monetizado Manager (for at administrere dit indhold, indsamle penge og mere uden at interagere med den smarte kontrakt): 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:


Udfordringer og løsninger

Specifikt for denne idé satte vi os selv den udfordring at være i stand til at tjene penge på Web 2.0-platforme ved hjælp af Web3, uden en større indvirkning på både indholdsskaberen og brugeren.


Derfor var vi nødt til at oprette SDK'et i Javascript, der ville tillade at tjene penge på indhold med få ændringer på webstedet, da det er meget sandsynligt, at de fleste indholdsskabere ville have svært ved at redigere deres websteder (eller de bruger eksterne platforme, hvor de ikke har meget plads at redigere).


Med den løsning skulle vi så se, hvordan vi identificerede det indhold, der blev indtægtsgenereret, og der udnyttede vi HTML-link-tagget til at specificere det indhold, og SDK'et ville registrere beløbet i rBTC, hvis brugeren allerede havde betalt og havde adgang, eller skulle betale.

Konklusion

Rootstock repræsenterer en enorm mulighed i BitcoinFi, der udnytter dens muligheder og robusthed som et decentraliseret netværk. I denne sammenhæng at foretage mikrobetalinger og forbinde det med skabelsesøkonomien.


Dette eksempel, Monetized, viser enkelheden ved at bruge Web3 på Web2 platforme, hvor der er en enorm plads til alle typer brugere, hvilket reducerer friktionen for at integrere disse teknologier.