Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Quorum on Ethereum-pÔhine plokiahel, mille on vÀlja töötanud JPMorgan ja mis on hiljuti saanud esimeseks jaotatud registri platvormiks, mida pakub Microsoft Azure.

Quorum toetab privaatseid ja avalikke tehinguid ning sellel on palju kaubanduslikke kasutusstsenaariume.

Selles artiklis kĂ€sitleme ĂŒhte sellist stsenaariumi — jaotatud registri vĂ”rgu kasutuselevĂ”ttu supermarketite ja laoomanike vahel, et tagada laoinfotemperatuuri reaalajas jĂ€lgimine.

Kood, mida kasutatakse selles juhendis, pÔhineb GitHubi hoidlast.

Artikkel hÔlmab:

  • nutika lepingu loomine;
  • Quorum vĂ”rgu kasutuselevĂ”tt kasutades Chainstack;
  • Quorum avalikud tehingud;
  • Quorum privaattehingud.

Illustreerimiseks kasutatakse temperatuurimonitorimise stsenaariumi Quorum vÔrgu osaliste laoruumide vahel Internet of Things (IoT) kontekstis.

Kontekst

LadustamisettevĂ”tete grupp ĂŒhineb konsortsiumiks, et jagada teavet ja automatiseerida protsesse plokiahelas. Selleks otsustasid ettevĂ”tted kasutada Quorumit. Selles artiklis katame kahte stsenaariumi: avalikke tehinguid ja privaattehinguid.

Tehinguid loovad erinevad osalised konsortsiumiga suhtlemiseks, kuhu nad kuuluvad. Iga tehing kas laadib alla lepingu vÔi kutsub lepingus vÀlja funktsiooni, et laadida andmeid vÔrku. Need toimingud replitseeritakse kÔikides vÔrgu sÔlmedes.

Avalikud tehingud on kÔigile konsortsiumi osalistele nÀhtavad. Privaattehingud lisavad konfidentsiaalsuse kihi ja on kÀttesaadavad ainult neile osalistele, kellel on selleks Ôigused.

MÔlema stsenaariumi jaoks kasutame selguse huvides sama lepingut.

smart-contract

Allpool on esitatud lihtne nutileping, mis on loodud meie stsenaariumi jaoks. Selles on avalik muutuja temperature, mida saab muuta meetodi kaudu set ja hankida meetodi kaudu 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;
  }
}

Kuna leping peab töötama web3.js, tuleb see viia ABI ja bytecode formaati. Allpool esitatud funktsiooni formatContract, kasutatakse lepingu kompileerimiseks solc-js.

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

Valmis leping nÀeb vÀlja jÀrgmine:

// 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

NĂŒĂŒd, kui leping on valmis, kĂ€ivitame vĂ”rgu ja rakendame lepingut.

Noodide kÀivitamine

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Noodi kĂ€ivitamine vĂ”ib olla ĂŒsna aeganĂ”udev ja seda protsessi saab asendada teenuse kasutamisega Chainstack.

Allpool on Quorum vÔrgu kÀivitamise protsess Rafti konsensusega ja kolme noodiga.

Alustame projekti loomisega ja nimetame selle Quorum Project:

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Loo Quorum vÔrk Rafti konsensusega Google Cloud Platformis:

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Lisame olemasolevale vaikimisi nodile veel kaks nĂłd:

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Kolm kÀivitatud nód:

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Noodi detailide leht nÀitab RPC lÔpp-punkti, avalikku vÔtit jne.

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

VĂ”rk on kĂ€ivitatud. NĂŒĂŒd keskendume nutilepingute rakendamisele ja tehingute tĂ€itmisele kasutades web3.js.

Avalikud tehingud

Kontekst

Lao temperatuur on kulude vÀhendamiseks ÀÀrmiselt oluline, eriti madalatel temperatuuridel ladustamiseks mÔeldud toodete puhul.

Andes ettevÔtetele vÔimaluse reaalajas jagada oma geograafilise asukoha vÀlistemperatuuri vÀÀrtusi ja kanda need muutumatutesse registritesse, vÀhendavad vÔrgus osalejad kulusid ja aega.

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Teeme kolm ĂŒlesannet, nagu on nĂ€idatud diagrammil:

  1. Rakendame lepingu kaudu Node 1:

    const contractAddress = await deployContract(raft1Node);
    console.log(`Lepingu aadress pÀrast rakendamist: ${contractAddress}`);

  2. Seame temperatuuri kaudu Node 2 3 kraadi:

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

  3. Node 3 saab teavet nutilepingust. Leping tagastab vÀÀrtuse 3 kraadi:

    const temp = await getTemperature(raft3Node, contractAddress);
    console.log(‘Toodud lepingu temperatuur’, temp);

    JÀrgmisena vaatame, kuidas teostada avalikku tehingut Quorum vÔrgus kasutades web3.js.

KÀivitame eksemplari lÀbi RPC kolme nodi jaoks:

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,
 },
);

Rakendame nutilepingu:

// 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 pakub kaks meetodit lepingu interaktsiooniks: call ja send.

Uuendame lepingu temperatuuri teostamisega set kasutades meetodit 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;
  });
}

JÀrgmisena kasutame meetodit web3 call lepingu temperatuuri saamiseks. Pange tÀhele, et meetod call teostatakse lokaalses nodis ja plokiahelas tehingut ei loodud.

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

NĂŒĂŒd saab kĂ€ivitada public.js jĂ€rgmise tulemuse saamiseks:

// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3

JÀtkame Quorum'i exploreris Chainstacki paneelil salvestuste vaatamist, nagu allpool nÀidatud.

KÔik kolm sÔlme suhtlesid omavahel ja tehingud uuendati:

  1. Esimene tehing suvandas lepingu.
  2. Teine tehing seadis lepingu temperatuuri 3 kraadile.
  3. Temperatuuri saamine toimub kohaliku sÔlme kaudu, seega tehingut ei loodud.

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Privaatsed tehingud

Kontekst

Organisatsioonide sage nĂ”ue on andmete kaitsmine. NĂ€iteks vaatame olukorda, kus Supermarket rendib ladustamispinda mereandide sĂ€ilitamiseks eraldi MĂŒĂŒjalt:

  • Tootja IoT-andurite abil loetakse temperatuuri vÀÀrtusi iga 30 sekundi jĂ€rel ja edastatakse Supermarketile.;
  • Need vÀÀrtused peavad olema kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti. MĂŒĂŒjale. ja Supermarketile,millel on konsortsiumivĂ”rk.

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Me teeme neli ĂŒlesannet, nagu on illustreeritud ĂŒlaltoodud diagrammil.

  • Kasutame neid kolme sĂ”lme eelnevas stsenaariumis privaatsete tehingute demonstreerimiseks:
  • Supermarket suvandid nutileping, mis on privaatsed Supermarketile. ja MĂŒĂŒjalt.
  • Kolmandal osapoolel pole juurdepÀÀsu nutilepingule.

Kutsume vĂ€lja meetodid get ja set juhatusele Supermarketile. ja MĂŒĂŒjalt Quorum'i privaatsest tehingust demonstreerimiseks.

  1. Suudame privaatsed lepingud osalejate jaoks Supermarket ja Tootja osaleja kaudu Supermarket:

    const contractAddress = await deployContract(
    raft1Node,
    process.env.PK2,
    );
    console.log(`Lepingu aadress pÀrast paigaldamist: ${contractAddress}`);

  2. Seame temperatuuri kolmandalt osapoolelt (vÀline sÔlm) ja saame temperatuuri vÀÀrtuse:

    // 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. Seame temperatuuri MĂŒĂŒjalt (sisemine sĂ”lm) ja saame temperatuuri vÀÀrtuse:

    Selle stsenaariumi temperatuur peaks nutilepingust tagastama vÀÀrtuse 12. Pange tÀhele, et Tootja siin on lubatud juurde pÀÀs nutilepingule.

    // 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. Saame temperatuuri kolmandalt osapoolelt (vÀline sÔlm):

    Sammul 3 seati temperatuuriks 12, kuid Kolmandal osapoolel ei pÀÀse nutilepingule juurde. SeetÔttu peaks tagastatav vÀÀrtus olema null.

    // This returns null
    const temp3 = await getTemperature(raft3Node, contractAddress);
    console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);

    JĂ€tkame Quorum'i vĂ”rku privaatssete tehingute tĂ€itmise ĂŒlevaatamist, web3.js. Kuna suurem osa koodist on identne avalikele tehingutele, rĂ”hutame vaid neid osi, mis erinevad privaatsetele tehingutele.

Pange tÀhele, et vÔrgus laaditud leping on muutumatu, seega peab Ôigusi (permissioned) andma vastavatele sÔlmedele, lisades kohtuniku avaliku lepingu lepingu juurutamise hetkel, mitte pÀrast.

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', 
    // Andke lepingule Ôigused, lisades sÔlmede avalikud vÔtmed
    privateFor: [publicKey],
  })
  .then((contract) => {
    return contract.options.address;
  });
}

Samamoodi toimub privaatsete tehingute teostamine — lisades tehingu tegemise hetkel osaliste avalikud vĂ”tmed.

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,
    // Andke Ôigused, lisades sÔlmede avalikud vÔtmed
    privateFor: [publicKey],
  }).then((receipt) => {
    return receipt.status;
  });
}

NĂŒĂŒd saame alustada private.js ja tulemuste jĂ€rgmisega:

node private.js
Lepingu aadress pÀrast juurutamist: 0x85dBF88B4dfa47e73608b33454E4e3BA2812B21D
[Node3] temp on pÀrast lepingut vÀrskendades vÀliste sÔlmede kaudu: null
[Node2] temp on pÀrast lepingut vÀrskendades sisesÔlmede kaudu: 12
[Node3] temp on vÀrskendamisel vÀliste sÔlmede kaudu: null

Quorumi uurija Chainstackis nÀitab jÀrgmist:

  • lepingu juurutamine osalise poolt Supermarket;
  • Tegevus SetTemperature alates kolmandalt osapoolelt;
  • Tegevus SetTemperature osalise poolt Tootja.

Avalike ja privaatsete tehingute teostamine JPMorgan Quorum'i plokiahelas Web3 abil

Nagu nÀete, on mÔlemad tehingud tÀidetud, kuid ainult osalise tehing Tootja vÀrskendas temperatuuri lepingus. Seega tagavad privaatsete tehingute muutumatuse, kuid ei avalda andmeid kolmandatele osapooltele.

KokkuvÔte

Oleme tutvunud Quorum'i kommertsskeemidega, et tagada praegune teave temperatuuri kohta laos, juurutades vĂ”rku kahe poole vahel — supermarket ja lao omaniku.

Oleme nÀidanud, kuidas praegust teavet temperatuuri kohta saab sÀilitada nii avalike kui ka privaatsete tehingute kaudu.

Kasutusstsenaariume vÔib olla palju ja nagu nÀete, ei ole see sugugi keeruline.

Eksperimentige, proovige oma stsenaariumit juurutada. Eriti kuna plokiahelatehnoloogia tööstus vĂ”ib 2024. aastaks kasvada peaaegu kĂŒmme korda.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster