- Sergio Ruíz
Foneria per a principiants: una immersió profunda de proves de contracte intel·ligent
El desenvolupament en Web3 s’ha convertit recentment en una forta tendència, captant l’atenció de molts desenvolupadors de Web2. No obstant això, aquests nous desenvolupadors, especialment aquells que treballen en empreses que busquen integrar contractes intel·ligents en els seus productes, poden introduir involuntàriament errors de lògica i seguretat.
Una de les principals raons d’aquests errors és la falta de proves exhaustives o la dependència d’eines que no aprofiten completament les capacitats de Solidity, com Hardhat. Tot i que Hardhat és una eina útil, no sempre maximitza el potencial de Solidity per a un desenvolupament de contractes intel·ligents eficient i segur.
A Vottun, hem triat Foundry per a les nostres proves de contractes intel·ligents. Si ets nou en el desenvolupament de Web3, potser no estiguis familiaritzat amb aquesta eina, però Foundry és una eina crucial a considerar. Aquest article està dirigit als desenvolupadors més nous de Solidity, per la qual cosa no aprofundiré massa en les tecnicalitats de Foundry. En resum, Foundry és una eina que et permet escriure proves utilitzant el propi Solidity, un gran avantatge perquè pots utilitzar el mateix llenguatge tant per al desenvolupament com per a les proves. També ofereix potents característiques per a simular diversos entorns, escenaris i condicions, fent que els teus contractes intel·ligents siguin més robustos.
Primer de tot, vegem com començar a crear proves en Solidity utilitzant Foundry. Necessitaràs una funció en el teu fitxer de contracte que sembli així:
El punt clau aquí és que el nom de la funció ha de ser setUp. El compilador de Foundry reconeix aquesta funció especial i executarà tot el que hi hagi dins abans de cada cas de prova individual.
Definir proves és aleshores força senzill:
Hauràs de definir els noms de les teves funcions de prova d’aquesta manera: test_QualsevolQueSiguiElTeuNom(). Foundry recomana algunes bones pràctiques per a la nomenclatura, les quals pots trobar aquí. La convenció de noms és important perquè, a mesura que escriguis més proves, necessitaràs entendre ràpidament què fa cada prova i si una fallada indica un error o un comportament esperat.
Una de les funcionalitats més utilitzades és vm.startPrank(owner); i vm.stopPrank();.
Primer, crearàs una adreça utilitzant vm.addr(“ADMIN”); per utilitzar-la amb vm.startPrank(createdAddress). Col·loca totes les crides de funcions i la lògica que vulguis provar dins del teu contracte intel·ligent entre startPrank i stopPrank. D’aquesta manera, totes les crides es faran com si provenissin de l’adreça creada. Sense startPrank i stopPrank, les crides es fan utilitzant un compte predeterminat que Foundry proporciona automàticament.
Si només vols provar una funció específica, pots utilitzar vm.prank(createdAddress); just abans de la crida de funció que estàs provant.
Una altra funció que probablement utilitzaràs sovint és vm.warp(targetTime). Aquesta funció et permet manipular el timestamp del blockchain, avançant el temps per provar característiques als teus contractes intel·ligents que depenen del pas del temps, com ara períodes de bloqueig per estacament.
Pots obtenir el timestamp actual en segons utilitzant uint256 currentTime = block.timestamp;
Cal destacar que utilitzem block.timestamp directament, ja que retorna el timestamp en segons. La funció vm.unixTime(), tot i que disponible, retorna el temps en mil·lisegons.
Així que si vols fer comparacions entre dates, hauràs de tenir-ho en compte: el guió baix en un nombre com ‘1_000’ és simplement una manera de definir nombres a Solidity per a claredat visual. El guió baix en si mateix no canvia el valor del nombre.
Finalment, un cop hagis escrit les teves proves, simplement executa forge test -vv. El paràmetre -vv habilita la sortida detallada, cosa que és útil si tens sentències console.log a les teves proves i vols veure els seus resultats. Per a més informació sobre els comandaments de Foundry, consulta el Llibre de Foundry.
Aquestes són algunes de les funcionalitats bàsiques més importants de Foundry. Pot semblar senzill, però a mesura que comencis a escriure proves, descobriràs moltes més característiques que poden ajudar-te a provar exhaustivament els teus contractes i explorar diversos escenaris.