<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>weboftrust</title>
        <link>https://paragraph.com/@hailvitalik</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 15 Jul 2026 05:31:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>weboftrust</title>
            <url>https://storage.googleapis.com/papyrus_images/0add30253635cd70fc578dab57898fb81ff906bc2f6e87799c05d8c77513b409.webp</url>
            <link>https://paragraph.com/@hailvitalik</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Aidrop as Positive Reinforcement]]></title>
            <link>https://paragraph.com/@hailvitalik/aidrop-as-positive-reinforcement</link>
            <guid>DlChqfei60cj753kyNDU</guid>
            <pubDate>Tue, 02 Jul 2024 11:48:06 GMT</pubDate>
            <description><![CDATA[Airdrop is one way to reward positive engagement but executing a perfect airdrop is challenging due to the Sybil attack problem. I don’t think we will ever be able to solve it in a fully decentralized manner, but we can continue experimenting to filter out bots from genuine users. Many projects have approached this persistent and ongoing issue in different ways. Some have used on-chain metrics, others have combined on-chain and off-chain metrics, and some have outsourced the process to the co...]]></description>
            <content:encoded><![CDATA[<p>Airdrop is one way to reward positive engagement but executing a perfect airdrop is challenging due to the Sybil attack problem. I don’t think we will ever be able to solve it in a fully decentralized manner, but we can continue experimenting to filter out bots from genuine users. Many projects have approached this persistent and ongoing issue in different ways. Some have used on-chain metrics, others have combined on-chain and off-chain metrics, and some have outsourced the process to the community (such as Hop and LayerZero).</p><p>Following each airdrop, a recurring pattern emerges among users and entities: they voice their complaints and demand changes to eligibility criteria. Moreover, it has recently become evident that <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/TrustlessState/status/1800543017260171652">coordinated attacks on social media platforms</a> can try to pressure projects into altering their criteria.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c">Borrowing the logic of &quot;impact == profit</a>,&quot; an idea coined by Vitalik, which focuses on rewarding positive impact, there are a few things I would like to see more in future airdrops.</p><p><strong>On-chain KYCed Wallet Validation:</strong></p><ul><li><p>Utilize Gnosis Pay card addresses, which are KYCed and verified. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.gnosispay.com/en/articles/9331201-gnosis-pay-zerion-campaign-faq">Zerion intends to distribute SBT to Gnosis Card addresses</a>. Including and rewarding those addresses has many benefits, encouraging users to use Cypto for their day-to-day payment, thus bridging the gap between web3 and traditional payment, and securing funds in Safe is another benefit. If an address appears to be a burner address, a maximum of N connected addresses could be counted as one.</p></li><li><p>Consider Optimism Citizen NFTs, a collaboration with Coinbase and Optimism, tied to KYCed addresses.</p></li></ul><p><strong>On-chain Behavior Analysis:</strong></p><ul><li><p>Identify addresses involved in transactions with KYC-enforced exchanges like Kraken, Coinbase, or Binance. While some users may have multiple addresses, industrial farming is unlikely due to associated fees</p></li><li><p>Monitor liquidity and assets at specific addresses, similar to the zkSync approach. Evaluate the duration of liquidity retention within the ecosystem, as bot behaviour tends to rotate liquidity by bridging in/out.</p></li></ul><p><strong>Ecosystem Exploration:</strong></p><ul><li><p>Emphasize users engaging in innovative experiments within evolving ecosystems. This could include participation in initiatives like the paymaster for zkSync, exploring 3FA for Bravoos wallet, experimenting with Frame and client(s) on Farcaster, or exploring L2s under Superchain. Reward curiosity and positive engagement.</p></li></ul><p><strong>Additionally, consider evaluating developers and contributors:</strong></p><ul><li><p>Validate their contributions on GitHub, including actual code writing, repository maintenance, and non-technical writing such as translating documents. When rewarding core developers, also recognize solo stakers, as both contribute to the health of the settlement layer.</p></li></ul><p>Reward and encourage positive behavious and may be one day we will have more set of trsuted on-chain addresses and less sybil.</p>]]></content:encoded>
            <author>hailvitalik@newsletter.paragraph.com (weboftrust)</author>
        </item>
        <item>
            <title><![CDATA[RPGF - recap]]></title>
            <link>https://paragraph.com/@hailvitalik/rpgf-recap</link>
            <guid>RgijNgFTO9pf1VS3KsNq</guid>
            <pubDate>Sun, 05 May 2024 20:57:00 GMT</pubDate>
            <description><![CDATA[A short recap on RPGF. The vision of RPGF is to create a new internet that is not owned by a single entity owned yet benefits everyone. It is governed by the community and rewards contributions retroactively, where impact == profit. You can find more details about our vision at https://www.optimism.io/vision. Optimism governance consists of a two-pillar governance system:Token House, governed by the $OP Token, controls grants distributed by DAO and committee selection*.Citizen House, comprisi...]]></description>
            <content:encoded><![CDATA[<p>A short recap on RPGF.</p><p>The vision of RPGF is to create a new internet that is not owned by a single entity owned yet benefits everyone. It is governed by the community and rewards contributions retroactively, where impact == profit. You can find more details about our vision at<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.optimism.io/vision"> https://www.optimism.io/vision</a>.</p><p>Optimism governance consists of a two-pillar governance system:</p><ol><li><p>Token House, governed by the $OP Token, controls grants distributed by DAO and committee selection*.</p></li><li><p>Citizen House, comprising individuals who voluntarily enter a social contract with the Optimism Collective.</p></li></ol><p>*Scope is quite big but keeping it short as of now.</p><p>This two-house DAO design aims to achieve a non-plutocratic governance system.</p><p>I was excited to receive my Citizen badge and try my best not to break the trust put in me, a stranger decided to refer me which itself is a big achievement for me.  My motivation to participate originates from the unique vision of Optimism and its focus on collective efforts. I believe this motivation is also shared among other Citizens. While I may have differing opinions from other citizen’s opinions, our ultimate goal remains the same — to bring Optimism&apos;s vision to fruition. Our progress so far is commendable, and with each passing season, it only gets better.</p><p>As to why we are all here, especially those not directly invested in Optimism, it could be a sense of belongingness, a desire to support project building in public, or an opportunity to fund projects hindered by regional or language barriers. Some may also see this as a chance to participate in a collective effort to ensure the success of DAO, which they&apos;ve been waiting for over a decade.</p><p>Of course, like any evolving project, the current process is not perfect.</p><p><strong>One challenge is finding balance</strong>, we must ask ourselves: what would happen if Optimism&apos;s vision fails?</p><p>While it may have a minimal impact on me, it could significantly affect others. Some collective members have invested considerable time, and energy, this is where I belong, and even capital. A developer building apps on Optimism has a direct impact on its success. This raises questions about whose opinions should hold more weight. Since the inception of the collective, several members have dedicated significant personal resources to advance Optimism&apos;s vision. I don’t have an answer to this question, but I believe this iterative experimentation approach taken by the Optimism Foundation could lead us to a place where we both could exist and complement each other.</p><p>Another challenge is <strong>conflicts of interest</strong>. It&apos;s crucial to provide an equal platform for expressing opinions without fear of negative repercussions. I have felt instances where badgeholders are hesitant to express their views due to potential impacts on their image/ rewards. Those with contrasting opinions may face online harassment, leading to either silence, compromising mental well-being, or rage quit. This is the sad part, ideally should not happen. One suggestion is to increase the number of badgeholders to mitigate these issues, although it comes with its drawbacks.</p><p>With <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gov.optimism.io/t/retro-funding-moving-from-broad-to-narrow-scoped-rounds/7759?u=opuser">upcoming proposed changes</a>, my primary concern is <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gov.optimism.io/t/retro-funding-moving-from-broad-to-narrow-scoped-rounds/7759/17?u=opuser">availability bias</a>, where certain viewpoints may dominate due to their prominence or accessibility, even if they are false. Addressing these biases is crucial for ensuring fair and inclusive decision-making within the community.</p><p>Feedback is a crucial part of an iterative experiment, please join the discussion on the gov forum or reach out if you have any feedback or suggestions. I am also happy to address any queries you might have.</p>]]></content:encoded>
            <author>hailvitalik@newsletter.paragraph.com (weboftrust)</author>
        </item>
        <item>
            <title><![CDATA[Run a non-validator Ethereum node]]></title>
            <link>https://paragraph.com/@hailvitalik/run-a-non-validator-ethereum-node</link>
            <guid>01196rBjygtV1zWFqWtZ</guid>
            <pubDate>Sun, 04 Feb 2024 17:35:45 GMT</pubDate>
            <description><![CDATA[Sharing my experience and what I have learned about running a non-staking Ethereum node. Note:You&apos;ll notice a couple of mentions of r/ethfinance, as my insights and motivation stem from the OGs in the crypto community who reflect there, sharing their knowledge, and wisdom, and inspiring others like myself.The last client bug and much-needed discussion around client diversity sparked valuable discussions.Hanniabu shared their thoughts on the financial loss of a bug in Geth, a majority cli...]]></description>
            <content:encoded><![CDATA[<p>Sharing my experience and what I have learned about running a non-staking Ethereum node.</p><p><strong>Note</strong>:</p><ul><li><p>You&apos;ll notice a couple of mentions of r/ethfinance, as my insights and motivation stem from the OGs in the crypto community who reflect there, sharing their knowledge, and wisdom, and inspiring others like myself.</p></li><li><p>The last client bug and much-needed discussion around client diversity sparked valuable discussions.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/hanni_abu/status/1743361243790922069?s=20">Hanniabu shared their thoughts on the financial loss of a bug in Geth</a>, a majority client with 78% share of all running clients.</p></li></ul><p>u/djlywtf hot takes on the consequences of running a majority client <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://old.reddit.com/r/ethfinance/comments/19cou8k/daily_general_discussion_january_22_2024/kj2vote/">from the social side.</a></p><h2 id="h-motivation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Motivation</h2><p>The above discussion motivated me to run a node even though I can’t afford to run a full validator node. Running a non-validator node will also help in keeping the network secure and decentralised.</p><p>Now, if you want to run the node directly from the source code and want to stake as well, no need to read my mumble jumble any further. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://someresat.medium.com/">SomerEsat&apos;s guide</a> has everything covered, and I was able to run the node without any trouble.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/ethfinance/comments/19f2ia2/comment/kjhh18d/?utm_source=share&amp;utm_medium=web2x&amp;context=3">When I asked for feedback on choosing a node</a>, Nimbus and Netheremind were suggested. After reading their docs for a couple of hours, I was lost and overwhelmed with different configuration parameters. Nonetheless, clients were running and syncing by the end of the day by using the source code and compiling it. But the goal was to run them on Docker.</p><p>Nimbus sadly lacks documentation for beginners like me, and I got no response to a couple of questions asked on Neterhmind Discord. So, I moved to the next one, Besu, and I loved their easy-to-follow documentation. The support I got on their Discord made me stick with them.</p><h3 id="h-besu" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Besu:</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://besu.hyperledger.org/public-networks/get-started/install/run-docker-image#run-a-node-on-ethereum-mainnet">Start here</a>, and you can run the client by running the Docker command. Let&apos;s see the parameters one by one.</p><pre data-type="codeBlock" text="docker run -p 8545:8545 --mount type=bind,source=/&lt;myvolume/besu/mainnet&gt;,target=/var/lib/besu -p 30303:30303 hyperledger/besu:latest --rpc-http-enabled --data-path=/var/lib/besu
"><code>docker run <span class="hljs-operator">-</span>p <span class="hljs-number">8545</span>:<span class="hljs-number">8545</span> <span class="hljs-operator">-</span><span class="hljs-operator">-</span>mount <span class="hljs-keyword">type</span><span class="hljs-operator">=</span>bind,source<span class="hljs-operator">=</span><span class="hljs-operator">/</span><span class="hljs-operator">&#x3C;</span>myvolume<span class="hljs-operator">/</span>besu<span class="hljs-operator">/</span>mainnet<span class="hljs-operator">></span>,target<span class="hljs-operator">=</span><span class="hljs-operator">/</span><span class="hljs-keyword">var</span><span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>besu <span class="hljs-operator">-</span>p <span class="hljs-number">30303</span>:<span class="hljs-number">30303</span> hyperledger<span class="hljs-operator">/</span>besu:latest <span class="hljs-operator">-</span><span class="hljs-operator">-</span>rpc<span class="hljs-operator">-</span>http<span class="hljs-operator">-</span>enabled <span class="hljs-operator">-</span><span class="hljs-operator">-</span>data<span class="hljs-operator">-</span>path<span class="hljs-operator">=</span><span class="hljs-operator">/</span><span class="hljs-keyword">var</span><span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>besu
</code></pre><ol><li><p><code>docker run</code>: Command to run Docker. If you haven&apos;t included your current logged user in the admin group, you might need to run the command with <code>sudo</code>.</p></li><li><p><code>-p 8545:8545</code>: Mapping the port of Docker to the port of your local system. The port (TCP) on which HTTP JSON-RPC listens. The default is 8545. Additional read <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.docker.com/network/">Port Mapping</a></p></li><li><p><code>--mount type=bind,source=/&lt;myvolume/besu/mainnet&gt;,target=/var/lib/besu</code>: Docker runs on its environment, so if you don&apos;t mount the storage location to your local drive, your data will be lost each time you restart the Docker. This can be achieved by mounting a folder of your drive to the folder location of the client running inside the Docker. Additional read <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.docker.com/storage/bind-mounts/">Mount bind</a></p></li><li><p><code>-p 30303:30303</code>: The P2P listening ports (UDP and TCP). Used to sync with other running clients. The default is 30303.</p></li><li><p><code>hyperledger/besu:latest</code>: Besu Docker image with the latest tag.</p></li><li><p><code>--rpc-http-enabled</code>: Enables or disables the HTTP JSON-RPC service. The default is false. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://besu.hyperledger.org/public-networks/reference/cli/options#specify-options">Get yourself familiarised with different parameters supported by Besu</a></p></li><li><p><code>--data-path=/var/lib/besu</code>: Location where sync data will be stored.</p></li></ol><p>The above code snippet is enough to get your node running, but you need to extend it further to make it somewhat production-ready, which includes monitoring and proper logging, will look like the below:</p><pre data-type="codeBlock" text="[
&quot;--data-path=/var/lib/besu/data&quot;,
&quot;--host-allowlist=*&quot;,
&quot;--rpc-http-enabled&quot;,
&quot;--rpc-http-cors-origins=*&quot;,
&quot;--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3&quot;,
&quot;--engine-jwt-secret=/var/lib/besu/jwtsecret.hex&quot;,
&quot;--engine-host-allowlist=*&quot;,
&quot;--engine-rpc-enabled=true&quot;,
&quot;--sync-mode=X_SNAP&quot;,
&quot;--data-storage-format=BONSAI&quot;,
&quot;--rpc-http-enabled=true&quot;,
&quot;--graphql-http-enabled=true&quot;,
&quot;--metrics-enabled&quot;,
&quot;--max-peers=20&quot;,
&quot;--Xp2p-peer-lower-bound=20&quot;,
]
"><code><span class="hljs-selector-attr">[<span class="hljs-string">"--data-path=/var/lib/besu/data"</span>,<span class="hljs-string">"--host-allowlist=*"</span>,<span class="hljs-string">"--rpc-http-enabled"</span>,<span class="hljs-string">"--rpc-http-cors-origins=*"</span>,<span class="hljs-string">"--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3"</span>,<span class="hljs-string">"--engine-jwt-secret=/var/lib/besu/jwtsecret.hex"</span>,<span class="hljs-string">"--engine-host-allowlist=*"</span>,<span class="hljs-string">"--engine-rpc-enabled=true"</span>,<span class="hljs-string">"--sync-mode=X_SNAP"</span>,<span class="hljs-string">"--data-storage-format=BONSAI"</span>,<span class="hljs-string">"--rpc-http-enabled=true"</span>,<span class="hljs-string">"--graphql-http-enabled=true"</span>,<span class="hljs-string">"--metrics-enabled"</span>,<span class="hljs-string">"--max-peers=20"</span>,<span class="hljs-string">"--Xp2p-peer-lower-bound=20"</span>,]</span>
</code></pre><p>Two important parameters:</p><ol><li><p><code>--sync-mode=X_SNAP</code>: From the official doc - &quot;<em>We recommend using snap sync over fast sync because snap sync can be faster by several days. We recommend using snap sync with the Bonsai data storage format for the fastest sync and lowest storage requirements</em>.&quot;</p></li><li><p><code>--engine-jwt-secret=/var/lib/besu/jwtsecret.hex</code>: A hex-encoded bytes secret shared between consensus and execution clients.</p><p>Run this command to create a secret token, you can name the file whatever you want, just make sure that you are passing the same key to both clients. It’s a must.</p><p><code>openssl rand -hex 32 | tr -d &quot;\n&quot; &gt; jwtsecret.hex</code></p></li></ol><h3 id="h-monitoring-and-logging" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Monitoring and Logging</h3><p>Follow <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.cherryservers.com/blog/install-prometheus-ubuntu">this</a> guide to run Prometheus via service. You can run Prometheus without a service but doing so will help in starting the Prometheus automatically after a system reboot. Open the config file, remove any existing code, and paste the below. Use Vim or Nano to edit the text.</p><p><code>sudo nano /etc/prometheus/prometheus.yml</code></p><pre data-type="codeBlock" text="global:
  scrape_interval: 15s
scrape_configs:
  - job_name: &quot;prometheus&quot;
    static_configs:
      - targets: [&quot;localhost:9090&quot;]
  - job_name: &quot;teku-dev&quot;
    scrape_timeout: 10s
    metrics_path: /metrics
    scheme: http
    static_configs:
      - targets: [&quot;localhost:8008&quot;]
"><code><span class="hljs-attr">global:</span>
  <span class="hljs-attr">scrape_interval:</span> <span class="hljs-string">15s</span>
<span class="hljs-attr">scrape_configs:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">job_name:</span> <span class="hljs-string">"prometheus"</span>
    <span class="hljs-attr">static_configs:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">targets:</span> [<span class="hljs-string">"localhost:9090"</span>]
  <span class="hljs-bullet">-</span> <span class="hljs-attr">job_name:</span> <span class="hljs-string">"teku-dev"</span>
    <span class="hljs-attr">scrape_timeout:</span> <span class="hljs-string">10s</span>
    <span class="hljs-attr">metrics_path:</span> <span class="hljs-string">/metrics</span>
    <span class="hljs-attr">scheme:</span> <span class="hljs-string">http</span>
    <span class="hljs-attr">static_configs:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">targets:</span> [<span class="hljs-string">"localhost:8008"</span>]
</code></pre><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/#use-bind-mounts-1">Install Grafana with a volume mount</a>, and access it on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://localhost:3000">http://localhost:3000</a>. The default username and password are admin and admin.</p><p>Go to <code>Home</code> → <code>Connections</code> → <code>Add new connection</code> <em>→</em> <code>Data Source</code> <em>→ Choose</em> <code>Prometheus</code> → Under connection type &quot;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://localhost:9090">http://localhost:9090</a>&quot; - <em>Click</em> <code>Save &amp; Test</code>.</p><p>Now let’s import the Grafana dashboard. <em>Go to</em> <code>Home</code> <em>→</em> <code>Dashboard</code> → On the top left, click <code>New</code> and choose <code>import</code> from the dropdown → Provide <code>13457</code> and click load. Grafana gives you a quick overview of nodes.</p><p>For the Teku client, below, you can directly see the log by reading the log files (logs.log). But remember not to attach the running container to the console to see the logs, doing so could lead to stopping the container once the log terminal is closed. Instead, access the logs via <code>docker logs</code>. Besu sends the logs directly to the console which can be accessed by running the below command.</p><p><code>sudo docker compose logs -f {service_name-if available} or containername</code></p><p>We have client setup and monitoring, and now let&apos;s see the consensus client setting.</p><p>I went with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.teku.consensys.io/get-started/install/run-docker-image">Teku</a> as their documentation is similar to Besu.</p><p><code>docker run -p 30303:30303/tcp -p 30303:30303/udp -p 5051:5051 --mount type=bind,source=/Users/user1/teku/,target=/var/lib/teku consensys/teku:latest --network=mainnet--data-base-path=/var/lib/teku --eth1-endpoint=http://102.10.10.1:8545 --rest-api-enabled=true</code></p><p>extended version of the command below.</p><pre data-type="codeBlock" text="[
  &quot;--data-base-path=/var/lib/teku/data&quot;,
  &quot;--ee-endpoint=http://besu_node:8551&quot;,
  &quot;--ee-jwt-secret-file=/var/lib/teku/jwtsecret.hex&quot;,
  &quot;--p2p-port=9000&quot;,
  &quot;--rest-api-enabled=true&quot;,
  &quot;--rest-api-docs-enabled=true&quot;,
  &quot;--initial-state=https://sync-mainnet.beaconcha.in&quot;,
  &quot;--metrics-enabled=true&quot;,
  &quot;--log-destination=File&quot;,
  &quot;--log-file=/var/lib/teku/logs&quot;,
]
"><code><span class="hljs-selector-attr">[  <span class="hljs-string">"--data-base-path=/var/lib/teku/data"</span>,  <span class="hljs-string">"--ee-endpoint=http://besu_node:8551"</span>,  <span class="hljs-string">"--ee-jwt-secret-file=/var/lib/teku/jwtsecret.hex"</span>,  <span class="hljs-string">"--p2p-port=9000"</span>,  <span class="hljs-string">"--rest-api-enabled=true"</span>,  <span class="hljs-string">"--rest-api-docs-enabled=true"</span>,  <span class="hljs-string">"--initial-state=https://sync-mainnet.beaconcha.in"</span>,  <span class="hljs-string">"--metrics-enabled=true"</span>,  <span class="hljs-string">"--log-destination=File"</span>,  <span class="hljs-string">"--log-file=/var/lib/teku/logs"</span>,]</span>
</code></pre><p>Here we <strong>must</strong> use the same JWT secret being used in the execution client.</p><p>And use the <code>--initial-state</code> flag to sync your node from a recently finalized checkpoint state. A couple of community-managed endpoints are mentioned <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eth-clients.github.io/checkpoint-sync-endpoints/">here</a>.</p><p>The final touch was combining everything. Running and managing individual Docker images was a challenge, so decided to combine them with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.docker.com/compose/">Docker Compose.</a></p><p>The final code looks something like this: You can copy and paste it into a Docker Compose file.</p><pre data-type="codeBlock" text="
---
version: &quot;3.4&quot;
services:
  besu_node:
    environment:
      - &quot;JAVA_OPTS=-Xmx8g&quot; #5gb is also enough
    image: hyperledger/besu:24.1.1
    command:
      [
        &quot;--data-path=/var/lib/besu/data&quot;,
        &quot;--host-allowlist=*&quot;,
        &quot;--rpc-http-enabled&quot;,
        &quot;--rpc-http-cors-origins=*&quot;,
        &quot;--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3&quot;,
        &quot;--engine-jwt-secret=/var/lib/besu/jwtsecret.hex&quot;,
        &quot;--engine-host-allowlist=*&quot;,
        &quot;--engine-rpc-enabled=true&quot;,
        &quot;--sync-mode=X_SNAP&quot;,
        &quot;--data-storage-format=BONSAI&quot;, #Bonsai is reccomended when using fast sync
        &quot;--rpc-http-enabled=true&quot;,
        &quot;--graphql-http-enabled=true&quot;,
        &quot;--metrics-enabled&quot;,
        &quot;--max-peers=20&quot;,
        &quot;--Xp2p-peer-lower-bound=20&quot;,
      ]
    volumes:
      - type: bind
        source: /home/user/besu/  #this is a folder on your local system
        target: /var/lib/besu
    ports:
      # Map the p2p port(30303), RPC HTTP port(8545), and engine port (8551)
      - &quot;8545:8545&quot;
      - &quot;8551:8551&quot;
      - &quot;30303:30303/tcp&quot;
      - &quot;30303:30303/udp&quot;
      - &quot;9545:9545&quot;

  teku_node:
    environment:
      - &quot;JAVA_OPTS=-Xmx8g&quot;
    image: consensys/teku:latest
    command:
      [
        &quot;--data-base-path=/var/lib/teku/data&quot;,
        &quot;--ee-endpoint=http://besu_node:8551&quot;,
        &quot;--ee-jwt-secret-file=/var/lib/teku/jwtsecret.hex&quot;,
        &quot;--p2p-port=9000&quot;,
        &quot;--rest-api-enabled=true&quot;,
        &quot;--rest-api-docs-enabled=true&quot;,
        &quot;--initial-state=https://sync-mainnet.beaconcha.in&quot;,
        &quot;--metrics-enabled=true&quot;,
        &quot;--log-destination=FILE&quot;,
        &quot;--log-file=/var/lib/teku/data/logs/logs.log&quot;, # file to store the logs
      ]
    depends_on:
      - besu_node
    volumes:
      - type: bind # volume map type bind
        source: /home/user/teku/ #this is a folder on your local system
        target: /var/lib/teku
    ports:
      # Map the p2p port(9000) and REST API port(5051)
      - &quot;9000:9000/tcp&quot;
      - &quot;9000:9000/udp&quot;
      - &quot;5051:5051&quot;
      - &quot;8008:8008&quot;
"><code>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
version: <span class="hljs-string">"3.4"</span>
services:
  besu_node:
    environment:
      <span class="hljs-operator">-</span> <span class="hljs-string">"JAVA_OPTS=-Xmx8g"</span> #5gb <span class="hljs-keyword">is</span> also enough
    image: hyperledger<span class="hljs-operator">/</span>besu:<span class="hljs-number">24.1</span><span class="hljs-number">.1</span>
    command:
      [
        <span class="hljs-string">"--data-path=/var/lib/besu/data"</span>,
        <span class="hljs-string">"--host-allowlist=*"</span>,
        <span class="hljs-string">"--rpc-http-enabled"</span>,
        <span class="hljs-string">"--rpc-http-cors-origins=*"</span>,
        <span class="hljs-string">"--rpc-http-api=ETH,NET,CLIQUE,DEBUG,MINER,NET,PERM,ADMIN,EEA,TXPOOL,PRIV,WEB3"</span>,
        <span class="hljs-string">"--engine-jwt-secret=/var/lib/besu/jwtsecret.hex"</span>,
        <span class="hljs-string">"--engine-host-allowlist=*"</span>,
        <span class="hljs-string">"--engine-rpc-enabled=true"</span>,
        <span class="hljs-string">"--sync-mode=X_SNAP"</span>,
        <span class="hljs-string">"--data-storage-format=BONSAI"</span>, #Bonsai <span class="hljs-keyword">is</span> reccomended when <span class="hljs-keyword">using</span> <span class="hljs-title">fast</span> <span class="hljs-title">sync</span>
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">rpc</span><span class="hljs-operator">-</span><span class="hljs-title">http</span><span class="hljs-operator">-</span><span class="hljs-title">enabled</span><span class="hljs-operator">=</span><span class="hljs-title"><span class="hljs-literal">true</span></span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">graphql</span><span class="hljs-operator">-</span><span class="hljs-title">http</span><span class="hljs-operator">-</span><span class="hljs-title">enabled</span><span class="hljs-operator">=</span><span class="hljs-title"><span class="hljs-literal">true</span></span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">metrics</span><span class="hljs-operator">-</span><span class="hljs-title">enabled</span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">max</span><span class="hljs-operator">-</span><span class="hljs-title">peers</span><span class="hljs-operator">=</span>20",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">Xp2p</span><span class="hljs-operator">-</span><span class="hljs-title">peer</span><span class="hljs-operator">-</span><span class="hljs-title">lower</span><span class="hljs-operator">-</span><span class="hljs-title">bound</span><span class="hljs-operator">=</span>20",
      ]
    <span class="hljs-title">volumes</span>:
      <span class="hljs-operator">-</span> <span class="hljs-title"><span class="hljs-keyword">type</span></span>: <span class="hljs-title">bind</span>
        <span class="hljs-title">source</span>: <span class="hljs-operator">/</span><span class="hljs-title">home</span><span class="hljs-operator">/</span><span class="hljs-title">user</span><span class="hljs-operator">/</span><span class="hljs-title">besu</span><span class="hljs-operator">/</span>  #<span class="hljs-title"><span class="hljs-built_in">this</span></span> <span class="hljs-title"><span class="hljs-keyword">is</span></span> <span class="hljs-title">a</span> <span class="hljs-title">folder</span> <span class="hljs-title">on</span> <span class="hljs-title">your</span> <span class="hljs-title">local</span> <span class="hljs-title">system</span>
        <span class="hljs-title">target</span>: <span class="hljs-operator">/</span><span class="hljs-title"><span class="hljs-keyword">var</span></span><span class="hljs-operator">/</span><span class="hljs-title">lib</span><span class="hljs-operator">/</span><span class="hljs-title">besu</span>
    <span class="hljs-title">ports</span>:
      # <span class="hljs-title">Map</span> <span class="hljs-title">the</span> <span class="hljs-title">p2p</span> <span class="hljs-title">port</span>(30303), <span class="hljs-title">RPC</span> <span class="hljs-title">HTTP</span> <span class="hljs-title">port</span>(8545), <span class="hljs-title">and</span> <span class="hljs-title">engine</span> <span class="hljs-title">port</span> (8551)
      <span class="hljs-operator">-</span> "8545:8545"
      <span class="hljs-operator">-</span> "8551:8551"
      <span class="hljs-operator">-</span> "30303:30303<span class="hljs-operator">/</span><span class="hljs-title">tcp</span>"
      <span class="hljs-operator">-</span> "30303:30303<span class="hljs-operator">/</span><span class="hljs-title">udp</span>"
      <span class="hljs-operator">-</span> "9545:9545"

  <span class="hljs-title">teku_node</span>:
    <span class="hljs-title">environment</span>:
      <span class="hljs-operator">-</span> "<span class="hljs-title">JAVA_OPTS</span><span class="hljs-operator">=</span><span class="hljs-operator">-</span><span class="hljs-title">Xmx8g</span>"
    <span class="hljs-title">image</span>: <span class="hljs-title">consensys</span><span class="hljs-operator">/</span><span class="hljs-title">teku</span>:<span class="hljs-title">latest</span>
    <span class="hljs-title">command</span>:
      [
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">data</span><span class="hljs-operator">-</span><span class="hljs-title">base</span><span class="hljs-operator">-</span><span class="hljs-title">path</span><span class="hljs-operator">=</span><span class="hljs-operator">/</span><span class="hljs-title"><span class="hljs-keyword">var</span></span><span class="hljs-operator">/</span><span class="hljs-title">lib</span><span class="hljs-operator">/</span><span class="hljs-title">teku</span><span class="hljs-operator">/</span><span class="hljs-title">data</span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">ee</span><span class="hljs-operator">-</span><span class="hljs-title">endpoint</span><span class="hljs-operator">=</span><span class="hljs-title">http</span>:<span class="hljs-comment">//besu_node:8551",</span>
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">ee</span><span class="hljs-operator">-</span><span class="hljs-title">jwt</span><span class="hljs-operator">-</span><span class="hljs-title">secret</span><span class="hljs-operator">-</span><span class="hljs-title">file</span><span class="hljs-operator">=</span><span class="hljs-operator">/</span><span class="hljs-title"><span class="hljs-keyword">var</span></span><span class="hljs-operator">/</span><span class="hljs-title">lib</span><span class="hljs-operator">/</span><span class="hljs-title">teku</span><span class="hljs-operator">/</span><span class="hljs-title">jwtsecret</span>.<span class="hljs-title">hex</span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">p2p</span><span class="hljs-operator">-</span><span class="hljs-title">port</span><span class="hljs-operator">=</span>9000",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">rest</span><span class="hljs-operator">-</span><span class="hljs-title">api</span><span class="hljs-operator">-</span><span class="hljs-title">enabled</span><span class="hljs-operator">=</span><span class="hljs-title"><span class="hljs-literal">true</span></span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">rest</span><span class="hljs-operator">-</span><span class="hljs-title">api</span><span class="hljs-operator">-</span><span class="hljs-title">docs</span><span class="hljs-operator">-</span><span class="hljs-title">enabled</span><span class="hljs-operator">=</span><span class="hljs-title"><span class="hljs-literal">true</span></span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">initial</span><span class="hljs-operator">-</span><span class="hljs-title">state</span><span class="hljs-operator">=</span><span class="hljs-title">https</span>:<span class="hljs-comment">//sync-mainnet.beaconcha.in",</span>
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">metrics</span><span class="hljs-operator">-</span><span class="hljs-title">enabled</span><span class="hljs-operator">=</span><span class="hljs-title"><span class="hljs-literal">true</span></span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">log</span><span class="hljs-operator">-</span><span class="hljs-title">destination</span><span class="hljs-operator">=</span><span class="hljs-title">FILE</span>",
        "<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-title">log</span><span class="hljs-operator">-</span><span class="hljs-title">file</span><span class="hljs-operator">=</span><span class="hljs-operator">/</span><span class="hljs-title"><span class="hljs-keyword">var</span></span><span class="hljs-operator">/</span><span class="hljs-title">lib</span><span class="hljs-operator">/</span><span class="hljs-title">teku</span><span class="hljs-operator">/</span><span class="hljs-title">data</span><span class="hljs-operator">/</span><span class="hljs-title">logs</span><span class="hljs-operator">/</span><span class="hljs-title">logs</span>.<span class="hljs-title">log</span>", # <span class="hljs-title">file</span> <span class="hljs-title">to</span> <span class="hljs-title">store</span> <span class="hljs-title">the</span> <span class="hljs-title">logs</span>
      ]
    <span class="hljs-title">depends_on</span>:
      <span class="hljs-operator">-</span> <span class="hljs-title">besu_node</span>
    <span class="hljs-title">volumes</span>:
      <span class="hljs-operator">-</span> <span class="hljs-title"><span class="hljs-keyword">type</span></span>: <span class="hljs-title">bind</span> # <span class="hljs-title">volume</span> <span class="hljs-title">map</span> <span class="hljs-title"><span class="hljs-keyword">type</span></span> <span class="hljs-title">bind</span>
        <span class="hljs-title">source</span>: <span class="hljs-operator">/</span><span class="hljs-title">home</span><span class="hljs-operator">/</span><span class="hljs-title">user</span><span class="hljs-operator">/</span><span class="hljs-title">teku</span><span class="hljs-operator">/</span> #<span class="hljs-title"><span class="hljs-built_in">this</span></span> <span class="hljs-title"><span class="hljs-keyword">is</span></span> <span class="hljs-title">a</span> <span class="hljs-title">folder</span> <span class="hljs-title">on</span> <span class="hljs-title">your</span> <span class="hljs-title">local</span> <span class="hljs-title">system</span>
        <span class="hljs-title">target</span>: <span class="hljs-operator">/</span><span class="hljs-title"><span class="hljs-keyword">var</span></span><span class="hljs-operator">/</span><span class="hljs-title">lib</span><span class="hljs-operator">/</span><span class="hljs-title">teku</span>
    <span class="hljs-title">ports</span>:
      # <span class="hljs-title">Map</span> <span class="hljs-title">the</span> <span class="hljs-title">p2p</span> <span class="hljs-title">port</span>(9000) <span class="hljs-title">and</span> <span class="hljs-title">REST</span> <span class="hljs-title">API</span> <span class="hljs-title">port</span>(5051)
      <span class="hljs-operator">-</span> "9000:9000<span class="hljs-operator">/</span><span class="hljs-title">tcp</span>"
      <span class="hljs-operator">-</span> "9000:9000<span class="hljs-operator">/</span><span class="hljs-title">udp</span>"
      <span class="hljs-operator">-</span> "5051:5051"
      <span class="hljs-operator">-</span> "8008:8008"
</code></pre><h3 id="h-things-to-consider" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Things to consider</h3><ol><li><p>Important to complete <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/">port forwarding</a> on your router so that nodes can communicate with each other and access Grafana and Prometheus. Port to open but not limited to: <code>5051, 9000, 9545, 30303, 8551, 8545</code></p></li><li><p>If the firewall is enabled, make sure to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.cyberciti.biz/faq/how-to-open-firewall-port-on-ubuntu-linux-12-04-14-04-lts/">allow the incoming traffic on those ports</a>.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ubuntu.com/tutorials/install-jre#1-overview">Java installed</a></p></li><li><p>Make sure to create the folder/directory being used in the code such as a logs file, or data storage file.</p></li><li><p>JWT token must be the same between clients.</p></li><li><p>If you want to run a node on ARM, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html">follow this guide</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/ethfinance/comments/19f2ia2/comment/kjhis3r/?utm_source=share&amp;utm_medium=web2x&amp;context=3">suggested by u/minimalGravitas</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://clientdiversity.org/">Read about client diversity</a>, you can also find direct links to different clients on their website.</p></li></ol><h3 id="h-help-and-support" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Help and support:</h3><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://discord.gg/ethstaker">Ethstaker Discord</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/ethstaker/">Ethstaker on Reddit</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hackmd.io/@haurog/HkS3VqhVa#A-guide-to-choosing-your-clients-and-improving-your-setup-as-a-solo-staker">A guide to choosing your clients and improving your setup as a solo staker</a> by Haurog</p></li><li><p>Check SSD recommendation <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gist.github.com/yorickdowne/f3a3e79a573bf35767cd002cc977b038">here</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0">here</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum.org/staking">A must-read</a> if you are interested in running a full node, additional doc on the same topic, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ethstaker.cc/ethstaker-knowledge-base/">ethstaker doc</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum.org/">Ethereum.org</a></p></li></ol><h3 id="h-conclusion" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Conclusion:</h3><p>Excluding the majority of client, I chose the above because of their easy-to-follow documentation and Discord support, but it&apos;s still challenging to run and manage a node if one does not have in-depth knowledge of computer networking and is comfortable working with the console.</p><p>There is a learning curve, and I relatively feel more comfortable, but still, there is so much to learn and, I can only assume staking will add an extra layer of responsibility and concern from a security, troubleshooting and maintenance perspective. Before running a staking node, I would highly recommend running a test net node for a couple of months.</p><p>I am confident that running the docker-compose file will spin up both the execution and consensus client, given folders and files exist on the system.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/nixorokish/status/1750170572682576278?s=20">As Nixo wrote</a>, run your node on whatever hardware you have, apply for grants and share your learning. Their twitt was my motivation to write and share my learning.</p><p>As a side note, it’s also important to understand that running a non-staking node has no financial incentive.</p>]]></content:encoded>
            <author>hailvitalik@newsletter.paragraph.com (weboftrust)</author>
        </item>
    </channel>
</rss>