Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Απαρτία είναι ένα blockchain που βασίζεται στο Ethereum που αναπτύχθηκε από την JPMorgan και πρόσφατα έγινε η πρώτη πλατφόρμα κατανεμημένης λογιστικής που προσφέρεται από το Microsoft Azure.

Το Quorum υποστηρίζει ιδιωτικές και δημόσιες συναλλαγές και έχει πολλές περιπτώσεις εμπορικής χρήσης.

Σε αυτό το άρθρο, θα εξετάσουμε ένα τέτοιο σενάριο - την ανάπτυξη ενός δικτύου κατανεμημένης λογιστικής μεταξύ ενός σούπερ μάρκετ και ενός ιδιοκτήτη αποθήκης για την παροχή ενημερωμένων πληροφοριών σχετικά με τη θερμοκρασία της αποθήκης.

Ο κώδικας που χρησιμοποιείται σε αυτό το σεμινάριο είναι in αποθετήρια στο GitHub.

Το άρθρο καλύπτει:

  • δημιουργία έξυπνου συμβολαίου.
  • ανάπτυξη του δικτύου 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.

function formatContract() {
  const path = './contracts/temperatureMonitor.sol';
  const source = fs.readFileSync(path,'UTF8');
return solc.compile(source, 1).contracts[':TemperatureMonitor'];
}

Το ολοκληρωμένο συμβόλαιο μοιάζει με αυτό:

// interface
[ 
  { 
    constant: true,
    inputs: [],
    name: ‘get’,
    outputs: [Array],
    payable: false,
    stateMutability: ‘view’,
    type: ‘function’ 
  },
  { 
    constant: true,
    inputs: [],
    name: ‘temperature’,
    outputs: [Array],
    payable: false,
    stateMutability: ‘view’,
    type: ‘function’ 
  },
  {
    constant: false,
    inputs: [Array],
    name: ‘set’,
    outputs: [],
    payable: false,
    stateMutability: ‘nonpayable’,
    type: ‘function’ 
  }
]

// bytecode
0x608060405234801561001057600080fd5b50610104806100206000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636d4ce63c81146057578063adccea12146082578063faee13b9146094575b600080fd5b348015606257600080fd5b50606960ae565b60408051600092830b90920b8252519081900360200190f35b348015608d57600080fd5b50606960b7565b348015609f57600080fd5b5060ac60043560000b60c0565b005b60008054900b90565b60008054900b81565b6000805491810b60ff1660ff199092169190911790555600a165627a7a72305820af0086d55a9a4e6d52cb6b3967afd764ca89df91b2f42d7bf3b30098d222e5c50029

Τώρα που η σύμβαση είναι έτοιμη, θα αναπτύξουμε το δίκτυο και θα αναπτύξουμε τη σύμβαση.

Ανάπτυξη κόμβου

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Η ανάπτυξη ενός κόμβου μπορεί να είναι αρκετά απαιτητική και αυτή η διαδικασία μπορεί να αντικατασταθεί χρησιμοποιώντας μια υπηρεσία Αλυσίδα.

Ακολουθεί η διαδικασία για την ανάπτυξη του δικτύου Quorum με συναίνεση Raft και τρεις κόμβους.

Αρχικά, ας δημιουργήσουμε ένα έργο και ας το ονομάσουμε Απαρτία Έργο:

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Ας δημιουργήσουμε ένα δίκτυο Quorum με συναίνεση Raft στο Google Cloud Platform:

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Ας προσθέσουμε δύο ακόμη κόμβους στον κόμβο που έχει ήδη δημιουργηθεί από προεπιλογή:

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Τρεις κόμβοι λειτουργίας:

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Η σελίδα λεπτομερειών κόμβου εμφανίζει το τελικό σημείο RPC, το δημόσιο κλειδί κ.λπ.

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Το δίκτυο έχει αναπτυχθεί. Τώρα ας αναπτύξουμε έξυπνα συμβόλαια και ας εκτελέσουμε συναλλαγές χρησιμοποιώντας web3.js.

Δημόσιες συναλλαγές

Πλαίσιο

Η θερμοκρασία της αποθήκης έχει μεγάλη σημασία για τη μείωση του κόστους, ειδικά για προϊόντα που προορίζονται να αποθηκεύονται σε θερμοκρασίες κάτω του μηδενός.

Επιτρέποντας στις εταιρείες να μοιράζονται την εξωτερική θερμοκρασία της γεωγραφικής τους θέσης σε πραγματικό χρόνο και να την καταγράφουν σε ένα αμετάβλητο καθολικό, οι συμμετέχοντες στο δίκτυο μειώνουν το κόστος και τον χρόνο.

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Θα εκτελέσουμε τρεις εργασίες, που απεικονίζονται στο διάγραμμα:

  1. Θα αναπτύξουμε τη σύμβαση μέσω Κόμβος 1:

    const contractAddress = await deployContract(raft1Node);
    console.log(`Contract address after deployment: ${contractAddress}`);

  2. Ρυθμίστε τη θερμοκρασία μέσω Κόμβος 2 κατά 3 βαθμούς:

    const status = await setTemperature(raft2Node, contractAddress, 3);
    console.log(`Transaction status: ${status}`);

  3. Κόμβος 3 θα λάβει πληροφορίες από το έξυπνο συμβόλαιο. Το συμβόλαιο θα επιστρέψει την τιμή 3 μοίρες:

    const temp = await getTemperature(raft3Node, contractAddress);
    console.log(‘Retrieved contract Temperature’, temp);

    Στη συνέχεια, θα εξετάσουμε πώς να εκτελέσετε μια δημόσια συναλλαγή στο δίκτυο 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, όπως φαίνεται παρακάτω.

Και οι τρεις κόμβοι αλληλεπιδρούσαν και οι συναλλαγές ενημερώθηκαν:

  1. Η πρώτη συναλλαγή ανέπτυξε τη σύμβαση.
  2. Η δεύτερη συναλλαγή όρισε τη θερμοκρασία του συμβολαίου στους 3 βαθμούς.
  3. Η θερμοκρασία λαμβάνεται μέσω ενός τοπικού κόμβου, επομένως δεν δημιουργείται καμία συναλλαγή.

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Ιδιωτικές συναλλαγές

Πλαίσιο

Μια κοινή απαίτηση των οργανισμών είναι η προστασία δεδομένων. Ως παράδειγμα, εξετάστε ένα σενάριο στο οποίο Σουπερμάρκετ ενοικιάζει αποθήκη για αποθήκευση θαλασσινών από ξεχωριστό Προμηθευτή:

  • Προμηθευτή χρησιμοποιώντας αισθητήρες IoT, διαβάζει τις τιμές θερμοκρασίας κάθε 30 δευτερόλεπτα και τις μεταδίδει Στην υπεραγορά;
  • αυτές οι τιμές θα πρέπει να είναι διαθέσιμες μόνο Στον πωλητή и Στην υπεραγορά, δικτυωμένο από κοινοπραξία.

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Θα ολοκληρώσουμε τις τέσσερις εργασίες που απεικονίζονται στο παραπάνω διάγραμμα.

  • Χρησιμοποιούμε τους ίδιους τρεις κόμβους από το προηγούμενο σενάριο για να επιδείξουμε ιδιωτικές συναλλαγές:
  • Σουπερμάρκετ αναπτύσσει ένα έξυπνο συμβόλαιο που είναι ιδιωτικό Σουπερμάρκετ и Προμηθευτή.
  • Η τρίτη πλευρά δεν έχει δικαίωμα πρόσβασης στο έξυπνο συμβόλαιο.

Θα καλέσουμε τις μεθόδους get и set εκ μέρους του Σουπερμάρκετ и Προμηθευτή για να επιδείξετε μια ιδιωτική συναλλαγή Απαρτίας.

  1. Θα αναπτύξουμε ένα ιδιωτικό συμβόλαιο για τους συμμετέχοντες Σουπερμάρκετ и Προμηθευτή μέσω ενός συμμετέχοντος Σουπερμάρκετ:

    const contractAddress = await deployContract(
    raft1Node,
    process.env.PK2,
    );
    console.log(`Contract address after deployment: ${contractAddress}`);

  2. Ας ρυθμίσουμε τη θερμοκρασία από Τρίτο μέρος (εξωτερικός κόμβος) και λάβετε την τιμή θερμοκρασίας:

    // 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}`);

  3. Ας ρυθμίσουμε τη θερμοκρασία από Προμηθευτή (εσωτερικός κόμβος) και λάβετε την τιμή θερμοκρασίας:

    Η θερμοκρασία σε αυτό το σενάριο θα πρέπει να επιστρέψει την τιμή 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}`);

  4. Παίρνουμε τη θερμοκρασία από Τρίτο μέρος (εξωτερικός κόμβος):

    Στο βήμα 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 από έναν συμμετέχοντα Προμηθευτή.

Εκτελέστε δημόσιες και ιδιωτικές συναλλαγές στο blockchain JPMorgan Quorum χρησιμοποιώντας το Web3

Όπως μπορείτε να δείτε, ολοκληρώνονται και οι δύο συναλλαγές, αλλά μόνο η συναλλαγή από τον συμμετέχοντα Προμηθευτή ενημέρωσε τη θερμοκρασία στο συμβόλαιο. Έτσι, οι ιδιωτικές συναλλαγές παρέχουν αμετάβλητο, αλλά ταυτόχρονα δεν αποκαλύπτουν δεδομένα σε τρίτους.

Συμπέρασμα

Εξετάσαμε μια περίπτωση εμπορικής χρήσης για το Quorum για την παροχή ενημερωμένων πληροφοριών θερμοκρασίας σε μια αποθήκη, αναπτύσσοντας ένα δίκτυο μεταξύ δύο μερών - ενός σούπερ μάρκετ και ενός ιδιοκτήτη αποθήκης.

Δείξαμε πώς μπορούν να διατηρηθούν ενημερωμένες πληροφορίες θερμοκρασίας μέσω δημόσιων και ιδιωτικών συναλλαγών.

Μπορεί να υπάρχουν πολλά σενάρια εφαρμογής και, όπως μπορείτε να δείτε, δεν είναι καθόλου δύσκολο.

Πειραματιστείτε, προσπαθήστε να επεκτείνετε το σενάριό σας. Επιπλέον, η βιομηχανία τεχνολογίας blockchain θα μπορούσε να δεκαπλασιαστεί σχεδόν μέχρι το 2024.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο