
on Ethereum-pÔhine plokiahel, mille on vÀlja töötanud JPMorgan ja mis on hiljuti saanud esimeseks jaotatud registri platvormiks, mida pakub Microsoft Azure.
Quorum toetab privaatseid ja avalikke tehinguid ning sellel on palju kaubanduslikke kasutusstsenaariume.
Selles artiklis kĂ€sitleme ĂŒhte sellist stsenaariumi â jaotatud registri vĂ”rgu kasutuselevĂ”ttu supermarketite ja laoomanike vahel, et tagada laoinfotemperatuuri reaalajas jĂ€lgimine.
Kood, mida kasutatakse selles juhendis, pÔhineb .
Artikkel hÔlmab:
- nutika lepingu loomine;
- Quorum vÔrgu kasutuselevÔtt kasutades ;
- Quorum avalikud tehingud;
- Quorum privaattehingud.
Illustreerimiseks kasutatakse temperatuurimonitorimise stsenaariumi Quorum vÔrgu osaliste laoruumide vahel Internet of Things (IoT) kontekstis.
Kontekst
LadustamisettevĂ”tete grupp ĂŒhineb konsortsiumiks, et jagada teavet ja automatiseerida protsesse plokiahelas. Selleks otsustasid ettevĂ”tted kasutada Quorumit. Selles artiklis katame kahte stsenaariumi: avalikke tehinguid ja privaattehinguid.
Tehinguid loovad erinevad osalised konsortsiumiga suhtlemiseks, kuhu nad kuuluvad. Iga tehing kas laadib alla lepingu vÔi kutsub lepingus vÀlja funktsiooni, et laadida andmeid vÔrku. Need toimingud replitseeritakse kÔikides vÔrgu sÔlmedes.
Avalikud tehingud on kÔigile konsortsiumi osalistele nÀhtavad. Privaattehingud lisavad konfidentsiaalsuse kihi ja on kÀttesaadavad ainult neile osalistele, kellel on selleks Ôigused.
MÔlema stsenaariumi jaoks kasutame selguse huvides sama lepingut.
smart-contract
Allpool on esitatud lihtne nutileping, mis on loodud meie stsenaariumi jaoks. Selles on avalik muutuja temperature, mida saab muuta meetodi kaudu set ja hankida meetodi kaudu 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 , tuleb see viia ABI ja bytecode formaati. Allpool esitatud funktsiooni formatContract, kasutatakse lepingu kompileerimiseks .
function formatContract() {
const path = '.\/contracts\/temperatureMonitor.sol';
const source = fs.readFileSync(path,'UTF8');
return solc.compile(source, 1).contracts[':TemperatureMonitor'];
}Valmis leping nÀeb vÀlja jÀrgmine:
// 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 rakendame lepingut.
Noodide kÀivitamine

Noodi kĂ€ivitamine vĂ”ib olla ĂŒsna aeganĂ”udev ja seda protsessi saab asendada teenuse kasutamisega .
Allpool on Quorum vÔrgu kÀivitamise protsess Rafti konsensusega ja kolme noodiga.
Alustame projekti loomisega ja nimetame selle Quorum Project:

Loo Quorum vÔrk Rafti konsensusega Google Cloud Platformis:

Lisame olemasolevale vaikimisi nodile veel kaks nĂłd:

Kolm kÀivitatud nód:

Noodi detailide leht nÀitab RPC lÔpp-punkti, avalikku vÔtit jne.

VĂ”rk on kĂ€ivitatud. NĂŒĂŒd keskendume nutilepingute rakendamisele ja tehingute tĂ€itmisele kasutades .
Avalikud tehingud
Kontekst
Lao temperatuur on kulude vÀhendamiseks ÀÀrmiselt oluline, eriti madalatel temperatuuridel ladustamiseks mÔeldud toodete puhul.
Andes ettevÔtetele vÔimaluse reaalajas jagada oma geograafilise asukoha vÀlistemperatuuri vÀÀrtusi ja kanda need muutumatutesse registritesse, vÀhendavad vÔrgus osalejad kulusid ja aega.

Teeme kolm ĂŒlesannet, nagu on nĂ€idatud diagrammil:
Rakendame lepingu kaudu Node 1:
const contractAddress = await deployContract(raft1Node); console.log(`Lepingu aadress pÀrast rakendamist: ${contractAddress}`);Seame temperatuuri kaudu Node 2 3 kraadi:
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(âToodud lepingu temperatuurâ, temp);JĂ€rgmisena vaatame, kuidas teostada avalikku tehingut Quorum vĂ”rgus kasutades .
KÀivitame eksemplari lÀbi RPC kolme nodi 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,
},
);Rakendame nutilepingu:
// 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 kaks meetodit lepingu interaktsiooniks: call ja send.
Uuendame lepingu temperatuuri teostamisega set kasutades meetodit 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;
});
}JÀrgmisena kasutame meetodit web3 call lepingu temperatuuri saamiseks. Pange tÀhele, et meetod call teostatakse lokaalses nodis ja plokiahelas tehingut ei loodud.
// 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 saab kĂ€ivitada jĂ€rgmise tulemuse saamiseks:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3JÀtkame Quorum'i exploreris Chainstacki paneelil salvestuste vaatamist, nagu allpool nÀidatud.
KÔik kolm sÔlme suhtlesid omavahel ja tehingud uuendati:
- Esimene tehing suvandas lepingu.
- Teine tehing seadis lepingu temperatuuri 3 kraadile.
- Temperatuuri saamine toimub kohaliku sÔlme kaudu, seega tehingut ei loodud.

Privaatsed tehingud
Kontekst
Organisatsioonide sage nĂ”ue on andmete kaitsmine. NĂ€iteks vaatame olukorda, kus Supermarket rendib ladustamispinda mereandide sĂ€ilitamiseks eraldi MĂŒĂŒjalt:
- Tootja IoT-andurite abil loetakse temperatuuri vÀÀrtusi iga 30 sekundi jÀrel ja edastatakse Supermarketile.;
- Need vÀÀrtused peavad olema kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti kergesti. MĂŒĂŒjale. ja Supermarketile,millel on konsortsiumivĂ”rk.

Me teeme neli ĂŒlesannet, nagu on illustreeritud ĂŒlaltoodud diagrammil.
- Kasutame neid kolme sÔlme eelnevas stsenaariumis privaatsete tehingute demonstreerimiseks:
- Supermarket suvandid nutileping, mis on privaatsed Supermarketile. ja MĂŒĂŒjalt.
- Kolmandal osapoolel pole juurdepÀÀsu nutilepingule.
Kutsume vĂ€lja meetodid get ja set juhatusele Supermarketile. ja MĂŒĂŒjalt Quorum'i privaatsest tehingust demonstreerimiseks.
Suudame privaatsed lepingud osalejate jaoks Supermarket ja Tootja osaleja kaudu Supermarket:
const contractAddress = await deployContract( raft1Node, process.env.PK2, ); console.log(`Lepingu aadress pÀrast paigaldamist: ${contractAddress}`);Seame temperatuuri kolmandalt osapoolelt (vÀline sÔlm) 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 MĂŒĂŒjalt (sisemine sĂ”lm) ja saame temperatuuri vÀÀrtuse:
Selle stsenaariumi temperatuur peaks nutilepingust tagastama vÀÀrtuse 12. Pange tÀhele, et Tootja siin on lubatud juurde pÀÀ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 osapoolelt (vÀline sÔlm):
Sammul 3 seati temperatuuriks 12, kuid Kolmandal osapoolel ei pÀÀse nutilepingule juurde. SeetÔttu peaks 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Ă€tkame Quorum'i vĂ”rku privaatssete tehingute tĂ€itmise ĂŒlevaatamist, . Kuna suurem osa koodist on identne avalikele tehingutele, rĂ”hutame vaid neid osi, mis erinevad privaatsetele tehingutele.
Pange tÀhele, et vÔrgus laaditud leping on muutumatu, seega peab Ôigusi (permissioned) andma vastavatele sÔlmedele, lisades kohtuniku avaliku lepingu lepingu juurutamise hetkel, mitte pÀrast.
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',
// Andke lepingule Ôigused, lisades sÔlmede avalikud vÔtmed
privateFor: [publicKey],
})
.then((contract) => {
return contract.options.address;
});
}Samamoodi toimub privaatsete tehingute teostamine â lisades tehingu tegemise hetkel osaliste avalikud vĂ”tmed.
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,
// Andke Ôigused, lisades sÔlmede avalikud vÔtmed
privateFor: [publicKey],
}).then((receipt) => {
return receipt.status;
});
}NĂŒĂŒd saame alustada ja tulemuste jĂ€rgmisega:
node private.js
Lepingu aadress pÀrast juurutamist: 0x85dBF88B4dfa47e73608b33454E4e3BA2812B21D
[Node3] temp on pÀrast lepingut vÀrskendades vÀliste sÔlmede kaudu: null
[Node2] temp on pÀrast lepingut vÀrskendades sisesÔlmede kaudu: 12
[Node3] temp on vÀrskendamisel vÀliste sÔlmede kaudu: nullQuorumi uurija Chainstackis nÀitab jÀrgmist:
- lepingu juurutamine osalise poolt Supermarket;
- Tegevus
SetTemperaturealates kolmandalt osapoolelt; - Tegevus
SetTemperatureosalise poolt Tootja.

Nagu nÀete, on mÔlemad tehingud tÀidetud, kuid ainult osalise tehing Tootja vÀrskendas temperatuuri lepingus. Seega tagavad privaatsete tehingute muutumatuse, kuid ei avalda andmeid kolmandatele osapooltele.
KokkuvÔte
Oleme tutvunud Quorum'i kommertsskeemidega, et tagada praegune teave temperatuuri kohta laos, juurutades vĂ”rku kahe poole vahel â supermarket ja lao omaniku.
Oleme nÀidanud, kuidas praegust teavet temperatuuri kohta saab sÀilitada nii avalike kui ka privaatsete tehingute kaudu.
Kasutusstsenaariume vÔib olla palju ja nagu nÀete, ei ole see sugugi keeruline.
Eksperimentige, proovige oma stsenaariumit juurutada. Eriti kuna plokiahelatehnoloogia tööstus .
Allikas: habr.com
