ProHoster > blog > Utawala > Fanya miamala ya umma na ya kibinafsi kwenye blockchain ya Akidi ya JPMorgan kwa kutumia Web3
Fanya miamala ya umma na ya kibinafsi kwenye blockchain ya Akidi ya JPMorgan kwa kutumia Web3
Quorum ni mnyororo wa msingi wa Ethereum uliotengenezwa na JPMorgan na hivi karibuni ukawa jukwaa la kwanza la leja kusambazwa kutolewa na Microsoft Azure.
Akidi inasaidia shughuli za kibinafsi na za umma na ina kesi nyingi za matumizi ya kibiashara.
Katika makala haya, tutachunguza hali moja kama hii - kupelekwa kwa mtandao wa leja iliyosambazwa kati ya duka kubwa na mmiliki wa ghala ili kutoa habari za kisasa kuhusu halijoto ya ghala.
kusambaza mtandao wa Akidi kwa kutumia Chainstack;
Akidi ya shughuli za umma;
Akidi ya shughuli za kibinafsi.
Kwa mfano, tunatumia hali ya kufuatilia halijoto katika ghala za wanachama wa mtandao wa Akidi ndani ya Mtandao wa Mambo (IoT).
Muktadha
Kundi la makampuni ya ghala linaungana katika muungano ili kuhifadhi kwa pamoja taarifa na kufanyia kazi michakato otomatiki kwenye blockchain. Kwa hili, makampuni yaliamua kutumia Akidi. Katika makala hii tutashughulikia matukio mawili: shughuli za umma na shughuli za kibinafsi.
Shughuli za malipo zinaundwa na washiriki tofauti ili kuingiliana na muungano ambao wanahusika. Kila muamala unatumia mkataba au kuita kazi katika mkataba ili kupakia data kwenye mtandao. Vitendo hivi vinaigwa kwa nodi zote kwenye mtandao.
Shughuli za umma zinapatikana kwa kutazamwa na washiriki wote wa muungano. Shughuli za kibinafsi huongeza safu ya usiri na zinapatikana tu kwa washiriki ambao wana haki ya kufanya hivyo.
Kwa hali zote mbili, tunatumia mkataba sawa kwa uwazi.
Mkataba wa busara
Ifuatayo ni mkataba rahisi mahiri ulioundwa kwa ajili ya hali yetu. Ina tofauti ya umma temperature, ambayo inaweza kubadilishwa kwa kutumia set na kupokea kwa mbinu 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;
}
}
Ili mkataba ufanye kazi nao mtandao3.js, lazima itafsiriwe katika umbizo la ABI na bytecode. Kwa kutumia kipengele formatContracthapa chini inakusanya mkataba kwa kutumia Solc-js.
Sasa kwa kuwa mkataba uko tayari, tutasambaza mtandao na kupeleka mkataba.
Usambazaji wa nodi
Kupeleka nodi inaweza kuwa kazi kubwa sana na mchakato huu unaweza kubadilishwa kwa kutumia huduma Chainstack.
Ifuatayo ni mchakato wa kupeleka mtandao wa Akidi kwa makubaliano ya Raft na nodi tatu.
Kwanza, hebu tuunde mradi na tuuite Mradi wa Akidi:
Hebu tuunde mtandao wa Akidi kwa makubaliano ya Raft kwenye Google Cloud Platform:
Wacha tuongeze nodi mbili zaidi kwenye nodi ambayo tayari imeundwa na chaguo-msingi:
Nodi tatu zinazoendesha:
Ukurasa wa maelezo ya nodi unaonyesha mwisho wa RPC, ufunguo wa umma, nk.
Mtandao umewekwa. Sasa hebu tupeleke mikataba mahiri na tufanye miamala kwa kutumia mtandao3.js.
Shughuli za umma
Muktadha
Joto la ghala ni la umuhimu mkubwa katika kupunguza gharama, hasa kwa bidhaa zinazokusudiwa kuhifadhiwa katika halijoto ya chini ya sufuri.
Kwa kuruhusu makampuni kushiriki halijoto ya nje ya eneo lao la kijiografia kwa wakati halisi na kurekodi katika daftari isiyoweza kubadilika, washiriki wa mtandao hupunguza gharama na wakati.
Tutafanya kazi tatu, zilizoonyeshwa kwenye mchoro:
Tutapeleka mkataba kupitia Node 1:
const contractAddress = await deployContract(raft1Node);
console.log(`Contract address after deployment: ${contractAddress}`);
Weka hali ya joto kupitia Node 2 kwa digrii 3:
const status = await setTemperature(raft2Node, contractAddress, 3);
console.log(`Transaction status: ${status}`);
Node 3 atapokea taarifa kutoka kwa mkataba wa smart. Mkataba utarudisha thamani ya digrii 3:
Ifuatayo, tutaangalia jinsi ya kutekeleza shughuli ya umma kwenye mtandao wa Akidi kwa kutumia mtandao3.js.
Tunaanzisha mfano kupitia RPC kwa nodi tatu:
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,
},
);
Wacha tutumie mkataba mzuri:
// 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;
});
}
mtandao3.js hutoa njia mbili za kuingiliana na mkataba: call ΠΈ send.
Wacha tusasishe halijoto ya mkataba kwa kutekeleza set kwa kutumia njia ya 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;
});
}
Ifuatayo tunatumia njia ya web3 call kupata joto la mkataba. Tafadhali kumbuka kuwa mbinu call inatekelezwa kwenye nodi ya ndani na shughuli haitaundwa kwenye 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);
}
Sasa unaweza kukimbia public.js kupata matokeo yafuatayo:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3
Kisha, tunaweza kutazama maingizo katika Kichunguzi cha Akidi kwenye paneli ya Chainstack, kama inavyoonyeshwa hapa chini.
Nodi zote tatu ziliingiliana na shughuli zilisasishwa:
Shughuli ya kwanza ilipeleka mkataba.
Shughuli ya pili iliweka joto la mkataba hadi digrii 3.
Joto hupokelewa kupitia nodi ya ndani, kwa hivyo hakuna shughuli inayoundwa.
Shughuli za kibinafsi
Muktadha
Mahitaji ya kawaida ya mashirika ni ulinzi wa data. Kwa mfano, fikiria kisa ambacho Maduka makubwa inakodisha nafasi ya ghala kwa ajili ya kuhifadhi dagaa kutoka sehemu tofauti Mchuuzi:
Mchuuzi kwa kutumia sensorer za IoT, husoma viwango vya joto kila sekunde 30 na kuzisambaza Kwa maduka makubwa;
maadili haya yanapaswa kupatikana tu Kwa muuzaji ΠΈ Kwa maduka makubwa, mtandao na muungano.
Tutakamilisha kazi nne zilizoonyeshwa kwenye mchoro hapo juu.
Tunatumia nodi tatu sawa kutoka kwa hali ya awali ili kuonyesha shughuli za kibinafsi:
Duka kubwa hutoa mkataba mzuri ambao ni wa faragha Maduka makubwa ΠΈ Mchuuzi.
Upande wa tatu hana haki ya kufikia mkataba wa busara.
Tutaita njia get ΠΈ set Kwa niaba ya Maduka makubwa ΠΈ Mchuuzi ili kuonyesha shughuli ya Akidi ya kibinafsi.
Tutapeleka mkataba wa kibinafsi kwa washiriki Duka kubwa ΠΈ Mchuuzi kupitia kwa mshiriki Duka kubwa:
Wacha tuweke joto kutoka Mhusika wa tatu (nodi ya nje) na upate thamani ya joto:
// 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}`);
Wacha tuweke joto kutoka Mchuuzi (nodi ya ndani) na upate thamani ya joto:
Halijoto katika hali hii inapaswa kurudisha thamani 12 kutoka kwa mkataba mahiri. Tafadhali kumbuka hilo Mchuuzi hapa ina idhini ya ufikiaji wa mkataba mzuri.
// 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}`);
Tunapata joto kutoka Mhusika wa tatu (nodi ya nje):
Katika hatua ya 3 joto liliwekwa hadi 12, lakini Upande wa tatu hana ufikiaji wa mkataba mzuri. Kwa hivyo thamani ya kurudi lazima iwe batili.
// This returns null
const temp3 = await getTemperature(raft3Node, contractAddress);
console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);
Kisha, tutaangalia kwa karibu zaidi kufanya miamala ya kibinafsi kwenye mtandao wa Akidi na mtandao3.js. Kwa kuwa nambari nyingi za kuthibitisha ni sawa kwa miamala ya umma, tutaangazia sehemu zile tu ambazo ni tofauti kwa shughuli za kibinafsi.
Kumbuka kuwa mkataba uliopakiwa kwenye mtandao hauwezi kubadilika, kwa hivyo ufikiaji ulioidhinishwa lazima utolewe kwa nodi zinazofaa kwa kuwezesha mkataba wa umma wakati mkataba umewekwa, sio baada.
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;
});
}
Shughuli za kibinafsi zinafanywa kwa njia sawa - kwa kujumuisha ufunguo wa umma wa washiriki wakati wa utekelezaji.
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;
});
}
Sasa tunaweza kukimbia private.js na matokeo yafuatayo:
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
Mgunduzi wa Akidi katika Chainstack ataonyesha yafuatayo:
kupelekwa kwa mkataba kutoka kwa mshiriki Duka kubwa;
Utimilifu SetTemperature kutoka Mhusika wa tatu;
Utimilifu SetTemperature kutoka kwa mshiriki Mchuuzi.
Kama unaweza kuona, shughuli zote mbili zimekamilika, lakini ni shughuli tu kutoka kwa mshiriki Mchuuzi ilisasisha halijoto katika mkataba. Kwa hivyo, shughuli za kibinafsi hutoa kutoweza kubadilika, lakini wakati huo huo usifunulie data kwa mtu wa tatu.
Hitimisho
Tuliangalia kesi ya matumizi ya kibiashara kwa Quorum kutoa taarifa ya hali ya joto ya kisasa katika ghala kwa kusambaza mtandao kati ya pande mbili - duka kuu na mmiliki wa ghala.
Tulionyesha jinsi maelezo ya halijoto ya kisasa yanaweza kudumishwa kupitia shughuli za umma na za kibinafsi.
Kunaweza kuwa na hali nyingi za maombi na, kama unaweza kuona, sio ngumu hata kidogo.