base on Reth AlphaNet is a testnet OP Stack-compatible rollup aimed at enabling experimentation of bleeding edge Ethereum Research. # alphanet
<!-- [![Crates.io][crates-badge]][crates-io] -->
<!-- [![Downloads][downloads-badge]][crates-io] -->
[![MIT License][mit-badge]][mit-url]
[![Apache-2.0 License][apache-badge]][apache-url]
[![CI Status][actions-badge]][actions-url]
> [!IMPORTANT]
> This repo has been moved to [Odyssey](https://github.com/ithacaxyz/odyssey) and is no longer being maintained.
## What is Reth AlphaNet?
Reth AlphaNet is a testnet OP Stack rollup aimed at enabling experimentation of bleeding edge Ethereum Research.
AlphaNet is __not__ a fork of reth.
AlphaNet implements traits provided by the [reth node builder API](https://paradigmxyz.github.io/reth/docs/reth_node_builder/index.html), allowing implementation of precompiles and instructions of experimental EIPs without forking the node.
Specifically, AlphaNet currently implements the following EIPs:
- [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702): Set EOA account code.
- [EIP-7212](https://eips.ethereum.org/EIPS/eip-7212): Precompile for secp256r1 curve support.
- [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537): Precompiles for BLS12-381 curve operations.
AlphaNet also implements the EIPs for EOF, or [The EVM Object Format](https://evmobjectformat.org/).
### Why AlphaNet?
AlphaNet has 2 goals:
1. Showcase Reth's performance at the extremes. We intend to launch a hosted version of AlphaNet on [Conduit](https://conduit.xyz/), targeting 50mgas/s, and eventually ramping up to 1ggas/s and beyond. In the process we hope to hit the state growth performance bottleneck, and discover ways to solve it. If our hosted chains end up getting too big, we may possibly restart the experiment from zero, and try again.
2. Showcase how Reth's modular architecture can serve as a distribution channel for research ideas. Specifically,
AlphaNet's node extensions were chosen for their ability to enable applications that enhance the onchain user experience, and
drastically reduce cost for existing applications that improve UX.
### AlphaNet Local Development
AlphaNet does not yet have a running testnet, but can be run locally for development and testing purposes. To do this, the binary can be run with the `--dev` flag, which will start the node with a development configuration.
First, alphanet should be built locally:
```bash
git clone https://github.com/paradigmxyz/alphanet
cd alphanet
cargo install --path bin/alphanet
```
```bash
alphanet node --chain etc/alphanet-genesis.json --dev --http --http.api all
```
This will start the node with a development configuration, and expose the HTTP API on `http://localhost:8545`.
To use EOF-enabled foundry, use [forge-eof](https://github.com/paradigmxyz/forge-eof) and follow installation instructions.
### Running AlphaNet
> [!WARNING]
>
> AlphaNet does not yet have a running testnet, please use the local development instructions above!
Running AlphaNet will require running additional infrastructure for the archival L1 node. These instructions are a guide for
running the AlphaNet OP-stack node only.
For instructions on running the full AlphaNet OP stack, including the L1 node, see the [Reth book section on running the OP stack](https://paradigmxyz.github.io/reth/run/optimism.html), using the `alphanet` binary instead of `op-reth`.
#### Running the alphanet execution node
To run AlphaNet from source, clone the repository and run the following commands:
```bash
git clone https://github.com/paradigmxyz/alphanet.git
cd alphanet
cargo install --path bin/alphanet
alphanet node
--chain etc/alphanet-genesis.json \
--rollup.sequencer-http <TODO> \
--http \
--ws \
--authrpc.port 9551 \
--authrpc.jwtsecret /path/to/jwt.hex
```
#### Running op-node with the alphanet configuration
Once `alphanet` is started, [`op-node`](https://github.com/ethereum-optimism/optimism/tree/develop/op-node) can be run with the
included `alphanet-rollup.json`:
```bash
cd alphanet/
op-node \
--rollup.config ./etc/alphanet-rollup.json \
--l1=<your-sepolia-L1-rpc> \
--l2=http://localhost:9551 \
--l2.jwt-secret=/path/to/jwt.hex \
--rpc.addr=0.0.0.0 \
--rpc.port=7000 \
--l1.trustrpc
```
### Running AlphaNet with Kurtosis
Running a local network with a full AlphaNet OP stack with Kurtosis requires some extra setup, since AlphaNet uses a forked version of `op-node`.
To get started, follow [these instructions](https://docs.kurtosis.com/install/) to install Kurtosis.
Next, clone and build the modified `optimism-contract-deployer` image:
```bash
git clone
[email protected]:paradigmxyz/optimism-package.git
cd optimism-package
git switch alphanet
docker build . -t ethpandaops/optimism-contract-deployer:latest --progress plain
```
> [!NOTE]
>
> The image may fail to build if you have not allocated enough memory for Docker.
Finally, run start a Kurtosis enclave (ensure you are still in `optimism-package`):
```bash
kurtosis run --enclave op-devnet github.com/paradigmxyz/optimism-package@alphanet \
--args-file https://raw.githubusercontent.com/paradigmxyz/alphanet/main/etc/kurtosis.yaml
```
This will start an enclave named `op-devnet`. You can tear down the enclave with `kurtosis enclave rm --force op-devnet`, or tear down all enclaves using `kurtosis clean -a`.
> [!NOTE]
>
> If you want to use a custom build of AlphaNet, simply build an AlphaNet image with `docker build . -t ghcr.io/paradigmxyz/alphanet:latest`.
Consult the [Kurtosis OP package](https://github.com/ethpandaops/optimism-package) repository for instructions on how to adjust the args file to spin up additional services, like a block exporer.
### Security
See [SECURITY.md](SECURITY.md).
#### License
<sup>
Licensed under either of <a href="LICENSE-APACHE">Apache License, Version
2.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option.
</sup>
<br>
<sub>
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in these crates by you, as defined in the Apache-2.0 license,
shall be dual licensed as above, without any additional terms or conditions.
</sub>
<!-- [crates-badge]: https://img.shields.io/crates/v/alphanet.svg -->
<!-- [crates-io]: https://crates.io/crates/alphanet -->
<!-- [downloads-badge]: https://img.shields.io/crates/d/alphanet -->
[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
[apache-badge]: https://img.shields.io/badge/license-Apache--2.0-blue.svg
[mit-url]: LICENSE-MIT
[apache-url]: LICENSE-APACHE
[actions-badge]: https://github.com/paradigmxyz/alphanet/workflows/unit/badge.svg
[actions-url]: https://github.com/paradigmxyz/alphanet/actions?query=workflow%3ACI+branch%3Amain
[foundry-alphanet]: https://github.com/paradigmxyz/foundry-alphanet
", Assign "at most 3 tags" to the expected json: {"id":"9359","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"