Don't get forked: Best Practices voor het omgaan met Constantinople en Ethereum Client-upgrades

Software-updates, of het nu gaat om het aansluiten van beveiligingsfouten, het oplossen van bugs of het toevoegen van nieuwe functies, zijn over het algemeen een goede zaak voor applicaties die we dagelijks gebruiken en we denken er niet lang over na om ze toe te passen. Maar updates van kernonderdelen van de infrastructuur kunnen ook eng zijn wanneer ze brekende veranderingen of onverwacht gedrag introduceren voor afhankelijke toepassingen, of in andere gevallen wanneer het niet op tijd bijwerken van de update kan leiden tot breuk. Dit probleem is van invloed op kleine en grote entiteiten en de blockchain is geen uitzondering.

Bij Alchemy bieden we onze klanten betrouwbare, schaalbare en snelle Ethereum-infrastructuur, zodat ze niet hoeven te worstelen met het onderhouden van knooppunten en zich kunnen concentreren op het bouwen van hun applicaties. In de loop van ons werk hebben we veel lessen geleerd (soms op de moeilijke manier!) Over hoe we netwerkvorken en clientupdates het beste kunnen behandelen. Met de aanstaande Constantinople harde vork dachten we dat dit een geweldige kans zou zijn om enkele van onze best practices te delen.

Dit is de eerste van vele blogberichten die we zullen schrijven over het op een betrouwbare, performante en schaalbare manier beheren van de Ethereum-infrastructuur.

constant in Opel

Constantinople is de volgende systeembrede upgrade van Ethereum en zal vijf EIP's implementeren, die feitelijk deel uitmaken van een grotere routekaart naar Ethereum 2.0. Er zijn tal van berichten die de specifieke veranderingen bespreken, maar het belangrijkste om op te merken is dat dit een niet-controversiële harde vork is en dat de community de nieuwe vork zal overnemen, waardoor tokens en andere status op niet-bijgewerkte knooppunten waardeloos worden.

Welke invloed heeft dit op u?

Voor dapp-ontwikkelaars is het belangrijkste dat je je knooppunt moet bijwerken naar een Constantinople-compatibele versie, anders is het niet compatibel met de rest van het netwerk voorbij blok 7.080.000. Ethereum-clients zullen hoogstwaarschijnlijk op de hoogte zijn van de harde vorken in de keten en een stabiele, compatibele versie van hun client vrijgeven ruim voor de geschatte vorkdatum, b.v. geth en pariteit. Als u uw eigen Ethereum-clientknooppunt beheert, moet u uw ethereum-client bijwerken naar een versie die compatibel is met de harde vork; pariteit zou 2.1.10-stabiel of hoger zijn, en geth zou 1.8.20 of hoger zijn.

Updates van de harde vork zouden er maar weinig tussen moeten zijn, maar clientupdates van Ethereum kunnen veel vaker voorkomen. Als u een service uitvoert die afhankelijk is van de keten, kan het nuttig zijn om uw klant up-to-date te houden om beveiligingsfouten op te lossen of nieuwe functionaliteit te benutten. U moet echter oppassen dat u geen onverwachte problemen in uw toepassing introduceert.

Best practices

Als u een service uitvoert die regelmatige interactie met de Ethereum-blockchain vereist, zullen een paar belangrijke best practices u beschermen tegen potentiële catastrofale bugs wanneer u uw knooppunten bijwerkt. We zullen enkele real-life scenario's van updates bekijken die slecht zijn gegaan en die de aanzet waren voor deze blogpost.

Meerdere knooppunten uitvoeren

We raden ten zeerste aan om meerdere knooppunten te gebruiken als algemene best practice voor het onderhouden van de interne Ethereum-infrastructuur vanwege de vele voordelen, waaronder verhoogde betrouwbaarheid en schaalbaarheid. Dit kan echter problemen met consistentie en idempotentie in uw systeem veroorzaken, die we in een volgende blogpost zullen bespreken.

Als het gaat om updates, biedt het uitvoeren van meerdere knooppunten een paar extra voordelen:

  1. Extra knooppunten dienen als back-ups voor het geval een update fout gaat en een knooppunt onherstelbaar maakt
  2. Hoge beschikbaarheid en geen downtime tijdens het bijwerken van knooppunten op een rollende manier
  3. Staat regressietesten toe die bijgewerkte knooppunten vergelijkt met originele knooppunten om verwacht gedrag te garanderen

In het scenario van een onherstelbaar knooppunt kan het tot twee weken duren voordat een nieuw volledig archiefknooppunt volledig is gesynchroniseerd. Zonder back-up is dit een onaanvaardbare hoeveelheid downtime.

Voorbeeld 1: Buggy DB-migratie

Een probleem dat we zagen bij het upgraden van pariteit van 1.X.X naar 2.X.X was corruptie in de database. De update bevatte een interne DB-migratie die bloknummers in het bloeifilter verkeerd converteerde, wat resulteerde in lege resultaten voor getLog-aanvragen voor historische blokken. Het verlies van gegevens was onomkeerbaar, zodat het knooppunt niet kon worden gered. We hadden het geluk om het via interne testen op een kanarisch knooppunt te vangen, terug te vallen op onze niet-bijgewerkte knooppunten om onze systemen in stand te houden en te wachten tot het probleem door het pariteitsteam was opgelost in 2.2.3-bèta.

Strenge regressietests

Strenge tests worden altijd ten zeerste aanbevolen voor wijzigingen in uw systeem. In die geest wilt u bij het bijwerken van uw knooppunten testen of uw applicatie en infrastructuur blijven werken zoals verwacht. Als u dit anders doet, kunnen uw gebruikers en uw systemen mogelijk worden blootgesteld aan storingen. Met meerdere lopende knooppunten is de beste manier om dit te garanderen het testen van uw vorige stabiele knooppunten met een bijgewerkt kanarisch knooppunt. Als er brekende wijzigingen worden gedetecteerd, zorg er dan voor dat uw systemen deze veilig kunnen verwerken voordat u de rest van uw cluster bijwerkt.

Wat betreft de regressietests, gaan we rechtstreeks naar de bron door productieverzoeken af ​​te spelen tegen onze knooppunten. Dit kan handmatig worden gedaan voor eenmalige controles, maar omdat we zoveel projecten ondersteunen, hebben we een uitgebreid geautomatiseerd testraamwerk gebouwd dat recente live aanvragen samplet, deze op verschillende clientversies herhaalt en de resultaten vergelijkt. Hiermee kunnen we controleren of onze code veilig kan werken met bijgewerkte knooppunten voordat deze naar de productie wordt verzonden. Dit raamwerk kan ook worden gebruikt voor regressietests op interne codewijzigingen.

Voorbeeld 2: Wijziging antwoorduitvoerformaat

Dit was een interessant probleem dat we tegenkwamen toen een pas bijgewerkte client een ander antwoord op een EVM-uitvoeringsfout retourneerde. Parity 1.11.1-beta heeft een reactie geretourneerd die er zo uitzag:

{"Jsonrpc": "2.0", "error": {"code": - 32015, "message": "VM-uitvoeringsfout.", "Data": "Reverted 0x"}, "id": 1}

In plaats van reacties van vorige versies die er zo uitzagen:

{ “Jsonrpc”:”2,0" ,” id”: 1,” resultaat”:” 0x”}

De verandering van het antwoordformaat is eigenlijk voordelig omdat het meer uitvoeringsdetails naar de beller oproept in plaats van stilzwijgend te falen, maar het kan problemen veroorzaken als de code niet is ingesteld om het af te handelen. In dit scenario was het vergelijken van responsoutputs de verandering en hebben we onze systemen simpelweg bijgewerkt en onze klanten gewaarschuwd zodat ze niet werden gealarmeerd door het nieuwe antwoord en hun services konden updaten om compatibel te zijn.

Bouwen op!

We hopen dat dit nuttig is geweest en dat deze best practices knooppuntupdates voor u in de toekomst probleemloos zullen maken. Ze hebben ons geholpen ervoor te zorgen dat updates altijd soepel verlopen, zowel voor onze eigen systemen als voor de klanten die op ons vertrouwen. We weten hoe moeilijk de complexiteit van het onderhouden en schalen van knooppunten kan zijn en we willen de kennis die we in de loop der jaren hebben gehad, verspreiden.

Als u aan een Ethereum-project werkt en niet wilt omgaan met het onderhoud van knooppunten, neem dan contact met ons op! Alchemy biedt de snelste, meest schaalbare en meest betrouwbare Ethereum-infrastructuur als service, zodat u zich kunt concentreren op het bouwen van uw product. Onder de motorkap heeft Alchemy revolutionaire nieuwe infrastructuur gebouwd die nu al top blockchain-projecten aandrijft zoals Augur, top blockchain-bedrijven zoals CryptoKitties en top hedgefondsen (die meer dan $ 3 miljard beheren). Meer informatie op alchemyapi.io.