ProHoster > Blog > İdarə > Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin
Web3 istifadə edərək JPMorgan Quorum blokçeynində ictimai və şəxsi əməliyyatlar həyata keçirin
yetərsay JPMorgan tərəfindən hazırlanmış Ethereum əsaslı blokçeyndir və bu yaxınlarda Microsoft Azure tərəfindən təklif edilən ilk paylanmış kitab platforması oldu.
Quorum özəl və ictimai əməliyyatları dəstəkləyir və bir çox kommersiya istifadə hallarına malikdir.
Bu yazıda biz belə bir ssenarini - anbarın temperaturu haqqında aktual məlumat vermək üçün supermarket və anbar sahibi arasında paylanmış kitablar şəbəkəsinin yerləşdirilməsini nəzərdən keçirəcəyik.
istifadə edərək Quorum şəbəkəsinin yerləşdirilməsi Zəncir yığını;
Kvorum açıq əməliyyatlar;
Şəxsi əməliyyatlar kvorum.
Nümunə etmək üçün biz Əşyaların İnterneti (IoT) daxilində Quorum şəbəkəsinin üzvlərinin anbarlarında temperaturun monitorinqi üçün ssenaridən istifadə edirik.
Kontekst
Bir qrup anbar şirkətləri blokçeyndə məlumatları birgə saxlamaq və prosesləri avtomatlaşdırmaq üçün konsorsiumda birləşir. Bunun üçün şirkətlər Quorum-dan istifadə etmək qərarına gəliblər. Bu yazıda biz iki ssenarini əhatə edəcəyik: ictimai əməliyyatlar və özəl əməliyyatlar.
Əməliyyatlar müxtəlif iştirakçılar tərəfindən aid olduqları konsorsiumla qarşılıqlı əlaqə yaratmaq üçün yaradılır. Hər bir əməliyyat ya müqaviləni yerləşdirir və ya məlumatı şəbəkəyə yükləmək üçün müqavilədəki funksiyanı çağırır. Bu hərəkətlər şəbəkədəki bütün qovşaqlara təkrarlanır.
İctimai əməliyyatlar bütün konsorsium iştirakçıları tərəfindən baxa bilər. Şəxsi əməliyyatlar məxfilik qatını əlavə edir və yalnız bunu etmək hüququ olan iştirakçılar üçün əlçatandır.
Hər iki ssenari üçün aydınlıq üçün eyni müqavilədən istifadə edirik.
Ağıllı müqavilə
Aşağıda ssenarimiz üçün yaradılmış sadə ağıllı müqavilədir. Onun ictimai dəyişəni var temperatureistifadə edərək dəyişdirilə bilər set və üsulla qəbul edin 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;
}
}
Müqavilə ilə işləmək üçün web3.js, ABI formatına və bayt koduna tərcümə edilməlidir. Funksiyadan istifadə etməklə formatContractaşağıda istifadə edərək müqavilə tərtib edir solc-js.
İndi müqavilə hazırdır, biz şəbəkəni yerləşdirəcəyik və müqaviləni yerləşdirəcəyik.
Düyün yerləşdirilməsi
Bir qovşağın yerləşdirilməsi olduqca əmək tələb edə bilər və bu proses bir xidmətdən istifadə etməklə əvəz edilə bilər Zəncir yığını.
Aşağıda Raft konsensus və üç qovşaq ilə Quorum şəbəkəsinin yerləşdirilməsi prosesidir.
Əvvəlcə bir layihə yaradaq və onu Quorum Layihəsi adlandıraq:
Google Bulud Platformasında Raft konsensus ilə Quorum şəbəkəsi yaradaq:
Defolt olaraq artıq yaradılmış node-a daha iki qovşaq əlavə edək:
Üç işləyən qovşaq:
Düyün təfərrüatları səhifəsində RPC son nöqtəsi, açıq açar və s. göstərilir.
Şəbəkə yerləşdirilib. İndi ağıllı müqavilələri yerləşdirək və istifadə edərək əməliyyatlar həyata keçirək web3.js.
İctimai əməliyyatlar
Kontekst
Xüsusilə sıfırdan aşağı temperaturda saxlanması nəzərdə tutulan məhsullar üçün anbar temperaturu xərclərin azaldılmasında böyük əhəmiyyət kəsb edir.
Şirkətlərə öz coğrafi yerlərinin xarici temperaturunu real vaxt rejimində paylaşmağa və onu dəyişməz kitabda qeyd etməyə icazə verməklə, şəbəkə iştirakçıları xərcləri və vaxtı azaldır.
Diaqramda təsvir olunan üç tapşırığı yerinə yetirəcəyik:
Biz vasitəsilə müqaviləni yerləşdirəcəyik Node 1:
const contractAddress = await deployContract(raft1Node);
console.log(`Contract address after deployment: ${contractAddress}`);
vasitəsilə temperaturu təyin edin Node 2 3 dərəcə ilə:
const status = await setTemperature(raft2Node, contractAddress, 3);
console.log(`Transaction status: ${status}`);
Node 3 smart müqavilədən məlumat alacaq. Müqavilə dəyəri 3 dərəcə qaytarır:
Bundan sonra Quorum şəbəkəsində ictimai əməliyyatın necə həyata keçiriləcəyinə baxacağıq web3.js.
Biz üç qovşaq üçün RPC vasitəsilə nümunəyə başlayırıq:
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,
},
);
Ağıllı müqaviləni tətbiq edək:
// 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 müqavilə ilə qarşılıqlı əlaqə üçün iki üsul təqdim edir: call и send.
İcra edərək müqavilənin temperaturunu yeniləyək set web3 metodundan istifadə etməklə 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;
});
}
Sonra web3 metodundan istifadə edirik call müqavilə temperaturu əldə etmək. Unutmayın ki, üsul call yerli qovşaqda icra edilir və əməliyyat blokçeynində yaradılmayacaq.
// 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);
}
İndi qaça bilərsiniz public.js aşağıdakı nəticəni əldə etmək üçün:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3
Bundan sonra, aşağıda göstərildiyi kimi, Chainstack panelində Quorum Explorer-də qeydlərə baxa bilərik.
Hər üç qovşaq qarşılıqlı əlaqədə oldu və əməliyyatlar yeniləndi:
İlk əməliyyat müqaviləni yerləşdirdi.
İkinci əməliyyat müqavilənin temperaturunu 3 dərəcə təyin etdi.
Temperatur yerli qovşaq vasitəsilə qəbul edilir, ona görə də heç bir əməliyyat yaradılmır.
Şəxsi əməliyyatlar
Kontekst
Təşkilatların ümumi tələbi məlumatların qorunmasıdır. Nümunə olaraq hansı ssenarini nəzərdən keçirək Supermarket ayrı-ayrılıqda dəniz məhsulları saxlamaq üçün anbar sahəsi icarəyə götürür Satıcı:
Satıcı IoT sensorlarından istifadə edərək, hər 30 saniyədən bir temperatur dəyərlərini oxuyur və ötürür Supermarketə;
bu dəyərlər yalnız mövcud olmalıdır Satıcıya и Supermarketə, konsorsium tərəfindən şəbəkələşdirilmişdir.
Yuxarıdakı diaqramda təsvir olunan dörd tapşırığı yerinə yetirəcəyik.
Şəxsi əməliyyatları nümayiş etdirmək üçün əvvəlki ssenaridəki eyni üç qovşaqdan istifadə edirik:
Supermarket özəl olan ağıllı müqaviləni yerləşdirir Supermarket и Satıcı.
Üçüncü tərəf smart müqaviləyə daxil olmaq hüququ yoxdur.
Biz üsulları çağıracağıq get и set adından Supermarket и Satıcı şəxsi Quorum əməliyyatını nümayiş etdirmək.
İştirakçılar üçün özəl müqavilə bağlayacağıq Supermarket и Satıcı iştirakçı vasitəsilə Supermarket:
Gəlin temperaturu təyin edək Üçüncü tərəf (xarici node) və temperatur dəyərini əldə edin:
// 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}`);
Gəlin temperaturu təyin edək Satıcı (daxili node) və temperatur dəyərini əldə edin:
Bu ssenaridəki temperatur smart müqavilədən 12 dəyərini qaytarmalıdır. Nəzərə alın ki Satıcı burada ağıllı müqaviləyə icazə verilmişdir.
// 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}`);
Temperaturu ondan alırıq Üçüncü tərəf (xarici qovşaq):
3-cü addımda temperatur 12-yə təyin edildi, lakin Üçüncü tərəf smart müqaviləyə çıxışı yoxdur. Buna görə də qaytarılan dəyər null olmalıdır.
// This returns null
const temp3 = await getTemperature(raft3Node, contractAddress);
console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);
Bundan sonra Quorum şəbəkəsində şəxsi əməliyyatların həyata keçirilməsinə daha yaxından nəzər salacağıq web3.js. Kodun əksəriyyəti ictimai əməliyyatlar üçün eyni olduğundan, biz yalnız özəl əməliyyatlar üçün fərqli olan hissələri vurğulayacağıq.
Nəzərə alın ki, şəbəkəyə yüklənmiş müqavilə dəyişməzdir, ona görə də icazəli giriş müvafiq qovşaqlara açıq müqaviləni işə saldıqdan sonra deyil, müqavilənin yerləşdirilməsi zamanı təmin edilməlidir.
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;
});
}
Şəxsi əməliyyatlar oxşar şəkildə - icra zamanı iştirakçıların açıq açarını daxil etməklə həyata keçirilir.
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;
});
}
İndi qaça bilərik private.js aşağıdakı nəticələrlə:
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
Chainstack-dəki Quorum tədqiqatçısı aşağıdakıları göstərəcək:
Gördüyünüz kimi, hər iki əməliyyat tamamlandı, ancaq iştirakçıdan gələn əməliyyat Satıcı müqavilədəki temperaturu yenilədi. Beləliklə, şəxsi əməliyyatlar dəyişməzliyi təmin edir, lakin eyni zamanda məlumatları üçüncü tərəfə göstərmir.
Nəticə
Biz iki tərəf - supermarket və anbar sahibi arasında şəbəkə yerləşdirməklə anbarda ən son temperatur məlumatını təmin etmək üçün Quorum üçün kommersiya istifadə vəziyyətinə baxdıq.
Həm dövlət, həm də özəl əməliyyatlar vasitəsilə müasir temperatur məlumatlarının necə saxlanıla biləcəyini göstərdik.
Çoxlu tətbiq ssenariləri ola bilər və gördüyünüz kimi, heç də çətin deyil.