Studieinput
In deze studie werden twee Solidity smart contracts gebruikt als verificatieinputs. Het eerste was een Simple DAO-achtige contract dat werd gebruikt als een casestudy voor re-entrancy. De tweede was een uitgedunde grootboek/statusovergangscontract bedoeld om contractniveaubeperkingen te testen tegen dubbele uitgaven. De oorspronkelijke Solidity-broncode diende als invoer voor de abstractie- en verificatieprocessen die in dit protocol zijn gedefinieerd. Het algemene transformatieproces dat voor dergelijke contracten wordt gebruikt, wordt geïllustreerd in Figuur 1, die de geleidelijke transformatie van de Solidity-broncode naar de FSM-, Event-B- en SMV-modellen tijdens verificatie toont.
Modelgrens modelleren
Formeel modelleren richt zich op de controlflowlogica van smart contracts, inclusief functionele in- en uitstapgedrag, interne uitvoering en toestandsovergangen op contractniveau. Functiezichtbaarheid (openbaar, extern, intern en privé) werd weergegeven samen met het bijbehorende call-stack gedrag dat relevant is voor re-entrancy analyse. De typen abstracte overgangen (call, send, transfer) werden behandeld als operaties voor het overdragen van ethers.
Contractniveau-invarianten werden gedefinieerd om de uniciteit van de transactie te waarborgen en dubbele uitgaven binnen de abstractiegrens te voorkomen. Om de validatieselectie- en blokintegriteitseisen te representeren, werd de protocol-logica abstractielaag gedefinieerd in termen van de protocolniveau-toestandsovergangen van zowel Proof of Work als Proof of Stake.
De abstractiegrens omvatte geen elementen van netwerklaag, waaronder het plannen van te bezorgen berichten en vertragingen veroorzaakt door een willekeurig aantal hops, fork-resolutie, netwerktegenstanders die Byzantijnse strategieën toepassen, Ethereum Virtual Machine-semantiek en gassemantiek die wordt gecontroleerd door netwerkknooppunten, excessiepropagatie, asynchrone uitvoeringen, ingewikkeld fallbackgedrag en netwerkniveau-finaliteit. De uitkomsten van dubbele uitgavenbepaling gelden dus alleen voor contractniveau-invarianten en vormen geen netwerkniveau-overeenkomst over finaliteit.
Gereedschappen en configuratie
Het Rodin-platform werd gebruikt om het Event-B (versie 3.7.0) model te modelleren, te verfijnen, te verfijnen, bewijsverplichtingen te genereren en het Event-B model te leveren, waardoor de PP-, ML-, SMT- en Atelier-B-bewijzen automatisch en interactief konden uitvoeren. nuXmv versie 2.0.0 werd uitgevoerd op de gegenereerde SMV-modellen in volledige CTL-exploratiemodus om CTL-modelcontrole uit te voeren.
Alle verificatie-uitvoeringen werden uitgevoerd in een gecontroleerde computationele omgeving met Ubuntu 22.04 LTS, OpenJDK 11 en Python 3.10.12. Web3 (7.6.0), NetworkX (3.4.2), Matplotlib (3.8.0), Graphviz (0.20.3), NumPy (1.26.4) en Pandas (2.2.2) werden gebruikt om simulatie- en visualisatie-elementen te implementeren. Dit ontwerp garandeerde dat formele verificatie- en simulatieresultaten konden worden gereproduceerd wanneer ze onder dezelfde uitvoeringsomstandigheden werden uitgevoerd.
Transformatieworkflow
Dit verificatieproces kende vier fasen. Soliditeitscontracten werden eerst vertaald naar een Finite State Machine (FSM-SC) representatie. Het FSM-SC-model werd vervolgens gecodeerd in Event-B, met duidelijk gespecificeerde invarianten en verfijningsgraden. De FSM-SC-abstractie werd vertaald naar een SMV-model in nuXmv. De verificatieresultaten werden gerapporteerd als statistieken over bewijsverplichting en CTL-modelcontrole, en tegenvoorbeelden werden als gevallen verstrekt.
FSM-constructie
Elk contract werd geabstraheerd als een eindige toestandsmachine, gedefinieerd als:

Waar:
S = verzameling toestanden
S₀ = begintoestand
T = overgangsrelatie
V = zichtbaarheidsmapping
G = wachtpredicaten
A = acties/statusupdates.
Algoritme 1: FSM-constructie uit Solidity
Invoer: Solidity-broncode
Output: FSM-SC
1) Ontleed de abstracte syntaxisboom van het Solidity-contract.
2) Skep de begintoestand S₀ uit de constructordefinitie.
3) Voor elke soliditeitsfunctie f creëer je een aparte controletoestand S_f en registreer zichtbaarheid V(f) ∈ {publiek, extern, intern, privé}.
4) Voor elke uitspraak binnen functie f leidt u een overgangsvorm t af door guardpredicaten te extraheren uit vereiste of assertieve voorwaarden en acties uit toestandsvariabelenupdates.
5) Voeg de overgangs-t toe aan T.
6) Expliciete overgangstypen creëren voor etheroverdrachtsoperaties (call, send, transfer), interne en externe calls, delegatecall, selfdestruct, tx.origin gebruik, conditionele vertakkingen en lusconstructies.
7) Geef FSM-SC = (S, S₀, T, V, G, A) terug.
En elke Solidity-functie is gekoppeld aan een andere FSM-regeltoestand. Voor het begrijpen van kwetsbaarheden werden kwetsbaarheidsrelevante uitvoeringsstromen, bijvoorbeeld dergelijke stromen met externe aanroepen gevolgd door balansupdates, expliciet geabstraheerd tot geordende overgangen. Figuur 2 beschrijft een voorbeeld van een FSM-SC-diagram voor het SimpleDAO-achtige contract, waarin wordt getoond hoe invoertoestanden, externe aanroepovergangen en toestandsupdate-sequenties tijdens deze constructiefase werden geabstraheerd.
FSM coderen in Event-B
De FSM-overgang werd weergegeven als Event-B-constructen. Alle overgangen komen overeen met Event-B-gebeurtenissen, inclusief specifieke bewakers en acties.
Algoritme 2: FSM naar Event-B codering
Invoer: FSM-SC
Output: Event-B machine en context
1) Definieer STATE_SET en FUNCTIE in de contractcontext.
2) Variabelen declareren die de FSM-controletoestand en de contractniveautoestand vertegenwoordigen.
3) Vertegenwoordig elke FSM-besturingstoestand s ∈ S met current_state ∈ STATE_SET.
4) Voor elke overgang (s → s′, g, a) maak een Event-B-gebeurtenis E_t met:
5) WAARBIJ current_state = s ∧ g
6) DAN current_state := s′ ∥ toepas(a)
7) Encodeer zichtbaarheidsbeperkingen met guards afgeleid van V(f).
8) Definieer invarianten inv1–inv9 om veiligheids- en consistentie-eigenschappen vast te leggen.
9) Definieer INITIALISATIE door S₀ en standaardwaarden toe te wijzen.
De set toestanden, de huidige toestand, functiezichtbaarheid, call stack, transactietijdstempel, Ether-overdrachtstatus, delegate call-vlag, zelfvernietigingsvlag en verificatieconditie zijn enkele van de variabelen die in het Event-B-model worden vastgelegd. De invarianten (inv1-inv9) en de acties van de initialisaties (act1-act6) komen overeen met die van de formele specificatie. Figuur 3 geeft ook een grafische weergave van hoe de belangrijkste gebeurtenissen die relevant zijn voor kwetsbaarheden, met name re-entrancy-gerelateerde overgangen, worden onderhouden in de Event-B-codering. Deze figuur legt uit hoe de structurele patronen van het FSM-SC-model zoals weergegeven in Figuur 2 worden omgezet in verifieerbare Event-B-gebeurtenissen.
Verfijningsstrategie
Er werden twee niveaus van verfijning doorgevoerd. Hoge niveau-contractcontrole-flow- en kerninvarianten werden op abstract niveau weergegeven. Het verfijnde niveau voegde contractspecifieke beperkingen toe, waaronder callstack-beperkingen, zichtbeperkingen en voorwaarden voor het voorkomen van herentrancy.
Algoritme 3: Verfijning en kwijtschelding van bewijsverplichtingen
Invoer: Abstracte machine en verfijnde machine
Output: Afgehandeld, bewijs van verplichtingen en statistieken
1) Bewijsverplichtingen genereren voor de abstracte machine in Rodin.
2) Voer ingeschakelde automatische proefmachines uit en registreer ontladingsresultaten.
3) Genereer verfijningsbestendige verplichtingen voor de verfijnde machine.
4) Automatische bewijsmiddelen toepassen op verfijningsverplichtingen.
5) Overige verplichtingen interactief nakomen wanneer dat nodig is.
6) Exportbewijsstatistieken en statusrapporten.
Bewijsrapportage omvatte het aantal invarianten, verfijningsniveaus, gegenereerde bewijsverplichtingen, automatische ontladingssnelheid, interactieve ontladingssnelheid en uiteindelijke ontladingssnelheid.
CTL-eigenschapsspecificatie en modelcontrole
De FSM-SC-abstractie werd vertaald naar een SMV-model voor vertakkingstijd-tijdverificatie in nuXmv.
Algoritme 4: FSM naar SMV en CTL Checking
Output: PASS/FAIL verificatieresultaat en tegenvoorbeeldtraces (indien aanwezig)
1. Registreer FSM-controletoestanden als een opgesomde SMV-variabeletoestand.
2. Zet FSM-overgangen om in bewaakte next(state)-opdrachten.
3. Voer vlag voor kwetsbaarheidsrelevante omstandigheden, zoals externe oproepen en saldo-updates.
4. CTL-eigenschappen coderen in nuXmv en modelcontrole uitvoeren.
5. Als een eigenschap faalt, genereer dan counterexample-traces die FSM-overgangsreeksen vertegenwoordigen.
CTL-controle omvatte vereisten voor herentrancy-orders, het afronden van state-updates na overdrachtsoperaties, het beperken van onbeperkte recursieve invoer in kritieke secties en het vermijden van deadlocks.
Beveiligingseigenschappen geverifieerd
Het Simple DAO-achtige contract dat herentrantie voorkomt, werd bevestigd door veilige ordening tussen externe oproepen en statusupdates via invarianten en CTL-beperkingen te waarborgen. Waar toegestaan, controleerden deze bewakers toegangscontrolebeperkingen, zodat ongeautoriseerde overgangen werden beperkt door invarianten. Het reduced ledger-model verifieerde de invarianten van transactie-uniciteit en grootboekconsistentie op het niveau van preventie binnen het contract.
Gerapporteerde uitkomsten
De sectie Resultaten biedt rapporten over FSM-structurele metrics, Event-B-modelmetrics en statistieken voor het bewijs van verplichting en CTL-verificatie. De resultaten van formeel bewijs, en die van CTL-modelcontrole, worden afzonderlijk gegeven om het bewijs van correctheidsgaranties door invarianten te onderscheiden, en het bewijs van tijdverificatie met temporele verificatie.