2 releases

0.4.0-dev.2 Apr 17, 2024
0.4.0-dev.1 Apr 4, 2024

#1079 in Magic Beans

Download history 64/week @ 2024-03-30 3009/week @ 2024-04-06 3387/week @ 2024-04-13 2590/week @ 2024-04-20

9,050 downloads per month

Custom license

355KB
1.5K SLoC

:toc: :toclevels: 4 [pass] ++++

++++ # Papyrus A Starknet full node

Papyrus logo,200,200, align="center"

link:Report a Bug · link:Request a Feature · link:Ask a Question

Github workflow status #LICENSE,title=Project license PRs welcome,link=https://github.com/starkware-libs/papyrus/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22 codecov,link=https://codecov.io/gh/starkware-libs/papyrus [pass] ++++

++++

About

Papyrus is a Starknet full node implemented in Rust. Papyrus tracks Starknet’s state as it evolves over time, and enables you to query this state and to execute transactions via Starknet’s JSON-RPC.

Supported Starknet versions

This Papyrus version supports the following starknet versions:

  • v0.13.0

Disclaimer

Papyrus is a work in progress.

Use it at your own risk.

Getting started

[#compiling-and-running-papyrus]

Building and running Papyrus locally

[discrete]

Prerequisites

  • Rust must be installed.
  • You must have access to an Ethereum node. For example, you can use a node provider such as Infura.

[discrete]

Procedure

. Fork and clone the Github repo. . Build and run a Papyrus node with the default configuration by running the following commands: + [source,bash]

mkdir data cargo run --release --package papyrus_node --bin papyrus_node -- --base_layer.node_url <ethereum_node_url>

[NOTE]

Papyrus uses the data directory for the node's storage, as follows:

./data/<chain_id>

You can configure the directory name using the storage.db_config.path_prefix configuration parameter.

. See the version of Papyrus by running the following command: + [source,bash]

cargo run --release --package papyrus_node --bin papyrus_node -- --version

Local node configuration

The configuration is stored in one or more configuration files in .json format.

The default Papyrus configuration file, link:default_config.json, includes descriptions of all available parameters.

// , including pointers to common values and #is_none flags for optional parameters.

Customizing your configuration

You can override the default configuration in the following ways:

  • Refer to one or more custom configuration files, using the same format as the default configuration file, default_config.json. For example, see any of the preset configuration files in this repository at /config/presets/. You can use configuration files when running a local node only, not a Docker image.
  • Include configuration options in the command line when you run Papyrus.
  • Set environment variables in the command line when you run Papyrus.

Configuration files (local node only)

The following rules apply:

  • You do not need to specify the default configuration file.
  • There is no limit on the number of custom configuration files you use.
  • If the same configuration parameter appears in multiple configuration files, the last file in the list determines the value.

You can create separate configuration files to override specific configuration parameters.

To create a custom configuration file, create a .json file using the same format as the default configuration file.

To specify custom configuration files, include the --config_file command-line option when you run the full node locally, as follows:

[source,bash,subs="verbatim,quotes"]

cargo run --release --package papyrus_node --bin papyrus_node -- --base_layer.node_url <ethereum_node_url> --config-file <path_to_custom_configuration_file_1> <path_to_custom_configuration_file___n__>

For example, preset .json files for several Starknet networks are located in this repository at /config/presets. To use Goerli testnet, you need to override the default values by using the file /config/presets/testnet1.json, as follows:

[source,bash,subs="verbatim,quotes"]

cargo run --release --package papyrus_node --bin papyrus_node -- --base_layer.node_url <ethereum_node_url> --config-file /config/presets/testnet1.json

Configuration via the command-line (local node and Docker image)

You can specify configuration parameters as command-line options. To see all available configuration parameters, enter the following command:

[source,bash]

cargo run --release --package papyrus_node --bin papyrus_node -- --help

For example, to use Goerli testnet, run the following command:

[source,base,subs="verbatim,quotes"]

cargo run --release --package papyrus_node --bin papyrus_node -- --base_layer.node_url <ethereum_node_url> \
--central.url https://alpha4.starknet.io/ \
--chain_id SN_GOERLI \
--rpc.starknet_url https://alpha4.starknet.io/ \
--base_layer.starknet_contract_address 0xde29d060D45901Fb19ED6C6e959EB22d8626708e

For more information, see the papyrus-config README.

Running Papyrus with Docker

[discrete]

Prerequisites

[discrete]

Procedure

. Make a local directory to use for the container’s data. You only need to complete this step the first time you run Papyrus. + [source,bash]

mkdir <local-host-data-path>

. Run a Papyrus node with the default configuration. You must explicitly give the container write access to the <local-host-data-path> directory by adding --user "$(id -u):$(id -g)" to the docker run command. + Enter the following command: + [source,bash]

docker run --rm --name papyrus\
  -p 8080-8081:8080-8081 \
  -v /<local-host-data-path>:/app/data \
  ghcr.io/starkware-libs/papyrus:dev \
  --base_layer.node_url <ethereum_node_url> \
  --user "$(id -u):$(id -g)"

[NOTE]

You must include the dev, tag which tracks the development branch and contains the most up-to-date code. When an official release is available, you can use the latest tag for the latest release.

Upgrading the Docker container

Currently, there is no automatic upgrade mechanism. Make sure to periodically pull the latest image and re-run the node.

Docker container memory usage

The Papyrus node uses all available RAM in order to cache the storage.

If no other applications are running on your machine, this is the recommended configuration.

Otherwise, you can limit the node's memory usage by adding the --memory flag to run the node in a container with limited memory. Be aware that limiting the memory usage might make the node less efficient, as doing so decreases storage caching.

For example, to limit memory usage to 1GB, run the container with the following command:

[source,bash]

docker run --rm --name papyrus\
  -p 8080-8081:8080-8081 \
  -v /<local-host-data-path>:/app/data \
  --memory 1g
  ghcr.io/starkware-libs/papyrus:dev \
  --base_layer.node_url <ethereum_node_url> \
  --user "$(id -u):$(id -g)"

For more information, see Limit a container's access to memory in the Docker documentation.

Sending API requests to the node

When sending API requests, send them to the path /rpc/<starknet-rpc-version-id>.

Where <starknet-rpc-version-id> is one of the following strings:

  • v0_4
  • v0_5
  • v0_6

See the API specification at the Starknet specifications repository on Github. You can send API requests using the following command:

[source,bash]

curl --location '<node_path>/rpc/<starknet-rpc-version-id>' --header 'Content-Type: application/json'\
 --data '\{"jsonrpc":"2.0","id":0,"method":"<method>", "params": "<params>"}'

For example, to send a request calling the starknet_getBlockTransactionCount method, on block number 100000, using the 0.4.0 version of the API where <node_path> is localhost:8080, use the following command:

[source,bash]

curl --location 'localhost:8080/rpc/v0_4_0' --header 'Content-Type: application/json'\
 --data '\{"jsonrpc":"2.0","id":0,"method":"starknet_getBlockTransactionCount", "params": [{"block_number": 100000}] }'

JSON RPC API endpoints

[cols=",,,",] |=== |Endpoint |V0.4 |V0.5 |V0.6

|starknet_addDeclareTransaction |image,width=15,height=14(https://lh7-us.googleusercontent.com/g1om8QyIrLsSpgSiQ32w-Uk4ICU03_JeFYNwz8N9BfTviIMCN0DwKGGP_bDpX7pv_StNK9yWMQ39lZdNHn1o7xzcrBu1s0WHLAaBD2-nPqhMDGf2l9K6c67oIRV0kmIAQk580wcKhRSGpbj9qF1SVoQ) |image,width=15,height=14 |starknet_addDeployAccountTransaction |image,width=15,height=14(https://lh7-us.googleusercontent.com/B8OBZj3cblLUKbV6nRAmqPjzo86hmhw5XFBxYI8Xj1ZOpY6YoA3l-jiD2INst0aVVu7vsw3XBooNWfy-KulRi2ugDDG2XZpllKizcWDOqCC5uObph-RZWe4JGXbGu110oYtOoKYnRMtMOrl6I3Wz47s) |image,width=15,height=14 |starknet_addInvokeTransaction |image,width=15,height=14(https://lh7-us.googleusercontent.com/-nCpIHRsN1sdvLKLMnROTpIVe47WJVzvriYawbDkMq_vEU_9-4LMkDE50du4Kt3ldKsoo0dQ75vEiS6vdRCNZKZEMFfpMNL3kwEalFIr6xTuunGecGT5uixtyQPXKKV60fbgihWsM8UWJ9o6U214XyQ) |image,width=15,height=14 |starknet_blockHashAndNumber |image,width=15,height=14(https://lh7-us.googleusercontent.com/EoO9RVXThPQiY_jembL_X79RNAbVBKS8uPFm3B6825BtCaH8OGjUtQoaLHXFsNWPAgDL3LW3qqPzCY8PBpx4FYxP2CeEA1-d5xR1zFnC4l4xEdWX3iyvLDANfD4jrpixnlWJJnLCINUYf_aOOx4rKi8) |image,width=15,height=14 |starknet_blockNumber |image,width=15,height=14(https://lh7-us.googleusercontent.com/lRvXpP6e55IY8f_ABJgiWIl7KXw8tSmscatVsdr-mJmUjYdb1EnPTRCL6Nzf9Z3B2HKJRAYALr1Ky3sT94UaTdDeOOBoU2S78hx7XssJTx1tfmsYFjy1X4eugRr7UkewcL5cEkvlM0wBaIweobOzqwM) |image,width=15,height=14 |starknet_call |image,width=15,height=14(https://lh7-us.googleusercontent.com/AMJELrIrqfmtu1peFMSAp_8fwbEq0ii2oQ8WmCQCsashQtXBXzjB_xX0_ULCAkub-pyuXhgzESbuFo4MBp_TAL7jOdls16wT5iPvAY66z64dC41eY2RsgpfU75W9FbSaoWW02OgKwR74mb9w0oOyhfI) |image,width=15,height=14 |starknet_chainId |image,width=15,height=14(https://lh7-us.googleusercontent.com/XAAffcKlc1YqokxRhj5IP9omLNCXVlZu__OeF1sMpD2Am4FHcqF6kZgxw3nd7VAl5dtoRAdqpFqZl49VID6FPZF5dYwYUxGALu4cFE5IhlErvEwvbygrLBmbS3LlCeoAXVc7tznIiBh3qIEDj38cMOU) |image,width=15,height=14 |starknet_estimateFee |image,width=15,height=14(https://lh7-us.googleusercontent.com/M0LxIZ_Hc3i586qUusRF1ajKBJy7pfGkFjyXPoJJjkqo3ZuDQSoeg5Xeq2hZmEf8i3cQIryS-QutIYh91yrX096YMKFhtXLpUxNha1oMAlXqDdYZsWYAsIaQr413Ckwzt3xdS4XqG7wpFCMwNLHsyC0) |image,width=15,height=14 |starknet_estimateMessageFee |image,width=15,height=14(https://lh7-us.googleusercontent.com/M0LxIZ_Hc3i586qUusRF1ajKBJy7pfGkFjyXPoJJjkqo3ZuDQSoeg5Xeq2hZmEf8i3cQIryS-QutIYh91yrX096YMKFhtXLpUxNha1oMAlXqDdYZsWYAsIaQr413Ckwzt3xdS4XqG7wpFCMwNLHsyC0) |image,width=15,height=14 |starknet_getBlockTransactionCount |image,width=15,height=14(https://lh7-us.googleusercontent.com/Il18PreRk3nlngA_130hPf-R8hzEAYpKAMkGOHJ3n1cH85L_0xa3YMrBMW8YisJmOfypRz_JKxwAYAr4ecg2SxnWfwO4QU7lNdj9qvna8y3zVf2tdr1p2YobgOWMgjzOfIqk3lUoxm4HkcXM6-5Ypeo) |image,width=15,height=14 |starknet_getBlockWithTxHashes |image,width=15,height=14(https://lh7-us.googleusercontent.com/sMIa3FRJlsY44FxGMxPeg_Q2L_ZkLlT70YWQiUkmAx9MNgbroWfKecSbOB0Av8zFRGlJgXgq7aqUO2vlbeRZPVCnTSgvBq4VJ5Q5qY6wctp0v31YTtfR0swzUQG9cywGaSwRGK2pTGZ2OYgEpnyert0) |image,width=15,height=14 |starknet_getBlockWithTxs |image,width=15,height=14(https://lh7-us.googleusercontent.com/CdJSJ7lBUFFxh9YRlqjytjaYIU377ptXJbaR5y2nPkOPDrzrMglNRFa0tx7D9QqsuKL6kg0H7QhunQ5jqCfneivgsUE0cGXgpFOcGUiEc3gMCnks_nDCHArqROTXCZNQ1jP1AL3pVXkBWAw9fWhP8pY) |image,width=15,height=14 |starknet_getClass |image,width=15,height=14(https://lh7-us.googleusercontent.com/b2BV-hTooxxqooQv3OHOPsuLNnUP6ct1cD42QCjcEdTdlEb6AcODsbwV-UkQeNOcD4K4vf8_H9QsbWg8K2Ruofqn5mh6Bhd8N7X2Un_xgE1DUM1AcMUn9ZYtq8sNCvxcU6Dpix6_4qTvdSb-4RgogM4) |image,width=15,height=14 |starknet_getClassAt |image,width=15,height=14(https://lh7-us.googleusercontent.com/VhcZNCbRWBMAanu1b8XSIV9pFPYS2ngcfuZs2x-83kWGV9FJJnZ7rfaw_9BV0_OPFsikPRsVnftW0r6m3KGKsGOwGfWksqPmernCaZMmXNaGAX2PeA0tfe_CcLjQLHmutXoTZDpWGKr0vue478bcs9g) |image,width=15,height=14 |starknet_getClassHashAt |image,width=15,height=14(https://lh7-us.googleusercontent.com/LMl0fT2HvMIWHgrKlQOeyqJHjUtj3Y4Z6OuljCngyOYVd8UPvqiUOiy4cMyWLVdAXlZo0mB3r_H4NKr7jmjA5zxvjZraaZhqMEM9IrGpbQhI-xhqe2MzmneK9zsqNLFNSJYS6lrWTU68vUoLBzEDB8k) |image,width=15,height=14 |starknet_getEvents |image,width=15,height=14(https://lh7-us.googleusercontent.com/IGyszI0PQbJdMxcngAs8N9MDo3MjxFHPbFfM5IWmwRbU6isYXZRY7JrtcPXnWSLPqsKweU7f96YcEDHfTSu6leRyyhd3g4rPAmxwArokqrtkUkQraMw3IRi02Uja7aeH45teyrRaj-2VWmqQUl7V3Yw) |image,width=15,height=14 |starknet_getNonce |image,width=15,height=14(https://lh7-us.googleusercontent.com/ru-XjFrOJ00S5N_X3fqbX-sTb9WzrLJux42cX4MSi4fbYIK7g5mRz99MdkvwKoq4aJyxqv-Ytn-SS_HK-c7YVv5sJe6dF7TBuTW28meUeB91Ulmbm693D1GCIAG515y7mSeQuincRv-VDzCafl1FqZk) |image,width=15,height=14 |starknet_getStateUpdate |image,width=15,height=14(https://lh7-us.googleusercontent.com/z2Iinm_IgpvefYJTFfrKxgXBxVZ9PwSxPRdUfTeFCfY_MRewFBMIxCTaz_Jov38VlNA1tEsqIvAgqY_OBlKvNhG6JIaFMli_bxarAXPh8Ro2wu0DBdl9_hafLueUmB3gaFVi_1bY7XqIy3LOGIHgdpY) |image,width=15,height=14 |starknet_getStorageAt |image,width=15,height=14(https://lh7-us.googleusercontent.com/Q0n2aBJM-uIWrG1kosFu2MhQKg4cksWcvDi9KQp5L-utvsMZAud0LqQUdlHEnI7pCsBFLYEtBNmLM9VhqxhWlhAa_24M6RdLX5qex5o34w2jc4ARL55DFBDYIfGBhSUasx_NyAWJft_4HOajJnkWeGA) |image,width=15,height=14 |starknet_getTransactionByBlockIdAndIndex |image,width=15,height=14(https://lh7-us.googleusercontent.com/2nPt3GGNY9upWAjl55qAweT8bAHwNvgnMzbuV3e_1aM0i3AFGEOjBJeupMC5Ik2ogBXJKipLMyrJ9qceWy6k-b-odz5g30Z1WvyO5zdCPFu5tre3qvoWqh0Ye1METBLvzztPki1eQHZXwr-bn2yrJsQ) |image,width=15,height=14 |starknet_getTransactionByHash |image,width=15,height=14(https://lh7-us.googleusercontent.com/k9qvKyttKSe8_AW4EvmGfCPnQi4R9g514n9uEbsKs5ZMXI7fkrCR5jMOk4KCo7pEn0JyCtJDRRGOuJf-OL5cP9-7P9rU2mN9R6wU90-js5YcDAwyrrZ4TD_i9h-TXkdFt5D40V1hgAwA1czHRgf_YVo) |image,width=15,height=14 |starknet_getTransactionReceipt |image,width=15,height=14(https://lh7-us.googleusercontent.com/031uVAYby7m12Je0ZuWbebnjvKzCK0lII05KItL6cOmZH_xUFz_yGV6E4xvjjt1aDD8y-6skH2mbSkfYEZQx64CzJRpd7G5uSoEAhsG2P3r51HqYXX-G7vafHmEPgD-O4mfp9diQSvEOiieEFPAW0yc) |image,width=15,height=14 |starknet_getTransactionStatus |image,width=15,height=15(https://lh7-us.googleusercontent.com/w8n4EgH6kPlyU55MMLJYjm2v3bOD_5MfsYJnpcvXqkM4Zsj0Eu2JekM9ZwztTydhqfUW_gtYGvSg2P5NF7Zib5heFonOYRhya18tdGQebkUXCQKxoSgFoicqpdHNgyU9Cf-Iuak1nSibbJWKN6H_Bbg) |image,width=15,height=14 |starknet_simulateTransactions |image,width=15,height=14 |image,width=15,height=14 |image,width=15,height=14 |starknet_specVersion |image,width=15,height=15(https://lh7-us.googleusercontent.com/w8n4EgH6kPlyU55MMLJYjm2v3bOD_5MfsYJnpcvXqkM4Zsj0Eu2JekM9ZwztTydhqfUW_gtYGvSg2P5NF7Zib5heFonOYRhya18tdGQebkUXCQKxoSgFoicqpdHNgyU9Cf-Iuak1nSibbJWKN6H_Bbg) |image,width=15,height=14 |starknet_syncing |image,width=15,height=14 |image,width=15,height=14 |image,width=15,height=14 |starknet_traceBlockTransactions |image,width=15,height=14 |image,width=15,height=14 |image,width=15,height=14 |starknet_traceTransaction |image,width=15,height=14 |image,width=15,height=14 |image,width=15,height=14 |===

Papyrus monitoring API

Endpoints for retrieving monitoring information for the running node are available at the path monitoring.

You can send API requests using the following curl command:

[source,bash]

curl -X GET https://<node_monitoring_gateway>/monitoring/<endpoint>

For example, when the node monitoring gateway is exposed at localhost:8081, send a request to view the liveliness endpoint using the following curl command:

[source,bash]

curl -X GET https://localhost:8081/monitoring/alive

Papyrus monitoring API endpoints

[horizontal,labelwidth="15"] alive:: Liveliness endpoint. Returns status code 200 if the node is alive. nodeVersion:: Gets the node version. nodeConfig:: Gets the current node’s configuration. dbTablesStats:: Gets statistics for each table in the libmdbx database. For more information, see libmdbx::Stat in the libmdbx documentation. metrics:: Gets metrics of the node’s activity. For more information, see xref:#collecting-metrics[].

Collecting metrics

Papyrus can collect the following types of metrics:

  • JSON-RPC metrics
  • synchronization metrics
  • process metrics

By default, the node does not collect metrics and the metric path returns the following error code:

[source, bash]

405 - Method Not Allowed.

To collect metrics, set the configuration value collect_metrics in the default configuration file to true.

Viewing metrics

Papyrus collects the following types of metrics:

  • rpc_incoming_requests counter
  • rpc_failed_requests counter
  • rpc_request_latency_seconds histogram
  • process #Are these process metrics?#
  • papyrus #Are these sync metrics?#

You can see information for each metric by entering the following command:

[source,bash]

<metric>\{method="<method_endpoint_suffix>", version="<ver>"}

Where:

[horizontal,labelwidth="15"] <metric>:: is the JSON-RPC metric. <method_endpoint_suffix>:: is the name of the JSON RPC API method endpoint, not including starknet_. <ver>:: is the JSON-RPC API version.

For example, to get all the incoming requests to the method starknet_chainId in JSON-RPC version 0.4, use method="chainId" in the following command:

[source,bash]

curl -X GET https://localhost:8081/monitoring/metrics/rpc_incoming_requests\{method="chainId", version="V0_4"}

[TIP]

To get the number of requests with an illegal method name, such as those resulting from a typo, like starknet_chainIddd, use illegal_method for <method_endpoint_suffix>.

Deployment

See a helm chart for deploying the node to a Kubernetes cluster in the deployments folder.

Roadmap

See the open issues for proposed features and known issues:

Getting help

Reach out to the maintainer at any of the following:

Help make Papyrus better!

If you want to say thank you or support the active development of Papyrus:

  • Add a GitHub Star to the project.
  • Tweet about Papyrus.
  • Write interesting articles about the project on link:Dev.to, link:Medium, or your personal blog.

Contributing

Thanks for taking the time to contribute! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make benefit everybody else and are greatly appreciated.

Please read link:our contribution guidelines, and thank you for being involved!

Authors and contributors

For a full list of all authors and contributors, see link:the contributors page.

Security

Papyrus follows good practices of security, but 100% security cannot be assured. Papyrus is provided "as is" without any warranty. Use at your own risk.

For more information and to report security issues, please refer to our link:security documentation.

License

This project is licensed under the Apache 2.0 license.

For more information, see link:LICENSE.

Dependencies

~22MB
~376K SLoC