Shrnout

V části 1 jsme dokončili nastavení dvouuzlového privátního blockchainu Ethereum. Nyní nasazujeme smlouvu na tomto blockchainu a účty obou uzlů mají přístup ke smlouvě a provádění funkcí.

Mým plánem je nasadit smlouvu na uzel 1 a zjistit, jak uzel 2 přistupuje k této smlouvě.

Smlouva, kterou používám, je „Voting.sol“ od Maheshe Murthyho ve svém blogu (odkaz). Napsal velmi komplexního průvodce aplikací Ethereum. Zatímco nasadil aplikaci na testrpc, plánuji nasadit stejnou smlouvu na můj soukromý blockchain se stejným příkladem nasazení. Postup nasazení můžete snadno zkontrolovat.

Vzhledem k tomu, že velmi podrobně vysvětlil, jak kompilace kódu funguje, přeskočím podrobnosti a odkazuji pouze na některé body týkající se mého nasazení smlouvy. Viz jeho část 1 (odkaz) o podrobnostech o kódu a kompilaci.

Kód „Voting.sol“

Voting.sol (zdroj: odkaz)

pragmatická pevnost ^ 0,4,11;

// Musíme určit, s jakou verzí kompilátoru bude tento kód kompilován

hlasování o smlouvě {

/ * mapovací pole níže je ekvivalentní asociativnímu poli nebo hash.

Klíčem mapování je název kandidáta uložený jako typ bytes32 a hodnota je

celé číslo bez znaménka pro uložení počtu hlasů

* /

mapování (bytes32 => uint8) veřejné hlasování Přijato;

/ * Solidity vám nedovolí projít řadou řetězců v konstruktoru (zatím).

Místo toho použijeme pole bytes32 k uložení seznamu kandidátů

* /

bytes32 [] public candidateList;

/ * Toto je konstruktor, který bude volán jednou, když vy

nasadit smlouvu na blockchain. Když nasazujeme smlouvu,

projdeme řadu kandidátů, kteří budou ve volbách bojovat

* /

funkce hlasování (bytes32 [] candidateNames) {

candidateList = candidateNames;

}

// Tato funkce vrací celkový počet hlasů, které kandidát dosud získal

funkce totalVotesFor (bytes32 candidate) vrací (uint8) {

if (validCandidate (candidate) == false) házet;

zpětné hlasy Přijato [kandidát];

}

// Tato funkce zvyšuje počet hlasů pro zadaného kandidáta. Tento

// je ekvivalent hlasování

funkce voteForCandidate (bytes32 candidate) {

if (validCandidate (candidate) == false) házet;

hlasů Přijato [kandidát] + = 1;

}

function validCandidate (bytes32 candidate) returns (bool) {

pro (uint i = 0; i < candidateList.length; i ++) {

if (candidateList [i] == candidate) {

návrat true;

}

}

návrat false;

}

}

d! ‘

Toto je jednoduchá smlouva, která ilustruje, jak funguje kód Solidity. Zde je několik bodů, na které budeme v této části odkazovat.

  1. Smlouva vyžaduje seznam kandidátů (viz konstruktor). To zadáme při nasazování nové smlouvy.
  2. V této smlouvě jsou definovány dvě funkce: celkem Hlasovat pro a Hlasovat pro kandidáta. Tyto dvě funkce použijeme k interakci se smlouvou z obou uzlů.

Můžete najít podrobný proces kompilace (pomocí solc) tady. Po kompilaci potřebujeme dvě informace pro nasazení smlouvy. Jsou to Application Binary Interface (ABI) a Bytecode.

Aplikační binární rozhraní (ABI)

Obsahuje metody dostupné v této smlouvě, se kterými mohou uživatelé komunikovat. Zde je ABI pro tuto hlasovací smlouvu.

„[{"konstantní":Nepravdivé,"vstupy": [{"název":"kandidát","typ":"bytes32"}],"název":"totalVotesFor","výstupy": [{"název":"","typ":"uint8"}],"splatné":Nepravdivé,"typ":"funkce"}, {"konstantní":Nepravdivé,"vstupy": [{"název":"kandidát","typ":"bytes32"}],"název":"validCandidate","výstupy": [{"název":"","typ":"bool"}],"splatné":Nepravdivé,"typ":"funkce"}, {"konstantní":skutečný,"vstupy": [{"název":"","typ":"bytes32"}],"název":"hlasů přijato","výstupy": [{"název":"","typ":"uint8"}],"splatné":Nepravdivé,"typ":"funkce"}, {"konstantní":skutečný,"vstupy": [{"název":"","typ":"uint256"}],"název":"candidateList","výstupy": [{"název":"","typ":"bytes32"}],"splatné":Nepravdivé,"typ":"funkce"}, {"konstantní":Nepravdivé,"vstupy": [{"název":"kandidát","typ":"bytes32"}],"název":"voteForCandidate","výstupy": [],"splatné":Nepravdivé,"typ":"funkce"}, {"vstupy": [{"název":"kandidátní jména","typ":"bytes32 []"}],"splatné":Nepravdivé,"typ":"konstruktor"}] ‘

Bytecode

Jedná se o skutečný kód smlouvy, který se má nasadit na blockchain. Tady je bytecode.

‚0x6060604052341561000c57fe5b6040516103d83803806103d8833981016040528080518201919050505b806001908051906020019061003f929190610047565b505b506100bf565b828054828255906000526020600020908101928215610089579160200282015b82811115610088578251829060001916905591602001919060010190610067565b5b509050610096919061009a565b5090565b6100bc91905b808211156100b85760008160009055506001016100a0565b5090565b90565b61030a806100ce6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f265cf714610067578063392e6678146100a55780637021939f146100e1578063b13c744b1461011f578063cc9ab2671461015b575bfe5b341561006f57fe5b61008960048080356000191690602001909190505061017f565b604051808260ff1660ff16815260200191505060405180910390f35b34156100ad57fe5b6100c76004808035600019169060200190919050506101cd565b604051808215151515815260200191505060405180910390f35b34156100e957fe5b610103600480803560001916906020019091905050610233565b604051808260ff1660ff16815260200191505060405180910390f35b341561012 757fe5b61013d6004808035906020019091905050610253565b60405180826000191660001916815260200191505060405180910390f35b341561016357fe5b61017d600480803560001916906020019091905050610278565b005b60006000151561018e836101cd565b1515141561019c5760006000fd5b60006000836000191660001916815260200190815260200160002060009054906101000a900460ff1690505b919050565b60006000600090505b6001805490508110156102285782600019166001828154811015156101f757fe5b906000526020600020900160005b505460001916141561021a576001915061022d565b5b80806001019150506101d6565b600091505b50919050565b60006020528060005260406000206000915054906101000a900460ff1681565b60018181548110151561026257fe5b906000526020600020900160005b915090505481565b60001515610285826101cd565b151514156102935760006000fd5b600160006000836000191660001916815260200190815260200160002060008282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055505b505600a165627a7a72305820994b2ebbfeec46890216bc547cf9a1292547cc43f08440506866c34b2ff0ac9e0029′

Kroky

Krok 1: Nainstalujte si node.js a web3 na oba uzly

Interakce se smlouvou probíhá prostřednictvím nodejs a web3js. Musíme nainstalovat nodejs a moduly web3. Postupuji podle zde navrženého postupu (odkaz).

Uzel 1

$ sudo apt-get nainstalovat vlastnosti pythonu-softwaru

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash –

$ sudo apt-get install nodejs

Chcete-li ověřit úspěšnou instalaci, použijte $ node -v a $ npm -v a zobrazí se jejich verze.

Poté nainstalujte modul web3.

Uzel 1

$ npm instalace web3

Tento krok opakujte také v uzlu 2.

Krok 2: Přístup k blockchainu přes web3 v konzole Node

Jsme připraveni na přístup k uzlu. Vzhledem k tomu, že potřebujeme klienta geth i konzolu uzlu, použijeme opět rozdělenou obrazovku. Horní terminál je geth a spodní je uzlová konzola.

Chcete-li spustit geth, v závislosti na tom, zda stále máte spuštěný geth, by vás měl kterýkoli příkaz vrátit zpět na konzolu.

Uzel 1 (geth)

$ geth – konzole nodiscover 2>>eth.log NEBO

$ geth připojit

Chcete-li spustit konzolu uzlu, jednoduše použijte toto

Uzel 1 (uzel)

$ uzel

Nastavení dvouuzlového privátního etherea na AWS s nasazením smlouvy (část 2)

Nyní jsme připraveni použít konzolu uzlu pro přístup k geth pomocí rpc. Výchozí rpc je na http: // localhost: 8545 /.

Nejprve zapněte rpc na geth:

Uzel 1 (geth)

> admin.startRPC ()

Na konzole uzlu,

Uzel 1 (geth)

> admin.startRPC ()

K ověření, zda uzel může úspěšně dosáhnout geth, můžeme použít > web3.eth.accounts na uzlové konzole. Měli bychom vidět účet, který jsme vytvořili na konzoli geth.

Nastavení dvouuzlového privátního etherea na AWS s nasazením smlouvy (část 2)

Tento krok opakujte na uzlu 2.

Krok 3: Nasazení smlouvy na uzel 1

Nyní nasazujeme smlouvu na tento soukromý blockchain z Uzlu 1.

Uzel 1 (uzel)

> abi = <abi je uvedeno výše>

> VotingContract = web3.eth.contract (JSON.parse (abi))

> byteCode = <výše uvedený bytecode>

Protože nasazení vyžaduje plyn, musíme odemknout účet a zapnout těžbu

Uzel 1 (geth)

> personal.unlockAccount (eth.accounts [0])

> miner.start ()

Nyní nasazujeme smlouvu. Tato smlouva vyžaduje seznam kandidátů. To zahrneme při nasazování smlouvy.

Uzel 1 (uzel)

> deployedContract = VotingContract.new ([‘Rama’, ‘Nick’, ‘Jose’], {data: byteCode, from: web3.eth.accounts [0], gas: 4700000})

Nyní je smlouva nasazena. A můžeme provést funkce pro ověření. Uvidíme, jak se hlas bude zvyšovat, když budeme pokračovat v provádění funkcí.

Uzel 1 (uzel)

> deployedContract.totalVoteFor.call (‘Rama’)

> deployedContract.voteForCandidate (‘Rama’, {from: web3.eth.accounts [0]})

Nastavení dvouuzlového privátního etherea na AWS s nasazením smlouvy (část 2)

Smlouva je úspěšně nasazena. Nyní se přesuneme do Node 2 a uvidíme, jak bude mít přístup k této smlouvě také účet v Node 2.

Krok 4: Přístup ke smlouvě z uzlu 2

Ujistěte se, že uzel 1 a uzel 2 již mají vzájemný vztah. Ověřit pomocí > admin.peers na konzole geth na obou uzlech. V případě potřeby si přečtěte část 1, jak postupovat.

Informace požadované pro účet v Node 2 přistupující k této implementované smlouvě jsou (1) ABI a (2) jeho implementovaná adresa. Informace ABI již máme. Nyní z Node 1 můžeme získat tuto nasazenou adresu.

Uzel 1 (uzel)

> deployedContract.address

„0x97a4b975c8fde24d8e40551054342c95676ed959“

0]})

Pro ABI definujeme VotingContract se stejným abi na Node 2.

Uzel 2 (uzel)

> abi = <abi je uvedeno výše>

> VotingContract = web3.eth.contract (JSON.parse (abi))

Nepotřebujeme nasadit novou smlouvu, jako jsme to udělali na Node 1. Místo toho definujeme instanci smlouvy na základě VotingContract a adresy, kterou jsme získali z Node 1.

Uzel 2 (uzel)

> contractInstance = VotingContract.at (‘0x97a4b975c8fde24d8e40551054342c95676ed959’)

Levá strana je uzel 1 a pravá strana je uzel 2.

Nastavení dvouuzlového privátního etherea na AWS s nasazením smlouvy (část 2)

Nyní je smluvní instance bod, ke kterému můžeme přistupovat k této nasazené smlouvě v uzlu 2. Příkazy můžeme vydávat stejně jako v uzlu 1:

Uzel 2 (uzel)

> contractInstance.totalVoteFor.call (‘Rama’)

> contractInstance.voteForCandidate (‘Rama’, {from: web3.eth.accounts [0]})

)

Nezapomeňte při hlasování odemknout účet na uzlu 2, protože to spotřebovává plyn k provedení funkce smlouvy.

Krok 5: Ověření

Interakcí na obou uzlech vidíme, že účty na obou uzlech jednají na stejné smlouvě. Zde jsem zachytil interakci mezi dvěma uzly.

  1. Oba uzly vidí stejný výsledek (počet hlasů pro Rama je 4).
  2. Účet na uzlu 1 hlasuje pro Rámu jednou.
  3. Z Uzlu 2 vidíme, že počet hlasů pro Rama je nyní 5.
  4. Účet na uzlu 2 opět hlasuje pro Rámu.
  5. Z uzlu 1 nyní vidíme, že počet hlasů je nyní 6.

Zavírání

Toto nastavení napodobuje skutečnou operaci ethereum. Nové uzly se mohou snadno připojit k veřejnému řetězci a mají přístup k nasazené smlouvě. V reálném životě je aplikace s největší pravděpodobností přístupná přes webové rozhraní. Používání konzoly však pomáhá lépe porozumět interakci za sebou.

Ještě jednou děkuji za mnoho prací od ostatních, které inspirují a vedou mé celkové nastavení. Zde jsou,

  • JJ’s World: Nastavení soukromého blockchainu Ethereum (odkaz)
  • Mahesh Murthy: Ethereum pro webové vývojáře (odkaz)
  • MLG Blockchain Consulting: Použijte Go-Ethereum k nastavení Ethereum Blockchain na AWS (odkaz)

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me