Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Кворум је блок ланац заснован на Етхереум-у који је развио ЈПМорган и недавно је постао прва платформа дистрибуиране књиге коју нуди Мицрософт Азуре.

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

У овом чланку ћемо испитати један такав сценарио - постављање мреже дистрибуиране књиге између супермаркета и власника складишта како би се обезбедиле ажурне информације о температури складишта.

Код који се користи у овом водичу је у спремишта на ГитХуб-у.

Чланак покрива:

  • креирање паметног уговора;
  • распоређивање мреже Куорум користећи Цхаинстацк;
  • Кворум јавне трансакције;
  • Приватне трансакције кворума.

За илустрацију користимо сценарио за праћење температуре у складиштима чланова Куорум мреже у оквиру Интернета ствари (ИоТ).

Контекст

Група складишних компанија уједињује се у конзорцијум за заједничко складиштење информација и аутоматизацију процеса на блокчејну. За ово су компаније одлучиле да користе Куорум. У овом чланку ћемо покрити два сценарија: јавне трансакције и приватне трансакције.

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

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

За оба сценарија користимо исти уговор ради јасноће.

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

Испод је једноставан паметни уговор креиран за наш сценарио. Има јавну променљиву 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;
  }
}

Да би уговор функционисао веб3.јс, мора бити преведен у АБИ формат и бајт код. Коришћење функције formatContractу наставку саставља уговор користећи солц-јс.

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

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

Распоређивање чвора

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Примена чвора може бити прилично радно интензивна и овај процес се може заменити коришћењем услуге Цхаинстацк.

Испод је процес за постављање мреже Куорум са Рафт консензусом и три чвора.

Прво, направимо пројекат и назовемо га Куорум Пројецт:

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Хајде да направимо Куорум мрежу са Рафт консензусом на Гоогле Цлоуд платформи:

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Хајде да додамо још два чвора чвору који је већ креиран подразумевано:

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Три покренута чвора:

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Страница са детаљима о чвору приказује РПЦ крајњу тачку, јавни кључ итд.

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Мрежа је распоређена. Хајде сада да применимо паметне уговоре и извршимо трансакције користећи веб3.јс.

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

Контекст

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

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

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Извршићемо три задатка, илустрована на дијаграму:

  1. Уговор ћемо применити преко Ноде КСНУМКС:

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

  2. Подесите температуру преко Ноде КСНУМКС за 3 степена:

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

  3. Ноде КСНУМКС ће добити информације из паметног уговора. Уговор ће вратити вредност 3 степена:

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

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

Покрећемо инстанцу преко РПЦ-а за три чвора:

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

веб3.јс пружа две методе за интеракцију са уговором: 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;
  });
}

Затим користимо метод веб3 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);
}

Сада можете да трчите публиц.јс да бисте добили следећи резултат:

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

Затим можемо видети уносе у Куорум истраживачу на панелу Цхаинстацк, као што је приказано испод.

Сва три чвора су интераговала и трансакције су ажуриране:

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

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

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

Контекст

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

  • Вендор користећи ИоТ сензоре, чита вредности температуре сваких 30 секунди и преноси их До супермаркета;
  • ове вредности би требало да буду доступне само Продавцу и До супермаркета, умрежен од стране конзорцијума.

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Завршићемо четири задатка приказана на дијаграму изнад.

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

Позваћемо методе 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}`);

    Затим ћемо детаљније погледати извођење приватних трансакција на Куорум мрежи са веб3.јс. Пошто је већина кода иста за јавне трансакције, ми ћемо истаћи само оне делове који се разликују за приватне трансакције.

Имајте на уму да је уговор отпремљен на мрежу непроменљив, тако да се дозвољени приступ мора одобрити одговарајућим чворовима омогућавањем јавног уговора у време када се уговор примењује, а не после.

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

Сада можемо да трчимо привате.јс са следећим резултатима:

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

Куорум истраживач у Цхаинстацк-у ће показати следеће:

  • распоређивање уговора од учесника Супер маркет;
  • Извршење SetTemperature из Трећа страна;
  • Извршење SetTemperature од учесника Вендор.

Обављајте јавне и приватне трансакције на блокчејну ЈПМорган Куорум користећи Веб3

Као што видите, обе трансакције су завршене, али само трансакција од учесника Вендор ажурирали температуру у уговору. Дакле, приватне трансакције обезбеђују непроменљивост, али у исто време не откривају податке трећој страни.

Закључак

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

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

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

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

Извор: ввв.хабр.цом

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