Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

kvorum je blockchain baziran na Ethereumu koji je razvio JPMorgan i nedavno je postao prva platforma distribuirane knjige koju nudi Microsoft Azure.

Kvorum podržava privatne i javne transakcije i ima mnogo slučajeva komercijalne upotrebe.

U ovom članku ćemo ispitati jedan takav scenario - postavljanje mreže distribuirane knjige između supermarketa i vlasnika skladišta kako bi se dobile ažurne informacije o temperaturi skladišta.

Kod korišten u ovom vodiču je in spremišta na GitHub-u.

Članak pokriva:

  • kreiranje pametnog ugovora;
  • postavljanje mreže Quorum koristeći Chainstack;
  • Kvorum javne transakcije;
  • Privatne transakcije kvoruma.

Za ilustraciju koristimo scenario za praćenje temperature u skladištima članova Quorum mreže u okviru Interneta stvari (IoT).

Kontekst

Grupa skladišnih kompanija ujedinjuje se u konzorcijum za zajedničko skladištenje informacija i automatizaciju procesa na blockchainu. Za to su kompanije odlučile koristiti Quorum. U ovom članku ćemo pokriti dva scenarija: javne transakcije i privatne transakcije.

Transakcije kreiraju različiti učesnici u interakciji sa konzorcijumom kojem pripadaju. Svaka transakcija ili implementira ugovor ili poziva funkciju u ugovoru za prijenos podataka na mrežu. Ove akcije se repliciraju na sve čvorove na mreži.

Javne transakcije dostupne su za uvid svim učesnicima konzorcijuma. Privatne transakcije dodaju sloj povjerljivosti i dostupne su samo onim učesnicima koji imaju prava na to.

Za oba scenarija koristimo isti ugovor radi jasnoće.

Pametan ugovor

Ispod je jednostavan pametni ugovor kreiran za naš scenario. Ima javnu varijablu temperature, koji se može promijeniti pomoću set i primati metodom 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;
  }
}

Da bi ugovor funkcionirao web3.js, mora biti preveden u ABI format i bajt kod. Korištenje funkcije formatContractu nastavku sastavlja ugovor koristeći solc-js.

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

Završeni ugovor izgleda ovako:

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

Sada kada je ugovor spreman, mi ćemo postaviti mrežu i implementirati ugovor.

Postavljanje čvora

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Postavljanje čvora može biti prilično radno intenzivan i ovaj proces se može zamijeniti korištenjem usluge Chainstack.

Ispod je proces za postavljanje mreže Quorum sa Raft konsenzusom i tri čvora.

Prvo, napravimo projekat i nazovemo ga Quorum Project:

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Kreirajmo Quorum mrežu sa Raft konsenzusom na Google Cloud Platformu:

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Dodajmo još dva čvora čvoru koji je već kreiran po defaultu:

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Tri pokrenuta čvora:

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Stranica sa detaljima o čvoru prikazuje RPC krajnju tačku, javni ključ itd.

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Mreža je raspoređena. Sada implementirajmo pametne ugovore i izvršimo transakcije koristeći web3.js.

Javne transakcije

Kontekst

Temperatura skladišta je od velike važnosti za smanjenje troškova, posebno za proizvode namijenjene skladištenju na temperaturama ispod nule.

Omogućujući kompanijama da dijele vanjsku temperaturu svoje geografske lokacije u realnom vremenu i zapisuju je u nepromjenjivu knjigu, učesnici mreže smanjuju troškove i vrijeme.

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Izvršićemo tri zadatka, prikazana na dijagramu:

  1. Ugovor ćemo implementirati putem Node 1:

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

  2. Podesite temperaturu preko Node 2 za 3 stepena:

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

  3. Node 3 će primati informacije iz pametnog ugovora. Ugovor će vratiti vrijednost 3 stepena:

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

    Zatim ćemo pogledati kako izvršiti javnu transakciju na Quorum mreži koristeći web3.js.

Pokrećemo instancu preko RPC-a za tri čvora:

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

Hajde da primenimo pametni ugovor:

// 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 pruža dvije metode za interakciju s ugovorom: call и send.

Ažurirajmo temperaturu ugovora izvršavanjem set koristeći web3 metodu 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;
  });
}

Zatim koristimo web3 metodu call da dobijete ugovornu temperaturu. Imajte na umu da je metoda call se izvršava na lokalnom čvoru i transakcija se neće kreirati na blockchainu.

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

Sada možeš da trčiš public.js da dobijete sljedeći rezultat:

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

Zatim možemo vidjeti unose u Quorum istraživaču na panelu Chainstack, kao što je prikazano ispod.

Sva tri čvora su bila u interakciji i transakcije su ažurirane:

  1. Prva transakcija je implementirala ugovor.
  2. Druga transakcija je postavila ugovornu temperaturu na 3 stepena.
  3. Temperatura se prima preko lokalnog čvora, tako da se transakcija ne kreira.

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Privatne transakcije

Kontekst

Uobičajeni zahtjev organizacija je zaštita podataka. Kao primjer, razmotrite scenario u kojem Supermarket iznajmljuje magacinski prostor za skladištenje morskih plodova iz zasebnog Vendor:

  • Vendor koristeći IoT senzore, čita temperaturne vrijednosti svakih 30 sekundi i prenosi ih U supermarket;
  • ove vrijednosti bi trebale biti dostupne samo Prodavcu и U supermarket, umrežen od strane konzorcijuma.

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Završit ćemo četiri zadatka prikazana na dijagramu iznad.

  • Koristimo ista tri čvora iz prethodnog scenarija da demonstriramo privatne transakcije:
  • Supermarket implementira pametni ugovor koji je privatan Supermarket и Vendor.
  • Treća strana nema pravo pristupa pametnom ugovoru.

Pozvaćemo metode get и set u ime Supermarket и Vendor da demonstrira privatnu transakciju kvoruma.

  1. Za učesnike ćemo postaviti privatni ugovor Supermarket и Vendor preko učesnika Supermarket:

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

  2. Podesite temperaturu od Treća stranka (vanjski čvor) i dobijte vrijednost temperature:

    // 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. Podesite temperaturu od Vendor (interni čvor) i dobijte vrijednost temperature:

    Temperatura u ovom scenariju bi trebala vratiti vrijednost 12 iz pametnog ugovora. Imajte to na umu Vendor ovdje ima ovlašteni pristup pametnom ugovoru.

    // 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. Dobijamo temperaturu iz Treća stranka (vanjski čvor):

    U koraku 3 temperatura je postavljena na 12, ali Treća strana nema pristup pametnom ugovoru. Stoga povratna vrijednost mora biti null.

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

    Zatim ćemo detaljnije pogledati izvođenje privatnih transakcija na Quorum mreži sa web3.js. Budući da je većina koda ista za javne transakcije, istaći ćemo samo one dijelove koji se razlikuju za privatne transakcije.

Imajte na umu da je ugovor učitan na mrežu nepromjenjiv, tako da se dozvoljeni pristup mora odobriti odgovarajućim čvorovima omogućavanjem javnog ugovora u vrijeme kada je ugovor raspoređen, a ne nakon toga.

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

Privatne transakcije se obavljaju na sličan način - uključivanjem javnog ključa učesnika u trenutku izvršenja.

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

Sada možemo da trčimo private.js sa sljedećim rezultatima:

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 explorer u Chainstacku će pokazati sljedeće:

  • raspoređivanje ugovora od učesnika Supermarket;
  • Performanse SetTemperature iz Treća stranka;
  • Performanse SetTemperature od učesnika Vendor.

Obavljajte javne i privatne transakcije na JPMorgan Quorum blockchainu koristeći Web3

Kao što vidite, obavljene su obje transakcije, ali samo transakcija od učesnika Vendor ažurirali temperaturu u ugovoru. Dakle, privatne transakcije pružaju nepromjenjivost, ali u isto vrijeme ne otkrivaju podatke trećoj strani.

zaključak

Pogledali smo slučaj komercijalne upotrebe za Quorum za pružanje ažuriranih informacija o temperaturi u skladištu postavljanjem mreže između dvije strane - supermarketa i vlasnika skladišta.

Pokazali smo kako se ažurne informacije o temperaturi mogu održavati putem javnih i privatnih transakcija.

Može biti mnogo scenarija primjene i, kao što vidite, nije nimalo teško.

Eksperimentirajte, pokušajte proširiti svoj skript. Štaviše, industrija blockchain tehnologije mogao bi porasti skoro deset puta do 2024.

izvor: www.habr.com

Dodajte komentar