
Quorum ist eine Ethereum-basierte Blockchain, die von JPMorgan entwickelt wurde und zuletzt die erste verteilte Registrierungsplattform ist, die Microsoft Azure anbietet.
Das Quorum unterstützt private und öffentliche Transaktionen und hat viele kommerzielle Anwendungsfälle.
In diesem Artikel analysieren wir eines dieser Szenarien - die Bereitstellung eines verteilten Registrierungsnetzwerks zwischen einem Supermarkt und einem Lagerbesitzer, um relevante Informationen über die Temperatur eines Lagers bereitzustellen.
Der in diesem Handbuch verwendete Code befindet sich im Repository auf GitHub .
Der Artikel behandelt:
- Erstellen eines intelligenten Vertrags;
- Bereitstellen des Quorum-Netzwerks mit Chainstack
- Quorum öffentliche Transaktionen
- Quorum private Transaktionen.
Um dies zu veranschaulichen, verwenden wir das Skript zur Überwachung der Temperatur in den Lagerräumen der Mitglieder des Quorum-Netzwerks als Teil des Internet der Dinge (IoT).
Kontext
Eine Gruppe von Lagerunternehmen ist in einem Konsortium für die gemeinsame Speicherung von Informationen und die Automatisierung von Prozessen in der Blockchain zusammengefasst. Dafür haben sich die Unternehmen für Quorum entschieden. In diesem Artikel werden zwei Szenarien behandelt: öffentliche Transaktionen und private Transaktionen.
Transaktionen werden von verschiedenen Teilnehmern erstellt, um mit dem Konsortium zu interagieren, zu dem sie gehören. Jede Transaktion stellt entweder einen Vertrag bereit oder ruft eine Funktion in einem Vertrag auf, um Daten in das Netzwerk hochzuladen. Diese Aktionen werden auf alle Knoten im Netzwerk repliziert.
Öffentliche Transaktionen können von allen Mitgliedern des Konsortiums eingesehen werden. Private Transaktionen bieten eine zusätzliche Vertraulichkeitsebene und stehen nur den Teilnehmern zur Verfügung, die Rechte daran haben.
Für beide Szenarien verwenden wir aus Gründen der Übersichtlichkeit denselben Vertrag.
Intelligenter Vertrag
Im Folgenden finden Sie einen einfachen Smart-Vertrag, der für unser Szenario erstellt wurde. Es hat eine öffentliche variable temperature
, die mit der set
Methode geändert und mit der get
Methode abgerufen werden kann.
pragma solidity ^0.4.25; contract TemperatureMonitor { int8 public temperature; function set(int8 temp) public { temperature = temp; } function get() view public returns (int8) { return temperature; } }
Damit der Vertrag mit web3.js funktioniert , muss er in das ABI-Format und den Bytecode konvertiert werden. Mit der formatContract
Funktion formatContract
wird der Vertrag mit solc-js kompiliert .
function formatContract() { const path = './contracts/temperatureMonitor.sol'; const source = fs.readFileSync(path,'UTF8'); return solc.compile(source, 1).contracts[':TemperatureMonitor']; }
Der abgeschlossene Vertrag lautet wie folgt:
// bytecode
Nachdem der Vertrag fertig ist, werden wir das Netzwerk und den Vertrag bereitstellen.
Knotenbereitstellung

Das Bereitstellen eines Knotens kann sehr zeitaufwändig sein und dieser Prozess kann mithilfe des Chainstack- Dienstes ersetzt werden.
Das Folgende ist ein Quorum-Netzwerkbereitstellungsprozess mit einem Raft-Konsens und drei Knoten.
Beginnen wir mit einem Projekt und nennen es das Quorum-Projekt:

Erstellen Sie ein Quorum-Netzwerk mit Raft-Konsens auf der Google Cloud-Plattform:

Fügen Sie dem bereits erstellten Standardknoten zwei weitere Knoten hinzu:

Drei laufende Knoten:

Auf der Seite mit den Knotendetails werden der RPC-Endpunkt, der öffentliche Schlüssel usw. angezeigt.

Das Netzwerk wird bereitgestellt. Jetzt werden wir intelligente Verträge bereitstellen und Transaktionen mit web3.js ausführen.
Öffentliche Transaktionen
Kontext
Die Temperatur des Lagers ist von großer Bedeutung, um die Kosten zu senken, insbesondere für Produkte, die zur Lagerung bei Temperaturen unter Null bestimmt sind.
Durch die Möglichkeit für Unternehmen, Echtzeitwerte der Außentemperatur ihres geografischen Standorts zu teilen und in einem unveränderlichen Register aufzuzeichnen, reduzieren Netzwerkmitglieder Kosten und Zeit.

Wir werden die drei in der Abbildung dargestellten Aufgaben ausführen:
Wir werden den Vertrag über Knoten 1 kündigen:
const contractAddress = await deployContract(raft1Node); console.log(`Contract address after deployment: ${contractAddress}`);
Stellen Sie die Temperatur über Knoten 2 bis 3 Grad ein:
const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Transaction status: ${status}`);
Knoten 3 erhält Informationen aus dem Smart-Vertrag. Der Vertrag gibt einen Wert von 3 Grad zurück:
const temp = await getTemperature(raft3Node, contractAddress); console.log('Retrieved contract Temperature', temp);
Als Nächstes sehen wir uns an, wie eine öffentliche Transaktion im Quorum-Netzwerk mit web3.js ausgeführt wird.
Wir initiieren eine Instanz über RPC für drei Knoten:
const raft1Node = new Web3( new Web3.providers.HttpProvider(process.env.RPC1), null, { transactionConfirmationBlocks: 1, }, ); const raft2Node = new Web3( new Web3.providers.HttpProvider(process.env.RPC2), null, { transactionConfirmationBlocks: 1, }, ); const raft3Node = new Web3( new Web3.providers.HttpProvider(process.env.RPC3), null, { transactionConfirmationBlocks: 1, }, );
Zerstören Sie den intelligenten Vertrag:
web3.js bietet zwei Methoden für die Interaktion mit einem Vertrag: call
und send
.
Aktualisieren Sie die Temperatur des Vertrags, indem Sie set
mit der web3-Sendemethode ausführen.
Als nächstes verwenden wir die web3-Aufrufmethode, um die Temperatur des Vertrags zu ermitteln. Bitte beachten Sie, dass die Aufrufmethode auf dem lokalen Knoten ausgeführt wird und die Transaktion nicht in der Blockchain erstellt wird.
Jetzt können Sie public.js ausführen , um das folgende Ergebnis zu erhalten:
Als nächstes sehen wir die Einträge im Quorum Explorer im Chainstack-Bedienfeld, wie unten gezeigt.
Alle drei Knoten interagierten und Transaktionen wurden aktualisiert:
- Die erste Transaktion hat einen Vertrag gesichert.
- Bei der zweiten Transaktion wurde die Vertragstemperatur auf 3 Grad festgelegt.
- Die Temperatur wird über den lokalen Knoten ermittelt, sodass die Transaktion nicht erstellt wurde.

Private Transaktionen
Kontext
Eine häufige Anforderung von Organisationen ist der Datenschutz. Stellen Sie sich als Beispiel ein Szenario vor, in dem ein Supermarkt ein Lager für die Lagerung von Meeresfrüchten von einem separaten Anbieter mietet:
- Der Anbieter liest mit Hilfe von IoT-Sensoren alle 30 Sekunden Temperaturwerte und leitet sie an den Supermarkt weiter .
- Diese Werte sollten nur dem Verkäufer und dem Supermarkt , einem vernetzten Konsortium, zur Verfügung stehen.

Wir werden die vier in der obigen Abbildung dargestellten Aufgaben ausführen.
- Wir verwenden dieselben drei Knoten aus dem vorherigen Szenario, um private Transaktionen zu demonstrieren:
- Der Supermarkt setzt einen intelligenten Vertrag ein, der für den Supermarkt und den Verkäufer privat ist.
- Ein Dritter hat keinen Zugriff auf den Smart-Vertrag.
Wir werden die get
und set
Methoden im Auftrag des Supermarkts und des Anbieters aufrufen, um die private Quorum-Transaktion zu demonstrieren.
Wir werden den privaten Vertrag für die Teilnehmer des Supermarkts und des Verkäufers über den Teilnehmer des Supermarkts kündigen:
const contractAddress = await deployContract( raft1Node, process.env.PK2, ); console.log(`Contract address after deployment: ${contractAddress}`);
Stellen Sie die Temperatur vom Drittanbieter (äußerer Knoten) ein und erhalten Sie den Temperaturwert:
Stellen Sie die Temperatur vom Lieferanten (innerer Knoten) ein und erhalten Sie den Temperaturwert:
Die Temperatur in diesem Szenario sollte vom Smart-Vertrag auf 12 zurückkehren. Bitte beachten Sie, dass der Anbieter hier den Zugriff auf den Smart-Vertrag zugelassen hat.
Holen Sie sich die Temperatur vom Drittanbieter (äußerer Knoten):
In Schritt 3 wurde die Temperatur auf 12 eingestellt, aber der Dritte hat keinen Zugriff auf den Smart-Vertrag. Daher muss der Rückgabewert null sein.
Als nächstes werden wir die Ausführung privater Transaktionen im Quorum-Netzwerk mit web3.js genauer betrachten. Da der größte Teil des Codes mit öffentlichen Transaktionen übereinstimmt, wählen wir nur die Teile aus, die sich für private Transaktionen unterscheiden.
Bitte beachten Sie, dass der in das Netzwerk hochgeladene Vertrag unveränderlich ist. Daher muss den entsprechenden Knoten der Zugriff mit Erlaubnis gewährt werden, indem der öffentliche Vertrag zum Zeitpunkt der Bereitstellung des Vertrags und nicht danach einbezogen wird.
async function deployContract(web3, publicKey) { const address = await getAddress(web3); const contract = new web3.eth.Contract( temperatureMonitor.interface, ); return contract.deploy({ data: temperatureMonitor.bytecode, }) .send({ from: address, gas: '0x2CD29C0',
Private Transaktionen werden auf die gleiche Weise ausgeführt - unter Einbeziehung des öffentlichen Schlüssels der Teilnehmer zum Zeitpunkt der Ausführung.
async function setTemperature(web3, contractAddress, publicKey, temp) { const address = await getAddress(web3); const myContract = await getContract(web3, contractAddress); return myContract.methods.set(temp).send({ from: address,
Jetzt können wir private.js mit den folgenden Ergebnissen ausführen :
node private.js Contract address after deployment: 0x85dBF88B4dfa47e73608b33454E4e3BA2812B21D [Node3] temp retrieved after updating contract from external nodes: null [Node2] temp retrieved after updating contract from internal nodes: 12 [Node3] temp retrieved from external nodes after update null
Der Quorum Explorer bei Chainstack zeigt Folgendes:
- Bereitstellung eines Vertrags von einem Supermarktteilnehmer
- Durchführen von
SetTemperature
von einem Dritten ; - Führen Sie eine
SetTemperature
von einem Herstellerteilnehmer aus .

Wie Sie sehen, sind beide Transaktionen abgeschlossen, aber nur die Transaktion des teilnehmenden Anbieters hat die Temperatur im Vertrag aktualisiert. Private Transaktionen bieten somit Unveränderlichkeit, geben aber gleichzeitig keine Daten an Dritte weiter.
Fazit
Wir haben das kommerzielle Szenario für die Verwendung von Quorum untersucht, um aktuelle Temperaturinformationen in einem Lager bereitzustellen, indem wir ein Netzwerk zwischen zwei Parteien - einem Supermarkt und dem Lagerbesitzer - bereitgestellt haben.
Wir haben gezeigt, wie aktuelle Temperaturinformationen sowohl durch öffentliche als auch durch private Transaktionen aufrechterhalten werden können.
Es kann viele Anwendungsszenarien geben, und wie Sie sehen, ist dies überhaupt nicht schwierig.
Experimentieren Sie und versuchen Sie, Ihr Skript bereitzustellen. Darüber hinaus kann die Blockchain-Technologieindustrie bis 2024 fast zehnmal wachsen .