Overzicht: beste tools voor slimme contractontwikkeling (Web3 en Private Ethereum Blockchain)

Dit is een gastpost van KC TAM over het gebruik van verschillende tools voor slimme contractontwikkeling: Remix, Web3 op TestRPC.

Deze opstelling lijkt erg op de vorige. Het verschil is om het contract te implementeren op een privé Ethereum-blockchain die op localhost draait in plaats van TestRPC te gebruiken.

Het node-consolegedeelte is bijna identiek, maar we hebben enkele taken op de privé-blockchain nodig voordat de zaken naar wens verlopen. Ze zijn de blockchain-initialisatie en het uitvoeren van de blockchain, het maken van accounts en het minen. Al deze taken zijn gedaan door TestRPC in de vorige sessie.

Deel 1: de beste tools voor slimme contractontwikkeling 

Slimme contractontwikkeling (deel 2)

Voorbereiding: Ethereuem Client (geth)

Er zijn verschillende implementaties van Ethereum-client. De meest populaire is de Go-client (genaamd geth). Installatie van geth is te vinden hier. Kies er een die bij uw besturingssysteem past.

Genesis.json-bestand

Dit is het bestand dat wordt gebruikt om de private ethereum blockchain te initialiseren. Ik laat gewoon degene zien die ik gebruik.

"muntenbasis" ​ "0x000000000000000000000000000000000000000001",

"moeilijkheid" ​ "0x20000",

"extraData" ​ "",

"gasLimit" ​ "0x4c4b40",

"nonce" ​ "0x0000000000000042",

"mixhash" ​ "0x000000000000000000000000000000000000000000000000000000000000000000",

"parentHash" ​ "0x000000000000000000000000000000000000000000000000000000000000000000",

"tijdstempel" ​ "0x00",

"alloc"​,

"config"​

"chainId": 15,

"homesteadBlock": 0,

"eip155 Blok": 0,

"eip158 Blok": 0

Je zou dit al moeten hebben. Raadpleeg de voorbereidingssessie in de vorige configuratie. Knooppunt en Web3-module

Stel een privé Ethereum-blockchain in

1. Initialiseer de Blockchain

Hier noem ik alleen de stappen die goed genoeg zijn voor deze demo, met een korte uitleg. Voor meer details hierover kunt u dit vinden wiki.

Open de werkmap. Eenvoudigheidshalve gebruiken we de directory van de vorige sessie, waarin de knooppuntmodules al zijn geïnstalleerd. Zorg ervoor dat het bestand genesis.json hier wordt bewaard. Maak hier een map met de naam “chaindata”. In deze map worden alle blockchain-informatie en gebruikersaccounts bewaard.

De beste tools voor slimme contractontwikkeling (deel 2)

Vanaf nu splitsen we ons scherm in drieën, voor verschillende doeleinden.

De beste tools voor slimme contractontwikkeling (deel 2)

Initialiseer nu de blockchain met geth init. Merk op dat we de datadir moeten specificeren voor de directory waarin we de blockchain opslaan.

blockchain

$ geth –datadir = ~ // chaindata / init genesis.json

De beste tools voor slimme contractontwikkeling (deel 2)

Na initialisatie worden in de chaindata-directory twee directories aangemaakt:

  • geth bevat alle blockchain-gerelateerde gegevens
  • keystore bevat de gebruikersaccountinformatie (momenteel leeg).

2. Start de Blockchain

We kunnen de blockchain nu starten.

blockchain

$ geth –datadir = ~ // chaindata / s.json

De beste tools voor slimme contractontwikkeling (deel 2)

De blockchain is actief. We hebben geen interactie met de blockchain in deze terminal. Tijdens onze installatie zullen we zien dat er steeds wat nuttige informatie in deze terminal verschijnt.

3. Toegang tot Blockchain met Geth Console

We hebben toegang tot de blockchain die we zijn begonnen via de geth-console. Let op de laatste regel in de blockchain-terminal: daar is het IPC-eindpunt geopend (het pad voor het bestand geth.ipc). We gebruiken dit IPC-eindpunt om toegang te krijgen tot de console.

De Geth-console bevindt zich in de terminal rechtsonder.

geth console

$ geth voeg ipc toe: /chaindata/geth.ipc

De beste tools voor slimme contractontwikkeling (deel 2)

Hier is de geth-console en we kunnen hier de geth-opdrachten geven.

4. Voeg enkele accounts toe voor een demo

Wanneer deze privé Ethereum-blockchain wordt geïnitialiseerd, zijn er geen accounts. Voor deze demo gaan we er vier maken.

De eerste is onze basis, verantwoordelijk voor contractimplementatie en functie-uitvoering. Bovendien is dit account verantwoordelijk voor mijnbouw, omdat we bij private ethereum blockchain iemand nodig hebben om het blok te minen.

Er worden nog drie accounts aangemaakt om het delen van inkomsten te demonstreren.

Houd er rekening mee dat elk account parafraseringsbeveiliging vereist.

geth console

$ eth.accounts

$ personal.newAccount () // herhaal vier keer

$ eth.accounts

En als je de directory in chaindata / keystore controleert, zie je al deze vier accounts.

De beste tools voor slimme contractontwikkeling (deel 2)

Hier zijn de rekeningen. We zullen ze later doorverwijzen.

"0x822539842f2d65f7f6e45ef913ab6eb226cd1056"

"0x57f6b66543c6a5650809f5ba2d3e0e808201fe8b"

"0xf1314446d331a023a95e6e5ff5302ccf7a73adec"

"0x595c788ba7b408afeee4cd4e359568dbcd5a5617"

5. Controleer het rekeningsaldo

We kunnen nu het rekeningsaldo van deze vier adressen controleren. Geen verrassing, er staan ​​geen ethers in deze accounts, aangezien ze nieuw zijn gemaakt.

geth console

$ eth.getBalance (eth.accounts [0]) // herhaal met 1, 2 en 3

De beste tools voor slimme contractontwikkeling (deel 2)

6. Mijnbouw

We zijn klaar om te zien hoe mijnbouw wordt gedaan. Private ethereum blockchain vereist mijnbouw om het blok te bouwen. Omdat we in genesis.json een zeer lage moeilijkheidsgraad hebben ingesteld, kost het niet al te veel tijd voordat een blok wordt gedolven. Nadat een block aan de blockchain is toegevoegd, worden 5 ethers beloond op accounts [0] (ook wel etherbase- of coinbase-account genoemd).

Het eerste blok kan even duren. Door het saldo van de rekeningen [0] te onderzoeken en wat er in het blockchain-venster (terminal rechtsboven) verschijnt, weet u dat de mijnbouw goed werkt.

geth console

$ miner.start ()

$ eth.getBalance (eth.accounts [0])

$ web3.fromWei (eth.getBalance (eth.accounts [0])) // converteer weis naar ethers

De beste tools voor slimme contractontwikkeling (deel 2)

Merk op dat alle ethers naar eth.accounts [0] gaan, en dat we web3.fromWei kunnen gebruiken om de balans van wei naar ethers om te zetten. En we kunnen op elk moment stoppen en beginnen met mijnen. We stoppen het eerst en kunnen het later starten wanneer we een contract implementeren en een functie uitvoeren. (In het echte leven zullen sommige mijnwerkers het werk doen, en je hebt zelf geen mijnbouw nodig, tenzij je wat ethers wilt verdienen met mijnbouw.)

We hebben enkele ethers voor eth.accounts [0], en het kan worden gebruikt voor contractimplementatie en het uitvoeren van de functie. En mijn privé blockchain is klaar voor gebruik. Nu schakelen we over naar de contractimplementatie.

Implementeer het contract

De procedure is bijna identiek aan wat we in de vorige sessie hebben gedaan. Er is echter wat extra werk aan de Geth-console, en we zullen dit benadrukken.

1. Maak de Node-console gereed

Op de node-console, de terminal aan de linkerkant, openen we eerst de node-console en definiëren we het web3-object voor toegang tot de privéketen.

knooppunt console

$ node

> Web3 = vereisen (‘web3’)

> web3 = nieuwe Web3 (nieuwe Web3.providers.HttpProvider ("http: // localhost: 8545"​

De beste tools voor slimme contractontwikkeling (deel 2)

2. Schakel RPC in op Geth Console

Wanneer we de private blockchain starten, is de RPC (toegang via http: // localhost: 8545) standaard uitgeschakeld. We moeten het inschakelen vanaf de geth-console.

geth console

$ admin.startRPC ()

De beste tools voor slimme contractontwikkeling (deel 2)

En we kunnen dit bericht op de blockchain-terminal zien:

De beste tools voor slimme contractontwikkeling (deel 2)

Dat betekent dat web3 vanaf node via RPC toegang heeft tot de blockchain. Dit is niet vereist voor TestRPC aangezien het al is geopend. We kunnen RPC ook inschakelen wanneer we de blockchain starten (met optie –rpc).

3. Test Blockchain-toegang op Node Console

Controleer de adressen die we eerder hebben aangemaakt.

knooppunt console

> web3.eth.accounts

De beste tools voor slimme contractontwikkeling (deel 2)

We zien de exacte adressen die we hebben gemaakt op de geth-console.

4. Controleer de handige balansfunctie

We hergebruiken dezelfde checkAllBalances (), die is overgenomen uit hier.

functie checkAllBalances () {

var i = 0;

web3.eth.accounts.forEach (functie (e) {

console.log (" web3.eth.accounts ["+ik+"​ " + e + " evenwicht: " + web3.fromWei (web3.eth.getBalance (e), "ether"​ + " ether"​

i ++;

Kopieer en plak deze functie gewoon in de knooppuntconsole. Nu kunnen we de functie checkAllBalances () op elk moment aanroepen, en het zal het saldo van alle rekeningen in ether tonen.

De beste tools voor slimme contractontwikkeling (deel 2)

De balans is correct. De ethers in accounts [0] zijn te wijten aan mijnbouw. We zullen hier niet naar verwijzen, want tijdens het delven blijft dit aantal toenemen. We zullen het saldo van de andere drie rekeningen controleren, dat momenteel nul is.

5. Implementeer het contract

Nogmaals, we volgen wat we eerder hebben gedaan. En ik kopieer gewoon de informatie van de vorige sessie. Raadpleeg de vorige sessie hoe ik ze verkrijg.

Maak een variabel adres dat de drie doelaccounts voor delen bevat.

knooppunt console

> var adressen = [web3.eth.accounts [1], web3.eth.accounts [2], web3.eth.accounts [3]];

> adressen

Maak een klasse voor het delen van inkomsten op basis van de ABI.

knooppunt console

> var revenuesharingContract = web3.eth.contract ([{"constante": waar,"ingangen"​,"naam"​"Schepper","uitgangen"​"naam"​"","type"​"adres"​,"te betalen": niet waar,"stateMutability"​"visie","type"​"functie"​"constante": niet waar,"ingangen"​,"naam"​"doden","uitgangen"​,"te betalen": niet waar,"stateMutability"​"onbetaalbaar","type"​"functie"​"constante": waar,"ingangen"​,"naam"​"aantalAandeelhouders","uitgangen"​"naam"​"","type"​"uint256"​,"te betalen": niet waar,"stateMutability"​"visie","type"​"functie"​"constante": waar,"ingangen"​"naam"​"","type"​"uint256"​,"naam"​"aandeelhouders","uitgangen"​"naam"​"","type"​"adres"​,"te betalen": niet waar,"stateMutability"​"visie","type"​"functie"​"constante": niet waar,"ingangen"​,"naam"​"aandeel inkomsten","uitgangen"​"naam"​"succes","type"​"bool"​,"te betalen": waar,"stateMutability"​"te betalen","type"​"functie"​"ingangen"​"naam"​"adressen","type"​"adres[]"​,"te betalen": niet waar,"stateMutability"​"onbetaalbaar","type"​"constructeur"​"anoniem": niet waar,"ingangen"​"geïndexeerd": niet waar,"naam"​"_bedrag","type"​"uint256"​"geïndexeerd": niet waar,"naam"​"_numAandeelhouders","type"​"uint256"​,"naam"​"Betalen","type"​"evenement"​

Op dit moment hebben we nog niets op de private blockchain geïmplementeerd. Daarom is mijnbouw niet nodig. Gas is vereist voor contractimplementatie, en daarom moeten we de eth.accounts [0] ontgrendelen aangezien we accounts [0] gebruiken om dit contract te implementeren. Het wordt gedaan op de Geth-console.

geth console

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

De beste tools voor slimme contractontwikkeling (deel 2)

Als u vanwege een time-out wordt gevraagd om het account te ontgrendelen, moet u dit opnieuw doen.

Nu kunnen we het contract implementeren met bytecode en de nodige informatie.

knooppunt console

> var revenuesharing = revenuesharingContract.new (

adressen,

van: web3.eth.accounts [0],

gegevens: ‘0x6060604052341561000f57600080fd5b60405161049d38038061049d833981016040528080518201919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508151600281905550600090505b81518110156100f957818181518110151561009157fe5b906020019060200201516001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808060010191505061007a565b50506103938061010a6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302d05d3f1461007257806341c0e1b5146100c757806368eca613146100dc578063ab377daa14610105578063e579a0bd14610168575b600080fd5b341561007d57600080fd5b61008561018a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d257600080fd5b6100da6101af565b005b34156100e75760008 0fd5b6100ef610240565b6040518082815260200191505060405180910390f35b341561011057600080fd5b6101266004808035906020019091905050610246565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610170610279565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561023e576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b60025481565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006002543481151561028b57fe5b049150600090505b60025481101561031d576001600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673fffffffffffff fffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561031057600080fd5b8080600101915050610293565b7f9c26340b8d01b4e039192edfd25f4a56ed070d45afe866b8685658b1ed3cd74d34600254604051808381526020018281526020019250505060405180910390a1600192505050905600a165627a7a72305820f0e717ba935e00c43896cc9266a85af91a519061c044503be0a52b93f721d1610029’,

gas: ‘4700000’

}, functie (e, contract) {

console.log (e, contract);

if (type contract.address! == ‘undefined’) {

console.log (‘Contract mined! address:’ + contract.address + ‘transactionHash:’ + contract.transactionHash);

0])

Anders dan bij de vorige sessie, zien we dat de transactie al in de blockchain-terminal wordt weergegeven, maar nog niet is gedolven. Er is nog geen bericht van de node-console waargenomen.

De beste tools voor slimme contractontwikkeling (deel 2)

Nu moeten we mijnbouw inschakelen op de Geth-console.

De beste tools voor slimme contractontwikkeling (deel 2)

Terwijl we mining inschakelen, zien we al snel dat sommige blokken worden gedolven, en op de node-console verschijnt ook het bericht dat aangeeft dat het contract met succes is geïmplementeerd.

De beste tools voor slimme contractontwikkeling (deel 2)

Interactie met geïmplementeerd contract

Net als bij de vorige sessie, is het ingezette contract toegankelijk via het delen van inkomsten.

1. Onderzoek de openbare variabelen

Voor het onderzoeken van openbare variabelen is geen gas nodig, en daarom hoeven we geen accounts en mining te ontgrendelen om dit uit te voeren.

De beste tools voor slimme contractontwikkeling (deel 2)

2. Voer de functie shareRevenue () uit

Omdat de uitvoering van de functie transactiekosten en mining vereist, kunnen we beide eerst starten vanuit de geth-console.

Het commando dat we de functie uitvoeren is hetzelfde. Net als in de vorige sessie controleren we het saldo voor en na de opdracht.

knooppunt console

> checkAllBalance ()

> revenuesharing.shareRevenue ({from: web3.eth.accounts [0], value: web3.toWei (30), gas: 4700000});

> checkAllBalance ()

De beste tools voor slimme contractontwikkeling (deel 2)

We hebben het gewenste resultaat bereikt. De 30 ethers van accounts [0] worden nu verdeeld over accounts [1] naar accounts [3]. We kunnen de accounts [0] niet verifiëren omdat er nieuwe ethers binnenkomen vanwege mijnbouw.

Overzicht

We hebben web3 via node-console opnieuw gebruikt om het contract te implementeren en ermee te communiceren. Deze keer doen we het op een private Ethernet-blockchain. Het algemene proces is bijna hetzelfde aan de kant van de node-console, maar we moeten zorgen voor het maken van accounts, het ontgrendelen van accounts, mijnbouw, enz. Om het hele proces te voltooien. Dit is niet vereist in TestRPC aangezien TestRPC al deze taken uitvoert.

De volgende keer zullen we werken aan MIST, een gebruikersinterface en opnieuw interactie op een privé-ethereum-blockchain.

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