Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

кворум е блокчејн базиран на Ethereum развиен од JPMorgan и неодамна стана првата дистрибуирана ledger платформа што ја нуди Microsoft Azure.

Кворумот поддржува приватни и јавни трансакции и има многу случаи за комерцијална употреба.

Во оваа статија, ќе испитаме едно такво сценарио - распоредување на дистрибуирана мрежа на книги помеѓу супермаркет и сопственик на складиште за да обезбеди ажурирани информации за температурата на складиштето.

Кодот што се користи во ова упатство е во складишта на GitHub.

Статијата опфаќа:

  • создавање на паметен договор;
  • распоредување на мрежата Кворум користејќи Ланец на синџири;
  • Кворум јавни трансакции;
  • Кворум приватни трансакции.

За илустрација, користиме сценарио за следење на температурата во магацините на членовите на мрежата Quorum во рамките на Интернет на нештата (IoT).

Контекст

Група компании за складирање се обединуваат во конзорциум за заеднички да складираат информации и да ги автоматизираат процесите на блокчејнот. За ова, компаниите одлучија да користат Кворум. Во оваа статија ќе опфатиме две сценарија: јавни трансакции и приватни трансакции.

Трансакциите се креирани од различни учесници за да комуницираат со конзорциумот на кој припаѓаат. Секоја трансакција или распоредува договор или повикува функција во договорот за поставување податоци на мрежата. Овие дејства се реплицираат на сите јазли на мрежата.

Јавните трансакции се достапни за гледање од сите учесници на конзорциумот. Приватните трансакции додаваат слој на доверливост и се достапни само за оние учесници кои имаат право да го сторат тоа.

За двете сценарија, го користиме истиот договор за јасност.

Паметен договор

Подолу е едноставен паметен договор создаден за нашето сценарио. Има јавна променлива temperature, што може да се промени со користење set и примајте по метод 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;
  }
}

За да може договорот да работи со web3.js, мора да биде преведен во формат ABI и бајтекод. Користење на функцијата formatContractподолу го составува договорот користејќи solc-js.

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

Пополнетиот договор изгледа вака:

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

Сега кога договорот е готов, ќе ја распоредиме мрежата и ќе го распоредиме договорот.

Распоредување на јазол

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Распоредувањето на јазол може да биде доста трудоинтензивно и овој процес може да се замени со користење на услуга Ланец на синџири.

Подолу е процесот за распоредување на мрежата Quorum со консензус на Raft и три јазли.

Прво, ајде да создадеме проект и да го наречеме Проект на кворум:

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Ајде да создадеме мрежа Quorum со консензус на Raft на Google Cloud Platform:

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Ајде да додадеме уште два јазли на јазолот што е веќе стандардно создаден:

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Три трчање јазли:

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Страницата со детали за јазол ја прикажува крајната точка RPC, јавниот клуч итн.

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Мрежата е распоредена. Сега ајде да распоредиме паметни договори и да извршиме трансакции користејќи web3.js.

Јавни трансакции

Контекст

Температурата во складиштето е од големо значење за намалување на трошоците, особено за производите наменети за складирање на температури под нулата.

Дозволувајќи им на компаниите да ја споделат надворешната температура на нивната географска локација во реално време и да ја снимаат во непроменлива книга, учесниците во мрежата ги намалуваат трошоците и времето.

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Ќе извршиме три задачи, илустрирани на дијаграмот:

  1. Договорот ќе го распоредиме преку Јазол 1:

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

  2. Поставете ја температурата преку Јазол 2 за 3 степени:

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

  3. Јазол 3 ќе добива информации од паметниот договор. Договорот ќе ја врати вредноста 3 степени:

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

    Следно, ќе погледнеме како да се изврши јавна трансакција на мрежата Quorum користејќи web3.js.

Ние иницираме пример преку RPC за три јазли:

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

Ајде да го распоредиме паметниот договор:

// 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 обезбедува два методи за интеракција со договорот: call и send.

Ајде да ја ажурираме температурата на договорот со извршување set користејќи веб3 метод 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;
  });
}

Следно го користиме методот web3 call за да се добие договорната температура. Ве молиме имајте предвид дека методот call се извршува на локален јазол и трансакцијата нема да се креира на блокчејнот.

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

Сега можете да трчате јавно.js за да го добиете следниот резултат:

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

Следно, можеме да ги прегледаме записите во Quorum Explorer во панелот Chainstack, како што е прикажано подолу.

Сите три јазли комуницираа и трансакциите беа ажурирани:

  1. Првата трансакција го распореди договорот.
  2. Втората трансакција ја постави температурата на договорот на 3 степени.
  3. Температурата се прима преку локален јазол, така што не се создава трансакција.

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Приватни трансакции

Контекст

Вообичаено барање на организациите е заштита на податоците. Како пример, разгледајте сценарио во кое Супермаркет изнајмува магацински простор за чување на морска храна од посебна Продавач:

  • Продавач користејќи IoT сензори, ги чита температурните вредности на секои 30 секунди и ги пренесува До супермаркет;
  • овие вредности треба да бидат достапни само На продавачот и До супермаркет, мрежен од конзорциум.

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Ќе ги завршиме четирите задачи илустрирани на дијаграмот погоре.

  • Ги користиме истите три јазли од претходното сценарио за да ги демонстрираме приватните трансакции:
  • Супермаркет распоредува паметен договор за кој е приватен Супермаркет и Продавач.
  • Третата страна нема право на пристап до паметниот договор.

Ние ќе ги повикаме методите get и set во име на Супермаркет и Продавач да се демонстрира приватна трансакција на Кворум.

  1. Ќе распоредиме приватен договор за учесниците Супермаркет и Продавач преку учесник Супермаркет:

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

  2. Ајде да ја поставиме температурата од Трето лице (надворешен јазол) и добијте ја температурната вредност:

    // 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. Ајде да ја поставиме температурата од Продавач (внатрешен јазол) и добијте ја температурната вредност:

    Температурата во ова сценарио треба да ја врати вредноста 12 од паметниот договор. Имајте предвид дека Продавач овде има овластен пристап до паметниот договор.

    // 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. Температурата ја добиваме од Трето лице (надворешен јазол):

    Во чекор 3 температурата беше поставена на 12, но Третата страна нема пристап до паметниот договор. Затоа повратната вредност мора да биде нула.

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

    Следно, ќе разгледаме подетално извршување на приватни трансакции на мрежата Quorum со web3.js. Бидејќи најголемиот дел од кодот е ист за јавни трансакции, ќе ги истакнеме само оние делови кои се различни за приватни трансакции.

Забележете дека договорот што е поставен на мрежата е непроменлив, па затоа мора да се даде дозволен пристап до соодветните јазли со овозможување на јавниот договор во моментот на распоредување на договорот, а не после.

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

Приватните трансакции се вршат на сличен начин - со вклучување на јавниот клуч на учесниците во моментот на извршување.

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

Сега можеме да трчаме приватно.js со следните резултати:

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 во Chainstack ќе го прикаже следново:

  • распоредување на договорот од учесникот Супермаркет;
  • Исполнување SetTemperature од Трето лице;
  • Исполнување SetTemperature од учесник Продавач.

Вршете јавни и приватни трансакции на блокчејнот JPMorgan Quorum користејќи Web3

Како што можете да видите, двете трансакции се завршени, но само трансакцијата од учесникот Продавач ја ажурираше температурата во договорот. Така, приватните трансакции обезбедуваат непроменливост, но во исто време не откриваат податоци на трето лице.

Заклучок

Разгледавме случај за комерцијална употреба за Quorum за да обезбедиме ажурирани информации за температурата во складиштето преку распоредување на мрежа помеѓу две страни - супермаркет и сопственик на складиште.

Покажавме како може да се одржуваат ажурирани информации за температурата и преку јавни и приватни трансакции.

Може да има многу сценарија за апликација и, како што можете да видите, тоа не е воопшто тешко.

Експериментирајте, обидете се да ја проширите вашата скрипта. Покрај тоа, блокчејн технолошката индустрија би можел да порасне речиси десет пати до 2024 година.

Извор: www.habr.com

Додадете коментар