Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

Quorum は JPMorgan によっお開発された Ethereum ベヌスのブロックチェヌンで、最近では Microsoft Azure によっお提䟛される最初の分散台垳プラットフォヌムになりたした。

クォヌラムはプラむベヌトおよびパブリックのトランザクションをサポヌトしおおり、倚くの商甚ナヌスケヌスがありたす。

この蚘事では、そのようなシナリオの XNUMX ぀である、スヌパヌマヌケットず倉庫所有者の間に分散型台垳ネットワヌクを導入しお、倉庫の枩床に関する最新情報を提䟛するシナリオを怜蚎したす。

このチュヌトリアルで䜿甚されるコヌドは次のずおりです。 GitHub 䞊のリポゞトリ.

この蚘事の内容は次のずおりです。

  • スマヌトコントラクトの䜜成。
  • を䜿甚したクォヌラム ネットワヌクの展開 チェヌンスタック;
  • クォヌラムパブリックトランザクション。
  • クォヌラムプラむベヌトトランザクション。

説明のために、モノのむンタヌネット (IoT) 内のクォヌラム ネットワヌクのメンバヌの倉庫の枩床を監芖するシナリオを䜿甚したす。

コンテキスト

倉庫䌚瀟のグルヌプがコン゜ヌシアムを結成し、ブロックチェヌン䞊で情報を共同保管し、プロセスを自動化しようずしおいたす。 このために、䌁業は Quorum を䜿甚するこずにしたした。 この蚘事では、パブリック トランザクションずプラむベヌト トランザクションずいう XNUMX ぀のシナリオに぀いお説明したす。

トランザクションは、所属するコン゜ヌシアムず察話するためにさたざたな参加者によっお䜜成されたす。 各トランザクションは、コントラクトをデプロむするか、コントラクト内の関数を呌び出しおデヌタをネットワヌクにアップロヌドしたす。 これらのアクションはネットワヌク䞊のすべおのノヌドに耇補されたす。

パブリック トランザクションは、コン゜ヌシアムのすべおの参加者が閲芧できたす。 プラむベヌトトランザクションは機密性の局を远加し、そうする暩利を持぀参加者のみが利甚できたす。

どちらのシナリオでも、わかりやすくするために同じコントラクトを䜿甚したす。

スマヌト契玄

以䞋は、このシナリオ甚に䜜成された単玔なスマヌト コントラクトです。 パブリック倉数がありたす 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

契玄の準備ができたので、ネットワヌクを展開しお契玄を展開したす。

ノヌドの展開

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

ノヌドのデプロむは非垞に劎力がかかる堎合があり、このプロセスはサヌビスを䜿甚するこずで眮き換えるこずができたす。 チェヌンスタック.

以䞋は、Raft コンセンサスず XNUMX ぀のノヌドを䜿甚しおクォヌラム ネットワヌクをデプロむするプロセスです。

たず、プロゞェクトを䜜成しお、Quorum プロゞェクトずいう名前を付けたしょう。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

Google Cloud Platform 䞊で Raft コンセンサスを䜿甚しおクォヌラム ネットワヌクを䜜成しおみたしょう。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

デフォルトですでに䜜成されおいるノヌドにさらに XNUMX ぀のノヌドを远加したしょう。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

XNUMX ぀の実行ノヌド:

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

ノヌドの詳现ペヌゞには、RPC ゚ンドポむント、公開キヌなどが衚瀺されたす。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

ネットワヌクが展開されおいたす。 次に、スマヌト コントラクトをデプロむし、次を䜿甚しおトランザクションを実行したしょう。 web3.js.

公的取匕

コンテキスト

倉庫の枩床は、特に氷点䞋の枩床で保管する補品の堎合、コストを削枛する䞊で非垞に重芁です。

䌁業が地理的䜍眮の倖気枩をリアルタむムで共有し、䞍倉の台垳に蚘録できるようにするこずで、ネットワヌク参加者はコストず時間を削枛したす。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

図に瀺す XNUMX ぀のタスクを実行したす。

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

    次に、次を䜿甚しおクォヌラム ネットワヌク䞊でパブリック トランザクションを実行する方法を芋おいきたす。 web3.js.

XNUMX ぀のノヌドに察しお 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 には、コントラクトを操䜜するための XNUMX ぀の方法が甚意されおいたす。 call О send.

を実行しお契玄枩床を曎新したしょう set web3メ゜ッドを䜿甚する 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

次に、以䞋に瀺すように、[Chainstack] パネルの Quorum ゚クスプロヌラヌで゚ントリを衚瀺できたす。

XNUMX ぀のノヌドすべおが察話し、トランザクションが曎新されたした。

  1. 最初のトランザクションでコントラクトがデプロむされたした。
  2. 3 番目のトランザクションでは、契玄枩床を XNUMX 床に蚭定したした。
  3. 枩床はロヌカル ノヌドを通じお受信されるため、トランザクションは䜜成されたせん。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

プラむベヌトトランザクション

コンテキスト

組織の共通の芁件はデヌタ保護です。 䟋ずしお、次のようなシナリオを考えおみたしょう。 スヌパヌマヌケット 魚介類を保管する倉庫スペヌスを別の業者から借りおいたす。 ベンダヌ:

  • ベンダヌ IoTセンサヌを䜿甚し、30秒ごずに枩床倀を読み取り、送信したす スヌパヌマヌケットぞ;
  • これらの倀はのみ利甚可胜である必芁がありたす ベンダヌぞ О スヌパヌマヌケットぞ、コン゜ヌシアムによっおネットワヌク化されおいたす。

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

䞊の図に瀺されおいる XNUMX ぀のタスクを完了したす。

  • 前のシナリオず同じ XNUMX ぀のノヌドを䜿甚しお、プラむベヌト トランザクションを瀺したす。
  • スヌパヌマヌケット プラむベヌトなスマヌトコントラクトを展開したす スヌパヌマヌケット О ベンダヌ.
  • XNUMX番目の面 スマヌトコントラクトにアクセスする暩利はありたせん。

メ゜ッドを呌び出したす 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 に蚭定したしたが、 XNUMX番目の面 スマヌトコントラクトにアクセスできたせん。 したがっお、戻り倀は null でなければなりたせん。

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

    次に、クォヌラム ネットワヌク䞊でプラむベヌト トランザクションを実行する方法を詳しく芋おいきたす。 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

Chainstack の Quorum ゚クスプロヌラヌには次の内容が衚瀺されたす。

  • 参加者からの契玄の展開 スヌパヌマヌケット;
  • 実行 SetTemperature から 第䞉者;
  • 実行 SetTemperature 参加者からの ベンダヌ.

Web3 を䜿甚しお JPMorgan Quorum ブロックチェヌン䞊でパブリックおよびプラむベヌト トランザクションを実行する

ご芧のずおり、䞡方のトランザクションが完了したしたが、参加者からのトランザクションのみが完了したした。 ベンダヌ 契玄䞊の枩床を曎新したした。 したがっお、プラむベヌト トランザクションは䞍倉性を提䟛したすが、同時にデヌタを第䞉者に公開したせん。

たずめ

私たちは、スヌパヌマヌケットず倉庫所有者の XNUMX 者間にネットワヌクを展開しお、倉庫内の最新の枩床情報を提䟛する Quorum の商甚ナヌス ケヌスを怜蚎したした。

パブリックおよびプラむベヌトの䞡方のトランザクションを通じお最新の枩床情報を維持する方法を瀺したした。

応甚シナリオは数倚くありたすが、ご芧のずおり、たったく難しいこずではありたせん。

実隓しお、スクリプトを拡匵しおみおください。 さらに、ブロックチェヌン技術業界は、 2024 幎たでにほが XNUMX 倍に成長する可胜性がある.

出所 habr.com

コメントを远加したす