From 6c40c65ca308c6d185c31432282db81eb5bc8efa Mon Sep 17 00:00:00 2001 From: dancoombs Date: Tue, 26 Sep 2023 08:39:05 -0400 Subject: [PATCH] chore(docs): repo docs --- .github/workflows/ci.yml | 11 +- .github/workflows/mlc_config.json | 7 ++ docs/CONTRIBUTING.md => CONTRIBUTING.md | 4 +- Cargo.toml | 13 +-- README.md | 138 +++++++++++++++--------- docs/SECURITY.md => SECURITY.md | 2 +- crates/builder/proto/README.md | 19 +--- crates/pool/proto/README.md | 4 +- docs/alt-mempools.md | 13 --- docs/architecture.md | 62 ----------- docs/architecture/architecture.md | 25 +++++ docs/architecture/builder.md | 83 ++++++++++++++ docs/architecture/pool.md | 83 ++++++++++++++ docs/architecture/rpc.md | 118 ++++++++++++++++++++ docs/{config.md => cli.md} | 76 ++++++------- docs/developing.md | 100 +++++++++++++++++ docs/docker.md | 13 +++ docs/images/multiimage.png | Bin 45078 -> 0 bytes docs/images/multiprocess.png | Bin 43299 -> 0 bytes docs/proto.md | 16 +++ docs/transactions.md | 19 ---- 21 files changed, 583 insertions(+), 223 deletions(-) create mode 100644 .github/workflows/mlc_config.json rename docs/CONTRIBUTING.md => CONTRIBUTING.md (97%) rename docs/SECURITY.md => SECURITY.md (61%) delete mode 100644 docs/alt-mempools.md delete mode 100644 docs/architecture.md create mode 100644 docs/architecture/architecture.md create mode 100644 docs/architecture/builder.md create mode 100644 docs/architecture/pool.md create mode 100644 docs/architecture/rpc.md rename docs/{config.md => cli.md} (79%) create mode 100644 docs/developing.md create mode 100644 docs/docker.md delete mode 100644 docs/images/multiimage.png delete mode 100644 docs/images/multiprocess.png create mode 100644 docs/proto.md delete mode 100644 docs/transactions.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a884376d7..7c493625d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,15 +77,24 @@ jobs: - name: buf lint uses: bufbuild/buf-lint-action@v1 - spellcheck: + doc-lint: runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 + - name: Install codespell run: sudo pip3 install codespell tomli + - name: Check spelling run: codespell --toml .github/workflows/codespell.toml *.md docs/*.md + + - name: markdown link check + uses: gaurav-nelson/github-action-markdown-link-check@v1 + with: + folder-path: 'docs' + file-path: 'README.md,CONTRIBUTING.md,SECURITY.md' + config-file: '.github/workflows/mlc_config.json' cog_check_job: runs-on: ubuntu-latest diff --git a/.github/workflows/mlc_config.json b/.github/workflows/mlc_config.json new file mode 100644 index 000000000..88e3291f8 --- /dev/null +++ b/.github/workflows/mlc_config.json @@ -0,0 +1,7 @@ +{ + "ignorePatterns": [ + { + "pattern": "^https://github.com/OMGWINNING/rundler" + } + ] +} \ No newline at end of file diff --git a/docs/CONTRIBUTING.md b/CONTRIBUTING.md similarity index 97% rename from docs/CONTRIBUTING.md rename to CONTRIBUTING.md index 781fbe4fe..34a02d185 100644 --- a/docs/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -84,10 +84,10 @@ Tests that use forking must contain "fork" in their name. It is a recommended best practice to keep your changes as logically grouped as possible within individual commits. There is no limit to the number of commits any single pull request may have, and many contributors find it easier to review changes that are split across multiple commits. That said, if you have a number of commits that are "checkpoints" and don't represent a single logical change, please squash those together. -We follow the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) specification to make sure that all of our commits are formatted well and are in proporly tailored to the change that the commit is making. +We follow the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) specification to make sure that all of our commits are formatted well and are properly tailored to the change that the commit is making. #### Opening the pull request From within GitHub, opening a new pull request will present you with a template that should be filled out. Please try your best at filling out the details, but feel free to skip parts if you're not sure what to put. -[dev-tg]: https://t.me/+F_xS9IVOdJZmZjQx \ No newline at end of file +[dev-tg]: https://t.me/rundler \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index e3b7f0620..e13584830 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,7 @@ [workspace] members = [ - "bin/rundler", - "bin/tools", - "crates/builder", - "crates/dev", - "crates/pool", - "crates/provider", - "crates/rpc", - "crates/sim", - "crates/task", - "crates/types", - "crates/utils" + "bin/*", + "crates/*", ] default-members = ["bin/rundler"] diff --git a/README.md b/README.md index 71419fd2e..081184305 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,113 @@ # Rundler -## Development +[![gh_ci_badge]][gh_ci_link] +[![tg_badge]][tg_link] -### Build & Test +[gh_ci_badge]: https://github.com/OMGWINNING/rundler/workflows/ci/badge.svg +[gh_ci_link]: https://github.com/OMGWINNING/rundler/actions/workflows/ci.yml +[tg_badge]: https://img.shields.io/endpoint?color=neon&logo=telegram&label=chat&url=https%3A%2F%2Ftg.sumanjay.workers.dev%2Frundler +[tg_link]: https://t.me/rundler -Prerequisites: +**High-performance, modular implementation of an ERC-4337 bundler** -* [Rust & Cargo](https://rustup.rs/) - * Nightly rust required for `rustfmt`: -``` -rustup toolchain add nightly -``` -* [Cocogitto](https://github.com/cocogitto/cocogitto) - * `cargo install --locked cocogitto` -* [Docker](https://docs.docker.com/engine/install/) +[Run](#running) | [Developer Docs](./docs) -Run tests: -``` -git clone https://github.com/OMGWINNING/rundler -cd rundler -cargo test --all -``` +🚧 *Under active development, see [status](#status) below.* + +## What's a Rundler? + +**Rundler** (**R**ust B**undler**) is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) bundler implementation written in Rust. Rundler is designed to achieve high-performance and high-reliability in cloud deployments via a modular architecture. + +Built, maintained, and used by [Alchemy](https://www.alchemy.com/) to push the limits of user experience on EVM chains via [Account Abstraction](https://www.alchemy.com/blog/account-abstraction). + +## Goals + +Rundler is meant to power the ERC-4337 ecosystem with an implementation that users can rely on to scale to their needs while maintaining high reliability. As ERC-4337 is a nascent technology, Rundler strives to be on the bleeding edge of feature support and the team will be contributing to push the protocol forward. + +Our goals with Rundler: + +1. **ERC-4337 Specification Compliance**: Rundler strives to implement the full ERC-4337 specification and to maintain support as the specification is changed and new onchain components are released. This includes new Entry Point contract support, support for the upcoming P2P mempool specification, and support for alt-mempools. +2. **High Performance and Reliability**: Rundler strives to power the most demanding workloads in cloud environments. Rust was chosen for its high performance and memory safety. Rundler's modular architecture lets providers choose to run the stateless components (RPC, builder) in a fully horizontally scalable manner connecting to the stateful components (mempool, p2p, event cache) via the network. Rundler's bundle builder is designed to be able to support the full gas throughput of the network its building for. +3. **Extendability/Chain Support**: ERC-4337 is designed to support any EVM chain. However, different EVM supporting networks have different rules around how they support things like gas usage, gas fees, precompiles, etc. Rundler is designed to be extendable and easily adapted to support any EVM chain. +4. **Modularity**: Rundler is written in a modular manner, allowing its components to be run as a single integrated binary, or as a distributed system. Rundler also strives for its individual crates to be used to support future ERC-4337 tooling. + +## Status + +Rundler is under active development. It is used in Alchemy's cloud to power its account abstraction APIs. However, it is rapidly being upgraded, features are being added, interfaces will have breaking changes, and the ERC-4337 spec is evolving from onchain learnings. + +The documentation is work in progress, and we are working to improve it. Please [reach out](#help) with any questions. -### Run locally: +**Use in production at your own risk.** -Running locally requires access to an Ethereum RPC node on the network the Rundler is running on. For testing it is recommended to run a local development node. +### ERC-4337 Support -Steps to run `Geth` in dev mode locally: +Rundler currently supports the [v0.6 release](https://github.com/eth-infinitism/account-abstraction/tree/v0.6.0) of Entry Point contract. -1. `cd test` -2. `docker compose up` (use `-d`) to run in background. +### Chain Support -Steps to run `Rundler` locally: +Rundler currently supports and has been tested on the following networks and their testnets: -1. Copy the default .env file. By default, this will be pointing at the local `Geth` node. +* Ethereum +* Optimism +* Base +* Arbitrum One +* Polygon POS + +## Developers + +### Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md). + +### Running + +The easiest way to run Rundler is via a docker container. There is currently no pre-built image. See our [docker documentation](docs/docker.md) for further instructions. + +### Developing + +For detailed instructions see [developing](docs/developing.md). + +Install [prerequisites](docs/developing.md#setup). + +Clone the repository and checkout submodules: ``` -cp test/.env.default .env +git clone https://github.com/OMGWINNING/rundler +cd rundler +git submodule update --init --recursive ``` -2. (Optional) Fund and deploy contracts. Contracts are deployed from the [account-abstraction](https://github.com/eth-infinitism/account-abstraction) repo. This does the following: - * Creates an account for the bundler to use. - * Deploys the `EntryPoint`. - * Deploys a `SimpleAccountFactory`. - * Deploys a `VerifyingPaymaster`. - * Deploys a `SimpleAccount`. - * Funds each of the accounts. +Run unit tests: ``` -cargo run --bin deploy_dev_contracts +make test-unit ``` -3. (Optional) Modify the `BUNDLER_PRIVATE_KEY` field if using a different account than was funded in #2. - -4. Start the Rundler +Run ERC-4337 spec tests: ``` -cargo run node +cd test/spec-tests/bundler-spec-tests && pdm install && pdm run update-deps +make test-spec-integrated ``` -### Documentation +### Help + +If you have questions regarding the Rundler codebase, please first look through our [documentation](./docs/). + +With further questions: + +* Github discussions +* [Telegram][tg_link] +* [Github issues](https://github.com/OMGWINNING/rundler/issues/new/choose) + +If you have questions regarding Alchemy's APIs or service, kindly refrain from discussion here. Please join the [Discord](https://discord.com/invite/alchemyplatform) or reach out to support@alchemy.com. -- [configuration](docs/config.md) -- [transactions](docs/transactions.md) -- [contributing](docs/CONTRIBUTING.md) -- [architecture](docs/architecture.md) +### Security -### Goals +For security concerns do not file a public ticket, please reach out to security@alchemy.com. -- Implement P2P mempool -- Implement persistent mempool -- Keep our spec test fork in like with origin -- Deploy public docker image -- Cross platform compilation +See [SECURITY.md](SECURITY.md) for details. -### Resources +## Acknowledgements -- [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) +We stand on the shoulders of the following teams: -### Communication: -- [Telegram](https://t.me/+F_xS9IVOdJZmZjQx) \ No newline at end of file +- [ERC-4337 team](https://github.com/eth-infinitism/account-abstraction): The ERC-4337 team has pioneered the standard, and has answered countless questions during our development. They developed the [bundler reference implementation](https://github.com/eth-infinitism/bundler) and [spec tests](https://github.com/eth-infinitism/bundler-spec-tests) that were invaluable during our development process. We are excited to continue to work with this team to push ERC-4337 ahead. +- [Reth](https://github.com/paradigmxyz/reth): Big thanks to the Reth team, from which we've taken inspiration for many of our practices in this repo (including this README). They are pushing the Ethereum Rust ecosystem forward in an open way. We thank the Reth team for their continued contributions. diff --git a/docs/SECURITY.md b/SECURITY.md similarity index 61% rename from docs/SECURITY.md rename to SECURITY.md index b52c7e1f1..5ce0981a8 100644 --- a/docs/SECURITY.md +++ b/SECURITY.md @@ -8,4 +8,4 @@ ## Reporting a Vulnerability -If you would like to report a vulnerability, please open a github issue and tag it with the `security` label. \ No newline at end of file +If you would like to report a vulnerability, please contact security@alchemy.com diff --git a/crates/builder/proto/README.md b/crates/builder/proto/README.md index c2ed9d54f..a46ffd6da 100644 --- a/crates/builder/proto/README.md +++ b/crates/builder/proto/README.md @@ -1,18 +1,3 @@ -# TODO +Protocol buffer definitions for the builder module. -# Protocol Buffer Definitions - -This directory stores the schema definitions used by Rundler and the supporting gRPC services of it's internal components. - -## Building - -Rundler builds on [Tonic](https://github.com/hyperium/tonic) to power lightning quick gRPC interfaces between internal components. To re-compile changes to the protocol buffers: - -1. Make sure `protoc` is installed locally. On Macs one can run `brew install protobuf`. Otherwise see the official [protobuf docs](https://grpc.io/docs/protoc-installation/) for installation instructions. -2. Run `cargo build` to recompile the protocol buffers as part of the overall binary build. This is configured in `build.rs` in the `generate_protos` function. Adding schemas in new files will require a change to `build.rs`. - -## Protocol Buffer to Memory Representation Translation - -## Style Guide - -Rundler largely relies on the canonical (protobuf style guide)[https://protobuf.dev/programming-guides/style/]. There are a few minor differences captured in `buf.yaml` to support Tonic best practices. Rundler use (buf)[https://buf.build/] to lint the `.proto` files. To use `buf` run `buf lint protos/.`. To install `buf` on Macs, run `brew install bufbuild/buf/buf`. +Refer to [proto.md](../../../docs/proto.md) for best practices. diff --git a/crates/pool/proto/README.md b/crates/pool/proto/README.md index f87f5c14c..b97ae2e57 100644 --- a/crates/pool/proto/README.md +++ b/crates/pool/proto/README.md @@ -1 +1,3 @@ -# TODO \ No newline at end of file +Protocol buffer definitions for the pool module. + +Refer to [proto.md](../../../docs/proto.md) for best practices. diff --git a/docs/alt-mempools.md b/docs/alt-mempools.md deleted file mode 100644 index 83d23a5ad..000000000 --- a/docs/alt-mempools.md +++ /dev/null @@ -1,13 +0,0 @@ -## TODO - -*example configuration* - -``` -{ - "0x0000000000000000000000000000000000000000000000000000000000000000": { - "description": "USDC paymaster allowlist - base goerli", - "chainIds": ["0x2105"], - "allowlist": [] - } -} -``` \ No newline at end of file diff --git a/docs/architecture.md b/docs/architecture.md deleted file mode 100644 index 833585e82..000000000 --- a/docs/architecture.md +++ /dev/null @@ -1,62 +0,0 @@ -# Rundler Architecture - -there are 3 main process that are execute when running the rundler application and they are `rpc`, `builder` and `op_pool`. - -## RPC - -The rpc module is used to expose a JSONRPC http api, much like a normal Ethereum node. To see the available requests, please refer to the [EIP4337 spec](https://eips.ethereum.org/EIPS/eip-4337) and find the RPC methods section. -To generate the JSONRPC api, we make use of [Parity's][parity] [jsonrpsee library][jsonrpsee] and its useful macro definitions. - -## Builder - -The builder module is used to propose, send and track transactions that need to be bundled together and pushed onto the chain. - -### Bundle Proposer - -The bundle proposer is is most important part of Rundler as it performs numerous operations to check whether transactions and valid based on the [EIP4337 spec](https://eips.ethereum.org/EIPS/eip-4337), estimate gas and see if the next bundle -has enough room for it to be included or wait until a new bundle is proposed. - -### Bundle Sender - -After the bundle proposal runs, the bundle sender logic will handle the process of propagating a transaction on chain and checking on the status to see if it is included in a block. This process also handles the gas increases if the transaction -has any issues being included. - -### Sender - -The sender is a lower level module that is used by the bundle sender to forward the bundled user operations to a node url or to a relay server (eg. Flashbots) if the chain is supported, after the transactions have been sent out to be landed on chain, there are a -couple process that track the status of the operations and perform updates to the gas price if the transaction has not landed within a few blocks. - -### Signer - -The signer component is used to sign transactions before they are sent to be propagated on chain. The signing process can either be done by a key that is local to the server instance or an AWS KMS key. -When using the KMS option, there also needs to be a configured redis cache to perform locking. The locking is required as if there are multiple instances of the builder modules running, we want to -make sure that none there are two of the services are using the same key with the same nonce. This can lead to an immediate revertion of the bundle if the nonce is not correct when sending the bundle to be -processed on chain. - -### Server - -The server component is a little bit more complex than the `sender` and the `signer` modules as there is a context of local or distributed options. The local server will work by passing messages between threads and listening to updates from the `pool`. -If the server is running in the distributed mode, messaging is done via gRPC which can be local to the machine or across multiple machines. - -## Op Pool - -The pool components purpose is to manage the mempool operations. Once a user operation is sent to the RPC server, the pool will add the operation to its mempool to be proposed via the builder and then to be propagated on chain. The Pool should be the -module that lets the bulder know when a new user operation has been added to the mempool so that it can then be proposed to be included in a new bundle. - -### Mempool - -Within the `op_pool` process, the state of the mempool is updated and controlled by the `mempool` module which provides basic crud operations for the underlying pool and keeps track of address reputation to make sure there is a reduced risk of -malicious activity when interacting with Rundler. - -## TODO make better diagrams - -## Distributed architecture - -![distributed](images/multiimage.png) - -## Single Image architecture - -![singleimage](images/multiprocess.png) - -[parity]: https://www.parity.io/ -[jsonrpsee]: https://github.com/paritytech/jsonrpsee \ No newline at end of file diff --git a/docs/architecture/architecture.md b/docs/architecture/architecture.md new file mode 100644 index 000000000..0188d0981 --- /dev/null +++ b/docs/architecture/architecture.md @@ -0,0 +1,25 @@ +# Rundler Architecture + +Rundler consists of 3 main "tasks" that work in tandem to implement the ERC-4337 bundler specification. + +- [**RPC**](./rpc.md): The `RPC` task implements the defined [ERC-4337 RPC methods](https://eips.ethereum.org/EIPS/eip-4337#rpc-methods-eth-namespace) under both the `eth_` and `debug_` namespaces. It also implements Rundler specific methods under the `rundler_` namespace and a health check endpoint. + +- [**Pool**](./pool.md): The `Pool` task implements a User Operation (UO) mempool. The mempool validates and simulates User Operations per the rules in the spec. It maintains the UOs in memory until they are mined onchain. The pool handles chain reorgs up to a defined depth using a cache of mined UOs. + +- [**Builder**](./builder.md): The `Builder` task is responsible for constructing bundles of User Operations, submitting them as transactions, and monitoring the status of those transactions. + +## Task Communication + +The tasks communicate with each other via message passing mechanisms. The `Pool` and `Builder` each run a "server" component responsible for receiving, acting upon, and responding to messages. + +**RPC -> Pool**: The `RPC` module submits UOs to the `Pool` during the `eth_sendUserOperation` RPC method. Future RPC method implementations may use this communication path to retrieve UO status. + +**RPC -> Builder**: This communication path is only used when the `debug_` namespace is enabled. It is used to set the builder's bundling mode (to `manual` in tests) and trigger bundle submission (in `manual` mode). + +**Builder <-> Pool**: The `Builder` and the `Pool` coordinate to create bundles that contain valid, unmined, and profitable user operations. The `Builder` subscribes to a stream up of updates from the pool and is notified after each new block is processed. The builder then queries the pool for its most valuable UOs, re-simulates them and builds bundles. Any operations that fail 2nd simulation are communicated back to the `Pool` for removal. + +## Communication Modes + +Both the `Builder` and the `Pool` tasks can be configured to run a gRPC server capable of receiving and responding to messages from the network. Thus, Rundler can be configured to run in a distributed mode where its tasks run in separate processes. + +The `Builder` and `RPC` modules can be configured to communicate to other tasks via in-memory message passing (if running in the same process) or via gRPC (if running in separate processes). diff --git a/docs/architecture/builder.md b/docs/architecture/builder.md new file mode 100644 index 000000000..7e149a7bd --- /dev/null +++ b/docs/architecture/builder.md @@ -0,0 +1,83 @@ +# Builder Task + +The builder task is responsible for creating bundle transactions, signing them, submitting them, and tracking their status. + +## Bundle Sender + +The bundle sender module is the main state machine that runs the bundle building logic. It follows the following steps: + +1. Wait for a new block event from the `Pool`. +2. Request a new bundle from the [bundle proposer](#bundle-proposer). +3. Create and [sign](#transaction-signers) the bundle transaction. +4. Submit the transaction through a [transaction sender](#transaction-senders). +5. [Track](#transaction-tracking) the status of the bundle transaction, re-submitting if needed, until either the transaction is minded, or it is abandoned. Then return to 1. + +## Bundle Proposer + +The bundle proposer module's main responsibility is to construct a valid bundle transaction. + +The proposer asks the `Pool` for pending user operations sorted by priority fee, filters them for profitability, re-simulates them and rejects invalid UOs, then optionally calculates any aggregated signatures. + +### Required Fees + +The proposer first estimates the required fees for the bundle transaction and then calculates the minimum required fees for a user operation. This calculation is based on a configuration option and is one of: + +- **Priority Fee Increase Percentage**: Require the UO priority fee to be N% higher than the bundle priority fee. +- **Base Fee Percentage**: Require the UO priority fee to be N% of the base fee. + +These can be tweaked to modify the bundler's profitability. + +### Gas Limit + +The proposer limits the amount of UO gas that it will attempt to put into a single single bundle to ensure that transactions are below the gas cap of a block. This limit is calculated by summing the maximum gas usage of each UO in the bundle. If a UO puts the bundle over this limit, it (and all following UOs) will be skipped (but not removed from the pool). + +The maximum gas usage of each UO is a function of its `preVerificationGas`, `verificationGasLimit`, and `callGasLimit`. + +### 2nd Simulation and Rejection + +Once a candidate bundle is constructed, each UO is re-simulated and validation rules are re-checked. UOs that fail are removed from the bundle and removed from the pool. + +After 2nd simulation the entire bundle is validated via an `eth_call`, and ops that fail validation are again removed from the bundle. This process is repeated until the entire bundle passes validation. + +NOTE: This procedure implements an old version of the spec and will be updated to conform soon. See [here](https://github.com/eth-infinitism/account-abstraction/blob/develop/eip/EIPS/eip-4337.md#bundling) for more details on the new implementation. + +## Transaction Signers + +The bundle builder supports a signer interface used for transaction signing. There are currently 2 implementations: + +- **Private Key**: Rundler is configured with a private key via a CLI variable directly. +- [**KMS**](#kms-with-key-leasing): AWS KMS is used for signing. + +### KMS with Key Leasing + +When using AWS KMS for signing Rundler requires the use of Redis to perform key leasing. + +To ensure that no 2 bundlers in a distributed bundler system attempt to use the same key, causing nonce collisions, this key leasing system is used to lease a key in a CLI configured list to a single bundle builder at a time. + +## Transaction Senders + +The builder supports multiple sender implementations to support bundle transaction submission to different types of APIs. + +- **Raw**: Send the bundle as an `eth_sendRawTransaction` via a standard ETH JSON-RPC. + +- **Conditional**: Send the bundle as an `eth_sendRawTransactionConditional` to an interface that supports the [conditional transaction RPC](https://notes.ethereum.org/@yoav/SkaX2lS9j). + +- **Flashbots**: Submit bundles via the [Flashbots Protect](https://docs.flashbots.net/flashbots-protect/overview) RPC endpoint on supported chains. + +- **Bloxroute**: Submit bundles via Bloxroute's [Polygon Private Transaction](https://docs.bloxroute.com/apis/frontrunning-protection/polygon_private_tx) endpoint. Only supported on polygon. + +## Transaction Tracking + +After the bundle transaction is sent, the sender tracks its status via the transaction tracker module. This module tracks to see if a transaction is pending, dropped, or mined. + +If after a configured amount of blocks the transaction is still pending, the sender will attempt to re-estimate gas fees and will submit a new bundle that replaces the old bundle. + +If dropped or mined, the sender will restart the process. + +## N-Senders + +Rundler has the ability to run N bundle sender state machines in parallel, each configured with their own distinct signer/account for bundle submission. + +In order for bundle proposers to avoid attempting to bundle the same UO, the sender is configured with a mempool shard index that is added to the request to the pool. This shard index is used by the pool to always return a disjoint set of UOs to each sender. + +N-senders can be useful to increase bundler gas throughput. diff --git a/docs/architecture/pool.md b/docs/architecture/pool.md new file mode 100644 index 000000000..da33aa49d --- /dev/null +++ b/docs/architecture/pool.md @@ -0,0 +1,83 @@ +# Pool Task + +The `Pool` task is responsible for receiving, validating, sorting, and storing user operations. The `RPC` task submits the UOs from users and the `Builder` task consumes the UOs for bundling. + +## Simulation + +Upon each `add_operation` call the `Pool` will preforms a series of checks. + +1. Run a series of [prechecks](https://github.com/eth-infinitism/account-abstraction/blob/develop/eip/EIPS/eip-4337.md#client-behavior-upon-receiving-a-useroperation) to catch any reasons why the UO may not be mined. + +2. Simulate the UO via a `debug_traceCall` as per the [ERC-4337 spec](https://github.com/eth-infinitism/account-abstraction/blob/develop/eip/EIPS/eip-4337.md#simulation). + +If violations are found, the UO is rejected. Else, the UO is added to the pool. + +### Tracer + +A typescript based tracer is used to collect relevant information from the `debug_traceCall`. It is compiled into javascript in this repo and sent as a string as a parameter to the trace. + +## Reputation + +The `Pool` tracks the reputation of entities as per the [ERC-4337 spec](https://github.com/eth-infinitism/account-abstraction/blob/develop/eip/EIPS/eip-4337.md#reputation-scoring-and-throttlingbanning-for-global-entities). + + +### Allowlist/Blocklist + +The `Pool` supports allowlists and blocklists configured via a JSON file. The JSON file must contain an array of addresses to add to the list. + +Example file: +``` +[ + "0xasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf" +] +``` + +**Allowlist**: Addresses on this list are always `Ok` in the reputation manager. + +**Blocklist**: Addresses on this list are always `Banned` in the reputation manager. + +## Chain Tracking + +The `Pool` uses a JSON-RPC provider to track the progression of its chain. The chain tracker notifies the pool of new blocks, mined user operations, and "un-mined" user operations due to chain re-orgs. + +Upon receiving a chain update event, the `Pool` will update its internal state by removing any mined user operations (and placing them in its cache), and by replacing any un-mined user operations (from its cache). + +The `Pool`'s cache depth is configurable, if a re-org occurs that is deeper than the cache, UOs will be unable to be returned to the pool. + +## Mempool Sharding + +The `Pool` supports a very simple sharding scheme in its `best_operations` interface. The `Pool` is configured with a `num_shards` config, and the caller of `best_operations` provides a `shard_index` parameter. + +User operations are assigned to a shard by their sender address modulo the number of shards. + +Callers can use this feature to unsure that multiple callers are returned a disjoint set of user operations by sender. Callers should ensure that there is exactly 1 caller assigned to each shard index, else risk bundle invalidations (> 1 assigned) or orphaned user operations (0 assigned). + +## Alternative Mempools (in preview) + +**NOTE: this feature presents known risks to the bundler, use at your own risk** + +The `Pool` supports configuring [alternative mempools](https://eips.ethereum.org/EIPS/eip-4337#alternative-mempools) via a JSON configuration file. This feature is under development with the community and will be modified soon. + +See [here](https://hackmd.io/@dancoombs/BJYRz3h8n) for more details. + +Example config: + +``` +{ + "0x0000000000000000000000000000000000000000000000000000000000000000": { + "description": "Allow list", + "chainIds": ["0x066eed"], + "allowlist": [ + { + "description": "My Factory", + "rule": "notStaked", + "entity": "0xasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf" + } + ] + } +} +``` + +## P2P + +P2P mempool implementation is under development. See [here](https://github.com/eth-infinitism/bundler-spec/blob/main/p2p-specs/p2p-interface.md) for spec details. diff --git a/docs/architecture/rpc.md b/docs/architecture/rpc.md new file mode 100644 index 000000000..613f25e6b --- /dev/null +++ b/docs/architecture/rpc.md @@ -0,0 +1,118 @@ +# RPC Task + +The `RPC` task is the main interface into the Rundler. It consists of 3 namespaces: + +- **eth** +- **debug** +- **rundler** + +each of which can be enabled/disabled vai configuration. + +It also supports a health check endpoint. + +## Supported Methods + +### `eth_` Namespace + +Methods defined by the [ERC-4337 spec](https://github.com/eth-infinitism/account-abstraction/blob/develop/eip/EIPS/eip-4337.md#rpc-methods-eth-namespace). + +| Method | Supported | +| ------ | :-----------: | +| `eth_chainId` | ✅ | +| `eth_supportedEntryPoints` | ✅ | +| `eth_estimateUserOperationGas` | ✅ | +| `eth_sendUserOperation` | ✅ | +| `eth_getUserOperationByHash` | ✅ | +| `eth_getUserOperationReceipt` | ✅ | + +### `debug_` Namespace + +Method defined by the [ERC-4337 spec](https://github.com/eth-infinitism/account-abstraction/blob/develop/eip/EIPS/eip-4337.md#rpc-methods-debug-namespace). Used only for debugging/testing and should be disabled on production APIs. + +| Method | Supported | +| ------ | :-----------: | +| `debug_clearState` | ✅ | +| `debug_dumpMempool` | ✅ | +| `debug_sendBundleNow` | ✅ | +| `debug_setBundlingMode` | ✅ | +| `debug_setReputation` | ✅ | +| `debug_dumpReputation` | ✅ | + +### `rundler_` Namespace + +Rundler specifc methods that are not specified by the ERC-4337 spec. + +| Method | Supported | +| ------ | :-----------: | +| [`rundler_maxPriorityFeePerGas`](#rundler_maxpriorityfeepergas) | ✅ | + +#### `rundler_maxPriorityFeePerGas` + +This method returns the minimum `maxPriorityFeePerGas` that the bundler will accept at the current block height. This is based on the fees of the network as well as the priority fee mode configuration of the bundle builder. + +Users of this method should typically increase their priority fee values by a buffer value in order to handle price fluctuations. + +### Health Check + +The health check endpoint can be used by infrastructure to ensure that Rundler is up and running. + +Currently, it simply queries each the `Pool` and the `Builder` servers to check if they are responding to requests. If yes, Rundler is healthy, else unhealthy. + +| Route | Supported | +| ------ | :-----------: | +| `/health` | ✅ | + +| Status | Code | Message | +| ------ | :-----------: | ---- | +| Healthy | 200 | `ok` | +| Unhealthy | 500 | JSON-RPC formatted error message | + + +## Gas Estimation + +To serve `eth_estimateUserOperationGas` Rundler attempts to estimate gas as accurately as possible, while always erroring to over-estimation. + +### `preVerificationGas` Estimation + +`preVerificationGas` (PVG) is meant to capture any gas that cannot be metred by the entry point during execution. Rundler splits PVG into two separate calculations, static and dynamic. + +To run these calculations Rundler currently assumes a bundle size of 1. + +#### Static + +The static portion of PVG accounts for: + +1. Calldata costs associated with the UO. +2. The UOs portion of shared entry point gas usage. + +This calculation is static as the result should never change for a given UO. + +#### Dynamic + +The dynamic portion of PVG is meant to capture any portion that may change based on network conditions. Currently, its only use is to capture the data availability calldata costs on L2 networks that post their data to a separate network. + +For example, on Arbitrum One transactions are charged extra gas at the very beginning of transaction processing to pay for L1 Ethereum calldata costs. This value can be estimated by calling a precompiled contract on any Arbitrum One node. This value will change based on the current L1 gas fees as well as the current L2 gas fees. Rundler will estimate this value for a bundle of size 1 and set it to the dynamic portion of pvg. + +NOTE: Since the dynamic portion of PVG can change, users on networks that contain dynamic PVG should add a buffer to their PVG estimates in order to ensure that their UOs will be mined when price fluctuates. + +### `verificationGasLimit` Estimation + +To estimate `verificationGasLimit` Rundler uses a binary search to find the minimum gas value where validation succeeds. The procedure follows: + +1. Run an initial attempt at max limit using the gas measurement helper contract. If validation fails here it will never succeed and the UO is rejected. +2. Set the initial guess to the gas used in the initial attempt * 2 to account for the 63/64ths rule. +3. Run the binary search algorithm until the minimum successful gas value and the maximum failure gas value are within 10%. + +This approach allows for minimal `eth_call` requests while providing an accurate gas limit. + +### `callGasLimit` Estimation + +`callGasLimit` estimation is similar to `verificationGasLimit` estimation in that it also uses a binary search. The majority of the binary search, however, is performed in Solidity to limit network calls. + +This scheme requires the use of a spoofed entry point contract via `eth_call` state overrides. The original entry point contract is moved and a proxy is loaded in its place. This allows us to write additional logic to support gas estimation into the entry point contract. + +More information on gas estimation can be found [here](https://www.alchemy.com/blog/erc-4337-gas-estimation). + +## Fee Estimation + +Fee estimation is done by applying the configured [priority fee mode](./builder.md#required-fees) to the estimated network fees. diff --git a/docs/config.md b/docs/cli.md similarity index 79% rename from docs/config.md rename to docs/cli.md index dd04ed5ff..70a7ed511 100644 --- a/docs/config.md +++ b/docs/cli.md @@ -1,4 +1,4 @@ -# RUNDLER CLI +# Rundler CLI The Rundler Command Line Interface (CLI) offers a versatile and configurable User Operation Bundler, equipped with a wide array of options and subcommands tailored to your needs. @@ -9,17 +9,18 @@ The Rundler Command Line Interface (CLI) offers a versatile and configurable Use - `pool`: Runs the Pool server. - `builder`: Runs the Builder server. -The `pool` and `builder` servers will also start a gRPC endpoint to allow other processes to interact with each service +The `pool` and `builder` commands will also start a gRPC endpoint to allow other processes to interact with each service. -## General Options +## Common Options These options are common to all subcommands and can be used globally: -- `--entry_points`: Entry point addresses to target. Provide a comma-separated list. (multiple entry points is currently in beta, we have only tested 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789) +- `--entry_points`: Entry point addresses to target. Provide a comma-separated list. - env: *ENTRY_POINTS* + - (multiple entry points is currently in beta, we only officially support `0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789`) - `--chain_id`: Chain ID to target. (default: `1337`). - env: *CHAIN_ID* -- `--node_http`: ETH Node HTTP URL to connect to. (REQUIRED) +- `--node_http`: ETH Node HTTP URL to connect to. (**REQUIRED**) - env: *NODE_HTTP* - `--max_verification_gas`: Maximum verification gas. (default: `5000000`). - env: *MAX_VERIFICATION_GAS* @@ -29,7 +30,7 @@ These options are common to all subcommands and can be used globally: - env: *MIN_STAKE_VALUE* - `--min_unstake_delay`: Minimum unstake delay. (default: `84600`). - env: *MIN_UNSTAKE_DELAY* -- `--user_operation_event_block_distance`: Number of blocks to search when calling `eth_getUserOperationByHash`. (default: genisis to latest) +- `--user_operation_event_block_distance`: Number of blocks to search when calling `eth_getUserOperationByHash`. (default: genesis to latest) - env: *USER_OPERATION_EVENT_BLOCK_DISTANCE* - `--max_simulate_handle_ops_gas`: Maximum gas for simulating handle operations. (default: `20000000`). - env: *MAX_SIMULATE_HANDLE_OPS_GAS* @@ -52,7 +53,11 @@ These options are common to all subcommands and can be used globally: - `--mempool_config_path`: Path to the mempool configuration file. (example: `mempool-config.json`, `s3://my-bucket/mempool-config.json`) - This path can either be a local file path or an S3 url. If using an S3 url, Make sure your machine has access to this file. - env: *MEMPOOL_CONFIG_PATH* - - [config example](alt-mempools.md) + - See [here](./architecture/pool.md#alternative-mempools-in-preview) for details. +- `--num_builders`: The number of bundle builders to run (default: `1`) + - env: *NUM_BUILDERS* + +### Mempool Configuration ## Metrics Options @@ -86,7 +91,7 @@ List of command line options for configuring the RPC API. - *Only required when running in distributed mode* - `--rpc.api`: Which APIs to expose over the RPC interface (default: `eth,rundler`) - env: *RPC_API* -- `--rpc.timeout_seconds`: Timeout for RPC requests (default: 20) +- `--rpc.timeout_seconds`: Timeout for RPC requests (default: `20`) - env: *RPC_TIMEOUT_SECONDS* - `--rpc.max_connections`: Maximum number of concurrent connections (default: `100`) - env: *RPC_MAX_CONNECTIONS* @@ -95,9 +100,9 @@ List of command line options for configuring the RPC API. - `--rpc.builder_url`: Builder URL for RPC (default: `http://localhost:50052`) - env: *RPC_BUILDER_URL* -## OP Pool Options +## Pool Options -List of command line options for configuring the OP Pool. +List of command line options for configuring the Pool. - `--pool.port`: Port to listen on for gRPC requests (default: `50051`) - env: *POOL_PORT* @@ -105,7 +110,7 @@ List of command line options for configuring the OP Pool. - `--pool.host`: Host to listen on for gRPC requests (default: `127.0.0.1`) - env: *POOL_HOST* - *Only required when running in distributed mode* -- `--pool.max_size_in_bytes`: Maximum size in bytes for the pool (default: `500000000`, 0.5 GB) +- `--pool.max_size_in_bytes`: Maximum size in bytes for the pool (default: `500000000`, `0.5 GB`) - env: *POOL_MAX_SIZE_IN_BYTES* - `--pool.max_userops_per_sender`: Maximum number of user operations per sender (default: `4`) - env: *POOL_MAX_USEROPS_PER_SENDER* @@ -114,13 +119,15 @@ List of command line options for configuring the OP Pool. - `--pool.blocklist_path`: Path to a blocklist file (e.g `blocklist.json`, `s3://my-bucket/blocklist.json`) - env: *POOL_BLOCKLIST_PATH* - This path can either be a local file path or an S3 url. If using an S3 url, Make sure your machine has access to this file. + - See [here](./architecture/pool.md#allowlistblocklist) for details. - `--pool.allowlist_path`: Path to an allowlist file (e.g `allowlist.json`, `s3://my-bucket/allowlist.json`) - env: *POOL_ALLOWLIST_PATH* - This path can either be a local file path or an S3 url. If using an S3 url, Make sure your machine has access to this file. + - See [here](./architecture/pool.md#allowlistblocklist) for details. - `--pool.chain_history_size`: Size of the chain history - env: *POOL_CHAIN_HISTORY_SIZE* -## Builder CLI Options +## Builder Options List of command line options for configuring the Builder. @@ -154,39 +161,19 @@ List of command line options for configuring the Builder. - env: *BUILDER_REPLACEMENT_FEE_PERCENT_INCREASE* - `--builder.max_fee_increases`: Maximum number of fee increases to attempt (Seven increases of 10% is roughly 2x the initial fees) (default: `7`) - env: *BUILDER_MAX_FEE_INCREASES* +- `--builder.bloxroute_auth_header`: If using the bloxroute transaction sender on Polygon, this is the auth header to supply with the requests. (default: None) + - env: `BUILDER_BLOXROUTE_AUTH_HEADER` + - *Only required when using a Bloxroute submit URL on Polygon* +- `--builder.index_offset`: If running multiple builder processes, this is the index offset to assign unique indexes to each bundle sender. (default: 0) + - env: `BUILDER_INDEX_OFFSET` -## Key management +### Key management Private keys for the bundler can be provided in a few ways. You can set the `--builder.private_key` flag or the `BUILDER_PRIVATE_KEY` environment variable -within your local or deployed environment. Alternateley, you can provide the application with one or more AWS KMS ids using the `--builder.aws_kms_key_ids` flag or `AWS_KMS_KEY_IDS` environment +within your local or deployed environment. Alternatively, you can provide the application with one or more AWS KMS ids using the `--builder.aws_kms_key_ids` flag or `AWS_KMS_KEY_IDS` environment variable. Rundler will download the key/s so long as you have `kms:DescribeKey` & `kms:Decrypt` IAM access to the KMS resource. -When using KMS keys, a redis url must be provided to the bundler which will take care of key locking to make sure keys are not accessed at the same time from concurrent processes - -## Example configuration files - -### Pool allowlist path - -``` -export POOL_ALLOWLIST_PATH=blocklist.json -``` - -``` -[ - "0x0000000000000000000000000000000000000000000000000000000000000000" -] -``` -### Pool blocklist path - -``` -export POOL_BLOCKLIST_PATH=blocklist.json -``` - -``` -[ - "0x0000000000000000000000000000000000000000000000000000000000000000" -] -``` +When using KMS keys, a Redis URL must be provided to Rundler which will take care of key leasing to make sure keys are not accessed at the same time from concurrent processes. ## Example Usage @@ -194,10 +181,11 @@ Here are some example commands to use the CLI: ```sh # Run the Node subcommand with custom options -$ ./app --entry_points 0x0000000000000000000000000000000000000000 --chain_id 1337 --max_verification_gas 10000000 node +$ ./rundler node --entry_points 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 --chain_id 1337 --max_verification_gas 10000000 -# Run the Rpc subcommand with custom options and enable JSON logging. The builder and pool will need to be running before this starts. -$ ./app --node_http http://localhost:8545 --log.json rpc +# Run the RPC subcommand with custom options and enable JSON logging. The builder and pool will need to be running before this starts. +$ ./rundler rpc --node_http http://localhost:8545 --log.json # Run the Pool subcommand with custom options and specify a mempool config file -$ ./app --max_simulate_handle_ops_gas=15000000 --mempool_config_path=mempool.json --node_http http://localhost:8545 --chain_id=8453 pool \ No newline at end of file +$ ./rundler pool --max_simulate_handle_ops_gas 15000000 --mempool_config_path mempool.json --node_http http://localhost:8545 --chain_id 8453 +``` \ No newline at end of file diff --git a/docs/developing.md b/docs/developing.md new file mode 100644 index 000000000..4872cd407 --- /dev/null +++ b/docs/developing.md @@ -0,0 +1,100 @@ +# Developing + +## Setup + +1. Clone the repo and checkout submodules + +``` +git clone https://github.com/OMGWINNING/rundler +cd rundler +git submodule update --init --recursive +``` + +2. Install prerequisites + +* [Rust/Cargo](https://www.rust-lang.org/tools/install) 1.72 or higher with nightly +* [Cocogitto](https://github.com/cocogitto/cocogitto) for commit linting +* [Docker](https://docs.docker.com/engine/install/) +* [PDM](https://pdm.fming.dev/latest/#installation) +* [Protoc](https://grpc.io/docs/protoc-installation/) +* [Foundry](https://book.getfoundry.sh/getting-started/installation) +* [Buf](https://buf.build/docs/installation) + +## Build & Test + +Rundler contains a `Makefile` to simplify common build/test commands + +``` +# build rundler +$ make build + +# run unit tests +$ make test-unit + +# run all tests +$ make test + +``` + +## Running Locally + +Rundler requires an RPC end that supports `debug_traceCall` to be running. A simple way to do that is to use docker compose to run Geth with the following configuration: + +``` +version: "3.8" + +services: + geth: + image: ethereum/client-go:v1.10.26 + ports: + - "8545:8545" + - "8546:8546" + command: + - --miner.gaslimit=12000000 + - --http + - --http.api=personal,eth,net,web3,debug + - --http.vhosts=* + - --http.addr=0.0.0.0 + - --ws + - --ws.api=personal,eth,net,web3,debug + - --ws.addr=0.0.0.0 + - --ignore-legacy-receipts + - --allow-insecure-unlock + - --rpc.allow-unprotected-txs + - --dev + - --verbosity=2 + - --nodiscover + - --maxpeers=0 + - --mine + - --miner.threads=1 + - --networkid=1337 + +``` + +Create a `.env` file and fill in any required [configs](./cli.md). + +Then: + +``` +cargo run node +``` + +will run a full Rundler node locally. + +## Dev Tools + +Development tools can be found in [`bin/tools`](../bin/tools/). These tools are meant to help get Rundler running locally against a development network. + +### Deploy Dev Contracts + +Fund and deploy contracts. Contracts are deployed from the [account-abstraction](https://github.com/eth-infinitism/account-abstraction) repo. This does the following: + * Creates an account for the bundler to use. + * Deploys the `EntryPoint`. + * Deploys a `SimpleAccountFactory`. + * Deploys a `VerifyingPaymaster`. + * Deploys a `SimpleAccount`. + * Funds each of the accounts. +``` +cd bin/tools +cargo run --bin deploy_dev_contracts +``` diff --git a/docs/docker.md b/docs/docker.md new file mode 100644 index 000000000..f0d7051dd --- /dev/null +++ b/docs/docker.md @@ -0,0 +1,13 @@ +# Docker + +## Build + +To build the Docker container: + +``` +docker buildx build . -t rundler +``` + +## Run + +An example docker-compose configuration running Rundler in its distributed mode can be found [here](../test/spec-tests/remote/docker-compose.yml). diff --git a/docs/images/multiimage.png b/docs/images/multiimage.png deleted file mode 100644 index 847c5b11b3b3e4b420235733306b6a2dd66923ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45078 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

qWn#|bpjWRyfZe4TiGq!6 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