Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

kuorum është një blockchain i bazuar në Ethereum i zhvilluar nga JPMorgan dhe së fundmi u bë platforma e parë e librit të shpërndarë që ofrohet nga Microsoft Azure.

Kuorumi mbështet transaksionet private dhe publike dhe ka shumë raste të përdorimit tregtar.

Në këtë artikull, ne do të shqyrtojmë një skenar të tillë - vendosjen e një rrjeti libri të shpërndarë midis një supermarketi dhe një pronari magazine për të ofruar informacion të përditësuar në lidhje me temperaturën e magazinës.

Kodi i përdorur në këtë tutorial është në depo në GitHub.

Artikulli mbulon:

  • krijimi i një kontrate të zgjuar;
  • vendosja e rrjetit të Kuorumit duke përdorur Shtylla me zinxhirë;
  • Kuorumi i transaksioneve publike;
  • Kuorum transaksionet private.

Për ta ilustruar, ne përdorim një skenar për monitorimin e temperaturës në magazinat e anëtarëve të rrjetit Quorum brenda Internetit të Gjërave (IoT).

Kontekst

Një grup kompanish magazine po bashkohen në një konsorcium për të ruajtur së bashku informacionin dhe automatizuar proceset në blockchain. Për këtë, kompanitë vendosën të përdorin Kuorum. Në këtë artikull do të trajtojmë dy skenarë: transaksionet publike dhe transaksionet private.

Transaksionet krijohen nga pjesëmarrës të ndryshëm për të bashkëvepruar me konsorciumin të cilit i përkasin. Çdo transaksion ose vendos një kontratë ose thërret një funksion në kontratë për të ngarkuar të dhëna në rrjet. Këto veprime përsëriten në të gjitha nyjet në rrjet.

Transaksionet publike janë të disponueshme për t'u parë nga të gjithë pjesëmarrësit e konsorciumit. Transaksionet private shtojnë një shtresë konfidencialiteti dhe janë të disponueshme vetëm për ata pjesëmarrës që kanë të drejtë ta bëjnë këtë.

Për të dy skenarët, ne përdorim të njëjtën kontratë për qartësi.

Kontrata e zgjuar

Më poshtë është një kontratë e thjeshtë inteligjente e krijuar për skenarin tonë. Ka një variabël publike temperature, e cila mund të ndryshohet duke përdorur set dhe merrni me metodë 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;
  }
}

Në mënyrë që kontrata të funksionojë me web3.js, duhet të përkthehet në formatin ABI dhe bajtkodin. Duke përdorur funksionin formatContractmë poshtë përpilon kontratën duke përdorur solc-js.

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

Kontrata e përfunduar duket si kjo:

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

Tani që kontrata është gati, ne do të vendosim rrjetin dhe do të vendosim kontratën.

Vendosja e nyjeve

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Vendosja e një nyje mund të jetë mjaft punë intensive dhe ky proces mund të zëvendësohet duke përdorur një shërbim Shtylla me zinxhirë.

Më poshtë është procesi për vendosjen e rrjetit të Quorum me konsensusin Raft dhe tre nyje.

Së pari, le të krijojmë një projekt dhe ta quajmë Projekti i Kuorumit:

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Le të krijojmë një rrjet Quorum me konsensusin Raft në Google Cloud Platform:

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Le të shtojmë dy nyje të tjera në nyjen e krijuar tashmë si parazgjedhje:

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Tre nyje drejtimi:

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Faqja e detajeve të nyjës tregon pikën përfundimtare të RPC, çelësin publik, etj.

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Rrjeti është vendosur. Tani le të vendosim kontrata inteligjente dhe të kryejmë transaksione duke përdorur web3.js.

Transaksionet publike

Kontekst

Temperatura e magazinës ka një rëndësi të madhe në uljen e kostove, veçanërisht për produktet që synohen të ruhen në temperatura nën zero.

Duke i lejuar kompanitë të ndajnë temperaturën e jashtme të vendndodhjes së tyre gjeografike në kohë reale dhe ta regjistrojnë atë në një libër të pandryshueshëm, pjesëmarrësit e rrjetit reduktojnë kostot dhe kohën.

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Ne do të kryejmë tre detyra, të ilustruara në diagram:

  1. Ne do të vendosim kontratën nëpërmjet Nyja 1:

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

  2. Vendosni temperaturën nëpërmjet Nyja 2 me 3 gradë:

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

  3. Nyja 3 do të marrë informacion nga kontrata e zgjuar. Kontrata do të kthejë vlerën 3 gradë:

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

    Më pas, ne do të shikojmë se si të ekzekutojmë një transaksion publik në rrjetin e Quorum duke përdorur web3.js.

Ne inicojmë një shembull përmes RPC për tre nyje:

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

Le të vendosim kontratën e zgjuar:

// 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 ofron dy mënyra për të bashkëvepruar me kontratën: call и send.

Le të përditësojmë temperaturën e kontratës duke ekzekutuar set duke përdorur metodën 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;
  });
}

Më pas përdorim metodën web3 call për të marrë temperaturën e kontratës. Ju lutemi vini re se metoda call ekzekutohet në një nyje lokale dhe transaksioni nuk do të krijohet në 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);
}

Tani mund të vraposh publike.js për të marrë rezultatin e mëposhtëm:

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

Më pas, ne mund t'i shikojmë hyrjet në eksploruesin e Quorum në panelin e zinxhirit, siç tregohet më poshtë.

Të tre nyjet ndërvepruan dhe transaksionet u përditësuan:

  1. Transaksioni i parë vendosi kontratën.
  2. Transaksioni i dytë vendosi temperaturën e kontratës në 3 gradë.
  3. Temperatura merret përmes një nyje lokale, kështu që nuk krijohet asnjë transaksion.

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Transaksionet private

Kontekst

Një kërkesë e zakonshme e organizatave është mbrojtja e të dhënave. Si shembull, merrni parasysh një skenar në të cilin Supermarket jep me qera nje magazine per ruajtjen e ushqimeve te detit nga nje vec Shitësi:

  • Shitësi duke përdorur sensorë IoT, lexon vlerat e temperaturës çdo 30 sekonda dhe i transmeton ato Në supermarket;
  • këto vlera duhet të jenë të disponueshme vetëm Tek shitësi и Në supermarket, i lidhur në rrjet nga një konsorcium.

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Ne do të plotësojmë katër detyrat e ilustruara në diagramin e mësipërm.

  • Ne përdorim të njëjtat tre nyje nga skenari i mëparshëm për të demonstruar transaksionet private:
  • Supermarket vendos një kontratë inteligjente që është private Supermarket и Shitësi.
  • Ana e tretë nuk ka të drejtë të aksesojë kontratën inteligjente.

Ne do të quajmë metoda get и set në emër të Supermarket и Shitësi për të demonstruar një transaksion privat të Kuorumit.

  1. Ne do të vendosim një kontratë private për pjesëmarrësit Supermarket и Shitësi përmes një pjesëmarrësi Supermarket:

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

  2. Le të vendosim temperaturën nga Pala e tretë (nyja e jashtme) dhe merrni vlerën e temperaturës:

    // 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. Le të vendosim temperaturën nga Shitësi (nyja e brendshme) dhe merrni vlerën e temperaturës:

    Temperatura në këtë skenar duhet të kthejë vlerën 12 nga kontrata inteligjente. Ki parasysh këtë Shitësi këtu ka akses të autorizuar në kontratën inteligjente.

    // 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. Ne marrim temperaturën nga Pala e tretë (nyja e jashtme):

    Në hapin 3 temperatura u vendos në 12, por Ana e tretë nuk ka akses në kontratën inteligjente. Prandaj, vlera e kthyer duhet të jetë nule.

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

    Më pas, ne do të hedhim një vështrim më të afërt në kryerjen e transaksioneve private në rrjetin e Quorum me web3.js. Meqenëse pjesa më e madhe e kodit është e njëjtë për transaksionet publike, ne do të veçojmë vetëm ato pjesë që janë të ndryshme për transaksionet private.

Vini re se kontrata e ngarkuar në rrjet është e pandryshueshme, kështu që qasja e lejuar duhet t'u jepet nyjeve përkatëse duke mundësuar kontratën publike në kohën e vendosjes së kontratës, jo më pas.

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

Transaksionet private kryhen në mënyrë të ngjashme - duke përfshirë çelësin publik të pjesëmarrësve në momentin e ekzekutimit.

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

Tani mund të vrapojmë private.js me rezultatet e mëposhtme:

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

Eksploruesi i Kuorumit në Chainstack do të tregojë sa vijon:

  • vendosja e kontratës nga pjesëmarrësi Supermarket;
  • ekzekutim SetTemperature nga Pala e tretë;
  • ekzekutim SetTemperature nga një pjesëmarrës Shitësi.

Kryeni transaksione publike dhe private në blockchain JPMorgan Quorum duke përdorur Web3

Siç mund ta shihni, të dy transaksionet janë përfunduar, por vetëm transaksioni nga pjesëmarrësi Shitësi përditësoi temperaturën në kontratë. Kështu, transaksionet private ofrojnë pandryshueshmëri, por në të njëjtën kohë nuk zbulojnë të dhëna për një palë të tretë.

Përfundim

Ne shikuam një rast përdorimi komercial për Quorum për të ofruar informacione të përditësuara të temperaturës në një magazinë duke vendosur një rrjet midis dy palëve - një supermarketi dhe një pronari magazine.

Ne treguam se si informacioni i përditësuar i temperaturës mund të ruhet përmes transaksioneve publike dhe private.

Mund të ketë shumë skenarë aplikimi dhe, siç mund ta shihni, nuk është aspak e vështirë.

Eksperimentoni, përpiquni të zgjeroni skenarin tuaj. Për më tepër, industria e teknologjisë blockchain mund të rritet pothuajse dhjetëfish deri në vitin 2024.

Burimi: www.habr.com

Shto një koment