{"id":41478,"date":"2019-03-14T02:19:47","date_gmt":"2019-03-13T23:19:47","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=41478"},"modified":"2024-08-24T04:30:29","modified_gmt":"2024-08-24T01:30:29","slug":"securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/","title":{"rendered":"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof"},"content":{"rendered":"<p>In cryptography, a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Zero-knowledge_proof\" rel=\"noopener noreferrer\" target=\"_blank\">zero-knowledge proof<\/a> (ZKP) is a method by which one party can prove to another party that they know value <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">x<\/code>, without conveying any information apart from the fact that they know value <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">x<\/code>. We have already <a href=\"https:\/\/www.altoros.com\/blog\/zero-knowledge-proof-improving-privacy-for-a-blockchain\/\">written<\/a> about the general concepts surrounding ZKP and noninteractive ZKP, as well as provided some use cases for employing the protocol within a blockchain.<\/p>\n<p>This time, we examine one of the most prominent examples of noninteractive ZKP\u2014the <b>zk-SNARK<\/b> protocol, and how blockchain applications can make use of it. You will also learn how others major blockchain networks, such as <a href=\"https:\/\/www.altoros.com\/blog\/tag\/ethereum\/\">Ethereum<\/a> and <a href=\"https:\/\/www.altoros.com\/blog\/tag\/hyperledger\/\">Hyperledger<\/a>, use a noninteractive zero-knowledge proof to verify transactions.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#What_is_a_noninteractive_ZKP\" >What is a noninteractive ZKP?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#zk-SNARK_example_Zcash\" >zk-SNARK example: Zcash<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#zk-SNARK_example_Ethereum\" >zk-SNARK example: Ethereum<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#zk-SNARK_example_Hyperledger_Fabric\" >zk-SNARK example: Hyperledger Fabric<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#zk-SNARK_example_Hyperledger_Indy\" >zk-SNARK example: Hyperledger Indy<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#Want_details_Watch_the_video\" >Want details? Watch the video!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#Related_slides\" >Related slides<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#Further_reading\" >Further reading<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#About_the_author\" >About the author<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"What_is_a_noninteractive_ZKP\"><\/span>What is a noninteractive ZKP?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Non-interactive_zero-knowledge_proof\" rel=\"noopener noreferrer\" target=\"_blank\">Noninteractive zero-knowledge proofs<\/a> are those ZKPs that do not require interaction between a verifier and a prover. <em>Zero-knowledge succinct noninteractive argument of knowledge<\/em> (zk-SNARK) is a ZKP-based protocol with the following additional features:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\"><strong>Succinct<\/strong>. The size of the proof is small enough to be verified in a few milliseconds. <\/li>\n<li style=\"margin-bottom: 6px;\"><strong>Noninteractive<\/strong>. The proof transcript consists of a single message\u2014from the prover to the verifier. <\/li>\n<li><strong>Argument of knowledge<\/strong>. A computationally sound proof: soundness holds against the prover that leverages polynomial-time\u2014i.e., a bounded computation. <\/li>\n<\/ul>\n<p><em>zk-SNARK<\/em> consists of the three functions:<\/p>\n<ol>\n<li>A <strong>key generator<\/strong> (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">G<\/code>) takes a secret parameter (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">\u03bb<\/code>) and generates two publicly available keys\u2014a proving key (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">pk<\/code>) and a verification key (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">vk<\/code>).<\/li>\n<p>\t<center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-key-generator-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-key-generator-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41565\" \/><\/a><small>The key generator function<\/small><\/center><\/p>\n<li>The <strong>prover function<\/strong> (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">PF<\/code>) takes <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">pk<\/code> as an input, <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">x<\/code> as a common input, and <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">w<\/code> as a private input. The function generates a proof: <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">prf = PF(pk, x, w)<\/code>.<\/li>\n<p>\t<center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-prover-function-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-prover-function-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41574\" \/><\/a><small>The prover function<\/small><\/center><\/p>\n<li>The <strong>verifier function<\/strong> (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">VF<\/code>) computes <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">VF(vk, x, prf)<\/code>, which returns <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">Accept<\/code> if the proof is correct and <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">Reject<\/code> if it is not.<\/li>\n<p>\t<center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-verifier-function-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-verifier-function-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41573\" \/><\/a><small>The verifier function<\/small><\/center>\n<\/ol>\n<p>Note that the secret parameter <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">\u03bb<\/code> is used in the key generator. This parameter sometimes makes it tricky to use <em>zk-SNARK<\/em> in real-world applications. The reason for this is that anyone who knows <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">\u03bb<\/code> can generate fake proof (<code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">fake prf<\/code>), so that <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">VF(vk,x,fake prf)<\/code> evaluates to <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">Accept<\/code> without knowing the secret parameter. Thus, running the generator requires a very secure process to make sure no one learns about the parameter or saves it anywhere. <\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"zk-SNARK_example_Zcash\"><\/span>zk-SNARK example: Zcash<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To get a better understanding of zk-SNARK, we can look at <a href=\"https:\/\/z.cash\/technology\/zksnarks\/\" rel=\"noopener noreferrer\" target=\"_blank\">Zcash<\/a>, the first widespread application of zk-SNARK. In most public blockchains like Bitcoin, Ethereum, Bitshares, etc., transactions are validated by linking the sender and receiver addresses, as well as input and output values. Using zk-SNARK, Zcash is able to prove that a transaction is valid without disclosing critical information, such as addresses and values involved.<\/p>\n<p>The sender of a shielded transaction creates proof that shows (with a high probability) the following:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">The input values sum to the output values for each shielded transfer.<\/li>\n<li style=\"margin-bottom: 6px;\">The sender proves they have the private spending keys of the input notes. This gives the sender authority to spend shielded payments.<\/li>\n<li>The private spending keys of the input notes are cryptographically linked to a signature over the whole transaction. This protects the transaction from being modified by a party, which does not know the private keys.<\/li>\n<\/ul>\n<p>To determine what transactions are spendable, Bitcoin tracks unspent transaction outputs (UTXOs). In Zcash, the shielded equivalent of a UTXO is called a commitment. Spending a commitment involves revealing a nullifier. Zcash nodes keep lists of all the created commitments and revealed nullifiers. Commitments and nullifiers are stored as hashes to prevent revealing pertinent information.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zcash-commitments-nullifiers-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zcash-commitments-nullifiers-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41569\" \/><\/a><small>Commitments and nullifiers stored as hashes<\/small><\/center><\/p>\n<p>A commitment is published for each new note created by a shielded payment. This commitment consists of a hash, containing the recipient&#8217;s address, the amount being sent, a number unique to the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">rho<\/code> note, which can later derive the nullifier, and a random nonce.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zcash-hash-function-commitment-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zcash-hash-function-commitment-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41572\" \/><\/a><small>The hash function to find a commitment<\/small><\/center><\/p>\n<p>When a shield transaction is spent, the sender uses their spending key to publish a nullifier, which is the hash of <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">rho<\/code> from an existing unspent commitment, and also uses ZKP to prove they are able to spend it. The hash must be different from the set of nullifiers tracking spent transactions kept by every node in the blockchain.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zcash-hash-function-nullifier-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zcash-hash-function-nullifier-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41571\" \/><\/a><small>The hash function to find a nullifier<\/small><\/center><\/p>\n<p>The ZKP protocol for a shield transaction will verify the previous conditions, as well as the following:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">For each input note, a revealed commitment exists.<\/li>\n<li style=\"margin-bottom: 6px;\">The nullifiers and note commitments are computed correctly.<\/li>\n<li>It is infeasible for the nullifier of an output note to collide with the nullifier of any other note.<\/li>\n<\/ul>\n<p>Zcash utilizes a set of proving and verifying keys to create and check proofs in addition to the spending keys used to control addresses. These keys are generated in the public parameter ceremony and then distributed to the participants of the Zcash network.<\/p>\n<p>The sender uses their proving keys to ensure that their inputs are valid for each shield transaction. Miners check the shielded transactions follow consensus rules by validating the prover&#8217;s computation with the verifying key.<\/p>\n<p>The prover does more work up-front in Zcash&#8217;s proof generation. However, this simplifies the verifying process enabling transactions to be verified in milliseconds.<\/p>\n<p>Next, we take a look at how Ethereum and Hyperledger (Fabric and Indy) utilize noninteractive ZKP to validate transactions.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"zk-SNARK_example_Ethereum\"><\/span>zk-SNARK example: Ethereum<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In September 2018, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Vitalik_Buterin\" rel=\"noopener noreferrer\" target=\"_blank\">Vitalik Buterin<\/a> published an <a href=\"https:\/\/ethresear.ch\/t\/on-chain-scaling-to-potentially-500-tx-sec-through-mass-tx-validation\/3477\" rel=\"noopener noreferrer\" target=\"_blank\">article<\/a> about on-chain scaling to potentially 500 transactions per second. This was a solution based on zk-SNARK.<\/p>\n<p>The main idea is to scale asset transfer transactions on Ethereum by a huge amount without using layer 2, which introduces liveness assumptions, but through employing ZK-SNARKs to mass-validate transactions. There are two classes of users\u2014a <em>transactor<\/em> and a <em>relayer<\/em>.<\/p>\n<p>A <em>relayer<\/em> takes a set of operations from transactors and combines them all into a transaction. The relayer then makes a zk-SNARK proof to prove the validity and publishes the zk-SNARK proof, as well as the transaction data in a highly compressed form to blockchain. A relayer gets rewarded for this by transaction fees from transactors.<\/p>\n<p>In this case, the cost of a zk-SNARK verification with the latest protocols is about 600,000 gas with an additional 50,000 gas for overhead. The main goal for zk-SNARK implementation in the Ethereum blockchain is to reduce the total transaction cost.<\/p>\n<p>The AZTEC team has implemented a ZKP-based solution on a smart-contract level in the Ethereum blockchain. You can use private transactions in Ethereum with an AZTEC smart contract via the <code style=\"color: #222222; background-color: #e6e6e6; padding: 1px 2px;\">confidentialTransfer<\/code> function. A standard AZTEC zero-knowledge transaction costs between 800,000\u2013900,000 gas.<\/p>\n<p>The <a href=\"https:\/\/aztec.network\/index.html\" rel=\"noopener noreferrer\" target=\"_blank\">AZTEC protocol<\/a> utilizes a cutting-edge ZKP to enable private transactions on Ethereum. This allows for the logic of transactions to be validated, while keeping the values encrypted.<\/p>\n<p>The AZTEC protocol smart contract validator ratifies a unique zero-knowledge proof that determines the legitimacy of a transaction via a combination of <em>homomorphic encryption<\/em> and <em>range proofs<\/em>.<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\"><b>Homomorphic encryption<\/b> allows the AZTEC protocol to perform mathematical operations with ciphertexts and get an encrypted result that corresponds to the result of mathematical operations with plaintexts. For example, a person can add two encrypted numbers without knowing the decrypted numbers. Then, another person can decrypt the encrypted sum of numbers without having numbers. <\/li>\n<li><b>Range proof<\/b> enables the AZTEC protocol to validate that a secret number is within known limits without disclosing the secret number. <\/li>\n<\/ul>\n<p>The AZTEC protocol also provides additional features, such as confidential representations of the ERC20 tokens, fully confidential digital assets, and decentralized confidential exchanges.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"zk-SNARK_example_Hyperledger_Fabric\"><\/span>zk-SNARK example: Hyperledger Fabric<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/hyperledger-fabric.readthedocs.io\/en\/release-1.2\/idemix.html\" rel=\"noopener noreferrer\" target=\"_blank\">Identity Mixer<\/a> (Idemix) is a noninteractive ZKP-based cryptographic protocol suite developed by IBM Research for privacy-preserving authentication and transfer of certified attributes.<\/p>\n<p><b>Idemix<\/b> works in a similar way as client certificates in a classical public-key infrastructure (PKI), but with two important differences:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\"><em>Flexible public keys<\/em>. Rather than being bound to a single public key, users can have many independent public keys, called pseudonyms, for the same secret key, so that they can use a different pseudonym for each verifier or even for each session. <\/li>\n<li><em>Flexible credentials<\/em>. The credentials that certify the user\u2019s attributes can be transformed into valid tokens for any of the user\u2019s pseudonyms that contain only a subset of the attributes in the original credential. The transformed token remains verifiable under the issuer\u2019s public verification key. <\/li>\n<\/ul>\n<p>Classical digital signatures cannot provide this sort of flexibility. <b>Idemix<\/b> relies on the <em>Camenisch-Lysyanskaya (CL) signature scheme<\/em> specifically designed to have efficient zero-knowledge proofs, which are cryptographic mechanisms to prove that one knows a valid signature with certain properties without having to reveal the signature itself.<\/p>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/hyperledger-fabric-v1-2-whats-new-and-roadmap-for-2018\/\">Fabric<\/a> is one of the most popular Hyperledger frameworks for the blockchain technology, which also integrates Idemix.<\/p>\n<p>Fabric\u2019s implementation of Idemix consists of three components:<\/p>\n<ul>\n<li style=\"margin-bottom: 6px;\">A core Idemix cryptopackage (in Golang) that implements basic cryptographic algorithms (key generation, signing, verification, and zero-knowledge proofs).<\/li>\n<li style=\"margin-bottom: 6px;\">MSP implementation for signing and verifying the transactions using the Identity Mixer cryptopackage.<\/li>\n<li>A CA service for issuing E-cert credentials using the Identity Mixer cryptopackage.<\/li>\n<\/ul>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-architecture-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-architecture-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41570\" \/><\/a><small>The Idemix architecture within Fabric<\/small><\/center><\/p>\n<p>Fabric with the Idemix protocol provides strong authentication, as well as privacy-preserving features. It offers anonymity, the ability to transact without revealing the identity of the transactor, as well as unlinkability, the ability of a single identity to send multiple transactions without revealing that the transactions were sent by the same identity.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"zk-SNARK_example_Hyperledger_Indy\"><\/span>zk-SNARK example: Hyperledger Indy<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/hyperledger-incubates-the-indy-project-to-address-identity-management\/\">Hyperledger Indy<\/a> is a distributed ledger, purpose-built for decentralized identity. The framework provides a software ecosystem for private, secure, and powerful identity. Indy puts people, not the organizations that traditionally serve as central authority, in charge of decisions about their own privacy and disclosure. This enables all kinds of rich innovations, such as connection contracts, revocation, novel payment workflows, asset and document management features, creative forms of escrow, curated reputation, integrations with other cool technologies, etc.<\/p>\n<p>Indy uses an open-source, distributed ledger technology. These ledgers are a form of a database that is provided cooperatively by a pool of participants, instead of by a giant database with a central admin. Data lives redundantly in many places, and it accrues in transactions orchestrated by many machines with strong, industry-standard cryptography protecting it.<\/p>\n<p>The solution relies on <em>Indy-anoncreds<\/em>, a ZKP based on the Idemix protocol, to cryptographically secure credentials. The workflow of <em>Indy-annoncreds<\/em> begins with the prover creating a master key. This master key is used to guarantee that a credential uniquely belongs to the prover.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-creating-a-master-key-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-creating-a-master-key-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41568\" \/><\/a><small>Creating a master key<\/small><\/center><\/p>\n<p>The issuer sends a credential offer to the prover, who then creates and sends a credential request, which is signed using the prover\u2019s master key.<\/p>\n<p>Once the issuer receives the signed credential request, he\/she creates a credential for the prover and signs it using the issuer\u2019s private key. (The issuer\u2019s public key is available in the public ledger for other participants.) The signed credential is then sent to the prover.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-creating-credentials-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-creating-credentials-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41566\" \/><\/a><small>Creating, requesting, and issuing credentials<\/small><\/center><\/p>\n<p>Next, the verifier sends a proof request to the prover, who in its turn creates and sends the proof back, which the verifier validates using the issuer\u2019s public key.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-requesting-credentials-v4.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-idemix-requesting-credentials-v4.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-41567\" \/><\/a><small>Presenting credentials<\/small><\/center><\/p>\n<p>As we can see, ZKP can provide much needed privacy for blockchain transactions requiring confidentiality. Furthermore, when a blockchain transaction needs to be validated, but the verifier has no access to the prover, organizations can still rely on noninteractive ZKP, such as zk-SNARK. This way, data privacy remains intact, and it only takes milliseconds to verify the transaction.<\/p>\n<p>If you want to learn more about ZKP and zk-SNARK, check out our comprehensive <a href=\"https:\/\/www.altoros.com\/research-papers\/zero-knowledge-proof-verifying-blockchain-transactions-with-less-risk\/\">research paper<\/a> on the topic. It also describes the computational model and formal definition of an interactive proof protocol, as well explains how to implement Idemix in Go.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Want_details_Watch_the_video\"><\/span>Want details? Watch the video!<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><small>During a <a href=\"https:\/\/www.meetup.com\/Blockchain-IoT-Meetup\/events\/256998618\/\" rel=\"noopener noreferrer\" target=\"_blank\">blockchain meetup<\/a> in Berlin, Dmitry Lavrenov of Altoros explained the concepts surrounding ZKP in more detail.<\/small><\/p>\n<p><center><script src=\"https:\/\/fast.wistia.com\/embed\/medias\/keiuw0laf1.jsonp\" async><\/script><script src=\"https:\/\/fast.wistia.com\/assets\/external\/E-v1.js\" async><\/script><\/p>\n<div class=\"wistia_embed wistia_async_keiuw0laf1\" style=\"height:360px;position:relative;width:640px\">\n<div class=\"wistia_swatch\" style=\"height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;transition:opacity 200ms;width:100%;\"><\/div>\n<\/div>\n<p><\/center><\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Related_slides\"><\/span>Related slides<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><center><iframe loading=\"lazy\" src=\"\/\/www.slideshare.net\/slideshow\/embed_code\/key\/eKJJttstcXXbmL\" width=\"595\" height=\"485\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" style=\"border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;\" allowfullscreen> <\/iframe><\/center><\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/zero-knowledge-proof-improving-privacy-for-a-blockchain\/\">A Zero-Knowledge Proof: Improving Privacy on a Blockchain<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/research-papers\/zero-knowledge-proof-verifying-blockchain-transactions-with-less-risk\/\">Zero-Knowledge Proof: Verifying Blockchain Transactions with Less Risk<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/making-blockchain-comply-with-gdpr-challenges-and-fixes\/\">Making Blockchain Comply with GDPR: The Challenges and Fixes<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/blockchain-for-insurance-reduced-fraud-and-streamlined-claims\/\">Blockchain for Insurance: Less Fraud, Faster Claims, and New Models<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"About_the_author\"><\/span>About the author<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>\n<div style=\"float: right;\"><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Dmitry-Lavrenov-bio.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/01\/Dmitry-Lavrenov-bio.png\" alt=\"\" width=\"140\" class=\"alignright size-full wp-image-40667\" \/><\/a><\/div>\n<div style=\"width: 600px;\"><small><b>Dmitry Lavrenov<\/b> is Senior Blockchain R&#038;D Engineer at Altoros. With a profound expertise in cryptography, he is knowledgeable about encryption algorithms, cryptanalysis, hash functions, and digital signatures. Dmitry is experienced in developing solutions based on Ethereum, EOS.IO, and Hyperledger Fabric for FinTech, healthcare, and other industries. He also possesses practical skills in synthesis and cryptanalysis of block and stream encryption algorithms, as well as in reverse engineering, analysis of software implementations, and malware analysis.<\/small><\/div>\n<\/div>\n<hr \/>\n<p><center><small>This blog post was written by <b>Dmitry Lavrenov<\/b>;<br \/>\nedited and published by <a href=\"https:\/\/www.altoros.com\/blog\/author\/carlo\/\">Carlo Gutierrez<\/a>, <a href=\"https:\/\/www.altoros.com\/blog\/author\/sophie.turol\/\">Sophia Turol<\/a>, and <a href=\"https:\/\/www.altoros.com\/blog\/author\/alex\/\">Alex Khizhniak<\/a>.<\/small><\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In cryptography, a zero-knowledge proof (ZKP) is a method by which one party can prove to another party that they know value x, without conveying any information apart from the fact that they know value x. We have already written about the general concepts surrounding ZKP and noninteractive ZKP, as [&#8230;]<\/p>\n","protected":false},"author":32,"featured_media":41578,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[672,807,753],"class_list":["post-41478","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-blockchain","tag-ethereum","tag-hyperledger"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Securing a Blockchain with a Noninteractive Zero-Knowledge Proof | Altoros<\/title>\n<meta name=\"description\" content=\"The concept (also known as zk-SNARK) enables transactions to be verified in a single message from a prover to a verifier\u2014without interaction between them.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof | Altoros\" \/>\n<meta property=\"og:description\" content=\"In cryptography, a zero-knowledge proof (ZKP) is a method by which one party can prove to another party that they know value x, without conveying any information apart from the fact that they know value x. We have already written about the general concepts surrounding ZKP and noninteractive ZKP, as [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-13T23:19:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-24T01:30:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Carlo Gutierrez\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Gutierrez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/\",\"name\":\"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif\",\"datePublished\":\"2019-03-13T23:19:47+00:00\",\"dateModified\":\"2024-08-24T01:30:29+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/833e109f77de753b2b472dca0236b442\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/833e109f77de753b2b472dca0236b442\",\"name\":\"Carlo Gutierrez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg\",\"caption\":\"Carlo Gutierrez\"},\"description\":\"Carlo Gutierrez is a Technical Writer at Altoros. As part of the editorial team, his focus has been on emerging technologies such as Cloud Foundry, Kubernetes, blockchain, and the Internet of Things. Prior to Altoros, he primarily wrote about enterprise and consumer technology. Carlo has over 12 years of experience in the publishing industry. Previously, he served as an Editor for PC World Philippines and Questex Asia, as well as a Designer for Tropa Entertainment.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/carlo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof | Altoros","description":"The concept (also known as zk-SNARK) enables transactions to be verified in a single message from a prover to a verifier\u2014without interaction between them.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/","og_locale":"en_US","og_type":"article","og_title":"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof | Altoros","og_description":"In cryptography, a zero-knowledge proof (ZKP) is a method by which one party can prove to another party that they know value x, without conveying any information apart from the fact that they know value x. We have already written about the general concepts surrounding ZKP and noninteractive ZKP, as [...]","og_url":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/","og_site_name":"Altoros","article_published_time":"2019-03-13T23:19:47+00:00","article_modified_time":"2024-08-24T01:30:29+00:00","og_image":[{"width":640,"height":360,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif","type":"image\/gif"}],"author":"Carlo Gutierrez","twitter_misc":{"Written by":"Carlo Gutierrez","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/","url":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/","name":"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif","datePublished":"2019-03-13T23:19:47+00:00","dateModified":"2024-08-24T01:30:29+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/833e109f77de753b2b472dca0236b442"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/03\/blockchain-zkp-zk-snark-noninteractive-v5.gif","width":640,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/securing-a-blockchain-with-a-noninteractive-zero-knowledge-proof\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Securing a Blockchain with a Noninteractive Zero-Knowledge Proof"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/833e109f77de753b2b472dca0236b442","name":"Carlo Gutierrez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2021\/02\/CG_portrait-2-96x96.jpg","caption":"Carlo Gutierrez"},"description":"Carlo Gutierrez is a Technical Writer at Altoros. As part of the editorial team, his focus has been on emerging technologies such as Cloud Foundry, Kubernetes, blockchain, and the Internet of Things. Prior to Altoros, he primarily wrote about enterprise and consumer technology. Carlo has over 12 years of experience in the publishing industry. Previously, he served as an Editor for PC World Philippines and Questex Asia, as well as a Designer for Tropa Entertainment.","url":"https:\/\/www.altoros.com\/blog\/author\/carlo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/41478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=41478"}],"version-history":[{"count":56,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/41478\/revisions"}],"predecessor-version":[{"id":67811,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/41478\/revisions\/67811"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/41578"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=41478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=41478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=41478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}