
â Ethereum-pĂ”hine plokiahel, mille on vĂ€lja töötanud JPMorgan ja mis on hiljuti saanud Microsoft Azure'i poolt pakutakse esimene jaotatud pearaamatute platvorm.
Quorum toetab nii privaatsed kui ka avalikud tehingud ning sellel on palju Àrilisi kasutusvÔimalusi.
Selles artiklis arutame ĂŒhte sellist stsenaariumi â jaotatud pearaamatu vĂ”rgu juurutamist supermarketite ja ladude omanike vahel, et tagada ladustustingimuste temperatuuri tĂ€psus.
Kood, mida selles juhendis kasutatakse, asub .
Artikkel katab:
- nutilepingu loomine;
- Quorum vÔrgustiku juurutamine ;
- Quorum avalikud tehingud;
- Quorum privaatsed tehingud.
Illustreerimiseks kasutatakse temperatuuri jÀlgimise stsenaariumi Quorum vÔrgu liikmete ladudes Internet of Things (IoT) raames.
Kontekst
LadustamisettevÔtted loovad konsortsiumi, et jagada teavet ja automatiseerida protsesse plokiahelas. Selleks otsustasid ettevÔtted kasutada Quorum'i. Selles artiklis katame kaks stsenaariumi: avalikud tehingud ja privaatsed tehingud.
Tehingud luuakse erinevate osalejate poolt, et suhelda konsortsiumiga, mille moodustavad. Iga tehing kas kasutab lepingut vĂ”i kutsub vĂ€lja funktsiooni lepingus andmete vĂ”rgus ĂŒleslaadimiseks. Need toimingud replitseeritakse kĂ”igile vĂ”rgus olevatele nodidele.
Avalikud tehingud on kÔigile konsortsiumi osalejatele vaatamiseks kergesti kÀttesaadavad. Privaatsed tehingud lisavad aga konfidentsiaalsuse kihi, ja need on kergesti kÀttesaadavad ainult neile osalejatele, kellel on selleks Ôigused.
MĂ”lemas scenaaris kasutame silmapaistvuse tĂ”ttu ĂŒhte ja sama lepingut.
Nutileping
Allpool on lihtne nutileping, mis on loodud meie stsenaariumi jaoks. Sellel on avalik muutuja temperature, mida saab muuta meetodi set ja mis on saadaval meetodi 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 , peab see olema konverteeritud ABI ja bytecode formaati. Funktsiooni formatContract, mis on allpool esitatud, kompileerib lepingut kasutades .
function formatContract() {
const path = './contracts/temperatureMonitor.sol';
const source = fs.readFileSync(path,'UTF8');
return solc.compile(source, 1).contracts[':TemperatureMonitor'];
}Valminud leping nÀeb vÀlja jÀrgmiselt:
// 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
0x608060405234801561001057600080fd5b50610104806100206000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636d4ce63c81146057578063adccea12146082578063faee13b9146094575b600080fd5b348015606257600080fd5b50606960ae565b60408051600092830b90920b8252519081900360200190f35b348015608d57600080fd5b50606960b7565b348015609f57600080fd5b5060ac60043560000b60c0565b005b60008054900b90565b60008054900b81565b6000805491810b60ff1660ff199092169190911790555600a165627a7a72305820af0086d55a9a4e6d52cb6b3967afd764ca89df91b2f42d7bf3b30098d222e5c50029NĂŒĂŒd, kui leping on valmis, kĂ€ivitame vĂ”rgu ja juurutame lepingu.
Node'ide juurutamine

Node'ide juurutamine vĂ”ib olla ĂŒsna aeganĂ”udev ja seda protsessi saab asendada teenuse kasutamisega. .
Allpool on toodud Quorum vÔrgu juurutamise protsess Rafti konsensuse ja kolme node'iga.
Alustamiseks loome projekti ja nimetame selle Quorum projektiks:

Loome Quorum vÔrgu Rafti konsensusega Google Cloud Platformis:

Lisame juba loodud vaikimisi node'ile veel kaks node'id:

Kolm aktiivset node'ed:

Node'i detailide leht nÀitab RPC lÔpp-punkti, avalikku vÔtme jne.

VĂ”rk on juurutatud. NĂŒĂŒd keskendume nutilepingute juurutamisele ja tehingute tegemisele kasutades. .
Avalikud tehingud
Kontekst
Laokambrist saadud temperatuur on kulude vÀhendamiseks vÀga oluline, eriti toodetele, mis on ette nÀhtud madalatel temperatuuridel ladustamiseks.
Andmete jagamine vÀlise temperatuuriga oma geograafilises asukohas reaalajas ja selle salvestamine muutumatutesse registritesse vÔimaldab ettevÔtetel vÀhendada kulusid ja aega.

Me tĂ€idame kolm ĂŒlesannet, nagu on nĂ€idatud diagrammil:
Leidsime lepingu kaudu Node 1:
const contractAddress = await deployContract(raft1Node); console.log(`Lepingu aadress pÀrast juurutamist: ${contractAddress}`);Seame temperatuuri lÀbi Node 2 kolme kraadi vÔrra:
const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Tehingu olek: ${status}`);Node 3 saab teavet nutilepingust. Leping tagastab vÀÀrtuse 3 kraadi:
const temp = await getTemperature(raft3Node, contractAddress); console.log('Saadud lepingu temperatuur', temp);Edasi vaatame, kuidas teostada avalikku tehingut Quorum'is, kasutades .
Algatame instantsi kolme sÔlme kaudu RPC:
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,
},
);Leidke nutileping:
// 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;
});
} pakub kahte meetodit, et suhelda lepinguga: call ja send.
Uuendame lepingu temperatuuri teostamisega 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;
});
}Edasi kasutame web3 meetodit call lepingute temperatuuri saamiseks. Pange tÀhele, et meetod call kÀivitub kohaliku noodiga ja plokiahelas tehingut ei registreerita.
// 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 saame kĂ€ivitada jĂ€rgmise tulemuse saamiseks:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3Edasi saame nÀha kirjeid Quorum'i eksploreris Chainstacki paneelil, nagu allpool nÀidatud.
KÔik kolm nooti suhtlesid ja tehingud uuendati:
- Esimene tehing tÔstis lepingut.
- Teine tehing seadis lepingute temperatuuri 3 kraadi.
- Temperatuuri saamine toimub kohaliku noodiga, seega tehingut ei registreerita.

Privaatsed tehingud
Kontekst
Organisatsioonide sage nÔue on andmete kaitsmine. NÀiteks arutame stsenaariumi, kus Supermarket rendib laopinda mereandide hoidmiseks eraldi Teenusepakkuja:
- Tarnija IoT-anduritena loetakse temperatuuri vÀÀrtusi iga 30 sekundi jÀrel ja edastatakse Supermarketile;
- need vÀÀrtused peavad olema kĂ€ttesaadavad ainult Teenusepakkujale ja Supermarketile, mis on ĂŒhendatud konsortsiumi vĂ”rku.

Viime ellu neli ĂŒlesannet, nagu on illustreeritud ĂŒlaltoodud diagrammil.
- Kasutame sama kolme sÔlme eelnevas stsenaariumis privaatsete tehingute demonstreerimiseks:
- Supermarket tÔukab vÀlja nutileping, mis on privaatsed Supermarketile ja Teenusepakkuja.
- Kolmas osaline ei pÀÀse nutilepingule.
Kutsume vÀlja meetodeid get ja set esindajana Supermarketile ja Teenusepakkuja Quorum'i privaatse tehingu demonstreerimiseks.
KĂ€ivitame privaatsed lepingud osalejate jaoks Supermarket ja Tarnija osaleja kaudu Supermarket:
const contractAddress = await deployContract( raft1Node, process.env.PK2, ); console.log(`Lepingu aadress pÀrast juurutamist: ${contractAddress}`);Seame temperatuuri Kolmandalt osaliselt (vÀlisest sÔlmest) 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}`);Seame temperatuuri Teenusepakkuja (sisemisest sÔlmest) ja saame temperatuuri vÀÀrtuse:
Temperatuur peaks selles stsenaariumis nutilepingust tagastama vÀÀrtuse 12. Pange tÀhele, et Tarnija siin on lubatud juurdepÀÀ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}`);Saame temperatuuri Kolmandalt osaliselt (vÀlisest sÔlmest):
Sammule 3 seati temperatuur vÀÀrtuseks 12, kuid Kolmas osaline ei pÀÀse nutilepingule. SeetÔttu peaks tagastus olema null.
// This returns null const temp3 = await getTemperature(raft3Node, contractAddress); console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);Vaatame pÔhjalikumalt privaatsete tehingute tÀitmist Quorum'i vÔrgus . Kuna enamus koodist on jagatud avalike tehingutega, eristame ainult neid osi, mis on erinevad privaatsete tehingute jaoks.
Pange tÀhele, et vÔrku laaditud leping on muutamatu, seetÔttu peab juurdepÀÀs (permissioned) olema antud vastavatele sÔlmedele, lisades avaliku lepingu lepingu juurutamise hetkel, mitte hiljem.
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;
});
}Sarnasel viisil toimuvad privaatsete tehingute teostamine â lisades osalejate avaliku vĂ”tme teostamise 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 kĂ€ivitada jĂ€rgnevate tulemustega:
node private.js
Lepingu aadress pÀrast juurutamist: 0x85dBF88B4dfa47e73608b33454E4e3BA2812B21D
[Node3] ajutine, mis on saadud lepingu vÀrskendamisel vÀlistest sÔlmedest: null
[Node2] ajutine, mis on saadud lepingu vÀrskendamisel sisemistest sÔlmedest: 12
[Node3] ajutine, mis on saadud vÀlistest sÔlmedest pÀrast vÀrskendust nullQuorum'i eksplorer Chainstackis nÀitab jÀrgmist:
- lepingu juurutamine osaleja poolt Supermarket;
- TĂ€itmises
SetTemperaturealates Kolmandalt osaliselt; - TĂ€itmises
SetTemperatureosaleja poolt Tarnija.

Nagu nÀete, on mÔlemad tehingud toimunud, kuid ainult osaleja tehing Tarnija uuendas temperatuuri lepingus. Seega tagavad privaattehingud muutumatuse, kuid samas ei paljasta kolmandale osapoolele andmeid.
KokkuvÔte
Oleme kĂ€sitlenud Quorum'i Ă€rilisse stsenaariumisse, et tagada vajalik teave temperatuuri kohta laohoones, juurutades vĂ”rku kahe osapoole vahel â supermarket ja lao omanik.
Oleme nĂ€idanud, kuidas vajalik teave temperatuuri kohta vĂ”ib pĂŒsida nii avalike kui ka privaatsete tehingute kaudu.
Rakendusskeeme vÔib olla vÀga palju ja nagu nÀete, ei ole see sugugi keeruline.
Katsuge, proovige juurutada oma stsenaariumi. Eriti arvestades, et plokiahela tehnoloogia tööstus .
Allikas: habr.com
