
— blockchain stèidhichte air Ethereum air a leasachadh le JPMorgan agus o chionn ghoirid a’ chiad àrd-ùrlar leabhar-cunntais sgaoilte a tha air a thabhann le Microsoft Azure.
Tha Quorum a’ toirt taic do ghnothaichean prìobhaideach is poblach agus tha mòran chùisean cleachdaidh malairteach aige.
San artaigil seo, nì sinn sgrùdadh air aon suidheachadh mar sin: lìonra leabhraichean-cunntais sgaoilte a chleachdadh eadar mòr-bhùth agus sealbhadair taigh-bathair gus fiosrachadh ùraichte a thoirt seachad mu theodhachd an taigh-bathair.
Gheibhear an còd a chaidh a chleachdadh san oideachadh seo ann an .
Tha an artaigil a’ còmhdach:
- cruthachadh cùmhnant snasail;
- A’ cur lìonra Quorum an sàs le bhith a’ cleachdadh ;
- Gnìomhan poblach cuòram;
- Gnothaichean prìobhaideach cuòram.
Tha an dealbh a’ cleachdadh suidheachadh de sgrùdadh teothachd ann an togalaichean taigh-bathair aig com-pàirtichean lìonra Quorum taobh a-staigh Eadar-lìon nan Rudan (IoT).
Co-theacs
Tha buidheann de chompanaidhean taigh-bathair a’ cruthachadh co-bhanntachd gus fiosrachadh a stòradh còmhla agus pròiseasan a dhèanamh fèin-ghluasadach air a’ blockchain. Airson an adhbhair seo, tha na companaidhean air co-dhùnadh Quorum a chleachdadh. San artaigil seo, còmhdaichidh sinn dà shuidheachadh: gnothaichean poblach agus gnothaichean prìobhaideach.
Bidh gnothaichean air an cruthachadh le diofar chom-pàirtichean gus eadar-obrachadh leis a’ chonsairt dhan bhuineas iad. Bidh gach gnothach an dàrna cuid a’ cleachdadh cùmhnant no a’ gairm gnìomh taobh a-staigh a’ chùmhnant gus dàta a luchdachadh suas chun lìonra. Tha na gnìomhan seo air an ath-aithris thar gach nod san lìonra.
Tha gnothaichean poblach rim faicinn le buill a’ chonsairt uile. Bidh gnothaichean prìobhaideach a’ cur sreath de phrìobhaideachd ris agus chan fhaicear iad ach leis na buill aig a bheil cead.
Airson an dà shuidheachadh, bidh sinn a’ cleachdadh an aon chùmhnant airson soilleireachd.
Cùmhnant glic
Seo agaibh cùmhnant snasail sìmplidh a chaidh a chruthachadh airson ar suidheachadh. Tha caochladair poblach ann. temperature, a ghabhas atharrachadh leis an dòigh-obrach set agus faigh leis an dòigh-obrach 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;
}
}Gus am bi an cùmhnant ag obair leis , feumaidh e a bhith air eadar-theangachadh gu cruth ABI agus còd-byte. A’ cleachdadh an gnìomh formatContract, air a shealltainn gu h-ìosal, a’ cur ri chèile a’ chùmhnant le bhith a’ cleachdadh .
function formatContract() {
const path = './contracts/temperatureMonitor.sol';
const source = fs.readFileSync(path,'UTF8');
return solc.compile(source, 1).contracts[':TemperatureMonitor'];
}Tha an cùmhnant crìochnaichte coltach ri seo:
// 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
0x608060405234801561001057600080fd5b50610104806100206000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636d4ce63c81146057578063adccea12146082578063faee13b9146094575b600080fd5b348015606257600080fd5b50606960ae565b60408051600092830b90920b8252519081900360200190f35b348015608d57600080fd5b50606960b7565b348015609f57600080fd5b5060ac60043560000b60c0565b005b60008054900b90565b60008054900b81565b6000805491810b60ff1660ff199092169190911790555600a165627a7a72305820af0086d55a9a4e6d52cb6b3967afd764ca89df91b2f42d7bf3b30098d222e5c50029A-nis gu bheil an cùmhnant deiseil, cuiridh sinn an lìonra an gnìomh agus cuiridh sinn a’ chùmhnant an gnìomh.
Cleachdadh nodan

Faodaidh cleachdadh nód a bhith gu math saothair-dian agus faodar am pròiseas seo a chur an àite le bhith a’ cleachdadh seirbheis .
Gu h-ìosal tha am pròiseas airson lìonra Quorum a chleachdadh le co-aontachd Raft agus trì nódan.
An toiseach, cruthaichidh sinn pròiseact agus canaidh sinn Pròiseact Quorum ris:

Cruthaichidh sinn lìonra Quorum le co-aontachd Raft air Àrd-ùrlar Google Cloud:

Cuiridh sinn dà nód eile ris an nód a chaidh a chruthachadh mar-thà gu bunaiteach:

Trì nodan ruith:

Tha duilleag mion-fhiosrachaidh an nóid a’ sealltainn ceann-uidhe RPC, iuchair phoblach, msaa.

Tha an lìonra air a chleachdadh. A-nis leig dhuinn cùmhnantan snasail a chleachdadh agus gnothaichean a dhèanamh a’ cleachdadh .
Gnìomhan poblach
Co-theacs
Tha teòthachd an taigh-bathair cudromach airson lùghdachadh chosgaisean, gu h-àraidh airson toraidhean a dh’ fheumar a stòradh aig teòthachd fo-neoni.
Le bhith a’ comasachadh chompanaidhean luachan teòthachd taobh a-muigh an àiteachan cruinn-eòlasach a cho-roinn ann an àm fìor agus an clàradh ann an leabhar-cunntais neo-atharraichte, bidh com-pàirtichean lìonra a’ lughdachadh chosgaisean agus ùine.

Cuiridh sinn crìoch air trì gnìomhan, air an sealltainn san diagram:
Cuiridh sinn an cùmhnant an gnìomh tro Nòd 1:
const contractAddress = await deployContract(raft1Node); console.log(`Contract address after deployment: ${contractAddress}`);Suidhichidh sinn an teòthachd troimhe Nòd 2 le 3 ìrean:
const status = await setTemperature(raft2Node, contractAddress, 3); console.log(`Transaction status: ${status}`);Nòd 3 gheibh fiosrachadh bhon chùmhnant snasail. Tillidh an cùmhnant luach de 3 ìrean:
const temp = await getTemperature(raft3Node, contractAddress); console.log(‘Retrieved contract Temperature’, temp);An ath rud, coimheadaidh sinn air mar a nì sinn gnothach poblach air lìonra Quorum a’ cleachdadh .
Bidh sinn a’ tòiseachadh eisimpleir tro RPC airson trì nódan:
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,
},
);Leig dhuinn an cùmhnant snasail a chleachdadh:
// 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;
});
} a’ toirt seachad dà dhòigh air eadar-obrachadh leis a’ chùmhnant: call и send.
Ùraichidh sinn teòthachd a’ chùmhnant le bhith ga chur an gnìomh set a’ cleachdadh an dòigh-obrach 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;
});
}An ath rud, bidh sinn a’ cleachdadh an dòigh web3 call gus teòthachd a’ chùmhnant fhaighinn. Thoir an aire gu bheil an dòigh call thèid a dhèanamh air nód ionadail agus cha tèid an gnothach a chruthachadh air a’ 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);
}A-nis faodaidh tu a ruith gus an toradh a leanas fhaighinn:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3An ath rud, chì sinn na h-inntrigidhean anns an rannsachair Quorum ann am pannal Chainstack, mar a chithear gu h-ìosal.
Bha eadar-obrachadh aig na trì nódan agus chaidh na gnothaichean ùrachadh:
- Chuir a’ chiad ghnothach an cùmhnant an gnìomh.
- Shuidhich an dàrna gnothach teòthachd a’ chùmhnant gu 3 ceum.
- Gheibhear an teòthachd tro nód ionadail, agus mar sin chan eil malairt sam bith air a chruthachadh.

Gnìomhan prìobhaideach
Co-theacs
’S e riatanas cumanta a th’ ann an dìon dàta airson buidhnean. Mar eisimpleir, smaoinich air suidheachadh anns a bheil Mòr-bhùth a’ gabhail àite taigh-bathair air màl airson biadh mara a stòradh bho àite air leth Reiceadair:
- Reiceadair Le bhith a’ cleachdadh mothachairean IoT, bidh e a’ leughadh leughaidhean teòthachd a h-uile 30 diog agus gan cur a-mach Chun a' mhòr-bhùth;
- cha bu chòir na luachan seo a bhith rim faighinn ach Chun an neach-reic и Chun a' mhòr-bhùth, aonaichte ann an lìonra co-bhanntachd.

Crìochnaichidh sinn ceithir gnìomhan a tha air an sealltainn san diagram gu h-àrd.
- Cleachdaidh sinn na trì nódan ceudna bhon t-suidheachadh roimhe gus gnothaichean prìobhaideach a nochdadh:
- Mòr-bhùth a’ cleachdadh cùmhnant snasail a tha prìobhaideach do Mòr-bhùth и Reiceadair.
- Treas pàrtaidh chan eil còraichean ruigsinneachd aige/aice air a’ chùmhnant snasail.
Canaidh sinn ris na dòighean get и set às leth Mòr-bhùth и Reiceadair gus malairt Cuòram prìobhaideach a nochdadh.
Cuiridh sinn cùmhnant prìobhaideach air bhog airson com-pàirtichean Mòr-bhùth и Reiceadair tron chom-pàirtiche Mòr-bhùth:
const contractAddress = await deployContract( raft1Node, process.env.PK2, ); console.log(`Contract address after deployment: ${contractAddress}`);Suidhichidh sinn an teòthachd bho Treas pàrtaidh (nòd taobh a-muigh) agus faigh luach na teòthachd:
// 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}`);Suidhichidh sinn an teòthachd bho Reiceadair (nòd a-staigh) agus faigh luach na teòthachd:
Bu chòir don teòthachd san t-suidheachadh seo an luach 12 a thilleadh bhon chùmhnant snasail. Thoir an aire gu bheil Reiceadair tha cead aige faighinn chun chùmhnant snasail an seo.
// 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}`);Gheibh sinn an teòthachd bho Treas pàrtaidh (nòd taobh a-muigh):
Ann an ceum 3 chaidh an teòthachd a shuidheachadh gu 12, ach Treas pàrtaidh chan eil cothrom aige air a’ chùmhnant snasail. Mar sin, feumaidh an luach tilleadh a bhith neoni.
// This returns null const temp3 = await getTemperature(raft3Node, contractAddress); console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);An ath rud, bheir sinn sùil nas mionaidiche air mar a thèid gnothaichean prìobhaideach a chur an gnìomh ann an lìonra Quorum le Leis gu bheil a’ mhòr-chuid den chòd mar an ceudna airson gnothaichean poblach, cha chuir sinn cuideam ach air na pàirtean sin a tha eadar-dhealaichte airson gnothaichean prìobhaideach.
Thoir an aire nach gabh atharrachadh air a’ chùmhnant a chaidh a luchdachadh suas chun lìonra, agus mar sin feumar ruigsinneachd cheadaichte a thoirt do na nódan buntainneach le bhith a’ comasachadh a’ chùmhnant phoblaich aig àm cleachdadh a’ chùmhnant, chan ann às a dhèidh.
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;
});
}Bithear a’ cur gnothaichean prìobhaideach an gnìomh san aon dòigh, le bhith a’ toirt a-steach iuchair phoblach nan com-pàirtichean aig àm an cur an gnìomh.
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;
});
}A-nis is urrainn dhuinn tòiseachadh leis na toraidhean a leanas:
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 nullSeallaidh an rannsachair Quorum ann an Chainstack na leanas:
- cleachdadh cùmhnant bhon chom-pàirtiche Mòr-bhùth;
- Coileanadh
SetTemperatureот Treas pàrtaidh; - Coileanadh
SetTemperaturebho chom-pàirtiche Reiceadair.

Mar a chì thu, chaidh an dà ghnothach a chrìochnachadh, ach dìreach an gnothach bhon chom-pàirtiche Reiceadair ùrachadh air an teòthachd sa chùmhnant. Mar sin, bidh gnothaichean prìobhaideach a’ dèanamh cinnteach à neo-atharrachadh gun dàta fhoillseachadh do threas phàrtaidhean.
co-dhùnadh
Rinn sinn sgrùdadh air cùis cleachdaidh malairteach airson Quorum gus fiosrachadh teòthachd ùraichte a thoirt seachad ann an taigh-bathair le bhith a’ cleachdadh lìonra eadar dà phàrtaidh - mòr-bhùth agus sealbhadair taigh-bathair.
Sheall sinn mar as urrainnear fiosrachadh teòthachd ùraichte a chumail suas tro ghnothaichean poblach is prìobhaideach.
Faodaidh iomadh suidheachadh tagraidh a bhith ann agus, mar a chì thu, chan eil e idir doirbh.
Dèan deuchainnean, feuch ri do shuidheachadh fhèin a leasachadh. Gu h-àraidh leis gu bheil gnìomhachas teicneòlas blockchain ann. .
Source: www.habr.com
