[؟ ]
إذن لديك مجموعة من العقود الذكية وتريد العثور على جميع العقود التي لها طريقة public
تسمى withdrawEth
ولكن 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')"
تطابق Lexial رمز مصدر الوظائف؟
⇒ 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
- يوفر الوصول المباشر إلى محلل الصلابة ASTfunction.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/