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.

Tässä opetusohjelmassa käytetty koodi on arkistot GitHubissa.

Artikkeli kattaa:

  • älykkään sopimuksen luominen;
  • Quorum-verkon käyttöönotto Ketjupino;
  • Päätösvaltaisuus julkiset liiketoimet;
  • Päätösvaltaisuuden yksityiset tapahtumat.

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.

function formatContract() {
  const path = './contracts/temperatureMonitor.sol';
  const source = fs.readFileSync(path,'UTF8');
return solc.compile(source, 1).contracts[':TemperatureMonitor'];
}

Valmis sopimus näyttää tältä:

// 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
0x608060405234801561001057600080fd5b50610104806100206000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416636d4ce63c81146057578063adccea12146082578063faee13b9146094575b600080fd5b348015606257600080fd5b50606960ae565b60408051600092830b90920b8252519081900360200190f35b348015608d57600080fd5b50606960b7565b348015609f57600080fd5b5060ac60043560000b60c0565b005b60008054900b90565b60008054900b81565b6000805491810b60ff1660ff199092169190911790555600a165627a7a72305820af0086d55a9a4e6d52cb6b3967afd764ca89df91b2f42d7bf3b30098d222e5c50029

Nyt kun sopimus on valmis, otamme verkon käyttöön ja otamme käyttöön sopimuksen.

Solmun käyttöönotto

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

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:

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

Luodaan Quorum-verkosto Raft-konsensuksella Google Cloud Platformissa:

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

Lisätään kaksi muuta solmua oletuksena jo luotuun solmuun:

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

Kolme käynnissä olevaa solmua:

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

Solmun tietosivulla näkyy RPC-päätepiste, julkinen avain jne.

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

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.

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

Suoritamme kolme tehtävää, jotka on kuvattu kaaviossa:

  1. Otamme sopimuksen käyttöön kautta Solmu 1:

    const contractAddress = await deployContract(raft1Node);
    console.log(`Contract address after deployment: ${contractAddress}`);

  2. Aseta lämpötila kautta Solmu 2 3 astetta:

    const status = await setTemperature(raft2Node, contractAddress, 3);
    console.log(`Transaction status: ${status}`);

  3. Solmu 3 saa tietoa älykkäästä sopimuksesta. Sopimus palauttaa arvon 3 astetta:

    const temp = await getTemperature(raft3Node, contractAddress);
    console.log(‘Retrieved contract Temperature’, temp);

    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:

  1. Ensimmäinen kauppa toteutti sopimuksen.
  2. Toisessa tapahtumassa sopimuslämpötila asetettiin 3 asteeseen.
  3. Lämpötila vastaanotetaan paikallisen solmun kautta, joten tapahtumaa ei luoda.

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

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.

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

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.

  1. Teemme osallistujille yksityisen sopimuksen supermarket и Myyjä osallistujan kautta supermarket:

    const contractAddress = await deployContract(
    raft1Node,
    process.env.PK2,
    );
    console.log(`Contract address after deployment: ${contractAddress}`);

  2. 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}`);

  3. 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}`);

  4. 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ä.

Suorita julkisia ja yksityisiä tapahtumia JPMorgan Quorum -lohkoketjussa Web3:n avulla

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.

Kokeile, yritä laajentaa käsikirjoitustasi. Lisäksi lohkoketjuteknologiateollisuus voi kasvaa lähes kymmenkertaiseksi vuoteen 2024 mennessä.

Lähde: will.com

Lisää kommentti