<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>The Indexing Company</title>
        <link>https://paragraph.com/@indexingco</link>
        <description>Paving the road to Data 3.0 one index at a time</description>
        <lastBuildDate>Tue, 23 Jun 2026 07:07:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>The Indexing Company</title>
            <url>https://storage.googleapis.com/papyrus_images/f2b1b287630950c5e1ec77957fa857737aaa3a33ca4d1cc40a5720be534bb807.png</url>
            <link>https://paragraph.com/@indexingco</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Farcaster Data]]></title>
            <link>https://paragraph.com/@indexingco/farcaster-data</link>
            <guid>vozl8F4TMofI6nHjOFSP</guid>
            <pubDate>Fri, 23 Feb 2024 16:21:54 GMT</pubDate>
            <description><![CDATA[Farcaster, a Web3 social protocol, has seen a surge in user engagement since launching Frames. From 3,000 daily users in late January to nearly 370k users today, with daily "casts" jumping from 200,000 to 2.9 million. This impressive growth offers valuable insights into where social media is going. Farcaster&apos;s architecture is a blend of on-chain and off-chain systems, which includes registry contracts deployed on the Ethereum network via Optimism. Messages are cast to a network of server...]]></description>
            <content:encoded><![CDATA[<p>Farcaster, a Web3 social protocol, has seen a surge in user engagement since launching Frames. From 3,000 daily users in late January to nearly 370k users today, with daily &quot;casts&quot; jumping from 200,000 to 2.9 million. This impressive growth offers valuable insights into where social media is going.</p><p>Farcaster&apos;s architecture is a blend of on-chain and off-chain systems, which includes registry contracts deployed on the Ethereum network via Optimism. Messages are cast to a network of servers called &apos;Hubs&apos;, ensuring the reliability of user data. This hybrid architecture is spurring some innovative ideas like Frames. Frames allow developers to embed interactive experiences within Farcaster posts, known as Casts. There are <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://topframes.xyz/">fun and different</a> frames being created, including one for Girl Scout cookies. This allows you to shop within the Frame and then checkout via Coinbase without ever leaving Warpcast.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/runninyeti.eth/0xefcbfecd">Of course we had to create our own frame : )</a></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fc10e88be45e29f7a84889830c1e82ac6f43c7280f2f3ca066c0d1ba80ef883f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We’re committed to the Farcaster ecosystem and are excited about its potential. We integrated Farcaster into our indexing pipelines, positioning it alongside prominent chains like Base, Syndicate, and Solana. We&apos;re proud to offer this dataset entirely free as a public good, fueled by our passion for easy and open access to data.</p><p>Our approach with this dataset has been to take a semi-opinionated stance on normalizing hub events into views that more easily work for products and analytics (e.g. &quot;user_data&quot; from Hubs maps to &quot;profiles&quot; in BigQuery).</p><p>To start, we have 5 tables available: casts, links, reactions, verifications, and profiles.</p><blockquote><h3 id="h-looking-where-to-start-try-seeing-who-the-most-active-reply-guys-are" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Looking where to start? Try seeing who the most <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://console.cloud.google.com/bigquery?sq=867429816176:87fef9a0cc334c199363075701d50e74">active reply guys are</a>.</h3></blockquote><p>Currently, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://console.cloud.google.com/bigquery?project=glossy-odyssey-366820&amp;ws=!1m4!1m3!3m2!1sglossy-odyssey-366820!2sfarcaster">BigQuery</a> is updated every hour with the latest snapshot of data. Depending on feedback, we&apos;ll likely try to make this truly real-time using some materialized views.</p><p>A huge shout out and thanks to @pinatacloud for their public hub support!</p><p>Looking where to start? Try seeing who the most <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://console.cloud.google.com/bigquery?sq=867429816176:87fef9a0cc334c199363075701d50e74">active reply guys are</a>.</p><p>If you have questions or other data needs, contact us!</p><p>Warpcast: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/indexing">Indexing Co</a> - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/runninyeti.eth">Brock</a> - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/stephenking">Stephen</a></p><p>Email: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto:hello@indexing.co">hello@indexing.co</a></p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/e793cfacbbf7bdb9aa65d28e3f05ea4babfc006c77b9cfe49a910377150f01f8.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Mint to the Future]]></title>
            <link>https://paragraph.com/@indexingco/mint-to-the-future</link>
            <guid>mE7c6KwZVTVrTUoaAgW7</guid>
            <pubDate>Tue, 22 Aug 2023 17:54:04 GMT</pubDate>
            <description><![CDATA[Mint to the Future: Breathing New Life into NFTs https://www.flowcapacitor.xyz/ In the ever-evolving world of Web3, NFTs (Non-Fungible Tokens) have taken center stage. But as with any gold rush, there&apos;s an inevitable oversaturation. Many NFTs now sit dormant in digital wallets, their value diminished or even non-existent. This posed a question to our team: How can we breathe new life into these forgotten digital assets? Enter "Mint to the Future," a project that emerged from our desire t...]]></description>
            <content:encoded><![CDATA[<p><strong>Mint to the Future: Breathing New Life into NFTs</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.flowcapacitor.xyz/">https://www.flowcapacitor.xyz/</a></p><p>In the ever-evolving world of Web3, NFTs (Non-Fungible Tokens) have taken center stage. But as with any gold rush, there&apos;s an inevitable oversaturation. Many NFTs now sit dormant in digital wallets, their value diminished or even non-existent. This posed a question to our team: How can we breathe new life into these forgotten digital assets?</p><p>Enter &quot;Mint to the Future,&quot; a project that emerged from our desire to rejuvenate the NFT landscape and introduce users to the Flow blockchain. The concept was simple: a recycle contract that would allow users to repurpose their Ethereum-based NFTs, which had lost their value, and in return, receive brand-new, vibrant NFTs minted on the Flow blockchain.</p><p><strong>The Perfect Blend of Design and Tech</strong></p><p>Our team, a blend of design and technical expertise, was uniquely positioned to bring this vision to life. We weren&apos;t just looking to create another NFT platform; we aimed to revolutionize the user experience, making it seamless, enjoyable, and rewarding.</p><p><strong>Why Flow and Cadence?</strong></p><p>Flow, with its robust documentation and user-friendly approach, was a natural choice. We crafted a smart contract using Cadence, Flow&apos;s native programming language, ensuring a smooth and secure transition for NFTs from one blockchain to another.</p><p><strong>Sustainability</strong></p><p>Flow’s commitment to energy efficiency and sustainability is admirable. By using a proof-of-stake consensus mechanism, Flow significantly reduces its energy consumption. To put it into perspective, the network’s annual energy usage is astoundingly low at 0.18 GWh. To compare, minting an NFT on Flow requires less energy than making a simple Instagram post, making it a leader in energy efficiency, especially when juxtaposed with other blockchains. This conscious choice not only bolsters the platform&apos;s commitment to a greener environment but also empowers users and developers to make an eco-friendly choice.</p><p>In the context of “Mint to the Future,” this alignment with sustainability means that while users are rejuvenating their NFTs, they are also actively participating in a greener and more responsible digital ecosystem. The assurance that each NFT minted isn&apos;t draining vast amounts of energy or contributing significantly to carbon emissions is invaluable in today&apos;s conscientious digital age.</p><p><strong>Embracing AI, a tool that will greatly enhance web3</strong></p><p>The tech world is currently witnessing an AI explosion, but the actual value can be clouded by mainstream headlines. Headlines aside, there are practical things AI excels at, a major one being generative art. We leveraged OpenAI&apos;s DALLE via a feature that generates unique NFT images in real-time. The new image is generated by collecting keywords words from the NFT’s being recycled and combining them into a prompt that generates a new image. This not only enhances the user experience but also significantly reduces our design costs. It was a win-win!</p><p>A Glimpse into the Future</p><p>Imagine a world where your once-forgotten NFTs are given a fresh lease of life. With &quot;Mint to the Future,&quot; that&apos;s precisely what we offer. As our website aptly puts it, &quot;Help Marty McFlow move to a more decentralized, secure, and innovative future by transforming your old NFTs into something dynamic and new.&quot;</p><p>We were excited to create Flow to the Future because it shows how AI will impact the web3 ecosystem while also demonstrating new and creative user onboarding tools.</p><p>By combining strengths from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.wovn.xyz/">Wovn</a> &amp; <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://indexing.co">Indexing Co</a>, we were able to design and deploy the app in about a month. We had a great experience learning about and building in the Flow ecosystem. Overall, the Flow ecosystem was the perfect choice for Mint to the Future and we’re excited follow its continued growth &amp; success!</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/6946583e36c0e115272018c46dc5f2d3391d7a3dd73b7d329e9fe1dcf7cf7c00.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Web3 Data is NOT the Problem]]></title>
            <link>https://paragraph.com/@indexingco/web3-data-is-not-the-problem</link>
            <guid>134DfWaKQkSghXT1sktV</guid>
            <pubDate>Thu, 09 Feb 2023 18:32:54 GMT</pubDate>
            <description><![CDATA[Web3 Data is NOT the ProblemAn In-depth Look into the World of Web3 DataWelcome to the forefront of the digital revolution. In the world of web3, with its vast data, blockchain networks, protocols, and tokens, accessing and understanding information can be challenging. Developers often build custom solutions due to the lack of accessible options. This piece addresses the infrastructure problem underlying web3 data accessibility, exploring strategies for transformative success. Let&apos;s dive...]]></description>
            <content:encoded><![CDATA[<p><strong>Web3 Data is NOT the Problem</strong></p><h2 id="h-an-in-depth-look-into-the-world-of-web3-data" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>An In-depth Look into the World of Web3 Data</strong></h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/eb2dbd50a8fb746908b5ada471b52a9260943406e71951814a5185fcc8f5ef1d.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Welcome to the forefront of the digital revolution. In the world of web3, with its vast data, blockchain networks, protocols, and tokens, accessing and understanding information can be challenging. Developers often build custom solutions due to the lack of accessible options. This piece addresses the infrastructure problem underlying web3 data accessibility, exploring strategies for transformative success. Let&apos;s dive in.</p><p><strong>The Challenges of Accessing Web3 Data</strong></p><p>The world of web3 data is vast and ever-growing, but it can be incredibly frustrating to access. With all the different blockchains, protocols, and tokens, navigating and understanding this complex data ecosystem requires an upfront investment of time, patience, and money. The data is raw, unindexed, and brutal to merge with third-party data sets. Dapp providers often find themselves building custom tools over leveraging open source and paid solutions.</p><p>The current attempts to address these issues are futile as they focus on treating the symptom instead of the disease.</p><h3 id="h-identifying-the-real-problem" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Identifying the Real Problem</strong></h3><p>The data accessibility problem in web3 is not a <em>data</em> problem, it’s an <em>infrastructure</em> problem.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/25ed297acbabc3f472fabef37a93b74e7e3224a037611b74c5ef4d6ce810086e.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Now that we’ve properly defined the problem, we can implement a strategy that leads to success.</p><p>Throughout the last two years, we used several web3 indexing products. Some, open-source, provided value in the short term. Over time the value was reversed through unannounced deprecated services and the additional resources we invested in making the product work. We later found centralized products that charge for their APIs. It was like having two versions of our town library next to each other. One makes you pay but gives you access to their card catalog. The other is free but requires more than a decade bit more time and creativity to find your book. After a few times navigating and getting comfortable in the free library, there is zero value in paying for admission next door. Like the soon-bankrupt library, companies charging for API access will soon reevaluate their business models.</p><h3 id="h-the-future-an-ecosystem-with-free-indexing-apis-and-transformers" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>The Future: An Ecosystem with Free Indexing APIs and Transformers</strong></h3><p>As we transition into an ecosystem with free indexing APIs, there is an additional hurdle that needs to be addressed. Simplifying access to indexed data is great but not useful if it&apos;s not easily configurable into different forms. Please welcome, transformers.</p><p>Transformers transform the raw, indexed data into configurable forms. The result is a composable infrastructure that any individual, company, industry, or government building in web3 can configure to their needs.</p><p>Looking at data from a single NFT project via an indexed API can give us insight into transaction data. Who is the largest holder? When did they buy? Where did they buy? Powerful, yes. However, scaling across thousands of transactions or adding web2 data into the model is hard. Transformers give builders the ability to overcome these challenges, create, and provide valuable datasets to their users.</p><h3 id="h-the-promise-of-composable-infrastructure" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>The Promise of Composable Infrastructure</strong></h3><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f524b0209a316db429b375a032768fef870f1e22d54561b0ad7f219953cd00e0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Leveraging this infrastructure, let&apos;s use the Ethereum, Tezos and Polygon NFT Indexers to get a few baseline stats on chain data. Next, we’ll configure the transformer to compare net new purchases from September 2022-December 2022 on Solona, Ethereum and Polygon using wallet addresses.</p><ol><li><p>There are over 7.5 million wallets on Ethereum that have ever owned an NFT</p></li><li><p>The average NFT price in 2022 on Ethereum was $343</p></li><li><p>There are 45,000 ERC721 and 30,000 ERC1155 NFT contracts on Ethereum.</p></li><li><p>During 2022, Tezos NFT sales (XTZ) were up 115%</p></li><li><p>NFT Market place volume peaked at 1.7 billion on Ethereum in August 2021</p></li><li><p>NFT wash trading peaked in Jan 2022 on Ethereum with 4.1 billion in wash trades versus 1.1 billion in organic trading volume.</p></li><li><p>From Sept 2022-Dec 2022, new users buying NFTs on Solona dropped 63% and 36% on Ethereum. During that same time, new users buying NFTs on Polygon grew more than 500%.</p></li><li><p>With composable infrastructure, developers reduce superfluous costs and technical debt while providing more value to their users.</p></li><li><p>To realize Web3&apos;s goal of surpassing web2, the applications must be significantly superior to their web2 counterparts. Developers require the same, if not better, tools and infrastructure as those available in web2. With seven years of experience building custom data solutions and paying for what should be free, we’ve gone all in on solving web3’s data infrastructure problem.</p></li></ol><h3 id="h-the-real-world-impact-of-configurable-data" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>The Real-World Impact of Configurable Data</strong></h3><p>Taking our understanding of configurable infrastructure a step further, we can begin to see its profound implications on real-world blockchain applications. Consider, for example, the way in which DeFi applications can leverage this technology to provide their users with highly personalized and detailed financial metrics. In fact, a study from the<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.jbs.cam.ac.uk/faculty-research/centres/alternative-finance/publications/2nd-global-enterprise-blockchain-benchmarking-study/"> University of Cambridge</a> highlights how adopting a more configurable data approach can lead to enhanced user experiences and improved decision-making capabilities in financial markets.</p><h3 id="h-looking-ahead-the-future-of-web3-data-infrastructure" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Looking Ahead: The Future of Web3 Data Infrastructure</strong></h3><p>Moving forward, we must remember that the full potential of web3 data will only be unlocked when we prioritize building and maintaining a robust, scalable, and flexible data infrastructure. This sentiment is echoed in a recent report by Deloitte, which emphasizes the crucial role of a strong data infrastructure in harnessing the transformative power of blockchain technology. By fostering an ecosystem of free and efficient indexing APIs, we are setting the stage for digital transformation and a future where web3 data is not only more accessible but also more impactful.</p><h3 id="h-the-best-web3-indexing-tools-for-strategic-advantage" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>The Best Web3 Indexing Tools for Strategic Advantage</strong></h3><p>In today&apos;s increasingly decentralized digital landscape, effective web3 indexing tools can provide a strategic edge. These web 3 indexing tools not only provide access to vast amounts of blockchain data, but they also simplify the process of filtering and interpreting this data. Here, we highlight some of the top indexing tools designed to navigate the web3 data universe effectively:</p><h4 id="h-the-graph" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thegraph.com/"><strong>The Graph</strong></a></h4><p>The Graph is a powerful protocol that revolutionizes blockchain by enabling easy access to data through a network of open APIs called subgraphs.</p><h4 id="h-covalent" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.covalenthq.com/"><strong>Covalent</strong></a></h4><p>Covalent is a unified API that offers visibility into vast amounts of blockchain data, providing comprehensive insights for web3 strategies the blockchain network.</p><h4 id="h-nansen" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.nansen.ai/"><strong>Nansen</strong></a></h4><p>Nansen offers blockchain analytics for Ethereum-based finance protocols, providing insights into DeFi, NFTs, and more. Their sophisticated tools simplify navigation, understanding, and decision-making based on blockchain data.</p><h4 id="h-quicknode" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.quicknode.com/"><strong>QuickNode</strong></a></h4><p>QuickNode is an exceptional web3 indexing tool that enhances blockchain development efficiency. It offers reliable, fast, and scalable access to indexes, to Ethereum, Bitcoin, and other blockchain networks. With QuickNode, there&apos;s no need to run your own nodes, eliminating operational hassle and overhead.</p><p>Embracing these innovative web3 indexing tools can help stakeholders derive meaningful insights from blockchain data in real time, fueling informed strategies and decisions in the web3 ecosystem.</p><h3 id="h-overcoming-challenges-in-web3-data-indexing" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Overcoming Challenges in Web3 Data Indexing</strong></h3><p>Despite the significant advantages of web3 indexing tools, it&apos;s important to acknowledge the challenges that remain. One key hurdle is the sheer volume of blockchain data. As blockchains grow and proliferate, storing, indexing, and querying this data become increasingly resource-intensive. As a result, developing scalable solutions multiple blockchains remains a top priority.</p><p>Moreover, issues of data privacy and security in the distributed ledger and web3 space pose significant concerns. Public blockchains are inherently transparent, which may lead to unwanted disclosures of sensitive information. Ensuring the privacy-preserving computation and storage of blockchain data is thus a crucial area of ongoing research and development.</p><h2 id="h-final-thoughts" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Final thoughts</strong></h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0a601329f4b9a04a225b7693b9ab3b073db9833501201eada0dd0ddaaa78b030.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>In conclusion, the world of web3 data presents immense opportunities and challenges. While accessing and understanding this vast and complex web of data landscape may seem daunting, solutions offered by indexing companies like &quot;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.indexing.co/">The Indexing Company</a>&quot; provide a way forward. By simplifying complex data systems and offering tailored indexing tools, businesses can harness the power of web3 data for strategic advantage.</p><p>&quot;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.indexing.co/">The Indexing Company</a>&quot; stands out as a leading provider in this space, offering innovative solutions that enable faster build times, cost savings, and streamlined side chain workflows. Their expertise in web3 data indexing empowers businesses to navigate the intricacies of blockchain networks, protocols, and tokens with ease, unlocking valuable insights and informed decision-making.</p><p>For businesses seeking to stay at the forefront of the digital revolution, embracing the capabilities and technologies of &quot;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.indexing.co/">The Indexing Company</a>&quot; is a call to action. By partnering with them, businesses can simplify their data systems, gain a competitive edge, and unleash the transformative potential of web3 data. Don&apos;t miss out on the opportunity to revolutionize your data strategy and drive success in the evolving landscape of web3. Contact &quot;The Indexing Company&quot; today to embark on this journey towards streamlined and impactful web3 data utilization.</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/1686b2033188103504e8fe639c039a3c4980ac0c80566d0cb8aec6b461c467e4.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Indexing Chainlink's Price Oracles]]></title>
            <link>https://paragraph.com/@indexingco/indexing-chainlink-s-price-oracles</link>
            <guid>4zpGpgRysGy4py1cRl60</guid>
            <pubDate>Mon, 30 Jan 2023 21:18:24 GMT</pubDate>
            <description><![CDATA[Introduction to Chainlink and Its SignificanceChainlink is one of the most ambitious projects in web3, providing everything from price oracles to external API adapters. With the ability for anyone to easily connect to any web or off-chain API and use it as an input or output for smart contracts on the blockchain, Chainlink has become a go-to for many organizations in the crypto industry. At the Indexing Company, we love Chainlink and indexing systems, so we decided to index their price oracle...]]></description>
            <content:encoded><![CDATA[<h2 id="h-introduction-to-chainlink-and-its-significance" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Introduction to Chainlink and Its Significance</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c1d4c6581e3f7dd63a1a46d531ea59a9a24c80f0197bf6a275d2061033219df9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Chainlink is one of the most ambitious projects in web3, providing everything from price oracles to external API adapters. With the ability for anyone to easily connect to any web or off-chain API and use it as an input or output for smart contracts on the blockchain, Chainlink has become a go-to for many organizations in the crypto industry.</p><p>At the Indexing Company, we love Chainlink and indexing systems, so we decided to index their price oracles and run them through our transformation engine.</p><h2 id="h-understanding-chainlinks-price-oracles" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Understanding Chainlink&apos;s Price Oracles</h2><p>First, let&apos;s cover the basics. What are Chainlink&apos;s price oracles, and why are they important for the crypto industry?</p><p>In the simplest terms, a price oracle is a source that provides up-to-date, real-time pricing data to software running smart contracts on a blockchain network. It can be compared to stock exchange tickers of companies in the past that supplied real-time pricing data to people. Without accurate and reliable sources for crypto prices, smart contract software would not be able to execute correctly.</p><p>Chainlink&apos;s price oracles offer a reliable alternative to traditional methods of data collection and market assessment. The decentralized, secure protocol provides access to a range of leading sources that can be used to make informed price predictions. Prices are managed via an open-source aggregation algorithm, which minimizes the risk of falsified or inaccurate results.</p><p>This is extremely beneficial compared to other price oracle solutions on the market, as it ultimately reduces the need for manual response checks and lowers financial exposure in potential errors. Chainlink&apos;s security data privacy and compliance measures also maintain top-level protection against external threats such as hacking and performance issues, giving users confidence in their pricing decisions.</p><h2 id="h-the-technology-behind-chainlinks-price-oracles" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Technology Behind Chainlink&apos;s Price Oracles</h2><p>Chainlink&apos;s Price Oracles aren&apos;t just a manifestation of advanced technology, they also embody a system of record that&apos;s been painstakingly curated for its reliability and seamless functionality. By engineering this intricate system, Chainlink ensures that the transaction data it sources maintains a high level of accuracy. The superior infrastructure underpinning Chainlink&apos;s Price Oracles plays a pivotal role in their operation, making them an invaluable asset within the broader cryptocurrency ecosystem.</p><h2 id="h-chainlinks-decentralized-data-aggregation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Chainlink&apos;s Decentralized Data Aggregation</h2><p>Chainlink has harnessed the power of decentralized data aggregation to fortify the reliability of its price oracles. This method dramatically enhances data accuracy and reliability, providing an unimpeachable source of information for users. The decentralized nature of blockchain data aggregation serves as a buffer against data manipulation, further strengthening the credibility of the data Chainlink oracles deliver.</p><h2 id="h-chainlinks-oracle-reputation-system" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Chainlink&apos;s Oracle Reputation System</h2><p>To ensure the consistent performance of its network, Chainlink has implemented an Oracle Reputation System. This system objectively evaluates the performance of various oracles, assigning ratings based on reliability and accuracy. These ratings offer valuable insights into the quality of data each oracle provides and directly contribute to the overall performance and credibility of Chainlink&apos;s network.</p><h2 id="h-data-quality-and-chainlink" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Data Quality and Chainlink</h2><p>In the realm of operations of price oracles, data quality is non-negotiable. Chainlink has established stringent protocols to guarantee high-quality data from its price oracles. By placing an unwavering emphasis and focus on data quality, Chainlink sets a high standard for the reliability and usability of the data it provides.</p><h2 id="h-understanding-price-oracle-attacks" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Understanding Price Oracle Attacks</h2><p>The cryptosphere is not immune to security concerns and challenges, and price oracle attacks are one such issue that warrants attention. These attacks can have significant implications for the integrity of a blockchain network, reinforcing the importance of Chainlink&apos;s commitment to security and robust design. By understanding these attacks, we can better appreciate the safeguards Chainlink has in place to prevent such vulnerabilities.</p><h2 id="h-chainlinks-role-in-the-defi-ecosystem" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Chainlink&apos;s Role in the DeFi Ecosystem</h2><p>Chainlink&apos;s price oracles have carved out a pivotal role in the burgeoning DeFi ecosystem. As a key player in the DeFi landscape, Chainlink has made significant strides in enhancing the reliability and accessibility of decentralized financial services. Its influence and importance in shaping the DeFi market are unequivocal, marking it as a game-changer in the world of decentralized finance.</p><h2 id="h-the-process-and-advantages-of-indexing-chainlinks-price-oracles" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Process and Advantages of Indexing Chainlink&apos;s Price Oracles</h2><p>So, why index Chainlink&apos;s price oracles?</p><p>By indexing Chainlink&apos;s price oracles, we can configure the Indexing Company&apos;s transformation engine to generate some interesting data points.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/03f75847433f6ef5b6e01a9906d1152d750f7d5d02cf70daa29c4423cf287b27.png" alt="Litecoin" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Litecoin</figcaption></figure><p>First, we indexed the feeds and merged labels (e.g. ETH/USD) to compare and contrast price data. Next, using real time data we ran different transformations to get things like spot, 1-day, 7-day, 15-day, and 30-day moving averages. Lastly, to visualize the above data points, we exposed an API via GraphQL and routed it into ReTool.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://indexingco.retool.com/embedded/public/49529312-e961-455a-8e76-a298e730b8c0">https://indexingco.retool.com/embedded/public/49529312-e961-455a-8e76-a298e730b8c0</a></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/465c23a990f14ae5d986e56220ba833c1f827ccbfb6a6e56adb970b3812c1338.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8f70b471687c17ded0b4df945db438f5b21d64d78a95e932e6195573fa30c273.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-testing-and-comparing-with-traditional-exchange" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Testing and Comparing with Traditional Exchange</h2><p>Test it yourself!</p><p>You might ask yourself, &quot;I can already get this data on Coinbase. What&apos;s the big deal?&quot;</p><p>The difference is in how the data is obtained and disseminated. for example, Exchanges like Coinbase get crypto prices by matching buyers and sellers in transactions on their platform, and the prices on the exchange reflect the supply and demand of the crypto assets being traded on that particular platform. The prices of crypto assets on different exchanges can vary due to differences in trading volume, order book depth, and other factors.</p><p>Chainlink price oracles, on the other hand, obtain crypto prices from multiple, decentralized data sources, such as other decentralized exchanges (DEXs), off-chain data aggregators, and oracles. The Chainlink network is decentralized, meaning that it is a distributed ledger not controlled by any single entity or organization, making it resistant to manipulation and tampering. The Chainlink network uses a consensus mechanism to ensure that the data provided by the oracles is accurate, and it uses smart contracts to ensure that the data is tamper-proof.</p><p>If the goal of web3 is decentralization, using tools like Chainlink&apos;s price oracles is pivotal.</p><h2 id="h-upcoming-advancements-and-opportunities-in-blockchain-data-indexing" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Upcoming Advancements and Opportunities in Blockchain Data Indexing</h2><p>We&apos;re finishing documentation this week then we&apos;ll make the current version of the API publicly available to developers (for free!)</p><p>The above exercise, in addition to whatsmynameagain.xyz and mirrormirror.page, are examples of what can be created with The Indexing Company&apos;s technology. Our mission is to provide the infrastructure so you can become the data company or surface to your business, partners and end users.</p><p>Email us today at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto:hello@indexing.co">hello@indexing.co</a>, and we&apos;ll get you set up with your own configurable indexers and transformations to create fun tools like this.</p><p>Final Thoughts</p><p>The indexing Chainlink&apos;s price oracles facilitates digital transformation by leveraging advanced technologies like artificial intelligence and multiple blockchains. This process generates valuable data points, enabling informed decision-making and enhancing the reliability of blockchain data. By utilizing decentralized data aggregation, Chainlink&apos;s price oracles play a crucial role in the decentralized finance (DeFi) ecosystem, providing reliable and accessible pricing information. This advancement opens new opportunities and drives innovation in the evolving landscape of DeFi and beyond.</p><p>At The Indexing Company, we&apos;re excited to contribute to this journey by offering our indexing technology to enterprises around the world. As we look forward to what&apos;s next, we&apos;re not just observers; more than a decade in we&apos;re active participants shaping the future of data in a decentralized world. Join us on this journey - the future of data awaits you.</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/efa398c19c3db381dd17dbfb8bc790e2c70c04c19872fac1dfcff14b7204574c.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Introducing: The ENS Profile API]]></title>
            <link>https://paragraph.com/@indexingco/introducing-the-ens-profile-api</link>
            <guid>kPEzpNMWSP5PjOoZxjn1</guid>
            <pubDate>Wed, 28 Dec 2022 19:57:37 GMT</pubDate>
            <description><![CDATA[Here at Indexing Co we’ve been spending the holiday season onboarding our first customers and getting our infrastructure into production 🎉 And as a holiday gift for web3 builders, we’re releasing our ENS Profile API to the public. No sign up required, no tracking, and completely free. Seriously!This is the same API that powers our ENS Profile search tool, What’s my name again, and is backed by our real-time indexing engine. You can access it via GraphQL at https://query.indexing.co/graphql w...]]></description>
            <content:encoded><![CDATA[<p>Here at Indexing Co we’ve been spending the holiday season onboarding our first customers and getting our infrastructure into production 🎉 And as a holiday gift for web3 builders, we’re releasing our ENS Profile API to the public. No sign up required, no tracking, and completely free. Seriously!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/736155cec2abbbf46e8ced0710e259353fdb1fb9ba80f3941aebf662978bafb1.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>This is the same API that powers our ENS Profile search tool, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz">What’s my name again</a>, and is backed by our real-time indexing engine. You can access it via GraphQL at <code>https://query.indexing.co/graphql</code> with the following schema:</p><pre data-type="codeBlock" text="type ENSProfileAddresses {
  address: String
  coinType: Int
}

type ENSProfileAttributes {
  textKey: String
  textValue: String
}

type ENSProfile {
  addresses: [ENSProfileAddresses!]
  attributes: [ENSProfileAttributes!]
  contenthash: String
  name: String
  node: String
  owner: String
  tokenId: String
}

input ENSProfileFilter {
  name: String
  node: String
  owner: String
  textValue: String
  tokenId: String
}

type Query {
  ensProfiles(filters: ENSProfileFilter): [ENSProfile!]!
}
"><code><span class="hljs-string">type</span> <span class="hljs-string">ENSProfileAddresses</span> {
  <span class="hljs-attr">address:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">coinType:</span> <span class="hljs-string">Int</span>
}

<span class="hljs-string">type</span> <span class="hljs-string">ENSProfileAttributes</span> {
  <span class="hljs-attr">textKey:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">textValue:</span> <span class="hljs-string">String</span>
}

<span class="hljs-string">type</span> <span class="hljs-string">ENSProfile</span> {
  <span class="hljs-attr">addresses:</span> [<span class="hljs-string">ENSProfileAddresses!</span>]
  <span class="hljs-attr">attributes:</span> [<span class="hljs-string">ENSProfileAttributes!</span>]
  <span class="hljs-attr">contenthash:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">node:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">owner:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">tokenId:</span> <span class="hljs-string">String</span>
}

<span class="hljs-string">input</span> <span class="hljs-string">ENSProfileFilter</span> {
  <span class="hljs-attr">name:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">node:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">owner:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">textValue:</span> <span class="hljs-string">String</span>
  <span class="hljs-attr">tokenId:</span> <span class="hljs-string">String</span>
}

<span class="hljs-string">type</span> <span class="hljs-string">Query</span> {
  <span class="hljs-string">ensProfiles(filters:</span> <span class="hljs-string">ENSProfileFilter):</span> [<span class="hljs-string">ENSProfile!</span>]<span class="hljs-string">!</span>
}
</code></pre><p>For example, to grab the current profile for <code>vitalik.eth</code> you could simply do:</p><pre data-type="codeBlock" text="query {
  ensProfiles(
    filters: {
      name: &quot;vitalik.eth&quot;
    }
  ) {
    addresses {
      address
      coinType
    }
    attributes {
      textKey
      textValue
    }
    contenthash
    name
    owner
  }
}
"><code>query {
  ensProfiles(
    filters: {
      name: <span class="hljs-string">"vitalik.eth"</span>
    }
  ) {
    addresses {
      <span class="hljs-selector-tag">address</span>
      coinType
    }
    attributes {
      textKey
      textValue
    }
    contenthash
    name
    owner
  }
}
</code></pre><p>Which would return:</p><pre data-type="codeBlock" text="{
  &quot;data&quot;: {
    &quot;ensProfiles&quot;: [
      {
        &quot;addresses&quot;: [
          {
            &quot;address&quot;: &quot;0xd8da6bf26964af9d7eed9e03e53415d37aa96045&quot;,
            &quot;coinType&quot;: 60
          }
        ],
        &quot;attributes&quot;: [
          {
            &quot;textKey&quot;: &quot;avatar&quot;,
            &quot;textValue&quot;: &quot;eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063&quot;
          },
          {
            &quot;textKey&quot;: &quot;url&quot;,
            &quot;textValue&quot;: &quot;https://vitalik.ca&quot;
          }
        ],
        &quot;contenthash&quot;: &quot;0xe3010170122081e99109634060bae2c1e3f359cda33b2232152b0e010baf6f592a39ca228850&quot;,
        &quot;name&quot;: &quot;vitalik.eth&quot;,
        &quot;owner&quot;: &quot;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&quot;
      }
    ]
  }
}
"><code>{
  "data": {
    "ensProfiles": [
      {
        "addresses": [
          {
            "<span class="hljs-selector-tag">address</span>": <span class="hljs-string">"0xd8da6bf26964af9d7eed9e03e53415d37aa96045"</span>,
            <span class="hljs-string">"coinType"</span>: <span class="hljs-number">60</span>
          }
        ],
        "attributes": [
          {
            "textKey": <span class="hljs-string">"avatar"</span>,
            <span class="hljs-string">"textValue"</span>: <span class="hljs-string">"eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063"</span>
          },
          {
            "textKey": <span class="hljs-string">"url"</span>,
            <span class="hljs-string">"textValue"</span>: <span class="hljs-string">"https://vitalik.ca"</span>
          }
        ],
        "contenthash": <span class="hljs-string">"0xe3010170122081e99109634060bae2c1e3f359cda33b2232152b0e010baf6f592a39ca228850"</span>,
        <span class="hljs-string">"name"</span>: <span class="hljs-string">"vitalik.eth"</span>,
        <span class="hljs-string">"owner"</span>: <span class="hljs-string">"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"</span>
      }
    ]
  }
}
</code></pre><hr><p>Give it a try and let us know how it goes! And if you find yourself needing anything extra / different, don’t hesitate to reach out - we’re always looking for ways to improve our offerings and empower the builders in web3.</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[Introducing: Mirror Mirror]]></title>
            <link>https://paragraph.com/@indexingco/introducing-mirror-mirror</link>
            <guid>fjIHsPnElV454uLgEkYq</guid>
            <pubDate>Mon, 07 Nov 2022 22:23:37 GMT</pubDate>
            <description><![CDATA[Hot of the presses - we’re happy to present the latest free service from The Indexing Company, Mirror Mirror 🎊searching the important topics of todayIn short, this is a search engine for Mirror.xyz. For those that don’t know, Mirror is a web3 publishing platform akin to Medium in the web2 world. Unlike Medium though, Mirror is merely an interface to help writers put their content out into Data 3.0. That is, everything written on Mirror is ultimately stored on Arweave. (For those curious, we ...]]></description>
            <content:encoded><![CDATA[<p>Hot of the presses - we’re happy to present the latest free service from The Indexing Company, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.mirrormirror.page/">Mirror Mirror</a> 🎊</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/cc16d6557df3d18d33e30307d4dff81942430085884f68be48453d8274bfec3c.png" alt="searching the important topics of today" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">searching the important topics of today</figcaption></figure><p>In short, this is a search engine for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/">Mirror.xyz</a>. For those that don’t know, Mirror is a web3 publishing platform akin to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/">Medium</a> in the web2 world. Unlike Medium though, Mirror is merely an interface to help writers put their content out into Data 3.0. That is, everything written on Mirror is ultimately stored on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.arweave.org/">Arweave</a>.</p><p><em>(For those curious, we spoke in more depth on Data 3.0 storage options like Arweave </em><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blog.indexing.co/posts/FDyv8i8c15ATs_KIpAtEdeMP20WZ00FfssPYOj3EZRY"><em>here</em></a><em>)</em></p><p>This intentional decentralization of data has important implications:</p><ol><li><p>Writers <em>own</em> their own data - only they can add, modify, and sign their data</p></li><li><p>Mirror does <em>not</em> control the data - theoretically someone else could come along and build a competitor to Mirror, leveraging the exact same underlying data source</p></li><li><p>All of the posts from Mirror are publicly available, forever thanks to Arweave</p></li></ol><p>And we at Indexing Co have been able to leverage the 3rd point there to successfully index every Mirror post written - i.e. creating a “mirror” of Mirror if you will 😎 And now that we’ve got a running index of posts (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blog.indexing.co/posts/FDyv8i8c15ATs_KIpAtEdeMP20WZ00FfssPYOj3EZRY">here’s the skinny on how that’s done</a>), we can expose them via an API and ultimately create the simple UI that you see today.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.mirrormirror.page/">https://www.mirrormirror.page/</a></p><p>Let us know what you think!</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[Introducing: What's My Name Again?]]></title>
            <link>https://paragraph.com/@indexingco/introducing-what-s-my-name-again</link>
            <guid>3stOthi6fMQVaLvYVdHo</guid>
            <pubDate>Wed, 26 Oct 2022 12:45:28 GMT</pubDate>
            <description><![CDATA[We’ve talked previously about Ethereum Name Service and how to get started with your own ENS name (original post here). In that post we touched very briefly on the concept of text records and being able to tie information beyond a wallet address to your ENS name. By adding data points like email addresses, avatars, Twitter addresses, etc to an ENS name, we can effectively start crafting what we’ll call an “ENS Profile”. Because these profiles are stored on-chain, they’re publicly accessible y...]]></description>
            <content:encoded><![CDATA[<p>We’ve talked previously about Ethereum Name Service and how to get started with your own ENS name (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.indexing.co/posts/xvOvaPAEADQ_oW2y80DbNhSW-sBC9zKiOSbm8-wjhBg">original post here</a>). In that post we touched very briefly on the concept of <em>text records</em> and being able to tie information beyond a wallet address to your ENS name. By adding data points like email addresses, avatars, Twitter addresses, etc to an ENS name, we can effectively start crafting what we’ll call an “ENS Profile”.</p><p>Because these profiles are stored on-chain, they’re publicly accessible yet fully controlled by <strong>you</strong>, the owner. We could compare this to Facebook or Twitter profiles, but without the ads, centralized control, and authentication requirements that these platforms require in service of their bottom line. In short, the potential power of ENS Profiles is enormous.</p><p>One thing that’s been missing though is the ability to <em>search</em> these profiles. Sure, tools like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ens.domains/">ens.domains</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ens.vision/">ens.vision</a> exist, but these are focused on managing and purchasing ENS names, respectively. Neither service is intended to help ENS users communicate with one another or use the power of a “profile”.</p><p>Meanwhile, we’ve been working hard at The Indexing Company to build out our Indexing as a Service infrastructure. Recognizing the recent adoption of ENS and being long-time supporters ourselves, we decided to tune our indexing service towards ENS. As a result, we’re happy to introduce <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz/">What’s My Name Again?</a> 🎉</p><p>This is a freely available service to search both ENS names <em>and</em> entire ENS Profiles. Some examples:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz/#nick*.eth">Wildcard name matches like nick*.eth</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz/#hello@indexing.co">ENS name by email</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz/#*mirror.xyz*">ENS names with Mirror.xyz links</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz/#*contact%20us*">Who wants to be contacted?</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.whatsmynameagain.xyz/#coffee">Anyone putting &quot;coffee&quot; on-chain</a></p></li></ul><p>(hint: searches <em>not</em> starting with a wildcard, <code>*</code>, are much faster!)</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ac13a7a0c5b9326f00fa673bdecc4479dae1033b3aaf3bbac72d806cb6aab602.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Give it a whirl and let us know what you think!</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[Devcon VI and the State of EVM Data]]></title>
            <link>https://paragraph.com/@indexingco/devcon-vi-and-the-state-of-evm-data</link>
            <guid>khZhNc1zTBYwSfNaCFBj</guid>
            <pubDate>Fri, 21 Oct 2022 01:39:10 GMT</pubDate>
            <description><![CDATA[By all measures, Devcon VI was a huge success. Over 6000 participants from around the world met in Bogota, Colombia to build, network, and celebrate together in the official Ethereum conference. This is coming about a month after The Merge in which Ethereum switched from Proof of Work (PoW) to Proof of Stake (PoS). That transition worked far better than any could have hoped and has lead to ETH even being deflationary at times 🔥https://ultrasound.money/So what’s next for Ethereum and its ecos...]]></description>
            <content:encoded><![CDATA[<p>By all measures, Devcon VI was a huge success. Over 6000 participants from around the world met in Bogota, Colombia to build, network, and celebrate together in <em>the</em> official Ethereum conference.</p><p>This is coming about a month after The Merge in which Ethereum switched from Proof of Work (PoW) to Proof of Stake (PoS). That transition worked far better than any could have hoped and has lead to ETH even being deflationary at times 🔥</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2ceada71df6ae9d339b4e59a8113db1dce4cc676004636db595fb9cfec3d4c0c.png" alt="https://ultrasound.money/" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">https://ultrasound.money/</figcaption></figure><p>So what’s next for Ethereum and its ecosystem? In short, far too much is happening to cover in a single post, but we’re going to touch on “the state of data”.</p><h2 id="h-today" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Today</h2><p>Let’s take a step back and remember how we got to today. Ethereum launched in 2015 with a vision of being the world’s computer. At its core, Ethereum processes transactions in its Ethereum Virtual Machine (EVM) and reaches consensus with its nodes (network of servers). In order to do this, each node in the ecosystem must keep track of a history of <em>all</em> blocks and transactions that have ever existed.</p><p>Fast forward to today, there are well over 15 million blocks and over 1 billion transactions on the Ethereum mainnet. And these numbers don’t even reflect the growing ecosystem of secondary blockchains on and around Ethereum such as Polygon, Optimism, Arbitrum, Starknet, etc. Point being, there’s a lot of data out there and it’s only continuing to grow.</p><p>In order for Ethereum, and its ecosystem, to truly reach “internet scale”, we need to drastically increase adoption. That adoption, though, inevitably comes with a sharp increase in data and we need to be ready for this.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9fefbd3f62a5b852449a83de7f98b604a925dd90237db65c80da67cadadbc439.png" alt="https://a16zcrypto.com/state-of-crypto-report-a16z-2022/" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">https://a16zcrypto.com/state-of-crypto-report-a16z-2022/</figcaption></figure><h3 id="h-todays-problems" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Today’s Problems</h3><p>Focusing primarily on solving for adoption, some of the common themes in Ethereum today are:</p><ol><li><p>Too few transactions per second - not enough support for simultaneous users</p></li><li><p>Too few [independent] node operators - not enough decentralization</p></li><li><p>On-chain storage is expensive - and standards are missing for off-chain</p></li></ol><h2 id="h-looking-forward" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Looking Forward</h2><p>Thankfully, the sharp minds of the industry have already been working on solutions; many of which should be rolling out in the coming months and years. Let’s dig into a few of these Ethereum Improvement Proposals (EIPs):</p><p><strong>EIP-4488: Working on Throughput</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-4488">https://eips.ethereum.org/EIPS/eip-4488</a></p><p>The leading way to increase throughput on Ethereum is simply to move transactions <em>off</em> of Ethereum. This may sound counter-intuitive, but bear with me.</p><p>Layer 2’s such as Optimism and Arbitrum offer developers and consumers lower gas fees, fast transaction times, and the full security of the Ethereum blockchain itself. How? By allowing transactions to use their own set of nodes, entirely independent of Ethereum, and then adding <em>proof</em> of those transactions to the Ethereum. Effectively, Layer 2’s keep their data self-contained except for the proof that something has happened (this is all a rough approximation, but close enough for our purposes here).</p><p>Circling back to EIP-4488, these Layer 2s frequently leverage what’s known as <code>calldata</code> to batch add these proofs to Ethereum. <code>calldata</code> is a specific type of data in the EVM that’s particularly cheap. That being said, if we’re hoping to reach internet scale, paying <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&amp;refresh=5m&amp;from=now-90d&amp;to=now">$0.30+</a> for something as simple as transferring ETH is still too much. EIP-4488 introduces an explicitly lower cost for <code>calldata</code> on Ethereum, which will decrease the cost of Layer 2s, and ultimately save users money.</p><p><strong>EIP-4444: Everyone Gets a Node</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-4444">https://eips.ethereum.org/EIPS/eip-4444</a></p><p>The biggest problem with running your own Ethereum node at home generally isn’t the technical complexity involved. The terminal commands are simple and there are even products like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.dappnode.io/en-us">Dappnode</a> offer plug’n’play ease. What gets tricky to solve for though is the sheer amount of storage costs you need to run a node. Each node must remember the entire history of the Ethereum blockchain. The storage requirements for that currently sit at ~1 TB and are closer to 6 TBs if you want to run what’s known as an “archive” node. And with proposals like EIP-4488 above, the size requirements are likely to increase even quicker (up to 3 TB <em>per year</em> in the extreme case).</p><p>EIP-4444 aims to address this by introducing a prune limit on historical data. Ethereum nodes would no longer have to remember the <em>entire</em> history of the blockchain. Instead, they can keep only the last year of data. This makes running Ethereum nodes at home considerably less resource intensive. And, importantly, more nodes directly translates into better decentralization for Ethereum as a whole.</p><p>If you’re like us, you’re probably wondering where all that old data is going to be stored? That is a fantastic question without an answer unfortunately. There seems to be consensus around some ideas though:</p><ul><li><p>Have a separate “historical” node that people can choose to run</p></li><li><p>Introduce a P2P protocol for downloading past data (remember the BitTorrent days?)</p></li><li><p>Rely on centralized authorities to remember all past data - and make it available to the rest of us (likely for a fee…)</p></li></ul><p>In any case, more nodes and more decentralization is a net positive for the ecosystem. With time we’ll find an appropriate solution to accessing historical data.</p><p><strong>EIP-3668: Accessing Off-Chain Data</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-3668">https://eips.ethereum.org/EIPS/eip-3668</a></p><p>Spearheaded by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ens.domains/">ENS</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chain.link/">Chainlink</a>, EIP-3668 introduces a standard for Ethereum developers to securely incorporate off-chain data into the ecosystem. This is a potentially <em>huge</em> win for everyone. Ethereum is meant to the world’s computer and it makes sense that we’d want the ability to “plug-in” an external hard-drive to that. This is roughly what the Cross-Chain Interoperability Protocol (CCIP) introduces.</p><p>CCIP works by allowing a smart contract to say “I don’t have the data, but I can verify it from Source X”. A client (e.g. browser) asking that contract for data can then reach out to Source X, receive raw data, and offer it back to the contract to verify. In this way, the data is <em>safe</em> to use (because it’s validated by the contract), but also cheap to store + access because it’s <em>not</em> stored on-chain. Even better, Source X could be anything - another blockchain, an API gateway, etc - CCIP simply provides us with a standard way of implementing this sort of off-Ethereum communication.</p><p>Early concepts around CCIP are promising. Chainlink and SWIFT <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlinktoday.com/chainlink-and-swift-announce-ccip-proof-of-concept-at-smartcon-2022/">are partnering</a> on a way to bridge the web2 banking world with web3. ENS is expanding beyond primarily <code>.eth</code> to support any domain, on any chain; <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.coinbase.com/en/wallet/managing-account/coinbase-ens-support">Coinbase has already implemented this</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5d87b48b5efedec30ebe3a19c3a095d45ecc81b02f5a8a3194c97fe7e1dd6aa3.jpg" alt="Devcon IV" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Devcon IV</figcaption></figure><p>In the end, growing pains are a great sign for the Ethereum ecosystem and the future looks bright 🌕 See you all at the next Devcon!</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[Indexing Mirror.xyz]]></title>
            <link>https://paragraph.com/@indexingco/indexing-mirror-xyz</link>
            <guid>vfxYR7SziRIsDQ5qqsOk</guid>
            <pubDate>Fri, 30 Sep 2022 22:22:34 GMT</pubDate>
            <description><![CDATA[If you read content online you’ve probably at least heard of publishing services like Medium and Substack. These are centralized, web2 companies that make money with views; subscriptions, ads, etc. Thankfully, as we transition into the web3 space we are already seeing some promising alternatives. The largest of these web3 publishers is Mirror. The beauty of protocols like Mirror is that they don’t own any of the data. They still have a login, a clean text editor, and shareable links just like...]]></description>
            <content:encoded><![CDATA[<p>If you read content online you’ve probably at least heard of publishing services like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/">Medium</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://substack.com/">Substack</a>. These are centralized, web2 companies that make money with views; subscriptions, ads, etc. Thankfully, as we transition into the web3 space we are already seeing some promising alternatives. The largest of these web3 publishers is <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/">Mirror</a>.</p><p>The beauty of protocols like Mirror is that they don’t <em>own</em> any of the data. They still have a login, a clean text editor, and shareable links just like Medium or Substack. But the content that flows through Mirror is entirely decentralized on a network they don’t control, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.arweave.org/">Arweave</a>. We’ve spoken briefly about Arweave <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/indexingco.eth/FDyv8i8c15ATs_KIpAtEdeMP20WZ00FfssPYOj3EZRY">previously</a>, but the gist is that any content stored on it is stored <em>forever</em> thanks to unique incentive models built into the network. This has two important ramifications:</p><ol><li><p>There are 0 paywalls in Mirror. You can still <em>choose</em> to support individual creators, and Mirror helps facilitate this, but it’s entirely optional.</p></li><li><p>You don’t even have to use Mirror to participate in the broader ecosystem.</p></li></ol><p>That second point is what we’re going to focus on in this post. Specifically, because the data is freely available forever, we can choose to use this data in any way we want. For instance, this very blog post is available on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/indexingco.eth/iuT8DiYiDTq5lcx1JxOgQ8g9hn9hsnRJZVynFiHzrPk">Mirror</a>, but it’s also available on our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.indexing.co/posts/iuT8DiYiDTq5lcx1JxOgQ8g9hn9hsnRJZVynFiHzrPk">company’s website</a>. Any updates to this post are instantly available on both sites because they both use the <strong>exact same data source</strong>, Arweave. Let’s unpack this a bit:</p><ol><li><p>Content is written in an editor such as Mirror</p></li><li><p>That content is added to a transaction on Arweave</p></li><li><p>A user visits a related link on <em>either</em> mirror.xyz or indexing.co</p></li><li><p>The site fetches the content from Arweave, formats it, and displays it to the end user</p></li><li><p>Content is shared from creator to reader</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1509d8551a19f9f4e72a4503c0f0a9e04b225d1988846b436855a6fffc3f0ce5.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-the-nitty-gritty" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Nitty Gritty</h2><p>Now that we have an overview of the steps required to load an individual post, let’s look at the technical details for indexing <em>all</em> of a given user’s posts from Mirror. For this, we’re going to focus on using Typescript alongside the <code>arweave</code> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.npmjs.com/package/arweave">package on npm</a>.</p><p>Mirror helps structure the content stored on Arweave with what are known as <code>tags</code>. These are pretty much what you might expect: key &lt;&gt; value pairs representing arbitrary strings tied to a piece of content. For instance, these are the tags for our post on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/indexingco.eth/FDyv8i8c15ATs_KIpAtEdeMP20WZ00FfssPYOj3EZRY">web3 storage options</a>:</p><pre data-type="codeBlock" text="{
  &apos;Content-Type&apos;: &apos;application/json&apos;,
  &apos;App-Name&apos;: &apos;MirrorXYZ&apos;,
  Contributor: &apos;0x0317d91C89396C65De570c6A1A5FF8d5485c58DC&apos;,
  &apos;Content-Digest&apos;: &apos;B1ytOURSn75aACoOHmVHrV31bl0tL4ffWHEtl4JeGUE&apos;,
  &apos;Original-Content-Digest&apos;: &apos;FDyv8i8c15ATs_KIpAtEdeMP20WZ00FfssPYOj3EZRY&apos;
}
"><code>{
  '<span class="hljs-attribute">Content</span>-Type': <span class="hljs-string">'application/json'</span>,
  <span class="hljs-string">'App-Name'</span>: <span class="hljs-string">'MirrorXYZ'</span>,
  Contributor: <span class="hljs-string">'0x0317d91C89396C65De570c6A1A5FF8d5485c58DC'</span>,
  <span class="hljs-string">'Content-Digest'</span>: <span class="hljs-string">'B1ytOURSn75aACoOHmVHrV31bl0tL4ffWHEtl4JeGUE'</span>,
  <span class="hljs-string">'Original-Content-Digest'</span>: <span class="hljs-string">'FDyv8i8c15ATs_KIpAtEdeMP20WZ00FfssPYOj3EZRY'</span>
}
</code></pre><p>For our purposes we’re most interested in the <code>App-Name</code> and <code>Contributor</code> tags. We’ll use the combination of these two to pull all of the content published on Mirror by our given writer.</p><p>Alright, time for some code. We’re first defining our <code>arweave</code> instance and pointing it at the publicly hosted <code>arweave.net</code> provider. If you want to run your own node, check out their docs <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.arweave.org/info/mining/mining-guide">here</a>.</p><pre data-type="codeBlock" text="import Arweave from &quot;arweave&quot;;

const arweave = Arweave.init({
  host: &quot;arweave.net&quot;,
  port: 443,
  protocol: &quot;https&quot;,
});
"><code>import Arweave <span class="hljs-keyword">from</span> <span class="hljs-string">"arweave"</span>;

<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">arweave</span> = Arweave.<span class="hljs-title function_ invoke__">init</span>({
  <span class="hljs-attr">host</span>: <span class="hljs-string">"arweave.net"</span>,
  <span class="hljs-attr">port</span>: <span class="hljs-number">443</span>,
  <span class="hljs-attr">protocol</span>: <span class="hljs-string">"https"</span>,
});
</code></pre><p>Since we’re using Typescript, we can define our <code>Post</code> structure. This roughly reflects what we’ll get from Arweave directly with the addition of the <code>originalDigest</code> key. That <code>originalDigest</code> will be pulled from the <code>Original-Content-Digest</code> and is important because that’s what Mirror uses in their URLs (i.e. why you can edit a post without having to share a new link).</p><pre data-type="codeBlock" text="type Post = {
  authorship: {
    contributor: string;
  };
  content: {
    body: string;
    timestamp: string;
    title: string;
  };
  digest: string;
  originalDigest: string;
};
"><code>type <span class="hljs-attr">Post</span> = {
  authorship: {
    contributor: string<span class="hljs-comment">;</span>
  }<span class="hljs-comment">;</span>
  content: {
    body: string<span class="hljs-comment">;</span>
    timestamp: string<span class="hljs-comment">;</span>
    title: string<span class="hljs-comment">;</span>
  }<span class="hljs-comment">;</span>
  digest: string<span class="hljs-comment">;</span>
  originalDigest: string<span class="hljs-comment">;</span>
}<span class="hljs-comment">;</span>
</code></pre><p>Finally, we get to the meat of this whole shebang. We first query Arweave for the transactions matching our given <code>Contributor</code> tag and then fetch the full transaction for each identifier, including its data. Since the current <code>arweave</code> package only allows us to search by one tag, we filter by the <code>App-Name: MirrorXYZ</code> piece further down after we parse out the <code>tags</code>.</p><p>Now that we’ve filtered down to only those transactions that match our <code>Contributor</code> and <code>App-Name</code>, we can pull out the <code>data</code> and turn it into a <code>Post</code>. Mirror adds all of their content as structured JSON strings, so we can readily parse that out and typecast to our <code>Post</code> type. Of course, <code>null</code> checks and error handling would be welcomed additions as well.</p><pre data-type="codeBlock" text="async function getPostsForContributor(address: string): Promise&lt;Post[]&gt; {
  const arweaveTransactionIds = await arweave.transactions.search(
    &quot;Contributor&quot;,
    address
  );

  const arweaveTransactions = await Promise.all(
    arweaveTransactionIds.map((txId) =&gt; arweave.transactions.get(txId))
  );

  const postsByOriginalDigest: Record&lt;string, Post&gt; = {};

  for (const transaction of arweaveTransactions) {
    const tags: Record&lt;string, string&gt; = {};

    for (const tag of transaction.tags) {
      const name = tag.get(&quot;name&quot;, { decode: true, string: true });
      const value = tag.get(&quot;value&quot;, { decode: true, string: true });
      tags[name] = value;
    }

    const appName = tags[&quot;App-Name&quot;];
    if (appName !== &quot;MirrorXYZ&quot;) {
      continue;
    }

    const originalDigest = tags[&quot;Original-Content-Digest&quot;];
    if (postsByOriginalDigest[originalDigest]) {
      continue;
    }

    const rawData = transaction.get(&quot;data&quot;, { decode: true, string: true });
    postsByOriginalDigest[originalDigest] = {
      ...JSON.parse(rawData),
      originalDigest,
    };
  }

  return Object.values(postsByOriginalDigest);
}
"><code>async <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getPostsForContributor</span>(<span class="hljs-params"><span class="hljs-keyword">address</span>: <span class="hljs-keyword">string</span></span>): <span class="hljs-title">Promise</span>&#x3C;<span class="hljs-title">Post</span>[]> </span>{
  const arweaveTransactionIds <span class="hljs-operator">=</span> await arweave.transactions.search(
    <span class="hljs-string">"Contributor"</span>,
    <span class="hljs-keyword">address</span>
  );

  const arweaveTransactions <span class="hljs-operator">=</span> await Promise.all(
    arweaveTransactionIds.map((txId) <span class="hljs-operator">=</span><span class="hljs-operator">></span> arweave.transactions.get(txId))
  );

  const postsByOriginalDigest: Record<span class="hljs-operator">&#x3C;</span><span class="hljs-keyword">string</span>, Post<span class="hljs-operator">></span> <span class="hljs-operator">=</span> {};

  <span class="hljs-keyword">for</span> (const transaction of arweaveTransactions) {
    const tags: Record<span class="hljs-operator">&#x3C;</span><span class="hljs-keyword">string</span>, <span class="hljs-keyword">string</span><span class="hljs-operator">></span> <span class="hljs-operator">=</span> {};

    <span class="hljs-keyword">for</span> (const tag of transaction.tags) {
      const name <span class="hljs-operator">=</span> tag.get(<span class="hljs-string">"name"</span>, { decode: <span class="hljs-literal">true</span>, <span class="hljs-keyword">string</span>: <span class="hljs-literal">true</span> });
      const value <span class="hljs-operator">=</span> tag.get(<span class="hljs-string">"value"</span>, { decode: <span class="hljs-literal">true</span>, <span class="hljs-keyword">string</span>: <span class="hljs-literal">true</span> });
      tags[name] <span class="hljs-operator">=</span> value;
    }

    const appName <span class="hljs-operator">=</span> tags[<span class="hljs-string">"App-Name"</span>];
    <span class="hljs-keyword">if</span> (appName <span class="hljs-operator">!</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">"MirrorXYZ"</span>) {
      <span class="hljs-keyword">continue</span>;
    }

    const originalDigest <span class="hljs-operator">=</span> tags[<span class="hljs-string">"Original-Content-Digest"</span>];
    <span class="hljs-keyword">if</span> (postsByOriginalDigest[originalDigest]) {
      <span class="hljs-keyword">continue</span>;
    }

    const rawData <span class="hljs-operator">=</span> transaction.get(<span class="hljs-string">"data"</span>, { decode: <span class="hljs-literal">true</span>, <span class="hljs-keyword">string</span>: <span class="hljs-literal">true</span> });
    postsByOriginalDigest[originalDigest] <span class="hljs-operator">=</span> {
      ...JSON.parse(rawData),
      originalDigest,
    };
  }

  <span class="hljs-keyword">return</span> Object.values(postsByOriginalDigest);
}
</code></pre><p>And that’s really all there is to it! You can view all of the code above, together in this <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gist.github.com/brock-haugen/f67e71a8fc3c27cd9ecb5b3f64bbcff9">gist</a>. It’s worth noting that the current <code>arweave</code> package does <em>not</em> support subscriptions. Because of this, we have to regularly check for new Arweave transactions in a manual way. This can be done via polling, or in the case of indexing.co, simply at request time.</p><p>Lastly, if you want to render a given post, the <code>Post.content.body</code> parameter is stored as markdown and can be roughly converted to HTML using a package like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.npmjs.com/package/markdown-it">markdown-it</a>.</p><pre data-type="codeBlock" text="import md from &quot;markdown-it&quot;;

function PostView(post: Post) {
  return (
    &lt;div dangerouslySetInnerHTML={{ __html: md().render(post.content.body) }} /&gt;
  );
}
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">md</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"markdown-it"</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">PostView</span>(<span class="hljs-params">post: Post</span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="hljs-operator">&#x3C;</span>div dangerouslySetInnerHTML<span class="hljs-operator">=</span>{{ __html: md().render(post.content.body) }} <span class="hljs-operator">/</span><span class="hljs-operator">></span>
  );
}
</code></pre><p>Happy indexing!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/236877fd2398b8640356f4efedbe4c4f1de2ccab89a2664f536237fb9d169a16.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[Accessing Data 3.0: Storage Options]]></title>
            <link>https://paragraph.com/@indexingco/accessing-data-3-0-storage-options</link>
            <guid>11fwNUkWUpz2SaU0Mxq1</guid>
            <pubDate>Thu, 29 Sep 2022 19:08:21 GMT</pubDate>
            <description><![CDATA[This is an entry in our long running series, “Accessing Data 3.0”, where we talk about the “whats” and the “hows” of working with data in web3. Enjoy! There’s an often forgotten question in Data 3.0 - where do we actually put all our large data? That image of your favorite cat, videos from the last family trip, the unpublished book you’re working on - what is “home” for all that data? It’s easy to think “well if it’s web3, then it must be on-chain”, but that’s not always true, nor does it nee...]]></description>
            <content:encoded><![CDATA[<p><em>This is an entry in our long running series, “Accessing Data 3.0”, where we talk about the “whats” and the “hows” of working with data in web3. Enjoy!</em></p><p>There’s an often forgotten question in Data 3.0 - where do we actually put all our large data? That image of your favorite cat, videos from the last family trip, the unpublished book you’re working on - what is “home” for all that data? It’s easy to think “well if it’s web3, then it must be on-chain”, but that’s not always true, nor does it need to be! There’s a whole, growing world of decentralized data that has no tie back to a blockchain.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The simplest explanation is that putting data on-chain is expensive. Blockchains are, well, chains of “blocks”. Each of those blocks has a set of transactions, which in turn can include some amount of data. Each server participating in the network must then store <em>all</em> data for the blocks they help decentralize. For example, in Ethereum the default for many servers is to store the last one year of blocks. Furthermore, all data added to a block gets hashed to secure the given blockchain. The combination of these two requirements leads to limits on the amount of raw data within a block. This in turn creates a competitive effect for “block space”. Resulting in web3 users having to pay fees in correlation to the total number of users (often referred to as “gas”).</p><p>Now, it’s important to circle back to that “large” term we used at the beginning. What is does it mean to have a large piece of data? Take for instance the data required to reference moving funds from one account to another. This is often measured in a unit called “bytes” and is plenty small enough to keep on-chain. After all, this is the original use case blockchains! As you move into say a school paper though, you begin measuring data in “kilobytes”, or thousands of bytes. An image often runs into “megabytes” (millions) and videos get well into the “gigabyte” (billions) range. As a web3 user, it’s safe to assume that anything measured in more than bytes is too large. It&apos;s either impossible to store on-chain (due to block limits) or it&apos;s too expensive to do so.</p><h3 id="h-soo-where-do-we-store-all-those-cat-photos-then" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Soo, where do we store all those cat photos then?</h3><p>Thankfully, the innovation in Data 3.0 hasn’t left us high and dry. Let’s take a look at a few of the popular solutions for storing “large” data today:</p><h3 id="h-ipfs" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">IPFS</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ipfs.io/">https://ipfs.io/</a></p><p>The Interplanetary File System is a free, “peer-to-peer” protocol for decentralizing data. IPFS was one of the earliest adopted solutions for storing data in web3 and continues to be a favorite for many. Getting started is easy (they even have a browser extension!) and the broader network improves the more users it has.</p><p>That reliance on adoption has been both a defining factor and a sort of achilles heel for the project. Users are only required to store data that they actually want to use themselves. For instance, there’s likely no [good] reason for me wanting to store <em>your</em> family videos, and so I won’t. But! if a meme is going viral and shared via IPFS, then every single viewer of that meme would also be sharing that data. From a practical perspective, this makes IPFS decentralized, but only temporarily so. In short, IPFS provides an easy, decentralized way to share data with others who want it.</p><p>Explore the desktop application and other ways to get started <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ipfs.tech/install/ipfs-desktop/">here</a>. Or try out a hosted “pinning” provider like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.pinata.cloud/">Pinata</a>.</p><h3 id="h-filecoin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Filecoin</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://filecoin.io/">https://filecoin.io/</a></p><p>Also built by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://protocol.ai/">Protocol Labs</a>, Filecoin aims to solve the &quot;temporary&quot; nature of IPFS by providing &quot;contract-based&quot; storage. Servers offer their storage capacity to the network and users pay to host their data for a fixed period of time. Fees get determined by the size of the data stored and the length of the “contract”. This storage market is then powered by a dedicated blockchain and currency, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://coinmarketcap.com/currencies/filecoin/">$FIL</a>.</p><p>And behind this marketplace, the servers paid to store your data are all doing so via IPFS. That means that adoption of Filecoin is also adoption of IPFS.</p><p>Check out <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://web3.storage/">web3.storage</a> or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://fleek.co/storage/">Fleek</a> to explore early consumer applications for Filecoin.</p><h3 id="h-arweave" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Arweave</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.arweave.org/">https://www.arweave.org/</a></p><p>Much like Filecoin, Arweave has a storage market with a dedicated blockchain and token (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://coinmarketcap.com/currencies/arweave/">$AR</a>). Rather than doing fixed term contracts though, Arweave promises <em>permanent</em> data storage. One upfront fee, storage forever.</p><p>Arweave accomplishes this permanence by gamifying data storage (details in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.co/LMxwLjtcVN">the yellow paper</a>). Each server of the network can choose to store whatever data they want. For instance, they could avoid storing illegal content by censoring what&apos;s stored. But those servers are also incentivized to store data that isn’t sufficiently decentralized. In other words, it&apos;s worth more to store data decentralized to only a few servers vs thousands. And over the span of the network, this results in <em>all</em> data always stored.</p><p>Check out their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.ardrive.io/">ArDrive</a> to give it a spin.</p><p>(fun fact - this blog is hosted on Arweave via <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/">Mirror.xyz</a>)</p><h3 id="h-storj" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Storj</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.storj.io/">https://www.storj.io/</a></p><p>Storj is another competitor in the web3 storage space, but focuses on developers. It boasts full compatibility with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://aws.amazon.com/">AWS</a> S3 so most developers can leverage decentralized storage out of the box. The end result being fast, reliable cloud storage that&apos;s also decentralized.</p><p>In general, servers in solutions like Filecoin and Arweave are only rewarded if they store the <em>full</em> chunk of data (e.g. an image). Storj is different. It takes a given chunk of data, encrypts it, and then shares smaller pieces with its network of servers. When a user wants to retrieve data, only 29 of those pieces are required to reconstruct the full chunk of data.</p><p>In this way, servers are incapable of being aware of the data they’re storing. This in turn allows Storj to control data at a network level; optimizing for speed and privacy along the way.</p><p>Storj does have a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://us1.storj.io/signup">hosted interface</a> for consumers to leverage their network. And of course there&apos;s <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.storj.io/dcs/">documentation for developers</a> to get started as well.</p><h2 id="h-what-should-i-use" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What should I use?</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/03ba9d1409d1a386ebe599debb0ff6bacc63d45eed5c6623154f1ebbc025b07d.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Here’s the skinny on when to use different Data 3.0 storage solutions today:</p><ol><li><p>IPFS - free, easy to use, and temporary file sharing</p></li><li><p>Filecoin - fixed-length storage for a fee</p></li><li><p>Arweave - permanent storage for an upfront cost</p></li><li><p>Storj - developer-centric alternative to AWS S3</p></li></ol>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[ENS: A Practical Guide]]></title>
            <link>https://paragraph.com/@indexingco/ens-a-practical-guide</link>
            <guid>2IQOhLTIbYybQP2zrTSz</guid>
            <pubDate>Fri, 23 Sep 2022 16:36:20 GMT</pubDate>
            <description><![CDATA[So you’ve made it to this site and this particular blog post. Great! But do you know how you actually got here? (For those wanting to dive in, feel free to scroll past this to “The DIY Section” below) The internet today (web2) works, and more importantly gained adoption, in part thanks to the magical world of the Domain Name System (DNS for short). At the highest level, DNS effectively allows users of web2 to say “I want to visit longdogechallenge.com” and reliably be taken to the content (we...]]></description>
            <content:encoded><![CDATA[<p>So you’ve made it to this site and this particular blog post. Great! But do you know <em>how</em> you actually got here?</p><p><em>(For those wanting to dive in, feel free to scroll past this to “The DIY Section” below)</em></p><p>The internet today (web2) works, and more importantly gained adoption, in part thanks to the magical world of the Domain Name System (DNS for short). At the highest level, DNS effectively allows users of web2 to say “I want to visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://longdogechallenge.com/">longdogechallenge.com</a>” and reliably be taken to the content (website) that lives there. Let’s break down how that works a bit:</p><ol><li><p>A user enters the domain name, <code>longdogechallenge.com</code>, in their browser’s address bar</p></li><li><p>A <em>DNS lookup</em> occurs to resolve that domain name to a server’s IP address (an Internet Protocol address is a way to uniquely identify every device on the internet)</p></li><li><p>The browser is given the IP address for the requested domain name and asks the server behind that IP address for content</p></li><li><p>The server returns the content and the browser renders that to the end user (aka the resulting website)</p></li></ol><p><em>(The above is admittedly a major simplification of DNS, and for those wishing to dive deeper, </em><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.cloudflare.com/learning/dns/what-is-dns/"><em>Cloudflare has a great technical write up</em></a><em>)</em></p><p>For our purposes though, the general idea is that users of web2 can use DNS to get content behind an IP address while only knowing a domain name. This abstraction is enormously powerful. For starters, IP addresses are <em>not</em> easy to remember - the “common” IPv4 format looks something like <code>192.168.1.1</code> and the newer IPv6 format, <code>2001:0db8:85a3:0000:0000:8a2e:0370:7334</code>, certainly isn’t any easier. IP addresses are designed for uniquely identifying the billions of internet devices and facilitating communication between <em>them</em>; not with humans. And of equal importance, because humans are accessing content via domain names, the server providing that content can be swapped out simply by changing which IP address a domain name points to.</p><h3 id="h-okay-but-what-does-this-have-to-do-with-web3" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Okay, but what does this have to do with web3?</h3><p>Allowing mere humans to remember just <code>google.com</code> instead of <code>142.250.113.102</code> was a massive accessibility win for web2. The Ethereum Name System, ENS, provides a similar system for the Ethereum ecosystem. And while Ethereum is of course <em>not</em> equivalent to all of web3, it does represent a large portion of the current web3 user base in some capacity (even if you aren’t directly using Ethereum, many protocols and services are built atop the same basic technologies - more on that another time).</p><p>ENS, in short, allows a web3 user to say “I want to send funds to alice.eth” without actually knowing the wallet address behind <code>alice.eth</code>.</p><h2 id="h-the-diy-section" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The DIY Section</h2><p>Alright, we’ve covered what ENS is and why you should have one. Now let’s dig into how to acquire and use ENS; for both web3 users and developers.</p><h3 id="h-for-users" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">For Users</h3><p>Go buy an ENS! Seriously, go right now and buy one if you haven’t already. Some steps to get you started:</p><p><strong>Setup your wallet</strong></p><p>If you haven’t already, make sure you have a web3 wallet. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://metamask.io/">MetaMask</a> is a great place to get started if you haven’t already joined web3.</p><p>From there, make sure you have “some” Ethereum in your wallet. A quarter (0.25) ETH should be plenty to get started (unless you’re trying to get a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://espressoinsight.com/2022/05/15/most-expensive-ens-sales-ever/">highly prized ENS</a>). If you don’t have any ETH yet, look towards exchanges like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.coinbase.com/">Coinbase</a> to get you started.</p><p><strong>Buy an ENS</strong></p><p>Visit a site like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.ens.domains/">https://app.ens.domains</a> to look up names you’re interested in. There’s no wrong answer here - it’s a lot like choosing an email or a Twitter handle. If your name is available, then great! Follow the registration process (yes, this will involve 2 transactions) and secure your shiny new ENS.</p><p>If the name you like is already registered, then you have a few options for purchasing it on the “secondary markets”. ENS, at least in part, is officially a standard NFT collection. That means you can use your favorite NFT marketplaces to trade registered ENS items. Some options in no particular order:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://opensea.io/">https://opensea.io/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nft.coinbase.com/">https://nft.coinbase.com/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ens.vision/">https://www.ens.vision/</a></p></li></ul><p><strong>Tie your ENS to your wallet address</strong></p><p>This is the important piece. Now that you own your ENS, you need to make sure that it’s setup to point to your wallet address. There are two different pieces to this. Go back to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.ens.domains/">https://app.ens.domains/</a> once again and click “My Account” in the upper right-hand corner and then do the following:</p><p><strong>Define the ENS =&gt; wallet address lookup</strong> -- Select the ENS you just purchased and set the “Record” for “ETH” address to your wallet address. During this step, feel free to set as many of the other text records you see there as you want - this is all part of your new web3 profile.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1296a31ccac8ba22630e647bb20507889548509ab99eaa086dc5788e722b8d8b.png" alt="Setting ENS records" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Setting ENS records</figcaption></figure><p><strong>Define the wallet address =&gt; ENS reverse lookup</strong> -- Go back to your “My Account” page and you’ll have an option to select your “Primary ENS Name”. Submit the corresponding transaction to make it permanent 🔥</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c97feee8e83f433e811dfac379e384724675b8536290c50c365e761a1d14439c.png" alt="Setting a Primary ENS Name" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Setting a Primary ENS Name</figcaption></figure><p><em>NOTE: Both of the above steps will also require submitting Ethereum transactions and paying a small amount of ETH in “gas”. This is to pay the network to store the new data you just added.</em></p><p>And just like that, you’ll now have an official, named identity in web3 🎉 A simple way you can try it out is by looking up your name or wallet address on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/">Etherscan</a> and seeing that the two are linked in the results.</p><p><strong>BONUS: Add an NFT as your avatar</strong></p><p>Thanks to the wonderful world of web3, you can also link pieces of decentralized data together. Specifically in this case, you can say that the photo for your shiny new ENS name should be another NFT that you own. For instance, the avatar field for runninyeti.eth is set to <code>`eip155:1/erc1155:0x495f947276749ce646f68ac8c248420045cb7b5e/87433597745683365960201176492736871205018189775129059226749288698845216112641`</code> which points to this lovely image:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a94fedabc867c82feee7e6a30302418339e2809ab3576b871433a8b7b30cf216.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>For a good overview of how to do this, check out <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/the-ethereum-name-service/step-by-step-guide-to-setting-an-nft-as-your-ens-profile-avatar-3562d39567fc">this post</a> by the ENS team.</p><h3 id="h-for-developers" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">For Developers</h3><p>Also go buy an ENS! For yourself, for your project, whatever it might be, just start participating. See the “For Users” section above and follow along.</p><p>Now that that’s done, here’s some how-to’s for adding ENS functionality to your projects. We’re going to focus on using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.npmjs.com/package/web3">web3.js</a> since it’s usable on both frontend and backend codebases, but these same principles can be used with any language.</p><p>We’re also going to focus on some of the low-hanging fruit based on what is available to the developer community <em>today</em>, but we encourage everyone to go far beyond this (e.g. “ENS Profiles” or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ens.domains/deploying-ens-on-a-private-chain">deploying ENS on a private chain</a>). There are also existing packages to obfuscate working with ENS (mainly JavaScript based, like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.npmjs.com/package/@ensdomains/ensjs">ensjs</a>), but for this post we’ll be looking at how we can do it ourselves and handle all data directly.</p><p><strong>Look up the current owner of an ENS</strong></p><p><em>tl;dr - ask the NFT contract for ENS who the current owner is</em></p><p>We’ll start with an easy one. To grab the address of the current owner of a given ENS name:</p><ol><li><p>Define a web3.js contract instance with the <code>ownerOf</code> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/contracts/2.x/api/token/erc721#IERC721-ownerOf-uint256-">ABI input</a></p></li><li><p>Convert the <code>name</code> to a <code>tokenId</code></p></li><li><p>Ask the contract who owns that <code>tokenId</code></p></li></ol><pre data-type="codeBlock" text="async function getOwnerAddressForENSName(name) {
  // do a basic null check
  if (!name) {
    return null;
  }

  // define a new contract instance for ENS NFTs
  const nftContract = new web3.eth.Contract(
    [
      {
        inputs: [{ internalType: &apos;uint256&apos;, name: &apos;tokenId&apos;, type: &apos;uint256&apos; }],
        name: &apos;ownerOf&apos;,
        outputs: [{ internalType: &apos;address&apos;, name: &apos;&apos;, type: &apos;address&apos; }],
        stateMutability: &apos;view&apos;,
        type: &apos;function&apos;,
      },
    ],
    ENS_NFT_ADDRESS
  );

  // convert the name to a tokenId
  const tokenId = new BigNumber(Web3.utils.sha3(name.replace(/\.eth$/, &apos;&apos;))).toString();

  // ask the contract for the current owner and return the result
  return nftContract.methods
    .ownerOf(tokenId)
    .call()
    .catch(() =&gt; null);
}
"><code>async <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getOwnerAddressForENSName</span>(<span class="hljs-params">name</span>) </span>{
  <span class="hljs-comment">// do a basic null check</span>
  <span class="hljs-keyword">if</span> (<span class="hljs-operator">!</span>name) {
    <span class="hljs-keyword">return</span> null;
  }

  <span class="hljs-comment">// define a new contract instance for ENS NFTs</span>
  const nftContract <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> web3.eth.Contract(
    [
      {
        inputs: [{ internalType: <span class="hljs-string">'uint256'</span>, name: <span class="hljs-string">'tokenId'</span>, <span class="hljs-keyword">type</span>: <span class="hljs-string">'uint256'</span> }],
        name: <span class="hljs-string">'ownerOf'</span>,
        outputs: [{ internalType: <span class="hljs-string">'address'</span>, name: <span class="hljs-string">''</span>, <span class="hljs-keyword">type</span>: <span class="hljs-string">'address'</span> }],
        stateMutability: <span class="hljs-string">'view'</span>,
        <span class="hljs-keyword">type</span>: <span class="hljs-string">'function'</span>,
      },
    ],
    ENS_NFT_ADDRESS
  );

  <span class="hljs-comment">// convert the name to a tokenId</span>
  const tokenId <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> BigNumber(Web3.utils.sha3(name.replace(<span class="hljs-operator">/</span>\.eth$/, <span class="hljs-string">''</span>))).toString();

  <span class="hljs-comment">// ask the contract for the current owner and return the result</span>
  <span class="hljs-keyword">return</span> nftContract.methods
    .ownerOf(tokenId)
    .<span class="hljs-built_in">call</span>()
    .catch(() <span class="hljs-operator">=</span><span class="hljs-operator">></span> null);
}
</code></pre><p><strong>Swap ENS names for wallet addresses</strong></p><p><em>tl;dr - ask the ENS resolver for the address of a given ENS name</em></p><p>Let’s kick things up a notch. In order to get the resolved address for a given ENS name, we’ll need a few things:</p><ol><li><p>First we want to define a contract instance for the ENS resolver with the <code>addr</code> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ens.domains/ens-improvement-proposals/ensip-9-multichain-address-resolution">method</a>. The current contract address is <code>0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41</code></p></li><li><p>We then leverage the <code>namehash</code><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ens.domains/ens-improvement-proposals/ensip-1-ens#namehash-algorithm"> algorithm</a> to convert the given <code>name</code> to a sha3 <code>node</code></p></li><li><p>Ask the contract for the current <code>addr</code> value of the given <code>node</code></p></li></ol><pre data-type="codeBlock" text="async function getAddressFromENSName(name) {
  // some basic validity checks
  // @NOTE: non .eth names are valid, but may require a different resolver contract address
  if (!name || !name.endsWith(&apos;.eth&apos;)) {
    return null;
  }

  // define a new contract instance for our ENS resolver
  const resolverContract = new web3.eth.Contract(
    [
      {
        constant: true,
        inputs: [{ internalType: &apos;bytes32&apos;, name: &apos;node&apos;, type: &apos;bytes32&apos; }],
        name: &apos;addr&apos;,
        outputs: [{ internalType: &apos;address&apos;, name: &apos;&apos;, type: &apos;address&apos; }],
        payable: false,
        stateMutability: &apos;view&apos;,
        type: &apos;function&apos;,
      },
    ],
    ENS_RESOLVER_ADDRESS
  );

  // convert our name to a node hash
  const node = namehash(name);

  // ask the contract for the current address and return the result
  return resolverContract.methods
    .addr(node)
    .call()
    .catch(() =&gt; null);
}
"><code>async <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getAddressFromENSName</span>(<span class="hljs-params">name</span>) </span>{
  <span class="hljs-comment">// some basic validity checks</span>
  <span class="hljs-comment">// @<span class="hljs-doctag">NOTE:</span> non .eth names are valid, but may require a different resolver contract address</span>
  <span class="hljs-keyword">if</span> (<span class="hljs-operator">!</span>name <span class="hljs-operator">|</span><span class="hljs-operator">|</span> <span class="hljs-operator">!</span>name.endsWith(<span class="hljs-string">'.eth'</span>)) {
    <span class="hljs-keyword">return</span> null;
  }

  <span class="hljs-comment">// define a new contract instance for our ENS resolver</span>
  const resolverContract <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> web3.eth.Contract(
    [
      {
        <span class="hljs-keyword">constant</span>: <span class="hljs-literal">true</span>,
        inputs: [{ internalType: <span class="hljs-string">'bytes32'</span>, name: <span class="hljs-string">'node'</span>, <span class="hljs-keyword">type</span>: <span class="hljs-string">'bytes32'</span> }],
        name: <span class="hljs-string">'addr'</span>,
        outputs: [{ internalType: <span class="hljs-string">'address'</span>, name: <span class="hljs-string">''</span>, <span class="hljs-keyword">type</span>: <span class="hljs-string">'address'</span> }],
        <span class="hljs-keyword">payable</span>: <span class="hljs-literal">false</span>,
        stateMutability: <span class="hljs-string">'view'</span>,
        <span class="hljs-keyword">type</span>: <span class="hljs-string">'function'</span>,
      },
    ],
    ENS_RESOLVER_ADDRESS
  );

  <span class="hljs-comment">// convert our name to a node hash</span>
  const node <span class="hljs-operator">=</span> namehash(name);

  <span class="hljs-comment">// ask the contract for the current address and return the result</span>
  <span class="hljs-keyword">return</span> resolverContract.methods
    .addr(node)
    .<span class="hljs-built_in">call</span>()
    .catch(() <span class="hljs-operator">=</span><span class="hljs-operator">></span> null);
}
</code></pre><p><strong>Swap wallet addresses for ENS names</strong></p><p><em>tl;dr - ask the ENS reverse resolver for the ENS name of a given address; double check against the name =&gt; address method above</em></p><p>A final example here, getting the ENS name for a given wallet address is almost identical to the other two methods above:</p><ol><li><p>Again, start by defining a new contract instance for the ENS reverse resolver with the <code>getNames</code> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ens.domains/ens-improvement-proposals/ensip-3-reverse-resolution">method</a>. The current contract address is <code>0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C</code></p></li><li><p>Ask the contract for the name that corresponds to our given address</p></li><li><p>Double check that the name =&gt; address mapping matches. While this step isn’t <em>necessary</em>, it’s best practice to ensure no one is manipulating the reverse resolver - more info <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ens.domains/dapp-developer-guide/resolving-names#reverse-resolution">from ENS here</a></p></li></ol><pre data-type="codeBlock" text="async function getENSNameFromAddress(address) {
  // some basic validity checks
  if (!address || address.length !== 42) {
    return null;
  }

  // make sure our address is the checksum version
  address = Web3.utils.toChecksumAddress(address);

  // define a new contract instance for our ENS reverse resolver
  const reverseResolverContract = new web3.eth.Contract(
    [
      {
        inputs: [{ internalType: &apos;address[]&apos;, name: &apos;addresses&apos;, type: &apos;address[]&apos; }],
        name: &apos;getNames&apos;,
        outputs: [{ internalType: &apos;string[]&apos;, name: &apos;r&apos;, type: &apos;string[]&apos; }],
        stateMutability: &apos;view&apos;,
        type: &apos;function&apos;,
      },
    ],
    ENS_REVERSE_RESOLVER_ADDRESS
  );

  // ask the contract for the name that maps from the address
  // @NOTE: you can pass multiple addresses in a single call with this method
  const [name] = await reverseResolverContract.methods
    .getNames([address])
    .call()
    .catch(() =&gt; []);

  // @NOTE: ideally we double check that the reverse resolver is correct
  //        this can be done by comparing against the name =&gt; address mapping
  if (address !== (await getAddressFromENSName(name))) {
    return null;
  }

  return name;
}
"><code>async <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getENSNameFromAddress</span>(<span class="hljs-params"><span class="hljs-keyword">address</span></span>) </span>{
  <span class="hljs-comment">// some basic validity checks</span>
  <span class="hljs-keyword">if</span> (<span class="hljs-operator">!</span><span class="hljs-keyword">address</span> <span class="hljs-operator">|</span><span class="hljs-operator">|</span> <span class="hljs-keyword">address</span>.<span class="hljs-built_in">length</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">42</span>) {
    <span class="hljs-keyword">return</span> null;
  }

  <span class="hljs-comment">// make sure our address is the checksum version</span>
  <span class="hljs-keyword">address</span> <span class="hljs-operator">=</span> Web3.utils.toChecksumAddress(<span class="hljs-keyword">address</span>);

  <span class="hljs-comment">// define a new contract instance for our ENS reverse resolver</span>
  const reverseResolverContract <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> web3.eth.Contract(
    [
      {
        inputs: [{ internalType: <span class="hljs-string">'address[]'</span>, name: <span class="hljs-string">'addresses'</span>, <span class="hljs-keyword">type</span>: <span class="hljs-string">'address[]'</span> }],
        name: <span class="hljs-string">'getNames'</span>,
        outputs: [{ internalType: <span class="hljs-string">'string[]'</span>, name: <span class="hljs-string">'r'</span>, <span class="hljs-keyword">type</span>: <span class="hljs-string">'string[]'</span> }],
        stateMutability: <span class="hljs-string">'view'</span>,
        <span class="hljs-keyword">type</span>: <span class="hljs-string">'function'</span>,
      },
    ],
    ENS_REVERSE_RESOLVER_ADDRESS
  );

  <span class="hljs-comment">// ask the contract for the name that maps from the address</span>
  <span class="hljs-comment">// @<span class="hljs-doctag">NOTE:</span> you can pass multiple addresses in a single call with this method</span>
  const [name] <span class="hljs-operator">=</span> await reverseResolverContract.methods
    .getNames([<span class="hljs-keyword">address</span>])
    .<span class="hljs-built_in">call</span>()
    .catch(() <span class="hljs-operator">=</span><span class="hljs-operator">></span> []);

  <span class="hljs-comment">// @<span class="hljs-doctag">NOTE:</span> ideally we double check that the reverse resolver is correct</span>
  <span class="hljs-comment">//        this can be done by comparing against the name => address mapping</span>
  <span class="hljs-keyword">if</span> (<span class="hljs-keyword">address</span> <span class="hljs-operator">!</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> (await getAddressFromENSName(name))) {
    <span class="hljs-keyword">return</span> null;
  }

  <span class="hljs-keyword">return</span> name;
}
</code></pre><h3 id="h-wrapping-up" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Wrapping up</h3><p>There you have it, that’s a quick run down on working with ENS! Both as a web3 user and as a developer in the space. For deeper dives, definitely check out the official <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ens.domains/dapp-developer-guide/ens-enabling-your-dapp">ENS documentation</a> and feel free to explore the code from this post on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gist.github.com/brock-haugen/e2fe9920b9d2069912b77fe5f0826733">Github</a>. And please reach out if you find this post interesting or just want to chat more about ENS, indexing, and Data 3.0.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5acf23ff6fc88dea5abeac034979835f6788670a26f0bbb62a72c2d665f3fede.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
        <item>
            <title><![CDATA[Accessing Data 3.0: Indexing 101]]></title>
            <link>https://paragraph.com/@indexingco/accessing-data-3-0-indexing-101</link>
            <guid>AHVYRyencXxo9kuJ9KCE</guid>
            <pubDate>Wed, 14 Sep 2022 15:40:03 GMT</pubDate>
            <description><![CDATA[This is an entry in our long running series, “Accessing Data 3.0”, where we talk about the “whats” and the “hows” of working with data in web3. Enjoy! Remember libraries? The walls of books and the fearless librarians somehow always knowing exactly where everything is. Well, two things: 1) libraries still exist, 2) those libraries are each indexed. Librarians around the world categorize all of the books under their purview into what are known as a “library catalogs”. These catalogs serve as a...]]></description>
            <content:encoded><![CDATA[<p><em>This is an entry in our long running series, “Accessing Data 3.0”, where we talk about the “whats” and the “hows” of working with data in web3. Enjoy!</em></p><p>Remember libraries? The walls of books and the fearless librarians somehow always knowing exactly where everything is. Well, two things: 1) libraries still exist, 2) those libraries are each <em>indexed</em>. Librarians around the world categorize all of the books under their purview into what are known as a “<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Library_catalog">library catalogs</a>”. These catalogs serve as a means of quickly finding books by given keywords: genres, authors, titles, etc.</p><p>The internet works in much the same way. There are <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.internetlivestats.com/total-number-of-websites/">billions of websites</a> on the internet (our books in the example above) and each contains some amount of content. In order to find anything online we ask our almighty catalogs for direction - we “Google” a question or search someone’s name on Facebook. And for any of that to be possible, our trusted librarians (Google, Facebook, etc) had to first sort through the sea of content, categorize it, and then build intelligent indexes (catalogs). Now when you <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.google.com/search?q=weather+today">search “weather today”</a>, Google is aware of sites that are relevant to the keyword “weather” and presents those. Of course, Google is also aware of your physical location, today’s date, your previous search history, and which website is paying the most to be matched on the keyword “weather” … but we’ll leave the darker details of the indexing industry for another day.</p><p>The point is, <strong>indexing is everywhere</strong> - a book’s table of contents, your phone’s set of contacts, the grocery list pinned to the fridge … you get the gist. Any time a given data set is too large to be easily consumed, indexing of some sort is employed to aid in its digestion.</p><p>Let’s refocus with some definitions:</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.dictionary.com/browse/data">Data</a>: bits of information</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Decentralization">Decentralization</a>: the distribution of control and ownership away from a central authority</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.dictionary.com/browse/index">Index</a>: a catalog to help find data more quickly</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.dictionary.com/e/web3/">Web3</a>: the decentralized web; empowering individuals to <em>own</em> their data</p></li></ol><p>From the above we can surmise that “<strong>indexing</strong>”, as it relates to web3, <strong>is the act of cataloging decentralized information</strong>. Simple as that.</p><p>Generally speaking, indexing, in all scenarios, is done to make data more easily searched, and therefore to make that data more accessible. When the data itself is <em>decentralized</em> though, it opens the door to entirely new models of indexing. Take for instance the basic flow of indexed data in web2:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e88c143f867b46f9b08e64628febb7c38e1429f9a34d45c97ffcd4500189a7a8.png" alt="Web2 Data Indexing" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Web2 Data Indexing</figcaption></figure><p>In the current, web2 world, centralized authorities <strong>control</strong> the flow of data. They are responsible for discovering, aggregating, indexing, and ultimately serving data. When a user performs a “search” for instance, Google chooses which information is relevant and provides it back to the end user. Historically this has been “okay”, but when those centralized authorities start to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gizmodo.com/google-removes-nearly-all-mentions-of-dont-be-evil-from-1826153393">drop their “don’t be evil” mottos</a>, it’s worth pausing to rethink this centralized model.</p><p>Enter the world of web3 and decentralized data:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/481242b90192a03607cb2fed15bfe8e059dfb78ccfbd3df9659921d7d0967df5.png" alt="Web3 Data Indexing" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Web3 Data Indexing</figcaption></figure><p>There’s two important pieces to call out in this web3 scenario:</p><ol><li><p>Users are adding their data directly to decentralized networks (Ethereum, IPFS, Arweave, etc)</p></li><li><p>Because these networks are decentralized, <em>anybody</em> can go through and index the data</p></li></ol><p>That second point has some significant ramifications. For starters, that means that the individual user, whether that’s a single human or a company, can ultimately index and access their own data directly from the network; no middlemen deciding what information is “right”. Furthermore, this model doesn’t stop centralized authorities from <em>also</em> indexing that data and providing it to users - and that’s also good!</p><p>By enabling open data access, decentralized networks effectively create an incentive strategy for truly providing what’s best for the <em>users.</em> Because the centralized authorities no longer control the influx of data, they must cater to the needs of their users. Otherwise, a new competitor will come along to meet those needs. And, the best part of all of this is, that new competitor could simply be the users themselves.</p><p>Although this access isn’t always <em>simple</em> today in many decentralized networks, the barriers to entry are lowering and the potential continues to increase. For those interested in following along, this series on “Accessing Data 3.0” will dive deeper into the various aspects of data in web3 and how we can all start participating in it.</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/96b3009190a36c554e5984499c6405013098b2135b16459d2c732f51c896d78d.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The Road to Data 3.0]]></title>
            <link>https://paragraph.com/@indexingco/the-road-to-data-3-0</link>
            <guid>k9g9NK6c9zb2lTzGiyxb</guid>
            <pubDate>Wed, 31 Aug 2022 15:53:13 GMT</pubDate>
            <description><![CDATA[Welcome!If you are reading this, congratulations on being a part of the next generation of innovation we like to call “Web 3.0” (or simply “web3”). You could be an artist looking to leverage the decentralized economy via an NFT launch, a builder working to further on-chain protocols with smart contracts, a business looking to leverage blockchain technologies to level up your internal logistics, or even just an innocent bystander looking to learn more about the next big thing - whatever the re...]]></description>
            <content:encoded><![CDATA[<h2 id="h-welcome" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Welcome!</h2><p>If you are reading this, congratulations on being a part of the next generation of innovation we like to call “Web 3.0” (or simply “web3”). You could be an artist looking to leverage the decentralized economy via an NFT launch, a builder working to further on-chain protocols with smart contracts, a business looking to leverage blockchain technologies to level up your internal logistics, or even just an innocent bystander looking to learn more about <em>the next big thing</em> - whatever the reason, we are glad you are here!</p><p>As the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://a16zcrypto.com/state-of-crypto-report-a16z-2022/">2022 State of Crypto Report by a16z</a> summarizes, the adoption of web3 is growing, here to stay, and is empowering the next wave of creators. And while all of that is extremely exciting, the road to web2 scale (i.e. billions of users) is far from paved. For instance, the estimated 7-50 million Ethereum users have all had to learn about concepts like private keys, wallets, gas fees … and that’s just to get started in the ecosystem.</p><p>Creators in web3 don’t fair any better. Building Decentralized Applications (dApps) often requires a working knowledge of blockchain data types, smart contract deployment and management strategies (hint: it’s not like traditional software development), gas fees, tokenomics, pseudo-anonymous “users&quot;, etc, etc. There is a silver lining for creators and users alike though: the growth of web3 can largely be attributed to trailblazing individuals and companies *continuing* to work on solving everything from user identity to transaction throughput of the underlying networks.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1c01c7e3117aa537265787d3d489d6967f4cbfad1d443eee52e8a8dcee575d43.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-data-30" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Data 3.0</h2><p>One often overlooked aspect of the entire ecosystem though is the accessibility of data itself. As builders we’ve grown [relatively] accustomed to sending data out into the ether (🥁) without knowing how we will get it back in any sort of usable form. This leads to reliance on centralized sources to figure that out on our behalf, and charge us for that service - at least partially defeating the original purpose of decentralizing the data to begin with. To truly enable the future of decentralized data we must rethink our approach to Data 3.0.</p><h3 id="h-an-example" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">An Example</h3><p>Let’s take a look at one of the most common examples in the space today: tracking NFT project owners. NFT (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.theverge.com/22310188/nft-explainer-what-is-blockchain-crypto-art-faq">Non-Fungible Token</a>) projects have significantly contributed to the rise of adoption in web3 over the last couple of years. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://opensea.io/">OpenSea</a> for instance, the largest NFT marketplace, has facilitated up to $4.8 billion USD in sales <em>in a single month</em> at the height of the last crypto cycle (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dune.com/rchen8/opensea">source</a>).</p><p>What makes NFT projects particularly interesting for our Data 3.0 example though is their relative ease to develop (relative to web3 in general that is) combined with the repeated centralization these projects utilize. At their base layer, NFTs are smart contracts (permanent, unchangeable software) on a given blockchain (often Ethereum) that enable users to own, and transfer, a fixed number of items. NFT project creators can write and deploy their smart contracts, distribute the initial set of items (whether through giving them away or letting web3 users buy them from the smart contract directly), and then leverage a marketplace like OpenSea to enable trades between web3 users.</p><p>An overly simplified lifecycle of an NFT project may go something like this:</p><ol><li><p>Creator A launches the highly successful NFT Project X</p></li><li><p>Thousands of web3 users trade NFT Project X items as owners</p></li><li><p>… time passes …</p></li><li><p>Creator A now wants to give each of the <em>current</em> owners of Project X a gift for being such a great community</p></li><li><p>Creator A realizes they can’t readily get a list of current owners from the blockchain directly and is therefore presented with the following choices:</p><ol><li><p>Scrap the gift idea</p></li><li><p>Write a script to check the current owner of every item against the blockchain. This requires web3 development knowledge <em>and</em> would only generate point in time snapshots making it difficult to keep up with items that may be rapidly switching hands.</p></li><li><p>Learn how to build an <em>indexer</em> to crawl and subscribe to updates from the blockchain, replaying every trade sequentially, to determine the current owner of each item. This solves the problem, but requires even more web3 development knowhow and the ongoing maintenance of the indexer itself.</p></li><li><p>Use a readily available API from a centralized source (that has built their own indexer) to provide this data. This is by far the easiest solution, but requires reliance on a 3rd party provider that may or may not be generally reliable (looking at you OpenSea…) and often incurs a service cost.</p></li></ol></li><li><p>Creator A chooses a 3rd party API provider</p></li><li><p>Owners of NFT Project X get their gifts and everyone is happy</p></li></ol><h3 id="h-whats-the-catch" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What’s the catch?</h3><p>This all sounds fine and dandy right? And it mostly is. Generally the 3rd party providers can be trusted to provide real time, consistent data. But what happens when that 3rd party isn’t reliable or changes the way it serves that data? Or more importantly, what happens when Creator A has a use case no longer supported by the standard offering (e.g. they want to only give gifts to owners that have held their NFTs more than 90 days)? And all of this is just the tip of the iceberg.</p><p>While providers are rapidly appearing to fill the holes in Data 3.0, most of them are doing so in use case specific ways; <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://opensea.io/">OpenSea</a> for NFT data, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.alchemy.com/supernode">Alchemy</a> for raw blockchain data, etc. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum.org/en/developers/docs/">Ethereum’s developer docs</a> - which are honestly great - don’t even mention “indexing” except to point at a 3rd party provider, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thegraph.com/">The Graph</a>. And The Graph, which describes itself as “an indexing protocol for querying networks like Ethereum and IPFS”, has limited support for customizations and forces participation in something akin to an indexing marketplace.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ec3daab1cd568515a4148d695df0d5fd012a686211897fee8714965836c19904.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>There’s a missing link in the Data 3.0 lifecycle and the impacts are only just starting to be felt. Web3 creators should be empowered to own, leverage, and define their data as they see fit. Join us in shaping the future of Data 3.0.</p>]]></content:encoded>
            <author>indexingco@newsletter.paragraph.com (The Indexing Company)</author>
        </item>
    </channel>
</rss>