Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Kvoorum on Ethereumil põhinev plokiahel, mille on välja töötanud JPMorgan ja millest sai hiljuti esimene hajutatud pearaamatu platvorm, mida Microsoft Azure pakkus.

Quorum toetab era- ja avalikke tehinguid ning sellel on palju kommertskasutuse juhtumeid.

Käesolevas artiklis uurime üht sellist stsenaariumi – hajutatud pearaamatuvõrgu juurutamist supermarketi ja laoomaniku vahel, et pakkuda ajakohast teavet lao temperatuuri kohta.

Selles õpetuses kasutatud kood on sees hoidlad GitHubis.

Artikkel hõlmab järgmist:

  • nutika lepingu loomine;
  • Kvoorumi võrgu juurutamine kasutades Ahelas;
  • Kvoorumi avalikud tehingud;
  • Kvoorumi eratehingud.

Illustreerimiseks kasutame asjade Internetis (IoT) Quorumi võrgu liikmete ladude temperatuuri jälgimise stsenaariumi.

Kontekst

Rühm laoettevõtteid ühineb konsortsiumiks, et ühiselt salvestada teavet ja automatiseerida protsesse plokiahelas. Selleks otsustasid ettevõtted kasutada Kvoorumit. Selles artiklis käsitleme kahte stsenaariumi: avalikud tehingud ja eratehingud.

Tehinguid loovad erinevad osalejad, et suhelda konsortsiumiga, kuhu nad kuuluvad. Iga tehing juurutab lepingu või kutsub välja lepingus oleva funktsiooni andmete võrku üleslaadimiseks. Need toimingud kopeeritakse kõikidesse võrgu sõlmedesse.

Avalikke tehinguid saavad vaadata kõik konsortsiumis osalejad. Eratehingud lisavad konfidentsiaalsuskihi ja on kättesaadavad ainult neile osalejatele, kellel on selleks õigus.

Mõlema stsenaariumi puhul kasutame selguse huvides sama lepingut.

Nutikas leping

Allpool on meie stsenaariumi jaoks loodud lihtne nutikas leping. Sellel on avalik muutuja temperature, mida saab muuta kasutades set ja saada meetodi järgi 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;
  }
}

Et leping töötaks web3.js, tuleb see tõlkida ABI-vormingusse ja baitkoodi. Funktsiooni kasutamine formatContractallpool koostab lepingu kasutades solc-js.

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

Täidetud leping näeb välja selline:

// 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, võtame kasutusele võrgu ja võtame kasutusele lepingu.

Sõlme juurutamine

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Sõlme juurutamine võib olla üsna töömahukas ja selle protsessi saab asendada teenuse kasutamisega Ahelas.

Allpool on toodud Quorumi võrgu juurutamise protsess Raft konsensuse ja kolme sõlmega.

Kõigepealt loome projekti ja nimetame seda Kvoorumi projektiks:

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Loome Google Cloud Platformis Raft konsensusega Quorum-võrgu:

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Lisame vaikimisi juba loodud sõlmele veel kaks sõlme:

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Kolm töötavat sõlme:

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Sõlme üksikasjade lehel kuvatakse RPC lõpp-punkt, avalik võti jne.

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Võrk on kasutusele võetud. Nüüd juurutame nutikad lepingud ja teostame tehinguid kasutades web3.js.

Avalikud tehingud

Kontekst

Laotemperatuuril on suur tähtsus kulude vähendamisel, eriti nende toodete puhul, mis on mõeldud säilitamiseks miinustemperatuuril.

Lubades ettevõtetel jagada oma geograafilise asukoha välistemperatuuri reaalajas ja salvestada see muutumatusse pearaamatusse, vähendavad võrguosalised kulusid ja aega.

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Teeme kolm ülesannet, mis on näidatud diagrammil:

  1. Rakendame lepingu kaudu Sõlm 1:

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

  2. Seadke temperatuur läbi Sõlm 2 3 kraadi võrra:

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

  3. Sõlm 3 saab infot nutilepingust. Leping tagastab väärtuse 3 kraadi:

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

    Järgmisena vaatame, kuidas teha avalikku tehingut Quorumi võrgus kasutades web3.js.

Käivitame eksemplari RPC kaudu kolme sõlme 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,
 },
);

Võtame kasutusele nutika lepingu:

// 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 lepinguga suhtlemiseks kahte meetodit: call и send.

Värskendame lepingu temperatuuri käivitades set kasutades web3 meetodit 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 web3 meetodit call lepingu temperatuuri saamiseks. Pange tähele, et meetod call täidetakse kohalikus sõlmes ja tehingut plokiahelas ei looda.

// 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 saate joosta 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ärgmisena saame vaadata Kvoorumi uurija kirjeid Chainstacki paneelil, nagu allpool näidatud.

Kõik kolm sõlme suhtlesid ja tehinguid värskendati:

  1. Esimese tehinguga rakendati leping.
  2. Teine tehing määras lepingu temperatuuriks 3 kraadi.
  3. Temperatuur võetakse vastu kohaliku sõlme kaudu, seega tehingut ei looda.

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Eratehingud

Kontekst

Organisatsioonide levinud nõue on andmekaitse. Vaatleme näiteks stsenaariumi, mille puhul Supermarket rendib eraldi laopinna mereandide hoidmiseks Müüja:

  • Müüja IoT andureid kasutades loeb temperatuuriväärtusi iga 30 sekundi järel ja edastab need Supermarketisse;
  • need väärtused peaksid olema ainult saadaval Müüjale и Supermarketisse, mis on ühendatud konsortsiumiga.

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Me täidame ülaltoodud diagrammil näidatud neli ülesannet.

  • Privaatsete tehingute demonstreerimiseks kasutame eelmise stsenaariumi kolme sõlme:
  • Supermarket juurutab nutika lepingu, mis on privaatne Supermarket и Müüja.
  • Kolmas pool ei oma nutilepingule ligipääsu õigust.

Me nimetame meetodeid get и set nimel Supermarket и Müüja Kvoorumi eratehingu demonstreerimiseks.

  1. Osalejate jaoks sõlmime eralepingu Supermarket и Müüja osaleja kaudu Supermarket:

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

  2. Seadme temperatuuri alates Kolmas osapool (väline sõlm) ja hankige temperatuuri väärtus:

    // 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. Seadme temperatuuri alates Müüja (sisemine sõlm) ja hankige temperatuuri väärtus:

    Selle stsenaariumi temperatuur peaks tagastama nutika lepingu väärtuse 12. Pange tähele Müüja siin on volitatud juurdepääs nutikale lepingule.

    // 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 alates Kolmas osapool (väline sõlm):

    Sammus 3 määrati temperatuur 12, kuid Kolmas pool puudub juurdepääs nutikale lepingule. Seetõttu peab 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ärgmisena vaatleme lähemalt privaatsete tehingute sooritamist Quorumi võrgus web3.js. Kuna suurem osa koodist on avalike tehingute puhul sama, siis toome esile ainult need osad, mis eratehingute puhul erinevad.

Pange tähele, et võrku üles laaditud leping on muutumatu, seega tuleb lubada juurdepääs asjakohastele sõlmedele, lubades riigilepingu lepingu juurutamise ajal, mitte pärast seda.

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

Privaattehingud tehakse sarnaselt – kaasates osalejate avaliku võtme täitmise hetkel.

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

Nüüd saame joosta private.js järgmiste tulemustega:

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

Kvoorumi uurija Chainstackis näitab järgmist:

  • lepingu rakendamine osalejalt Supermarket;
  • Performance SetTemperature pärit Kolmas osapool;
  • Performance SetTemperature osalejalt Müüja.

Tehke JPMorgan Quorumi plokiahelas avalikke ja privaatseid tehinguid, kasutades Web3

Nagu näete, sooritatakse mõlemad tehingud, kuid ainult osaleja tehing Müüja uuendas lepingus temperatuuri. Seega annavad eratehingud muutumatuse, kuid samas ei avalda andmeid kolmandale osapoolele.

Järeldus

Vaatasime Quorumi ärilise kasutuse juhtumit, et pakkuda laos ajakohast temperatuuriteavet, juurutades võrgu kahe osapoole – supermarketi ja laoomaniku – vahel.

Näitasime, kuidas ajakohast temperatuuriinfot saab hoida nii avalike kui ka eratehingute kaudu.

Rakendusstsenaariume võib olla palju ja nagu näete, pole see sugugi keeruline.

Katsetage, proovige oma skripti laiendada. Pealegi plokiahela tehnoloogiatööstus võib 2024. aastaks kasvada peaaegu kümnekordseks.

Allikas: www.habr.com

Lisa kommentaar