{"id":9514,"date":"2024-10-21T04:47:23","date_gmt":"2024-10-21T04:47:23","guid":{"rendered":"https:\/\/metaschool.so\/articles\/?p=9514"},"modified":"2024-10-21T04:47:29","modified_gmt":"2024-10-21T04:47:29","slug":"ocean-protocol-technical-deep-dive","status":"publish","type":"post","link":"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/","title":{"rendered":"Ocean Protocol: A Comprehensive Technical Deep Dive for Developers -2024"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_56_1 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title \" >Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Introduction\" title=\"Introduction\">Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Architecture_Overview\" title=\"Architecture Overview\">Architecture Overview<\/a><ul class='ez-toc-list-level-3'><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Blockchain_Layer\" title=\"Blockchain Layer\">Blockchain Layer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Middleware_Layer_Ocean_Nodes\" title=\"Middleware Layer: Ocean Nodes\">Middleware Layer: Ocean Nodes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Overview_of_Ocean_Nodes\" title=\"Overview of Ocean Nodes\">Overview of Ocean Nodes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Architecture_of_Ocean_Nodes\" title=\"Architecture of Ocean Nodes\">Architecture of Ocean Nodes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#How_Ocean_Nodes_Replace_Previous_Components\" title=\"How Ocean Nodes Replace Previous Components\">How Ocean Nodes Replace Previous Components<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Replacement_of_Provider\" title=\"Replacement of Provider\">Replacement of Provider<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Replacement_of_Aquarius\" title=\"Replacement of Aquarius\">Replacement of Aquarius<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Replacement_of_Subgraph\" title=\"Replacement of Subgraph\">Replacement of Subgraph<\/a><ul class='ez-toc-list-level-3'><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#API\" title=\"API\">API<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Compute-to-Data_C2D\" title=\"Compute-to-Data (C2D)\">Compute-to-Data (C2D)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Advantages_of_the_Ocean_Node_Architecture\" title=\"Advantages of the Ocean Node Architecture\">Advantages of the Ocean Node Architecture<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Application_Layer\" title=\"Application Layer\">Application Layer<\/a><ul class='ez-toc-list-level-4'><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Oceanjs\" title=\"Ocean.js\">Ocean.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Ocean_Market\" title=\"Ocean Market\">Ocean Market<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/metaschool.so\/articles\/ocean-protocol-technical-deep-dive\/#Conclusion\" title=\"Conclusion\">Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ocean Protocol stands at the forefront of the decentralized data economy, offering a robust framework for secure, transparent, and privacy-preserving data exchange. As a developer diving into this ecosystem, understanding the intricate technical details of Ocean Protocol is crucial for building powerful data-driven applications. This comprehensive guide will walk you through the architecture, components, and development processes that make Ocean Protocol a groundbreaking solution in the world of decentralized data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Architecture_Overview\"><\/span>Architecture Overview<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ocean Protocol&#8217;s architecture is a sophisticated blend of blockchain technology, off-chain components, and user-facing applications. To truly grasp its power, we need to examine each layer in detail.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Layer 1: Blockchain Layer<\/strong><\/li>\n\n\n\n<li><strong>Layer 2: Middle Layer<\/strong><\/li>\n\n\n\n<li><strong>Layer 3:  Application Layer<\/strong><\/li>\n\n\n\n<li><strong>Layer 4:  Wallets<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Blockchain_Layer\"><\/span>Blockchain Layer<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>At its core, Ocean Protocol leverages the Ethereum blockchain to provide a decentralized and transparent foundation. This layer is responsible for critical functions such as access control, token management, and maintaining the integrity of data assets.<\/p>\n\n\n\n<p>The blockchain layer is primarily composed of smart contracts written in Solidity. These contracts manage various aspects of the protocol, from token economics to data access rights. Let&#8217;s examine some of the key contracts:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>DataNFT Contract:<\/strong><br>This ERC721-compliant contract represents ownership and metadata of data assets. Each DataNFT is unique and corresponds to a specific dataset or service.<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"   contract DataNFT is ERC721Upgradeable {\n       mapping(uint256 =&gt; bytes32) private _didRegistry;\n\n       function mint(address to, uint256 tokenId, bytes32 did) public {\n           _safeMint(to, tokenId);\n           _didRegistry[tokenId] = did;\n       }\n\n       function getDID(uint256 tokenId) public view returns (bytes32) {\n           return _didRegistry[tokenId];\n       }\n   }\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">   contract DataNFT is ERC721Upgradeable {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #A6E22E\">mapping<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> bytes32) private _didRegistry;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">mint<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">address<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">to<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">tokenId<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">bytes32<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">did<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #A6E22E\">public<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #A6E22E\">_safeMint<\/span><span style=\"color: #F8F8F2\">(to, tokenId);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           _didRegistry[tokenId] <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> did;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">getDID<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">tokenId<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #A6E22E\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">view<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">returns<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #FD971F; font-style: italic\">bytes32<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> _didRegistry[tokenId];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The DataNFT contract allows for the creation of unique tokens representing data assets. The <code>mint<\/code> function creates a new NFT and associates it with a decentralized identifier (DID), while the <code>getDID<\/code> function retrieves the DID for a given token.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>DataToken Contract:<\/strong><br>DataTokens are ERC20-compliant tokens that represent access rights to specific datasets or services. They enable granular control over data access and facilitate token-based data economies.<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"   contract DataToken is ERC20Upgradeable {\n       address public dataNFT;\n       uint256 public dataTokenId;\n\n       function initialize(address _dataNFT, uint256 _dataTokenId, string memory name, string memory symbol) public initializer {\n           __ERC20_init(name, symbol);\n           dataNFT = _dataNFT;\n           dataTokenId = _dataTokenId;\n       }\n\n       function mint(address to, uint256 amount) public {\n           require(DataNFT(dataNFT).ownerOf(dataTokenId) == msg.sender, &quot;Only NFT owner can mint&quot;);\n           _mint(to, amount);\n       }\n   }\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">   contract DataToken is ERC20Upgradeable {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       address public dataNFT;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       uint256 public dataTokenId;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">initialize<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">address<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">_dataNFT<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">_dataTokenId<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">string<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">memory<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">name<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">string<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">memory<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">symbol<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #A6E22E\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">initializer<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #A6E22E\">__ERC20_init<\/span><span style=\"color: #F8F8F2\">(name, symbol);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           dataNFT <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> _dataNFT;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           dataTokenId <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> _dataTokenId;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">mint<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">address<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">to<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">amount<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #A6E22E\">public<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #A6E22E\">require<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #A6E22E\">DataNFT<\/span><span style=\"color: #F8F8F2\">(dataNFT).<\/span><span style=\"color: #A6E22E\">ownerOf<\/span><span style=\"color: #F8F8F2\">(dataTokenId) <\/span><span style=\"color: #F92672\">==<\/span><span style=\"color: #F8F8F2\"> msg.sender, <\/span><span style=\"color: #E6DB74\">&quot;Only NFT owner can mint&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #A6E22E\">_mint<\/span><span style=\"color: #F8F8F2\">(to, amount);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This contract links DataTokens to their corresponding DataNFT. The <code>mint<\/code> function allows the owner of the DataNFT to create new DataTokens, effectively granting access rights to the dataset.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>FixedRateExchange Contract:<\/strong><br>This contract facilitates the exchange of DataTokens for payment tokens (such as OCEAN or other ERC20 tokens) at a fixed rate.<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"   contract FixedRateExchange {\n       struct Exchange {\n           address dataToken;\n           address paymentToken;\n           uint256 fixedRate;\n           address owner;\n       }\n\n       mapping(uint256 =&gt; Exchange) public exchanges;\n       uint256 public exchangeCounter;\n\n       function createExchange(address dataToken, address paymentToken, uint256 fixedRate) public returns (uint256) {\n           exchangeCounter++;\n           exchanges[exchangeCounter] = Exchange(dataToken, paymentToken, fixedRate, msg.sender);\n           return exchangeCounter;\n       }\n\n       function buyDataToken(uint256 exchangeId, uint256 datokenAmount) public {\n           Exchange storage exchange = exchanges[exchangeId];\n           uint256 paymentAmount = datokenAmount * exchange.fixedRate;\n\n           require(IERC20(exchange.paymentToken).transferFrom(msg.sender, exchange.owner, paymentAmount), &quot;Payment transfer failed&quot;);\n           require(IERC20(exchange.dataToken).transfer(msg.sender, datokenAmount), &quot;DataToken transfer failed&quot;);\n       }\n   }\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">   contract FixedRateExchange {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       struct Exchange {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           address dataToken;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           address paymentToken;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           uint256 fixedRate;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           address owner;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #A6E22E\">mapping<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> Exchange) public exchanges;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       uint256 public exchangeCounter;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">createExchange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">address<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">dataToken<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">address<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">paymentToken<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">fixedRate<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #A6E22E\">public<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">returns<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           exchangeCounter<\/span><span style=\"color: #F92672\">++<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           exchanges[exchangeCounter] <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Exchange<\/span><span style=\"color: #F8F8F2\">(dataToken, paymentToken, fixedRate, msg.sender);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> exchangeCounter;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">buyDataToken<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">exchangeId<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">uint256<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FD971F; font-style: italic\">datokenAmount<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #A6E22E\">public<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           Exchange storage exchange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> exchanges[exchangeId];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           uint256 paymentAmount <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> datokenAmount <\/span><span style=\"color: #F92672\">*<\/span><span style=\"color: #F8F8F2\"> exchange.fixedRate;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #A6E22E\">require<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #A6E22E\">IERC20<\/span><span style=\"color: #F8F8F2\">(exchange.paymentToken).<\/span><span style=\"color: #A6E22E\">transferFrom<\/span><span style=\"color: #F8F8F2\">(msg.sender, exchange.owner, paymentAmount), <\/span><span style=\"color: #E6DB74\">&quot;Payment transfer failed&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">           <\/span><span style=\"color: #A6E22E\">require<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #A6E22E\">IERC20<\/span><span style=\"color: #F8F8F2\">(exchange.dataToken).<\/span><span style=\"color: #A6E22E\">transfer<\/span><span style=\"color: #F8F8F2\">(msg.sender, datokenAmount), <\/span><span style=\"color: #E6DB74\">&quot;DataToken transfer failed&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">   }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This contract allows for the creation of fixed-rate exchanges and the purchase of DataTokens. The <code>createExchange<\/code> function sets up a new exchange, while <code>buyDataToken<\/code> handles the token swap based on the fixed rate.<\/p>\n\n\n\n<p>These smart contracts form the backbone of Ocean Protocol&#8217;s on-chain operations, ensuring transparent and secure management of data assets and access rights.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Middleware_Layer_Ocean_Nodes\"><\/span>Middleware Layer: Ocean Nodes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The middleware layer of Ocean Protocol has undergone a significant evolution with the introduction of Ocean Nodes. This new architecture replaces the previous components (Provider, Aquarius, and Subgraph) with a unified, efficient system. Let&#8217;s explore the Ocean Node architecture in detail.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Overview_of_Ocean_Nodes\"><\/span>Overview of Ocean Nodes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Ocean Nodes are a vital part of the Ocean Protocol core technology stack. The Ocean Nodes monorepo replaces three previous components: Provider, Aquarius, and Subgraph. It has been designed to significantly simplify the process of starting the Ocean stack &#8211; it runs everything you need with one simple command.<\/p>\n\n\n\n<p>Key features of Ocean Nodes include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Integration of multiple services for secure and efficient data operations<\/li>\n\n\n\n<li>Utilization of technologies like libp2p for peer-to-peer communication<\/li>\n\n\n\n<li>Modular and scalable architecture supporting various use cases, from simple data retrieval to complex compute-to-data (C2D) tasks<\/li>\n\n\n\n<li>Layered structure, including a network layer for communication and a components layer for core services like the Indexer and Provider<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Architecture_of_Ocean_Nodes\"><\/span>Architecture of Ocean Nodes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The Ocean Node is structured into separate layers, ensuring efficient data management and high security:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Network Layer: Handles communication between nodes and with the blockchain<\/li>\n\n\n\n<li>Components Layer: Houses core services such as the Indexer and Provider<\/li>\n\n\n\n<li>Orchestration Layer: Coordinates interactions between the core node and execution environments<\/li>\n<\/ol>\n\n\n\n<p>This layered architecture allows for flexibility and extensibility, supporting multiple compute engines like Docker and Kubernetes within the same framework.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_Ocean_Nodes_Replace_Previous_Components\"><\/span>How Ocean Nodes Replace Previous Components<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Replacement_of_Provider\"><\/span>Replacement of Provider<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ocean Nodes take over the following Provider functionalities:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Exclusive access to data<\/li>\n\n\n\n<li>On-chain verification of buyer permissions and payments<\/li>\n\n\n\n<li>Encryption of URL and metadata during publishing<\/li>\n\n\n\n<li>Decryption of URL for dataset downloads or compute job initiation<\/li>\n\n\n\n<li>Provision of data asset access through data streaming (never exposing the URL)<\/li>\n\n\n\n<li>Provision of compute services (connection to C2D environment)<\/li>\n\n\n\n<li>Typically run by the data owner<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Replacement_of_Aquarius\"><\/span>Replacement of Aquarius<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The Indexer component within Ocean Nodes replaces Aquarius:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acts as a cache for on-chain data<\/li>\n\n\n\n<li>Stores metadata from smart contract events off-chain in a Typesense database<\/li>\n\n\n\n<li>Monitors MetadataCreated and MetadataUpdated events, processing and updating them in the database<\/li>\n\n\n\n<li>Provides a REST API for fetching data from the off-chain datastore<\/li>\n\n\n\n<li>Offers easy query access to metadata without scanning the blockchain<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Replacement_of_Subgraph\"><\/span>Replacement of Subgraph<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ocean Nodes take over Subgraph functionalities:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Indexing data from smart contract events<\/li>\n\n\n\n<li>Real-time indexing and updating of data<\/li>\n\n\n\n<li>Provision of an API for receiving and responding to queries<\/li>\n\n\n\n<li>Simplification of the development experience for Ocean Protocol builders<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"API\"><\/span>API<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Ocean Nodes expose a comprehensive set of HTTP endpoints. For detailed information on these endpoints, developers should refer to the API.md file in the GitHub repository: <a href=\"https:\/\/github.com\/oceanprotocol\/ocean-node\/blob\/develop\/API.md\" target=\"_blank\" rel=\"noopener\">Ocean Node API Documentation<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Compute-to-Data_C2D\"><\/span>Compute-to-Data (C2D)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Ocean Nodes provide a convenient and easy way to run a compute-to-data environment. This feature allows node operators to monetize their nodes by charging fees for using the C2D environment. Additionally, there are incentives provided by the Ocean Protocol Foundation (OPF).<\/p>\n\n\n\n<p>Key points about C2D in Ocean Nodes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enables data monetization while preserving privacy<\/li>\n\n\n\n<li>Allows for charging fees for computation services<\/li>\n\n\n\n<li>Provides additional incentives from OPF<\/li>\n\n\n\n<li>Upcoming C2D V2 will introduce different environments and new payment methods for computation<\/li>\n<\/ul>\n\n\n\n<p>For more details on the C2D V2 architecture, developers can refer to the documentation in the repository: <a href=\"https:\/\/github.com\/oceanprotocol\/ocean-node\/blob\/develop\/docs\/C2DV2.md\" target=\"_blank\" rel=\"noopener\">C2D V2 Documentation<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Advantages_of_the_Ocean_Node_Architecture\"><\/span>Advantages of the Ocean Node Architecture<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><strong>Flexibility<\/strong>: Support for multiple compute engines and environments within the same framework.<\/p>\n\n\n\n<p><strong>Simplified Deployment<\/strong>: Running a single node is easier than managing multiple separate components.<\/p>\n\n\n\n<p><strong>Improved Efficiency<\/strong>: Tighter integration between components reduces latency and improves overall performance.<\/p>\n\n\n\n<p><strong>Enhanced Scalability<\/strong>: The modular architecture allows for easy replication and distribution of nodes to handle increased network load.<\/p>\n\n\n\n<p><strong>Better Consistency<\/strong>: With all components in one system, it&#8217;s easier to maintain data consistency across the network.<\/p>\n\n\n\n<p><strong>Reduced Dependencies<\/strong>: Fewer external dependencies make the system more robust and easier to maintain.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Application_Layer\"><\/span>Application Layer<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The application layer is where developers interact most directly with Ocean Protocol. This layer includes tools, libraries, and interfaces that simplify the process of building decentralized data applications.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Oceanjs\"><\/span>Ocean.js<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Ocean.js is a JavaScript library that provides a high-level interface for interacting with Ocean Protocol. Here&#8217;s an example of how you might use Ocean.js to publish a dataset:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { Ocean, DataTokens, Contracts } from '@oceanprotocol\/lib'\n\nasync function publishDataset() {\n    const ocean = await Ocean.getInstance({\n        networkId: 1, \/\/ Ethereum Mainnet\n        nodeUri: 'https:\/\/mainnet.infura.io\/v3\/YOUR-PROJECT-ID'\n    });\n\n    const accounts = await ocean.accounts.list();\n    const publisher = accounts[0];\n\n    const datatoken = await DataTokens.create(ocean, publisher, {\n        cap: '100000',\n        name: 'MyDataToken',\n        symbol: 'MDT'\n    });\n\n    const metadata = {\n        name: &quot;My Dataset&quot;,\n        description: &quot;A valuable dataset for analysis&quot;,\n        author: &quot;Data Scientist&quot;,\n        license: &quot;CC-BY&quot;,\n        files: [\n            {\n                url: &quot;https:\/\/example.com\/dataset.csv&quot;,\n                contentType: &quot;text\/csv&quot;\n            }\n        ]\n    };\n\n    const asset = await ocean.assets.create(metadata, publisher, datatoken.address);\n\n    console.log(`Dataset published with DID: ${asset.id}`);\n}\n\npublishDataset().catch(console.error);\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">import<\/span><span style=\"color: #F8F8F2\"> { Ocean, DataTokens, Contracts } <\/span><span style=\"color: #F92672\">from<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;@oceanprotocol\/lib&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">async<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">publishDataset<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> ocean <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">await<\/span><span style=\"color: #F8F8F2\"> Ocean.<\/span><span style=\"color: #A6E22E\">getInstance<\/span><span style=\"color: #F8F8F2\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        networkId: <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #88846F\">\/\/ Ethereum Mainnet<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        nodeUri: <\/span><span style=\"color: #E6DB74\">&#39;https:\/\/mainnet.infura.io\/v3\/YOUR-PROJECT-ID&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> accounts <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">await<\/span><span style=\"color: #F8F8F2\"> ocean.accounts.<\/span><span style=\"color: #A6E22E\">list<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> publisher <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> accounts[<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> datatoken <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">await<\/span><span style=\"color: #F8F8F2\"> DataTokens.<\/span><span style=\"color: #A6E22E\">create<\/span><span style=\"color: #F8F8F2\">(ocean, publisher, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        cap: <\/span><span style=\"color: #E6DB74\">&#39;100000&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        name: <\/span><span style=\"color: #E6DB74\">&#39;MyDataToken&#39;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        symbol: <\/span><span style=\"color: #E6DB74\">&#39;MDT&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> metadata <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        name: <\/span><span style=\"color: #E6DB74\">&quot;My Dataset&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        description: <\/span><span style=\"color: #E6DB74\">&quot;A valuable dataset for analysis&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        author: <\/span><span style=\"color: #E6DB74\">&quot;Data Scientist&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        license: <\/span><span style=\"color: #E6DB74\">&quot;CC-BY&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        files: [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                url: <\/span><span style=\"color: #E6DB74\">&quot;https:\/\/example.com\/dataset.csv&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                contentType: <\/span><span style=\"color: #E6DB74\">&quot;text\/csv&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> asset <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">await<\/span><span style=\"color: #F8F8F2\"> ocean.assets.<\/span><span style=\"color: #A6E22E\">create<\/span><span style=\"color: #F8F8F2\">(metadata, publisher, datatoken.address);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    console.<\/span><span style=\"color: #A6E22E\">log<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">`Dataset published with DID: <\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">asset.id<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #A6E22E\">publishDataset<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #A6E22E\">catch<\/span><span style=\"color: #F8F8F2\">(console.error);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This script demonstrates the process of creating a datatoken, defining metadata for a dataset, and publishing it to the Ocean Protocol network.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ocean_Market\"><\/span>Ocean Market<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>While not a core component of Ocean Protocol, the Ocean Market is a reference implementation of a data marketplace built on top of the protocol. Developers can use it as a starting point for building their own customized marketplaces.<\/p>\n\n\n\n<p>Here&#8217;s a simplified React component that could be part of a custom marketplace, allowing users to search for datasets:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#272822\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import React, { useState, useEffect } from 'react';\nimport { Ocean } from '@oceanprotocol\/lib';\n\nconst DatasetSearch = () =&gt; {\n    const [ocean, setOcean] = useState(null);\n    const [searchTerm, setSearchTerm] = useState('');\n    const [results, setResults] = useState([]);\n\n    useEffect(() =&gt; {\n        async function initOcean() {\n            const oceanInstance = await Ocean.getInstance({\n                networkId: 1,\n                nodeUri: 'https:\/\/mainnet.infura.io\/v3\/YOUR-PROJECT-ID'\n            });\n            setOcean(oceanInstance);\n        }\n        initOcean();\n    }, []);\n\n    const handleSearch = async () =&gt; {\n        if (!ocean) return;\n\n        const searchResults = await ocean.assets.query({\n            text: searchTerm\n        });\n\n        setResults(searchResults);\n    };\n\n    return (\n        <div&gt;\n            <input\n                type=&quot;text&quot;\n                value={searchTerm}\n                onChange={(e) =&gt; setSearchTerm(e.target.value)}\n                placeholder=&quot;Search for datasets&quot;\n            \/&gt;\n            <button onClick={handleSearch}&gt;Search<\/button&gt;\n            <ul&gt;\n                {results.map(result =&gt; (\n                    <li key={result.id}&gt;{result.metadata.name}<\/li&gt;\n                ))}\n            <\/ul&gt;\n        <\/div&gt;\n    );\n};\n\nexport default DatasetSearch;\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">import<\/span><span style=\"color: #F8F8F2\"> React, { useState, useEffect } <\/span><span style=\"color: #F92672\">from<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;react&#39;<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">import<\/span><span style=\"color: #F8F8F2\"> { Ocean } <\/span><span style=\"color: #F92672\">from<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&#39;@oceanprotocol\/lib&#39;<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">DatasetSearch<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> () <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> [ocean, setOcean] <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">useState<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">null<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> [searchTerm, setSearchTerm] <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">useState<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&#39;&#39;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> [results, setResults] <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">useState<\/span><span style=\"color: #F8F8F2\">([]);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #A6E22E\">useEffect<\/span><span style=\"color: #F8F8F2\">(() <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">async<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">initOcean<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> oceanInstance <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">await<\/span><span style=\"color: #F8F8F2\"> Ocean.<\/span><span style=\"color: #A6E22E\">getInstance<\/span><span style=\"color: #F8F8F2\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                networkId: <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                nodeUri: <\/span><span style=\"color: #E6DB74\">&#39;https:\/\/mainnet.infura.io\/v3\/YOUR-PROJECT-ID&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            <\/span><span style=\"color: #A6E22E\">setOcean<\/span><span style=\"color: #F8F8F2\">(oceanInstance);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">initOcean<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }, []);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">handleSearch<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">async<\/span><span style=\"color: #F8F8F2\"> () <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">ocean) <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> searchResults <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">await<\/span><span style=\"color: #F8F8F2\"> ocean.assets.<\/span><span style=\"color: #A6E22E\">query<\/span><span style=\"color: #F8F8F2\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            text: searchTerm<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #A6E22E\">setResults<\/span><span style=\"color: #F8F8F2\">(searchResults);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &lt;<\/span><span style=\"color: #F92672\">div<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &lt;<\/span><span style=\"color: #F92672\">input<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #A6E22E\">type<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;text&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #A6E22E\">value<\/span><span style=\"color: #F92672\">={<\/span><span style=\"color: #F8F8F2\">searchTerm<\/span><span style=\"color: #F92672\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #A6E22E\">onChange<\/span><span style=\"color: #F92672\">={<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">e<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">setSearchTerm<\/span><span style=\"color: #F8F8F2\">(e.target.value)<\/span><span style=\"color: #F92672\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #A6E22E\">placeholder<\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #E6DB74\">&quot;Search for datasets&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &lt;<\/span><span style=\"color: #F92672\">button<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">onClick<\/span><span style=\"color: #F92672\">={<\/span><span style=\"color: #F8F8F2\">handleSearch<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #F8F8F2\">&gt;Search&lt;\/<\/span><span style=\"color: #F92672\">button<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &lt;<\/span><span style=\"color: #F92672\">ul<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                <\/span><span style=\"color: #F92672\">{<\/span><span style=\"color: #F8F8F2\">results.<\/span><span style=\"color: #A6E22E\">map<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">result<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                    &lt;<\/span><span style=\"color: #F92672\">li<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">key<\/span><span style=\"color: #F92672\">={<\/span><span style=\"color: #F8F8F2\">result.id<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><span style=\"color: #F92672\">{<\/span><span style=\"color: #F8F8F2\">result.metadata.name<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #F8F8F2\">&lt;\/<\/span><span style=\"color: #F92672\">li<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">                ))<\/span><span style=\"color: #F92672\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">            &lt;\/<\/span><span style=\"color: #F92672\">ul<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        &lt;\/<\/span><span style=\"color: #F92672\">div<\/span><span style=\"color: #F8F8F2\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">export<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">default<\/span><span style=\"color: #F8F8F2\"> DatasetSearch;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This component allows users to search for datasets using Ocean.js and displays the results. In a full-featured marketplace, you would expand this to include features like dataset preview, purchasing mechanisms, and integration with web3 wallets.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ocean Protocol&#8217;s architecture provides a powerful foundation for building decentralized data exchange applications. Its layered approach, combining on-chain smart contracts with off-chain middleware and user-facing applications, enables a flexible and scalable ecosystem for data sharing and monetization.<\/p>\n\n\n\n<p>As a developer working with Ocean Protocol, you&#8217;ll interact with various components across these layers:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Smart contracts for managing data assets, access rights, and token economics<\/li>\n\n\n\n<li>Middleware services like Provider and Aquarius for data access and metadata management<\/li>\n\n\n\n<li>Compute-to-Data features for privacy-preserving data analysis<\/li>\n\n\n\n<li>Application-layer tools like Ocean.js for building user-facing applications<\/li>\n<\/ol>\n\n\n\n<p>By leveraging these components, you can create innovative solutions that unlock the value of data while preserving privacy and control. Whether you&#8217;re building a specialized data marketplace, a decentralized AI training platform, or a data-driven DAO, Ocean Protocol provides the tools and infrastructure to bring your vision to life.<\/p>\n\n\n\n<p>As the protocol continues to evolve, stay updated with the latest developments in the Ocean Protocol documentation and community channels. The future of the decentralized data economy is bright, and as a developer, you&#8217;re at the forefront of this exciting revolution. <a href=\"https:\/\/metaschool.so\/courses\/introduction-to-ocean-protocol\" data-type=\"link\" data-id=\"https:\/\/metaschool.so\/courses\/introduction-to-ocean-protocol\">Learn to build on Ocean Protocol with Metaschool.<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":24,"featured_media":9534,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[17],"tags":[],"class_list":["post-9514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blockchain"],"_links":{"self":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts\/9514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/comments?post=9514"}],"version-history":[{"count":4,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts\/9514\/revisions"}],"predecessor-version":[{"id":9536,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/posts\/9514\/revisions\/9536"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/media\/9534"}],"wp:attachment":[{"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/media?parent=9514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/categories?post=9514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/metaschool.so\/articles\/wp-json\/wp\/v2\/tags?post=9514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}