და ამ დროს, ყველაფერი მუშაობდა – მაგრამ სისტემის ძირითადი ნაწილები ძირითადად შეუზღუდავი იყო: bundler. ნაწილი 1 Bundlers არის ბეჭდვა შორის ანგარიშის abstraction და Ethereum შესრულების ფართობი. ისინი მიიღებენ UserOperations სხვადასხვა mempool, გადაიხადოს გაზის ღირებულება წინასწარ, და მიიღოს გადაიხადოს მეშვეობით პროტოკოლს. განიხილება, თუ როგორ ისინი მუშაობენ - validation წესები, რეპუტაცია სისტემა, და ეკონომიკური სინამენტები - არის მნიშვნელოვანია, რათა გადაიხადოს პრობლემები და შექმნათ საიმედო პროგრამები. მომხმარებლის სიცოცხლის ციკლი UserOperation არის ერთეული სამუშაო bundlers მუშაობა. იგი შეიცავს ყველაფერი, რაც საჭიროა გაკეთება ოპერაცია behalf of a smart ანგარიშის - ავტომატური, გაზის შეზღუდვები, შესრულების calldata, და უპირატესობრივი paymaster ლოგიკა. In EntryPoint v0.8, UserOperations დამუშავება on-chain in შეფუთული, gas-optimized ფორმატში. როდესაც მუშაობა SDKs, როგორიცაა permissionless.js, ისინი ნაჩვენები როგორც გამოხატული, არ შეფუთული სტრუქტურა: type UserOperation = { sender: Address nonce: bigint factory?: Address // Account factory (for first-time deployment) factoryData?: Hex // Factory calldata callData: Hex callGasLimit: bigint verificationGasLimit: bigint preVerificationGas: bigint maxFeePerGas: bigint maxPriorityFeePerGas: bigint paymaster?: Address paymasterVerificationGasLimit?: bigint paymasterPostOpGasLimit?: bigint paymasterData?: Hex signature: Hex } On-chain, EntryPoint იყენებს შეფუთული ფორმატში გაზის ეფექტურობის (კავშირი ფართობი, როგორიცაა SDK ამ შეფუთვა ავტომატურად გადამუშავებს - თქვენ არ უნდა შეშფოთოთ. accountGasLimits = verificationGasLimit | callGasLimit სიცოცხლის ციკლი UserOperation ხდის ამგვარად: შექმნა: მომხმარებლის შექმნა UserOp მათი Smart ანგარიშის SDK (მაგ. permissionless.js) შეტყობინება: მომხმარებლის შეტყობინება UserOp hash, რათა უზრუნველყოს, რომ ისინი გაძლევთ გარანტიას. გამოგზავნილია: UserOp გამოგზავნილია bundler via eth_sendUserOperation კონფიგურაცია: Bundler შეიმუშავებს UserOp, რათა შეამოწმოთ, თუ ეს წარმატდება Mempool: თუ valid, UserOp შევიდა bundler's mempool Bundling: Bundler შეფუთვა მრავალჯერადი UserOps ერთი handleOps call Execution: EntryPoint კონტაქტი შეამოწმებს თითოეული UserOp on-chain, შემდეგ აწარმოებს მათ გადახდის: EntryPoint იღებს გაზის ღირებულება თითოეული ანგარიში (ან მათი paymaster). ძირითადი მიმოხილვა არის, რომ რედაქტირება მოხდება ორიჯერ: ერთხელ off-chain მიერ bundler (სირჩევთ, თუ არ მიიღოს UserOp), და ერთხელ on-chain მიერ EntryPoint (თუ ნამდვილად გაკეთება). თუ ეს ორი რედაქტირება წარმოადგენს განსხვავებული შედეგები, bundler დაკარგავს ფული - გადაიხადოს გაზის სავაჭრო, რომელიც საბოლოოდ გაქვთ. ეს იზმამეტრი არის მიზეზი, რომ bundlers სავარაუდოდ მკაცრი. თითოეული validation წესები არსებობს, რათა შეუზღუდავი კლასის თავდასხმა, სადაც UserOp გააკეთა Simulation მაგრამ არ გააკეთა on-chain. გაფართოება: რატომ Bundlers Paranoid გაზის ღირებულების გადახდის შეფასება. თუ მომხმარებლის ოპერაცია შეუწყობს ქსელში, მას შემდეგ, რაც იგი შეიცვალა ბამბლეში, დაკარგვა მათია. არ არსებობს გადახდის, არ არის გადახდის. ეს ერთ-ერთი ფაქტი განკუთვნილია მთელი bundler threat მოდელი. Ethereum სტატისტიკა არ არის სტატისტიკა. ბლოკების პარამეტრები ცვლილებენ, ბალანები ცვლილებენ, და კონკურენტული სავაჭროები შეიძლება დატოვონ შორის. მკაცრად შექმნილია UserOperation შეუძლია შეუწყოს ქსელის სმულაცია და ჯერ კიდევ არ შეუწყობს ქსელის გაფართოების დროს - ბამბლეის გაფართოების გაფართოების გაფართოება. ERC-4337 რეაგირებს, რათა მძიმე შეზღუდოს, რა validation კოდი გაძლევთ. EntryPoint უძრავი სქესობრივი განსხვავება: : ანგარიშის validateUserOp ფუნქცია აწარმოებს, რათა შეამოწმოთ შეტყობინება და გაქირავება ოპერაცია. ამ ფაზაში აქვს მკაცრი შეზღუდვები, თუ რა opcodes და შენახვის კოდი შეუძლია. Validation Phase : The account's execute function runs the actual operation. No restrictions here—full EVM capabilities. Execution Phase Banned კოდები ზოგიერთი ოპერაციული კოდი შეუზღუდავი არის რეპუტაციის დროს, რადგან მათი ღირებულება შეიძლება განსხვავდეს Simulation და Execution შორის: TIMESTAMP, NUMBER, COINBASE, PREVRANDAO: ბლოკზე დამოკიდებული ღირებულებები. ანგარიშს შეუძლია შეამოწმოს, თუ (block.timestamp > deadline) გადაიხადოს, გადაიხადოს სმულაცია, და შემდეგ შეუწყოს, როდესაც ბუთი შემდეგი ბლოკში იღებს. BLOCKHASH: იღებს განსხვავებული ღირებულებები სხვადასხვა ბლოკებისთვის. იგივე attack vector. GASPRICE, BASEFEE: ცვლილება ქსელის პირობების მიხედვით. BALANCE, SELFBALANCE: მხოლოდ შეუერთებული ინტენსიებს (იხილეთ Staking ქვემოთ) მოითხოვს ERC-7562 [OP-080]. GASLIMIT, ORIGIN: შეიძლება განსხვავდეს Simulation გარემოში და რეალური შესრულება. , : EIP-4844 blob-related opcodes that vary per block. BLOBHASH BLOBBASEFEE SELFDESTRUCT, INVALID: დისტანციური opcodes არ არის საშუალებული validation დროს. GAS: მხოლოდ შესაძლებელია, როდესაც დაუყოვნებლივ შემდეგ არის *CALL ინსტრუქციები - CALL, DELEGATECALL, STATICCALL, ან CALLCODE (გაზის გადაზიდვისთვის სხვა კონტაქტებს). CREATE: ზოგადად запрещено, რადგან ის შექმნა კონტაქტები შეუზღუდავი მისამართები. თუმცა, CREATE გაძლევთ გაძლევთ კონტაქტი, როდესაც გამოიყენეთ ფართო ქარხანა. CREATE2 გაძლევთ გაძლევთ გაძლევთ გაძლევთ კონტაქტი. აქ არის, რაც ხდება, როდესაც თქვენი ანგარიშზე გამოიყენება შეუზღუდავი opcode: // This validateUserOp will be rejected by bundlers function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) external returns (uint256 validationData) { // BANNED: block.timestamp can change require(block.timestamp < deadline, "Expired"); // ... rest of validation } შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება შეტყობინება ERC-7562 compliant tracer) და უარყოფს ნებისმიერი UserOp whose validation touches banned opcodes. თანამედროვე bundlers შეიძლება გამოიყენოთ either a JavaScript tracer or the native Go implementation introduced with EntryPoint v0.8. RPC პასუხი აჩვენებს, რომ which opcode caused the rejection. debug_traceCall Storage ხელმისაწვდომობის წესები Beyond opcodes, bundlers restrict which storage slots validation code can read and write. The rules (from ERC-7562) are roughly: მხოლოდ ხელმისაწვდომია: Unstaked entities მათი საკუთარი შენახვა (კონტაქტო შენახვა) შენახვის სლოტი, რომელიც "საკავშირირებული" ანგარიშის მისამართი A, განკუთვნილია როგორც: სლოტი ღირებულება არის A, ან შეფასებული როგორც keccak256(Aannoo x) + n სადაც x არის bytes32 და n არის ზომის 0 to 128 პრაქტიკაში, ეს იმას ნიშნავს, რომ თქვენი ანგარიში შეუძლია წაიკითხოთ / წაიკითხოთ რუკები, სადაც ანგარიშის მისამართი არის ключ. მაგალითად, ERC-20 token შენახავს ბალანები რუკები, როგორიცაა რეალური სარეცხი სარეცხი არის თუ თქვენი ანგარიშის მისამართი არის ключ, ეს სლოტი "კავშირდება" თქვენთან. offset (0-128) საშუალებას იძლევა ხელმისაწვდომობა struct წევრებს, რომელიც შენახავს მას შემდეგ, რაც mapping შეტანა – სასარგებლო, როდესაც mapping ღირებულება არის struct. mapping(address => uint256) balances keccak256(address || slot_of_mapping) +n (კონენტები, paymasters, ან ქარხები, რომლებიც შეესაბამებული ნაწილი EntryPoint) მიიღოს უფრო თავისუფლება: Staked entities შეუძლია ხელმისაწვდომია ნებისმიერი სლოტი საკუთარი შენახვის (STO-031) შეუძლია ხელმისაწვდომობა დაკავშირებული შენახვის ნებისმიერი ინტენსიის UserOp (STO-032) შეუძლია მხოლოდ წაიკითხვის ხელმისაწვდომობა შენახვის non-entity კონტაქტები (STO-033) See the full storage access rules in . კონტაქტი 7562 რატომ არსებობს ამ წესები? განიხილეთ ორი მომხმარებლის ოპერაციებს, რომლებიც validation დროს იხილებენ იგივე შენახვის სლოტიდან. თუ პირველი ოპერაცია ატვირთებს ამ სლოტი, მეორე ოპერაციების validation ნომრები არ შეიძლება უფრო გაგრძელდეს. შენახვის ხელმისაწვდომობის შეზღუდვის გამოყენებით, შეფუთვა შეიძლება უსაფრთხოდ მოიცავს მრავალჯერადი მომხმარებლის ოპერაციები ერთი შეფუთვა გარეშე რისკების cross-operation interference ან non-deterministic შეცდომები. The Reputation System ფუნქციონირებული კონტაქტი შეიძლება მუდმივად გამოქვეყნოს UserOps, რომელიც გააკეთა Simulation, მაგრამ არ გააკეთა on-chain, რადგან მინიმალური სტატისტიკის ცვლილებები. paymaster შეიძლება გააკეთა UserOps დროს Simulation მაგრამ არ გააკეთა გადახდის on-chain. Bundlers შეამოწმოთ ეს ინტენსიები ერთად a თითოეული ინტენსიისთვის (კონტაქტო მისამართი, paymaster მისამართი, ქარხანა მისამართი) bundler track: reputation system : How many UserOps involving this entity has the bundler seen opsSeen opsIncluded: თუ რამდენჯერა ის, რაც ნამდვილად შეიცვალა on-chain The reputation status is determined by slack-based thresholds (defined in ) : კონტაქტი 7562 maxSeen = opsSeen / MIN_INCLUSION_RATE_DENOMINATOR (10 for bundlers) status = BANNED if maxSeen > opsIncluded + BAN_SLACK (50) status = THROTTLED if maxSeen > opsIncluded + THROTTLING_SLACK (10) status = OK otherwise "Slack" ღირებულებები არის Tolerance buffers, რომელიც თავიდან ავიცილოთ false პოტენციები ნორმალური ოპერაციული variance. ეს იმას ნიშნავს, რომ ერთეულში შეიძლება იყოს 10 უფრო მეტი მოთხოვნილებები-inclusions, ვიდრე რეალური-inclusions, სანამ იქნა throttled. ამ დიზაინით აღიარებს, რომ ზოგიერთი UserOps- ის მტკიცებულება (სტვირთო პირობები, რკინიგზის პირობები) არ აჩვენებს ცუდი ქცევა. THROTTLING_SLACK = 10 BAN_SLACK = 50 When an entity is , the bundler limits how many UserOps from that entity can be in the mempool. When , all UserOps involving that entity are rejected immediately. throttled banned Staking ერთეულები შეუძლია გაუმჯობესოს მათი პოზიცია ETH- ს EntryPoint კონტაქტში: entryPoint.addStake{ value: 1 ether }(unstakeDelaySec); ფსონი არ არის ჭკვიანი – ეს უბრალოდ დახურულია, მაგრამ ეს აჩვენებს დახურვა და მხარდაჭერა: განკუთვნილია ხელმისაწვდომობის წესები შენახვისთვის (დაწვრილებით) გაუმჯობესებული შეზღუდვა უფრო ლამაზი რეპუტაცია სფეროში პლატფორმა და ქარხანა, განსაკუთრებით, სტატისტიკა თითქმის აუცილებელია წარმოების გამოყენება. გარეშე იგი, ერთ-ერთი ცუდი UserOp შეიძლება სწრაფად მიიღოს ინტენსიის throttled. კანონური mempool მოითხოვს (კენდის სპეციფიკური, როგორც წესი, 1 ETH ან იგივე) და 86400 წამში (1 დღის განმავლობაში). სიზუსტით თანხა განსხვავდება ქსელის მიხედვით და განკუთვნილია mempool metadata - შეამოწმეთ bundler დოკუმენტაცია თქვენი მიზანი ქსელის. MIN_STAKE_VALUE MIN_UNSTAKE_DELAY Gas ეკონომიკა შეტყობინება: ისინი გადაიხადოს გაზის ღირებულება შეტყობინება და მიიღოს გადაიხადოს UserOps მათ მოიცავს. ეკონომიკა მუშაობს, როგორც ეს: The Bundler-ის მიმოხილვა Revenue = Σ (each UserOp's payment to beneficiary) Cost = Gas used × Gas price paid for handleOps tx Profit = Revenue - Cost თითოეული UserOp გადახდის მისი გაზის გამოყენების და გაზის ფასების მიხედვით: Payment = (actualGasUsed + preVerificationGas) × min(maxFeePerGas, baseFee + maxPriorityFeePerGas) The bundler sets the მისამართი The გთხოვთ მიიღოთ ამ გადახდა. beneficiary handleOps preVerificationGas Explained ეს ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო ფართო: preVerificationGas Calldata ღირებულება: 16 გაზის per non-zero byte, 4 გაზის per zero byte : Fixed costs per handleOps call that get amortized across UserOps Bundle overhead L2 მონაცემთა გადახდის: L2s, როგორიცაა Optimism ან Arbitrum, გადახდის calldata to L1 აქვს დამატებითი ღირებულება When estimating gas, bundlers calculate preVerificationGas based on the UserOp's size: // Simplified preVerificationGas calculation const calldataCost = userOpBytes.reduce((sum, byte) => sum + (byte === 0 ? 4n : 16n), 0n ); const overhead = 38000n; // ~21000 tx base + ~10000 bundle overhead + ~7000 per-op preVerificationGas = calldataCost + overhead + l2DataFee; Overhead values vary by bundler. For reference, Alto uses და , ყოველთვის გამოიყენეთ უფრო მეტი, ვიდრე hardcoding transactionGasStipend: 21000 fixedGasOverhead: 9830 perUserOp: 7260 eth_estimateUserOperationGas არასამთავრობო გაზის საფასური იმისათვის, რომ მომხმარებელს არ გადაიხადოს გაზის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის გადახდის (for account execution) and (სამთავრობო პლატფორმა პლატფორმა პლატფორმა პლატფორმა პლატფორმა): callGasLimit paymasterPostOpGasLimit თუ არასამთავრობო გაზის ნებისმიერ სფეროში უახლოეს PENALTY_GAS_THRESHOLD (40,000), ანგარიში გადაიხადოს 10% (UNUSED_GAS_PENALTY_PERCENT) არასამთავრობო თანხა (გადაგება არ იყენებს verificationGasLimit ან preVerificationGas) ეს თავმჯდომარე განკუთვნილია absurdly მაღალი აღმასრულებელი ლიმიტები "ეს მხოლოდ უნდა იყოს უსაფრთხო" When you see gas estimation errors, check if your limits are reasonable. The bundler's Endpoint გთავაზობთ გონივრული defaults. eth_estimateUserOperationGas Common Errors and Debugging როდესაც UserOperation არ არის აღიარებული, RPC შეცდომა არის ერთადერთი სინათლის, რომელიც თქვენ მიიღებთ. Bundlers გადაიხადოს სტრუქტურული შეცდომა კოდი, რომელიც აღიარებს, რატომ არ გააკეთა ოპერაცია - მაგრამ მხოლოდ თუ თქვენ იცით, თუ როგორ უნდა წაიკითხოთ მათ. AA1x: Factory Errors These occur when deploying a new account via the factory. In EntryPoint v0.8, you specify and როგორც განსხვავებული ფართობი (EntryPoint შეფუთვა მათ ინტენსიური : factory factoryData initCode AA10: "მგზავრი უკვე შექმნილია" - გადამცემი მისამართი უკვე გააყენა კოდი. AA13: "initCode ცუდია ან OOG" - ქარხანა CreateAccount კავშირი ცუდია ან გაქვთ გაზის. : "initCode must return sender" - The factory returned a different address than expected. AA14 AA15: "initCode უნდა შექმნათ გადამცემი" - ქარხანა მოვუწოდება დასრულდა, მაგრამ არ გააყენა კოდი გადამცემი მისამართზე. : შეამოწმეთ, რომ თქვენი ქარხანა ფუნქცია გადაიხადოს დაწყებული მისამართი. შეამოწმეთ, რომ ქარხანა განაყენა და ფინანსთა. Debugging createAccount AA2x: ანგარიშის გაფართოების შეცდომები The most common category: : "account not deployed" - The sender address has no code and no was provided. AA20 initCode AA21: "მომცულობა არ გადაიხადოს" - ანგარიში არ არის საკმარისი ETH, რათა შეავსოთ მაქსიმალური შესაძლებელი გაზის ღირებულება. ფული ანგარიში ან გამოიყენეთ paymaster. AA22: "შემატა ან არ დასრულდა" - UserOp- ს აქვს validUntil timestamp, რომელიც დასრულდა, ან validAfter timestamp, რომელიც ჯერ კიდევ არ დასრულდა. AA23: "სახლებული" - ანგარიშის validateUserOp ფუნქცია დაახლებულია. შეამოწმეთ თქვენი რეგისტრაციის ლოგიკას. AA24: "სასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასასას AA25: "გურთული ანგარიშის nonce" - nonce არ შეესაბამება. nonce in ERC-4337 არის 256-bit ღირებულება ორი ნაწილები: nonce = (გურთული << 64)e sequence. კურსი (დაწვრილებით 192 ბიტი) აჩვენებს "გურთული" - თქვენ შეგიძლიათ გააკეთოთ მრავალჯერადი პარამეტრი UserOps სხვადასხვა კურსი. კურსი (დაწვრილებით 64 ბიტი) უნდა გაზრდის შედუღებამდე თითოეული ხაზი. საერთო მიზეზები: Reusing a nonce that was already included არასწორი Nonce Key გამოყენება Another UserOp with the same sender is pending in the mempool : "over verificationGasLimit" - Account validation used more gas than allocated. Increase . AA26 verificationGasLimit AA3x: Paymaster Errors AA30: "Paymaster არ გააყენა" - Paymaster მისამართი არ აქვს კოდი გააყენა. : "paymaster deposit too low" - The paymaster's deposit in the EntryPoint can't cover the gas cost. Top it up: AA31 ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლადის ფოლ AA32: "Paymaster დასრულდა ან არ დასრულდა" - მსგავსი AA22, მაგრამ პaymaster- ის კონფიდენციალურობის მონაცემები. : "paymaster reverted" - The paymaster's function reverted. AA33 validatePaymasterUserOp AA34: "Paymaster Signature Error" - ცუდი შეტყობინება Paymaster მონაცემებში. AA36: "over paymasterVerificationGasLimit" - Paymaster validation გამოიყენა მეტი გაზის, ვიდრე გაზიარება. მუშაობა Bundlers RPC Methods Every ERC-4337 bundler implements these standard methods: : შეტყობინეთ UserOp შევიდა eth_sendUserOperation const userOpHash = await bundler.request({ method: 'eth_sendUserOperation', params: [userOp, entryPointAddress] }); : Get gas limit estimates eth_estimateUserOperationGas const gasEstimate = await bundler.request({ method: 'eth_estimateUserOperationGas', params: [userOp, entryPointAddress] }); // Returns: { preVerificationGas, verificationGasLimit, callGasLimit, ... } : Look up a UserOp by its hash eth_getUserOperationByHash const userOp = await bundler.request({ method: 'eth_getUserOperationByHash', params: [userOpHash] }); : მიიღეთ საკრედიტო შემდეგ შედგება eth_getUserOperationReceipt const receipt = await bundler.request({ method: 'eth_getUserOperationReceipt', params: [userOpHash] }); // Returns: { success, actualGasUsed, receipt: { transactionHash, ... } } : Discover which EntryPoint versions the bundler supports eth_supportedEntryPoints const entryPoints = await bundler.request({ method: 'eth_supportedEntryPoints', params: [] }); // Returns: ['0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108'] შეტყობინება Mempool ორიგინალურად, თითოეული bundler შეინარჩუნა საკუთარი პირადი mempool. ეს შექმნა პრობლემები: : A single bundler could refuse to include certain UserOps Censorship risk : Users had to know which bundlers to submit to Fragmentation : If your bundler went down, your UserOps were stuck Single points of failure The solution is the , a P2P network where bundlers gossip UserOps to each other. It works similarly to how Ethereum nodes gossip transactions: ERC-4337 shared mempool User submits UserOp to any participating bundler Bundler ადაპტირება და დაამატოთ ადგილობრივი mempool Bundler broadcasts to connected peers Any bundler on the network can include the UserOp. The protocol uses libp2p for networking. Bundlers advertise which mempools they support (identified by IPFS CIDs that reference mempool metadata files), and only propagate UserOps that pass validation. For example, a mempool metadata file looks like: chainId: '1' entryPointContract: '0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108' description: Canonical ERC-4337 mempool for Ethereum Mainnet minimumStake: '1000000000000000000' IPFS CID ამ ფაილი გახდება mempool identifier გამოიყენება P2P თემა სახელი. mempool მეტატეგატები განკუთვნილია validation წესები: რა opcodes შეუზღუდავი, შენახვის ხელმისაწვდომობის ნიმუშები, გაზის შეზღუდვები, და რეპუტაცია სართულები. როდესაც bundler მიიღებს UserOp მეშვეობით P2P გემრიელი, იგი რეპუტაცია მისი საკუთარი წესები, სანამ დაამატოთ მისი ადგილობრივი mempool. Advanced თემები Aggregators Eccrecover precompile ღირს 3,000 გზის თითო მოვუწოდება, მაგრამ smart account signature verification ჩვეულებრივ ღირს უფრო მეტი, რადგან დამატებითი validation ლოკიკა – ხშირად 6,000-10,000 გზის საერთო. 100 UserOps in bundle, ეს არის 600,000+ გზის მხოლოდ შეტყობინებები. aggregators საშუალებას გაძლევთ შეტყობინების შეტყობინება – შეტყობინება ყველა 100 შეტყობინებები ერთი ოპერაცია ფართი ღირებულება. What problem do aggregators solve? Instead of each account verifying its own signature, accounts can delegate to an aggregator contract. The aggregator implements a batch verification algorithm (like BLS signatures, where multiple signatures can be combined into one). How it works: Account's returns an aggregator address in its validation data validateUserOp Bundler groups all UserOps using the same aggregator Bundler მოვუწოდებს aggregator.validateSignatures(userOps, aggregatedSignature) ერთხელ ჯგუფი If verification passes, all UserOps in that group are considered valid : Return ღირებულება packs three pieces of information into a single 256-bit value: The validationData encoding validateUserOp validationData = uint160(aggregator) | // bits 0-159: aggregator address (uint256(validUntil) << 160) | // bits 160-207: expiration timestamp (uint256(validAfter) << 208) // bits 208-255: earliest valid time (bits 0-159): Address of the aggregator contract, or special values: 0 = signature valid, 1 = signature invalid aggregator validUntil (ბილები 160-207): Timestamp მას შემდეგ, რაც ეს UserOp დასრულდება (0 = არ დასრულება) (bits 208-255): Timestamp before which this UserOp is not valid (0 = immediately valid) validAfter This encoding lets accounts specify both signature verification delegation and time-bounded validity in a single return value. Paymasters Paymasters abstract gas payment from users. Instead of the account paying for gas, a paymaster can: Sponsor Transactions: გადაიხადოს მომხმარებელს (Gasless UX) : Let users pay in stablecoins or other tokens Accept ERC-20 tokens : Rate limiting, subscription models, etc. Implement custom logic Paymaster- ის გაფართოების გაფართოების გაფართოების გაფართოების გაფართოების გაფართოების გაფართოების გაფართოების გაფართოება: function validatePaymasterUserOp( PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost ) external returns (bytes memory context, uint256 validationData); The დასაწყისში დასაწყისში მას შემდეგ, რაც შესრულება დასრულდება, საშუალებას გაძლევთ paymaster- ს დასრულების ანგარიშების გაკეთება (გალითად, ERC-20 ტოკონის გადახდის): context postOp function postOp( PostOpMode mode, bytes calldata context, uint256 actualGasCost, uint256 actualUserOpFeePerGas ) external; Paymasters should be staked for production use. Staking provides relaxed storage access rules and better reputation—unstaked paymasters face strict limitations and can be quickly throttled by bundlers. While unstaked paymasters technically function with basic operations, staking is practically required for any serious paymaster implementation. can Testing Locally This section assumes you have Anvil running with EntryPoint v0.8 deployed. We'll use , Pimlico's TypeScript bundler, and ERC-4337 ინტეგრირებული კონტაქტი. მაღალი permissionless.js SimpleAccountFactory 1. ჩვენ მინიმალური სმარტ ანგარიშის შექმნა. მაგრამ როგორ იყენებენ მომხმარებელს? ისინი არ შეგვიძლია რეგულარული სავაჭრო გადაცემა – მათ არ გვაქვს ETH გაზისთვის. ERC-4337 გადაწყვეტებს ეს ქარხანა კონტაქტები. For კონფიგურაცია მოიცავს . Deploy it alongside the EntryPoint before running the examples below. SimpleAccount SimpleAccountFabric Account Deployment via UserOp როდესაც EntryPoint მიიღებს UserOp ფართობი Factory და factoryData: Checks if has code—if yes, skip deployment sender დაუკავშირდით factory.createAccount(owner, salt) მეშვეობით factoryData კონფიგურაცია გადამცემი მისამართი შეესაბამება Continues with validation on the newly-deployed account მაღალი სიმაღლე alto \ --rpc-url http://localhost:8545 \ --entrypoints 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 \ --executor-private-keys 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d \ --utility-private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ --safe-mode false \ --api-version v1,v2 \ --bundle-mode auto Key flags: : Key for submitting bundles (must have ETH) --executor-private-keys : Anvil lacks the JavaScript tracer for full ERC-7562 validation --safe-mode false --api-version v1,v2: მიიღეთ ორივე UserOp ფორმატებს (v1 for 0.6, v2 for 0.7/0.8) გაგზავნა UserOperations with permissionless.js დააყენეთ დამოკიდებულებები: npm install viem permissionless Step 1: Set up clients We need three clients: one for reading chain state, one for bundler-specific RPCs, and one for the smart account owner. import { http, createPublicClient, createWalletClient, parseEther } from "viem" import { privateKeyToAccount } from "viem/accounts" import { foundry } from "viem/chains" import { toSimpleSmartAccount } from "permissionless/accounts" import { createSmartAccountClient } from "permissionless/clients" import { createPimlicoClient } from "permissionless/clients/pimlico" const ENTRYPOINT = "0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108" const publicClient = createPublicClient({ chain: foundry, transport: http("http://localhost:8545") }) const pimlicoClient = createPimlicoClient({ chain: foundry, transport: http("http://localhost:4337"), entryPoint: { address: ENTRYPOINT, version: "0.8" } }) const owner = privateKeyToAccount(process.env.PRIVATE_KEY) ეს გაერთიანებს ალტოის RPC- ს და უზრუნველყოფს გაზის მიმოხილვა . pimlicoClient pimlico_getUserOperationGasPrice Step 2: Create the smart account instance const simpleAccount = await toSimpleSmartAccount({ client: publicClient, owner, entryPoint: { address: ENTRYPOINT, version: "0.8" } }) const accountAddress = await simpleAccount.getAddress() console.log("Account:", accountAddress) This computes the counterfactual address using the factory's function. The account doesn't exist yet—but we know exactly where it will be deployed. getAddress Step 3: Fund the account Smart ანგარიში საჭიროა ETH გადახდის გაზის (ან გამოყენება paymaster). ჩვენ შეგვიძლია გაგზავნოთ ETH counterfactual მისამართი: const walletClient = createWalletClient({ account: owner, chain: foundry, transport: http("http://localhost:8545") }) await walletClient.sendTransaction({ to: accountAddress, value: parseEther("1") }) ETH მდებარეობს, რომ მისამართი. როდესაც ანგარიშის განთავსება, მას შეუძლია ხელმისაწვდომია, რომ ფული დაუყოვნებლივ. Step 4: Create the smart account client const smartAccountClient = createSmartAccountClient({ client: publicClient, account: simpleAccount, bundlerTransport: http("http://localhost:4337"), userOperation: { estimateFeesPerGas: async () => (await pimlicoClient.getUserOperationGasPrice()).fast } }) ეს handles UserOp construction, nonce management, gas estimation, and signing. The callback იღებს ამჟამად გაზის ფასები bundler. smartAccountClient estimateFeesPerGas Step 5: Send a UserOperation const hash = await smartAccountClient.sendUserOperation({ calls: [{ to: "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", value: parseEther("0.01"), data: "0x" }] }) const receipt = await smartAccountClient.waitForUserOperationReceipt({ hash }) console.log("Success:", receipt.success) პირველი UserOp, SDK ავტომატურად მოიცავს და fields. The EntryPoint deploys the account, then executes the transfer—all in one transaction. factory factoryData რა ვცდილობთ Bundlers are the execution layer of ERC-4337. They are what turns Account Abstraction from a specification into a production-ready mechanism. Understanding their constraints — validation rules, gas economics, and reputation mechanics — is critical when designing reliable smart accounts. Mistakes here don’t surface in Solidity code, but in mempool behavior, simulations, and execution economics. ERC-4337 გადაიხადოს სქესობრივი პოსტი და ინფრასტრუქტურის. იღებს უფრო სწრაფად, რომ განვითარებლები იწყება ფიქრობენ bundlers, ვიდრე სავაჭრო, უფრო რეზოლუციური მათი სისტემები იქნება წარმოების.