Over a million developers have joined DZone.

Quorum: An Ethereum-Based Distributed Ledger Protocol

DZone 's Guide to

Quorum: An Ethereum-Based Distributed Ledger Protocol

Quorum is an Ethereum-based ledge protocol for transactions and privacy that is high-performance and consensus-based.

· Integration Zone ·
Free Resource

In simple words, Quorum is an Ethereum-based distributed ledger protocol that supports transaction and contract privacy. The primary features of Quorum are:

  • Transaction and contract privacy.
  • Voting-based consensus mechanism.
  • Network and peer permissions management.
  • Higher performance.

Apart from these features, Quorum includes the powerful feature of support for private and public transactions.

  • Private transactions: Transactions whose payloads are only visible to the network participants whose public keys are specified in the privateFor parameter of the transaction. privatefor can take multiple addresses in a comma-separated list.
  • Public transactions: Transactions whose payloads are visible to all participants of the same Quorum network. These are created as standard Ethereum transactions in the usual way.

The treatment of both types of transactions is different. Public transactions are sent to an account that holds contract code. Each participant will execute the same code and their underlying StateDBs will be updated accordingly. For private transactions, it replaces the original transaction payload with a hash of the encrypted payload that it receives from the constellation. Participants who are party to the transaction will be able to replace the hash with the actual payload via their constellation instance, whilst those participants that are not parties will only see the hash.

Now let see how Quorum works iInternally.


The process of a transaction in Quorum is described in the image. Including the private transaction happening between A and B, there are three members in the network (A, B, and C).

In the first step, the request from the transaction is sending the corresponding Quorum node (i.e., A => Quorum Node A, including transaction A to B).

A’s Quorum node passes the transaction on to its paired transaction manager (Transaction Manager A), requesting for it to store the transaction payload.

A’s Transaction Manager makes a call to its associated enclave to validate the sender and encrypt the payload.

A’s enclave checks the private key for Party A and, once validated, performs the transaction conversion.

Party A’s transaction manager then stores the encrypted payload and encrypted symmetric key and then securely transfers (via HTTPS) the hash, encrypted payload, and encrypted symmetric key that has been encrypted with Party B’s public key to Party B’s Transaction Manager. Party B’s Transaction Manager responds with an Ack/Nack response.

A’s Transaction Manager returns the hash to the Quorum Node, which then replaces the Transaction’s original payload with that hash.

In the seventh step, the transaction is propagated to the rest of the network using the standard Ethereum P2P protocol.

A block containing Transaction AB is created and distributed to each party on the network.

In this step, all parties will attempt to process the transaction.

In this step, A and B make a call to its enclave, passing in the encrypted payload, encrypted symmetric key, and signature. However, C will receive a NotARecipient message.

The enclave validates the signature and then decrypts the symmetric key using the party’s private key that is held in the enclave, decrypts the transaction payload using the now-revealed symmetric key, and returns the decrypted payload to the transaction manager.

The transaction managers for parties A and B then send the decrypted payload to the EVM for contract code execution. This execution will update the state in the Quorum node’s private StateDB only.


integration ,quorum ,ethereum ,blockchain ,ledger protocol

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}