Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
forked froma16z/helios

A fast, secure, and portable light client for Ethereum

License

NotificationsYou must be signed in to change notification settings

qiweiii/helios

 
 

Repository files navigation

buildlicense: MITchat

Helios is a fully trustless, efficient, and portable Ethereum light client written in Rust.

Helios converts an untrusted centralized RPC endpoint into a safe unmanipulable local RPC for its users. It syncs in seconds, requires no storage, and is lightweight enough to run on mobile devices.

Helios has a small binary size and compiles into WebAssembly. This makes it a perfect target to embed directly inside wallets and dapps.

Installing

First installheliosup, Helios's installer:

curl https://raw.githubusercontent.com/a16z/helios/master/heliosup/install | bash

To install Helios, runheliosup.

Usage

To run Helios, run the below command, replacing$ETH_RPC_URL with an RPC provider URL such as Alchemy:

helios --execution-rpc $ETH_RPC_URL

$ETH_RPC_URL must be asupported Ethereum Execution API Provider that provides theeth_getProof endpoint. Infura does not currently support this. We recommend using Alchemy.

Helios will now run a local RPC server athttp://127.0.0.1:8545.

Helios also provides documentation of its supported RPC methods in therpc.md file.

Warning

Helios is still experimental software. While we hope you try it out, we do not suggest adding it as your main RPC in wallets yet. Sending high-value transactions from a wallet connected to Helios is discouraged.

Additional CLI Options

--consensus-rpc or-c can be used to set a custom consensus layer rpc endpoint. This must be a consensus node that supports the light client beaconchain api. We recommend using Nimbus for this. If no consensus rpc is supplied, it defaults tohttps://www.lightclientdata.org which is run by us.

--checkpoint or-w can be used to set a custom weak subjectivity checkpoint. This must be equal to the first beacon block hash of an epoch. Weak subjectivity checkpoints are the root of trust in the system. If this is set to a malicious value, an attacker can cause the client to sync to the wrong chain. Helios sets a default value initially, then caches the most recent finalized block it has seen for later use.

--network or-n sets the network to sync to. Current valid options aremainnet andgoerli, however users can add custom networks in their configuration files.

--rpc-port or-p sets the port that the local RPC should run on. The default value is8545.

--data-dir or-d sets the directory that Helios should use to store cached weak subjectivity checkpoints in. Each network only stores the latest checkpoint, which is just 32 bytes.

--fallback or-f sets the checkpoint fallback url (a string). This is only used if the checkpoint provided by the--checkpoint flag is too outdated for Helios to use to sync.If none is provided and the--load-external-fallback flag is not set, Helios will error.For example, you can specify the fallback like so:helios --fallback "https://sync-mainnet.beaconcha.in" (or using shorthand like so:helios -f "https://sync-mainnet.beaconcha.in")

--load-external-fallback or-l enables weak subjectivity checkpoint fallback (no value needed).For example, say you set a checkpoint value that is too outdated and Helios cannot sync to it.If this flag is set, Helios will query all network apis in the community-maintained listatethpandaops/checkpoint-synz-health-checks for their latest slots.The list of slots is filtered for healthy apis and the most frequent checkpoint occurring in the latest epoch will be returned.Note: this is a community-maintained list and thus no security guarantees are provided. Use this as a last resort if your checkpoint passed into--checkpoint fails.This is not recommended as malicious checkpoints can be returned from the listed apis, even if they are consideredhealthy.This can be run like so:helios --load-external-fallback (orhelios -l with the shorthand).

--strict-checkpoint-age or-s enables strict checkpoint age checking. If the checkpoint is over two weeks old and this flag is enabled, Helios will error. Without this flag, Helios will instead surface a warning to the user and continue. If the checkpoint is greater than two weeks old, there are theoretical attacks that can cause Helios and over light clients to sync incorrectly. These attacks are complex and expensive, so Helios disables this by default.

--help or-h prints the help message.

Configuration Files

All configuration options can be set on a per-network level in~/.helios/helios.toml. Here is an example config file:

[mainnet]consensus_rpc ="https://www.lightclientdata.org"execution_rpc ="https://eth-mainnet.g.alchemy.com/v2/XXXXX"checkpoint ="0x85e6151a246e8fdba36db27a0c7678a575346272fe978c9281e13a8b26cdfa68"[goerli]consensus_rpc ="http://testing.prater.beacon-api.nimbus.team"execution_rpc ="https://eth-goerli.g.alchemy.com/v2/XXXXX"checkpoint ="0xb5c375696913865d7c0e166d87bc7c772b6210dc9edf149f4c7ddc6da0dd4495"

A comprehensive breakdown of config options is available in theconfig.md file.

Using Helios as a Library

Helios can be imported into any Rust project.

use std::{str::FromStr, env};use helios::{client::ClientBuilder, config::networks::Network, types::BlockTag};use ethers::{types::Address, utils};use eyre::Result;#[tokio::main]asyncfnmain() ->Result<()>{let untrusted_rpc_url = env::var("UNTRUSTED_RPC_URL")?;letmut client =ClientBuilder::new().network(Network::MAINNET).consensus_rpc("https://www.lightclientdata.org").execution_rpc(&untrusted_rpc_url).build()?;    client.start().await?;let head_block_num = client.get_block_number().await?;let addr =Address::from_str("0x00000000219ab540356cBB839Cbe05303d7705Fa")?;let block =BlockTag::Latest;let balance = client.get_balance(&addr, block).await?;println!("synced up to block: {}", head_block_num);println!("balance of deposit contract: {}", utils::format_ether(balance));Ok(())}

Below we demonstrate fetching checkpoints from the community-maintained list of checkpoint sync apis maintained byethPandaOps.

Warning

This is a community-maintained list and thus no security guarantees are provided. Attacks on your light client can occur if malicious checkpoints are set in the list. Please use the explicitcheckpoint flag, environment variable, or config setting with an updated, and verified checkpoint.

use eyre::Result;use helios::config::{checkpoints, networks};#[tokio::main]asyncfnmain() ->Result<()>{// Construct the checkpoint fallback serviceslet cf = checkpoints::CheckpointFallback::new().build().await.unwrap();// Fetch the latest goerli checkpointlet goerli_checkpoint = cf.fetch_latest_checkpoint(&networks::Network::GOERLI).await.unwrap();println!("Fetched latest goerli checkpoint: {}", goerli_checkpoint);// Fetch the latest mainnet checkpointlet mainnet_checkpoint = cf.fetch_latest_checkpoint(&networks::Network::MAINNET).await.unwrap();println!("Fetched latest mainnet checkpoint: {}", mainnet_checkpoint);Ok(())}

Supported Ethereum Execution API Providers

Ethereum Execution API provider JSON RPC endpoints used must support theeth_getProof endpoint.Alchemy provides private endpoints that support theeth_getProof endpointhttps://docs.alchemy.com/reference/eth-getproof but require you to obtain API keys. Alternatively,All That Node provides public JSON RPC endpoints that are rate limited and are not intended for dApp building. JSON RPC endpoints including associated API Keys if required should be added to your .env file.

For example, the following cURL request should return a response{"jsonrpc":"2.0","id":1,"result":{...}} to demonstrate that the All That Node public JSON RPC endpoints on the Ethereum Goerli network and Mainnet support theeth_getProof endpoint.

curl https://ethereum-goerli-rpc.allthatnode.com \-X POST \-H"Content-Type: application/json" \-d'{"jsonrpc":"2.0","method":"eth_getProof","params":["0x7F0d15C7FAae65896648C8273B6d7E43f58Fa842",["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"],"latest"],"id":1}'
curl https://ethereum-mainnet-rpc.allthatnode.com \-X POST \-H"Content-Type: application/json" \-d'{"jsonrpc":"2.0","method":"eth_getProof","params":["0x7F0d15C7FAae65896648C8273B6d7E43f58Fa842",["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"],"latest"],"id":1}'

Supported Checkpoints

A checkpoint is a Beacon Chain Consensus Layer block hash rather than a Execution Layer block hash. An example of an Execution Layer block hash for Goerli is shown athttps://goerli.etherscan.io/blocks

Checkpoints may be obtained from the following links:

It is recommended to use a block hash as a checkpoint that is less than two weeks old, however you can actually use older checkpoints and it will still work but will give you a warning. Using a checkpoint that is less than two weeks old prevents a few attacks that are pretty hard to pull off.

For example, to obtain a recent checkpoint for Goerli Testnet go tohttps://prater.beaconcha.in/ and get the block hash of the first block in any finalised epoch. At the time of writing, thefirst block hash in epoch 197110 is theoldest slot 6307520 that has a Block Root of 0x7beab8f82587b1e9f2079beddebde49c2ed5c0da4ce86ea22de6a6b2dc7aa86b and is the latest checkpoint value to use.

This latest checkpoint may be provided as anAdditional CLI Option at the command line to run a Helios Light Client node on Ethereum Goerli Testnet:

helios \    --network goerli \    --consensus-rpc http://testing.prater.beacon-api.nimbus.team \    --execution-rpc https://ethereum-goerli-rpc.allthatnode.com \    --checkpoint 0x7beab8f82587b1e9f2079beddebde49c2ed5c0da4ce86ea22de6a6b2dc7aa86b

For example, to obtain a recent checkpoint for Ethereum Mainnet go tohttps://beaconcha.in and get the block hash of the first block in any finalised epoch. At the time of writing thefirst block hash in epoch 222705 is theoldest slot 7126560 that has a Block Root of 0xe1912ca8ca3b45dac497cae7825bab055b0f60285533721b046e8fefb5b076f2 and is the latest checkpoint value to use.

This latest checkpoint may be provided as anAdditional CLI Option at the command line to run a Helios Light Client node on Ethereum Mainnet:

helios \    --network mainnet \    --consensus-rpc https://www.lightclientdata.org \    --execution-rpc https://ethereum-mainnet-rpc.allthatnode.com \    --checkpoint 0xe1912ca8ca3b45dac497cae7825bab055b0f60285533721b046e8fefb5b076f2

If you wish to use aConfiguration File instead of CLI arguments then you should replace the example checkpoints in the configuration file with the latest checkpoints obtained above.

Warning

Some configuration file values are not yet being interpreted. Seea16z#261

If a provide checkpoint fails the fallback would normally kick in and automatically fetch a better checkpoint if that feature is working.

Architecture

graph LRClient ----> RpcClient ----> NodeNode ----> ConsensusClientNode ----> ExecutionClientExecutionClient ----> ExecutionRpcConsensusClient ----> ConsensusRpcNode ----> EvmEvm ----> ExecutionClientExecutionRpc --> UntrustedExecutionRpcConsensusRpc --> UntrustedConsensusRpcclassDef node fill:#f9f,stroke:#333,stroke-width:4px, color:black;class Node,Client nodeclassDef execution fill:#f0f,stroke:#333,stroke-width:4px;class ExecutionClient,ExecutionRpc executionclassDef consensus fill:#ff0,stroke:#333,stroke-width:4px;class ConsensusClient,ConsensusRpc consensusclassDef evm fill:#0ff,stroke:#333,stroke-width:4px;class Evm evmclassDef providerC fill:#ffcclass UntrustedConsensusRpc providerCclassDef providerE fill:#fbfclass UntrustedExecutionRpc providerEclassDef rpc fill:#e10class Rpc rpcsubgraph "External Network"UntrustedExecutionRpcUntrustedConsensusRpcend
Loading

Testing

To ensure that Helios works as expected, we have a comprehensive test suite that you can run. Before running the tests, make sure to create a.env file in the root of the project directory. You can copy the contents of the.env.example file and fill in your own secrets.

cp .env.example .env

To run all tests, use the following command:

cargo test-all

To run tests for an individual package, use this command, replacing with the package you want to test:

cargotest -p<package-name>

Benchmarks

Benchmarks are defined in thebenches subdirectory. They are built using thecriterion statistics-driven benchmarking library.

To run all benchmarks, you can usecargo bench. To run a specific benchmark, you can usecargo bench --bench <name>, where<name> is one of the benchmarks defined in theCargo.toml file under a[[bench]] section.

To learn more abouthelios benchmarking and to view benchmark flamegraphs, view thebenchmark readme.

Contributing

All contributions to Helios are welcome. Before opening a PR, please submit an issue detailing the bug or feature. When opening a PR, please ensure that your contribution builds, has been linted withcargo fmt, and contains tests when applicable.

Telegram

If you are having trouble with Helios or are considering contributing, feel free to join our telegramhere.

Disclaimer

This code is being provided as is. No guarantee, representation or warranty is being made, express or implied, as to the safety or correctness of the code. It has not been audited and as such there can be no assurance it will work as intended, and users may experience delays, failures, errors, omissions or loss of transmitted information. Nothing in this repo should be construed as investment advice or legal advice for any particular facts or circumstances and is not meant to replace competent counsel. It is strongly advised for you to contact a reputable attorney in your jurisdiction for any questions or concerns with respect thereto. a16z is not liable for any use of the foregoing, and users should proceed with caution and use at their own risk. See a16z.com/disclosures for more info.

About

A fast, secure, and portable light client for Ethereum

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust96.6%
  • TypeScript1.5%
  • Shell1.3%
  • Other0.6%

[8]ページ先頭

©2009-2025 Movatter.jp