ProHoster > Блог > Administracija > 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.
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.
Sada kada je ugovor spreman, mi ćemo postaviti mrežu i implementirati ugovor.
Postavljanje čvora
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:
Kreirajmo Quorum mrežu sa Raft konsenzusom na Google Cloud Platformu:
Dodajmo još dva čvora čvoru koji je već kreiran po defaultu:
Tri pokrenuta čvora:
Stranica sa detaljima o čvoru prikazuje RPC krajnju tačku, javni ključ itd.
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.
Izvršićemo tri zadatka, prikazana na dijagramu:
Ugovor ćemo implementirati putem Node 1:
const contractAddress = await deployContract(raft1Node);
console.log(`Contract address after deployment: ${contractAddress}`);
Podesite temperaturu preko Node 2 za 3 stepena:
const status = await setTemperature(raft2Node, contractAddress, 3);
console.log(`Transaction status: ${status}`);
Node 3 će primati informacije iz pametnog ugovora. Ugovor će vratiti vrijednost 3 stepena:
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:
Prva transakcija je implementirala ugovor.
Druga transakcija je postavila ugovornu temperaturu na 3 stepena.
Temperatura se prima preko lokalnog čvora, tako da se transakcija ne kreira.
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.
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.
Za učesnike ćemo postaviti privatni ugovor Supermarket и Vendor preko učesnika Supermarket:
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}`);
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}`);
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.
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.