paint-brush
Cara Membina Protokol Pay-Per-View On-Chain pada Rootstockoleh@nescampos
376 bacaan
376 bacaan

Cara Membina Protokol Pay-Per-View On-Chain pada Rootstock

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

Terlalu panjang; Untuk membaca

Monetizado ialah protokol bayar setiap tontonan dalam rangkaian. Ia membolehkan anda mengewangkan mana-mana halaman web dan kandungan statik melalui Web3.0. Ia boleh digunakan untuk melindungi halaman supaya hanya pelanggan boleh melihatnya.
featured image - Cara Membina Protokol Pay-Per-View On-Chain pada Rootstock
Néstor Campos HackerNoon profile picture

Dalam ekonomi perhatian (Web 2.0), pengguna "didesak" membayar langganan untuk mengakses kandungan eksklusif (semua jenis kandungan, termasuk kandungan dewasa), tetapi tiada apa yang memastikan anda mendapat faedah yang anda bayar, sama ada kerana kandungan pencipta tidak terus mencipta perkara baharu atau anda perlu melanggan untuk tempoh yang panjang apabila anda hanya mahu membayar untuk apa yang anda makan.


Walau bagaimanapun, Web 3.0, ekonomi niat, membawa peluang kepada pengguna untuk membayar hanya untuk apa yang mereka makan, bukannya untuk tempoh yang berpanjangan, melalui pembayaran mikro. Seterusnya, ia memberi insentif kepada pencipta kandungan untuk kekal dikemas kini dengan lebih banyak ciptaan, menerima pendapatan mereka serta-merta, dengan kos yang sangat rendah, tanpa bergantung pada gerbang berpusat.

Monetizado, Protokol Pay-Per-View On-Chain

Monetizado ialah platform bayar setiap tontonan dalam rantaian yang membolehkan anda mengewangkan mana-mana halaman web dan kandungan statik (jika anda tidak mempunyai akses kepada bahagian belakang untuk membuat perubahan) melalui Web3.


Anda boleh melaksanakan Monetizado di tapak berita, rangkaian sosial, portal kandungan eksklusif dan banyak lagi. Anda juga boleh menggunakannya untuk memberi insentif kepada pengguna untuk membayar dan tidak melihat pengiklanan di tapak anda.

Ciri-ciri

Monetizado membolehkan anda:

  • Tentukan kandungan yang dilindungi dengan jumlah tertentu yang pengguna mesti bayar untuk mengakses.
  • Semak kandungan dilindungi yang telah anda buat.
  • Kepada pengikut/pengguna anda, bayar untuk melihat kandungan anda.
  • Semak sama ada pengguna mempunyai akses kepada kandungan anda.
  • Tukar kos akses kepada kandungan jika perlu.
  • Nyahlindung kandungan (jika anda ingin melepaskannya kepada semua orang untuk beberapa waktu).
  • Keluarkan wang yang dikumpul untuk kandungan anda.

Use Case

Anda boleh menggunakan wang untuk melindungi halaman supaya hanya pelanggan boleh melihatnya, seperti dalam:

  • Portal berita.
  • Video.
  • Audio.
  • Fail
  • Blog.
  • Rangkaian sosial.
  • Dan banyak lagi.

Timbunan Pembangunan

Untuk membina platform ini, kami menggunakan:


  • Kemantapan, untuk kontrak pintar
  • Remix, untuk menggunakan kontrak pintar
  • Rootstock testnet , sebagai rangkaian untuk projek itu
  • Javascript, untuk mencipta SDK dan menyepadukan dengan tapak web.


Kontrak pintar kami agak asas, membolehkan anda menentukan nama kandungan untuk diwangkan, jumlah (dalam rBTC) dan beberapa fungsi untuk mendayakan/melumpuhkan kandungan, dan membayar serta menerima pembayaran, antara lain.


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


Selain itu, kami mencipta Javascript SDK yang membenarkan penggunaan kontrak pintar merentas tapak web, terutamanya untuk pengguna yang ingin membayar untuk mengakses kandungan tertentu.

Cara Penggunaan

  1. Pada halaman yang anda ingin wangkan, import Web3.JS dan Ethers.JS. Anda boleh melakukannya dari CDN, sebagai contoh:
 <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. Muat turun dan import monetizadov1.js
 <script src="./monetizado.js"></script>
  1. Cipta kandungan yang dilindungi menggunakan kontrak pintar atau dalam Pengurus .


  2. Tambahkan teg pautan di kepala kod HTML halaman anda, dengan atribut "rel" dengan nilai "diwangkan" dan dalam href ia mengikut struktur berikut:


  • rangkaian: Ia adalah rangkaian di mana kandungan telah dilindungi.


  • creator_address: Ia ialah alamat (0x..) pencipta kandungan. Ia boleh menjadi alamat anda jika anda adalah pencipta.


  • sequence_id: Ia adalah ID yang kontrak telah ditamatkan apabila anda menentukan kandungan dilindungi baharu (bermula dari 0 dan seterusnya, ia adalah angka).


Contohnya:

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


Contoh sebelumnya bermakna kandungan dilindungi (oleh Id 0), oleh pencipta (0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5 sebagai contoh), dan gabungan itu ialah pembayaran mesti dibuat untuk membuka kuncinya.


  1. Gunakan sifat window.monetizado ( arahan di sini ).


Panduan Projek

Projek ini telah digunakan pada testnet Rootstock, dan anda boleh meneroka pelbagai pautan di bawah, termasuk repositori dan demo:

  1. Arahan kontrak pintar: https://github.com/Monetizado/Contracts
  2. Javascript SDK: https://github.com/Monetizado/monetizadojs
  3. Monetizado Proxy SDK (untuk membenarkan pengewangan halaman penuh menggunakan halaman perantaraan untuk membayar dan mengesahkan): https://github.com/Monetizado/proxyjs
  4. Pengurus Monetizado (untuk mengurus kandungan anda, mengumpul wang dan banyak lagi tanpa berinteraksi dengan kontrak pintar): https://monetizado.github.io/manager/
  5. Demo dengan Rootstock: <https://monetizado.github.io/demosmonetizado/demo_rootstock.html ](https://monetizado.github.io/demosmonetizado/demo_rootstock.html)
  6. Demo video:


Cabaran dan Penyelesaian

Khusus untuk idea ini, kami menetapkan sendiri cabaran untuk dapat mengewangkan platform Web 2.0 menggunakan Web3, tanpa kesan besar kepada pencipta kandungan dan pengguna.


Oleh itu, kami terpaksa mencipta SDK dalam Javascript yang membolehkan kandungan mengewangkan dengan sedikit perubahan pada tapak web, kerana kemungkinan besar kebanyakan pencipta kandungan akan menghadapi kesukaran untuk mengedit tapak web mereka (atau mereka menggunakan platform luaran yang mereka tidak mempunyai banyak ruang. untuk mengedit).


Dengan penyelesaian itu, kami kemudiannya perlu melihat cara untuk mengenal pasti kandungan yang sedang diwangkan, dan di sana kami mengambil kesempatan daripada teg pautan HTML untuk menentukan kandungan tersebut, dan SDK akan mengesan jumlah dalam rBTC, jika pengguna telah membayar. dan mempunyai akses, atau terpaksa membayar.

Kesimpulan

Rootstock mewakili peluang besar dalam BitcoinFi, mengambil kesempatan daripada keupayaan dan keteguhannya sebagai rangkaian terdesentralisasi. Dalam konteks ini, untuk membuat pembayaran mikro dan menghubungkannya dengan ekonomi penciptaan.


Contoh ini, Monetized, menunjukkan kesederhanaan menggunakan Web3 pada platform Web2, di mana terdapat ruang yang besar untuk semua jenis pengguna, mengurangkan geseran untuk menyepadukan teknologi ini.