[ ? ]
그러면 일련의 스마트 계약이 있고, withdrawEth
라는 public
메소드가 있는 모든 계약을 찾고 싶지만 어휘 grep은 많은 오탐을 생성합니까? solgrep이 도움을 줄 수 있는 곳은 바로 여기입니다! ?
? npm install -g solgrep
Solgrep은 대상 디렉터리에서 스마트 계약을 반복적으로 찾고, 소스 단위를 구문 분석하여 언어 의미를 이해하고, 이 정보를 강력한 자바스크립트 기반 필터 기능에 사용할 수 있도록 합니다. 이렇게 하면 다음을 수행할 수 있습니다.
AST_EXACT
및 AST_FUZZY
일치) 아마도 이 도구를 사용하는 가장 일반적인 방법은 --find=<js-filter-statement>
옵션을 사용하여 실행하는 것입니다. 여기서 js-filter-statement
관심 있는 항목을 엔진에 알려주는 자바스크립트 한 줄입니다. boolean
("찾기 모드")을 반환하는 문을 제공하거나 추출하려는 정보를 반환하는 명령문("추출 모드")을 제공합니다.
--find=<js-filter-statement>
에 대한 신뢰할 수 있는 입력만 허용해야 합니다!
--find
, --rule
사용할 때 인수의 올바른 순서를 확인하세요. 사용법을 참조하세요.
기본 규칙을 실행하고 일부 통계를 표시하시겠습니까?
⇒ solgrep < folder >
특정 또는 여러 내장 규칙을 실행하시겠습니까(사용 가능한 규칙을 나열하려면 solgrep -l
)?
⇒ solgrep < folder > -- rule = IsInitializable -- rule = Stats
withdrawEth
라는 함수가 있는 계약이 포함된 모든 소스 유닛을 찾고 싶습니까?
⇒ solgrep < folder > -- find = "function.name=='withdrawEth'"
동일한 작업을 수행하지만 대소문자를 구분하지 않습니까?
⇒ solgrep < folder > -- find = "function.name.toLowerCase()=='withdraweth'"
selfdestruct
호출하는 모든 함수를 찾으십니까?
⇒ solgrep < folder > -- find = "function.callsTo('selfdestruct')"
모든 계약에서 모든 함수 이름을 추출하시겠습니까?
⇒ solgrep < folder > -- find = "function.name"
모든 external
기능 목록을 얻으시겠습니까?
⇒ solgrep < folder > -- find = "function.visibility.includes('external')"
ERC777
계약을 찾으시나요?
⇒ solgrep < folder > -- find = "contract.name=='ERC777'"
모든 계약 이름을 추출하시겠습니까?
⇒ solgrep < folder > -- find = "contract.name"
모든 인터페이스 이름을 추출하시겠습니까?
⇒ solgrep < folder > -- find = "contract.name && contract.kind=='interface'"
AST
의 항목과 일치합니까?
⇒ solgrep < folder > -- find = "Object.keys(function.modifiers).includes('nonReentrant')"
함수 소스 코드와 어휘 일치?
⇒ solgrep < folder > -- find = "function.getSource().includes('hi')"
중복 계약을 찾으셨나요? (AST 정확 및 퍼지 일치)
⇒ solgrep < folder > -- rule DupeFinder
모든 결과를 파일에 쓰려면 --output=<output.json>
옵션을 사용하세요.
--find
에 대한 내장 키워드sourceUnit
객체는 엔진이 현재 처리 중인 소스 파일과 일치합니다.contract
개체는 엔진이 현재 처리 중인 계약과 일치합니다.function
개체는 엔진이 현재 처리 중인 함수와 일치합니다. 다음 방법을 사용할 수 있습니다.
<sourceUnit|contract|function>.getSource()
- 유닛 소스 코드에 대한 액세스를 제공합니다.<sourceUnit|contract|function>.ast
- solidity-parser AST에 대한 직접 액세스를 제공합니다.function.callsTo('withdrawEth')
- withdrawEth
라는 메서드를 호출하는 모든 계약에서 모든 함수를 찾습니다.특수 계약 기능은 다음과 같이 참조될 수 있습니다.
function.name == '__fallback__'
function.name == '__receiveEther__'
function.name == '__constructor__'
Stats
- 처리된 파일, 계약, 고유 이름 등의 수에 대한 통계를 수집합니다.GenericGrep
- --find
기능을 지원하는 엔진입니다.공유는 배려입니다 - 규칙을 제출하세요!
⇒ 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
)을 사용할 때 다음 형식을 사용해야 합니다.
⇒ solgrep <folder|...> [options]
또는
⇒ solgrep [options] -- <folder|...>
그렇지 않으면 추가 옵션이 추가 --find
옵션으로 해석될 수 있습니다!
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 ( ) ;
} )
다음은 모든 sourceUnits
및 contracts
에서 모든 함수 이름을 추출하는 방법을 보여주는 예입니다.
⇒ 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 ]
} ,
...
구성 옵션을 제공하지 않으면 기본 내장 grep 규칙과 stats
모듈을 사용하는 크런치 숫자가 사용됩니다.
⇒ 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/