ProHoster > Blog > διαχείριση > Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3
Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3
Απαρτία είναι ένα blockchain που βασίζεται στο Ethereum που αναπτύχθηκε από την JPMorgan και πρόσφατα έγινε η πρώτη πλατφόρμα κατανεμημένης λογιστικής που προσφέρεται από το Microsoft Azure.
Το Quorum υποστηρίζει ιδιωτικές και δημόσιες συναλλαγές και έχει πολλές περιπτώσεις εμπορικής χρήσης.
Σε αυτό το άρθρο, θα εξετάσουμε ένα τέτοιο σενάριο - την ανάπτυξη ενός δικτύου κατανεμημένης λογιστικής μεταξύ ενός σούπερ μάρκετ και ενός ιδιοκτήτη αποθήκης για την παροχή ενημερωμένων πληροφοριών σχετικά με τη θερμοκρασία της αποθήκης.
ανάπτυξη του δικτύου Quorum χρησιμοποιώντας Αλυσίδα;
Απαρτία δημόσιες συναλλαγές.
Απαρτία ιδιωτικών συναλλαγών.
Για παράδειγμα, χρησιμοποιούμε ένα σενάριο για την παρακολούθηση της θερμοκρασίας σε αποθήκες μελών του δικτύου Quorum εντός του Διαδικτύου των Πραγμάτων (IoT).
Πλαίσιο
Ένας όμιλος εταιρειών αποθήκης ενώνεται σε μια κοινοπραξία για την από κοινού αποθήκευση πληροφοριών και αυτοματοποίηση διαδικασιών στο blockchain. Για αυτό, οι εταιρείες αποφάσισαν να χρησιμοποιήσουν το Quorum. Σε αυτό το άρθρο θα καλύψουμε δύο σενάρια: δημόσιες συναλλαγές και ιδιωτικές συναλλαγές.
Οι συναλλαγές δημιουργούνται από διαφορετικούς συμμετέχοντες για να αλληλεπιδράσουν με την κοινοπραξία στην οποία ανήκουν. Κάθε συναλλαγή είτε αναπτύσσει ένα συμβόλαιο είτε καλεί μια συνάρτηση στη σύμβαση για να ανεβάσει δεδομένα στο δίκτυο. Αυτές οι ενέργειες αναπαράγονται σε όλους τους κόμβους του δικτύου.
Οι δημόσιες συναλλαγές είναι διαθέσιμες για προβολή από όλους τους συμμετέχοντες στην κοινοπραξία. Οι ιδιωτικές συναλλαγές προσθέτουν ένα επίπεδο εμπιστευτικότητας και είναι διαθέσιμες μόνο σε όσους συμμετέχοντες έχουν δικαίωμα να το κάνουν.
Και για τα δύο σενάρια, χρησιμοποιούμε το ίδιο συμβόλαιο για λόγους σαφήνειας.
Έξυπνο συμβόλαιο
Παρακάτω είναι ένα απλό έξυπνο συμβόλαιο που δημιουργήθηκε για το σενάριό μας. Έχει μια δημόσια μεταβλητή temperature, το οποίο μπορεί να αλλάξει χρησιμοποιώντας set και λάβετε με μέθοδο get.
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;
}
}
Για να λειτουργήσει η σύμβαση web3.js, πρέπει να μεταφραστεί σε μορφή ABI και bytecode. Χρησιμοποιώντας τη λειτουργία formatContractπαρακάτω συντάσσει τη σύμβαση χρησιμοποιώντας solc-js.
Τώρα που η σύμβαση είναι έτοιμη, θα αναπτύξουμε το δίκτυο και θα αναπτύξουμε τη σύμβαση.
Ανάπτυξη κόμβου
Η ανάπτυξη ενός κόμβου μπορεί να είναι αρκετά απαιτητική και αυτή η διαδικασία μπορεί να αντικατασταθεί χρησιμοποιώντας μια υπηρεσία Αλυσίδα.
Ακολουθεί η διαδικασία για την ανάπτυξη του δικτύου Quorum με συναίνεση Raft και τρεις κόμβους.
Αρχικά, ας δημιουργήσουμε ένα έργο και ας το ονομάσουμε Απαρτία Έργο:
Ας δημιουργήσουμε ένα δίκτυο Quorum με συναίνεση Raft στο Google Cloud Platform:
Ας προσθέσουμε δύο ακόμη κόμβους στον κόμβο που έχει ήδη δημιουργηθεί από προεπιλογή:
Τρεις κόμβοι λειτουργίας:
Η σελίδα λεπτομερειών κόμβου εμφανίζει το τελικό σημείο RPC, το δημόσιο κλειδί κ.λπ.
Το δίκτυο έχει αναπτυχθεί. Τώρα ας αναπτύξουμε έξυπνα συμβόλαια και ας εκτελέσουμε συναλλαγές χρησιμοποιώντας web3.js.
Δημόσιες συναλλαγές
Πλαίσιο
Η θερμοκρασία της αποθήκης έχει μεγάλη σημασία για τη μείωση του κόστους, ειδικά για προϊόντα που προορίζονται να αποθηκεύονται σε θερμοκρασίες κάτω του μηδενός.
Επιτρέποντας στις εταιρείες να μοιράζονται την εξωτερική θερμοκρασία της γεωγραφικής τους θέσης σε πραγματικό χρόνο και να την καταγράφουν σε ένα αμετάβλητο καθολικό, οι συμμετέχοντες στο δίκτυο μειώνουν το κόστος και τον χρόνο.
Θα εκτελέσουμε τρεις εργασίες, που απεικονίζονται στο διάγραμμα:
Θα αναπτύξουμε τη σύμβαση μέσω Κόμβος 1:
const contractAddress = await deployContract(raft1Node);
console.log(`Contract address after deployment: ${contractAddress}`);
Ρυθμίστε τη θερμοκρασία μέσω Κόμβος 2 κατά 3 βαθμούς:
const status = await setTemperature(raft2Node, contractAddress, 3);
console.log(`Transaction status: ${status}`);
Κόμβος 3 θα λάβει πληροφορίες από το έξυπνο συμβόλαιο. Το συμβόλαιο θα επιστρέψει την τιμή 3 μοίρες:
Στη συνέχεια, θα εξετάσουμε πώς να εκτελέσετε μια δημόσια συναλλαγή στο δίκτυο Quorum χρησιμοποιώντας web3.js.
Ξεκινάμε μια παρουσία μέσω RPC για τρεις κόμβους:
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,
},
);
Ας αναπτύξουμε το έξυπνο συμβόλαιο:
// returns the default account from the Web3 instance initiated previously
function getAddress(web3) {
return web3.eth.getAccounts().then(accounts => accounts[0]);
}
// Deploys the contract using contract's interface and node's default address
async function deployContract(web3) {
const address = await getAddress(web3);
// initiate contract with contract's interface
const contract = new web3.eth.Contract(
temperatureMonitor.interface
);
return contract.deploy({
// deploy contract with contract's bytecode
data: temperatureMonitor.bytecode,
})
.send({
from: address,
gas: '0x2CD29C0',
})
.on('error', console.error)
.then((newContractInstance) => {
// returns deployed contract address
return newContractInstance.options.address;
});
}
web3.js παρέχει δύο μεθόδους αλληλεπίδρασης με τη σύμβαση: call и send.
Ας ενημερώσουμε τη θερμοκρασία του συμβολαίου εκτελώντας set χρησιμοποιώντας τη μέθοδο web3 send.
// get contract deployed previously
async function getContract(web3, contractAddress) {
const address = await getAddress(web3);
return web3.eth.Contract(
temperatureMonitor.interface,
contractAddress, {
defaultAccount: address,
}
);
}
// calls contract set method to update contract's temperature
async function setTemperature(web3, contractAddress, temp) {
const myContract = await getContract(web3, contractAddress);
return myContract.methods.set(temp).send({}).then((receipt) => {
return receipt.status;
});
}
Στη συνέχεια χρησιμοποιούμε τη μέθοδο web3 call για να αποκτήσετε τη θερμοκρασία του συμβολαίου. Σημειώστε ότι η μέθοδος call εκτελείται σε έναν τοπικό κόμβο και η συναλλαγή δεν θα δημιουργηθεί στο blockchain.
// calls contract get method to retrieve contract's temperature
async function getTemperature(web3, contractAddress) {
const myContract = await getContract(web3, contractAddress);
return myContract.methods.get().call().then(result => result);
}
Τώρα μπορείτε να τρέξετε public.js για να πάρετε το εξής αποτέλεσμα:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3
Στη συνέχεια, μπορούμε να προβάλουμε τις εγγραφές στην Εξερεύνηση Quorum στον πίνακα Chainstack, όπως φαίνεται παρακάτω.
Και οι τρεις κόμβοι αλληλεπιδρούσαν και οι συναλλαγές ενημερώθηκαν:
Η πρώτη συναλλαγή ανέπτυξε τη σύμβαση.
Η δεύτερη συναλλαγή όρισε τη θερμοκρασία του συμβολαίου στους 3 βαθμούς.
Η θερμοκρασία λαμβάνεται μέσω ενός τοπικού κόμβου, επομένως δεν δημιουργείται καμία συναλλαγή.
Ιδιωτικές συναλλαγές
Πλαίσιο
Μια κοινή απαίτηση των οργανισμών είναι η προστασία δεδομένων. Ως παράδειγμα, εξετάστε ένα σενάριο στο οποίο Σουπερμάρκετ ενοικιάζει αποθήκη για αποθήκευση θαλασσινών από ξεχωριστό Προμηθευτή:
Προμηθευτή χρησιμοποιώντας αισθητήρες IoT, διαβάζει τις τιμές θερμοκρασίας κάθε 30 δευτερόλεπτα και τις μεταδίδει Στην υπεραγορά;
αυτές οι τιμές θα πρέπει να είναι διαθέσιμες μόνο Στον πωλητή и Στην υπεραγορά, δικτυωμένο από κοινοπραξία.
Θα ολοκληρώσουμε τις τέσσερις εργασίες που απεικονίζονται στο παραπάνω διάγραμμα.
Χρησιμοποιούμε τους ίδιους τρεις κόμβους από το προηγούμενο σενάριο για να επιδείξουμε ιδιωτικές συναλλαγές:
Σουπερμάρκετ αναπτύσσει ένα έξυπνο συμβόλαιο που είναι ιδιωτικό Σουπερμάρκετ и Προμηθευτή.
Η τρίτη πλευρά δεν έχει δικαίωμα πρόσβασης στο έξυπνο συμβόλαιο.
Θα καλέσουμε τις μεθόδους get и set εκ μέρους του Σουπερμάρκετ и Προμηθευτή για να επιδείξετε μια ιδιωτική συναλλαγή Απαρτίας.
Θα αναπτύξουμε ένα ιδιωτικό συμβόλαιο για τους συμμετέχοντες Σουπερμάρκετ и Προμηθευτή μέσω ενός συμμετέχοντος Σουπερμάρκετ:
Ας ρυθμίσουμε τη θερμοκρασία από Τρίτο μέρος (εξωτερικός κόμβος) και λάβετε την τιμή θερμοκρασίας:
// Attempts to set Contract temperature to 10, this will not mutate contract's temperature
await setTemperature(
raft3Node,
contractAddress,
process.env.PK1,
10,
);
// This returns null
const temp = await getTemperature(raft3Node, contractAddress);
console.log(`[Node3] temp retrieved after updating contract from external nodes: ${temp}`);
Ας ρυθμίσουμε τη θερμοκρασία από Προμηθευτή (εσωτερικός κόμβος) και λάβετε την τιμή θερμοκρασίας:
Η θερμοκρασία σε αυτό το σενάριο θα πρέπει να επιστρέψει την τιμή 12 από το έξυπνο συμβόλαιο. Λάβετε υπόψη ότι Προμηθευτή εδώ έχει εξουσιοδοτημένη πρόσβαση στο έξυπνο συμβόλαιο.
// Updated Contract temperature to 12 degrees
await setTemperature(
raft2Node,
contractAddress,
process.env.PK1,
12,
);
// This returns 12
const temp2 = await getTemperature(raft2Node, contractAddress);
console.log(`[Node2] temp retrieved after updating contract from internal nodes: ${temp2}`);
Παίρνουμε τη θερμοκρασία από Τρίτο μέρος (εξωτερικός κόμβος):
Στο βήμα 3 η θερμοκρασία ρυθμίστηκε στους 12, αλλά Η τρίτη πλευρά δεν έχει πρόσβαση στο έξυπνο συμβόλαιο. Επομένως, η τιμή επιστροφής πρέπει να είναι μηδενική.
// This returns null
const temp3 = await getTemperature(raft3Node, contractAddress);
console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);
Στη συνέχεια, θα ρίξουμε μια πιο προσεκτική ματιά στην εκτέλεση ιδιωτικών συναλλαγών στο δίκτυο Quorum με web3.js. Δεδομένου ότι το μεγαλύτερο μέρος του κώδικα είναι το ίδιο για τις δημόσιες συναλλαγές, θα επισημάνουμε μόνο εκείνα τα μέρη που είναι διαφορετικά για ιδιωτικές συναλλαγές.
Λάβετε υπόψη ότι το συμβόλαιο που μεταφορτώνεται στο δίκτυο είναι αμετάβλητο, επομένως πρέπει να παραχωρηθεί άδεια πρόσβασης στους κατάλληλους κόμβους ενεργοποιώντας τη δημόσια σύμβαση τη στιγμή που θα αναπτυχθεί η σύμβαση και όχι μετά.
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’,
// Grant Permission to Contract by including nodes public keys
privateFor: [publicKey],
})
.then((contract) => {
return contract.options.address;
});
}
Οι ιδιωτικές συναλλαγές εκτελούνται με παρόμοιο τρόπο - συμπεριλαμβάνοντας το δημόσιο κλειδί των συμμετεχόντων κατά τη στιγμή της εκτέλεσης.
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,
// Grant Permission by including nodes public keys
privateFor: [publicKey],
}).then((receipt) => {
return receipt.status;
});
}
Τώρα μπορούμε να τρέξουμε private.js με τα ακόλουθα αποτελέσματα:
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
Ο εξερευνητής Quorum στο Chainstack θα εμφανίσει τα εξής:
ανάπτυξη της σύμβασης από τον συμμετέχοντα Σουπερμάρκετ;
Εκτέλεση SetTemperature από Τρίτο μέρος;
Εκτέλεση SetTemperature από έναν συμμετέχοντα Προμηθευτή.
Όπως μπορείτε να δείτε, ολοκληρώνονται και οι δύο συναλλαγές, αλλά μόνο η συναλλαγή από τον συμμετέχοντα Προμηθευτή ενημέρωσε τη θερμοκρασία στο συμβόλαιο. Έτσι, οι ιδιωτικές συναλλαγές παρέχουν αμετάβλητο, αλλά ταυτόχρονα δεν αποκαλύπτουν δεδομένα σε τρίτους.
Συμπέρασμα
Εξετάσαμε μια περίπτωση εμπορικής χρήσης για το Quorum για την παροχή ενημερωμένων πληροφοριών θερμοκρασίας σε μια αποθήκη, αναπτύσσοντας ένα δίκτυο μεταξύ δύο μερών - ενός σούπερ μάρκετ και ενός ιδιοκτήτη αποθήκης.
Δείξαμε πώς μπορούν να διατηρηθούν ενημερωμένες πληροφορίες θερμοκρασίας μέσω δημόσιων και ιδιωτικών συναλλαγών.
Μπορεί να υπάρχουν πολλά σενάρια εφαρμογής και, όπως μπορείτε να δείτε, δεν είναι καθόλου δύσκολο.