// inside head tag

Institutional Privacy on Public Blockchains: Technical Foundations, Challenges, and the Path to Adoption

Introduction

Public blockchains are increasingly becoming a credible infrastructure for financial services. Tokenized assets, stablecoins, collateral flows, fund units, and other financial instruments can be issued and transferred under deterministic rules, across borders, and through always-on settlement rails, whether on a Layer 1 (L1) such as Ethereum, or on Layer 2 (L2) scaling networks built on top of it. For institutions, this creates a path toward more programmable, interoperable, and efficient financial infrastructure.

Public rails also introduce a fundamental tension. The same transparency that makes blockchains verifiable also makes financial activity observable. Balances, transfers, counterparties, and interaction patterns can often be reconstructed from public data. For institutional use cases, this is not a minor limitation. Treasury positions, customer flows, trading strategies, and payment activity are commercially sensitive and often subject to regulatory and governance constraints.

Privacy therefore, cannot be treated as an optional feature for institutional blockchain adoption. Institutions need to preserve confidentiality of financial activity but they also need accountability for compliance control.

This post is the first in a series on Nethermind's privacy work. The series starts from a simple thesis:

Privacy is a core requirement for bringing real-world financial services onto public rails.

Different institutional use cases, however, require different privacy models. Some require confidentiality around individual asset transfers; others require private application logic, dedicated execution environments, or infrastructure that gives institutions stronger control over how sensitive data is processed and disclosed.

In the series, we will show how Nethermind builds privacy-preserving systems at each of these layers, across different institutional use cases.

This first post begins at the application layer. We map the main technical approaches to blockchain privacy and explain how different privacy models fit into the stack. We then focus on zero-knowledge proofs (ZKPs) as a pragmatic starting point. Concretely, we show how existing tokens can be deposited into a private pool, transferred privately, and withdrawn back to the public ledger while preserving public verifiability.

We close by outlining the importance for institutions of reconciling compliance requirements with privacy-preserving solutions deployed on public blockchains, a topic the next posts in this series will address.

Privacy solutions

No single mechanism delivers privacy on public blockchains. Different use cases require different assumptions about confidentiality, computation, trust, performance, compliance, and infrastructure control.

A useful way to map the space is to separate three questions:

  1. what you want to keep private (the use case);
  2. how private information is protected or verified (the cryptographic primitive);
  3. where privacy is enforced in the stack (the privacy model).

These three lenses are largely orthogonal. The same primitive can serve different use cases, and the same use case can be deployed under different models. They are not entirely independent, though.

Use cases

Three recurring privacy patterns are especially relevant in real-world use cases:

  • Private transfers. Hide the sensitive details of a trade (amounts, sender, receiver, and the link between them) while still proving that the transfer is legitimate.
  • Private state manipulation. Run application logic over hidden state that is shared across multiple parties: confidential order matching, sealed-bid auctions, private AMMs, encrypted limits, or risk checks computed over values no single participant should see in the clear.
  • Confidential data sharing. Control access to confidential data and under what conditions: scoped viewing access for an auditor or counterparty, selective disclosure to a regulator, or encrypted records that only authorized parties can decrypt. This concerns governing visibility rather than computing or transferring value.

Cryptographic primitives

The main cryptographic primitives used to build privacy-preserving systems today, beyond standard encryption mechanisms, are:

  • Zero-Knowledge Proofs (ZKP): allow a prover to convince a verifier that a statement is true without revealing the underlying data. ZKPs are the foundation technology of private transfers on public chains, most notably pioneered by the Zcash protocol through the concept of shielded pools. In these systems, ZKPs are used to prove that a transfer is valid, authorized, non-inflationary, and consistent with protocol rules, without exposing confidential details such as counterparties or transferred amounts. On Ethereum, this approach has been adapted by protocols like Tornado Cash, Railgun, Privacy Pools, and ZK Protocol. These solutions use smart contracts to manage confidential state and verify ZKPs onchain.
  • Fully Homomorphic Encryption (FHE): allows arbitrary computation over encrypted data. FHE is attractive for use cases where privacy extends beyond transfers to logic over hidden values, e.g., private limits, encrypted balances, confidential risk checks, or private order matching. The trade-off is that FHE remains comparatively new for blockchain applications, with important constraints around performance, tooling, key management, and standardization. Efforts in this direction already exist: Zama is a confidential blockchain protocol that introduces an FHE-based Ethereum Virtual Machine (EVM), the fhEVM, for confidential smart contract computation.
  • Trusted Execution Environments (TEEs): provide confidentiality through hardware-isolated execution. Code and data are processed inside a protected enclave, while the surrounding infrastructure cannot directly inspect them. TEEs can be useful where institutions already rely on secure infrastructure assumptions, such as controlled compute environments, HSM-backed workflows, or permissioned operator models. Inco Lightning combines TEE-based confidential computation with onchain settlement. The trade-off is that security depends on hardware guarantees, and on the added infrastructure cost and maintenance they require.
  • Multi-Party Computation (MPC) and Collaborative SNARKs: MPC allows multiple parties to jointly compute over private inputs without revealing those inputs to one another. When combined with collaborative SNARKs, proof generation itself can be distributed across participants. This is useful for workflows where no single party should hold all sensitive data, keys, or disclosure authority. TACEO is a notable project developing collaborative SNARK infrastructure for this purpose.

Privacy models

Privacy models describe where privacy is enforced in the stack using one or more cryptographic primitives. The main deployment models are:

  • Application-Level Privacy: Privacy implemented at the blockchain application layer, commonly via smart contracts. A shielded pool is the canonical example, where assets are deposited into a contract, ownership is represented through cryptographic commitments, and transfers are verified with ZKP. In this model, no one but the user can see the data.
  • Privacy Groups: Privacy is enforced inside a dedicated private domain (a privacy group) on top of an existing settlement layer. State and execution are shared only among authorized participants, while the public chain stores commitments or encrypted anchors for verification. Group members can see the domain's data, while external observers see only the public anchors. This model works well in consortium and enterprise settings with strong operational control and governance hooks. Paladin is a notable open source framework for programmable privacy on EVM chains. It supports private smart contract execution via offchain privacy groups. The same principle is applied by the Canton Network, a privacy-enabled L1 for financial use cases, whose confidentiality is achieved through independent sub-networks. Each participant only sees the parts of a trade relevant in the sub-network it is party to.
  • Privacy-Preserving Rollups: Privacy is embedded into an L2 execution environment. Private state is committed and proven using cryptographic techniques, while the rollup anchors the private state on the public chain. In this model, the rollup becomes a shared privacy domain where private applications are composable. Examples are Aztec and Miden, which bring programmable privacy to Ethereum. A different yet relevant approach is taken by Starknet, a general-purpose L2 that introduces privacy at the application level via the STRK20 framework, a ZK shielded pool that brings privacy and compliance to any ERC-20 token on Starknet.
  • Validiums: Privacy achieved by data segregation under a central operator (or a consortium of operators). A standalone, permissioned L2 uses validity proofs for correctness while keeping transaction data offchain, and combines this with role-based access control to govern who may read state. The operator and permissioned roles can see the data, while the public chain still verifies correctness; the trade-off is that users must trust the operator for data availability, access policy, and recovery (or keep their own local records). In effect, validiums are permissioned rollups whose confidentiality comes from withholding data rather than hiding it cryptographically. An example of this model is Prividium (zkSync), an instantiation of a validium for institutional enterprises with role-based access controls and selective disclosure.

Choosing the right model

Choosing the right privacy model depends on the use case, the infrastructure trust assumptions (how privacy is achieved), and the visibility model (who sees the data).

At a high level:

  • Private transfers are the most natural fit for ZKPs (via shielded-pool designs). Users prove valid spends in zero knowledge without revealing amounts or counterparties to external observers.
  • Private computation over shared state is harder, because several parties may need to read or update the same hidden state. In this setting, ZKPs alone are usually not enough, as they do not by themselves solve coordination over shared encrypted state. These use cases often require FHE, MPC, TEEs, or hybrid architectures with distinct trade-offs on trust assumptions and data visibility.
  • Confidential data sharing is mainly about who can decrypt or view information, and under which policy.

The table below summarizes how the main privacy models apply to these use cases.

Use case / Privacy model Application-Level Privacy Privacy Groups Privacy-Preserving Rollups Validiums
Private transfers

How: shielded pools deployed on the chain where the asset lives; ZKPs prove valid spends.

Who sees data: users control their own transfers; optional viewing-key holders can inspect selected data.

How: private transfers execute inside a permissioned private domain.

Who sees data: group members.

How: private transfers execute inside a dedicated L2 using cryptographic tools like ZKP or FHE, depending on the L2 state model.

Who sees data: users keep private state; L2 operators should not see private transfer details.

How: private transfers data and execution held offchain.

Who sees data: data visibility depends on the operator and access-control rules.

Private computation over shared state

How: possible with FHE, MPC, TEEs, or ZK with a specialized application logic.

Who sees data: depends on the primitive and eventual key-management model.

How: shared private logic runs inside the group environment.

Who sees data: group members, or authorized participants.

How: private logic may be split between user-held private state and public/shared state.

Who sees data: user-private state remains hidden; shared/public state is visible according to the rollup model.

How: computation runs over offchain state with onchain validity proofs for settlement.

Who sees data: the operator and authorized data holders can access the underlying state.

Confidential data sharing

How: encrypted transfers with viewing keys and selective disclosure.

Who sees data: only authorized key holders, such as users, auditors, counterparties, or regulators.

How: data access is controlled by group membership and disclosure policy.

Who sees data: group members and explicitly authorized external parties.

How: viewing keys and disclosure mechanisms.

Who sees data: holders of the relevant viewing or disclosure keys.

How: role-based access and selective disclosure over offchain data.

Who sees data: permissioned roles according to the validium's access policy.

The matrix shows that there is no universal privacy solution, and choosing the right model depends deliberatey on the use calse and the acceptable trade-offs.

In this post, we start from a shielded-pool design for application-level privacy. Shielded pools are a pragmatic starting point: they are compatible with existing onchain assets (e.g., ERC-20s on Ethereum), preserve public verifiability, and demonstrate that private transfers can be engineered today on public blockchain infrastructure. They are not the whole privacy design space, but they are the first building block; across this Nethermind privacy series, we will explore the rest of the design space and show how privacy solutions can be delivered across the other models.

Privacy at the application layer: shielded pools as a building block

A "shielded pool" is a smart contract that escrow assets and maintains an encrypted, commitment-based representation of ownership (i.e., notes), while enforcing transfer correctness via ZK proofs.

The protocol follows a common pattern:

  1. deposit assets (e.g., ERC-20, ERC-721 tokens on Ethereum) into the shielded pool contract;
  2. transfer privately (or shielded transfer) within the pool by spending existing notes and creating new ones;
  3. withdraw back to the public ledger to a standard Ethereum address.

Before exploring protocol mechanics, we outline the core concepts, technological components, and roles within the system.

The UTXO model

The UTXO model is a foundational concept in blockchain systems, like Bitcoin and Zcash. In this model, assets are represented as discrete outputs (i.e., UTXOs), each of which can be spent only once. These outputs are generalized as records that encapsulate value and ownership while hiding sensitive details from the public.

A user's balance is determined by the amount of "spendable" UTXOs (or notes) available in their wallet. Figure 1 shows a transaction between two users, Alice and Bob.

Figure 1. The UTXO model. Alice spends her existing UTXOs to pay Bob and creates a change output for herself.

Alice owns two UTXOs that sum to 15 coins. Bob owns two UTXOs that sum to 10 coins. Alice wants to send funds to Bob. She consumes one or more of her existing UTXOs as inputs to a transaction and creates new UTXOs as outputs, one for Bob (the payment) and one for herself (as change). Each UTXO records an amount and a locking script (or public key), and ownership is transferred by satisfying the conditions of the previous output and creating new outputs for the recipients. This approach ensures that assets cannot be double-spent and that every transfer is independently verifiable.

In a transparent UTXO model, such as Bitcoin, all transaction outputs, inputs, and balances are publicly visible and directly linked to addresses, making it possible to trace asset flows and reconstruct user activity. In contrast, a privacy-preserving UTXO model like Zcash, hides sensitive details by recording only cryptographic commitments to UTXOs. Balances and transaction linkages remain confidential. Commitments cannot be linked to specific senders or recipients, and user balances are never exposed. Each UTXO is protected against double-spending by a unique nullifier, which is revealed only when the note is spent, preserving integrity without sacrificing anonymity.

Privacy-preserving UTXO model

A privacy-preserving UTXO model adapts the UTXO concept so that value and ownership stay confidential on a public chain. We first set out the properties and trust model, and then we present the underlying cryptographic components.

Properties and trust model

The protocol provides privacy and integrity using verifiable ZK proofs. There is no trusted third party required for core protocol security. Users trust that:

  • The ZK proof system is sound (no valid proof can be constructed for an invalid statement);
  • The smart contract correctly enforces verification, nullifier uniqueness, and Merkle root updates;
  • The encryption scheme protecting encrypted notes is secure under standard assumptions;
  • The hash function used for commitments and nullifiers is collision-resistant and behaves as a pseudorandom function in the relevant domain.

The core security and privacy properties of the protocol are:

Property Description
Confidentiality Notes are hidden from public observers. Only the viewing key owner can decrypt and read note contents.
Sender Anonymity The sender's identity is hidden within the anonymity set of all existing notes in the pool.
Receiver Anonymity Output note commitments are unlinkable to the recipient's public identity. Encrypted notes are posted onchain, but only the intended recipient can identify and decrypt them.
Unlinkability There is no public link between a deposit and a subsequent withdrawal, or between the sender and receiver of a shielded transfer, beyond what is revealed by timing or amount patterns.
Integrity (Double-Spend Prevention) Each note has a unique nullifier derived from the spending key and the note commitment. The pool contract maintains a set of all revealed nullifiers; any attempt to re-spend a note is rejected onchain.
Integrity (Value Conservation) The ZK proof enforces that the sum of input note values equals the sum of output note values, preventing inflation or unauthorized token minting within the pool.
Public Verifiability All proofs are verified onchain by the pool contract. Any observer can confirm that every state transition was accompanied by a valid proof, without needing access to private data.

Components

Implementing a privacy-preserving UTXO model on a public chain requires different cryptographic components.

User Key Material: Users are assigned two types of cryptographic keys:

  • Spending Key: The spending key is a secret key that authorizes spending of notes. From the spending key, a public key is derived using a ZK friendly hash function user_pk = hash(spend_sk). This public key is used in note commitments to ensure ownership and spending rights in a ZK circuit.
  • Viewing Key: The viewing key is a key pair used to enable note discovery and decryption. When a note is created, its details are encrypted and posted onchain as an encrypted note. Typically, encryption is performed using ECDH key agreement between the sender and recipient, ensuring that only the intended recipient (or an authorized auditor with the viewing key) can decrypt and view the note's contents.

Notes: A note is the shielded equivalent of a UTXO.

Note = (
 token, // token representation, e.g., an ERC-20 contract address
 user_pk, // recipient address public key (derived from spending key)
 v, // value, represents an amount of token
 rcm // commitment randomness
)

The pool contract stores only a cryptographic commitment to each note in a Merkle tree; the leaves of the tree are note commitments cm = hash(token, user_pk, v, rcm), not the plaintext data. The tree root is updated each time a new valid note is appended.

Nullifiers: To prevent double-spending, each note has a unique nullifier. The nullifier is derived as a pseudorandom function of the note and the spending key.

nf = hash(spend_sk, cm)

When a note is spent, its nullifier is revealed and recorded onchain in the shielded pool smart contract; any attempt to spend a note with a previously used nullifier is rejected.

Encrypted Notes: When a note is created, its details are encrypted and emitted onchain (e.g., Ethereum's onchain event). Recipients use their viewing key to scan for and decrypt these encrypted notes, discovering new incoming notes without revealing their identity or balances to the public.

Proofs: ZKPs are used to prove, without revealing sensitive information, that a shielded transfer is valid according to the protocol rules defined in a ZK circuit, such as a program encoding the those rules. To generate a ZKP, the circuit runs over public inputs (visible data like the spending note commitments) and a witness (private data like the spending key).

Relayers: In a naive shielded pool design, the user who submits a transaction onchain must pay gas from a funded account, which can link their public identity to the shielded operation, hencedegrading privacy. Relayers are specialized intermediaries appointed to submit transactions on behalf of users, breaking the onchain link between the submitter's Ethereum address and the shielded action. The user constructs the proof and transaction payload offchain and hands it to a relayer, who broadcasts it and pays the fee. Typically, relayers are compensated through a small deduction from the paid fee. Relayers represent an additional trust component, as they can arbitrarily censor private transactions. For simplicity, we do not consider relayers in this post, but they remain an important component for achieving anonymity in production deployments.

End-to-end flow: deposit, shielded transfer, withdrawal

Throughout the flow descriptions, we use the following nomenclature:

  • SPSC: The Shielded Pool Smart Contract deployed on a public chain.
  • User: An entity interacting with the pool (depositing, withdrawing, or transferring).
  • Sender: The user spending input notes in a shielded transfer.
  • Receiver: The user for whom output notes are created in a shielded transfer.

We now proceed to describe the flows.

Deposit

A deposit converts a public token amount into one or more shielded notes inside the pool.  The user constructs the note commitments (cm_list) and their corresponding encrypted payloads (encrypted_notes), and generates a ZKP (proof) showing that the notes are well-formed and that their total value equals the deposited amount. The tokens are then transferred from the user's wallet into the pool's custody. Upon deposit, the pool verifies the proof and updates its local state by updating the commitments Merkle tree root.

Figure 2. Deposit. A public token amount is converted into one or more notes; the pool verifies the proof before updating its commitment tree.

When interacting with a deposit, the amount, the depositing address, and the token are publicly visible. However, the proof hides how the deposited amount is split across notes, which public keys own them, and the randomness. An external observer can see that a deposit of a given amount occurred, but cannot determine how ownership is assigned inside the pool once the notes are created.

The proof takes as public inputs the commitment list, the deposit amount, and the token address. The witness provides private information such as the user's spending key, individual note values, and commitment randomness.

Shielded transfer

A shielded transfer moves value within the pool. The Sender spends existing notes by revealing their nullifiers and creates new output notes for the Receiver and, eventually, for change. The pool verifies that the nullifiers are unused, verifies the ZK proof, appends new commitments to the tree, and emits encrypted outputs for the recipient.

The ZK proof enforces a compact set of checks, all publicly verifiable. The proof asserts that:

  • The input notes exist in the pool's current note commitment tree (membership against the Merkle root);
  • The spender is authorized to spend them (nullifiers are correctly derived using a valid spending key);
  • The output commitments are correctly formed (new notes are well-formed commitments);
  • The nullifiers are correctly derived and unused (double-spending);
  • Conservation holds inside the pool (total input value equals total output value).

Withdrawal

A withdrawal exits back to the user's wallet. The user proves they are spending valid notes and that the withdrawal amount is consistent with inputs and outputs (including optional change); the pool then transfers tokens to a public recipient wallet after successful verification.

Figure 3. Shielded transfer. The sender spends notes and creates outputs entirely within the pool; the receiver discovers the new note by scanning and trial-decrypting the encrypted outputs.

The withdrawal amount, the recipient address, and the token are publicly visible onchain; any external observer can see that tokens have been transferred out of the pool to the recipient's wallet. The SPSC is also updated with the newly revealed nullifiers and the commitments Merkle root, if change notes are created. The proof hides which input notes were consumed, their individual values, the total balance of the spender, and the structure of any change notes.

Shielded pools from theory to practice

To show practicality, we implemented a shielded pool protocol for ERC-20 tokens on public Ethereum and benchmarked it with real flows. The results show that private transfers are practical today; ZK proving a transfer takes roughly 1.5 seconds on commodity hardware and settles for under a dollar on Ethereum L1. Our implementation is open source and available here.

Benchmarks

Measured on a MacBook Pro M3 (18 GB RAM). Every ZK proof in our setup carries four input and four output notes, which keeps the circuit, proof size, and gas cost identical across deposits, transfers, and withdrawals.

Performance. A client generates a complete shielded-transfer proof that spends four notes in roughly 1.5 seconds end-to-end, all of it spent on the ZK proof generation and offchain pre-submission validation. It runs entirely in the browser, so a user needs no specialized prover infrastructure to transact privately.

Cost. Onchain, verifying a transfer costs about 301K gas with a constant 256-byte proof, stable across deposit, transfer, and withdrawal. At market conditions around the time of writing (roughly 1.5 gwei gas price and ETH at about $2,000), that works out to about 0.00045 ETH or about $0.90 per private transfer on Ethereum L1. On an L2, where calldata and gas are far cheaper, the same operation costs a small fraction of that.

These results show that a private ERC-20 transfer is practical on Ethereum: it proves in seconds and settles for well under a dollar on L1 (and a fraction of a cent on L2). The cryptography is not the

The real barrier

The bottleneck is not the proving time or the gas cost. It is everything around them. Achieving privacy at the application level required us to build far more than a smart contract. A working shielded pool meant implementing, from scratch:

  • Custom circuits and a note format. No standard note structure, nullifier derivation, commitment format, or circuit design exists, so we had to define our own.
  • Custom off-chain flows. Privacy pools depend on substantial client-side infrastructure:
    • Key derivation: spending, viewing, and encryption keys;
    • Note discovery: indexing and trial decryption from onchain events;
    • Merkle tree management;
    • Proof generation.

Reproducing this end-to-end (circuits, contracts, prover tooling, indexer, and wallet integration) represents a significant engineering and audit burden, and on its own a major barrier to entry.

Nethermind is committed to lowering this barrier. Institutions should not have to assemble circuits, contracts, and key management themselves; Nethermind delivers privacy solutions across different layers of public chain ecosystems with the goal of reducing entry barriers and supporting broader blockchain adoption.

Privacy alone is not enough for institutions

With shielded pools, we showed how privacy can be achieved on public blockchains. These protocols also introduce regulatory challenges that undermine institutional adoption. The case of Tornado Cash illustrates this tension clearly. Tornado Cash is a mixer built on cryptographic primitives similar to shielded pools. The protocol is fully permissionless and provides anonymity without governance. From a regulatory perspective, this made it an ideal tool for illicit activity. Its sanctioning by the U.S. Treasury in 2022 demonstrated how quickly privacy infrastructure can become an enforcement target when it lacks credible compliance mechanisms.

For institutions that operate under regulatory constraints, the takeaway is that privacy on public chains is achievable, while full anonymity is not a viable operating model. Privacy models should enforce compliance safeguards by design:

  1. Selective Disclosure. Institutions must be able to share transaction details with auditors, regulators, or counterparties on a need-to-know basis.
  2. Access Control. Institutions need to enforce who can enter and exit confidential domains and under what conditions transfers are permitted. Approaches include KYC-gated access via ZKP, association sets, and Proof of Innocence mechanisms.
  3. Asset Control. Regulated asset issuers may need the ability to freeze accounts, revoke or clawback funds, mark assets as unspendable, or globally pause pool operations. Implementing these functions within privacy domains is non-trivial and requires careful architectural design, as we will show in the next posts.

Beyond these compliance dimensions, standardization is an equally important barrier. Institutions prefer standardized approaches with clear governance and broad ecosystem support. Frameworks like CMTA and ERC-3643 have shown how standardization accelerates institutional adoption for tokenized securities.

Conclusion

Private transfers are practical on public chains today. The shielded pool protocol above proves in seconds and settles for well under a dollar on L1. Technical feasibility, though, is only half the story. Anonymity without control is not an institutional solution. Regulated entities need compliance mechanisms such as selective disclosure, access control, and asset-level governance.

Standardization and tooling matter just as much. Today, privacy solutions often rely on different trust models, integration patterns, and user experiences. For institutions accustomed to standardized rails, this fragmentation is itself an adoption barrier. Without common interfaces and deployable patterns, privacy-preserving infrastructure risks remaining a set of bespoke experiments rather than becoming a shared layer.

Nethermind is working to address this challenge. Privacy and compliance on public chains cannot be solved by a single product or isolated protocol. In a multi-chain ecosystem where assets and applications span multiple public ledgers, privacy must become a cross-domain capability across the public-chain stack.

Nethermind is building the protocols, tooling, and deployment patterns needed to make this practical for institutions. The objective is to reduce the complexity of privacy-preserving solutions, so institutions can move onchain faster while remaining aligned with their regulatory and operational obligations.

The next post moves from private transfers to standardized, compliant private transfers: we present a privacy-preserving payment system for the Stellar network, built on shielded pools with added auditing and compliance functionalities. From there, the series broadens across the stack. For application-level privacy and compliance, we will present a shielded pool implementation that remains backward compatible with existing token standards (such as CMTA and ERC-3643); we will then show how privacy-preserving solutions can be implemented on L2 infrastructure, either using privacy-preserving rollups or adopting custom private execution environments. Finally, we will conclude this series with an analysis of the trade-offs across the presented solutions, the remaining open challenges, and how Nethermind and its ecosystem partners are working to address them.

Author
Stefano De Angelis
Research Scientist at Nethermind specializing in distributed systems, consensus protocols, applied cryptography, and cryptographic proof systems. PhD in Computer Science.