Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Read by thought-leaders and decision-makers around the world. Phone Number: +1-650-246-9381 Email: pub@towardsai.net
228 Park Avenue South New York, NY 10003 United States
Website: Publisher: https://towardsai.net/#publisher Diversity Policy: https://towardsai.net/about Ethics Policy: https://towardsai.net/about Masthead: https://towardsai.net/about
Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Founders: Roberto Iriondo, , Job Title: Co-founder and Advisor Works for: Towards AI, Inc. Follow Roberto: X, LinkedIn, GitHub, Google Scholar, Towards AI Profile, Medium, ML@CMU, FreeCodeCamp, Crunchbase, Bloomberg, Roberto Iriondo, Generative AI Lab, Generative AI Lab Denis Piffaretti, Job Title: Co-founder Works for: Towards AI, Inc. Louie Peters, Job Title: Co-founder Works for: Towards AI, Inc. Louis-François Bouchard, Job Title: Co-founder Works for: Towards AI, Inc. Cover:
Towards AI Cover
Logo:
Towards AI Logo
Areas Served: Worldwide Alternate Name: Towards AI, Inc. Alternate Name: Towards AI Co. Alternate Name: towards ai Alternate Name: towardsai Alternate Name: towards.ai Alternate Name: tai Alternate Name: toward ai Alternate Name: toward.ai Alternate Name: Towards AI, Inc. Alternate Name: towardsai.net Alternate Name: pub.towardsai.net
5 stars – based on 497 reviews

Frequently Used, Contextual References

TODO: Remember to copy unique IDs whenever it needs used. i.e., URL: 304b2e42315e

Resources

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

Publication

Protecting User Privacy in Web 3.0: How Zero-Knowledge Proofs Enable Secure Data Sharing
Latest   Machine Learning

Protecting User Privacy in Web 3.0: How Zero-Knowledge Proofs Enable Secure Data Sharing

Last Updated on July 17, 2023 by Editorial Team

Author(s): Peace Aisosa

Originally published on Towards AI.

Learn how Zero-Knowledge Proofs (ZKP) enable secure data sharing and protect user privacy in the context of Web 3.0.Introduction

Image by Gerd Altmann from Pixabay

As we move towards Web 3.0, protecting user data is becoming more crucial than ever. Traditional security measures have limitations, leaving room for potential breaches and attacks. One potential solution is using zero-knowledge proofs, a cryptographic technique that enables secure data sharing while protecting user privacy.

In this article, we’ll explore the use of zero-knowledge proofs in Web 3.0, discussing what they are, their benefits and applications, as well as their challenges and potential solutions. By the end, you’ll have a deeper understanding of how this technology can help improve privacy and security in Web 3.0.

What are Zero-Knowledge Proofs?

Zero-knowledge proofs are a type of cryptographic protocol that allows one party to prove to another party that a statement is true without revealing any additional information beyond the message itself. In other words, zero-knowledge proofs enable the verification of a statement without the need to disclose any supporting evidence or information.

The concept of zero-knowledge proofs was first introduced in the 1980s by computer scientists Shafi Goldwasser, Silvio Micali, and Charles Rackoff. Since then, zero-knowledge proofs have become a valuable tool in the field of cryptography, particularly for protecting user privacy.

How Do Zero-Knowledge Proofs Work?

Zero-knowledge proofs (ZKP) are a type of cryptographic protocol that allows one party (the prover) to demonstrate to another party (the verifier) that a particular statement is true without revealing any information beyond the validity of the statement itself.

The basic idea behind ZKP is that the prover has some private information that they want to keep secret, but they also want to prove to the verifier that they possess that information. The ZKP protocol achieves this by having the prover generate proof that demonstrates the validity of the statement, without revealing the underlying information itself.

There are several different methods for constructing ZKP protocols, but one of the most commonly used is known as the “interactive proof” method. In this approach, the prover and verifier engage in a series of interactions in which the prover sends messages to the verifier, and the verifier responds with challenges that the prover must answer correctly in order to prove the validity of the statement.

For example, suppose that the statement the prover wants to prove is that they know a password to a secure system. In this case, the ZKP protocol might proceed as follows:

  • The prover generates a “commitment” to the password, which is a cryptographically secure way of binding the password to a particular value that can be revealed later without being changed.
  • The prover sends the commitment to the verifier.
  • The verifier sends a “challenge” to the prover, which is a random string of characters that the prover must use to prove that they know the password.
  • The prover generates a response to the challenge by performing a series of calculations using the commitment and the challenge itself. This response is designed to be easily verified by the verifier but difficult for anyone else to compute without knowing the password.
  • The prover sends the response to the verifier.
  • The verifier checks the validity of the response by performing some calculations of their own using the commitment, the challenge, and the response. If the response is valid, then the verifier is convinced that the prover knows the password without actually learning the password itself.

Overall, ZKP protocols can be used for a wide variety of applications, ranging from authentication and identification to electronic voting and anonymous cryptocurrency transactions. By allowing parties to prove statements without revealing sensitive information, ZKP offers a powerful tool for enhancing privacy and security in a variety of contexts.

Understanding Different Types of Zero-Knowledge Proofs

Zero-knowledge proofs come in different types, each with a specific set of applications and use cases. Here are three types of zero-knowledge proofs and how they work:

  1. Interactive Zero-Knowledge Proofs: In this type of proof, the prover and verifier interact with each other to establish the validity of a statement without revealing any information beyond what is necessary. The prover makes a statement, and the verifier asks questions to confirm its validity. The prover’s response must be convincing enough to satisfy the verifier, but without revealing any additional information that could compromise the prover’s privacy. Interactive zero-knowledge proofs are useful in scenarios where a high level of security is required, such as in financial transactions, where one party may want to prove that they have sufficient funds without revealing the exact amount.
  2. Non-Interactive Zero-Knowledge Proofs: In a non-interactive proof, the prover generates a proof and sends it to the verifier, who can verify its validity without any further communication. This type of proof is useful in scenarios where communication between the prover and verifier is not possible or desirable, such as in online voting or auctions. Non-interactive zero-knowledge proofs are more efficient than interactive proofs because they require less communication overhead.
  3. Succinct Zero-Knowledge Proofs: A succinct zero-knowledge proof is a type of non-interactive zero-knowledge proof that requires minimal computational power to generate and verify. This makes it ideal for use in blockchain networks, where computational resources are limited. Succinct zero-knowledge proofs can prove the possession of certain information or the execution of a specific computation without revealing the information itself. For example, a user could prove that they have a certain amount of cryptocurrency without revealing their entire transaction history.

Each type of zero-knowledge proof has its own advantages and limitations, and the choice of which one to use depends on the specific use case and application. However, all types of zero-knowledge proofs aim to enable secure and private data sharing in Web 3.0.

Benefits of Zero-Knowledge Proofs in Web 3.0

Zero-knowledge proofs provide several advantages over traditional security measures in Web 3.0. Here are some of the benefits:

  1. Enhanced Privacy: With traditional security measures, users often have to reveal their personal information and data to prove their identity or access a particular resource. Zero-knowledge proofs enable users to prove their identity or possession of information without revealing any unnecessary personal information. This enhances privacy and keeps sensitive information secure.
  2. Improved Security: Traditional security measures often rely on passwords, which can be hacked or stolen, leaving personal information and data vulnerable to theft or misuse. Zero-knowledge proofs offer a more secure way to authenticate users and ensure that only authorized parties can access specific resources or data.
  3. Increased Efficiency: Zero-knowledge proofs can help reduce the time and effort required to authenticate users or prove ownership of data. This can be especially useful in scenarios such as financial transactions, where speed and efficiency are essential.
  4. Preventing Data Breaches and Identity Theft: In Web 3.0, data breaches and identity theft are significant concerns. Zero-knowledge proofs can help prevent these issues by providing a secure and private way to authenticate users and access data. By using zero-knowledge proofs, companies can ensure that user data is protected and that only authorized parties can access it.

With zero-knowledge proofs, users can feel confident that their personal information and data are secure while still enabling secure data sharing and collaboration.

Real-World Applications of Zero-Knowledge Proofs in Web 3.0

Zero-knowledge proofs are already being used in several real-world applications in Web 3.0 to provide privacy and security to users. Here are a few examples:

  • Decentralized Finance (DeFi): DeFi applications allow users to perform financial transactions without the need for traditional financial institutions. However, these transactions need to be private and secure. Zero-knowledge proofs can be used in DeFi applications to enable private transactions and ensure that sensitive financial information is kept confidential. For example, zero-knowledge proofs can be used to prove that a user has a certain amount of cryptocurrency in their wallet without revealing any additional information about the wallet or the user. This is achieved by using mathematical algorithms that allow the user to prove ownership of the cryptocurrency without revealing their identity or other personal information.
  • File Sharing: File sharing applications allow users to share files with others, but these files need to be secure and only accessible to authorized users. Zero-knowledge proofs can be used in file-sharing applications to ensure that files are only accessible to authorized users. For example, zero-knowledge proofs can be used to prove that a user has the necessary decryption key to access a file without revealing the key itself. This ensures that only authorized users can access the file while keeping the decryption key confidential.
  • Online Marketplaces: Online marketplaces allow users to buy and sell goods and services, but these transactions need to be private and secure. Zero-knowledge proofs can be used in online marketplaces to enable private transactions and ensure that sensitive information is kept confidential. For example, zero-knowledge proofs can be used to prove that a user has the necessary funds to make a purchase without revealing the user’s account balance or other financial information. This ensures that the transaction is private and secure while keeping the user’s financial information confidential.

Challenges and Limitations of Zero-Knowledge Proofs in Web 3.0

Zero-knowledge proofs (ZKPs) have emerged as a promising tool for Web 3.0 to enable secure and private interactions without compromising transparency. However, there are still several challenges and limitations that need to be addressed to fully realize the potential of ZKPs.

  • Scalability

The computationally intensive nature of ZKPs poses a challenge to scalability, making it difficult to handle large transaction volumes in real-time. Additionally, the complexity of ZKP verification contributes to this scalability challenge, as more complex proofs take longer to verify, leading to delays and reduced performance of decentralized applications.

To overcome these challenges, researchers are exploring various potential solutions, such as improving the ZKP protocol to enhance efficiency and ease of use. One such improvement is the adoption of zk-SNARKs, which offer higher efficiency and scalability compared to other ZKP protocols. Moreover, zk-SNARKs can be utilized to create “proofs of custody,” allowing secure custody of digital assets without involving a trusted third party.

Complexity

The creation of a ZKP requires specialized knowledge and expertise, which can pose a challenge for developers looking to integrate them into their applications. Moreover, the complexity of the ZKP protocol may create a barrier for end-users who may not have a complete understanding of how ZKPs function.

To enhance the computational efficiency of ZKPs, one possible solution is to harness technological advancements in hardware, including specialized processors like GPUs or ASICs. Additionally, researchers are exploring the implementation of layer-two solutions, such as sidechains and state channels, to alleviate the burden on the primary blockchain network and enhance the scalability of ZKPs.

Conclusion

Zero-knowledge proofs are an essential tool for protecting user privacy in Web 3.0. They enable secure data sharing without compromising personal information, prevent data breaches and identity theft, and promote trust and transparency in decentralized networks. While there are some challenges and limitations to using zero-knowledge proofs, advancements in technology and improved protocols offer potential solutions to these issues. As Web 3.0 continues to evolve, it is clear that zero-knowledge proofs will play a critical role in shaping the future of privacy and security on the web.

Join thousands of data leaders on the AI newsletter. Join over 80,000 subscribers and keep up to date with the latest developments in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

Published via Towards AI

Feedback ↓

Sign Up for the Course
`; } else { console.error('Element with id="subscribe" not found within the page with class "home".'); } } }); // Remove duplicate text from articles /* Backup: 09/11/24 function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag elements.forEach(el => { const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 2) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); */ // Remove duplicate text from articles function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag // List of classes to be excluded const excludedClasses = ['medium-author', 'post-widget-title']; elements.forEach(el => { // Skip elements with any of the excluded classes if (excludedClasses.some(cls => el.classList.contains(cls))) { return; // Skip this element if it has any of the excluded classes } const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 10) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); //Remove unnecessary text in blog excerpts document.querySelectorAll('.blog p').forEach(function(paragraph) { // Replace the unwanted text pattern for each paragraph paragraph.innerHTML = paragraph.innerHTML .replace(/Author\(s\): [\w\s]+ Originally published on Towards AI\.?/g, '') // Removes 'Author(s): XYZ Originally published on Towards AI' .replace(/This member-only story is on us\. Upgrade to access all of Medium\./g, ''); // Removes 'This member-only story...' }); //Load ionic icons and cache them if ('localStorage' in window && window['localStorage'] !== null) { const cssLink = 'https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css'; const storedCss = localStorage.getItem('ionicons'); if (storedCss) { loadCSS(storedCss); } else { fetch(cssLink).then(response => response.text()).then(css => { localStorage.setItem('ionicons', css); loadCSS(css); }); } } function loadCSS(css) { const style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); } //Remove elements from imported content automatically function removeStrongFromHeadings() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6, span'); elements.forEach(el => { const strongTags = el.querySelectorAll('strong'); strongTags.forEach(strongTag => { while (strongTag.firstChild) { strongTag.parentNode.insertBefore(strongTag.firstChild, strongTag); } strongTag.remove(); }); }); } removeStrongFromHeadings(); "use strict"; window.onload = () => { /* //This is an object for each category of subjects and in that there are kewords and link to the keywods let keywordsAndLinks = { //you can add more categories and define their keywords and add a link ds: { keywords: [ //you can add more keywords here they are detected and replaced with achor tag automatically 'data science', 'Data science', 'Data Science', 'data Science', 'DATA SCIENCE', ], //we will replace the linktext with the keyword later on in the code //you can easily change links for each category here //(include class="ml-link" and linktext) link: 'linktext', }, ml: { keywords: [ //Add more keywords 'machine learning', 'Machine learning', 'Machine Learning', 'machine Learning', 'MACHINE LEARNING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ai: { keywords: [ 'artificial intelligence', 'Artificial intelligence', 'Artificial Intelligence', 'artificial Intelligence', 'ARTIFICIAL INTELLIGENCE', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, nl: { keywords: [ 'NLP', 'nlp', 'natural language processing', 'Natural Language Processing', 'NATURAL LANGUAGE PROCESSING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, des: { keywords: [ 'data engineering services', 'Data Engineering Services', 'DATA ENGINEERING SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, td: { keywords: [ 'training data', 'Training Data', 'training Data', 'TRAINING DATA', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ias: { keywords: [ 'image annotation services', 'Image annotation services', 'image Annotation services', 'image annotation Services', 'Image Annotation Services', 'IMAGE ANNOTATION SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, l: { keywords: [ 'labeling', 'labelling', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, pbp: { keywords: [ 'previous blog posts', 'previous blog post', 'latest', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, mlc: { keywords: [ 'machine learning course', 'machine learning class', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, }; //Articles to skip let articleIdsToSkip = ['post-2651', 'post-3414', 'post-3540']; //keyword with its related achortag is recieved here along with article id function searchAndReplace(keyword, anchorTag, articleId) { //selects the h3 h4 and p tags that are inside of the article let content = document.querySelector(`#${articleId} .entry-content`); //replaces the "linktext" in achor tag with the keyword that will be searched and replaced let newLink = anchorTag.replace('linktext', keyword); //regular expression to search keyword var re = new RegExp('(' + keyword + ')', 'g'); //this replaces the keywords in h3 h4 and p tags content with achor tag content.innerHTML = content.innerHTML.replace(re, newLink); } function articleFilter(keyword, anchorTag) { //gets all the articles var articles = document.querySelectorAll('article'); //if its zero or less then there are no articles if (articles.length > 0) { for (let x = 0; x < articles.length; x++) { //articles to skip is an array in which there are ids of articles which should not get effected //if the current article's id is also in that array then do not call search and replace with its data if (!articleIdsToSkip.includes(articles[x].id)) { //search and replace is called on articles which should get effected searchAndReplace(keyword, anchorTag, articles[x].id, key); } else { console.log( `Cannot replace the keywords in article with id ${articles[x].id}` ); } } } else { console.log('No articles found.'); } } let key; //not part of script, added for (key in keywordsAndLinks) { //key is the object in keywords and links object i.e ds, ml, ai for (let i = 0; i < keywordsAndLinks[key].keywords.length; i++) { //keywordsAndLinks[key].keywords is the array of keywords for key (ds, ml, ai) //keywordsAndLinks[key].keywords[i] is the keyword and keywordsAndLinks[key].link is the link //keyword and link is sent to searchreplace where it is then replaced using regular expression and replace function articleFilter( keywordsAndLinks[key].keywords[i], keywordsAndLinks[key].link ); } } function cleanLinks() { // (making smal functions is for DRY) this function gets the links and only keeps the first 2 and from the rest removes the anchor tag and replaces it with its text function removeLinks(links) { if (links.length > 1) { for (let i = 2; i < links.length; i++) { links[i].outerHTML = links[i].textContent; } } } //arrays which will contain all the achor tags found with the class (ds-link, ml-link, ailink) in each article inserted using search and replace let dslinks; let mllinks; let ailinks; let nllinks; let deslinks; let tdlinks; let iaslinks; let llinks; let pbplinks; let mlclinks; const content = document.querySelectorAll('article'); //all articles content.forEach((c) => { //to skip the articles with specific ids if (!articleIdsToSkip.includes(c.id)) { //getting all the anchor tags in each article one by one dslinks = document.querySelectorAll(`#${c.id} .entry-content a.ds-link`); mllinks = document.querySelectorAll(`#${c.id} .entry-content a.ml-link`); ailinks = document.querySelectorAll(`#${c.id} .entry-content a.ai-link`); nllinks = document.querySelectorAll(`#${c.id} .entry-content a.ntrl-link`); deslinks = document.querySelectorAll(`#${c.id} .entry-content a.des-link`); tdlinks = document.querySelectorAll(`#${c.id} .entry-content a.td-link`); iaslinks = document.querySelectorAll(`#${c.id} .entry-content a.ias-link`); mlclinks = document.querySelectorAll(`#${c.id} .entry-content a.mlc-link`); llinks = document.querySelectorAll(`#${c.id} .entry-content a.l-link`); pbplinks = document.querySelectorAll(`#${c.id} .entry-content a.pbp-link`); //sending the anchor tags list of each article one by one to remove extra anchor tags removeLinks(dslinks); removeLinks(mllinks); removeLinks(ailinks); removeLinks(nllinks); removeLinks(deslinks); removeLinks(tdlinks); removeLinks(iaslinks); removeLinks(mlclinks); removeLinks(llinks); removeLinks(pbplinks); } }); } //To remove extra achor tags of each category (ds, ml, ai) and only have 2 of each category per article cleanLinks(); */ //Recommended Articles var ctaLinks = [ /* ' ' + '

Subscribe to our AI newsletter!

' + */ '

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

'+ '

Towards AI has published Building LLMs for Production—our 470+ page guide to mastering LLMs with practical projects and expert insights!

' + '
' + '' + '' + '

Note: Content contains the views of the contributing authors and not Towards AI.
Disclosure: This website may contain sponsored content and affiliate links.

' + 'Discover Your Dream AI Career at Towards AI Jobs' + '

Towards AI has built a jobs board tailored specifically to Machine Learning and Data Science Jobs and Skills. Our software searches for live AI jobs each hour, labels and categorises them and makes them easily searchable. Explore over 10,000 live jobs today with Towards AI Jobs!

' + '
' + '

🔥 Recommended Articles 🔥

' + 'Why Become an LLM Developer? Launching Towards AI’s New One-Stop Conversion Course'+ 'Testing Launchpad.sh: A Container-based GPU Cloud for Inference and Fine-tuning'+ 'The Top 13 AI-Powered CRM Platforms
' + 'Top 11 AI Call Center Software for 2024
' + 'Learn Prompting 101—Prompt Engineering Course
' + 'Explore Leading Cloud Providers for GPU-Powered LLM Training
' + 'Best AI Communities for Artificial Intelligence Enthusiasts
' + 'Best Workstations for Deep Learning
' + 'Best Laptops for Deep Learning
' + 'Best Machine Learning Books
' + 'Machine Learning Algorithms
' + 'Neural Networks Tutorial
' + 'Best Public Datasets for Machine Learning
' + 'Neural Network Types
' + 'NLP Tutorial
' + 'Best Data Science Books
' + 'Monte Carlo Simulation Tutorial
' + 'Recommender System Tutorial
' + 'Linear Algebra for Deep Learning Tutorial
' + 'Google Colab Introduction
' + 'Decision Trees in Machine Learning
' + 'Principal Component Analysis (PCA) Tutorial
' + 'Linear Regression from Zero to Hero
'+ '

', /* + '

Join thousands of data leaders on the AI newsletter. It’s free, we don’t spam, and we never share your email address. Keep up to date with the latest work in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

',*/ ]; var replaceText = { '': '', '': '', '
': '
' + ctaLinks + '
', }; Object.keys(replaceText).forEach((txtorig) => { //txtorig is the key in replacetext object const txtnew = replaceText[txtorig]; //txtnew is the value of the key in replacetext object let entryFooter = document.querySelector('article .entry-footer'); if (document.querySelectorAll('.single-post').length > 0) { //console.log('Article found.'); const text = entryFooter.innerHTML; entryFooter.innerHTML = text.replace(txtorig, txtnew); } else { // console.log('Article not found.'); //removing comment 09/04/24 } }); var css = document.createElement('style'); css.type = 'text/css'; css.innerHTML = '.post-tags { display:none !important } .article-cta a { font-size: 18px; }'; document.body.appendChild(css); //Extra //This function adds some accessibility needs to the site. function addAlly() { // In this function JQuery is replaced with vanilla javascript functions const imgCont = document.querySelector('.uw-imgcont'); imgCont.setAttribute('aria-label', 'AI news, latest developments'); imgCont.title = 'AI news, latest developments'; imgCont.rel = 'noopener'; document.querySelector('.page-mobile-menu-logo a').title = 'Towards AI Home'; document.querySelector('a.social-link').rel = 'noopener'; document.querySelector('a.uw-text').rel = 'noopener'; document.querySelector('a.uw-w-branding').rel = 'noopener'; document.querySelector('.blog h2.heading').innerHTML = 'Publication'; const popupSearch = document.querySelector$('a.btn-open-popup-search'); popupSearch.setAttribute('role', 'button'); popupSearch.title = 'Search'; const searchClose = document.querySelector('a.popup-search-close'); searchClose.setAttribute('role', 'button'); searchClose.title = 'Close search page'; // document // .querySelector('a.btn-open-popup-search') // .setAttribute( // 'href', // 'https://medium.com/towards-artificial-intelligence/search' // ); } // Add external attributes to 302 sticky and editorial links function extLink() { // Sticky 302 links, this fuction opens the link we send to Medium on a new tab and adds a "noopener" rel to them var stickyLinks = document.querySelectorAll('.grid-item.sticky a'); for (var i = 0; i < stickyLinks.length; i++) { /* stickyLinks[i].setAttribute('target', '_blank'); stickyLinks[i].setAttribute('rel', 'noopener'); */ } // Editorial 302 links, same here var editLinks = document.querySelectorAll( '.grid-item.category-editorial a' ); for (var i = 0; i < editLinks.length; i++) { editLinks[i].setAttribute('target', '_blank'); editLinks[i].setAttribute('rel', 'noopener'); } } // Add current year to copyright notices document.getElementById( 'js-current-year' ).textContent = new Date().getFullYear(); // Call functions after page load extLink(); //addAlly(); setTimeout(function() { //addAlly(); //ideally we should only need to run it once ↑ }, 5000); }; function closeCookieDialog (){ document.getElementById("cookie-consent").style.display = "none"; return false; } setTimeout ( function () { closeCookieDialog(); }, 15000); console.log(`%c 🚀🚀🚀 ███ █████ ███████ █████████ ███████████ █████████████ ███████████████ ███████ ███████ ███████ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ Towards AI is looking for contributors! │ │ Join us in creating awesome AI content. │ │ Let's build the future of AI together → │ │ https://towardsai.net/contribute │ │ │ └───────────────────────────────────────────────────────────────────┘ `, `background: ; color: #00adff; font-size: large`); //Remove latest category across site document.querySelectorAll('a[rel="category tag"]').forEach(function(el) { if (el.textContent.trim() === 'Latest') { // Remove the two consecutive spaces (  ) if (el.nextSibling && el.nextSibling.nodeValue.includes('\u00A0\u00A0')) { el.nextSibling.nodeValue = ''; // Remove the spaces } el.style.display = 'none'; // Hide the element } }); // Add cross-domain measurement, anonymize IPs 'use strict'; //var ga = gtag; ga('config', 'G-9D3HKKFV1Q', 'auto', { /*'allowLinker': true,*/ 'anonymize_ip': true/*, 'linker': { 'domains': [ 'medium.com/towards-artificial-intelligence', 'datasets.towardsai.net', 'rss.towardsai.net', 'feed.towardsai.net', 'contribute.towardsai.net', 'members.towardsai.net', 'pub.towardsai.net', 'news.towardsai.net' ] } */ }); ga('send', 'pageview'); -->