Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Kvorums ir uz Ethereum balstīta blokķēde, ko izstrādājusi JPMorgan, un pavisam nesen tā kļuva par pirmo izplatīto virsgrāmatu platformu, ko piedāvā Microsoft Azure.

Quorum atbalsta privātus un publiskus darījumus, un tam ir daudz komerciālas lietoŔanas gadījumu.

Å ajā rakstā mēs apskatÄ«sim vienu Ŕādu scenāriju - izkliedētā virsgrāmatas tÄ«kla izvietoÅ”anu starp lielveikalu un noliktavas Ä«paÅ”nieku, lai nodroÅ”inātu aktuālu informāciju par noliktavas temperatÅ«ru.

Šajā apmācībā izmantotais kods ir iekŔā GitHub krātuves.

Raksts aptver:

  • viedā lÄ«guma izveide;
  • Quorum tÄ«kla izvietoÅ”ana, izmantojot Ķēdes spieÄ·is;
  • Kvoruma publiskie darÄ«jumi;
  • Kvoruma privātie darÄ«jumi.

Lai ilustrētu, mēs izmantojam scenāriju temperatūras uzraudzībai Quorum tīkla dalībnieku noliktavās lietiskajā internetā (IoT).

Konteksts

Noliktavas uzņēmumu grupa apvienojas konsorcijā, lai kopīgi uzglabātu informāciju un automatizētu procesus blokķēdē. Šim nolūkam uzņēmumi nolēma izmantot Quorum. Šajā rakstā mēs apskatīsim divus scenārijus: publiskus darījumus un privātus darījumus.

DarÄ«jumus veido dažādi dalÄ«bnieki, lai mijiedarbotos ar konsorciju, kuram tie pieder. Katrs darÄ«jums vai nu izvieto lÄ«gumu, vai izsauc kādu funkciju lÄ«gumā, lai augÅ”upielādētu datus tÄ«klā. Å Ä«s darbÄ«bas tiek atkārtotas visos tÄ«kla mezglos.

Publiskie darījumi ir pieejami apskatei visiem konsorcija dalībniekiem. Privātie darījumi palielina konfidencialitātes līmeni un ir pieejami tikai tiem dalībniekiem, kuriem ir tiesības to darīt.

Abiem scenārijiem skaidrÄ«bas labad mēs izmantojam vienu un to paÅ”u lÄ«gumu.

Gudrs līgums

Zemāk ir vienkārÅ”s viedais lÄ«gums, kas izveidots mÅ«su scenārijam. Tam ir publisks mainÄ«gais temperature, ko var mainÄ«t, izmantojot set un saņemt pēc metodes 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;
  }
}

Lai līgums darbotos ar web3.js, tas ir jātulko ABI formātā un baitkodā. Izmantojot funkciju formatContractzemāk apkopo līgumu, izmantojot solc-js.

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

Pabeigtais līgums izskatās Ŕādi:

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

Tagad, kad līgums ir gatavs, mēs izvietosim tīklu un izvietosim līgumu.

Mezglu izvietoŔana

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Mezgla izvietoÅ”ana var bÅ«t diezgan darbietilpÄ«ga, un Å”o procesu var aizstāt, izmantojot pakalpojumu Ķēdes spieÄ·is.

Tālāk ir aprakstīts Quorum tīkla izvietoŔanas process ar Raft konsensu un trim mezgliem.

Vispirms izveidosim projektu un nosauksim to par Kvoruma projektu:

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Izveidosim Quorum tīklu ar Raft konsensu Google Cloud Platform:

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Pievienosim vēl divus mezglus mezglam, kas jau ir izveidots pēc noklusējuma:

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Trīs darbības mezgli:

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Mezgla informācijas lapā tiek parādīts RPC galapunkts, publiskā atslēga utt.

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Tīkls ir izvietots. Tagad izvietosim viedos līgumus un veiksim darījumus, izmantojot web3.js.

Publiskie darījumi

Konteksts

Noliktavas temperatÅ«rai ir liela nozÄ«me izmaksu samazināŔanā, Ä«paÅ”i produktiem, kas paredzēti uzglabāŔanai mÄ«nusā temperatÅ«rā.

Ä»aujot uzņēmumiem dalÄ«ties ar savas Ä£eogrāfiskās atraÅ”anās vietas ārējo temperatÅ«ru reāllaikā un reÄ£istrēt to nemainÄ«gā virsgrāmatā, tÄ«kla dalÄ«bnieki samazina izmaksas un laiku.

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Mēs veiksim trīs uzdevumus, kas parādīti diagrammā:

  1. Mēs izvietosim līgumu caur Node 1:

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

  2. Iestatiet temperatūru, izmantojot Node 2 par 3 grādiem:

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

  3. Node 3 saņems informāciju no viedā līguma. Līgumā tiks atgriezta vērtība 3 grādi:

    const temp = await getTemperature(raft3Node, contractAddress);
    console.log(ā€˜Retrieved contract Temperatureā€™, temp);

    Tālāk mēs apskatīsim, kā veikt publisku darījumu Quorum tīklā, izmantojot web3.js.

Mēs uzsākam instanci, izmantojot RPC, trim mezgliem:

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,
 },
);

Izvietosim viedo līgumu:

// 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 nodroÅ”ina divas metodes mijiedarbÄ«bai ar lÄ«gumu: call Šø send.

Atjaunināsim līguma temperatūru, izpildot set izmantojot web3 metodi 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;
  });
}

Tālāk mēs izmantojam web3 metodi call lai iegūtu līguma temperatūru. Lūdzu, ņemiet vērā, ka metode call tiek izpildīts vietējā mezglā, un darījums netiks izveidots blokķēdē.

// 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);
}

Tagad jūs varat skriet public.js lai iegūtu Ŕādu rezultātu:

// Execute public script
node public.js
Contract address after deployment: 0xf46141Ac7D6D6E986eFb2321756b5d1e8a25008F
Transaction status: true
Retrieved contract Temperature 3

Tālāk mēs varam skatīt ierakstus Quorum Explorer panelī Chainstack, kā parādīts zemāk.

Visi trīs mezgli mijiedarbojās, un darījumi tika atjaunināti:

  1. Pirmais darījums izvietoja līgumu.
  2. Otrajā darījumā līguma temperatūra tika noteikta uz 3 grādiem.
  3. Temperatūra tiek saņemta caur lokālo mezglu, tāpēc transakcija netiek izveidota.

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Privātie darījumi

Konteksts

IzplatÄ«ta organizāciju prasÄ«ba ir datu aizsardzÄ«ba. Kā piemēru apsveriet scenāriju, kurā Lielveikals Ä«rē noliktavas telpu jÅ«ras velÅ”u uzglabāŔanai no atseviŔķas Pārdevējs:

  • Pārdevējs izmantojot IoT sensorus, nolasa temperatÅ«ras vērtÄ«bas ik pēc 30 sekundēm un pārraida tās Uz lielveikalu;
  • Ŕīm vērtÄ«bām jābÅ«t tikai pieejamām Pārdevējam Šø Uz lielveikalu, ko tÄ«klā izveidojis konsorcijs.

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Mēs izpildÄ«sim četrus uzdevumus, kas parādÄ«ti diagrammā iepriekÅ”.

  • Mēs izmantojam tos paÅ”us trÄ«s mezglus no iepriekŔējā scenārija, lai demonstrētu privātos darÄ«jumus:
  • Lielveikals izvieto viedo lÄ«gumu, kas ir privāts Lielveikals Šø Pārdevējs.
  • TreŔā puse nav tiesÄ«bu piekļūt viedajam lÄ«gumam.

Mēs sauksim metodes get Šø set vārdā Lielveikals Šø Pārdevējs lai demonstrētu privātu Quorum darÄ«jumu.

  1. DalÄ«bniekiem noslēgsim privātu lÄ«gumu Lielveikals Šø Pārdevējs ar dalÄ«bnieka starpniecÄ«bu Lielveikals:

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

  2. IestatÄ«sim temperatÅ«ru no TreŔā ballÄ«te (ārējais mezgls) un iegÅ«stiet temperatÅ«ras vērtÄ«bu:

    // 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. IestatÄ«sim temperatÅ«ru no Pārdevējs (iekŔējais mezgls) un iegÅ«stiet temperatÅ«ras vērtÄ«bu:

    TemperatÅ«rai Å”ajā scenārijā ir jāatgriež vērtÄ«ba 12 no viedā lÄ«guma. LÅ«dzu, ņemiet vērā to Pārdevējs Å”eit ir autorizēta piekļuve viedajam lÄ«gumam.

    // 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. Mēs iegÅ«stam temperatÅ«ru no TreŔā ballÄ«te (ārējais mezgls):

    3. solÄ« temperatÅ«ra tika iestatÄ«ta uz 12, bet TreŔā puse nav piekļuves viedajam lÄ«gumam. Tāpēc atgrieÅ”anas vērtÄ«bai jābÅ«t nullei.

    // This returns null
    const temp3 = await getTemperature(raft3Node, contractAddress);
    console.log(`[Node3] temp retrieved from external nodes after update ${temp}`);

    Tālāk mēs sÄ«kāk aplÅ«kosim privāto darÄ«jumu veikÅ”anu Quorum tÄ«klā ar web3.js. Tā kā publiskajiem darÄ«jumiem koda lielākā daļa ir vienāda, mēs izcelsim tikai tās daļas, kas atŔķiras privātajiem darÄ«jumiem.

Ņemiet vērā, ka tÄ«klā augÅ”upielādētais lÄ«gums ir nemainÄ«gs, tāpēc attiecÄ«gajiem mezgliem ir jāpieŔķir atļauta piekļuve, iespējojot publisko lÄ«gumu lÄ«guma izvietoÅ”anas laikā, nevis pēc tā.

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;
  });
}

Privātie darÄ«jumi tiek veikti lÄ«dzÄ«gi ā€“ izpildes brÄ«dÄ« iekļaujot dalÄ«bnieku publisko atslēgu.

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;
  });
}

Tagad mēs varam skriet private.js ar Ŕādiem rezultātiem:

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 programmā Chainstack parādīs tālāk norādīto.

  • lÄ«guma izvietoÅ”ana no dalÄ«bnieka Lielveikals;
  • PiepildÄ«jums SetTemperature no TreŔā ballÄ«te;
  • PiepildÄ«jums SetTemperature no dalÄ«bnieka Pārdevējs.

Veiciet publiskos un privātos darījumus JPMorgan Quorum blokķēdē, izmantojot Web3

Kā redzat, abi darÄ«jumi ir pabeigti, bet tikai darÄ«jums no dalÄ«bnieka Pārdevējs atjaunināja temperatÅ«ru lÄ«gumā. Tādējādi privātie darÄ«jumi nodroÅ”ina nemainÄ«gumu, bet tajā paŔā laikā neatklāj datus treÅ”ajai personai.

Secinājums

Mēs izskatÄ«jām Quorum komerciālas izmantoÅ”anas gadÄ«jumu, lai nodroÅ”inātu jaunāko informāciju par temperatÅ«ru noliktavā, izvietojot tÄ«klu starp divām pusēm ā€” lielveikalu un noliktavas Ä«paÅ”nieku.

Mēs parādījām, kā atjauninātu informāciju par temperatūru var uzturēt gan publiskos, gan privātos darījumos.

Lietojumprogrammu scenāriju var būt daudz, un, kā redzat, tas nepavisam nav grūti.

Eksperimentējiet, mēģiniet paplaÅ”ināt savu skriptu. Turklāt blokķēdes tehnoloÄ£iju nozare lÄ«dz 2024. gadam varētu pieaugt gandrÄ«z desmitkārtÄ«gi.

Avots: www.habr.com

Pievieno komentāru