De bästa verktygen för smart kontraktutveckling

Inledning: Smart kontraktutveckling

Detta är ett gästinlägg av KC TAM om att använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC.

Jag läste nyligen en bra artikel om Blockgeeks, där Ameer försöker sätta allt om kodning av decentraliserade applikationer i ett mästerverk. Vilket mycket ambitiöst och fantastiskt arbete det är! Varav det finns flera komponenter, och jag skulle vilja utveckla lite om några av dessa verktyg och hur de kan användas för kontraktsutveckling.

Denna serie av artiklar är inte för Smart Contract 101 eller Ethereum-plattformen. Du kan definitivt hitta mycket bra material i Blockgeeks. Men jag är säker på att genom att gå igenom detta kommer du att få tag på några idéer om dessa verktyg och hoppas att det hjälper när du arbetar på Smart Contract with Solidity.

Jag kommer först att göra en kort beskrivning av det smarta kontrakt jag valt. Och senare distribuera detta kontrakt i fyra miljöer. Här är en snabb sammanfattning av de fyra miljöerna vi visar här.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Ett förenklat flöde av kontraktssamling och distribution

smart utplacering av kontrakt

Exemplet smart kontrakt: Intäktsdelning

Denna ansökan är hämtad från Smart Contract i kapitel 4: Ethereum Accounts från boken “Blockchain-applikationer en praktisk metod”Av A. Bahga och V. Madisetti. Den har modifierats för att matcha vissa krav på den senaste versionen av Solidity.

Denna applikation kallas Revenue Sharing. Kort sagt ges en lista med adresser när kontraktet distribueras. Vem som helst kan skicka en viss summa pengar (här är det eter eller eters benämning) och denna summa pengar fördelas lika till adresserna i listan. Det är ett ganska enkelt fasthetsavtal.

Här är det smarta kontraktets fasthet.

pragmasoliditet ^ 0.4.8;

kontrakt RevenueSharing {

adressera den offentliga skaparen;

mapping (uint => adress) offentliga aktieägare;

uint public numShareholders;

event Disburse (uint _amount, uint _numShareholders);

funktion RevenueSharing (adress [] adresser) {

skapare = msg.sender;

numShareholders = adresser.längd;

för (uint i = 0; i< adresser. längd; i ++) {

aktieägare [i] = adresser [i];

}

}

function shareRevenue () betalbar avkastning (bool-framgång) {

uint amount = msg.value / numShareholders;

för (uint i = 0; i

Några snabba poäng om detta kontrakt

Kontraktet heter RevenueSharing.

Funktion RevenueSharing () har samma namn som själva kontraktet. Det är konstruktören och kallas bara en gång när kontraktet distribueras. Vi ser i detta kontrakt att en rad adresser tillhandahålls, och denna matris med adresser lagras i en annan grupp som kallas aktieägare.

Function shareRevenue () är den enda huvudfunktionen i denna kontakt. När du utför denna funktion med ett antal etrar (i msg.värde) delas beloppet upp i antalet aktieägare (numShareholders), och varje adress i aktieägaruppsättningen får delen. Vi kommer att utföra denna funktion i vår demo.

Function kill () används för att ta bort kontraktet. Vi kommer inte att använda den här funktionen i demo.

Observera att alla variabler är definierade med public. Detta hjälper oss att följa mer detaljer i kontraktet. I verkliga livet bör vi vara försiktiga när vi gör variabler eller funktioner offentliga på grund av säkerhetshänsyn.

Remix

Översikt

Remix är en uppsättning verktyg för att interagera med Ethereum blockchain för att felsöka transaktioner (direkt citerade från här). Det finns en IDE-version (Remix IDE) och en online-version, som vi kommer att använda här.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Det finns många verktyg i Remix, men följande verktyg är av vårt intresse,

  • Soliditetskompilator. vilket genererar mycket användbar information som vi kommer att använda i en annan miljö
  • Runtime-miljö. Remix ger tre:
  • Injicerad Web3: till leverantör som Mist eller MetaMask
  • Web3-leverantör: till lokal värd via ipc
  • JavaScript VM: en simulerad miljö

Bland runtime-miljöerna använder vi JavaScript-VM. I JavaScript-VM kommer Remix med fem Ethereum-konton, var och en deponeras med 100 etrar. Detta är tillräckligt bra för att testa vårt smarta kontrakt. Det är inte heller nödvändigt att bryta eftersom det sker automatiskt.

Du kan enkelt komma åt Remix från vilken webbläsare som helst (url: http://remix.ethereuem.org). Detta är en skärmdump av Remix.

Skärmen är indelad i flera områden.

  • Område för smart kontrakt: vi klistrar in soliditetskoden för kontrakt här.
  • Område för sammanställning och körning: i sammanställningstaggen, här visar alla kompileringsfel eller varningar. i Kör-taggen distribuerar vi kontraktet och utför kontraktsfunktioner.
  • Område för transaktionsloggar: alla transaktionsdetaljer kan observeras här.

Kompilera kontraktet

Vi klistrar in Smart Contract-koden i Remix.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Vi märker att koden kompileras automatiskt och det finns några varningar. Eftersom de inte är kritiska fel är vi säkra på att gå vidare.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Om vi ​​klickar på Detaljer ser vi mycket information för detta kontrakt. Bland dem är de,

  • Bytkod
  • ABI
  • Web3 distribuera

De behövs när detta kontrakt distribueras i en annan miljö. Vi kommer att hänvisa till detta senare.

Eftersom vi inte ser några fel efter sammanställningen kan vi köra detta kontrakt till en Remix JavaScript-miljö.

Implementera kontraktet

1. En glimt inuti Run Tag

Det är hur det ser ut i Run-taggen.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Välj miljö för JavaScript från miljö.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Efter att ha valt JavaScript VM kommer vi att se att vissa konton fylls i kontofält.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Och som sagt, var och en är fördeponerad 100 etrar, bara för testning. Eftersom vi kommer att använda dessa konton senare kan vi kopiera dem först.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Gasgränsen är att ange hur mycket gas vi kan spendera på alla transaktioner. Eftersom vi är i testmiljö, oroar vi oss inte för mycket. Jag har provat en del distribution av stora kontrakt och standardgränsen för gas är inte tillräcklig. Hur som helst kan den ökas till vilket värde som helst när det behövs.

Värdedelen är där vi skickar mängden etrar under utplacering av kontrakt och utförande av en funktion. I vårt fall lägger vi inte något värde på kontraktdistribution, utan lägger några etrar när vi utför funktionen. Se nedan för mer information.

2. Implementera kontraktet

Nu ser vi att kontraktet RevenueSharing redan är valt (vi har bara ett kontrakt i vår kod). Vi använder knappen Skapa för att distribuera detta kontrakt på JavaScript-VM.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Något krävs, som antyds i inmatningsområdet: “adress [] adresser”, när kontraktet distribueras. Kommer du ihåg att detta kontrakt kräver en lista med adresser som delningsmål? För demoändamål kommer vi att använda den tredje, fjärde och femte adressen som anges ovan som adresslista. Klistra in det här bredvid knappen Skapa:

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Se nu till att vi har valt

  • Miljö: JavaScript VM
  • Konto: det första kontot när kontrakten distribueras (börjar med 0xca3 …)
  • Klistra in adressmatrisen ovan bredvid knappen Skapa

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Genom att trycka på Skapa ser vi att följande händer.

3. Efter det att kontraktet har implementerats

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Kontraktet distribueras nu i JavaScript VM (minne) och kontraktsadressen visas (0x692…). Vi använder inte den här adressen i vår demo. Den adressen kan hänvisas i andra fall vid behov.

Vi ser också att variablerna markerade som ”offentliga” nu visas, de är,

  • aktieägare
  • numShareholders
  • skapare

Och två funktioner som vi har definierat i detta kontrakt,

  • shareRevenue ()
  • döda()

Innan allt observerar vi att kontosaldot minskas med en liten mängd etrar. Skillnaden (417,626 weis, 1 wei = 10-18 eter) är kostnaden för att distribuera detta kontrakt. I verkliga livet är det de verkliga etrarna som dras från ditt konto när du distribuerar ett kontrakt.

Interagerar med distribuerat kontrakt

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

1. Kontrollera variabler

Vi kan först kontrollera variablerna genom att trycka på variabelknapparna. Här undersöker vi numShareholders och skaparen. För aktieägare, eftersom det är en matris, måste vi ange ett index (0, 1 eller 2), som motsvarar de adresser vi sätter när kontraktet distribueras (skapas).

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Alla variabler är som vi förväntar oss.

2. Kör funktionen ShareRevenue ()

Nu kör vi shareRevenue (). Vi använder det första kontot för att sätta in 30 etrar när den här funktionen utförs (detta är endast för den här funktionen. I många fall krävs det inte.). Enligt avtalslogiken ska de 30 etrarna fördelas på kontolistan, det vill säga det tredje, fjärde och femte kontot i vår kontolista. Från och med nu är balansen för var och en av dem fortfarande 100 etrar.

Vi använder samma plats för att utföra funktionen. Här ser vi till,

  • i fältet Konto, välj det första kontot (börjar med 0xca3 …)
  • placera 30 etrar i värdet

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Tryck sedan på shareRevenue.

Efter att funktionen har utförts undersöker vi saldot på varje konto och ser om det utförs enligt vår design.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Först ser vi att 30 etrar dras av från första kontot, och alla de tre kontona på listan har nu 110 etrar. Så de 30 etrarna som dras av från det första kontot fördelas nu på de tre kontona. Denna del fungerar perfekt enligt kontraktet.

Om vi ​​noggrant undersöker saldot på 1: a kontot dras någon extra mängd etrar av. Skillnaden är 47 776 wei, vilket är kostnaden för denna transaktion. Varje transaktion, utförande av funktion eller distribution av kontrakt kostar dig en viss mängd etrar.

Transaktionsloggen

Vi har inte rört transaktionsloggen under vårt test, men allt hålls i logg, även förfrågan från en variabel. Låt oss ta en titt på detaljer från två utvalda loggar.

1. Kontraktdistribution

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Vi kan se vem som har distribuerat detta kontrakt, kontraktets adress och transaktionskostnaden som krävs för att distribuera det.

2. Utförande av funktionen shareRevenue ()

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Återigen ser vi det som en transaktionskostnad. I shareRevenue () finns det ett avkastningsbooleskt värde och vi ser att “avkodas ut” finns en “sann” avkastning. Vi har också ett evenemang för framgångsrik distribution och vi ser det i “loggar”.

Sammanfattning

Så här hjälper Remix till att testa koden vi utvecklar. Den levereras med mycket praktiska funktioner och intuitivt användargränssnitt. I nästa artikel kommer vi att använda en annan miljö, testrpc, för att arbeta på samma kontrakt och se hur det fungerar.

De bästa verktygen för smart kontraktutveckling del 2: Web3 på TestRPC

Översikt

TestRPC är en simulering av en Ethereum blockchain, som kommer med 10 fördefinierade Ethereum-konton och stöder mnemonics (det vill säga man kan generera samma uppsättning konton med samma uppsättning mnemonics). Det kommer inte med ett användargränssnitt som Remix, och vi behöver nodkonsol plus web3-biblioteket för att interagera med denna blockchain.

Förberedelse

Demon görs via kommandorad eller terminal. Använd ett terminalverktyg som stöder skärmdelning. Jag använder iTerm2 på min Mac.

Installera nod och npm: se här för installation på din plattform.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Anmärkning: Jag upptäckte nyligen att när jag installerar web3 med npm installeras 1.0.0 betaversionen där kommandona som använts tidigare (baserat på 0.20.4) inte fungerar. Därför anger vi istället versionen av web3.

Alla kommandon nedan är i version 0.20.0.

Öppna en terminal och dela skärmen i två. Den vänstra sidan är nodkonsolen, där vi kommer att arbeta större delen av vår tid. Den högra sidan är där vi kör TestRPC.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Starta TestRPC

På höger sida, starta TestRPC

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Här har vi lite iakttagelser

  • TestRPC är en nodapplikation som simulerar en Ethereum-blockkedja i minnet.
  • 10 konton är fördefinierade.
  • Dessa konton genereras genom mnemonic och är olika varje gång TestRPC startas. För att behålla samma uppsättning konton kan vi använda mnemonic som visas ovan som parametrar när vi kör TestRPC.
  • RPC öppnas också på localhost: 8545. Web3 har tillgång till blockchain via detta.

Vi kommer inte att beröra den här delen längre, förutsatt att allt fungerar bra i denna Ethereum blockchain. Nu fokuserar vi mer på nodkonsolen (vänster sida). Under testet fortsätter vi att se kommandon och loggar som utfärdats till blockchain som visas på TestRPC-sidan.

Web3-objekt

Vi måste instruera nodkonsolen vi använder web3 och pekar blockchain web3 är gränssnitt.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

vilket är exakt de konton som skapats i TestRPC.

En praktisk funktion som visar balans

Jag har hittat en praktisk funktion (länk) som kan visa saldo för alla konton. Här är funktionen.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Kopiera och klistra in den här funktionen till nodkonsolen. Nu kan vi ringa funktionen checkAllBalances () när som helst, och det kommer att visa saldot på alla konton i eter. Observera att den här funktionen är borta efter att vi avslutat nodkonsolen, men vi kan lägga till den när som helst.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Implementera kontraktet

1. Sammanställning av kontraktet

Nu är allt klart. Vi kan distribuera vårt intäktsdelningsavtal.

Vi måste öppna Remix igen eftersom vi använder kompilatorn på Remix. När vi har klistrat in kontraktskoden i Remix kompileras den automatiskt. Här använder vi resultatet av utplacering av kontrakt.

Klicka på Detalj på kompilera taggen, och det finns mycket information där.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Bland informationen är tre av våra intressen: bytecode, ABI och Web3Deploy

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Bytkoden är den binära versionen av vårt kontrakt efter sammanställning och instruktionen som ska köras i Ethereum Virtual Machine (EVM), och ABI (applikations binärt gränssnitt) är det gränssnitt som vi interagerar med kontraktet bytecode.

Remix är snäll nog att förbereda koden i Web3Deploy, där bytecode och ABI redan ingår i kommandona. Därför behöver vi bara använda Web3Deploy-delen.

2. Implementera kontraktet

För det första måste vi, enligt kontraktet, definiera en lista över målkonton. För demoändamål används de tre kontona som börjar från det andra kontot, det vill säga från eth.accounts [1] till eth.accounts [3].

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Sedan följer vi vad Web3Deploy föreslår.

Skapa en klass för inkomstdelningsavtal baserat på ABI. Kopiera bara den raden från Web3Deploy.

nodkonsol

> var intäktsdelningContract = web3.eth.contract ([{"konstant":Sann,"ingångar": [],"namn":"skapare","utgångar": [{"namn":"","typ":"adress"}],"betalas":falsk,"stateMutability":"se","typ":"fungera"}, {"konstant":falsk,"ingångar": [],"namn":"döda","utgångar": [],"betalas":falsk,"stateMutability":"obetalt","typ":"fungera"}, {"konstant":Sann,"ingångar": [],"namn":"numShareholders","utgångar": [{"namn":"","typ":"uint256"}],"betalas":falsk,"stateMutability":"se","typ":"fungera"}, {"konstant":Sann,"ingångar": [{"namn":"","typ":"uint256"}],"namn":"aktieägare","utgångar": [{"namn":"","typ":"adress"}],"betalas":falsk,"stateMutability":"se","typ":"fungera"}, {"konstant":falsk,"ingångar": [],"namn":"dela intäkter","utgångar": [{"namn":"Framgång","typ":"bool"}],"betalas":Sann,"stateMutability":"betalas","typ":"fungera"}, {"ingångar": [{"namn":"adresser","typ":"adress[]"}],"betalas":falsk,"stateMutability":"obetalt","typ":"konstruktör"}, {"anonym":falsk,"ingångar": [{"indexeras":falsk,"namn":"_belopp","typ":"uint256"}, {"indexeras":falsk,"namn":"_numShareholders","typ":"uint256"}],"namn":"Betala ut","typ":"händelse"}]);

Distribuera nu kontraktet med bytecode, plus nödvändig information. Återigen kan vi kopiera den raden från Web3Deploy. Det utplacerade kontraktet är ett objekt som kallas intäktsdelning.

nodkonsol

> var intäktsdelning = intäktsdelningContract.new (

adresser,

{

från: web3.eth.accounts [0],

data: ‘0x6060604052341561000f57600080fd5b60405161049d38038061049d833981016040528080518201919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508151600281905550600090505b81518110156100f957818181518110151561009157fe5b906020019060200201516001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808060010191505061007a565b50506103938061010a6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302d05d3f1461007257806341c0e1b5146100c757806368eca613146100dc578063ab377daa14610105578063e579a0bd14610168575b600080fd5b341561007d57600080fd5b61008561018a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100d257600080fd5b6100da6101af565b005b34156100e75760008 0fd5b6100ef610240565b6040518082815260200191505060405180910390f35b341561011057600080fd5b6101266004808035906020019091905050610246565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610170610279565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561023e576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b60025481565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006002543481151561028b57fe5b049150600090505b60025481101561031d576001600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673fffffffffffff fffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561031057600080fd5b8080600101915050610293565b7f9c26340b8d01b4e039192edfd25f4a56ed070d45afe866b8685658b1ed3cd74d34600254604051808381526020018281526020019250505060405180910390a1600192505050905600a165627a7a72305820f0e717ba935e00c43896cc9266a85af91a519061c044503be0a52b93f721d1610029’,

gas: ‘4700000’

}, funktion (e, kontrakt) {

console.log (e, kontrakt);

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

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

}

})

Vi kommer att se (nästan omedelbart) att kontraktet bryts.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Nu kan vi använda objektintäktsdelningen för att interagera med detta distribuerade kontrakt.

Interagerar med distribuerat kontrakt

Det distribuerade kontraktet nås via objektets inkomstdelning.

1. Undersök de offentliga variablerna

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Vi kan undersöka de variabler som är markerade som “offentliga”.

2. Kör funktionen ShareRevenue ()

Innan vi utför funktionen ShareRevenue (), låt oss ta en titt på balansen.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Observera att något belopp dras av på konton [0], som har distribuerat kontraktet. Mängden eter som betalats för utplaceringen är 417626 weis. Du kan kontrollera att det är den exakta transaktionskostnaden när vi gjorde det i Remix.

Nu kör vi funktionen.

nodkonsol

> intäktsdelning.shareRevenue ({från: web3.eth.accounts [0], värde: web3.toWei (30), gas: 4700000});

Här kallar vi funktionen shareRevenue () och anger att den körs av konton [0], med 30 etrar (toWei är en funktion i web3 används för att konvertera 30 etrar till wei, eftersom wei är den enhet som accepteras i kommandot ). Vi sätter också den gas vi tillåter att spendera (det är mycket mer än vad som krävs men vi får återbetalning efter körning).

När transaktionen har genomförts kan vi kontrollera saldot igen.

Använda olika verktyg för smart kontraktutveckling: Remix, Web3 på TestRPC

Vi har uppnått vad vi önskar: 30 etrar dras av från konton [0] och fördelas mellan konton [1] till konton [3] (nu har var och en av dem 110 etrar). Dessutom betalas ett visst belopp för att genomföra denna transaktion. Det är 47776 weis, igen, matchar det vi observerade i Remix.

Sammanfattning

Vi har framgångsrikt gjort samma sak på TestRPC. Det totala flödet är nästan detsamma som i Remix, förutom att vi måste arbeta på nodkonsolen och web3 för att interagera med blockchain i TestRPC. Nästa gång kommer vi att göra nästan samma sak på en privat Ethereum blockchain.

Författare: KC TAM 

KC började sin blockchain-resa för bara några månader sedan. Hans intresse är att gräva mer detaljerat “hur saker fungerar” och dela med sig av andra vad han har lärt sig .’LinkedIn: https://www.linkedin.com/in/ktam1/

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