У економији пажње (Веб 2.0), корисници су „присиљени“ да плаћају претплату за приступ ексклузивном садржају (све врсте садржаја, укључујући садржај за одрасле), али ништа не гарантује да ћете добити погодности које плаћате, било због садржаја креатор не наставља да ствара нове ствари или се морате претплатити на дуже периоде када желите да платите само оно што конзумирате.
Међутим, Веб 3.0, економија намере, доноси могућност корисницима да плате само оно што конзумирају, уместо на дужи период, путем микроплаћања. Заузврат, то подстиче креаторе садржаја да остану у току са више креација, примајући свој приход одмах, уз веома ниске трошкове, без зависности од централизованих пролаза.
Монетизадо је платформа са плаћањем по приказу на ланцу која вам омогућава да монетизујете било коју веб страницу и статички садржај (ако немате приступ позадину да бисте извршили промене) преко Веб3.
Монетизадо можете имплементирати на сајтовима са вестима, друштвеним мрежама, ексклузивним порталима садржаја и још много тога. Такође можете да га користите да подстакнете кориснике да плаћају и да не виде рекламе на вашим сајтовима.
Монетизадо вам омогућава да:
Можете да користите монетизовано да заштитите странице тако да само претплатници могу да га виде, као у:
Да бисмо направили ову платформу, користили смо:
Наш паметни уговор је прилично једноставан, омогућава вам да наведете назив садржаја који ће се уновчити, износ (у рБТЦ) и неколико функција за омогућавање/онемогућавање садржаја, као и плаћање и примање уплата, између осталог.
МонетизадоЛибрари.сол
// 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; } }
Монетизадов1.сол
// 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; } }
Поред тога, креирали смо Јавасцрипт СДК који омогућава коришћење паметног уговора на свим веб локацијама, посебно за кориснике који желе да плате за приступ одређеном садржају.
<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>
Додајте ознаку везе у заглавље ХТМЛ кода своје странице, са атрибутом „рел“ са вредношћу „монетизед“ и у хреф прати следећу структуру:
на пример:
<link rel="monetizado" href="rootstock:testnet://0xda3ec0b8bddd2e8bdedede3333fbaf938fcc18c5/0" />
Претходни пример значи да је садржај заштићен (по ИД-у 0), од стране креатора (0кда3ец0б8бддд2е8бдедеде3333фбаф938фцц18ц5 на пример), а та комбинација је уплата мора бити извршена да би се откључао.
Овај пројекат је већ распоређен на Роотстоцк тестнету и можете истражити различите везе у наставку, укључујући спремишта и демо:
Посебно за ову идеју, поставили смо себи изазов да будемо у могућности да монетизујемо Веб 2.0 платформе користећи Веб3, без већег утицаја и на креатора садржаја и на корисника.
Због тога смо морали да креирамо СДК у Јавасцрипт-у који би омогућио монетизацију садржаја уз неколико промена на веб локацији, јер је врло вероватно да ће већина креатора садржаја имати потешкоћа са уређивањем својих веб локација (или користе спољне платформе на којима немају много простора уредити).
Са тим решењем, онда смо морали да видимо како да идентификујемо садржај који се монетизује, и ту смо искористили ХТМЛ ознаку везе да наведемо тај садржај, а СДК би открио износ у рБТЦ-у, ако је корисник већ платио и имао приступ, или је морао да плати.
Роотстоцк представља огромну прилику у БитцоинФи-ју, користећи предности његових могућности и робусности као децентрализоване мреже. У овом контексту, извршити микроплаћања и повезати то са економијом стварања.
Овај пример, Монетизовано, показује једноставност коришћења Веб3 на Веб2 платформама, где постоји огроман простор за све типове корисника, смањујући трење за интеграцију ових технологија.