ProHoster > Blogi > antaminen > Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla
Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla
päätösvaltaisuus on JPMorganin kehittämä Ethereum-pohjainen lohkoketju, josta tuli viimeksi ensimmäinen hajautettu pääkirja-alusta, jonka Microsoft Azure tarjoaa.
Quorum tukee yksityisiä ja julkisia tapahtumia, ja sillä on monia kaupallisia käyttötapauksia.
Tässä artikkelissa tarkastellaan yhtä tällaista skenaariota - hajautetun kirjanpitoverkon käyttöönottoa supermarketin ja varaston omistajan välillä, jotta saadaan ajan tasalla olevaa tietoa varaston lämpötilasta.
Esimerkkinä käytämme skenaariota Quorum-verkoston jäsenten varastojen lämpötilan tarkkailuun Internet of Things (IoT) sisällä.
konteksti
Ryhmä varastoyrityksiä yhdistyy konsortioon tallentaakseen yhdessä tietoa ja automatisoidakseen prosesseja lohkoketjussa. Tätä varten yritykset päättivät käyttää Quorumia. Tässä artikkelissa käsittelemme kahta skenaariota: julkiset tapahtumat ja yksityiset tapahtumat.
Eri osallistujat luovat tapahtumat ollakseen vuorovaikutuksessa konsortion kanssa, johon he kuuluvat. Jokainen tapahtuma joko ottaa käyttöön sopimuksen tai kutsuu sopimuksessa olevan toiminnon tietojen lataamiseksi verkkoon. Nämä toiminnot replikoidaan kaikkiin verkon solmuihin.
Julkiset tapahtumat ovat kaikkien konsortion osallistujien nähtävissä. Yksityiset tapahtumat lisäävät luottamuksellisuutta, ja ne ovat vain niiden osallistujien saatavilla, joilla on siihen oikeus.
Käytämme molemmissa skenaarioissa samaa sopimusta selvyyden vuoksi.
Älykäs sopimus
Alla on yksinkertainen älykäs sopimus, joka on luotu skenaarioimme. Sillä on julkinen muuttuja temperature, jota voidaan muuttaa käyttämällä set ja vastaanottaa menetelmällä 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;
}
}
Jotta sopimus toimisi web3.js, se on käännettävä ABI-muotoon ja tavukoodiin. Toiminnon käyttäminen formatContractalla kokoaa sopimuksen käyttäen solc-js.
Nyt kun sopimus on valmis, otamme verkon käyttöön ja otamme käyttöön sopimuksen.
Solmun käyttöönotto
Solmun käyttöönotto voi olla melko työlästä ja tämä prosessi voidaan korvata käyttämällä palvelua Ketjupino.
Alla on prosessi Quorum-verkon käyttöönottoon Raft-konsensuksella ja kolmella solmulla.
Luodaan ensin projekti ja kutsutaan sitä Quorum Projectiksi:
Luodaan Quorum-verkosto Raft-konsensuksella Google Cloud Platformissa:
Lisätään kaksi muuta solmua oletuksena jo luotuun solmuun:
Kolme käynnissä olevaa solmua:
Solmun tietosivulla näkyy RPC-päätepiste, julkinen avain jne.
Verkko on otettu käyttöön. Otetaan nyt käyttöön älykkäät sopimukset ja suoritetaan tapahtumia käyttämällä web3.js.
Julkiset liiketoimet
konteksti
Varastolämpötilalla on suuri merkitys kustannusten alentamisessa, erityisesti pakkasessa säilytettäväksi tarkoitettujen tuotteiden osalta.
Antamalla yritysten jakaa maantieteellisen sijaintinsa ulkolämpötilan reaaliajassa ja tallentamalla se muuttumattomaan kirjanpitoon, verkon osallistujat vähentävät kustannuksia ja aikaa.
Suoritamme kolme tehtävää, jotka on kuvattu kaaviossa:
Otamme sopimuksen käyttöön kautta Solmu 1:
const contractAddress = await deployContract(raft1Node);
console.log(`Contract address after deployment: ${contractAddress}`);
Aseta lämpötila kautta Solmu 2 3 astetta:
const status = await setTemperature(raft2Node, contractAddress, 3);
console.log(`Transaction status: ${status}`);
Solmu 3 saa tietoa älykkäästä sopimuksesta. Sopimus palauttaa arvon 3 astetta:
Seuraavaksi tarkastelemme, kuinka suorittaa julkinen tapahtuma Quorum-verkossa käyttämällä web3.js.
Aloitamme ilmentymän RPC:n kautta kolmelle solmulle:
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,
},
);
Otetaan älykäs sopimus käyttöön:
// 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 tarjoaa kaksi tapaa olla vuorovaikutuksessa sopimuksen kanssa: call и send.
Päivitetään sopimuslämpötila suorittamalla set käyttämällä web3-menetelmää 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;
});
}
Seuraavaksi käytämme web3-menetelmää call sopimuslämpötilan saamiseksi. Huomaa, että menetelmä call suoritetaan paikallisessa solmussa, eikä tapahtumaa luoda lohkoketjussa.
// 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);
}
Nyt voit juosta public.js saadaksesi seuraavan tuloksen:
// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3
Seuraavaksi voimme tarkastella merkintöjä Quorum Explorerissa Chainstack-paneelissa alla olevan kuvan mukaisesti.
Kaikki kolme solmua olivat vuorovaikutuksessa ja tapahtumat päivitettiin:
Ensimmäinen kauppa toteutti sopimuksen.
Toisessa tapahtumassa sopimuslämpötila asetettiin 3 asteeseen.
Lämpötila vastaanotetaan paikallisen solmun kautta, joten tapahtumaa ei luoda.
Yksityiset liiketoimet
konteksti
Organisaatioiden yleinen vaatimus on tietosuoja. Harkitse esimerkkinä skenaariota, jossa Supermarket vuokraa varastotilaa merenelävien säilytykseen erillisestä Myyjä:
Myyjä IoT-anturien avulla lukee lämpötila-arvot 30 sekunnin välein ja lähettää ne Supermarkettiin;
näiden arvojen pitäisi olla vain saatavilla Myyjälle и Supermarkettiinverkostoituneen konsortion.
Suoritamme yllä olevassa kaaviossa kuvatut neljä tehtävää.
Käytämme samoja kolmea solmua edellisestä skenaariosta yksityisten tapahtumien näyttämiseen:
supermarket ottaa käyttöön älykkään sopimuksen, joka on yksityinen Supermarket и Myyjä.
Kolmas puoli ei ole oikeutta päästä älysopimukseen.
Kutsumme menetelmiä get и set puolesta Supermarket и Myyjä osoittaakseen yksityisen Quorum-tapahtuman.
Teemme osallistujille yksityisen sopimuksen supermarket и Myyjä osallistujan kautta supermarket:
Asetetaan lämpötila alkaen Kolmas osapuoli (ulkoinen solmu) ja hanki lämpötila-arvo:
// 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}`);
Asetetaan lämpötila alkaen Myyjä (sisäinen solmu) ja hanki lämpötila-arvo:
Tämän skenaarion lämpötilan pitäisi palauttaa älykkään sopimuksen arvo 12. Huomaa, että Myyjä täällä on valtuutettu pääsy älykkääseen sopimukseen.
// 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}`);
Saamme lämpötilan Kolmas osapuoli (ulkoinen solmu):
Vaiheessa 3 lämpötila asetettiin 12 asteeseen, mutta Kolmas puoli ei pääse käyttämään älykästä sopimusta. Siksi palautusarvon on oltava nolla.
// This returns null
const temp3 = await getTemperature(raft3Node, contractAddress);
console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);
Seuraavaksi tarkastelemme tarkemmin yksityisten tapahtumien suorittamista Quorum-verkossa web3.js. Koska suurin osa koodista on sama julkisissa tapahtumissa, korostamme vain ne osat, jotka eroavat yksityisistä tapahtumista.
Huomaa, että verkkoon ladattu sopimus on muuttumaton, joten asianmukaisille solmuille on myönnettävä käyttöoikeus ottamalla julkinen sopimus käyttöön sopimuksen käyttöönoton yhteydessä, ei sen jälkeen.
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;
});
}
Yksityiset tapahtumat suoritetaan samalla tavalla - sisällyttämällä osallistujien julkinen avain toteutushetkellä.
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;
});
}
Nyt voimme juosta private.js seuraavilla tuloksilla:
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
Quorum explorer Chainstackissa näyttää seuraavaa:
sopimuksen käyttöönotto osallistujalta supermarket;
suoritus SetTemperature alkaen Kolmas osapuoli;
suoritus SetTemperature osallistujalta Myyjä.
Kuten näet, molemmat tapahtumat on suoritettu, mutta vain tapahtuma osallistujalta Myyjä päivitti sopimuksen lämpötilan. Yksityiset liiketoimet tarjoavat siis muuttumattomuutta, mutta eivät samalla paljasta tietoja kolmannelle osapuolelle.
Johtopäätös
Tarkastelimme Quorumin kaupallista käyttötapausta tarjotakseen ajantasaisia lämpötilatietoja varastossa ottamalla käyttöön verkko kahden osapuolen – supermarketin ja varaston omistajan – välillä.
Osoitimme, kuinka ajan tasalla olevaa lämpötilatietoa voidaan ylläpitää sekä julkisten että yksityisten tapahtumien kautta.
Sovellusskenaarioita voi olla monia, ja kuten näet, se ei ole ollenkaan vaikeaa.