Nethereum.Quorum
7.1.0
Prefix Reserved
dotnet add package Nethereum.Quorum --version 7.1.0
NuGet\Install-Package Nethereum.Quorum -Version 7.1.0
<PackageReference Include="Nethereum.Quorum" Version="7.1.0" />
<PackageVersion Include="Nethereum.Quorum" Version="7.1.0" />
<PackageReference Include="Nethereum.Quorum" />
paket add Nethereum.Quorum --version 7.1.0
#r "nuget: Nethereum.Quorum, 7.1.0"
#:package Nethereum.Quorum@7.1.0
#addin nuget:?package=Nethereum.Quorum&version=7.1.0
#tool nuget:?package=Nethereum.Quorum&version=7.1.0
Nethereum.Quorum
Nethereum Quorum is the Nethereum extension to interact with Quorum, the permissioned implementation of Ethereum supporting data privacy created by JP Morgan.
The cross-platform library supports .Net Core, Mono, Linux, iOS, Android, Raspberry PI, Xbox and of course Windows.
Issues, Requests and help
We should be able to answer there any simple queries, general comments or requests, everyone is welcome. In a similar feel free to raise any issue or pull request.
Quick installation
| Package | Nuget |
|---|---|
| Nethereum.Quorum |
Usage
Public interaction with Quorum is the same as interacting with Geth, if you require more information on this please refer to the general Netherum documentation in Read the docs.
For private interaction or to access the Quorum RPC methods, a specialised Web3, Web3Quorum is required.
PrivateFor will be set as following:
var web3Node1 = new Web3Quorum(urlNode1);
var privateFor = new List<string>(new[] { "ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc=" });
web3Node1.SetPrivateRequestParameters(privateFor);
afterwards all the transactions will use the PrivateFor parameter.
using Nethereum.RPC.TransactionReceipts;
var contract = web3Node1.Eth.GetContract(abi, address);
var functionSet = contract.GetFunction("set");
var account = await web3Node1.Eth.CoinBase.SendRequestAsync();
// TransactionReceiptPollingService only exposes SendRequestAndWaitForReceiptAsync (there is no SendRequestAsync)
var transactionService = new TransactionReceiptPollingService(web3Node1.TransactionManager);
var receipt = await transactionService.SendRequestAndWaitForReceiptAsync(() => functionSet.SendTransactionAsync(account, 4));
For a full example of usage using the 7nodes sample of Quorum check the Unit Test
Quorum RPC
The Quorum RPC methods can be accessed using web3.Quorum to retrieve the CanonicalHash, BlockMaker, Voter, MakeBlock.. Here are some examples from the Unit tests using the 7nodes sample of Quorum
[Fact]
public async void ShouldReturnCanonicalHashForBlockNumber1()
{
var web3 = new Web3Quorum(DefaultSettings.GetDefaultUrl());
var canonicalHash = await web3.Quorum.CanonicalHash.SendRequestAsync(1);
Assert.Equal("0x8bb911238205c6d5e9841335c9c5aff3dfae4c0f6b0df28100737c2660a15f8d", canonicalHash);
}
[Fact]
public async void ShouldReturnTrueWhenCallingIsBlockMakerForCoinbase()
{
var web3 = new Web3Quorum(DefaultSettings.GetDefaultUrl());
var isBlockMaker = await web3.Quorum.IsBlockMaker.SendRequestAsync(await web3.Eth.CoinBase.SendRequestAsync());
Assert.Equal(true, isBlockMaker);
}
[Fact]
public async void ShouldReturnTrueWhenCallingIsVoterForCoinbase()
{
var web3 = new Web3Quorum(DefaultSettings.GetDefaultUrl());
var isVoter = await web3.Quorum.IsVoter.SendRequestAsync(await web3.Eth.CoinBase.SendRequestAsync());
Assert.Equal(true, isVoter);
}
[Fact]
public async void ShouldBeAbleToMakeBlocksBypassingBlockStrategy()
{
//Node2 is a Block Maker
//This might fail.. depending on the canonicalhash.. (quorum)
var web3 = new Web3Quorum(DefaultSettings.QuorumIPAddress + ":22001");
var hash = await web3.Quorum.MakeBlock.SendRequestAsync();
Assert.NotNull(hash);
}
[Fact]
public async void ShouldBeAbleToVote()
{
//Node 5 can vote
var web3 = new Web3Quorum(DefaultSettings.QuorumIPAddress + ":22004");
var block =
await web3.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(BlockParameter.CreateLatest());
var hash = await web3.Quorum.Vote.SendRequestAsync(block.BlockHash);
Assert.NotNull(hash);
}
[Fact]
public async void ShouldPauseResumeBlockMaker()
{
//Node 2 is a BlockMaker
var web3 = new Web3Quorum(DefaultSettings.QuorumIPAddress + ":22001");
await web3.Quorum.PauseBlockMaker.SendRequestAsync();
await web3.Quorum.ResumeBlockMaker.SendRequestAsync();
}
[Fact]
public async void ShouldGetNodeInfoOfBlockMaker()
{
var web3 = new Web3Quorum(DefaultSettings.QuorumIPAddress + ":22001");
var nodeInfo = await web3.Quorum.NodeInfo.SendRequestAsync();
Assert.Equal("active", nodeInfo.BlockMakeStratregy.Status);
}
Permission, Privacy, Raft, IBFT, ContractExtensions, DebugQuorum
Web3Quorum also exposes Permission, Privacy, Raft, IBFT, ContractExtensions and DebugQuorum
(src/Nethereum.Quorum/Web3Quorum.cs:67-74), alongside Quorum.
Permission (node/account/org permissioning, src/Nethereum.Quorum/RPC/Services/IPermissionService.cs):
var allowed = await web3.Permission.ConnectionAllowed.SendRequestAsync(
"enode://pubkey@ip:port", "10.0.0.1", 21000);
Also: AcctList, AddAccountToOrg, AddNewRole, AddNode, AddOrg, AddSubOrg, ApproveAdminRole,
ApproveBlackListedAccountRecovery, ApproveBlackListedNodeRecovery, ApproveOrg, ApproveOrgStatus,
AssignAdminRole, ChangeAccountRole, GetOrgDetails, NodeList, OrgList, RecoverBlackListedAccount,
RecoverBlackListedNode, RemoveRole, RoleList, TransactionAllowed, UpdateAccountStatus,
UpdateNodeStatus, UpdateOrgStatus.
Privacy (Quorum's headline private-transaction feature, src/Nethereum.Quorum/RPC/Services/IPrivacyService.cs):
var privateReceipt = await web3.Privacy.GetPrivateTransactionReceipt.SendRequestAsync(privacyMarkerTransactionHash);
Also: DistributePrivateTransaction, FillTransaction, GetContractPrivacyMetadata,
GetPrivacyPrecompileAddress, GetPrivateTransactionByHash, GetPsi, GetQuorumPayload,
SendRawPrivateTransaction, SendTransaction.
Raft (src/Nethereum.Quorum/RPC/Services/IRaftService.cs):
var role = await web3.Raft.Role.SendRequestAsync(); // "minter" / "verifier" / "learner"
Also: AddLearner, AddPeer, AddCluster, Leader, PromoteToPeer, RemovePeer.
IBFT (Istanbul BFT consensus, src/Nethereum.Quorum/RPC/Services/IIBFTService.cs):
var validators = await web3.IBFT.GetValidators.SendRequestAsync(BlockParameter.CreateLatest());
Also: Candidates, Discard, GetSignersFromBlock, GetSignersFromBlockByHash, GetSnapshot,
GetSnapshotAtHash, GetValidatorsAtHash, IsValidator, NodeAddress, Propose, Status.
ContractExtensions (extend a private contract to a new participant, src/Nethereum.Quorum/RPC/Services/IContractExtensionsService.cs):
var status = await web3.ContractExtensions.GetExtensionStatus.SendRequestAsync(managementContractAddress);
Also: ActiveExtensionContracts, ApproveExtension, CancelExtension, ExtendContract.
DebugQuorum (src/Nethereum.Quorum/RPC/Services/IDebugQuorumService.cs):
var state = await web3.DebugQuorum.DebugDumpAddress.SendRequestAsync(address, BlockParameter.CreateLatest());
Also: DebugPrivateStateRoot.
QuorumAccount, QuorumTransactionManager, UnlockedAccount
QuorumAccount (src/Nethereum.Quorum/QuorumAccount.cs) is an Account whose default transaction manager is
QuorumTransactionManager (src/Nethereum.Quorum/QuorumTransactionManager.cs), which understands
PrivateFor/PrivateFrom and applies Quorum's v value shift for private transactions.
UnlockedAccount (src/Nethereum.Quorum/UnlockedAccount.cs) represents an account already unlocked on the
node itself (no local private key). Web3Quorum accepts either:
using System;
using Nethereum.JsonRpc.Client;
using Nethereum.Quorum;
// Client-side signing with a private key; PrivateUrl targets the node's private transaction manager (Tessera/Constellation)
var account = new QuorumAccount("PRIVATE_KEY");
var web3 = new Web3Quorum(account, privateUrl: "http://localhost:9081", url: "http://localhost:22000");
// Node-side signing (account already unlocked on the Quorum node)
var unlockedAccount = new UnlockedAccount("0xNodeUnlockedAddress");
var web3Unlocked = new Web3Quorum(new RpcClient(new Uri("http://localhost:22000")), unlockedAccount);
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net451 is compatible. net452 was computed. net46 was computed. net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.5.1
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
-
.NETFramework 4.6.1
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
-
.NETStandard 2.0
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- NETStandard.Library (>= 2.0.3)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
-
net10.0
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
-
net6.0
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
-
net8.0
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
-
net9.0
- Nethereum.Geth (>= 7.1.0)
- Nethereum.RPC (>= 7.1.0)
- Nethereum.Web3 (>= 7.1.0)
- Newtonsoft.Json (>= 13.0.4 && < 14.0.0)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on Nethereum.Quorum:
| Package | Downloads |
|---|---|
|
QuorumHelper
Para las conexiones y pruebas, al envio de SET y GET en la blockchain con una red privada de ethereum |
|
|
QuorumHelperClass
Nuget para las conexiones (pruebas y productiva) para el envio SET y obtener GET los resultados en la blockchain en una red privada de ethereum |
|
|
QuorumHelperBX1
Para las conexiones entre nodos y pruebas, envio de informacion y obtencion de SET y GET en la blockchain con una red privada de ethereum |
|
|
QuorumHelperBX
Para las conexiones entre nodos y pruebas, envio de informacion y obtencion de SET y GET en la blockchain con una red privada de ethereum |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 7.1.0 | 68 | 11/10/2026 |
| 7.0.0 | 189 | 10/2/2026 |
| 6.1.0 | 1,138 | 3/25/2026 |
| 6.0.4 | 209 | 3/18/2026 |
| 6.0.3 | 167 | 3/18/2026 |
| 6.0.1 | 201 | 3/17/2026 |
| 6.0.0 | 212 | 3/16/2026 |
| 5.8.0 | 240 | 1/6/2026 |
| 4.29.0 | 2,857 | 2/10/2025 |
| 4.28.0 | 380 | 1/7/2025 |
| 4.27.1 | 327 | 12/24/2024 |
| 4.27.0 | 346 | 12/24/2024 |
| 4.26.0 | 395 | 10/1/2024 |
| 4.25.0 | 351 | 9/19/2024 |
| 4.21.4 | 396 | 8/9/2024 |
| 4.21.3 | 352 | 7/22/2024 |
| 4.21.2 | 360 | 6/26/2024 |
| 4.21.1 | 349 | 6/26/2024 |
| 4.21.0 | 361 | 6/18/2024 |
| 4.20.0 | 3,058 | 3/28/2024 |