[ ? ]
Sie haben also eine Reihe intelligenter Verträge und möchten alle Verträge finden, die über eine public
Methode namens withdrawEth
verfügen, deren lexikalisches Grep jedoch viele Fehlalarme liefert? Hier kann Solgrep helfen! ?
? npm install -g solgrep
Solgrep findet rekursiv Smart Contracts in einem Zielverzeichnis, analysiert die Quelleinheiten, um die Sprachsemantik zu verstehen, und stellt diese Informationen einer leistungsstarken Javascript-basierten Filterfunktion zur Verfügung. Auf diese Weise können Sie:
AST_EXACT
und AST_FUZZY
) Die wahrscheinlich gebräuchlichste Art, dieses Tool zu verwenden, besteht darin, es mit der Option --find=<js-filter-statement>
auszuführen, wobei js-filter-statement
ein Javascript-Einzeiler ist, der der Engine mitteilt, woran Sie interessiert sind. Sie geben entweder eine Anweisung an, die boolean
zurückgibt („Suchmodus“) oder Informationen zurückgibt, die Sie extrahieren möchten („Extrahierungsmodus“).
--find=<js-filter-statement>
zulassen, da dieses Argument als Javascript ausgewertet wird!
--find
, --rule
verwenden. Siehe Nutzung.
Die Standardregeln ausführen und einige Statistiken anzeigen?
⇒ solgrep < folder >
Führen Sie eine bestimmte oder mehrere integrierte Regeln aus ( solgrep -l
um die verfügbaren Regeln aufzulisten)?
⇒ solgrep < folder > -- rule = IsInitializable -- rule = Stats
Sie möchten alle Quelleinheiten mit einem Vertrag finden, der eine Funktion namens withdrawEth
hat?
⇒ solgrep < folder > -- find = "function.name=='withdrawEth'"
Das Gleiche tun, aber ohne Berücksichtigung der Groß- und Kleinschreibung?
⇒ solgrep < folder > -- find = "function.name.toLowerCase()=='withdraweth'"
Alle Funktionen finden, die selfdestruct
aufrufen?
⇒ solgrep < folder > -- find = "function.callsTo('selfdestruct')"
Alle Funktionsnamen aus allen Verträgen extrahieren?
⇒ solgrep < folder > -- find = "function.name"
Eine Liste aller external
Funktionen erhalten?
⇒ solgrep < folder > -- find = "function.visibility.includes('external')"
ERC777
Verträge finden?
⇒ solgrep < folder > -- find = "contract.name=='ERC777'"
Alle Vertragsnamen extrahieren?
⇒ solgrep < folder > -- find = "contract.name"
Alle Schnittstellennamen extrahieren?
⇒ solgrep < folder > -- find = "contract.name && contract.kind=='interface'"
Match gegen etwas im AST
?
⇒ solgrep < folder > -- find = "Object.keys(function.modifiers).includes('nonReentrant')"
Stimmt Lexial mit einem Funktionsquellcode überein?
⇒ solgrep < folder > -- find = "function.getSource().includes('hi')"
Doppelte Verträge finden? (AST exaktes und Fuzzy-Matching)
⇒ solgrep < folder > -- rule DupeFinder
Verwenden Sie die Option --output=<output.json>
um alle Ergebnisse in eine Datei zu schreiben.
--find
sourceUnit
Objekt entspricht der Quelldatei, die die Engine gerade verarbeitet.contract
entspricht dem Vertrag, den die Engine gerade verarbeitet.function
entspricht der Funktion, die die Engine gerade verarbeitet. Folgende Methoden stehen zur Verfügung:
<sourceUnit|contract|function>.getSource()
– bietet Zugriff auf den Quellcode der Einheit<sourceUnit|contract|function>.ast
– bietet direkten Zugriff auf den Solidity-Parser ASTfunction.callsTo('withdrawEth')
– alle Funktionen in allen Verträgen finden, die eine Methode namens withdrawEth
aufrufenSpezielle Vertragsfunktionen können Referenzen sein wie:
function.name == '__fallback__'
function.name == '__receiveEther__'
function.name == '__constructor__'
Stats
– sammelt Statistiken darüber, wie viele Dateien, Verträge, eindeutige Namen usw. verarbeitet wurdenGenericGrep
– ist die Engine hinter der Funktion --find
Teilen ist wichtig – reichen Sie Ihre Regeln ein!
⇒ solgrep -- help
Usage: solgrep < folder | ... > [ options ]
Options:
- r , -- rule Enable rules [ array ] [ default : [ ] ]
- l , -- list - rules List available rules [ boolean ] [ default : false ]
- f , -- find Find / Extract information using custom pattern
[ array ] [ default : [ ] ]
- o , -- output Write "results" as JSON to output file path . [ string ]
- h , -- help Show help [ boolean ]
- v , -- version Show version number [ boolean ]
--find
, --rule
) sicher, dass Sie dieses Format verwenden:
⇒ solgrep <folder|...> [options]
oder
⇒ solgrep [options] -- <folder|...>
Andernfalls könnten zusätzliche Optionen als zusätzliche --find
Optionen interpretiert werden!
const solgrep = require ( 'solgrep' ) ;
let sg = new SolGrep ( '::memory::' , rules , callbacks ) ;
sg . analyzeDir ( "/path/to/smart/contracts" ) . then ( ( ) => {
console . log ( " ──────────────────────────── Results" )
console . log ( sg . results )
console . log ( " ────────────────────────────" )
sgrep . close ( ) ;
} )
Hier ist ein Beispiel, das zeigt, wie alle Funktionsnamen aus allen sourceUnits
und contracts
extrahiert werden.
⇒ solgrep . . / d0 -- find = 'function.name'
? SolGrep v0 .0 .3 ready !
Enabled Modules :
✔️ GenericGrep _function . name
[ ████████████████████████████████████████ ] 100 % | ? ETA : 0 s | 5 / 5 | ? 389 | 0 | . . / d0
────────────────────────────
{
'../d0/D0788Af7a613b81F437a51b96594A6387c7329b1_PendleLiquidityMiningBaseV2Multi.sol' : [
{
rule : 'GenericGrep' ,
tag : 'match-function: PendleLiquidityMiningBaseV2Multi.__constructor__' ,
info : '__constructor__' ,
loc : [ Object ]
} ,
{
rule : 'GenericGrep' ,
tag : 'match-function: PendleLiquidityMiningBaseV2Multi.setUpEmergencyMode' ,
info : 'setUpEmergencyMode' ,
loc : [ Object ]
} ,
...
Wenn Sie keine Konfigurationsoptionen angeben, werden die standardmäßig integrierten Grep-Regeln verwendet und Zahlen mithilfe des stats
berechnet.
⇒ solgrep . . / d6
? SolGrep v0 .0 .1 starting . . .
? . . / d6
████████████████████████████████████████ 100 % | ETA : 0 s | 5 / 5
──────────────────────────── Results
{
'../d6/d60a598998ed27a7C54315F2675908B628E434B1_LiquidityPool.sol' : [
{
rule : 'IsInitializable' ,
tag : 'INITIALIZEABLE' ,
info : 'initialize - public initialize function; likely proxy'
} ,
{
rule : 'IsInitializable' ,
tag : 'INITIALIZEABLE' ,
info : 'initialize - public initialize function; likely proxy'
}
] ,
'../d6/d64E77C7C6A1dcC7e302F8fe31A22745e223c39c_MyStrategy.sol' : [
{
rule : 'IsInitializable' ,
tag : 'INITIALIZEABLE' ,
info : 'initialize - public initialize function; likely proxy'
}
] ,
undefined : [ { rule : 'Stats' , tag : 'STATS' , info : [ Object ] } ]
}
────────────────────────────
{
sourceUnits : 4 ,
contracts : {
total : 13 ,
names : {
ERC20 : 1 ,
StrategySushiEthMimLp : 1 ,
LiquidityPool : 1 ,
Getter : 1 ,
Governance : 1 ,
LibraryEvents : 1 ,
Perpetual : 1 ,
Storage : 1 ,
ArbiBoneman : 1 ,
ERC721 : 1 ,
MyStrategy : 1 ,
PausableUpgradeable : 1 ,
SettAccessControl : 1
}
} ,
interfaces : {
total : 39 ,
names : {
IERC20 : 1 ,
IJar : 1 ,
IStakingRewards : 1 ,
IStakingRewardsFactory : 1 ,
IMasterchef : 1 ,
UniswapRouterV2 : 1 ,
IUniswapV2Pair : 1 ,
IUniswapV2Factory : 1 ,
IRewarder : 1 ,
IMiniChefV2 : 1 ,
ILiquidityPool : 1 ,
IOracle : 1 ,
IAccessControl : 1 ,
IGovernor : 1 ,
IPoolCreatorFull : 1 ,
ISymbolService : 1 ,
IPoolCreator : 1 ,
ITracer : 1 ,
IVersionControl : 1 ,
IVariables : 1 ,
IKeeperWhitelist : 1 ,
IProxyAdmin : 1 ,
IDecimals : 1 ,
ILiquidityPoolGetter : 1 ,
ILiquidityPoolGovernance : 1 ,
IPerpetual : 1 ,
IERC721Enumerable : 1 ,
IERC721 : 1 ,
IERC721Receiver : 1 ,
IERC721Metadata : 1 ,
IERC165 : 1 ,
ICurveGauge : 1 ,
ICurveStableSwapREN : 1 ,
IUniswapRouterV2 : 1 ,
IStrategy : 1 ,
IController : 2 ,
IERC20Upgradeable : 2
}
} ,
libraries : {
total : 31 ,
names : {
SafeMath : 1 ,
SafeERC20 : 1 ,
BoringERC20 : 1 ,
EnumerableSetUpgradeable : 1 ,
SafeCastUpgradeable : 1 ,
AMMModule : 1 ,
LiquidityPoolModule : 1 ,
PerpetualModule : 1 ,
SignedSafeMathUpgradeable : 1 ,
Constant : 1 ,
Math : 1 ,
SafeMathExt : 1 ,
Utils : 1 ,
MarginAccountModule : 1 ,
EnumerableSet : 1 ,
OrderData : 1 ,
CollateralModule : 1 ,
TradeModule : 1 ,
OrderModule : 1 ,
Signature : 1 ,
ECDSAUpgradeable : 1 ,
Strings : 1 ,
MathUpgradeable : 1 ,
Address : 2 ,
SafeMathUpgradeable : 2 ,
AddressUpgradeable : 2 ,
SafeERC20Upgradeable : 2
}
} ,
abstract : {
total : 13 ,
names : {
StrategyBase : 1 ,
StrategySushiFarmBase : 1 ,
ReentrancyGuardUpgradeable : 1 ,
ERC721Enumerable : 1 ,
Ownable : 1 ,
ERC165 : 1 ,
BaseStrategy : 1 ,
Context : 2 ,
ContextUpgradeable : 2 ,
Initializable : 2
}
}
}
TOTAL FILES : 5
ERRORS: 1
────────────────────────────
cheers ?
@ tintinweb
ConsenSys Diligence @ https : //consensys.net/diligence/
https : //github.com/tintinweb/solgrep/