Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Nisap JPMorgan tarafından geliştirilen Ethereum tabanlı bir blok zinciridir ve yakın zamanda Microsoft Azure tarafından sunulan ilk dağıtılmış defter platformu olmuştur.

Quorum, özel ve halka açık işlemleri destekler ve birçok ticari kullanım durumuna sahiptir.

Bu makalede böyle bir senaryoyu inceleyeceğiz: Deponun sıcaklığı hakkında güncel bilgi sağlamak için bir süpermarket ile depo sahibi arasında dağıtılmış bir defter ağının konuşlandırılması.

Bu eğitimde kullanılan kod şuradadır: GitHub'daki depolar.

Makale şunları kapsamaktadır:

  • akıllı bir sözleşmenin oluşturulması;
  • kullanarak Quorum ağının dağıtımı Chainstack;
  • Nisap kamu işlemleri;
  • Çekirdek özel işlemleri.

Örnek olarak, Nesnelerin İnterneti (IoT) içindeki Quorum ağı üyelerinin depolarındaki sıcaklığı izlemek için bir senaryo kullanıyoruz.

Bağlam

Bir grup depo şirketi, bilgileri ortaklaşa depolamak ve blockchain üzerinde süreçleri otomatikleştirmek için bir konsorsiyumda birleşiyor. Bunun için şirketler Quorum'u kullanmaya karar verdi. Bu makalede iki senaryoyu ele alacağız: genel işlemler ve özel işlemler.

İşlemler, farklı katılımcılar tarafından ait oldukları konsorsiyumla etkileşimde bulunmak için yaratılır. Her işlem ya bir sözleşme dağıtır ya da ağa veri yüklemek için sözleşmedeki bir işlevi çağırır. Bu eylemler ağdaki tüm düğümlere kopyalanır.

Kamu işlemleri tüm konsorsiyum katılımcıları tarafından görüntülenebilir. Özel işlemler bir gizlilik katmanı ekler ve yalnızca bunu yapma hakkına sahip olan katılımcılar tarafından kullanılabilir.

Her iki senaryoda da netlik sağlamak adına aynı sözleşmeyi kullanıyoruz.

Akıllı sözleşme

Aşağıda senaryomuz için oluşturulmuş basit bir akıllı sözleşme bulunmaktadır. Genel bir değişkeni var temperaturekullanılarak değiştirilebilir. set ve yöntemle al 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;
  }
}

Sözleşmenin çalışabilmesi için web3.jsABI formatına ve bayt koduna çevrilmesi gerekir. Fonksiyonun kullanılması formatContractaşağıda sözleşmeyi kullanarak derliyoruz solc-js.

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

Tamamlanan sözleşme şuna benzer:

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

Artık sözleşme hazır olduğuna göre ağı dağıtacağız ve sözleşmeyi dağıtacağız.

Düğüm dağıtımı

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Bir düğümün konuşlandırılması oldukça emek yoğun olabilir ve bu süreç bir hizmet kullanılarak değiştirilebilir Chainstack.

Aşağıda Quorum ağını Raft fikir birliği ve üç düğümle dağıtma süreci yer almaktadır.

Öncelikle bir proje oluşturalım ve buna Çekirdek Projesi adını verelim:

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Google Cloud Platform'da Raft fikir birliğine sahip bir Quorum ağı oluşturalım:

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Varsayılan olarak oluşturulan düğüme iki düğüm daha ekleyelim:

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Çalışan üç düğüm:

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Düğüm ayrıntıları sayfasında RPC uç noktası, ortak anahtar vb. gösterilir.

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Ağ konuşlandırıldı. Şimdi akıllı sözleşmeleri dağıtalım ve işlemleri şunu kullanarak gerçekleştirelim: web3.js.

Kamu işlemleri

Bağlam

Özellikle sıfırın altındaki sıcaklıklarda depolanması amaçlanan ürünlerde maliyetlerin azaltılmasında depo sıcaklığı büyük önem taşımaktadır.

Ağ katılımcıları, şirketlerin coğrafi konumlarının dış sıcaklığını gerçek zamanlı olarak paylaşmalarına ve bunu değişmez bir deftere kaydetmelerine olanak tanıyarak maliyetleri ve zamanı azaltır.

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Diyagramda gösterilen üç görevi gerçekleştireceğiz:

  1. Sözleşmeyi şu şekilde dağıtacağız: Düğüm 1:

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

  2. Sıcaklığı şununla ayarlayın: Düğüm 2 3 derece:

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

  3. Düğüm 3 akıllı sözleşmeden bilgi alacaktır. Sözleşme değeri 3 derece döndürecektir:

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

    Daha sonra, Quorum ağında halka açık bir işlemin nasıl yürütüleceğine bakacağız. web3.js.

Üç düğüm için RPC aracılığıyla bir örnek başlatıyoruz:

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

Akıllı sözleşmeyi dağıtalım:

// 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 Sözleşmeyle etkileşime geçmek için iki yöntem sunar: call и send.

Sözleşme sıcaklığını çalıştırarak güncelleyelim set web3 yöntemini kullanma 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;
  });
}

Daha sonra web3 yöntemini kullanıyoruz call Sözleşme sıcaklığını elde etmek için. Lütfen yöntemin call yerel bir düğümde yürütülür ve işlem blockchain üzerinde oluşturulmaz.

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

Artık koşabilirsin public.js aşağıdaki sonucu elde etmek için:

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

Daha sonra aşağıda gösterildiği gibi Chainstack panelinde Quorum explorer'daki girişleri görüntüleyebiliriz.

Üç düğümün tümü etkileşime girdi ve işlemler güncellendi:

  1. İlk işlem sözleşmeyi dağıttı.
  2. İkinci işlemde sözleşme sıcaklığı 3 dereceye ayarlandı.
  3. Sıcaklık yerel bir düğüm aracılığıyla alınır, dolayısıyla herhangi bir işlem oluşturulmaz.

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Özel işlemler

Bağlam

Kuruluşların ortak gereksinimi veri korumasıdır. Örnek olarak şöyle bir senaryo düşünün: Süpermarket deniz ürünlerini ayrı bir yerden depolamak için bir depo alanı kiralar SATICI:

  • SATICI IoT sensörlerini kullanarak her 30 saniyede bir sıcaklık değerlerini okur ve iletir Süpermarkete;
  • bu değerler yalnızca mevcut olmalıdır Satıcıya и Süpermarketebir konsorsiyum tarafından ağa bağlanmıştır.

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Yukarıdaki şemada gösterilen dört görevi tamamlayacağız.

  • Özel işlemleri göstermek için önceki senaryodaki aynı üç düğümü kullanıyoruz:
  • Süpermarket özel bir akıllı sözleşme dağıtır Süpermarket и SATICI.
  • Üçüncü taraf akıllı sözleşmeye erişim hakkına sahip değildir.

Yöntemleri çağıracağız get и set Adına Süpermarket и SATICI özel bir Çekirdek işlemini göstermek için.

  1. Katılımcılar için özel bir sözleşme uygulayacağız Süpermarket и SATICI bir katılımcı aracılığıyla Süpermarket:

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

  2. Sıcaklığı şuradan ayarlayalım: Üçüncü şahıs (harici düğüm) ve sıcaklık değerini alın:

    // 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. Sıcaklığı şuradan ayarlayalım: SATICI (dahili düğüm) ve sıcaklık değerini alın:

    Bu senaryodaki sıcaklık, akıllı sözleşmeden 12 değerini döndürmelidir. Lütfen unutmayın SATICI burada akıllı sözleşmeye yetkili erişim var.

    // 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. Sıcaklığı oradan alıyoruz Üçüncü şahıs (harici düğüm):

    3. adımda sıcaklık 12'ye ayarlandı, ancak Üçüncü taraf akıllı sözleşmeye erişimi yoktur. Bu nedenle dönüş değeri null olmalıdır.

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

    Daha sonra Quorum ağında özel işlemlerin gerçekleştirilmesine daha yakından bakacağız. web3.js. Kodun çoğu genel işlemler için aynı olduğundan, yalnızca özel işlemler için farklı olan kısımları vurgulayacağız.

Ağa yüklenen sözleşmenin değiştirilemez olduğunu unutmayın; bu nedenle, kamu sözleşmesinin sözleşmenin dağıtılmasından sonra değil, dağıtıldığı sırada etkinleştirilmesiyle uygun düğümlere izinli erişim verilmesi gerekir.

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

Özel işlemler de benzer şekilde, yürütme sırasında katılımcıların genel anahtarı dahil edilerek gerçekleştirilir.

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

Artık koşabiliriz özel.js aşağıdaki sonuçlarla:

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'taki Çekirdek gezgini aşağıdakileri gösterecektir:

  • sözleşmenin katılımcı tarafından dağıtılması Süpermarket;
  • Performans SetTemperature itibaren Üçüncü şahıs;
  • Performans SetTemperature bir katılımcıdan SATICI.

Web3'ü kullanarak JPMorgan Quorum blok zincirinde genel ve özel işlemler gerçekleştirin

Gördüğünüz gibi her iki işlem de tamamlandı ancak yalnızca katılımcının işlemi tamamlandı SATICI sözleşmedeki sıcaklık güncellendi. Böylece, özel işlemler değişmezlik sağlar ancak aynı zamanda verileri üçüncü bir tarafa ifşa etmez.

Sonuç

Bir süpermarket ve bir depo sahibi olmak üzere iki taraf arasında bir ağ kurarak bir depoda güncel sıcaklık bilgileri sağlamak için Quorum'un ticari kullanım örneğini inceledik.

Güncel sıcaklık bilgilerinin hem kamusal hem de özel işlemler aracılığıyla nasıl korunabileceğini gösterdik.

Pek çok uygulama senaryosu olabilir ve gördüğünüz gibi hiç de zor değil.

Deney yapın, senaryonuzu genişletmeye çalışın. Ayrıca blockchain teknolojisi endüstrisi 2024 yılına kadar neredeyse on kat büyüyebilir.

Kaynak: habr.com

Yorum ekle