diff --git a/404.html b/404.html index 0e95667e413e..6fc1431d68eb 100644 --- a/404.html +++ b/404.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/js/02aa52e0.4720ad7c.js b/assets/js/02aa52e0.4720ad7c.js new file mode 100644 index 000000000000..fa47b9c18727 --- /dev/null +++ b/assets/js/02aa52e0.4720ad7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[1565],{1604:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=s(4848),n=s(8453);const i={title:"Lodestar Quick Start Scripts"},o=void 0,a={id:"run/getting-started/quick-start",title:"Lodestar Quick Start Scripts",description:"In order to make things easier and quicker for all types of users to bootstrap the Lodestar consensus client with a variety of execution clients, we have come up with Lodestar Quickstart Docker scripts!",source:"@site/pages/run/getting-started/quick-start.md",sourceDirName:"run/getting-started",slug:"/run/getting-started/quick-start",permalink:"/lodestar/run/getting-started/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/getting-started/quick-start.md",tags:[],version:"current",frontMatter:{title:"Lodestar Quick Start Scripts"},sidebar:"tutorialSidebar",previous:{title:"Install Options",permalink:"/lodestar/run/getting-started/installation"},next:{title:"Quick Start Custom Setup Guide",permalink:"/lodestar/run/getting-started/quick-start-custom-guide"}},u={},c=[{value:"Support",id:"support",level:3},{value:"Customizations (Optional)",id:"customizations-optional",level:3}];function l(t){const e={a:"a",h3:"h3",li:"li",p:"p",ul:"ul",...(0,n.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(e.p,{children:["In order to make things easier and quicker for all types of users to bootstrap the Lodestar consensus client with a variety of execution clients, we have come up with ",(0,r.jsx)(e.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"Lodestar Quickstart"})," Docker scripts!"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"\u2705 Zero configuration"}),"\n",(0,r.jsx)(e.li,{children:"\u2705 Single command startup"}),"\n",(0,r.jsx)(e.li,{children:"\u2705 All testnets supported along with mainnet"}),"\n",(0,r.jsx)(e.li,{children:"\u2705 All mainstream execution clients integrated"}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"support",children:"Support"}),"\n",(0,r.jsx)(e.p,{children:"We actively maintain and update the configurations of running Lodestar with the most commonly used execution clients for various test/production networks so there is minimal configuration required for a standard setup."}),"\n",(0,r.jsxs)(e.p,{children:["If you have questions about these scripts, documentation or repository, feel free to talk to us on our ",(0,r.jsx)(e.a,{href:"https://discord.gg/yjyvFRP",children:"ChainSafe Discord"})," or ",(0,r.jsx)(e.a,{href:"https://github.com/ChainSafe/lodestar-quickstart/issues/new",children:"open an issue"})," and a member of the team or our community will be happy to assist you."]}),"\n",(0,r.jsx)(e.h3,{id:"customizations-optional",children:"Customizations (Optional)"}),"\n",(0,r.jsxs)(e.p,{children:["You can further adapt our Quickstart Docker scripts to your node setups with ease! Use our ",(0,r.jsx)(e.a,{href:"/lodestar/run/getting-started/quick-start-custom-guide",children:"Quickstart Custom Setup Guide"}),"!"]})]})}function d(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(l,{...t})}):l(t)}},8453:(t,e,s)=>{s.d(e,{R:()=>o,x:()=>a});var r=s(6540);const n={},i=r.createContext(n);function o(t){const e=r.useContext(i);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:o(t.components),r.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/02aa52e0.8b58ebaa.js b/assets/js/02aa52e0.8b58ebaa.js deleted file mode 100644 index 74994ccbf1d4..000000000000 --- a/assets/js/02aa52e0.8b58ebaa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[1565],{1604:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=n(4848),i=n(8453);const r={title:"Quick Start"},o=void 0,a={id:"run/getting-started/quick-start",title:"Quick Start",description:"Lodestar Quickstart",source:"@site/pages/run/getting-started/quick-start.md",sourceDirName:"run/getting-started",slug:"/run/getting-started/quick-start",permalink:"/lodestar/run/getting-started/quick-start",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/getting-started/quick-start.md",tags:[],version:"current",frontMatter:{title:"Quick Start"},sidebar:"tutorialSidebar",previous:{title:"Security Policy",permalink:"/lodestar/security"},next:{title:"Installation",permalink:"/lodestar/run/getting-started/installation"}},u={},c=[{value:"Lodestar Quickstart",id:"lodestar-quickstart",level:2},{value:"Customizations",id:"customizations",level:3},{value:"Support",id:"support",level:3}];function d(t){const e={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",strong:"strong",...(0,i.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.h2,{id:"lodestar-quickstart",children:"Lodestar Quickstart"}),"\n",(0,s.jsxs)(e.p,{children:["In order to make things easy for users to onboard and try the Ethereum ",(0,s.jsx)(e.strong,{children:"Proof of Stake"})," we have come up with ",(0,s.jsx)(e.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"Lodestar quick start"})," scripts!"]}),"\n",(0,s.jsxs)(e.p,{children:["\u2705 Zero Configuration\n\u2705 All testnets supported along with ",(0,s.jsx)(e.code,{children:"mainnet"}),"\n\u2705 All mainstream Execution Clients integrated"]}),"\n",(0,s.jsx)(e.p,{children:"With just single command you can run lodestar with various execution engines, switch them up to see the Optimistic sync work its magic and eventually brings lodestar and the execution engine in sync"}),"\n",(0,s.jsx)(e.h3,{id:"customizations",children:"Customizations"}),"\n",(0,s.jsx)(e.p,{children:"You can adapt them to your production setups with ease! Here is a simple guide for you to follow along:"}),"\n",(0,s.jsxs)(e.p,{children:["\ud83d\udc49 ",(0,s.jsx)(e.a,{href:"https://hackmd.io/@philknows/rJegZyH9q",children:"Lodestar Quick Setup Guide"})]}),"\n",(0,s.jsx)(e.h3,{id:"support",children:"Support"}),"\n",(0,s.jsx)(e.p,{children:"We actively maintain and update the configurations of running lodestar with the top of the line execution engines for various PoS networks so you have the minimum possible figuring out to do."}),"\n",(0,s.jsx)(e.p,{children:"In case you are facing any issues with the quick start guide, do reach us out on lodestar discord!\nHappy to help! \ud83d\ude4f\ud83d\ude4f\ud83d\ude4f"})]})}function l(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(d,{...t})}):d(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>o,x:()=>a});var s=n(6540);const i={},r=s.createContext(i);function o(t){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:o(t.components),s.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/02fae9b5.41ea4c5c.js b/assets/js/02fae9b5.41ea4c5c.js deleted file mode 100644 index 099039485ce6..000000000000 --- a/assets/js/02fae9b5.41ea4c5c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[395],{163:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=n(4848),i=n(8453);const r={title:"Home"},o=void 0,a={id:"index",title:"Home",description:"lodestar logo",source:"@site/pages/index.md",sourceDirName:".",slug:"/",permalink:"/lodestar/",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/index.md",tags:[],version:"current",frontMatter:{title:"Home"},sidebar:"tutorialSidebar",next:{title:"Introduction",permalink:"/lodestar/introduction"}},d={},c=[{value:"Welcome to the Lodestar documentation",id:"welcome-to-the-lodestar-documentation",level:2},{value:"Getting started",id:"getting-started",level:3},{value:"Specifications",id:"specifications",level:2},{value:"About these docs",id:"about-these-docs",level:2},{value:"Need assistance?",id:"need-assistance",level:2}];function l(e){const t={a:"a",blockquote:"blockquote",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"lodestar logo",src:n(9573).A+"",width:"3238",height:"930"})}),"\n",(0,s.jsx)(t.h2,{id:"welcome-to-the-lodestar-documentation",children:"Welcome to the Lodestar documentation"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Lodestar is an open-source Ethereum Consensus client and Typescript ecosystem, maintained by ChainSafe Systems"})}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"getting-started",children:"Getting started"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Follow the instructions for ",(0,s.jsx)(t.a,{href:"./run/getting-started/installation#build-from-source",children:"build from source"}),", ",(0,s.jsx)(t.a,{href:"./run/getting-started/installation#binaries",children:"binaries"}),", or ",(0,s.jsx)(t.a,{href:"./run/getting-started/installation#docker-installation",children:"Docker"})," to install Lodestar. Or use our ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"Lodestar Quickstart scripts"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Use ",(0,s.jsx)(t.a,{href:"/lodestar/supporting-libraries/",children:"Lodestar libraries"})," in your next Ethereum Typescript project."]}),"\n",(0,s.jsxs)(t.li,{children:["Run a beacon node on ",(0,s.jsx)(t.a,{href:"/lodestar/run/beacon-management/starting-a-node",children:"mainnet or a public testnet"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Utilize the whole stack by ",(0,s.jsx)(t.a,{href:"/lodestar/contribution/advanced-topics/setting-up-a-testnet",children:"starting a local testnet"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["View the Lodestar Beacon ",(0,s.jsx)(t.a,{href:"/lodestar/run/beacon-management/beacon-cli",children:"CLI commands and options"})]}),"\n",(0,s.jsxs)(t.li,{children:["Prospective contributors can read the ",(0,s.jsx)(t.a,{href:"/lodestar/contribution/getting-started",children:"contributing section"})," to understand how we develop and test on Lodestar."]}),"\n",(0,s.jsxs)(t.li,{children:["If you have questions ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"submit an issue"})," or join us on ",(0,s.jsx)(t.a,{href:"https://discord.gg/yjyvFRP",children:"Discord"}),"!"]}),"\n",(0,s.jsxs)(t.li,{children:["Please note our ",(0,s.jsx)(t.a,{href:"/lodestar/security",children:"security policy"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"specifications",children:"Specifications"}),"\n",(0,s.jsx)(t.p,{children:"Hardware specifications minimum / recommended, to run the Lodestar client."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{}),(0,s.jsx)(t.th,{children:"Minimum"}),(0,s.jsx)(t.th,{children:"Recommended"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Processor"}),(0,s.jsx)(t.td,{children:"Intel Core i3\u20139100 or AMD Ryzen 5 3450"}),(0,s.jsx)(t.td,{children:"Intel Core i7\u20139700 or AMD Ryzen 7 4700"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Memory"}),(0,s.jsx)(t.td,{children:"16GB RAM"}),(0,s.jsx)(t.td,{children:"32GB RAM"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Storage"}),(0,s.jsx)(t.td,{children:"100GB available space SSD"}),(0,s.jsx)(t.td,{children:"1TB available space SSD"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Internet"}),(0,s.jsx)(t.td,{children:"Broadband connection"}),(0,s.jsx)(t.td,{children:"Broadband connection"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"about-these-docs",children:"About these docs"}),"\n",(0,s.jsxs)(t.p,{children:["This documentation is open source, contribute at ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/tree/unstable/docs",children:"Github Lodestar repository /docs"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"need-assistance",children:"Need assistance?"}),"\n",(0,s.jsxs)(t.p,{children:["If you have questions about this documentation, feel free to talk to us on our ",(0,s.jsx)(t.a,{href:"https://discord.gg/yjyvFRP",children:"ChainSafe Discord"})," or ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"open an issue"})," and a member of the team or our community will be happy to assist you."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},9573:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/lodestar_icon_text_black_stroke-a408ae36466fb3b61b04e0a9806c1779.png"},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>a});var s=n(6540);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/02fae9b5.9c2fe44f.js b/assets/js/02fae9b5.9c2fe44f.js new file mode 100644 index 000000000000..5fe46cd7b241 --- /dev/null +++ b/assets/js/02fae9b5.9c2fe44f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[395],{163:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var s=n(4848),i=n(8453);const o={title:"Home"},r=void 0,a={id:"index",title:"Home",description:"lodestar logo",source:"@site/pages/index.md",sourceDirName:".",slug:"/",permalink:"/lodestar/",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/index.md",tags:[],version:"current",frontMatter:{title:"Home"},sidebar:"tutorialSidebar",next:{title:"Introduction",permalink:"/lodestar/introduction"}},d={},c=[{value:"Welcome to the Lodestar Documentation",id:"welcome-to-the-lodestar-documentation",level:2},{value:"Getting Started",id:"getting-started",level:3},{value:"Specifications",id:"specifications",level:2},{value:"Execution Client",id:"execution-client",level:3},{value:"About These Docs",id:"about-these-docs",level:2},{value:"Need Assistance?",id:"need-assistance",level:2}];function l(e){const t={a:"a",blockquote:"blockquote",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"lodestar logo",src:n(9573).A+"",width:"3238",height:"930"})}),"\n",(0,s.jsx)(t.h2,{id:"welcome-to-the-lodestar-documentation",children:"Welcome to the Lodestar Documentation"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"Lodestar is an open-source Ethereum Consensus client and TypeScript ecosystem, maintained by ChainSafe Systems"})}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"getting-started",children:"Getting Started"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Follow the instructions for ",(0,s.jsx)(t.a,{href:"./run/getting-started/installation#build-from-source",children:"build from source"}),", ",(0,s.jsx)(t.a,{href:"./run/getting-started/installation#binaries",children:"binaries"}),", or ",(0,s.jsx)(t.a,{href:"./run/getting-started/installation#docker-installation",children:"Docker"})," to install Lodestar. Or use our ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"Lodestar Quickstart scripts"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Use ",(0,s.jsx)(t.a,{href:"/lodestar/supporting-libraries/",children:"Lodestar libraries"})," in your next Ethereum TypeScript project."]}),"\n",(0,s.jsxs)(t.li,{children:["Run a beacon node on ",(0,s.jsx)(t.a,{href:"/lodestar/run/beacon-management/starting-a-node",children:"mainnet or a public testnet"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Utilize the whole stack by ",(0,s.jsx)(t.a,{href:"/lodestar/contribution/advanced-topics/setting-up-a-testnet",children:"starting a local testnet"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["View the Lodestar Beacon ",(0,s.jsx)(t.a,{href:"/lodestar/run/beacon-management/beacon-cli",children:"CLI commands and options"})]}),"\n",(0,s.jsxs)(t.li,{children:["Prospective contributors can read the ",(0,s.jsx)(t.a,{href:"/lodestar/contribution/getting-started",children:"contributing section"})," to understand how we develop and test on Lodestar."]}),"\n",(0,s.jsxs)(t.li,{children:["If you have questions ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"submit an issue"})," or join us on ",(0,s.jsx)(t.a,{href:"https://discord.gg/yjyvFRP",children:"Discord"}),"!"]}),"\n",(0,s.jsxs)(t.li,{children:["Please note our ",(0,s.jsx)(t.a,{href:"/lodestar/security",children:"security policy"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"specifications",children:"Specifications"}),"\n",(0,s.jsx)(t.p,{children:"Hardware specifications minimum / recommended, to run the Lodestar client."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{}),(0,s.jsx)(t.th,{children:"Minimum"}),(0,s.jsx)(t.th,{children:"Recommended"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Processor"}),(0,s.jsx)(t.td,{children:"Intel Core i3\u20139100 or AMD Ryzen 5 3450"}),(0,s.jsx)(t.td,{children:"Intel Core i7\u20139700 or AMD Ryzen 7 4700"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Memory"}),(0,s.jsx)(t.td,{children:"8 GB RAM"}),(0,s.jsx)(t.td,{children:"16 GB RAM"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Storage"}),(0,s.jsx)(t.td,{children:"130 GB available space SSD"}),(0,s.jsx)(t.td,{children:"200 GB available space SSD"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Internet"}),(0,s.jsx)(t.td,{children:"Reliable broadband with 10mbps upload"}),(0,s.jsx)(t.td,{children:"Reliable broadband with >10mbps upload"})]})]})]}),"\n",(0,s.jsx)(t.h3,{id:"execution-client",children:"Execution Client"}),"\n",(0,s.jsxs)(t.p,{children:["If you run the ",(0,s.jsx)(t.a,{href:"https://ethereum.org/en/developers/docs/nodes-and-clients/#execution-clients",children:"execution client"})," on the same host, you will need to check their requirements and add them to the above requirements. Broadly, to run both an execution and a consensus client on the same machine, we recommend a 4 TB SSD and 32 GB RAM."]}),"\n",(0,s.jsx)(t.h2,{id:"about-these-docs",children:"About These Docs"}),"\n",(0,s.jsxs)(t.p,{children:["This documentation is open source, contribute on our ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/tree/unstable/docs",children:"Github Lodestar repository /docs"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"need-assistance",children:"Need Assistance?"}),"\n",(0,s.jsxs)(t.p,{children:["If you have questions about this documentation, feel free to talk to us on our ",(0,s.jsx)(t.a,{href:"https://discord.gg/yjyvFRP",children:"ChainSafe Discord"})," or ",(0,s.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"open an issue"})," and a member of the team or our community will be happy to assist you."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},9573:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/lodestar_icon_text_black_stroke-a408ae36466fb3b61b04e0a9806c1779.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var s=n(6540);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0414c4ea.899c8fcf.js b/assets/js/0414c4ea.899c8fcf.js new file mode 100644 index 000000000000..4fa10dea2603 --- /dev/null +++ b/assets/js/0414c4ea.899c8fcf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3235],{8633:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=s(4848),i=s(8453);const r={},o="Testing",a={id:"contribution/testing/index",title:"Testing",description:"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo.",source:"@site/pages/contribution/testing/index.md",sourceDirName:"contribution/testing",slug:"/contribution/testing/",permalink:"/lodestar/contribution/testing/",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/testing/index.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Core Dumps",permalink:"/lodestar/contribution/tools/core-dumps"},next:{title:"End-To-End Tests",permalink:"/lodestar/contribution/testing/end-to-end-tests"}},d={},c=[{value:"Unit Tests",id:"unit-tests",level:3},{value:"Spec Tests",id:"spec-tests",level:3},{value:"Performance Tests",id:"performance-tests",level:3},{value:"End-To-End Tests",id:"end-to-end-tests",level:3},{value:"Integration Tests",id:"integration-tests",level:3},{value:"Simulation Tests",id:"simulation-tests",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo."}),"\n",(0,n.jsx)(t.p,{children:"There are a few flags you can set through env variables to override behavior of testing and its output."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"ENV variable"}),(0,n.jsx)(t.th,{children:"Effect"}),(0,n.jsx)(t.th,{children:"Impact"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"TEST_COMPACT_DIFF"}),(0,n.jsx)(t.td,{children:"All"}),(0,n.jsx)(t.td,{children:"Will strip down the object difference rendered during test failures. Very useful for large object matching."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"TEST_QUIET_CONSOLE"}),(0,n.jsx)(t.td,{children:"All"}),(0,n.jsx)(t.td,{children:"Will strip down console output. Reduce console flickering."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"TEST_COMPACT_OUTPUT"}),(0,n.jsx)(t.td,{children:"All"}),(0,n.jsxs)(t.td,{children:["Display a condensed summary of tests run. Use vitest ",(0,n.jsx)(t.a,{href:"https://vitest.dev/guide/reporters#basic-reporter",children:"basic"})," reporter."]})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"unit-tests",children:"Unit Tests"}),"\n",(0,n.jsxs)(t.p,{children:["This is the most fundamental type of test in most code bases. In all instances mocks, stubs and other forms of isolation are used to test code on a functional, unit level. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/unit-tests",children:"Unit Tests"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"spec-tests",children:"Spec Tests"}),"\n",(0,n.jsxs)(t.p,{children:["The Ethereum Consensus Specifications are what ensure that the various consensus clients do not diverge on critical computations and will work harmoniously on the network. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/spec-tests",children:"Spec Tests"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"performance-tests",children:"Performance Tests"}),"\n",(0,n.jsxs)(t.p,{children:["Node.js is an unforgiving virtual machine when it comes to high performance, multi-threaded applications. In order to ensure that Lodestar can not only keep up with the chain, but to push the boundary of what is possible, there are lots of performance tests that benchmark programming paradigms and prevent regression. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/performance-tests",children:"Performance Testing"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"end-to-end-tests",children:"End-To-End Tests"}),"\n",(0,n.jsxs)(t.p,{children:["E2E tests are where Lodestar is run in its full form, often from the CLI as a user would to check that the system as a whole works as expected. These tests are meant to exercise the entire system in isolation and there is no network interaction, nor interaction with any other code outside of Lodestar. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/end-to-end-tests",children:"End-To-End Testing"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"integration-tests",children:"Integration Tests"}),"\n",(0,n.jsxs)(t.p,{children:["Integration tests are meant to test how Lodestar interacts with other clients, but are not considered full simulations. This is where Lodestar may make API calls or otherwise work across the process boundary, but there is required mocking, stubbing, or class isolation. An example of this is using the ",(0,n.jsx)(t.code,{children:"ExecutionEngine"})," class to make API calls to a Geth instance to check that the http requests are properly formatted."]}),"\n",(0,n.jsx)(t.h3,{id:"simulation-tests",children:"Simulation Tests"}),"\n",(0,n.jsxs)(t.p,{children:["These are the most comprehensive types of tests. They aim to test Lodestar in a fully functioning ephemeral devnet environment. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/simulation-tests",children:"Simulation Testing"})," page for more information."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0414c4ea.a324c1b2.js b/assets/js/0414c4ea.a324c1b2.js deleted file mode 100644 index 0c81f7dada24..000000000000 --- a/assets/js/0414c4ea.a324c1b2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3235],{8633:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=s(4848),i=s(8453);const r={},o="Testing",a={id:"contribution/testing/index",title:"Testing",description:"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo.",source:"@site/pages/contribution/testing/index.md",sourceDirName:"contribution/testing",slug:"/contribution/testing/",permalink:"/lodestar/contribution/testing/",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/testing/index.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Core Dumps",permalink:"/lodestar/contribution/tools/core-dumps"},next:{title:"End-To-End Tests",permalink:"/lodestar/contribution/testing/end-to-end-tests"}},d={},c=[{value:"Unit Tests",id:"unit-tests",level:3},{value:"Spec Tests",id:"spec-tests",level:3},{value:"Performance Tests",id:"performance-tests",level:3},{value:"End-To-End Tests",id:"end-to-end-tests",level:3},{value:"Integration Tests",id:"integration-tests",level:3},{value:"Simulation Tests",id:"simulation-tests",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo."}),"\n",(0,n.jsx)(t.p,{children:"There are few flags you can set through env variables to override behavior of testing and it's output."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"ENV variable"}),(0,n.jsx)(t.th,{children:"Effect"}),(0,n.jsx)(t.th,{children:"Impact"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"TEST_COMPACT_DIFF"}),(0,n.jsx)(t.td,{children:"All"}),(0,n.jsx)(t.td,{children:"Will strip down the object difference rendered during test failures. Very useful for large object matching."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"TEST_QUIET_CONSOLE"}),(0,n.jsx)(t.td,{children:"All"}),(0,n.jsx)(t.td,{children:"Will strip down console output. Reduce console flickering."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"TEST_COMPACT_OUTPUT"}),(0,n.jsx)(t.td,{children:"All"}),(0,n.jsxs)(t.td,{children:["Display a condensed summary of tests run. Use vitest ",(0,n.jsx)(t.a,{href:"https://vitest.dev/guide/reporters#basic-reporter",children:"basic"})," reporter."]})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"unit-tests",children:"Unit Tests"}),"\n",(0,n.jsxs)(t.p,{children:["This is the most fundamental type of test in most code bases. In all instances mocks, stubs and other forms of isolation are used to test code on a functional, unit level. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/unit-tests",children:"Unit Tests"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"spec-tests",children:"Spec Tests"}),"\n",(0,n.jsxs)(t.p,{children:["The Ethereum Consensus Specifications are what ensure that the various consensus clients do not diverge on critical computations and will work harmoniously on the network. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/spec-tests",children:"Spec Tests"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"performance-tests",children:"Performance Tests"}),"\n",(0,n.jsxs)(t.p,{children:["Node.js is an unforgiving virtual machine when it comes to high performance, multi-threaded applications. In order to ensure that Lodestar can not only keep up with the chain, but to push the boundary of what is possible, there are lots of performance tests that benchmark programming paradigms and prevent regression. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/performance-tests",children:"Performance Testing"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"end-to-end-tests",children:"End-To-End Tests"}),"\n",(0,n.jsxs)(t.p,{children:["E2E test are where Lodestar is run in its full form, often from the CLI as a user would to check that the system as a whole works as expected. These tests are meant to exercise the entire system in isolation and there is no network interaction, nor interaction with any other code outside of Lodestar. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/end-to-end-tests",children:"End-To-End Testing"})," page for more information."]}),"\n",(0,n.jsx)(t.h3,{id:"integration-tests",children:"Integration Tests"}),"\n",(0,n.jsxs)(t.p,{children:["Integration tests are meant to test how Lodestar interacts with other clients, but are not considered full simulations. This is where Lodestar may make API calls or otherwise work across the process boundary, but there is required mocking, stubbing, or class isolation. An example of this is using the ",(0,n.jsx)(t.code,{children:"ExecutionEngine"})," class to make API calls to a Geth instance to check that the http requests are properly formatted."]}),"\n",(0,n.jsx)(t.h3,{id:"simulation-tests",children:"Simulation Tests"}),"\n",(0,n.jsxs)(t.p,{children:["These are the most comprehensive types of tests. They aim to test Lodestar in a fully functioning ephemeral devnet environment. See the ",(0,n.jsx)(t.a,{href:"/lodestar/contribution/testing/simulation-tests",children:"Simulation Testing"})," page for more information."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(6540);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0916e813.bc796161.js b/assets/js/0916e813.bc796161.js new file mode 100644 index 000000000000..7dfc7846f51c --- /dev/null +++ b/assets/js/0916e813.bc796161.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3632],{3870:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>l,toc:()=>t});var d=i(4848),s=i(8453);const r={title:"CLI Reference"},c="dev CLI Command",l={id:"contribution/dev-cli",title:"CLI Reference",description:"Quickly bootstrap a beacon node and multiple validators. Use for development and testing",source:"@site/pages/contribution/dev-cli.md",sourceDirName:"contribution",slug:"/contribution/dev-cli",permalink:"/lodestar/contribution/dev-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/dev-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Dependency Graph",permalink:"/lodestar/contribution/depgraph"},next:{title:"Debugging",permalink:"/lodestar/contribution/tools/debugging"}},o={},t=[{value:"Examples",id:"examples",level:2},{value:"dev Options",id:"dev-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--rcConfig",id:"--rcconfig",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--genesisStateFile",id:"--genesisstatefile",level:4},{value:"--checkpointSyncUrl",id:"--checkpointsyncurl",level:4},{value:"--checkpointState",id:"--checkpointstate",level:4},{value:"--wssCheckpoint",id:"--wsscheckpoint",level:4},{value:"--forceCheckpointSync",id:"--forcecheckpointsync",level:4},{value:"--ignoreWeakSubjectivityCheck",id:"--ignoreweaksubjectivitycheck",level:4},{value:"--persistNetworkIdentity",id:"--persistnetworkidentity",level:4},{value:"--private",id:"--private",level:4},{value:"--validatorMonitorLogs",id:"--validatormonitorlogs",level:4},{value:"--disableLightClientServer",id:"--disablelightclientserver",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--rest",id:"--rest",level:4},{value:"--rest.namespace",id:"--restnamespace",level:4},{value:"--rest.cors",id:"--restcors",level:4},{value:"--rest.address",id:"--restaddress",level:4},{value:"--rest.port",id:"--restport",level:4},{value:"--rest.swaggerUI",id:"--restswaggerui",level:4},{value:"--suggestedFeeRecipient",id:"--suggestedfeerecipient",level:4},{value:"--emitPayloadAttributes",id:"--emitpayloadattributes",level:4},{value:"--chain.archiveBlobEpochs",id:"--chainarchiveblobepochs",level:4},{value:"--eth1",id:"--eth1",level:4},{value:"--eth1.providerUrls",id:"--eth1providerurls",level:4},{value:"--execution.urls",id:"--executionurls",level:4},{value:"--execution.timeout",id:"--executiontimeout",level:4},{value:"--execution.retries",id:"--executionretries",level:4},{value:"--execution.retryDelay",id:"--executionretrydelay",level:4},{value:"--execution.engineMock",id:"--executionenginemock",level:4},{value:"--jwtSecret",id:"--jwtsecret",level:4},{value:"--jwtId",id:"--jwtid",level:4},{value:"--builder",id:"--builder",level:4},{value:"--builder.url",id:"--builderurl",level:4},{value:"--builder.timeout",id:"--buildertimeout",level:4},{value:"--builder.faultInspectionWindow",id:"--builderfaultinspectionwindow",level:4},{value:"--builder.allowedFaults",id:"--builderallowedfaults",level:4},{value:"--metrics",id:"--metrics",level:4},{value:"--metrics.port",id:"--metricsport",level:4},{value:"--metrics.address",id:"--metricsaddress",level:4},{value:"--monitoring.endpoint",id:"--monitoringendpoint",level:4},{value:"--monitoring.interval",id:"--monitoringinterval",level:4},{value:"--discv5",id:"--discv5",level:4},{value:"--listenAddress",id:"--listenaddress",level:4},{value:"--port",id:"--port",level:4},{value:"--discoveryPort",id:"--discoveryport",level:4},{value:"--listenAddress6",id:"--listenaddress6",level:4},{value:"--port6",id:"--port6",level:4},{value:"--discoveryPort6",id:"--discoveryport6",level:4},{value:"--bootnodes",id:"--bootnodes",level:4},{value:"--targetPeers",id:"--targetpeers",level:4},{value:"--subscribeAllSubnets",id:"--subscribeallsubnets",level:4},{value:"--disablePeerScoring",id:"--disablepeerscoring",level:4},{value:"--mdns",id:"--mdns",level:4},{value:"--enr.ip",id:"--enrip",level:4},{value:"--enr.tcp",id:"--enrtcp",level:4},{value:"--enr.udp",id:"--enrudp",level:4},{value:"--enr.ip6",id:"--enrip6",level:4},{value:"--enr.tcp6",id:"--enrtcp6",level:4},{value:"--enr.udp6",id:"--enrudp6",level:4},{value:"--nat",id:"--nat",level:4},{value:"--keymanager",id:"--keymanager",level:4},{value:"--keymanager.auth",id:"--keymanagerauth",level:4},{value:"--keymanager.tokenFile",id:"--keymanagertokenfile",level:4},{value:"--keymanager.port",id:"--keymanagerport",level:4},{value:"--keymanager.address",id:"--keymanageraddress",level:4},{value:"--keymanager.cors",id:"--keymanagercors",level:4},{value:"--beaconNodes",id:"--beaconnodes",level:4},{value:"--force",id:"--force",level:4},{value:"--graffiti",id:"--graffiti",level:4},{value:"--proposerSettingsFile",id:"--proposersettingsfile",level:4},{value:"--strictFeeRecipientCheck",id:"--strictfeerecipientcheck",level:4},{value:"--defaultGasLimit",id:"--defaultgaslimit",level:4},{value:"--builder.selection",id:"--builderselection",level:4},{value:"--builder.boostFactor",id:"--builderboostfactor",level:4},{value:"--useProduceBlockV3",id:"--useproduceblockv3",level:4},{value:"--broadcastValidation",id:"--broadcastvalidation",level:4},{value:"--blindedLocal",id:"--blindedlocal",level:4},{value:"--importKeystores",id:"--importkeystores",level:4},{value:"--importKeystoresPassword",id:"--importkeystorespassword",level:4},{value:"--doppelgangerProtection",id:"--doppelgangerprotection",level:4},{value:"--http.requestWireFormat",id:"--httprequestwireformat",level:4},{value:"--http.responseWireFormat",id:"--httpresponsewireformat",level:4},{value:"--externalSigner.url",id:"--externalsignerurl",level:4},{value:"--externalSigner.pubkeys",id:"--externalsignerpubkeys",level:4},{value:"--externalSigner.fetch",id:"--externalsignerfetch",level:4},{value:"--externalSigner.fetchInterval",id:"--externalsignerfetchinterval",level:4},{value:"--distributed",id:"--distributed",level:4},{value:"--genesisEth1Hash",id:"--genesiseth1hash",level:4},{value:"--genesisValidators",id:"--genesisvalidators",level:4},{value:"--startValidators",id:"--startvalidators",level:4},{value:"--genesisTime",id:"--genesistime",level:4},{value:"--reset",id:"--reset",level:4},{value:"--dumpTestnetFiles",id:"--dumptestnetfiles",level:4}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(n.h1,{id:"dev-cli-command",children:[(0,d.jsx)(n.code,{children:"dev"})," CLI Command"]}),"\n",(0,d.jsx)(n.p,{children:"Quickly bootstrap a beacon node and multiple validators. Use for development and testing"}),"\n",(0,d.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,d.jsx)(n.p,{children:"Start a single beacon node with 8 interop validators"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-sh",children:"./lodestar dev --genesisValidators 8 --reset\n"})}),"\n",(0,d.jsxs)(n.h2,{id:"dev-options",children:[(0,d.jsx)(n.code,{children:"dev"})," Options"]}),"\n",(0,d.jsx)(n.h4,{id:"--datadir",children:(0,d.jsx)(n.code,{children:"--dataDir"})}),"\n",(0,d.jsx)(n.p,{children:"Lodestar root data directory"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--network",children:(0,d.jsx)(n.code,{children:"--network"})}),"\n",(0,d.jsx)(n.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"mainnet"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--paramsfile",children:(0,d.jsx)(n.code,{children:"--paramsFile"})}),"\n",(0,d.jsx)(n.p,{children:"Network configuration file"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--rcconfig",children:(0,d.jsx)(n.code,{children:"--rcConfig"})}),"\n",(0,d.jsx)(n.p,{children:"RC file to supplement command line args, accepted formats: .yml, .yaml, .json"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--terminal-total-difficulty-override",children:(0,d.jsx)(n.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,d.jsx)(n.p,{children:"Terminal PoW block TTD override"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--terminal-block-hash-override",children:(0,d.jsx)(n.code,{children:"--terminal-block-hash-override"})}),"\n",(0,d.jsx)(n.p,{children:"Terminal PoW block hash override"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--terminal-block-hash-epoch-override",children:(0,d.jsx)(n.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,d.jsx)(n.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--genesisstatefile",children:(0,d.jsx)(n.code,{children:"--genesisStateFile"})}),"\n",(0,d.jsx)(n.p,{children:"Path or URL to download a genesis state file in ssz-encoded format"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--checkpointsyncurl",children:(0,d.jsx)(n.code,{children:"--checkpointSyncUrl"})}),"\n",(0,d.jsx)(n.p,{children:"Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--checkpointstate",children:(0,d.jsx)(n.code,{children:"--checkpointState"})}),"\n",(0,d.jsx)(n.p,{children:"Set a checkpoint state to start syncing from"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--wsscheckpoint",children:(0,d.jsx)(n.code,{children:"--wssCheckpoint"})}),"\n",(0,d.jsx)(n.p,{children:"Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--forcecheckpointsync",children:(0,d.jsx)(n.code,{children:"--forceCheckpointSync"})}),"\n",(0,d.jsx)(n.p,{children:"Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--ignoreweaksubjectivitycheck",children:(0,d.jsx)(n.code,{children:"--ignoreWeakSubjectivityCheck"})}),"\n",(0,d.jsx)(n.p,{children:"Ignore the checkpoint sync state failing the weak subjectivity check. This is relevant in testnets where the weak subjectivity period is too small for even few epochs of non finalization causing last finalized to be out of range. This flag is not recommended for mainnet use."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--persistnetworkidentity",children:(0,d.jsx)(n.code,{children:"--persistNetworkIdentity"})}),"\n",(0,d.jsx)(n.p,{children:"Whether to reuse the same peer-id across restarts"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--private",children:(0,d.jsx)(n.code,{children:"--private"})}),"\n",(0,d.jsx)(n.p,{children:"Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--validatormonitorlogs",children:(0,d.jsx)(n.code,{children:"--validatorMonitorLogs"})}),"\n",(0,d.jsx)(n.p,{children:"Log validator monitor events as info. This requires metrics to be enabled."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--disablelightclientserver",children:(0,d.jsx)(n.code,{children:"--disableLightClientServer"})}),"\n",(0,d.jsx)(n.p,{children:"Disable light client server."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--loglevel",children:(0,d.jsx)(n.code,{children:"--logLevel"})}),"\n",(0,d.jsx)(n.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"info"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--logfile",children:(0,d.jsx)(n.code,{children:"--logFile"})}),"\n",(0,d.jsx)(n.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--logfilelevel",children:(0,d.jsx)(n.code,{children:"--logFileLevel"})}),"\n",(0,d.jsx)(n.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"debug"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--logfiledailyrotate",children:(0,d.jsx)(n.code,{children:"--logFileDailyRotate"})}),"\n",(0,d.jsx)(n.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"5"})]}),"\n",(0,d.jsx)(n.h4,{id:"--rest",children:(0,d.jsx)(n.code,{children:"--rest"})}),"\n",(0,d.jsx)(n.p,{children:"Enable/disable HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--restnamespace",children:(0,d.jsx)(n.code,{children:"--rest.namespace"})}),"\n",(0,d.jsx)(n.p,{children:"Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "beacon", "config", "debug", "events", "lightclient", "lodestar", "node", "proof", "validator", "*"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'["beacon","config","debug","events","node","validator","lightclient"]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--restcors",children:(0,d.jsx)(n.code,{children:"--rest.cors"})}),"\n",(0,d.jsx)(n.p,{children:"Configures the Access-Control-Allow-Origin CORS header for HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"*"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--restaddress",children:(0,d.jsx)(n.code,{children:"--rest.address"})}),"\n",(0,d.jsx)(n.p,{children:"Set host for HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--restport",children:(0,d.jsx)(n.code,{children:"--rest.port"})}),"\n",(0,d.jsx)(n.p,{children:"Set port for HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"9596"})]}),"\n",(0,d.jsx)(n.h4,{id:"--restswaggerui",children:(0,d.jsx)(n.code,{children:"--rest.swaggerUI"})}),"\n",(0,d.jsx)(n.p,{children:"Enable Swagger UI for API exploration at http://{address}:{port}/documentation"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--suggestedfeerecipient",children:(0,d.jsx)(n.code,{children:"--suggestedFeeRecipient"})}),"\n",(0,d.jsx)(n.p,{children:"Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"0x0000000000000000000000000000000000000000"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--emitpayloadattributes",children:(0,d.jsx)(n.code,{children:"--emitPayloadAttributes"})}),"\n",(0,d.jsxs)(n.p,{children:["Flag to SSE emit execution ",(0,d.jsx)(n.code,{children:"payloadAttributes"})," before every slot"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--chainarchiveblobepochs",children:(0,d.jsx)(n.code,{children:"--chain.archiveBlobEpochs"})}),"\n",(0,d.jsx)(n.p,{children:"Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--eth1",children:(0,d.jsx)(n.code,{children:"--eth1"})}),"\n",(0,d.jsx)(n.p,{children:"Whether to follow the eth1 chain"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--eth1providerurls",children:(0,d.jsx)(n.code,{children:"--eth1.providerUrls"})}),"\n",(0,d.jsx)(n.p,{children:"Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "http://localhost:8545" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionurls",children:(0,d.jsx)(n.code,{children:"--execution.urls"})}),"\n",(0,d.jsx)(n.p,{children:"Urls to execution client engine API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "http://localhost:8551" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--executiontimeout",children:(0,d.jsx)(n.code,{children:"--execution.timeout"})}),"\n",(0,d.jsx)(n.p,{children:"Timeout in milliseconds for execution engine API HTTP client"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"12000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionretries",children:(0,d.jsx)(n.code,{children:"--execution.retries"})}),"\n",(0,d.jsx)(n.p,{children:"Number of retries when calling execution engine API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"2"})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionretrydelay",children:(0,d.jsx)(n.code,{children:"--execution.retryDelay"})}),"\n",(0,d.jsx)(n.p,{children:"Delay time in milliseconds between retries when retrying calls to the execution engine API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"2000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionenginemock",children:(0,d.jsx)(n.code,{children:"--execution.engineMock"})}),"\n",(0,d.jsx)(n.p,{children:"Set the execution engine to mock mode (development only)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--jwtsecret",children:(0,d.jsx)(n.code,{children:"--jwtSecret"})}),"\n",(0,d.jsx)(n.p,{children:"File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--jwtid",children:(0,d.jsx)(n.code,{children:"--jwtId"})}),"\n",(0,d.jsx)(n.p,{children:"An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builder",children:(0,d.jsx)(n.code,{children:"--builder"})}),"\n",(0,d.jsxs)(n.p,{children:["An alias for ",(0,d.jsx)(n.code,{children:"--builder.selection default"})," for the builder flow, ignored if ",(0,d.jsx)(n.code,{children:"--builder.selection"})," is explicitly provided"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderurl",children:(0,d.jsx)(n.code,{children:"--builder.url"})}),"\n",(0,d.jsx)(n.p,{children:"Url hosting the builder API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"http://localhost:8661"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--buildertimeout",children:(0,d.jsx)(n.code,{children:"--builder.timeout"})}),"\n",(0,d.jsx)(n.p,{children:"Timeout in milliseconds for builder API HTTP client"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"12000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderfaultinspectionwindow",children:(0,d.jsx)(n.code,{children:"--builder.faultInspectionWindow"})}),"\n",(0,d.jsx)(n.p,{children:"Window to inspect missed slots for enabling/disabling builder circuit breaker"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderallowedfaults",children:(0,d.jsx)(n.code,{children:"--builder.allowedFaults"})}),"\n",(0,d.jsxs)(n.p,{children:["Number of missed slots allowed in the ",(0,d.jsx)(n.code,{children:"faultInspectionWindow"})," for builder circuit"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--metrics",children:(0,d.jsx)(n.code,{children:"--metrics"})}),"\n",(0,d.jsx)(n.p,{children:"Enable the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--metricsport",children:(0,d.jsx)(n.code,{children:"--metrics.port"})}),"\n",(0,d.jsx)(n.p,{children:"Listen TCP port for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"5064"})]}),"\n",(0,d.jsx)(n.h4,{id:"--metricsaddress",children:(0,d.jsx)(n.code,{children:"--metrics.address"})}),"\n",(0,d.jsx)(n.p,{children:"Listen address for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--monitoringendpoint",children:(0,d.jsx)(n.code,{children:"--monitoring.endpoint"})}),"\n",(0,d.jsx)(n.p,{children:"Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--monitoringinterval",children:(0,d.jsx)(n.code,{children:"--monitoring.interval"})}),"\n",(0,d.jsx)(n.p,{children:"Interval in milliseconds between sending client stats to the remote service"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"60000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--discv5",children:(0,d.jsx)(n.code,{children:"--discv5"})}),"\n",(0,d.jsx)(n.p,{children:"Enable discv5"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--listenaddress",children:(0,d.jsx)(n.code,{children:"--listenAddress"})}),"\n",(0,d.jsx)(n.p,{children:"The IPv4 address to listen for p2p UDP and TCP connections"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"0.0.0.0"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--port",children:(0,d.jsx)(n.code,{children:"--port"})}),"\n",(0,d.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"9000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--discoveryport",children:(0,d.jsx)(n.code,{children:"--discoveryPort"})}),"\n",(0,d.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,d.jsx)(n.code,{children:"port"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"port"})]}),"\n",(0,d.jsx)(n.h4,{id:"--listenaddress6",children:(0,d.jsx)(n.code,{children:"--listenAddress6"})}),"\n",(0,d.jsx)(n.p,{children:"The IPv6 address to listen for p2p UDP and TCP connections"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--port6",children:(0,d.jsx)(n.code,{children:"--port6"})}),"\n",(0,d.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"9090"})]}),"\n",(0,d.jsx)(n.h4,{id:"--discoveryport6",children:(0,d.jsx)(n.code,{children:"--discoveryPort6"})}),"\n",(0,d.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,d.jsx)(n.code,{children:"port6"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"port6"})]}),"\n",(0,d.jsx)(n.h4,{id:"--bootnodes",children:(0,d.jsx)(n.code,{children:"--bootnodes"})}),"\n",(0,d.jsx)(n.p,{children:"Bootnodes for discv5 discovery"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "[]" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--targetpeers",children:(0,d.jsx)(n.code,{children:"--targetPeers"})}),"\n",(0,d.jsx)(n.p,{children:"The target connected peers. Above this number peers will be disconnected"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"100"})]}),"\n",(0,d.jsx)(n.h4,{id:"--subscribeallsubnets",children:(0,d.jsx)(n.code,{children:"--subscribeAllSubnets"})}),"\n",(0,d.jsx)(n.p,{children:"Subscribe to all subnets regardless of validator count"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--disablepeerscoring",children:(0,d.jsx)(n.code,{children:"--disablePeerScoring"})}),"\n",(0,d.jsx)(n.p,{children:"Disable peer scoring, used for testing on devnets"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--mdns",children:(0,d.jsx)(n.code,{children:"--mdns"})}),"\n",(0,d.jsx)(n.p,{children:"Enable mdns local peer discovery"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrip",children:(0,d.jsx)(n.code,{children:"--enr.ip"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR IP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrtcp",children:(0,d.jsx)(n.code,{children:"--enr.tcp"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR TCP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrudp",children:(0,d.jsx)(n.code,{children:"--enr.udp"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR UDP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrip6",children:(0,d.jsx)(n.code,{children:"--enr.ip6"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR IPv6 entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrtcp6",children:(0,d.jsx)(n.code,{children:"--enr.tcp6"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR (IPv6-specific) TCP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrudp6",children:(0,d.jsx)(n.code,{children:"--enr.udp6"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR (IPv6-specific) UDP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--nat",children:(0,d.jsx)(n.code,{children:"--nat"})}),"\n",(0,d.jsx)(n.p,{children:"Allow configuration of non-local addresses"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--keymanager",children:(0,d.jsx)(n.code,{children:"--keymanager"})}),"\n",(0,d.jsx)(n.p,{children:"Enable key manager API server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--keymanagerauth",children:(0,d.jsx)(n.code,{children:"--keymanager.auth"})}),"\n",(0,d.jsx)(n.p,{children:"Enable token bearer authentication for key manager API server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--keymanagertokenfile",children:(0,d.jsx)(n.code,{children:"--keymanager.tokenFile"})}),"\n",(0,d.jsx)(n.p,{children:"Path to file containing bearer token used for key manager API authentication"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--keymanagerport",children:(0,d.jsx)(n.code,{children:"--keymanager.port"})}),"\n",(0,d.jsx)(n.p,{children:"Set port for key manager API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"5062"})]}),"\n",(0,d.jsx)(n.h4,{id:"--keymanageraddress",children:(0,d.jsx)(n.code,{children:"--keymanager.address"})}),"\n",(0,d.jsx)(n.p,{children:"Set host for key manager API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--keymanagercors",children:(0,d.jsx)(n.code,{children:"--keymanager.cors"})}),"\n",(0,d.jsx)(n.p,{children:"Configures the Access-Control-Allow-Origin CORS header for key manager API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"*"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--beaconnodes",children:(0,d.jsx)(n.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(n.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--force",children:(0,d.jsx)(n.code,{children:"--force"})}),"\n",(0,d.jsx)(n.p,{children:"Open validators even if there's a lockfile. Use with caution"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--graffiti",children:(0,d.jsx)(n.code,{children:"--graffiti"})}),"\n",(0,d.jsx)(n.p,{children:"Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--proposersettingsfile",children:(0,d.jsx)(n.code,{children:"--proposerSettingsFile"})}),"\n",(0,d.jsx)(n.p,{children:"A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--strictfeerecipientcheck",children:(0,d.jsx)(n.code,{children:"--strictFeeRecipientCheck"})}),"\n",(0,d.jsxs)(n.p,{children:["Enable strict checking of the validator's ",(0,d.jsx)(n.code,{children:"feeRecipient"})," with the one returned by engine"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--defaultgaslimit",children:(0,d.jsx)(n.code,{children:"--defaultGasLimit"})}),"\n",(0,d.jsx)(n.p,{children:"Suggested gas limit to the engine/builder for building execution payloads. Only used post merge."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"30000000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderselection",children:(0,d.jsx)(n.code,{children:"--builder.selection"})}),"\n",(0,d.jsxs)(n.p,{children:["Builder block selection strategy ",(0,d.jsx)(n.code,{children:"default"}),", ",(0,d.jsx)(n.code,{children:"maxprofit"}),", ",(0,d.jsx)(n.code,{children:"builderalways"}),", ",(0,d.jsx)(n.code,{children:"builderonly"}),", ",(0,d.jsx)(n.code,{children:"executionalways"}),", or ",(0,d.jsx)(n.code,{children:"executiononly"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"executiononly"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderboostfactor",children:(0,d.jsx)(n.code,{children:"--builder.boostFactor"})}),"\n",(0,d.jsxs)(n.p,{children:["Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if ",(0,d.jsx)(n.code,{children:"--builder.selection"})," is set to anything other than ",(0,d.jsx)(n.code,{children:"maxprofit"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"100"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--useproduceblockv3",children:(0,d.jsx)(n.code,{children:"--useProduceBlockV3"})}),"\n",(0,d.jsx)(n.p,{children:"Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--broadcastvalidation",children:(0,d.jsx)(n.code,{children:"--broadcastValidation"})}),"\n",(0,d.jsx)(n.p,{children:"Validations to be run by beacon node for the signed block prior to publishing"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"gossip"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--blindedlocal",children:(0,d.jsx)(n.code,{children:"--blindedLocal"})}),"\n",(0,d.jsx)(n.p,{children:"Request fetching local block in blinded format for produceBlockV3"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--importkeystores",children:(0,d.jsx)(n.code,{children:"--importKeystores"})}),"\n",(0,d.jsx)(n.p,{children:"Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "./keystores/*.json" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--importkeystorespassword",children:(0,d.jsx)(n.code,{children:"--importKeystoresPassword"})}),"\n",(0,d.jsxs)(n.p,{children:["Path to a file with password to decrypt all keystores from ",(0,d.jsx)(n.code,{children:"importKeystores"})," option"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"./password.txt"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--doppelgangerprotection",children:(0,d.jsx)(n.code,{children:"--doppelgangerProtection"})}),"\n",(0,d.jsx)(n.p,{children:"Enables Doppelganger protection"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--httprequestwireformat",children:(0,d.jsx)(n.code,{children:"--http.requestWireFormat"})}),"\n",(0,d.jsxs)(n.p,{children:["Wire format to use in HTTP requests to beacon node. Can be one of ",(0,d.jsx)(n.code,{children:"json"})," or ",(0,d.jsx)(n.code,{children:"ssz"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"json"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--httpresponsewireformat",children:(0,d.jsx)(n.code,{children:"--http.responseWireFormat"})}),"\n",(0,d.jsxs)(n.p,{children:["Preferred wire format for HTTP responses from beacon node. Can be one of ",(0,d.jsx)(n.code,{children:"json"})," or ",(0,d.jsx)(n.code,{children:"ssz"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"ssz"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--externalsignerurl",children:(0,d.jsx)(n.code,{children:"--externalSigner.url"})}),"\n",(0,d.jsx)(n.p,{children:"URL to connect to an external signing server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--externalsignerpubkeys",children:(0,d.jsx)(n.code,{children:"--externalSigner.pubkeys"})}),"\n",(0,d.jsx)(n.p,{children:"List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsx)(n.h4,{id:"--externalsignerfetch",children:(0,d.jsx)(n.code,{children:"--externalSigner.fetch"})}),"\n",(0,d.jsxs)(n.p,{children:["Fetch the list of public keys to validate from an external signer. Cannot be used in combination with ",(0,d.jsx)(n.code,{children:"--externalSigner.pubkeys"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--externalsignerfetchinterval",children:(0,d.jsx)(n.code,{children:"--externalSigner.fetchInterval"})}),"\n",(0,d.jsx)(n.p,{children:"Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--distributed",children:(0,d.jsx)(n.code,{children:"--distributed"})}),"\n",(0,d.jsx)(n.p,{children:"Enables specific features required to run as part of a distributed validator cluster"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--genesiseth1hash",children:(0,d.jsx)(n.code,{children:"--genesisEth1Hash"})}),"\n",(0,d.jsx)(n.p,{children:"If present it will create genesis with this eth1 hash."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--genesisvalidators",children:(0,d.jsx)(n.code,{children:"--genesisValidators"})}),"\n",(0,d.jsx)(n.p,{children:"If present it will create genesis with interop validators and start chain."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"8"})]}),"\n",(0,d.jsx)(n.h4,{id:"--startvalidators",children:(0,d.jsx)(n.code,{children:"--startValidators"})}),"\n",(0,d.jsx)(n.p,{children:"Start interop validators in inclusive range with notation '0..7'"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--genesistime",children:(0,d.jsx)(n.code,{children:"--genesisTime"})}),"\n",(0,d.jsx)(n.p,{children:"genesis_time to initialize interop genesis state"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"now"})]}),"\n",(0,d.jsx)(n.h4,{id:"--reset",children:(0,d.jsx)(n.code,{children:"--reset"})}),"\n",(0,d.jsx)(n.p,{children:"To delete chain and validator directories"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--dumptestnetfiles",children:(0,d.jsx)(n.code,{children:"--dumpTestnetFiles"})}),"\n",(0,d.jsx)(n.p,{children:"Dump testnet files and exit"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]})]})}function a(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>l});var d=i(6540);const s={},r=d.createContext(s);function c(e){const n=d.useContext(r);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),d.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0916e813.f48d5292.js b/assets/js/0916e813.f48d5292.js deleted file mode 100644 index f424e36675b4..000000000000 --- a/assets/js/0916e813.f48d5292.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3632],{3870:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>a,frontMatter:()=>s,metadata:()=>c,toc:()=>t});var i=d(4848),r=d(8453);const s={title:"CLI Reference"},l="dev CLI Command",c={id:"contribution/dev-cli",title:"CLI Reference",description:"Quickly bootstrap a beacon node and multiple validators. Use for development and testing",source:"@site/pages/contribution/dev-cli.md",sourceDirName:"contribution",slug:"/contribution/dev-cli",permalink:"/lodestar/contribution/dev-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/dev-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Dependency Graph",permalink:"/lodestar/contribution/depgraph"},next:{title:"Debugging",permalink:"/lodestar/contribution/tools/debugging"}},o={},t=[{value:"Examples",id:"examples",level:2},{value:"dev Options",id:"dev-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--checkpointSyncUrl",id:"--checkpointsyncurl",level:4},{value:"--checkpointState",id:"--checkpointstate",level:4},{value:"--wssCheckpoint",id:"--wsscheckpoint",level:4},{value:"--forceCheckpointSync",id:"--forcecheckpointsync",level:4},{value:"--private",id:"--private",level:4},{value:"--validatorMonitorLogs",id:"--validatormonitorlogs",level:4},{value:"--disableLightClientServer",id:"--disablelightclientserver",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--rest",id:"--rest",level:4},{value:"--rest.namespace",id:"--restnamespace",level:4},{value:"--rest.cors",id:"--restcors",level:4},{value:"--rest.address",id:"--restaddress",level:4},{value:"--rest.port",id:"--restport",level:4},{value:"--rest.swaggerUI",id:"--restswaggerui",level:4},{value:"--suggestedFeeRecipient",id:"--suggestedfeerecipient",level:4},{value:"--emitPayloadAttributes",id:"--emitpayloadattributes",level:4},{value:"--chain.archiveBlobEpochs",id:"--chainarchiveblobepochs",level:4},{value:"--eth1",id:"--eth1",level:4},{value:"--eth1.providerUrls",id:"--eth1providerurls",level:4},{value:"--execution.urls",id:"--executionurls",level:4},{value:"--execution.timeout",id:"--executiontimeout",level:4},{value:"--execution.retries",id:"--executionretries",level:4},{value:"--execution.retryDelay",id:"--executionretrydelay",level:4},{value:"--execution.engineMock",id:"--executionenginemock",level:4},{value:"--jwtSecret",id:"--jwtsecret",level:4},{value:"--jwtId",id:"--jwtid",level:4},{value:"--builder",id:"--builder",level:4},{value:"--builder.url",id:"--builderurl",level:4},{value:"--builder.timeout",id:"--buildertimeout",level:4},{value:"--builder.faultInspectionWindow",id:"--builderfaultinspectionwindow",level:4},{value:"--builder.allowedFaults",id:"--builderallowedfaults",level:4},{value:"--metrics",id:"--metrics",level:4},{value:"--metrics.port",id:"--metricsport",level:4},{value:"--metrics.address",id:"--metricsaddress",level:4},{value:"--monitoring.endpoint",id:"--monitoringendpoint",level:4},{value:"--monitoring.interval",id:"--monitoringinterval",level:4},{value:"--discv5",id:"--discv5",level:4},{value:"--listenAddress",id:"--listenaddress",level:4},{value:"--port",id:"--port",level:4},{value:"--discoveryPort",id:"--discoveryport",level:4},{value:"--listenAddress6",id:"--listenaddress6",level:4},{value:"--port6",id:"--port6",level:4},{value:"--discoveryPort6",id:"--discoveryport6",level:4},{value:"--bootnodes",id:"--bootnodes",level:4},{value:"--targetPeers",id:"--targetpeers",level:4},{value:"--subscribeAllSubnets",id:"--subscribeallsubnets",level:4},{value:"--disablePeerScoring",id:"--disablepeerscoring",level:4},{value:"--mdns",id:"--mdns",level:4},{value:"--enr.ip",id:"--enrip",level:4},{value:"--enr.tcp",id:"--enrtcp",level:4},{value:"--enr.udp",id:"--enrudp",level:4},{value:"--enr.ip6",id:"--enrip6",level:4},{value:"--enr.tcp6",id:"--enrtcp6",level:4},{value:"--enr.udp6",id:"--enrudp6",level:4},{value:"--nat",id:"--nat",level:4},{value:"--keymanager",id:"--keymanager",level:4},{value:"--keymanager.auth",id:"--keymanagerauth",level:4},{value:"--keymanager.tokenFile",id:"--keymanagertokenfile",level:4},{value:"--keymanager.port",id:"--keymanagerport",level:4},{value:"--keymanager.address",id:"--keymanageraddress",level:4},{value:"--keymanager.cors",id:"--keymanagercors",level:4},{value:"--beaconNodes",id:"--beaconnodes",level:4},{value:"--force",id:"--force",level:4},{value:"--graffiti",id:"--graffiti",level:4},{value:"--proposerSettingsFile",id:"--proposersettingsfile",level:4},{value:"--strictFeeRecipientCheck",id:"--strictfeerecipientcheck",level:4},{value:"--defaultGasLimit",id:"--defaultgaslimit",level:4},{value:"--builder.selection",id:"--builderselection",level:4},{value:"--builder.boostFactor",id:"--builderboostfactor",level:4},{value:"--useProduceBlockV3",id:"--useproduceblockv3",level:4},{value:"--broadcastValidation",id:"--broadcastvalidation",level:4},{value:"--blindedLocal",id:"--blindedlocal",level:4},{value:"--importKeystores",id:"--importkeystores",level:4},{value:"--importKeystoresPassword",id:"--importkeystorespassword",level:4},{value:"--doppelgangerProtection",id:"--doppelgangerprotection",level:4},{value:"--http.requestWireFormat",id:"--httprequestwireformat",level:4},{value:"--http.responseWireFormat",id:"--httpresponsewireformat",level:4},{value:"--externalSigner.url",id:"--externalsignerurl",level:4},{value:"--externalSigner.pubkeys",id:"--externalsignerpubkeys",level:4},{value:"--externalSigner.fetch",id:"--externalsignerfetch",level:4},{value:"--externalSigner.fetchInterval",id:"--externalsignerfetchinterval",level:4},{value:"--distributed",id:"--distributed",level:4},{value:"--genesisEth1Hash",id:"--genesiseth1hash",level:4},{value:"--genesisValidators",id:"--genesisvalidators",level:4},{value:"--startValidators",id:"--startvalidators",level:4},{value:"--genesisTime",id:"--genesistime",level:4},{value:"--reset",id:"--reset",level:4},{value:"--dumpTestnetFiles",id:"--dumptestnetfiles",level:4}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.h1,{id:"dev-cli-command",children:[(0,i.jsx)(n.code,{children:"dev"})," CLI Command"]}),"\n",(0,i.jsx)(n.p,{children:"Quickly bootstrap a beacon node and multiple validators. Use for development and testing"}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.p,{children:"Start a single beacon node with 8 interop validators"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"./lodestar dev --genesisValidators 8 --reset\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"dev-options",children:[(0,i.jsx)(n.code,{children:"dev"})," Options"]}),"\n",(0,i.jsx)(n.h4,{id:"--datadir",children:(0,i.jsx)(n.code,{children:"--dataDir"})}),"\n",(0,i.jsx)(n.p,{children:"Lodestar root data directory"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--network",children:(0,i.jsx)(n.code,{children:"--network"})}),"\n",(0,i.jsx)(n.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"mainnet"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--paramsfile",children:(0,i.jsx)(n.code,{children:"--paramsFile"})}),"\n",(0,i.jsx)(n.p,{children:"Network configuration file"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--terminal-total-difficulty-override",children:(0,i.jsx)(n.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,i.jsx)(n.p,{children:"Terminal PoW block TTD override"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--terminal-block-hash-override",children:(0,i.jsx)(n.code,{children:"--terminal-block-hash-override"})}),"\n",(0,i.jsx)(n.p,{children:"Terminal PoW block hash override"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--terminal-block-hash-epoch-override",children:(0,i.jsx)(n.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,i.jsx)(n.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--checkpointsyncurl",children:(0,i.jsx)(n.code,{children:"--checkpointSyncUrl"})}),"\n",(0,i.jsx)(n.p,{children:"Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--checkpointstate",children:(0,i.jsx)(n.code,{children:"--checkpointState"})}),"\n",(0,i.jsx)(n.p,{children:"Set a checkpoint state to start syncing from"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--wsscheckpoint",children:(0,i.jsx)(n.code,{children:"--wssCheckpoint"})}),"\n",(0,i.jsx)(n.p,{children:"Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--forcecheckpointsync",children:(0,i.jsx)(n.code,{children:"--forceCheckpointSync"})}),"\n",(0,i.jsx)(n.p,{children:"Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--private",children:(0,i.jsx)(n.code,{children:"--private"})}),"\n",(0,i.jsx)(n.p,{children:"Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--validatormonitorlogs",children:(0,i.jsx)(n.code,{children:"--validatorMonitorLogs"})}),"\n",(0,i.jsx)(n.p,{children:"Log validator monitor events as info. This requires metrics to be enabled."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--disablelightclientserver",children:(0,i.jsx)(n.code,{children:"--disableLightClientServer"})}),"\n",(0,i.jsx)(n.p,{children:"Disable light client server."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--loglevel",children:(0,i.jsx)(n.code,{children:"--logLevel"})}),"\n",(0,i.jsx)(n.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"info"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--logfile",children:(0,i.jsx)(n.code,{children:"--logFile"})}),"\n",(0,i.jsx)(n.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--logfilelevel",children:(0,i.jsx)(n.code,{children:"--logFileLevel"})}),"\n",(0,i.jsx)(n.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"debug"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--logfiledailyrotate",children:(0,i.jsx)(n.code,{children:"--logFileDailyRotate"})}),"\n",(0,i.jsx)(n.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"5"})]}),"\n",(0,i.jsx)(n.h4,{id:"--rest",children:(0,i.jsx)(n.code,{children:"--rest"})}),"\n",(0,i.jsx)(n.p,{children:"Enable/disable HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--restnamespace",children:(0,i.jsx)(n.code,{children:"--rest.namespace"})}),"\n",(0,i.jsx)(n.p,{children:"Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "beacon", "config", "debug", "events", "lightclient", "lodestar", "node", "proof", "validator", "*"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'["beacon","config","debug","events","node","validator","lightclient"]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--restcors",children:(0,i.jsx)(n.code,{children:"--rest.cors"})}),"\n",(0,i.jsx)(n.p,{children:"Configures the Access-Control-Allow-Origin CORS header for HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"*"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--restaddress",children:(0,i.jsx)(n.code,{children:"--rest.address"})}),"\n",(0,i.jsx)(n.p,{children:"Set host for HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--restport",children:(0,i.jsx)(n.code,{children:"--rest.port"})}),"\n",(0,i.jsx)(n.p,{children:"Set port for HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"9596"})]}),"\n",(0,i.jsx)(n.h4,{id:"--restswaggerui",children:(0,i.jsx)(n.code,{children:"--rest.swaggerUI"})}),"\n",(0,i.jsx)(n.p,{children:"Enable Swagger UI for API exploration at http://{address}:{port}/documentation"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--suggestedfeerecipient",children:(0,i.jsx)(n.code,{children:"--suggestedFeeRecipient"})}),"\n",(0,i.jsx)(n.p,{children:"Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"0x0000000000000000000000000000000000000000"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--emitpayloadattributes",children:(0,i.jsx)(n.code,{children:"--emitPayloadAttributes"})}),"\n",(0,i.jsxs)(n.p,{children:["Flag to SSE emit execution ",(0,i.jsx)(n.code,{children:"payloadAttributes"})," before every slot"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--chainarchiveblobepochs",children:(0,i.jsx)(n.code,{children:"--chain.archiveBlobEpochs"})}),"\n",(0,i.jsx)(n.p,{children:"Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--eth1",children:(0,i.jsx)(n.code,{children:"--eth1"})}),"\n",(0,i.jsx)(n.p,{children:"Whether to follow the eth1 chain"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--eth1providerurls",children:(0,i.jsx)(n.code,{children:"--eth1.providerUrls"})}),"\n",(0,i.jsx)(n.p,{children:"Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "http://localhost:8545" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionurls",children:(0,i.jsx)(n.code,{children:"--execution.urls"})}),"\n",(0,i.jsx)(n.p,{children:"Urls to execution client engine API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "http://localhost:8551" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--executiontimeout",children:(0,i.jsx)(n.code,{children:"--execution.timeout"})}),"\n",(0,i.jsx)(n.p,{children:"Timeout in milliseconds for execution engine API HTTP client"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"12000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionretries",children:(0,i.jsx)(n.code,{children:"--execution.retries"})}),"\n",(0,i.jsx)(n.p,{children:"Number of retries when calling execution engine API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"2"})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionretrydelay",children:(0,i.jsx)(n.code,{children:"--execution.retryDelay"})}),"\n",(0,i.jsx)(n.p,{children:"Delay time in milliseconds between retries when retrying calls to the execution engine API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"2000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionenginemock",children:(0,i.jsx)(n.code,{children:"--execution.engineMock"})}),"\n",(0,i.jsx)(n.p,{children:"Set the execution engine to mock mode (development only)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--jwtsecret",children:(0,i.jsx)(n.code,{children:"--jwtSecret"})}),"\n",(0,i.jsx)(n.p,{children:"File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--jwtid",children:(0,i.jsx)(n.code,{children:"--jwtId"})}),"\n",(0,i.jsx)(n.p,{children:"An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builder",children:(0,i.jsx)(n.code,{children:"--builder"})}),"\n",(0,i.jsxs)(n.p,{children:["An alias for ",(0,i.jsx)(n.code,{children:"--builder.selection default"})," for the builder flow, ignored if ",(0,i.jsx)(n.code,{children:"--builder.selection"})," is explicitly provided"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderurl",children:(0,i.jsx)(n.code,{children:"--builder.url"})}),"\n",(0,i.jsx)(n.p,{children:"Url hosting the builder API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"http://localhost:8661"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--buildertimeout",children:(0,i.jsx)(n.code,{children:"--builder.timeout"})}),"\n",(0,i.jsx)(n.p,{children:"Timeout in milliseconds for builder API HTTP client"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"12000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderfaultinspectionwindow",children:(0,i.jsx)(n.code,{children:"--builder.faultInspectionWindow"})}),"\n",(0,i.jsx)(n.p,{children:"Window to inspect missed slots for enabling/disabling builder circuit breaker"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderallowedfaults",children:(0,i.jsx)(n.code,{children:"--builder.allowedFaults"})}),"\n",(0,i.jsxs)(n.p,{children:["Number of missed slots allowed in the ",(0,i.jsx)(n.code,{children:"faultInspectionWindow"})," for builder circuit"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--metrics",children:(0,i.jsx)(n.code,{children:"--metrics"})}),"\n",(0,i.jsx)(n.p,{children:"Enable the Prometheus metrics HTTP server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--metricsport",children:(0,i.jsx)(n.code,{children:"--metrics.port"})}),"\n",(0,i.jsx)(n.p,{children:"Listen TCP port for the Prometheus metrics HTTP server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"5064"})]}),"\n",(0,i.jsx)(n.h4,{id:"--metricsaddress",children:(0,i.jsx)(n.code,{children:"--metrics.address"})}),"\n",(0,i.jsx)(n.p,{children:"Listen address for the Prometheus metrics HTTP server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--monitoringendpoint",children:(0,i.jsx)(n.code,{children:"--monitoring.endpoint"})}),"\n",(0,i.jsx)(n.p,{children:"Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--monitoringinterval",children:(0,i.jsx)(n.code,{children:"--monitoring.interval"})}),"\n",(0,i.jsx)(n.p,{children:"Interval in milliseconds between sending client stats to the remote service"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"60000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--discv5",children:(0,i.jsx)(n.code,{children:"--discv5"})}),"\n",(0,i.jsx)(n.p,{children:"Enable discv5"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--listenaddress",children:(0,i.jsx)(n.code,{children:"--listenAddress"})}),"\n",(0,i.jsx)(n.p,{children:"The IPv4 address to listen for p2p UDP and TCP connections"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"0.0.0.0"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--port",children:(0,i.jsx)(n.code,{children:"--port"})}),"\n",(0,i.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"9000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--discoveryport",children:(0,i.jsx)(n.code,{children:"--discoveryPort"})}),"\n",(0,i.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,i.jsx)(n.code,{children:"port"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"port"})]}),"\n",(0,i.jsx)(n.h4,{id:"--listenaddress6",children:(0,i.jsx)(n.code,{children:"--listenAddress6"})}),"\n",(0,i.jsx)(n.p,{children:"The IPv6 address to listen for p2p UDP and TCP connections"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--port6",children:(0,i.jsx)(n.code,{children:"--port6"})}),"\n",(0,i.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"9090"})]}),"\n",(0,i.jsx)(n.h4,{id:"--discoveryport6",children:(0,i.jsx)(n.code,{children:"--discoveryPort6"})}),"\n",(0,i.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,i.jsx)(n.code,{children:"port6"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"port6"})]}),"\n",(0,i.jsx)(n.h4,{id:"--bootnodes",children:(0,i.jsx)(n.code,{children:"--bootnodes"})}),"\n",(0,i.jsx)(n.p,{children:"Bootnodes for discv5 discovery"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "[]" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--targetpeers",children:(0,i.jsx)(n.code,{children:"--targetPeers"})}),"\n",(0,i.jsx)(n.p,{children:"The target connected peers. Above this number peers will be disconnected"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"100"})]}),"\n",(0,i.jsx)(n.h4,{id:"--subscribeallsubnets",children:(0,i.jsx)(n.code,{children:"--subscribeAllSubnets"})}),"\n",(0,i.jsx)(n.p,{children:"Subscribe to all subnets regardless of validator count"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--disablepeerscoring",children:(0,i.jsx)(n.code,{children:"--disablePeerScoring"})}),"\n",(0,i.jsx)(n.p,{children:"Disable peer scoring, used for testing on devnets"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--mdns",children:(0,i.jsx)(n.code,{children:"--mdns"})}),"\n",(0,i.jsx)(n.p,{children:"Enable mdns local peer discovery"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrip",children:(0,i.jsx)(n.code,{children:"--enr.ip"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR IP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrtcp",children:(0,i.jsx)(n.code,{children:"--enr.tcp"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR TCP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrudp",children:(0,i.jsx)(n.code,{children:"--enr.udp"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR UDP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrip6",children:(0,i.jsx)(n.code,{children:"--enr.ip6"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR IPv6 entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrtcp6",children:(0,i.jsx)(n.code,{children:"--enr.tcp6"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR (IPv6-specific) TCP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrudp6",children:(0,i.jsx)(n.code,{children:"--enr.udp6"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR (IPv6-specific) UDP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--nat",children:(0,i.jsx)(n.code,{children:"--nat"})}),"\n",(0,i.jsx)(n.p,{children:"Allow configuration of non-local addresses"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--keymanager",children:(0,i.jsx)(n.code,{children:"--keymanager"})}),"\n",(0,i.jsx)(n.p,{children:"Enable key manager API server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--keymanagerauth",children:(0,i.jsx)(n.code,{children:"--keymanager.auth"})}),"\n",(0,i.jsx)(n.p,{children:"Enable token bearer authentication for key manager API server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--keymanagertokenfile",children:(0,i.jsx)(n.code,{children:"--keymanager.tokenFile"})}),"\n",(0,i.jsx)(n.p,{children:"Path to file containing bearer token used for key manager API authentication"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--keymanagerport",children:(0,i.jsx)(n.code,{children:"--keymanager.port"})}),"\n",(0,i.jsx)(n.p,{children:"Set port for key manager API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"5062"})]}),"\n",(0,i.jsx)(n.h4,{id:"--keymanageraddress",children:(0,i.jsx)(n.code,{children:"--keymanager.address"})}),"\n",(0,i.jsx)(n.p,{children:"Set host for key manager API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--keymanagercors",children:(0,i.jsx)(n.code,{children:"--keymanager.cors"})}),"\n",(0,i.jsx)(n.p,{children:"Configures the Access-Control-Allow-Origin CORS header for key manager API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"*"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--beaconnodes",children:(0,i.jsx)(n.code,{children:"--beaconNodes"})}),"\n",(0,i.jsx)(n.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--force",children:(0,i.jsx)(n.code,{children:"--force"})}),"\n",(0,i.jsx)(n.p,{children:"Open validators even if there's a lockfile. Use with caution"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--graffiti",children:(0,i.jsx)(n.code,{children:"--graffiti"})}),"\n",(0,i.jsx)(n.p,{children:"Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--proposersettingsfile",children:(0,i.jsx)(n.code,{children:"--proposerSettingsFile"})}),"\n",(0,i.jsx)(n.p,{children:"A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--strictfeerecipientcheck",children:(0,i.jsx)(n.code,{children:"--strictFeeRecipientCheck"})}),"\n",(0,i.jsxs)(n.p,{children:["Enable strict checking of the validator's ",(0,i.jsx)(n.code,{children:"feeRecipient"})," with the one returned by engine"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--defaultgaslimit",children:(0,i.jsx)(n.code,{children:"--defaultGasLimit"})}),"\n",(0,i.jsx)(n.p,{children:"Suggested gas limit to the engine/builder for building execution payloads. Only used post merge."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"30000000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderselection",children:(0,i.jsx)(n.code,{children:"--builder.selection"})}),"\n",(0,i.jsxs)(n.p,{children:["Builder block selection strategy ",(0,i.jsx)(n.code,{children:"default"}),", ",(0,i.jsx)(n.code,{children:"maxprofit"}),", ",(0,i.jsx)(n.code,{children:"builderalways"}),", ",(0,i.jsx)(n.code,{children:"builderonly"}),", ",(0,i.jsx)(n.code,{children:"executionalways"}),", or ",(0,i.jsx)(n.code,{children:"executiononly"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"executiononly"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderboostfactor",children:(0,i.jsx)(n.code,{children:"--builder.boostFactor"})}),"\n",(0,i.jsxs)(n.p,{children:["Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if ",(0,i.jsx)(n.code,{children:"--builder.selection"})," is set to anything other than ",(0,i.jsx)(n.code,{children:"maxprofit"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"100"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--useproduceblockv3",children:(0,i.jsx)(n.code,{children:"--useProduceBlockV3"})}),"\n",(0,i.jsx)(n.p,{children:"Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--broadcastvalidation",children:(0,i.jsx)(n.code,{children:"--broadcastValidation"})}),"\n",(0,i.jsx)(n.p,{children:"Validations to be run by beacon node for the signed block prior to publishing"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"gossip"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--blindedlocal",children:(0,i.jsx)(n.code,{children:"--blindedLocal"})}),"\n",(0,i.jsx)(n.p,{children:"Request fetching local block in blinded format for produceBlockV3"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--importkeystores",children:(0,i.jsx)(n.code,{children:"--importKeystores"})}),"\n",(0,i.jsx)(n.p,{children:"Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "./keystores/*.json" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--importkeystorespassword",children:(0,i.jsx)(n.code,{children:"--importKeystoresPassword"})}),"\n",(0,i.jsxs)(n.p,{children:["Path to a file with password to decrypt all keystores from ",(0,i.jsx)(n.code,{children:"importKeystores"})," option"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"./password.txt"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--doppelgangerprotection",children:(0,i.jsx)(n.code,{children:"--doppelgangerProtection"})}),"\n",(0,i.jsx)(n.p,{children:"Enables Doppelganger protection"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--httprequestwireformat",children:(0,i.jsx)(n.code,{children:"--http.requestWireFormat"})}),"\n",(0,i.jsxs)(n.p,{children:["Wire format to use in HTTP requests to beacon node. Can be one of ",(0,i.jsx)(n.code,{children:"json"})," or ",(0,i.jsx)(n.code,{children:"ssz"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"json"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--httpresponsewireformat",children:(0,i.jsx)(n.code,{children:"--http.responseWireFormat"})}),"\n",(0,i.jsxs)(n.p,{children:["Preferred wire format for HTTP responses from beacon node. Can be one of ",(0,i.jsx)(n.code,{children:"json"})," or ",(0,i.jsx)(n.code,{children:"ssz"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"ssz"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--externalsignerurl",children:(0,i.jsx)(n.code,{children:"--externalSigner.url"})}),"\n",(0,i.jsx)(n.p,{children:"URL to connect to an external signing server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--externalsignerpubkeys",children:(0,i.jsx)(n.code,{children:"--externalSigner.pubkeys"})}),"\n",(0,i.jsx)(n.p,{children:"List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsx)(n.h4,{id:"--externalsignerfetch",children:(0,i.jsx)(n.code,{children:"--externalSigner.fetch"})}),"\n",(0,i.jsxs)(n.p,{children:["Fetch the list of public keys to validate from an external signer. Cannot be used in combination with ",(0,i.jsx)(n.code,{children:"--externalSigner.pubkeys"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--externalsignerfetchinterval",children:(0,i.jsx)(n.code,{children:"--externalSigner.fetchInterval"})}),"\n",(0,i.jsx)(n.p,{children:"Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--distributed",children:(0,i.jsx)(n.code,{children:"--distributed"})}),"\n",(0,i.jsx)(n.p,{children:"Enables specific features required to run as part of a distributed validator cluster"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--genesiseth1hash",children:(0,i.jsx)(n.code,{children:"--genesisEth1Hash"})}),"\n",(0,i.jsx)(n.p,{children:"If present it will create genesis with this eth1 hash."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--genesisvalidators",children:(0,i.jsx)(n.code,{children:"--genesisValidators"})}),"\n",(0,i.jsx)(n.p,{children:"If present it will create genesis with interop validators and start chain."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"8"})]}),"\n",(0,i.jsx)(n.h4,{id:"--startvalidators",children:(0,i.jsx)(n.code,{children:"--startValidators"})}),"\n",(0,i.jsx)(n.p,{children:"Start interop validators in inclusive range with notation '0..7'"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--genesistime",children:(0,i.jsx)(n.code,{children:"--genesisTime"})}),"\n",(0,i.jsx)(n.p,{children:"genesis_time to initialize interop genesis state"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"now"})]}),"\n",(0,i.jsx)(n.h4,{id:"--reset",children:(0,i.jsx)(n.code,{children:"--reset"})}),"\n",(0,i.jsx)(n.p,{children:"To delete chain and validator directories"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--dumptestnetfiles",children:(0,i.jsx)(n.code,{children:"--dumpTestnetFiles"})}),"\n",(0,i.jsx)(n.p,{children:"Dump testnet files and exit"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,d)=>{d.d(n,{R:()=>l,x:()=>c});var i=d(6540);const r={},s=i.createContext(r);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0bc418af.0a1a185e.js b/assets/js/0bc418af.0a1a185e.js deleted file mode 100644 index 2207d1a93f63..000000000000 --- a/assets/js/0bc418af.0a1a185e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[2190],{5483:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),i=t(8453);const s={title:"Starting a Node"},r="Beacon management",a={id:"run/beacon-management/starting-a-node",title:"Starting a Node",description:"The following instructions are required to setup and run a Lodestar beacon node.",source:"@site/pages/run/beacon-management/starting-a-node.md",sourceDirName:"run/beacon-management",slug:"/run/beacon-management/starting-a-node",permalink:"/lodestar/run/beacon-management/starting-a-node",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/beacon-management/starting-a-node.md",tags:[],version:"current",frontMatter:{title:"Starting a Node"},sidebar:"tutorialSidebar",previous:{title:"Installation",permalink:"/lodestar/run/getting-started/installation"},next:{title:"CLI Reference",permalink:"/lodestar/run/beacon-management/beacon-cli"}},c={},l=[{value:"Connect to mainnet or a public testnet",id:"connect-to-mainnet-or-a-public-testnet",level:2},{value:"Configure the Lodestar JWT authentication token",id:"configure-the-lodestar-jwt-authentication-token",level:2},{value:"Generate a secret key",id:"generate-a-secret-key",level:3},{value:"Configure Lodestar to locate the JWT secret",id:"configure-lodestar-to-locate-the-jwt-secret",level:3},{value:"Ensure JWT is configured with your execution node",id:"ensure-jwt-is-configured-with-your-execution-node",level:3},{value:"Run a beacon node",id:"run-a-beacon-node",level:2},{value:"Checkpoint Sync",id:"checkpoint-sync",level:3},{value:"Guide to the sync logs",id:"guide-to-the-sync-logs",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"beacon-management",children:"Beacon management"}),"\n",(0,o.jsx)(n.p,{children:"The following instructions are required to setup and run a Lodestar beacon node."}),"\n",(0,o.jsx)(n.h2,{id:"connect-to-mainnet-or-a-public-testnet",children:"Connect to mainnet or a public testnet"}),"\n",(0,o.jsx)(n.p,{children:"Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal."}),"\n",(0,o.jsx)(n.p,{children:"Make sure Lodestar is installed in your local environment, following the chosen install method. The following command should return a non error message."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./lodestar --help\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For a complete list of beacon node CLI commands and options, see the ",(0,o.jsxs)(n.a,{href:"/lodestar/run/beacon-management/beacon-cli",children:[(0,o.jsx)(n.code,{children:"beacon"})," CLI Command"]})," section."]}),"\n",(0,o.jsxs)(n.p,{children:["To select a known testnet or mainnet, use the ",(0,o.jsx)(n.code,{children:"--network"})," flag. ",(0,o.jsx)(n.code,{children:"mainnet"})," is selected by default, and a list of available networks is listed with the ",(0,o.jsx)(n.code,{children:"--help"})," flag. Setting the ",(0,o.jsx)(n.code,{children:"--network"})," flag will conveniently configure the beacon node or validator client for the selected network. For power users, any configuration option should be able to be overridden."]}),"\n",(0,o.jsx)(n.h2,{id:"configure-the-lodestar-jwt-authentication-token",children:"Configure the Lodestar JWT authentication token"}),"\n",(0,o.jsxs)(n.p,{children:["Post-Merge Ethereum will require ",(0,o.jsx)(n.a,{href:"https://github.com/ethereum/execution-apis/blob/main/src/engine/authentication.md",children:"secure authentication with the Engine API"})," connection on your chosen Execution node."]}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["Post-Merge Ethereum ",(0,o.jsx)(n.strong,{children:"requires"})," a secure, authenticated connection to the Execution client on port 8551. We recommend setting this up now to ensure a proper configuration before the Merge."]})}),"\n",(0,o.jsx)(n.h3,{id:"generate-a-secret-key",children:"Generate a secret key"}),"\n",(0,o.jsxs)(n.p,{children:["You must generate a secret 32-byte (64 characters) hexadecimal string that will be used to authenticate with an execution node. You can use the following command in most terminals to generate a random secret: ",(0,o.jsx)(n.code,{children:"openssl rand -hex 32"}),". Or you can use an ",(0,o.jsx)(n.a,{href:"https://codebeautify.org/generate-random-hexadecimal-numbers",children:"online generator"}),". Save this secret key into a text file and note where you store this file."]}),"\n",(0,o.jsx)(n.h3,{id:"configure-lodestar-to-locate-the-jwt-secret",children:"Configure Lodestar to locate the JWT secret"}),"\n",(0,o.jsxs)(n.p,{children:["When starting up a Lodestar beacon node in any configuration, ensure you add the ",(0,o.jsx)(n.code,{children:"--jwtSecret $JWT_SECRET_PATH"})," flag to point to the saved secret key file."]}),"\n",(0,o.jsx)(n.h3,{id:"ensure-jwt-is-configured-with-your-execution-node",children:"Ensure JWT is configured with your execution node"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Go Ethereum:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--authrpc.jwtsecret /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://geth.ethereum.org/docs/getting-started#start-geth",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Nethermind:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--JsonRpc.JwtSecretFile /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://docs.nethermind.io/get-started/consensus-clients/#configuring-json-rpc-interface",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Besu:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--engine-jwt-secret=/path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://besu.hyperledger.org/public-networks/how-to/use-besu-api/authenticate#2-create-the-jwt",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Erigon:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--authrpc.jwtsecret /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://github.com/ledgerwatch/erigon?tab=readme-ov-file#beacon-chain-consensus-layer",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Reth:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--authrpc.jwtsecret /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://reth.rs/run/mainnet.html?highlight=jwt#running-the-reth-node",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"run-a-beacon-node",children:"Run a beacon node"}),"\n",(0,o.jsx)(n.p,{children:"To start a Lodestar beacon run the command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This will assume an execution-layer client is available at the default\nlocation of ",(0,o.jsx)(n.code,{children:"https://localhost:8545"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["In case execution-layer clients are available at different locations, use ",(0,o.jsx)(n.code,{children:"--execution.urls"})," to specify these locations in the command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH --execution.urls $EL_URL1 $EL_URL2\n"})}),"\n",(0,o.jsx)(n.p,{children:"Immediately you should see confirmation that the node has started"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:12:45.274[] info: Lodestar network=mainnet, version=v1.7.2, commit=\nApr-20 15:12:45.327[] info: Connected to LevelDB database path=/data/mt1/chain-db\nApr-20 15:12:57.747[] info: Initializing beacon from a valid db state slot=6264480, epoch=195765, stateRoot=0x8133cd4d0be59c3e94405f902fe0ad68ffaa5013b525dddb6285b91ad79716f6, isWithinWeakSubjectivityPeriod=true\nApr-20 15:13:18.077[network] info: PeerId 16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ, Multiaddrs /ip4/127.0.0.1/tcp/9000/p2p/16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ,/ip4/10.244.0.199/tcp/9000/p2p/16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ\nApr-20 15:13:18.270[rest] info: Started REST API server address=http://127.0.0.1:9596\nApr-20 15:13:18.271[] warn: Low peer count peers=0\nApr-20 15:13:18.280[] info: Searching peers - peers: 0 - slot: 6264964 - head: (slot - 484) 0x7ee6\u20262a15 - exec-block: syncing(17088043 0x9442\u2026) - finalized: 0xe359\u20264d7e:195763\nApr-20 15:13:23.009[chain] info: Validated transition configuration with execution client terminalTotalDifficulty=0xc70d808a128d7380000, terminalBlockHash=0x0000000000000000000000000000000000000000000000000000000000000000, terminalBlockNumber=0x0\nApr-20 15:13:29.287[] info: Syncing - ? left - 0.00 slots/s - slot: 6264965 - head: (slot - 485) 0x7ee6\u20262a15 - exec-block: syncing(17088043 0x9442\u2026) - finalized: 0xe359\u20264d7e:195763 - peers: 1\nApr-20 15:14:41.003[] info: Syncing - 22 seconds left - 4.92 slots/s - slot: 6264971 - head: (slot - 108) 0xd15f\u2026b605 - exec-block: valid(17088414 0x3dba\u2026) - finalized: 0x70fd\u20265157:195775 - peers: 4\nApr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot - 45) 0x44e4\u202620a4 - exec-block: valid(17088475 0xca61\u2026) - finalized: 0x9cbd\u2026ba83:195776 - peers: 8\nApr-20 15:15:01.443[network] info: Subscribed gossip core topics\nApr-20 15:15:01.446[sync] info: Subscribed gossip core topics\nApr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea\u2026c655 - exec-block: valid(17088521 0xca9b\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 6\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["If your node is stuck with ",(0,o.jsx)(n.code,{children:"Searching for peers"})," review your network configuration to make sure your ports are open."]})}),"\n",(0,o.jsxs)(n.p,{children:["By default, Lodestar stores all configuration and chain data at the path ",(0,o.jsx)(n.code,{children:"$XDG_DATA_HOME/lodestar/$NETWORK_NAME"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["A young testnet should take a few hours to sync. If you see multiple or consistent errors in the logs, please open a ",(0,o.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"Github issue"})," or reach out to us in ",(0,o.jsx)(n.a,{href:"https://discord.gg/yjyvFRP",children:"Discord"}),". Just by reporting anomalies you are helping accelerate the progress of Ethereum Consensus, thanks for contributing!"]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"It is dangerous to expose your Beacon APIs publicly as there is no default authentication mechanism provided. Ensure your beacon node host is not exposing ports 8545 or 9596 outside of your internal network."})}),"\n",(0,o.jsx)(n.h3,{id:"checkpoint-sync",children:"Checkpoint Sync"}),"\n",(0,o.jsxs)(n.p,{children:['If you are starting your node from a blank db, like starting from genesis, or from the last saved state in db and the network is now far ahead, your node will be susceptible to "long range attacks." Ethereum\'s solution to this is via something called weak subjectivity. ',(0,o.jsx)(n.a,{href:"https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/",children:"Read Vitalik's illuminating post explaining weak subjectivity."}),"."]}),"\n",(0,o.jsx)(n.p,{children:'If you have a synced beacon node available (e.g., your friend\'s node or an infrastructure provider) and a trusted checkpoint you can rely on, you can start off your beacon node in under a minute! And at the same time kicking the "long range attack" in its butt!'}),"\n",(0,o.jsxs)(n.p,{children:["Just supply these ",(0,o.jsx)(n.strong,{children:"extra arguments"})," to your beacon node command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"--checkpointSyncUrl [--wssCheckpoint ]\n"})}),"\n",(0,o.jsxs)(n.p,{children:["In case you really trust ",(0,o.jsx)(n.code,{children:"checkpointSyncUrl"})," then you may skip providing ",(0,o.jsx)(n.code,{children:"wssCheckpoint"}),", which will then result into your beacon node syncing and starting off the recently finalized state from the trusted URL."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["Please use this option very carefully (and at your own risk), a malicious server URL can put you on the wrong chain with a danger of you losing your funds by social engineering.\nIf possible, validate your ",(0,o.jsx)(n.code,{children:"wssCheckpoint"})," from multiple places (e.g. different client distributions) or from other trusted sources. This will highly reduce the risk of starting off on a malicious chain.\nThis list of ",(0,o.jsx)(n.a,{href:"https://eth-clients.github.io/checkpoint-sync-endpoints/",children:"public endpoints"})," maintained by the Ethereum community may be used for reference."]})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Taking too long to sync?"})}),"\n",(0,o.jsxs)(n.p,{children:["After your node has been offline for a while, it might be the case that it takes a long time to sync even though a ",(0,o.jsx)(n.code,{children:"checkpointSyncUrl"})," is specified.\nThis is due to the fact that the last db state is still within the weak subjectivity period (~15 days on mainnet) which causes the node\nto sync from the db state instead of the checkpoint state."]}),"\n",(0,o.jsxs)(n.p,{children:["It is possible to force syncing from checkpoint state by supplying the ",(0,o.jsx)(n.code,{children:"--forceCheckpointSync"})," flag. This option is only recommended if it is absolutely\nnecessary for the node to be synced right away to fulfill its duties as there is an inherent risk each time the state is obtained from an external source."]}),"\n",(0,o.jsx)(n.h3,{id:"guide-to-the-sync-logs",children:"Guide to the sync logs"}),"\n",(0,o.jsx)(n.p,{children:"Lodestar beacon sync log aims to provide information of utmost importance about your node and yet be succinct at the same time. You may see the sync logs in the following format:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.code,{children:"[Sync status] - [ Slot info ] - [Head info] - [Exec block info] - [Finalized info] - [Peers info]"})}),"\n",(0,o.jsx)(n.p,{children:"See the following example of different kinds of sync log:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:24:08.034[] info: Searching peers - peers: 0 - slot: 6265018 - head: 6264018 0xed93\u20267b0a - exec-block: syncing(17088476 0x9649\u2026) - finalized: 0xbf30\u20267e7c:195777\nApr-20 15:24:17.000[] info: Searching peers - peers: 0 - slot: 6265019 - head: 6264018 0xed93\u20267b0a - exec-block: syncing(17088476 0x9649\u2026) - finalized: 0xbf30\u20267e7c:195777\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:13:41.298[] info: Syncing - 2.5 minutes left - 2.78 slots/s - slot: 6264966 - head: 6262966 0x5cec\u2026f5b8 - exec-block: valid(17088105 0x6f74\u2026) - finalized: 0x5cc0\u20263874:195764 - peers: 1\nApr-20 15:13:41.298[] info: Syncing - 2 minutes left - 2.78 slots/s - slot: 6264967 - head: 6263965 0x5cec\u2026f5b8 - exec-block: valid(17088105 0x6f74\u2026) - finalized: 0x5cc0\u20263874:195764 - peers: 1\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:13:53.151[] info: Syncing - 1.6 minutes left - 3.82 slots/s - slot: 6264967 - head: (slot -360) 0xe0cf\u20269f3c - exec-block: valid(17088167 0x2d6a\u2026) - finalized: 0x8f3f\u20262f81:195766 - peers: 5\nApr-20 15:14:05.425[] info: Syncing - 1.1 minutes left - 4.33 slots/s - slot: 6264968 - head: (slot -297) 0x3655\u20261658 - exec-block: valid(17088231 0xdafd\u2026) - finalized: 0x9475\u2026425a:195769 - peers: 2\nApr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot -45) 0x44e4\u202620a4 - exec-block: valid(17088475 0xca61\u2026) - finalized: 0x9cbd\u2026ba83:195776 - peers: 8\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:15:01.443[network] info: Subscribed gossip core topics\nApr-20 15:15:01.446[sync] info: Subscribed gossip core topics\nApr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea\u2026c655 - exec-block: valid(17088521 0xca9b\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 6\nApr-20 15:15:17.003[] info: Synced - slot: 6264974 - head: 0x4f7e\u20260e3a - exec-block: valid(17088522 0x08b1\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 6\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:15:41.001[] info: Synced - slot: 6264976 - head: (slot -1) 0x17c6\u202671a7 - exec-block: valid(17088524 0x5bc1\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 8\nApr-20 15:15:53.001[] info: Synced - slot: 6264977 - head: (slot -2) 0x17c6\u202671a7 - exec-block: valid(17088524 0x5bc1\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 8\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:16:05.000[] info: Synced - slot: 6264978 - head: 0xc9fd\u202628c5 - exec-block: valid(17088526 0xb5bf\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 8\nApr-20 15:16:17.017[] info: Synced - slot: 6264979 - head: 0xde91\u2026d4cb - exec-block: valid(17088527 0xa488\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 7\n"})}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Sync status: Takes three values : ",(0,o.jsx)(n.code,{children:"Synced"})," or ",(0,o.jsx)(n.code,{children:"Syncing"})," (along with sync speed info) or ",(0,o.jsx)(n.code,{children:"Searching"})," if node is is still looking for viable peers from where it can download blocks."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Slot (clock) info: What is the current ongoing slot as per the chain genesis"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Head info: It specifies where the local chain head hash is. In case its far behind the Slot (clock) then it independently shows the head slot else it show how far behind from the Slot it is if difference < 1000."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Execution block info: It provides the execution information about the head whether its confirmed ",(0,o.jsx)(n.code,{children:"valid"})," or execution layer is still ",(0,o.jsx)(n.code,{children:"syncing"})," to it, as well as its number and a short hash to easy identification."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Finalized info: What is the current local ",(0,o.jsx)(n.code,{children:"finalized"})," checkpoint in the format of ",(0,o.jsx)(n.code,{children:"[checkpoint root]:[checkpoint epoch]"}),", for e.g.: ",(0,o.jsx)(n.code,{children:"0xd7ba\u20268386:189636"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Peer info: Current total number of outbound or inbound peers, for e.g.: ",(0,o.jsx)(n.code,{children:"peers: 27"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For more insight into how a Lodestar beacon node is functioning, you may setup lodestar metrics and use the prepared Grafana dashboards that are found in the repository. Check out our section on ",(0,o.jsx)(n.a,{href:"/lodestar/run/logging-and-metrics/prometheus-grafana",children:"Prometheus and Grafana"})," for more details."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var o=t(6540);const i={},s=o.createContext(i);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0bc418af.40c26511.js b/assets/js/0bc418af.40c26511.js new file mode 100644 index 000000000000..4395162f767d --- /dev/null +++ b/assets/js/0bc418af.40c26511.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[2190],{5483:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=t(4848),i=t(8453);const s={title:"Starting a Node"},r="Beacon Management",a={id:"run/beacon-management/starting-a-node",title:"Starting a Node",description:"Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal. The following instructions are required to configure and run the Lodestar beacon node. This page assumes you have already setup an Ethereum execution client.",source:"@site/pages/run/beacon-management/starting-a-node.md",sourceDirName:"run/beacon-management",slug:"/run/beacon-management/starting-a-node",permalink:"/lodestar/run/beacon-management/starting-a-node",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/beacon-management/starting-a-node.md",tags:[],version:"current",frontMatter:{title:"Starting a Node"},sidebar:"tutorialSidebar",previous:{title:"Quick Start Custom Setup Guide",permalink:"/lodestar/run/getting-started/quick-start-custom-guide"},next:{title:"CLI Reference",permalink:"/lodestar/run/beacon-management/beacon-cli"}},c={},l=[{value:"Connect to Mainnet or a Public Testnet",id:"connect-to-mainnet-or-a-public-testnet",level:2},{value:"Configure the Lodestar JWT Authentication Token",id:"configure-the-lodestar-jwt-authentication-token",level:2},{value:"Generate a Secret Key",id:"generate-a-secret-key",level:3},{value:"Configure Lodestar to Locate the JWT Secret",id:"configure-lodestar-to-locate-the-jwt-secret",level:3},{value:"Configure the Execution Client with the JWT Secret",id:"configure-the-execution-client-with-the-jwt-secret",level:3},{value:"Run the Beacon Node",id:"run-the-beacon-node",level:2},{value:"Checkpoint Sync",id:"checkpoint-sync",level:3},{value:"Still Taking Long to Sync?",id:"still-taking-long-to-sync",level:4},{value:"Sync Log Guide",id:"sync-log-guide",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"beacon-management",children:"Beacon Management"}),"\n",(0,o.jsx)(n.p,{children:"Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal. The following instructions are required to configure and run the Lodestar beacon node. This page assumes you have already setup an Ethereum execution client."}),"\n",(0,o.jsx)(n.h2,{id:"connect-to-mainnet-or-a-public-testnet",children:"Connect to Mainnet or a Public Testnet"}),"\n",(0,o.jsxs)(n.p,{children:["Make sure Lodestar is installed in your local environment, following the chosen ",(0,o.jsx)(n.a,{href:"/lodestar/run/getting-started/installation",children:"Installation"})," method. The following command should return a non-error message."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./lodestar --help\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For a complete list of beacon node CLI commands and options, see the ",(0,o.jsxs)(n.a,{href:"/lodestar/run/beacon-management/beacon-cli",children:[(0,o.jsx)(n.code,{children:"beacon"})," CLI Command"]})," section."]}),"\n",(0,o.jsxs)(n.p,{children:["To select a known testnet or mainnet, use the ",(0,o.jsx)(n.code,{children:"--network"})," flag. The option ",(0,o.jsx)(n.code,{children:"mainnet"})," is selected by default, and a list of available networks is listed with the ",(0,o.jsx)(n.code,{children:"--help"})," flag. Setting the ",(0,o.jsx)(n.code,{children:"--network"})," flag will conveniently configure the beacon node for the selected network. For power users, any configuration option should be able to be overridden."]}),"\n",(0,o.jsx)(n.h2,{id:"configure-the-lodestar-jwt-authentication-token",children:"Configure the Lodestar JWT Authentication Token"}),"\n",(0,o.jsxs)(n.p,{children:["Ethereum requires a ",(0,o.jsx)(n.a,{href:"https://github.com/ethereum/execution-apis/blob/main/src/engine/authentication.md",children:"secure authentication with the Engine API"})," for connecting to your chosen execution client on port 8551."]}),"\n",(0,o.jsx)(n.h3,{id:"generate-a-secret-key",children:"Generate a Secret Key"}),"\n",(0,o.jsxs)(n.p,{children:["You must generate a secret 32-byte (64 characters) hexadecimal string that will be used to authenticate with an execution node. You can use the following command in most terminals to generate a random secret: ",(0,o.jsx)(n.code,{children:"openssl rand -hex 32"}),". Or you can use an ",(0,o.jsx)(n.a,{href:"https://codebeautify.org/generate-random-hexadecimal-numbers",children:"online generator"}),". Save this secret key into a text file and note where you store this file."]}),"\n",(0,o.jsx)(n.h3,{id:"configure-lodestar-to-locate-the-jwt-secret",children:"Configure Lodestar to Locate the JWT Secret"}),"\n",(0,o.jsxs)(n.p,{children:["When starting up a Lodestar beacon node in any configuration, ensure you add the ",(0,o.jsx)(n.code,{children:"--jwtSecret $JWT_SECRET_PATH"})," flag to point to the saved secret key file."]}),"\n",(0,o.jsx)(n.h3,{id:"configure-the-execution-client-with-the-jwt-secret",children:"Configure the Execution Client with the JWT Secret"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Go Ethereum:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--authrpc.jwtsecret /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://geth.ethereum.org/docs/getting-started#start-geth",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Nethermind:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--JsonRpc.JwtSecretFile /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://docs.nethermind.io/get-started/consensus-clients/#configuring-json-rpc-interface",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Besu:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--engine-jwt-secret=/path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://besu.hyperledger.org/public-networks/how-to/use-besu-api/authenticate#2-create-the-jwt",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Erigon:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--authrpc.jwtsecret /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://github.com/ledgerwatch/erigon?tab=readme-ov-file#beacon-chain-consensus-layer",children:"here"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"For Reth:"}),"\nUse the ",(0,o.jsx)(n.code,{children:"--authrpc.jwtsecret /path/to/jwtsecret.hex"})," flag to configure the secret. Use their documentation ",(0,o.jsx)(n.a,{href:"https://reth.rs/run/mainnet.html?highlight=jwt#running-the-reth-node",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"run-the-beacon-node",children:"Run the Beacon Node"}),"\n",(0,o.jsx)(n.p,{children:"To start the Lodestar beacon, run the command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This will assume an execution client is available at the default location of ",(0,o.jsx)(n.code,{children:"https://localhost:8545"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If the execution clients are available at different locations, use the flag ",(0,o.jsx)(n.code,{children:"--execution.urls"})," to specify these locations in the command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH --execution.urls $EL_URL1 $EL_URL2\n"})}),"\n",(0,o.jsx)(n.p,{children:"Your initial logs should confirm that the node has started."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Jul-31 13:35:27.967[] info: Lodestar network=mainnet, version=v1.21.0/ff35faa, commit=ff35faae4ad1697b86d708a0367a95a71648ab6e\nJul-31 13:35:28.344[] info: Connected to LevelDB database path=/data/lodestar/chain-db\nJul-31 13:35:49.828[] info: Initializing beacon from a valid db state slot=9633504, epoch=301047, stateRoot=0xfa2845a6877b98555906a1654941c97d9c05bdd41e61cc0870a967dc9030b156, isWithinWeakSubjectivityPeriod=true\nJul-31 13:35:51.955[chain] info: Historical state worker started\nJul-31 13:35:51.969[eth1] info: Eth1 provider urls=http://localhost:8551\nJul-31 13:35:51.975[execution] info: Execution client urls=http://localhost:8551\nJul-31 13:35:51.977[] info: External builder url=http://localhost:8661\nJul-31 13:36:21.128[network] info: running libp2p instance in worker thread\nJul-31 13:36:21.727[network] info: libp2p worker started peer=15Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW\nJul-31 13:36:27.677[network] info: discv5 worker started peerId=16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, initialENR=enr:-IO4QHGTUd1Zg8LAhUAioOz_ySTKoJLIOa6zltSP_AvvhTFVYw6M6YB35IxsiKxQG7nUgCpUB5SIsNxMntCNlTK9sMEBgmlkgnY0iXNlY3AyNTZrMaEC24cdmzuGnWqSwF-8Hw2gbkAZDzMWW3LsHJfp_kDhy-GDdGNwgiMog3VkcIIeWH, bindAddr4=/ip4/0.0.0.0/udp/9000\nJul-31 13:36:28.134[network] info: PeerId 16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, Multiaddrs /ip4/0.0.0.0/tcp/9000\nJul-31 13:36:28.137[metrics] info: Started metrics HTTP server address=http://127.0.0.1:8008\nJul-31 13:36:28.256[rest] info: Started REST API server address=http://0.0.0.0:9596\nJul-31 13:36:28.257[] info: Searching peers - peers: 0 - slot: 9634080 - head: (slot -576) 0x9d88\u2026d02a - exec-block: syncing(20426302 0xcec4\u2026) - finalized: 0x7feb\u2026c130:301045\nJul-31 13:36:36.461[execution] info: Execution client is synced oldState=ONLINE, newState=SYNCED\nJul-31 13:36:53.019[] info: Syncing - 3.7 minutes left - 2.32 slots/s - slot: 9634082 - head: (slot -515) 0x792f\u2026f8aa - exec-block: valid(20426365 0x58b1\u2026) - finalized: 0x9d88\u2026d02a:301047 - peers: 11\nJul-31 13:38:53.168[] info: Syncing - 11 seconds left - 4.01 slots/s - slot: 9634092 - head: (slot -44) 0x7491\u2026f63e - exec-block: valid(20426841 0xd4b2\u2026) - finalized: 0x1e00\u20266e6b:301062 - peers: 59\nJul-31 13:38:58.051[network] info: Subscribed gossip core topics\nJul-31 13:38:58.132[sync] info: Subscribed gossip core topics\nJul-31 13:39:05.001[] info: Synced - slot: 9634093 - head: 0x35de\u20261f0e - exec-block: valid(20426886 0x10ff\u2026) - finalized: 0x88f8\u20265375:301063 - peers: 70\nJul-31 13:39:17.000[] info: Synced - slot: 9634094 - head: 0x7844\u20263b3e - exec-block: valid(20426887 0x67d1\u2026) - finalized: 0x88f8\u20265375:301063 - peers: 69\nJul-31 13:39:29.000[] info: Synced - slot: 9634095 - head: 0x5516\u2026ba12 - exec-block: valid(20426888 0x4ceb\u2026) - finalized: 0x88f8\u20265375:301063 - peers: 74\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["If your node is stuck with ",(0,o.jsx)(n.code,{children:"Searching peers"}),", review your network configuration to make sure your ports are open and forwarded to your host machine."]})}),"\n",(0,o.jsxs)(n.p,{children:["By default, Lodestar stores all configuration and chain data at the path ",(0,o.jsx)(n.code,{children:"$XDG_DATA_HOME/lodestar/$NETWORK_NAME"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["A young testnet should take a few hours to sync. If you see multiple or consistent errors in the logs, please open a ",(0,o.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"Github issue"})," or reach out to us in ",(0,o.jsx)(n.a,{href:"https://discord.gg/yjyvFRP",children:"Discord"}),". By reporting anomalies, you are helping to accelerate the progress of Ethereum consensus and we thank you for contributing!"]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"It is dangerous to expose your Beacon or Execution APIs publicly as there is no default authentication mechanism provided. Ensure your beacon node host is not exposing ports 8545 or 9596 outside of your internal network."})}),"\n",(0,o.jsx)(n.h3,{id:"checkpoint-sync",children:"Checkpoint Sync"}),"\n",(0,o.jsxs)(n.p,{children:['If you are starting your node from a blank database, or from a last saved database state that is too old (outside of the weak subjectivity period), your node will be susceptible to "long range attacks." Ethereum\'s solution to this attack is via something called weak subjectivity. ',(0,o.jsx)(n.a,{href:"https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/",children:"Read Vitalik's illuminating post explaining weak subjectivity."}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If you have a synced beacon node available (e.g., your friend's node or a trusted infrastructure provider) to serve a trusted checkpoint you can rely on, you can start syncing your beacon node from that available checkpoint with the flag ",(0,o.jsx)(n.code,{children:"--checkpointSyncUrl"})," and passing in the URL of the checkpoint provider. This will allow your beacon node to sync within minutes rather than several days."]}),"\n",(0,o.jsxs)(n.p,{children:["The Ethereum community has maintained a set of ",(0,o.jsx)(n.a,{href:"https://eth-clients.github.io/checkpoint-sync-endpoints/",children:"public beacon chain checkpoints"})," that serve these sync endpoints to the larger community. You can correlate the state root and the block root with more than one provider to verify the checkpoints being served follow the same canonical chain."]}),"\n",(0,o.jsxs)(n.p,{children:["Just supply these ",(0,o.jsx)(n.strong,{children:"extra arguments"})," to your beacon node command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"--checkpointSyncUrl [--wssCheckpoint ]\n"})}),"\n",(0,o.jsxs)(n.p,{children:["In case you really trust the ",(0,o.jsx)(n.code,{children:"--checkpointSyncUrl"})," provider, then you may skip providing ",(0,o.jsx)(n.code,{children:"--wssCheckpoint"}),", which will then result into your beacon node syncing and starting off the recently finalized state from the trusted URL."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["Please be aware that a malicious checkpoint sync server URL can put you on the wrong chain with a danger of you losing your funds by social engineering.\nIf possible, validate your ",(0,o.jsx)(n.code,{children:"wssCheckpoint"})," state from multiple places (e.g. different client distributions) or from other trusted sources. This will highly reduce the risk of starting off on a malicious chain. This list of ",(0,o.jsx)(n.a,{href:"https://eth-clients.github.io/checkpoint-sync-endpoints/",children:"public endpoints"})," maintained by the Ethereum community may be used for reference."]})}),"\n",(0,o.jsx)(n.h4,{id:"still-taking-long-to-sync",children:"Still Taking Long to Sync?"}),"\n",(0,o.jsxs)(n.p,{children:["After your node has been offline for a while, it might be the case that it takes a long time to sync even though a ",(0,o.jsx)(n.code,{children:"--checkpointSyncUrl"})," is specified.\nThis is due to the fact that the last database state is still within the weak subjectivity period (~15 days on mainnet) which causes the node\nto sync from the database state instead of the checkpoint state."]}),"\n",(0,o.jsxs)(n.p,{children:["It is possible to force syncing from a checkpoint state by supplying the ",(0,o.jsx)(n.code,{children:"--forceCheckpointSync"})," flag. This option is only recommended if it is absolutely\nnecessary for the node to be synced right away to fulfill its duties as there is an inherent risk each time the state is obtained from an external source."]}),"\n",(0,o.jsx)(n.h3,{id:"sync-log-guide",children:"Sync Log Guide"}),"\n",(0,o.jsx)(n.p,{children:"The Lodestar beacon sync log aims to provide information of utmost importance about the state of your node and be succinct at the same time. You may see the sync logs in the following format:"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.code,{children:"[Sync status] - [ Slot info ] - [Head info] - [Execution block info] - [Finalized info] - [Peers info]"})}),"\n",(0,o.jsx)(n.p,{children:"See the following example of different kinds of sync log:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:24:08.034[] info: Searching peers - peers: 0 - slot: 6265018 - head: 6264018 0xed93\u20267b0a - exec-block: syncing(17088476 0x9649\u2026) - finalized: 0xbf30\u20267e7c:195777\nApr-20 15:24:17.000[] info: Searching peers - peers: 0 - slot: 6265019 - head: 6264018 0xed93\u20267b0a - exec-block: syncing(17088476 0x9649\u2026) - finalized: 0xbf30\u20267e7c:195777\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:13:41.298[] info: Syncing - 2.5 minutes left - 2.78 slots/s - slot: 6264966 - head: 6262966 0x5cec\u2026f5b8 - exec-block: valid(17088105 0x6f74\u2026) - finalized: 0x5cc0\u20263874:195764 - peers: 1\nApr-20 15:13:41.298[] info: Syncing - 2 minutes left - 2.78 slots/s - slot: 6264967 - head: 6263965 0x5cec\u2026f5b8 - exec-block: valid(17088105 0x6f74\u2026) - finalized: 0x5cc0\u20263874:195764 - peers: 1\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:13:53.151[] info: Syncing - 1.6 minutes left - 3.82 slots/s - slot: 6264967 - head: (slot -360) 0xe0cf\u20269f3c - exec-block: valid(17088167 0x2d6a\u2026) - finalized: 0x8f3f\u20262f81:195766 - peers: 5\nApr-20 15:14:05.425[] info: Syncing - 1.1 minutes left - 4.33 slots/s - slot: 6264968 - head: (slot -297) 0x3655\u20261658 - exec-block: valid(17088231 0xdafd\u2026) - finalized: 0x9475\u2026425a:195769 - peers: 2\nApr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot -45) 0x44e4\u202620a4 - exec-block: valid(17088475 0xca61\u2026) - finalized: 0x9cbd\u2026ba83:195776 - peers: 8\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:15:01.443[network] info: Subscribed gossip core topics\nApr-20 15:15:01.446[sync] info: Subscribed gossip core topics\nApr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea\u2026c655 - exec-block: valid(17088521 0xca9b\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 6\nApr-20 15:15:17.003[] info: Synced - slot: 6264974 - head: 0x4f7e\u20260e3a - exec-block: valid(17088522 0x08b1\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 6\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:15:41.001[] info: Synced - slot: 6264976 - head: (slot -1) 0x17c6\u202671a7 - exec-block: valid(17088524 0x5bc1\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 8\nApr-20 15:15:53.001[] info: Synced - slot: 6264977 - head: (slot -2) 0x17c6\u202671a7 - exec-block: valid(17088524 0x5bc1\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 8\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-txt",children:"Apr-20 15:16:05.000[] info: Synced - slot: 6264978 - head: 0xc9fd\u202628c5 - exec-block: valid(17088526 0xb5bf\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 8\nApr-20 15:16:17.017[] info: Synced - slot: 6264979 - head: 0xde91\u2026d4cb - exec-block: valid(17088527 0xa488\u2026) - finalized: 0x6981\u2026682f:195778 - peers: 7\n"})}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Sync status: This status takes three values:"}),"\n"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Synced"}),": The node is currently synced"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Syncing"})," The node is currently in the syncing process"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Searching"}),": The node is is still looking for viable peers from where it can download blocks"]}),"\n"]}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Slot (clock) info: The current ongoing slot as per the chain genesis"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Head info: Specifies where the local beacon chain head hash is. In case it's far behind the Slot (clock), then it independently shows the head slot. Else, it will show how far behind the node is from the Slot (if the difference is < 1000)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Execution block info: Provides the information about the execution block head, whether its confirmed ",(0,o.jsx)(n.code,{children:"valid"})," or still ",(0,o.jsx)(n.code,{children:"syncing"})," to it. In parenthesis, it shows the current execution block number and a short hash for easy identification"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Finalized info: Shows the current local ",(0,o.jsx)(n.code,{children:"finalized"})," checkpoint in the format of ",(0,o.jsx)(n.code,{children:"[checkpoint root]:[checkpoint epoch]"}),". For example: ",(0,o.jsx)(n.code,{children:"0xd7ba\u20268386:189636"})," shows a checkpoint root of ",(0,o.jsx)(n.code,{children:"0xd7ba\u20268386"})," in epoch ",(0,o.jsx)(n.code,{children:"189636"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Peer info: Current total number of outbound and inbound peers"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For more insight into how a Lodestar beacon node is functioning, you may setup Lodestar metrics with the ",(0,o.jsx)(n.code,{children:"--metrics"})," flag and use the prepared Grafana dashboards that are found in the repository. Check out our section on ",(0,o.jsx)(n.a,{href:"/lodestar/run/logging-and-metrics/prometheus-grafana",children:"Prometheus and Grafana"})," for more details."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var o=t(6540);const i={},s=o.createContext(i);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e49db30.2d050593.js b/assets/js/0e49db30.2d050593.js deleted file mode 100644 index c55863fe8e8c..000000000000 --- a/assets/js/0e49db30.2d050593.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[4e3],{9672:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var t=s(4848),r=s(8453);const a={},o="Installation",i={id:"run/getting-started/installation",title:"Installation",description:"Binaries",source:"@site/pages/run/getting-started/installation.md",sourceDirName:"run/getting-started",slug:"/run/getting-started/installation",permalink:"/lodestar/run/getting-started/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/getting-started/installation.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/lodestar/run/getting-started/quick-start"},next:{title:"Starting a Node",permalink:"/lodestar/run/beacon-management/starting-a-node"}},l={},d=[{value:"Binaries",id:"binaries",level:2},{value:"Docker Installation",id:"docker-installation",level:2},{value:"Build from Source",id:"build-from-source",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Clone repository",id:"clone-repository",level:3},{value:"Install packages",id:"install-packages",level:3},{value:"Build source code",id:"build-source-code",level:3},{value:"Lodestar CLI",id:"lodestar-cli",level:3},{value:"Known Issues",id:"known-issues",level:3},{value:"Install from NPM [not recommended]",id:"install-from-npm-not-recommended",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.h2,{id:"binaries",children:"Binaries"}),"\n",(0,t.jsxs)(n.p,{children:["Binaries can be downloaded from ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/releases/latest",children:"the release page"})," under the ",(0,t.jsx)(n.code,{children:"Assets"})," section."]}),"\n",(0,t.jsx)(n.h2,{id:"docker-installation",children:"Docker Installation"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/r/chainsafe/lodestar",children:(0,t.jsx)(n.code,{children:"chainsafe/lodestar"})})," Docker Hub repository is maintained actively. It contains the ",(0,t.jsx)(n.code,{children:"lodestar"})," CLI preinstalled."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The Docker Hub image tagged as ",(0,t.jsx)(n.code,{children:"chainsafe/lodestar:next"})," is run on CI every commit on our ",(0,t.jsx)(n.code,{children:"unstable"})," branch.\nFor ",(0,t.jsx)(n.code,{children:"stable"})," releases, the image is tagged as ",(0,t.jsx)(n.code,{children:"chainsafe/lodestar:latest"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"Ensure you have Docker installed by issuing the command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker -v\n"})}),"\n",(0,t.jsxs)(n.p,{children:["It should return a non error message such as ",(0,t.jsx)(n.code,{children:"Docker version xxxx, build xxxx"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Pull, run the image and Lodestar should now be ready to use"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker pull chainsafe/lodestar\ndocker run chainsafe/lodestar --help\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Docker is the recommended setup for Lodestar. Use our ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"Lodestar Quickstart scripts"})," with Docker for detailed instructions."]})}),"\n",(0,t.jsx)(n.h2,{id:"build-from-source",children:"Build from Source"}),"\n",(0,t.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.p,{children:["Make sure to have ",(0,t.jsx)(n.a,{href:"https://classic.yarnpkg.com/en/docs/install",children:"Yarn installed"}),". It is also recommended to ",(0,t.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"install NVM (Node Version Manager)"})," and use the LTS version (currently v22) of ",(0,t.jsx)(n.a,{href:"https://nodejs.org/en/",children:"NodeJS"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["NodeJS versions older than the current LTS are not supported by Lodestar. We recommend running the latest Node LTS.\nIt is important to make sure the NodeJS version is not changed after reboot by setting a default ",(0,t.jsx)(n.code,{children:"nvm alias default && nvm use default"}),"."]})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Node Version Manager (NVM) will only install NodeJS for use with the active user. If you intend on setting up Lodestar to run under another user, we recommend using ",(0,t.jsx)(n.a,{href:"https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions",children:"NodeSource's source for NodeJS"})," so you can install NodeJS globally."]})}),"\n",(0,t.jsx)(n.h3,{id:"clone-repository",children:"Clone repository"}),"\n",(0,t.jsx)(n.p,{children:"Clone the repository locally and build from the stable release branch."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone -b stable https://github.com/chainsafe/lodestar.git\n"})}),"\n",(0,t.jsx)(n.p,{children:"Switch to created directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd lodestar\n"})}),"\n",(0,t.jsx)(n.h3,{id:"install-packages",children:"Install packages"}),"\n",(0,t.jsxs)(n.p,{children:["Install across all packages. Lodestar follows a ",(0,t.jsx)(n.a,{href:"https://github.com/lerna/lerna",children:"monorepo"})," structure, so all commands below must be run in the project root."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"yarn install\n"})}),"\n",(0,t.jsx)(n.h3,{id:"build-source-code",children:"Build source code"}),"\n",(0,t.jsx)(n.p,{children:"Build across all packages."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"yarn run build\n"})}),"\n",(0,t.jsx)(n.h3,{id:"lodestar-cli",children:"Lodestar CLI"}),"\n",(0,t.jsx)(n.p,{children:"Lodestar should now be ready for use."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./lodestar --help\n"})}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"/lodestar/run/beacon-management/beacon-cli",children:"Command Line Reference"})," for further information."]}),"\n",(0,t.jsx)(n.h3,{id:"known-issues",children:"Known Issues"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"ModuleNotFoundError: No module named 'distutils'"})}),"\n",(0,t.jsxs)(n.p,{children:["If you stump upon this issue while running Yarn, it's because Python 3.12 had removed ",(0,t.jsx)(n.code,{children:"distutils"})," package. That package is required for node build tool. You can install it with following command."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pip3 install setuptools --force-reinstall --user\n"})}),"\n",(0,t.jsx)(n.h2,{id:"install-from-npm-not-recommended",children:"Install from NPM [not recommended]"}),"\n",(0,t.jsx)(n.admonition,{type:"danger",children:(0,t.jsxs)(n.p,{children:["For mainnet (production) usage, we only recommend installing with docker due to ",(0,t.jsx)(n.a,{href:"https://hackaday.com/2021/10/22/supply-chain-attack-npm-library-used-by-facebook-and-others-was-compromised/",children:"NPM supply chain attacks"}),". Until a ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/3596",children:"safer installation method has been found"}),", do not use this install method except for experimental purposes only."]})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var t=s(6540);const r={},a=t.createContext(r);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e49db30.d5d8c1f1.js b/assets/js/0e49db30.d5d8c1f1.js new file mode 100644 index 000000000000..bf51d97e664e --- /dev/null +++ b/assets/js/0e49db30.d5d8c1f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[4e3],{9672:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var t=s(4848),r=s(8453);const o={},a="Install Options",i={id:"run/getting-started/installation",title:"Install Options",description:"Binaries",source:"@site/pages/run/getting-started/installation.md",sourceDirName:"run/getting-started",slug:"/run/getting-started/installation",permalink:"/lodestar/run/getting-started/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/getting-started/installation.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Security Policy",permalink:"/lodestar/security"},next:{title:"Lodestar Quick Start Scripts",permalink:"/lodestar/run/getting-started/quick-start"}},l={},d=[{value:"Binaries",id:"binaries",level:2},{value:"Docker Installation",id:"docker-installation",level:2},{value:"Build from Source",id:"build-from-source",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Clone repository",id:"clone-repository",level:3},{value:"Install packages",id:"install-packages",level:3},{value:"Build source code",id:"build-source-code",level:3},{value:"Lodestar CLI",id:"lodestar-cli",level:3},{value:"Known Issues",id:"known-issues",level:3},{value:"Install from NPM [not recommended]",id:"install-from-npm-not-recommended",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"install-options",children:"Install Options"}),"\n",(0,t.jsx)(n.h2,{id:"binaries",children:"Binaries"}),"\n",(0,t.jsxs)(n.p,{children:["Binaries can be downloaded from the Lodestar ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/releases/latest",children:"release page"})," under the ",(0,t.jsx)(n.code,{children:"Assets"})," section."]}),"\n",(0,t.jsx)(n.p,{children:"Run the following command to install the latest version"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl -fsSL https://chainsafe.github.io/lodestar/install | bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"docker-installation",children:"Docker Installation"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/r/chainsafe/lodestar",children:(0,t.jsx)(n.code,{children:"chainsafe/lodestar"})})," Docker Hub repository is maintained actively. It contains the ",(0,t.jsx)(n.code,{children:"lodestar"})," CLI preinstalled."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["The Docker Hub image tagged as ",(0,t.jsx)(n.code,{children:"chainsafe/lodestar:next"})," is run on CI every commit on our ",(0,t.jsx)(n.code,{children:"unstable"})," branch.\nFor ",(0,t.jsx)(n.code,{children:"stable"})," releases, the image is tagged as ",(0,t.jsx)(n.code,{children:"chainsafe/lodestar:latest"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"Ensure you have Docker installed by issuing the command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker -v\n"})}),"\n",(0,t.jsxs)(n.p,{children:["It should return a non error message such as ",(0,t.jsx)(n.code,{children:"Docker version xxxx, build xxxx"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Pull, run the image and Lodestar should now be ready to use"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker pull chainsafe/lodestar\ndocker run chainsafe/lodestar --help\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Docker is the recommended setup for Lodestar. Use our ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"Lodestar Quickstart scripts"})," with Docker for detailed instructions."]})}),"\n",(0,t.jsx)(n.h2,{id:"build-from-source",children:"Build from Source"}),"\n",(0,t.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.p,{children:["Make sure to have ",(0,t.jsx)(n.a,{href:"https://classic.yarnpkg.com/en/docs/install",children:"Yarn installed"}),". It is also recommended to ",(0,t.jsx)(n.a,{href:"https://github.com/nvm-sh/nvm",children:"install NVM (Node Version Manager)"})," and use the LTS version (currently v22) of ",(0,t.jsx)(n.a,{href:"https://nodejs.org/en/",children:"NodeJS"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["NodeJS versions older than the current LTS are not supported by Lodestar. We recommend running the latest Node LTS.\nIt is important to make sure the NodeJS version is not changed after reboot by setting a default ",(0,t.jsx)(n.code,{children:"nvm alias default && nvm use default"}),"."]})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Node Version Manager (NVM) will only install NodeJS for use with the active user. If you intend on setting up Lodestar to run under another user, we recommend using ",(0,t.jsx)(n.a,{href:"https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions",children:"NodeSource's source for NodeJS"})," so you can install NodeJS globally."]})}),"\n",(0,t.jsx)(n.h3,{id:"clone-repository",children:"Clone repository"}),"\n",(0,t.jsx)(n.p,{children:"Clone the repository locally and build from the stable release branch."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone -b stable https://github.com/chainsafe/lodestar.git\n"})}),"\n",(0,t.jsx)(n.p,{children:"Switch to created directory."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd lodestar\n"})}),"\n",(0,t.jsx)(n.h3,{id:"install-packages",children:"Install packages"}),"\n",(0,t.jsxs)(n.p,{children:["Install across all packages. Lodestar follows a ",(0,t.jsx)(n.a,{href:"https://github.com/lerna/lerna",children:"monorepo"})," structure, so all commands below must be run in the project root."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"yarn install\n"})}),"\n",(0,t.jsx)(n.h3,{id:"build-source-code",children:"Build source code"}),"\n",(0,t.jsx)(n.p,{children:"Build across all packages."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"yarn run build\n"})}),"\n",(0,t.jsx)(n.h3,{id:"lodestar-cli",children:"Lodestar CLI"}),"\n",(0,t.jsx)(n.p,{children:"Lodestar should now be ready for use."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./lodestar --help\n"})}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"/lodestar/run/beacon-management/beacon-cli",children:"Command Line Reference"})," for further information."]}),"\n",(0,t.jsx)(n.h3,{id:"known-issues",children:"Known Issues"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"ModuleNotFoundError: No module named 'distutils'"})}),"\n",(0,t.jsxs)(n.p,{children:["If you stump upon this issue while running Yarn, it's because Python 3.12 had removed ",(0,t.jsx)(n.code,{children:"distutils"})," package. That package is required for node build tool. You can install it with following command."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pip3 install setuptools --force-reinstall --user\n"})}),"\n",(0,t.jsx)(n.h2,{id:"install-from-npm-not-recommended",children:"Install from NPM [not recommended]"}),"\n",(0,t.jsx)(n.admonition,{type:"danger",children:(0,t.jsxs)(n.p,{children:["For mainnet (production) usage, we only recommend installing with Docker, using binaries or building from source due to ",(0,t.jsx)(n.a,{href:"https://hackaday.com/2021/10/22/supply-chain-attack-npm-library-used-by-facebook-and-others-was-compromised/",children:"NPM supply chain attacks"}),". Until a ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/3596",children:"safer installation method has been found"}),", do not use this install method except for experimental purposes only."]})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var t=s(6540);const r={},o=t.createContext(r);function a(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/188f9ebf.47d86114.js b/assets/js/188f9ebf.32c07ea9.js similarity index 82% rename from assets/js/188f9ebf.47d86114.js rename to assets/js/188f9ebf.32c07ea9.js index ee811bb55012..c523e196abea 100644 --- a/assets/js/188f9ebf.47d86114.js +++ b/assets/js/188f9ebf.32c07ea9.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[5296],{4147:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var a=t(4848),o=t(8453);const r={},s="Data Retention",i={id:"run/beacon-management/data-retention",title:"Data Retention",description:"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information.",source:"@site/pages/run/beacon-management/data-retention.md",sourceDirName:"run/beacon-management",slug:"/run/beacon-management/data-retention",permalink:"/lodestar/run/beacon-management/data-retention",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/beacon-management/data-retention.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/run/beacon-management/beacon-cli"},next:{title:"Networking",permalink:"/lodestar/run/beacon-management/networking"}},c={},d=[{value:"Data Management",id:"data-management",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"data-retention",children:"Data Retention"}),"\n",(0,a.jsx)(n.p,{children:"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information."}),"\n",(0,a.jsx)(n.p,{children:"There are several processes that need to store data for Lodestar. These data sets can grow quite large over time so it is important to understand how to manage them so the host machine can support operations effectively."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"$executionDir # this changes depending on the execution client\n \u2514\u2500\u2500 execution-db\n\n$dataDir # specified by --dataDir on the beacon command\n\u251c\u2500\u2500 .log_rotate_audit.json\n\u251c\u2500\u2500 beacon.log # there can be many of these\n\u251c\u2500\u2500 enr\n\u251c\u2500\u2500 peer-id.json\n\u251c\u2500\u2500 chain-db # default if --dbDir not specified\n\u2502 \u2514\u2500\u2500 (db files)\n\u2514\u2500\u2500 peerstore # default if --peerStoreDir not specified\n \u2514\u2500\u2500 (peerstore files)\n\n$dataDir # specified by --dataDir on the validator command\n\u251c\u2500\u2500 .log_rotate_audit.json\n\u251c\u2500\u2500 validator.log # there can be many of these\n\u251c\u2500\u2500 validator-db # default if --validatorsDbDir not specified\n\u2502 \u2514\u2500\u2500 (db files)\n\u251c\u2500\u2500 proposerConfigs # default if --proposerDir not specified\n\u2502 \u2514\u2500\u2500 (config files)\n\u251c\u2500\u2500 cache # default if --cacheDir not specified\n\u2502 \u2514\u2500\u2500 (cache files)\n\u251c\u2500\u2500 secrets # default if --secretsDir not specified\n\u2502 \u251c\u2500\u2500 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037...\n\u2502 \u2514\u2500\u2500 0xa329f988c16993768299643d918a2694892c012765d896a16f...\n\u251c\u2500\u2500 keystores # default if --keystoresDir not specified\n\u2502 \u251c\u2500\u2500 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037...\n\u2502 \u2502 \u2514\u2500\u2500 voting-keystore.json\n\u2502 \u2514\u2500\u2500 0xa329f988c16993768299643d918a2694892c012765d896a16f...\n\u2502 \u2514\u2500\u2500 voting-keystore.json\n\u2514\u2500\u2500 remoteKeys # default if --remoteKeysDir not specified\n \u2514\u2500\u2500 0xa329f988c16993768299643d918a2694892c012765d896a16f.json\n"})}),"\n",(0,a.jsx)(n.h2,{id:"data-management",children:"Data Management"}),"\n",(0,a.jsx)(n.p,{children:"Configuring your node to store and prune data is key to success. On average you can expect for the database to grow by the follow amounts:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"execution-db"})," grows at 2-30GB per week"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"chain-db"})," grows at 1GB per month"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"validator-db"})," grows at less than 2MB per year, per key (2000 keys = 4GB per year)"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"keystores"}),", ",(0,a.jsx)(n.code,{children:"keystore-cache"})," and ",(0,a.jsx)(n.code,{children:"peerstore"})," are not usually very large and are not expected to grow much during normal operation."]}),"\n",(0,a.jsxs)(n.p,{children:["Logs can also become quite large so please check out the section on ",(0,a.jsx)(n.a,{href:"/lodestar/run/logging-and-metrics/log-management",children:"log management"})," for more information."]}),"\n",(0,a.jsxs)(n.p,{children:["There is really only one flag that is needed to manage the data for Lodestar, ",(0,a.jsx)(n.a,{href:"./beacon-cli#--datadir",children:(0,a.jsx)(n.code,{children:"--dataDir"})}),". Other than that handling log management is really the heart of the data management story. Beacon node data is what it is. Depending on the execution client that is chosen, there may be flags to help with data storage growth but that is outside the scope of this document."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var a=t(6540);const o={},r=a.createContext(o);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[5296],{4147:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var a=t(4848),o=t(8453);const r={},s="Data Retention",i={id:"run/beacon-management/data-retention",title:"Data Retention",description:"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information.",source:"@site/pages/run/beacon-management/data-retention.md",sourceDirName:"run/beacon-management",slug:"/run/beacon-management/data-retention",permalink:"/lodestar/run/beacon-management/data-retention",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/beacon-management/data-retention.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/run/beacon-management/beacon-cli"},next:{title:"Networking",permalink:"/lodestar/run/beacon-management/networking"}},c={},d=[{value:"Data Management",id:"data-management",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"data-retention",children:"Data Retention"}),"\n",(0,a.jsx)(n.p,{children:"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information."}),"\n",(0,a.jsx)(n.p,{children:"There are several processes that need to store data for Lodestar. These data sets can grow quite large over time so it is important to understand how to manage them so the host machine can support operations effectively."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"$executionDir # this changes depending on the execution client\n \u2514\u2500\u2500 execution-db\n\n$dataDir # specified by --dataDir on the beacon command\n\u251c\u2500\u2500 .log_rotate_audit.json\n\u251c\u2500\u2500 beacon.log # there can be many of these\n\u251c\u2500\u2500 enr\n\u251c\u2500\u2500 peer-id.json\n\u251c\u2500\u2500 chain-db # default if --dbDir not specified\n\u2502 \u2514\u2500\u2500 (db files)\n\u2514\u2500\u2500 peerstore # default if --peerStoreDir not specified\n \u2514\u2500\u2500 (peerstore files)\n\n$dataDir # specified by --dataDir on the validator command\n\u251c\u2500\u2500 .log_rotate_audit.json\n\u251c\u2500\u2500 validator.log # there can be many of these\n\u251c\u2500\u2500 validator-db # default if --validatorsDbDir not specified\n\u2502 \u2514\u2500\u2500 (db files)\n\u251c\u2500\u2500 proposerConfigs # default if --proposerDir not specified\n\u2502 \u2514\u2500\u2500 (config files)\n\u251c\u2500\u2500 cache # default if --cacheDir not specified\n\u2502 \u2514\u2500\u2500 (cache files)\n\u251c\u2500\u2500 secrets # default if --secretsDir not specified\n\u2502 \u251c\u2500\u2500 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037...\n\u2502 \u2514\u2500\u2500 0xa329f988c16993768299643d918a2694892c012765d896a16f...\n\u251c\u2500\u2500 keystores # default if --keystoresDir not specified\n\u2502 \u251c\u2500\u2500 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037...\n\u2502 \u2502 \u2514\u2500\u2500 voting-keystore.json\n\u2502 \u2514\u2500\u2500 0xa329f988c16993768299643d918a2694892c012765d896a16f...\n\u2502 \u2514\u2500\u2500 voting-keystore.json\n\u2514\u2500\u2500 remoteKeys # default if --remoteKeysDir not specified\n \u2514\u2500\u2500 0xa329f988c16993768299643d918a2694892c012765d896a16f.json\n"})}),"\n",(0,a.jsx)(n.h2,{id:"data-management",children:"Data Management"}),"\n",(0,a.jsx)(n.p,{children:"Configuring your node to store and prune data is key to success. On average you can expect for the database to grow by the follow amounts:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"execution-db"})," grows at 2-30GB per week"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"chain-db"})," grows at 1GB per month"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"validator-db"})," grows at less than 2MB per year, per key (2000 keys = 4GB per year)"]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"keystores"}),", ",(0,a.jsx)(n.code,{children:"keystore-cache"})," and ",(0,a.jsx)(n.code,{children:"peerstore"})," are not usually very large and are not expected to grow much during normal operation."]}),"\n",(0,a.jsxs)(n.p,{children:["Logs can also become quite large so please check out the section on ",(0,a.jsx)(n.a,{href:"../logging-and-metrics/log-management.md",children:"log management"})," for more information."]}),"\n",(0,a.jsxs)(n.p,{children:["There is really only one flag that is needed to manage the data for Lodestar, ",(0,a.jsx)(n.a,{href:"./beacon-cli#--datadir",children:(0,a.jsx)(n.code,{children:"--dataDir"})}),". Other than that handling log management is really the heart of the data management story. Beacon node data is what it is. Depending on the execution client that is chosen, there may be flags to help with data storage growth but that is outside the scope of this document."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var a=t(6540);const o={},r=a.createContext(o);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ed6da99.649ec553.js b/assets/js/1ed6da99.649ec553.js new file mode 100644 index 000000000000..d7ea6f06914b --- /dev/null +++ b/assets/js/1ed6da99.649ec553.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3872],{7610:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var t=s(4848),o=s(8453);const r={},a="Frequently Asked Questions",i={id:"faqs",title:"Frequently Asked Questions",description:"This section of the documentation will cover common questions and common encounters by users and developers.",source:"@site/pages/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/lodestar/faqs",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/faqs.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Specification Tests",permalink:"/lodestar/contribution/testing/spec-tests"}},c={},d=[{value:"Tooling",id:"tooling",level:2},{value:"Troubleshooting Lodestar",id:"troubleshooting-lodestar",level:2},{value:"Running a beacon node",id:"running-a-beacon-node",level:3},{value:"Using Kubernetes",id:"using-kubernetes",level:3}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"frequently-asked-questions",children:"Frequently Asked Questions"}),"\n",(0,t.jsx)(n.p,{children:"This section of the documentation will cover common questions and common encounters by users and developers."}),"\n",(0,t.jsx)(n.h2,{id:"tooling",children:"Tooling"}),"\n",(0,t.jsxs)(n.admonition,{title:'"Package manager issues"',type:"note",children:[(0,t.jsxs)(n.p,{children:["Lodestar relies on ",(0,t.jsx)(n.a,{href:"https://nodejs.org/api/corepack.html",children:"Corepack"})," and associated ",(0,t.jsx)(n.code,{children:"packageManager"})," value to manage its package manager version."]}),(0,t.jsxs)(n.p,{children:["Make sure ",(0,t.jsx)(n.code,{children:"corepack"})," is correctly enabled if you encounter some package manager related issues:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"corepack enable\n"})})]}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting-lodestar",children:"Troubleshooting Lodestar"}),"\n",(0,t.jsx)(n.h3,{id:"running-a-beacon-node",children:"Running a beacon node"}),"\n",(0,t.jsxs)(n.admonition,{title:'"Heap memory limit"',type:"note",children:[(0,t.jsxs)(n.p,{children:["Lodestar beacon node requires at least 8GB of heap space. While the ",(0,t.jsx)(n.code,{children:"lodestar"})," script and the official docker image correctly sets the appropriate value, it might be necessary to manually set it for some specific scenario."]}),(0,t.jsxs)(n.p,{children:["The simplest way to achieve this is via the ",(0,t.jsx)(n.code,{children:"NODE_OPTIONS"})," environment variable or by passing ",(0,t.jsx)(n.a,{href:"https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes",children:(0,t.jsx)(n.code,{children:"--max-old-space-size"})})," directly to the node binary"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"NODE_OPTIONS: --max-old-space-size=8192\n"})})]}),"\n",(0,t.jsx)(n.h3,{id:"using-kubernetes",children:"Using Kubernetes"}),"\n",(0,t.jsxs)(n.admonition,{title:'"Unknown arguments error"',type:"note",children:[(0,t.jsxs)(n.p,{children:["Lodestar reads all environment variables prefixed with ",(0,t.jsx)(n.code,{children:"LODESTAR"})," and will try to parse\nthem similar to command line arguments, meaning any unknown argument will cause an error."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-txt",children:"\u2716 Unknown arguments: servicePort, servicePortEthConsensusP2p,\nport9000Tcp, port9000TcpPort, port9000TcpProto, port9000TcpAddr, serviceHost\n"})}),(0,t.jsxs)(n.p,{children:["The extra arguments are present because Kubernetes automatically\n",(0,t.jsx)(n.a,{href:"https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables",children:"adds environment variables"}),"\nto the Pod based on the name (",(0,t.jsx)(n.code,{children:"metadata.name"}),") defined in the associated ",(0,t.jsx)(n.code,{children:"Service"}),".\nTo resolve the issue, this name has to be changed to something that does not start with ",(0,t.jsx)(n.code,{children:"lodestar"}),"."]}),(0,t.jsxs)(n.p,{children:["Reference Issue: ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/6045",children:"#6045"})]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var t=s(6540);const o={},r=t.createContext(o);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ed6da99.fca3527a.js b/assets/js/1ed6da99.fca3527a.js deleted file mode 100644 index a674d6320c0d..000000000000 --- a/assets/js/1ed6da99.fca3527a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3872],{7610:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var t=s(4848),o=s(8453);const r={},a="Frequently Asked Questions",i={id:"faqs",title:"Frequently Asked Questions",description:"This section of the documentation will cover common questions and encounters often asked by users and developers.",source:"@site/pages/faqs.md",sourceDirName:".",slug:"/faqs",permalink:"/lodestar/faqs",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/faqs.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Specification Tests",permalink:"/lodestar/contribution/testing/spec-tests"}},c={},d=[{value:"Tooling",id:"tooling",level:2},{value:"Troubleshooting Lodestar",id:"troubleshooting-lodestar",level:2},{value:"Running a beacon node",id:"running-a-beacon-node",level:3},{value:"Using Kubernetes",id:"using-kubernetes",level:3}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"frequently-asked-questions",children:"Frequently Asked Questions"}),"\n",(0,t.jsx)(n.p,{children:"This section of the documentation will cover common questions and encounters often asked by users and developers."}),"\n",(0,t.jsx)(n.h2,{id:"tooling",children:"Tooling"}),"\n",(0,t.jsxs)(n.admonition,{title:'"Package manager issues"',type:"note",children:[(0,t.jsxs)(n.p,{children:["Lodestar relies on ",(0,t.jsx)(n.a,{href:"https://nodejs.org/api/corepack.html",children:"Corepack"})," and associated ",(0,t.jsx)(n.code,{children:"packageManager"})," value to manage its package manager version."]}),(0,t.jsxs)(n.p,{children:["Make sure ",(0,t.jsx)(n.code,{children:"corepack"})," is correctly enabled if you encounter some package manager related issues:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"corepack enable\n"})})]}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting-lodestar",children:"Troubleshooting Lodestar"}),"\n",(0,t.jsx)(n.h3,{id:"running-a-beacon-node",children:"Running a beacon node"}),"\n",(0,t.jsxs)(n.admonition,{title:'"Heap memory limit"',type:"note",children:[(0,t.jsxs)(n.p,{children:["Lodestar beacon node requires at least 8GB of heap space. While the ",(0,t.jsx)(n.code,{children:"lodestar"})," script and the official docker image correctly sets the appropriate value, it might be necessary to manually set it for some specific scenario."]}),(0,t.jsxs)(n.p,{children:["The simplest way to achieve this is via the ",(0,t.jsx)(n.code,{children:"NODE_OPTIONS"})," environment variable or by passing ",(0,t.jsx)(n.a,{href:"https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes",children:(0,t.jsx)(n.code,{children:"--max-old-space-size"})})," directly to the node binary"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"NODE_OPTIONS: --max-old-space-size=8192\n"})})]}),"\n",(0,t.jsx)(n.h3,{id:"using-kubernetes",children:"Using Kubernetes"}),"\n",(0,t.jsxs)(n.admonition,{title:'"Unknown arguments error"',type:"note",children:[(0,t.jsxs)(n.p,{children:["Lodestar reads all environment variables prefixed with ",(0,t.jsx)(n.code,{children:"LODESTAR"})," and will try to parse\nthem similar to command line arguments, meaning any unknown argument will cause an error."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-txt",children:"\u2716 Unknown arguments: servicePort, servicePortEthConsensusP2p,\nport9000Tcp, port9000TcpPort, port9000TcpProto, port9000TcpAddr, serviceHost\n"})}),(0,t.jsxs)(n.p,{children:["The extra arguments are present because Kubernetes automatically\n",(0,t.jsx)(n.a,{href:"https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables",children:"adds environment variables"}),"\nto the Pod based on the name (",(0,t.jsx)(n.code,{children:"metadata.name"}),") defined in the associated ",(0,t.jsx)(n.code,{children:"Service"}),".\nTo resolve the issue, this name has to be changed to something that does not start with ",(0,t.jsx)(n.code,{children:"lodestar"}),"."]}),(0,t.jsxs)(n.p,{children:["Reference Issue: ",(0,t.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/6045",children:"#6045"})]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var t=s(6540);const o={},r=t.createContext(o);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/23c6c368.85ed704d.js b/assets/js/23c6c368.aa258a99.js similarity index 91% rename from assets/js/23c6c368.85ed704d.js rename to assets/js/23c6c368.aa258a99.js index 9734acb82050..fc3b84db40ec 100644 --- a/assets/js/23c6c368.85ed704d.js +++ b/assets/js/23c6c368.aa258a99.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[9577],{6548:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>a,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var r=s(4848),d=s(8453);const n={},i="Lodestar Prover",l={id:"libraries/lightclient-prover/prover",title:"Lodestar Prover",description:"Discord",source:"@site/pages/libraries/lightclient-prover/prover.md",sourceDirName:"libraries/lightclient-prover",slug:"/libraries/lightclient-prover/prover",permalink:"/lodestar/libraries/lightclient-prover/prover",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/libraries/lightclient-prover/prover.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/libraries/lightclient-prover/lightclient-cli"},next:{title:"Supporting Libraries",permalink:"/lodestar/supporting-libraries/"}},o={},c=[{value:"Usage",id:"usage",level:2},{value:"How to detect a web3 provider",id:"how-to-detect-a-web3-provider",level:2},{value:"Supported Web3 Methods",id:"supported-web3-methods",level:2},{value:"Non-supported features",id:"non-supported-features",level:2},{value:"Warnings",id:"warnings",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"What you need",id:"what-you-need",level:2},{value:"Getting started",id:"getting-started",level:2},{value:"Contributors",id:"contributors",level:2},{value:"License",id:"license",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"lodestar-prover",children:"Lodestar Prover"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://discord.gg/aMxzVcr",children:(0,r.jsx)(t.img,{src:"https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord",alt:"Discord"})}),"\n",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/beacon-APIs/releases/tag/v2.5.0",children:(0,r.jsx)(t.img,{src:"https://img.shields.io/badge/ETH%20beacon--APIs-2.5.0-blue",alt:"ETH Beacon APIs Spec v2.5.0"})}),"\n",(0,r.jsx)(t.img,{src:"https://img.shields.io/badge/ES-2021-yellow",alt:"ES Version"}),"\n",(0,r.jsx)(t.img,{src:"https://img.shields.io/badge/node-22.x-green",alt:"Node Version"})]}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["This package is part of ",(0,r.jsx)(t.a,{href:"https://lodestar.chainsafe.io",children:"ChainSafe's Lodestar"})," project"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"A set of tools allowing to verify EL client JSON-RPC calls."}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(t.p,{children:["You can use the ",(0,r.jsx)(t.code,{children:"@lodestar/prover"})," in two ways, as a Web3 Provider and as proxy. For prover use case see below example."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:'import Web3 from "web3";\nimport {createVerifiedExecutionProvider, LCTransport} from "@lodestar/prover";\n\nconst httpProvider = new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io");\n\nconst {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, {\n transport: LCTransport.Rest,\n urls: ["https://lodestar-sepolia.chainsafe.io"],\n network: "sepolia",\n wsCheckpoint: "trusted-checkpoint",\n});\n\nconst web3 = new Web3(provider);\n\nconst address = "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134";\nconst balance = await web3.eth.getBalance(address, "latest");\nconsole.log({balance, address});\n'})}),"\n",(0,r.jsxs)(t.p,{children:["In this scenario the actual provider is mutated to handle the RPC requests and verify those. So here if you use ",(0,r.jsx)(t.code,{children:"provider"})," or ",(0,r.jsx)(t.code,{children:"httpProvider"})," both are the same objects. This behavior is useful when you already have an application and usage of any provider across the code space and don't want to change the code. So you mutate the provider during startup."]}),"\n",(0,r.jsxs)(t.p,{children:["For some scenarios when you don't want to mutate the provider you can pass an option ",(0,r.jsx)(t.code,{children:"mutateProvider"})," as ",(0,r.jsx)(t.code,{children:"false"}),". In this scenario the object ",(0,r.jsx)(t.code,{children:"httpProvider"})," is not mutated and you get a new object ",(0,r.jsx)(t.code,{children:"provider"}),". This is useful when your provider object does not allow mutation, e.g. Metamask provider accessible through ",(0,r.jsx)(t.code,{children:"window.ethereum"}),". If not provided ",(0,r.jsx)(t.code,{children:"mutateProvider"})," is considered as ",(0,r.jsx)(t.code,{children:"true"})," by default. In coming releases we will switch its default behavior to ",(0,r.jsx)(t.code,{children:"false"}),"."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:'import Web3 from "web3";\nimport {createVerifiedExecutionProvider, LCTransport} from "@lodestar/prover";\n\nconst httpProvider = new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io");\n\nconst {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, {\n transport: LCTransport.Rest,\n urls: ["https://lodestar-sepolia.chainsafe.io"],\n network: "sepolia",\n wsCheckpoint: "trusted-checkpoint",\n mutateProvider: false,\n});\n\nconst web3 = new Web3(provider);\n\nconst address = "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134";\nconst balance = await web3.eth.getBalance(address, "latest");\nconsole.log({balance, address});\n'})}),"\n",(0,r.jsx)(t.p,{children:"You can also invoke the package as binary."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"npm i -g @lodestar/prover\n\nlodestar-prover proxy \\\n --network sepolia \\\n --executionRpcUrl https://lodestar-sepoliarpc.chainsafe.io \\\n --beaconUrls https://lodestar-sepolia.chainsafe.io \\\n --port 8080\n"})}),"\n",(0,r.jsx)(t.h2,{id:"how-to-detect-a-web3-provider",children:"How to detect a web3 provider"}),"\n",(0,r.jsx)(t.p,{children:"There can be different implementations of the web3 providers and each can handle the RPC request differently. We call those different provider types. We had provided builtin support for common providers e.g. web3.js, ethers or any eip1193 compatible providers. We inspect given provider instance at runtime to detect the correct provider type."}),"\n",(0,r.jsxs)(t.p,{children:["If your project is using some provider type which is not among above list, you have the option to register a custom provider type with the ",(0,r.jsx)(t.code,{children:"createVerifiedExecutionProvider"})," with the option ",(0,r.jsx)(t.code,{children:"providerTypes"})," which will be an array of your supported provider types. Your custom provider types will have higher priority than default provider types. Please see ",(0,r.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/tree/unstable/packages/prover/src/provider_types",children:"existing provide types implementations"})," to know how to implement your own if needed."]}),"\n",(0,r.jsx)(t.h2,{id:"supported-web3-methods",children:"Supported Web3 Methods"}),"\n",(0,r.jsx)(t.p,{children:"\u2705 - Completed"}),"\n",(0,r.jsx)(t.p,{children:"\u231b - Todo"}),"\n",(0,r.jsxs)(t.p,{children:["\u27a1\ufe0f - Request will be forward to EL without any intermediary manipulations. You can limit these by providing ",(0,r.jsx)(t.code,{children:"unverifiedWhitelist"})," option for provider or ",(0,r.jsx)(t.code,{children:"--unverifiedWhitelist"})," from the cli. If not set then all methods will be forwarded."]}),"\n",(0,r.jsx)(t.p,{children:"\u2747\ufe0f - Always forwarded to EL."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Group"}),(0,r.jsx)(t.th,{children:"Method"}),(0,r.jsx)(t.th,{children:"Status"}),(0,r.jsx)(t.th,{children:"Version"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Block"}),(0,r.jsx)(t.td,{children:"eth_getBlockByHash"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getBlockByNumber"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getBlockTransactionCountByHash"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getBlockTransactionCountByNumber"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getUncleCountByBlockHash"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getUncleCountByBlockNumber"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Chain/Network"}),(0,r.jsx)(t.td,{children:"eth_chainId"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_syncing"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_coinbase"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_accounts"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_blockNumber"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Call and Estimate"}),(0,r.jsx)(t.td,{children:"eth_call"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_estimateGas"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_createAccessList"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_gasPrice"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_maxPriorityFeePerGas"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_feeHistory"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filters"}),(0,r.jsx)(t.td,{children:"eth_newFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_newBlockFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_newPendingTransactionFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_uninstallFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getFilterChanges"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getFilterLogs"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getLogs"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Mining"}),(0,r.jsx)(t.td,{children:"eth_mining"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_hashrate"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getWork"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_submitWork"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_submitHashrate"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Signing"}),(0,r.jsx)(t.td,{children:"eth_sign"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_signTransaction"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"State"}),(0,r.jsx)(t.td,{children:"eth_getBalance"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getStorageAt"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionCount"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getCode"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getProof"}),(0,r.jsx)(t.td,{children:"\u2747\ufe0f"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Transactions"}),(0,r.jsx)(t.td,{children:"eth_sendTransaction"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_sendRawTransaction"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionByHash"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionByBlockHashAndIndex"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionByBlockNumberAndIndex"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionReceipt"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Events"}),(0,r.jsx)(t.td,{children:"eth_subscribe"}),(0,r.jsx)(t.td,{children:"\u2747\ufe0f"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_unsubscribe"}),(0,r.jsx)(t.td,{children:"\u2747\ufe0f"}),(0,r.jsx)(t.td,{children:"v0"})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"non-supported-features",children:"Non-supported features"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Currently does not support batch requests."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"warnings",children:"Warnings"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["To use this prover the ethereum provider must support the ",(0,r.jsx)(t.code,{children:"eth_getProof"})," method. Unfortunately, Infura does not currently support this endpoint. As an alternative, we suggest using Alchemy."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://nodejs.org/",children:"NodeJS"})," (LTS)"]}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://classic.yarnpkg.com/lang/en/",children:"Yarn"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"what-you-need",children:"What you need"}),"\n",(0,r.jsxs)(t.p,{children:["You will need to go over the ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/beacon-apis",children:"specification"}),". You will also need to have a ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/light-client.md",children:"basic understanding of lightclient"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Follow the ",(0,r.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/getting-started/installation",children:"installation guide"})," to install Lodestar."]}),"\n",(0,r.jsxs)(t.li,{children:["Quickly try out the whole stack by ",(0,r.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/advanced-topics/setting-up-a-testnet",children:"starting a local testnet"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"contributors",children:"Contributors"}),"\n",(0,r.jsxs)(t.p,{children:["Read our ",(0,r.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/contribution/getting-started",children:"contributors document"}),", ",(0,r.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"submit an issue"})," or talk to us on our ",(0,r.jsx)(t.a,{href:"https://discord.gg/yjyvFRP",children:"discord"}),"!"]}),"\n",(0,r.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,r.jsxs)(t.p,{children:["Apache-2.0 ",(0,r.jsx)(t.a,{href:"https://chainsafe.io",children:"ChainSafe Systems"})]})]})}function a(e={}){const{wrapper:t}={...(0,d.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>l});var r=s(6540);const d={},n=r.createContext(d);function i(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[9577],{6548:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>a,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var r=s(4848),d=s(8453);const n={},i="Lodestar Prover",l={id:"libraries/lightclient-prover/prover",title:"Lodestar Prover",description:"Discord",source:"@site/pages/libraries/lightclient-prover/prover.md",sourceDirName:"libraries/lightclient-prover",slug:"/libraries/lightclient-prover/prover",permalink:"/lodestar/libraries/lightclient-prover/prover",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/libraries/lightclient-prover/prover.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/libraries/lightclient-prover/lightclient-cli"},next:{title:"Supporting Libraries",permalink:"/lodestar/supporting-libraries/"}},o={},c=[{value:"Usage",id:"usage",level:2},{value:"How to detect a web3 provider",id:"how-to-detect-a-web3-provider",level:2},{value:"Supported Web3 Methods",id:"supported-web3-methods",level:2},{value:"Non-supported features",id:"non-supported-features",level:2},{value:"Warnings",id:"warnings",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"What you need",id:"what-you-need",level:2},{value:"Getting started",id:"getting-started",level:2},{value:"Contributors",id:"contributors",level:2},{value:"License",id:"license",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"lodestar-prover",children:"Lodestar Prover"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://discord.gg/aMxzVcr",children:(0,r.jsx)(t.img,{src:"https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord",alt:"Discord"})}),"\n",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/beacon-APIs/releases/tag/v2.5.0",children:(0,r.jsx)(t.img,{src:"https://img.shields.io/badge/ETH%20beacon--APIs-2.5.0-blue",alt:"ETH Beacon APIs Spec v2.5.0"})}),"\n",(0,r.jsx)(t.img,{src:"https://img.shields.io/badge/ES-2021-yellow",alt:"ES Version"}),"\n",(0,r.jsx)(t.img,{src:"https://img.shields.io/badge/node-22.x-green",alt:"Node Version"})]}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["This package is part of ",(0,r.jsx)(t.a,{href:"https://lodestar.chainsafe.io",children:"ChainSafe's Lodestar"})," project"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"A set of tools allowing to verify EL client JSON-RPC calls."}),"\n",(0,r.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(t.p,{children:["You can use the ",(0,r.jsx)(t.code,{children:"@lodestar/prover"})," in two ways, as a Web3 Provider and as proxy. For prover use case see below example."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:'import Web3 from "web3";\nimport {createVerifiedExecutionProvider, LCTransport} from "@lodestar/prover";\n\nconst httpProvider = new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io");\n\nconst {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, {\n transport: LCTransport.Rest,\n urls: ["https://lodestar-sepolia.chainsafe.io"],\n network: "sepolia",\n wsCheckpoint: "trusted-checkpoint",\n});\n\nconst web3 = new Web3(provider);\n\nconst address = "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134";\nconst balance = await web3.eth.getBalance(address, "latest");\nconsole.log({balance, address});\n'})}),"\n",(0,r.jsxs)(t.p,{children:["In this scenario the actual provider is mutated to handle the RPC requests and verify those. So here if you use ",(0,r.jsx)(t.code,{children:"provider"})," or ",(0,r.jsx)(t.code,{children:"httpProvider"})," both are the same objects. This behavior is useful when you already have an application and usage of any provider across the code space and don't want to change the code. So you mutate the provider during startup."]}),"\n",(0,r.jsxs)(t.p,{children:["For some scenarios when you don't want to mutate the provider you can pass an option ",(0,r.jsx)(t.code,{children:"mutateProvider"})," as ",(0,r.jsx)(t.code,{children:"false"}),". In this scenario the object ",(0,r.jsx)(t.code,{children:"httpProvider"})," is not mutated and you get a new object ",(0,r.jsx)(t.code,{children:"provider"}),". This is useful when your provider object does not allow mutation, e.g. Metamask provider accessible through ",(0,r.jsx)(t.code,{children:"window.ethereum"}),". If not provided ",(0,r.jsx)(t.code,{children:"mutateProvider"})," is considered as ",(0,r.jsx)(t.code,{children:"true"})," by default. In coming releases we will switch its default behavior to ",(0,r.jsx)(t.code,{children:"false"}),"."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:'import Web3 from "web3";\nimport {createVerifiedExecutionProvider, LCTransport} from "@lodestar/prover";\n\nconst httpProvider = new Web3.providers.HttpProvider("https://lodestar-sepoliarpc.chainsafe.io");\n\nconst {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, {\n transport: LCTransport.Rest,\n urls: ["https://lodestar-sepolia.chainsafe.io"],\n network: "sepolia",\n wsCheckpoint: "trusted-checkpoint",\n mutateProvider: false,\n});\n\nconst web3 = new Web3(provider);\n\nconst address = "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134";\nconst balance = await web3.eth.getBalance(address, "latest");\nconsole.log({balance, address});\n'})}),"\n",(0,r.jsx)(t.p,{children:"You can also invoke the package as binary."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"npm i -g @lodestar/prover\n\nlodestar-prover proxy \\\n --network sepolia \\\n --executionRpcUrl https://lodestar-sepoliarpc.chainsafe.io \\\n --beaconUrls https://lodestar-sepolia.chainsafe.io \\\n --port 8080\n"})}),"\n",(0,r.jsx)(t.h2,{id:"how-to-detect-a-web3-provider",children:"How to detect a web3 provider"}),"\n",(0,r.jsx)(t.p,{children:"There can be different implementations of the web3 providers and each can handle the RPC request differently. We call those different provider types. We had provided builtin support for common providers e.g. web3.js, ethers or any eip1193 compatible providers. We inspect given provider instance at runtime to detect the correct provider type."}),"\n",(0,r.jsxs)(t.p,{children:["If your project is using some provider type which is not among above list, you have the option to register a custom provider type with the ",(0,r.jsx)(t.code,{children:"createVerifiedExecutionProvider"})," with the option ",(0,r.jsx)(t.code,{children:"providerTypes"})," which will be an array of your supported provider types. Your custom provider types will have higher priority than default provider types. Please see ",(0,r.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/tree/unstable/packages/prover/src/provider_types",children:"existing provide types implementations"})," to know how to implement your own if needed."]}),"\n",(0,r.jsx)(t.h2,{id:"supported-web3-methods",children:"Supported Web3 Methods"}),"\n",(0,r.jsx)(t.p,{children:"\u2705 - Completed"}),"\n",(0,r.jsx)(t.p,{children:"\u231b - Todo"}),"\n",(0,r.jsxs)(t.p,{children:["\u27a1\ufe0f - Request will be forward to EL without any intermediary manipulations. You can limit these by providing ",(0,r.jsx)(t.code,{children:"unverifiedWhitelist"})," option for provider or ",(0,r.jsx)(t.code,{children:"--unverifiedWhitelist"})," from the cli. If not set then all methods will be forwarded."]}),"\n",(0,r.jsx)(t.p,{children:"\u2747\ufe0f - Always forwarded to EL."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Group"}),(0,r.jsx)(t.th,{children:"Method"}),(0,r.jsx)(t.th,{children:"Status"}),(0,r.jsx)(t.th,{children:"Version"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Block"}),(0,r.jsx)(t.td,{children:"eth_getBlockByHash"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getBlockByNumber"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getBlockTransactionCountByHash"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getBlockTransactionCountByNumber"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getUncleCountByBlockHash"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getUncleCountByBlockNumber"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Chain/Network"}),(0,r.jsx)(t.td,{children:"eth_chainId"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_syncing"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_coinbase"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_accounts"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_blockNumber"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Call and Estimate"}),(0,r.jsx)(t.td,{children:"eth_call"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_estimateGas"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_createAccessList"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_gasPrice"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_maxPriorityFeePerGas"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_feeHistory"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filters"}),(0,r.jsx)(t.td,{children:"eth_newFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_newBlockFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_newPendingTransactionFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_uninstallFilter"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getFilterChanges"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getFilterLogs"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getLogs"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Mining"}),(0,r.jsx)(t.td,{children:"eth_mining"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_hashrate"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getWork"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_submitWork"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_submitHashrate"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Signing"}),(0,r.jsx)(t.td,{children:"eth_sign"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_signTransaction"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"State"}),(0,r.jsx)(t.td,{children:"eth_getBalance"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getStorageAt"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionCount"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getCode"}),(0,r.jsx)(t.td,{children:"\u2705"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getProof"}),(0,r.jsx)(t.td,{children:"\u2747\ufe0f"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Transactions"}),(0,r.jsx)(t.td,{children:"eth_sendTransaction"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_sendRawTransaction"}),(0,r.jsx)(t.td,{children:"\u27a1\ufe0f"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionByHash"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionByBlockHashAndIndex"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionByBlockNumberAndIndex"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_getTransactionReceipt"}),(0,r.jsx)(t.td,{children:"\u231b"}),(0,r.jsx)(t.td,{children:"v2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Events"}),(0,r.jsx)(t.td,{children:"eth_subscribe"}),(0,r.jsx)(t.td,{children:"\u2747\ufe0f"}),(0,r.jsx)(t.td,{children:"v0"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"eth_unsubscribe"}),(0,r.jsx)(t.td,{children:"\u2747\ufe0f"}),(0,r.jsx)(t.td,{children:"v0"})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"non-supported-features",children:"Non-supported features"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Currently does not support batch requests."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"warnings",children:"Warnings"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["To use this prover the ethereum provider must support the ",(0,r.jsx)(t.code,{children:"eth_getProof"})," method. Unfortunately, Infura does not currently support this endpoint. As an alternative, we suggest using Alchemy."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://nodejs.org/",children:"NodeJS"})," (LTS)"]}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://classic.yarnpkg.com/lang/en/",children:"Yarn"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"what-you-need",children:"What you need"}),"\n",(0,r.jsxs)(t.p,{children:["You will need to go over the ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/beacon-apis",children:"specification"}),". You will also need to have a ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/light-client.md",children:"basic understanding of lightclient"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Follow the ",(0,r.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/run/getting-started/installation",children:"installation guide"})," to install Lodestar."]}),"\n",(0,r.jsxs)(t.li,{children:["Quickly try out the whole stack by ",(0,r.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet",children:"starting a local testnet"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"contributors",children:"Contributors"}),"\n",(0,r.jsxs)(t.p,{children:["Read our ",(0,r.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/contribution/getting-started",children:"contributors document"}),", ",(0,r.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"submit an issue"})," or talk to us on our ",(0,r.jsx)(t.a,{href:"https://discord.gg/yjyvFRP",children:"discord"}),"!"]}),"\n",(0,r.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,r.jsxs)(t.p,{children:["Apache-2.0 ",(0,r.jsx)(t.a,{href:"https://chainsafe.io",children:"ChainSafe Systems"})]})]})}function a(e={}){const{wrapper:t}={...(0,d.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>l});var r=s(6540);const d={},n=r.createContext(d);function i(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/302a1c00.3841e1e9.js b/assets/js/302a1c00.3841e1e9.js deleted file mode 100644 index e94030086d2a..000000000000 --- a/assets/js/302a1c00.3841e1e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[9057],{3931:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>m});var r=n(4848),s=n(8453);const o={},a=void 0,c={id:"run/logging-and-metrics/metrics-management",title:"metrics-management",description:"",source:"@site/pages/run/logging-and-metrics/metrics-management.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/metrics-management",permalink:"/lodestar/run/logging-and-metrics/metrics-management",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/metrics-management.md",tags:[],version:"current",frontMatter:{}},i={},m=[];function u(e){return(0,r.jsx)(r.Fragment,{})}function g(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u()}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const s={},o=r.createContext(s);function a(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36eb90f9.dc29a7a2.js b/assets/js/36eb90f9.2123e75f.js similarity index 99% rename from assets/js/36eb90f9.dc29a7a2.js rename to assets/js/36eb90f9.2123e75f.js index 96b71761378a..09f31561226b 100644 --- a/assets/js/36eb90f9.dc29a7a2.js +++ b/assets/js/36eb90f9.2123e75f.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[9949],{4508:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var a=n(4848),o=n(8453);const i={title:"Heap Dumps"},s="Heap Dump Analysis",r={id:"contribution/tools/heap-dumps",title:"Heap Dumps",description:"There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.",source:"@site/pages/contribution/tools/heap-dumps.md",sourceDirName:"contribution/tools",slug:"/contribution/tools/heap-dumps",permalink:"/lodestar/contribution/tools/heap-dumps",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/tools/heap-dumps.md",tags:[],version:"current",frontMatter:{title:"Heap Dumps"},sidebar:"tutorialSidebar",previous:{title:"Flame Graphs",permalink:"/lodestar/contribution/tools/flamegraphs"},next:{title:"Core Dumps",permalink:"/lodestar/contribution/tools/core-dumps"}},l={},d=[{value:"JavaScript Heap Dump",id:"javascript-heap-dump",level:2},{value:"Creating a V8 heap dump",id:"creating-a-v8-heap-dump",level:3},{value:"Viewing a V8 heap dump",id:"viewing-a-v8-heap-dump",level:3},{value:"Analyzing a V8 heap dump",id:"analyzing-a-v8-heap-dump",level:3},{value:"Native Heap Dump",id:"native-heap-dump",level:2},{value:"Build collection tools",id:"build-collection-tools",level:3},{value:"Collect a heap dump",id:"collect-a-heap-dump",level:3},{value:"Collecting a heap dump on a running process",id:"collecting-a-heap-dump-on-a-running-process",level:3},{value:"Installing heaptrack-gui on Linux",id:"installing-heaptrack-gui-on-linux",level:3},{value:"Installing heaptrack-gui on OSX",id:"installing-heaptrack-gui-on-osx",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"heap-dump-analysis",children:"Heap Dump Analysis"}),"\n",(0,a.jsxs)(t.p,{children:["There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by ",(0,a.jsx)(t.code,{children:"node"}),". It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by ",(0,a.jsx)(t.code,{children:"C/C++"})," code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the ",(0,a.jsx)(t.code,{children:"V8"})," runtime. Those are generally created within ",(0,a.jsx)(t.code,{children:"mmap"}),"'ed pages and the native heap dump tools are specific to ",(0,a.jsx)(t.code,{children:"C"})," objects that are created with ",(0,a.jsx)(t.code,{children:"malloc"})," and destroyed via ",(0,a.jsx)(t.code,{children:"free"}),". ",(0,a.jsx)(t.code,{children:"C++"})," is also covered as ",(0,a.jsx)(t.code,{children:"new"})," and ",(0,a.jsx)(t.code,{children:"delete"})," are wrappers around ",(0,a.jsx)(t.code,{children:"malloc"})," and ",(0,a.jsx)(t.code,{children:"free"}),". This is why it is important to understand how to analyze both types of memory usage."]}),"\n",(0,a.jsx)(t.h2,{id:"javascript-heap-dump",children:"JavaScript Heap Dump"}),"\n",(0,a.jsxs)(t.p,{children:["Node has built in ",(0,a.jsx)(t.code,{children:"V8"})," heap dump access and its a very powerful tool for analyzing memory usage. Understanding how the dump is created will both help to understand how it is displayed and how to use the analysis more effectively."]}),"\n",(0,a.jsxs)(t.p,{children:["The ",(0,a.jsx)(t.code,{children:"V8"})," heap dump is a stop the world process because walking the entire heap graph is necessary to create one. This is similar to a full, major garbage collection event. The VM starts at the heap entrance node and walks the entire graph and makes note of every edge that connects each node along the way. Nodes are JSObjects and edges are references between those objects."]}),"\n",(0,a.jsxs)(t.p,{children:["By time the whole heap is walked the full size and values of all nodes are known and all of the connections between those nodes is well understood. The object that is returned is a set of three arrays, the nodes, the edges and the string values that are encountered (because strings are themselves arrays of characters in ",(0,a.jsx)(t.code,{children:"C"})," so they are treated a bit differently by ",(0,a.jsx)(t.code,{children:"V8"}),")."]}),"\n",(0,a.jsxs)(t.h3,{id:"creating-a-v8-heap-dump",children:["Creating a ",(0,a.jsx)(t.code,{children:"V8"})," heap dump"]}),"\n",(0,a.jsxs)(t.p,{children:["There are two functions for creating a heap dump but both call the same functionality under the hood. One streams the result, ",(0,a.jsx)(t.code,{children:'require("v8").getHeapSnapshot([options])'}),', and is primarily intended for use by the Chrome devtools button to "take a snapshot". The second writes the heap dump to a file, ',(0,a.jsx)(t.code,{children:'require("v8").writeHeapSnapshot(filename[,options])'}),"."]}),"\n",(0,a.jsxs)(t.p,{children:["The optional ",(0,a.jsx)(t.code,{children:"options"})," argument, in both cases, is the same and contains two props.",(0,a.jsx)(t.code,{children:"exposeInternals"})," and ",(0,a.jsx)(t.code,{children:"exposeNumericValues"})," to enrich the dump. In many cases its the application layer that one wants to debug so ",(0,a.jsx)(t.code,{children:"exposeInternals"})," is not usually necessary. In ",(0,a.jsx)(t.code,{children:"V8"})," numbers are stored as 32bit integers and the size of pointers is also 32bits. So as an optimization, the pointer to the numeric value can be eliminated and the value itself can be stored in the ",(0,a.jsx)(t.code,{children:"Address"})," of the ",(0,a.jsx)(t.code,{children:"Value"})," instead. ",(0,a.jsx)(t.code,{children:"exposeNumericValues"}),' transcribes those "pointers" to the actual numeric value and appends them to the dump.']}),"\n",(0,a.jsxs)(t.p,{children:["Because heap analysis happens frequently during Lodestar development there is a helper api endpoint to capture a heap dump. ",(0,a.jsx)(t.strong,{children:"It is IMPORTANT"})," that this endpoint is not public facing as it will open the threat of DDOS attack."]}),"\n",(0,a.jsxs)(t.p,{children:["The endpoint accepts a ",(0,a.jsx)(t.code,{children:"POST"})," request and you may include an optional ",(0,a.jsx)(t.code,{children:"dirpath"})," query parameter to specify the directory where the heap dump will be written. If the ",(0,a.jsx)(t.code,{children:"dirpath"})," is not specified then the heap dump will be written to the current working directory."]}),"\n",(0,a.jsx)(t.p,{children:"To create a Lodestar heap dump you can use the following command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"curl -X POST http://localhost:9596/eth/v1/lodestar/write_heapdump?dirpath=/some/directory/path\n"})}),"\n",(0,a.jsxs)(t.h3,{id:"viewing-a-v8-heap-dump",children:["Viewing a ",(0,a.jsx)(t.code,{children:"V8"})," heap dump"]}),"\n",(0,a.jsxs)(t.p,{children:["It is best to analyze on a local development machine so if Lodestar is running on a cloud instance download the dump to the local environment. Open Chrome, or any Chromium based browser (the example photos were taken using Brave). In the url bar type ",(0,a.jsx)(t.code,{children:"chrome:://inspect"})," to bring up the DevTools menu (in brave the url will be rewritten to ",(0,a.jsx)(t.code,{children:"brave://inspect"}),")."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"DevTools",src:n(3799).A+"",width:"3456",height:"2234"})}),"\n",(0,a.jsxs)(t.p,{children:["Click on the ",(0,a.jsx)(t.code,{children:"Open dedicated DevTools for Node"})," link to open the node specific window and click on the ",(0,a.jsx)(t.code,{children:"Memory"})," tab as shown below."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Memory Tab",src:n(6946).A+"",width:"3456",height:"2234"})}),"\n",(0,a.jsxs)(t.p,{children:["Load the profile by either right clicking on the left pane or by clicking the ",(0,a.jsx)(t.code,{children:"Load"})," button at the bottom."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Load Profile",src:n(7765).A+"",width:"3456",height:"2234"})}),"\n",(0,a.jsxs)(t.h3,{id:"analyzing-a-v8-heap-dump",children:["Analyzing a ",(0,a.jsx)(t.code,{children:"V8"})," heap dump"]}),"\n",(0,a.jsx)(t.p,{children:"Analysis is as much an art as it is a science and the best way to learn is to do it a few times. Generally the goal is looking for memory leaks but reducing memory overhead is also something that happens. This guide will focus on leaks. With memory leaks one is looking for why objects have references that prevent them from being garbage collected."}),"\n",(0,a.jsxs)(t.p,{children:["To spot sources of leaks, focus on objects that have large quantities or very large ",(0,a.jsx)(t.code,{children:"retained size"}),". Retained size is the amount of memory that would be freed if the object was garbage collected. As an example if there is an object that has lots and lots of instances, like 100,000, and they are all pushed into an array then the array will have a very large retained size. This is because the array is holding references to all of the objects that it contains."]}),"\n",(0,a.jsx)(t.p,{children:"If it is not immediately apparent what objects are being leaked then another tool in your arsenal will be to take a second snapshot and compare it to the first. This will show what objects have been created/changed since the first snapshot."}),"\n",(0,a.jsx)(t.p,{children:"If there is an object that has a large retained size but is roughly the same, but not exactly the same, changes are that is NOT the leak. Some objects can get quite large during runtime but if its roughly the same size over time, but not exactly the same, it means that the application is modifying the object (why its not exactly identical in size) but if it hasn't grown significantly over time it can be assumed it is probably the working size of the instances."}),"\n",(0,a.jsx)(t.p,{children:"Try to focus on objects that are growing in size or in number over time. Growing in size means the object is holding references to other objects and growing in number means a function closure somewhere is retaining the small instances."}),"\n",(0,a.jsx)(t.p,{children:"That is the science part, but these clues are just breadcrumbs to follow. In order to actually resolve the leak, one needs to go into the code to figure out where those objects are being created, or more often, why the references to them are being retained. This is where the art comes in."}),"\n",(0,a.jsx)(t.p,{children:"Having a good understanding of the codebase will help to narrow down where to look. It is also common that the leak is not coming directly from Lodestar code, but rather one of the dependencies so be careful not to rule those out."}),"\n",(0,a.jsx)(t.h2,{id:"native-heap-dump",children:"Native Heap Dump"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"note: collecting a native heap dump is only supported on linux, analysis can be done from linux or Mac"})})}),"\n",(0,a.jsxs)(t.p,{children:["There are several tools that can be used to do native heap dump analysis. The most common are ",(0,a.jsx)(t.a,{href:"https://valgrind.org/docs/manual/ms-manual.html",children:(0,a.jsx)(t.code,{children:"massif"})})," from the ",(0,a.jsx)(t.a,{href:"https://valgrind.org/",children:(0,a.jsx)(t.code,{children:"Valgrind"})})," suite, google's ",(0,a.jsx)(t.a,{href:"https://github.com/gperftools/gperftools",children:(0,a.jsx)(t.code,{children:"gperftools"})})," and ",(0,a.jsx)(t.code,{children:"heaptrack"})," from ",(0,a.jsx)(t.a,{href:"https://community.kde.org/Main_Page",children:"KDE"}),". Of the three, ",(0,a.jsx)(t.code,{children:"heaptrack"})," is the most user friendly tool, and it is specifically designed for the task. It is much faster than ",(0,a.jsx)(t.code,{children:"Valgrind"}),", easier to integrate than ",(0,a.jsx)(t.code,{children:"gperftools"})," and also includes a gui for result analysis. Often times there are also memory allocations that are not related to memory leaks, and tools like ",(0,a.jsx)(t.code,{children:"Valgrind"})," and ",(0,a.jsx)(t.code,{children:"gperftools"})," become less useful. This is why ",(0,a.jsx)(t.code,{children:"heaptrack"})," is the recommended tool for heap dump analysis on Lodestar."]}),"\n",(0,a.jsxs)(t.p,{children:["There are a few things that will make the results with ",(0,a.jsx)(t.code,{children:"heaptrack"})," far better. The most important is using debug builds of all libraries included in a binary, including the application itself. This will make the results usable. Not to say that they will be useless without debug symbols but it will be kinda tough to optimize functions without knowing the function names nor the file and line numbers."]}),"\n",(0,a.jsxs)(t.p,{children:["This is the heart of what ",(0,a.jsx)(t.code,{children:"heaptrack"})," will do for us. It hooks into the memory allocation and adds in stack traces for each ",(0,a.jsx)(t.code,{children:"malloc"})," call site. That way every time memory is reserved there is a way to track back where it happened in the code. ",(0,a.jsx)(t.code,{children:"heaptrack"})," also hooks into the ",(0,a.jsx)(t.code,{children:"free"})," function and checks that versus the allocations to check for memory leaks and for temporary variables that can be optimized. This also allows for optimization of how many of each object is created by identifying high frequency allocations."]}),"\n",(0,a.jsxs)(t.p,{children:["Generally the .heapdump file will be created on a cloud server and then copied to a local machine for analysis, mostly because the gui is not available through ssh. The gui is not required for analysis but it is much easier to use than the command line tools. The first step will be to install ",(0,a.jsx)(t.code,{children:"heaptrack"})," on the target server and to capture a profile."]}),"\n",(0,a.jsx)(t.h3,{id:"build-collection-tools",children:"Build collection tools"}),"\n",(0,a.jsx)(t.p,{children:"Assume the following directory structure:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"\u251c\u2500\u2500 beacon-node\n\u2502\xa0\xa0 \u251c\u2500\u2500 db\n\u2502\xa0\xa0 \u251c\u2500\u2500 logs\n\u2502\xa0\xa0 \u251c\u2500\u2500 start-lodestar.sh\n\u2502\xa0\xa0 \u2514\u2500\u2500 rc-config.yml\n\u251c\u2500\u2500 lodestar\n\u2514\u2500\u2500 node # step below will clone this repo\n"})}),"\n",(0,a.jsxs)(t.p,{children:["We will start from the directory that contains ",(0,a.jsx)(t.code,{children:"lodestar"})," and the ",(0,a.jsx)(t.code,{children:"beacon-node"})," files."]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:'# Install heaptrack\n$ sudo apt-get update\n$ sudo apt-get -y install heaptrack\n\n# Using a debug build of node is recommended and it can be build\n# from source. Clone the node repo to get started.\n$ git clone https://github.com/nodejs/node.git\n$ cd node\n\n# Use whichever version of node you prefer\n$ git checkout v22.1.0\n$ ./configure --debug\n\n# This command only builds the debug version of node and assumes\n# that a release version of node is already installed on the system\n$ make -C out BUILDTYPE=Debug -j$(nproc --all)\n\n# Move the debug version of node the same folder that the release\n# version is installed in and name it `node_debug`. This will put the\n# debug binary on the path and allow you to run it with the\n# `node_debug` command\n$ cp out/Debug/node "$(which node)_debug"\n$ which node_debug\n/your/home/directory/.nvm/versions/node/v20.10.0/bin/node_debug\n\n# Return to the lodestar repo\n$ cd ../lodestar\n\n# Clean the build artifacts and node_modules\n$ yarn clean && yarn clean:nm\n\n# Install the dependencies\n$ yarn install\n\n# Ensure that all native modules are rebuilt with debug symbols. Some\n# modules are prebuilt, like classic-level, and the debug symbols may\n# not be included. If the debugging exercise is focussed around\n# one of these dependencies, then you will need to manually clone those\n# repos and manually build them with debug symbols.\n$ npm rebuild --debug\n'})}),"\n",(0,a.jsx)(t.h3,{id:"collect-a-heap-dump",children:"Collect a heap dump"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"# Move to th `beacon-node` directory\n$ cd ../beacon-node\n\n# Start lodestar with profiling enabled\n$ heaptrack \\\n$ --output ./lodestar.heapdump \\\n$ node_debug \\\n$ --max-old-space-size=8192 \\\n$ ../lodestar/packages/cli/bin/lodestar.js \\\n$ beacon \\\n$ --rcConfig ./rc-config.yml \\\n$ > /dev/null 2>&1 &\n# Wait some period of time for the heap dump data to be collected\n\n# The data will not be persisted until the process is stopped. You can gracefully\n# stop the process with the following command and if you want to hard kill it\n# add `-9` to the end of the `kill` command although that should not be necessary\n$ ps aux | grep lodestar | grep -v grep | awk '{print $2}' | head -n 1 | xargs kill\n"})}),"\n",(0,a.jsx)(t.h3,{id:"collecting-a-heap-dump-on-a-running-process",children:"Collecting a heap dump on a running process"}),"\n",(0,a.jsx)(t.p,{children:"Collecting a heap dump can also be done on a running process. There are both advantages and disadvantages to this approach. The main advantage is that you can collect a heap dump without having to restart. The down side is that the dump will only include allocations/de-allocations while the tracker is running. This means that all the non-paired calls to malloc/free will register as leaks. It will also not give a true representation of how the heap is being used. On the upside, however the dump will be much smaller in size."}),"\n",(0,a.jsxs)(t.p,{children:["It is important to note a warning that is in the ",(0,a.jsx)(t.code,{children:"heaptrack"})," source code:"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.em,{children:"WARNING: Runtime-attaching heaptrack is UNSTABLE and can lead to CRASHES in your application, especially after you detach heaptrack again. You are hereby warned, use it at your own risk!"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:'# Move to th `beacon-node` directory\n$ cd ../beacon-node\n\n# Start lodestar\n$ node_debug \\\n$ --max-old-space-size=8192 \\\n$ ../lodestar/packages/cli/bin/lodestar.js \\\n$ beacon \\\n$ --rcConfig ./rc-config.yml \\\n$ > /dev/null 2>&1 &\n# Wait some period of time to start collecting the dump\n\n# GDB is required to inject heaptrack into a running process\n# so you may need to install it\n$ sudo apt-get update\n$ sudo apt-get install -y gdb\n\n# Elevated `perf` permissions are also required depending on your\n# system configuration. Change until the next reboot\n$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope\n\n# Get the pid of the lodestar process\n$ export LODESTAR_PID=$(ps aux | grep lodestar | grep -v grep | awk \'{print $2}\' | head -n 1)\n\n# Inject heaptrack into the running process\n$ heaptrack --pid $LODESTAR_PID\n\nheaptrack output will be written to "/home/user/beacon-node/heaptrack.node_debug.111868.zst"\n/usr/lib/heaptrack/libheaptrack_preload.so\ninjecting heaptrack into application via GDB, this might take some time...\ninjection finished\n# Wait some period of time to collect the heap dump. See below\n# for the termination command that can be run from a separate\n# terminal when ready to stop collecting data\nTerminated\nremoving heaptrack injection via GDB, this might take some time...\nHeaptrack finished! Now run the following to investigate the data:\n\n heaptrack --analyze "/home/user/beacon-node/heaptrack.node_debug.111868.zst"\n'})}),"\n",(0,a.jsxs)(t.p,{children:["There is a trap in ",(0,a.jsx)(t.code,{children:"heaptrack"})," but the process uses a nested shell to do the actual injection so it is not possible to just Ctrl+C out of the injected process without corrupting the output file. To properly kill the collection one needs to target the nested shell pid. Here is a helper command to target that process:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"ps -ef | grep '[h]eaptrack --pid' | awk '$3 == '$(ps -ef | grep '[h]eaptrack --pid' | awk '$3 != 1 {print $2}' | head -n 1)' {print $2}' | xargs -r kill\n"})}),"\n",(0,a.jsx)(t.p,{children:"After working with the injected process for a while, I cannot honestly recommend it. It can work in a pinch, and is best suited for when the profiled process can be exited gracefully without repercussions (not on mainnet for instance). The benefit, though, is that the heapdump will be much smaller and targeted to runtime (will not have the transient, startup allocations) which can make it easier to see what is happening."}),"\n",(0,a.jsxs)(t.h3,{id:"installing-heaptrack-gui-on-linux",children:["Installing ",(0,a.jsx)(t.code,{children:"heaptrack-gui"})," on Linux"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"# You can you apt, apt-get or aptitude to install the gui\n$ sudo apt-get update\n$ sudo apt-get install -y heaptrack-gui\n"})}),"\n",(0,a.jsxs)(t.h3,{id:"installing-heaptrack-gui-on-osx",children:["Installing ",(0,a.jsx)(t.code,{children:"heaptrack-gui"})," on OSX"]}),"\n",(0,a.jsx)(t.p,{children:'At the time of writing this there is no official pre-built binary for OSX. This was a bit of a challenge but it was WELL worth the effort as the tool works very well. There were a number of bugs along the way while "using the docs" so your mileage may vary, but this is what worked for me.'}),"\n",(0,a.jsx)(t.p,{children:"Most of the dependencies can be installed via Homebrew and the tool itself needs to be built from source. There was one dependency that needed to be built from source. This process assumes a working folder that the repos can be cloned into."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:'# Start in the root folder where the repos will be cloned\n$ brew install qt@5\n\n# prepare tap of kde-mac/kde\n$ brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git\n$ "$(brew --repo kde-mac/kde)/tools/do-caveats.sh"\n\n# install the kde-mac and other required dependencies\n$ brew install kde-mac/kde/kf5-kcoreaddons \\\n$ kde-mac/kde/kf5-kitemmodels \\\n$ kde-mac/kde/kf5-kconfigwidgets \\\n$ kde-mac/kde/kdiagram \\\n$ extra-cmake-modules \\\n$ ki18n \\\n$ threadweaver \\\n$ boost \\\n$ zstd \\\n$ gettext\n\n# There is a bug in the current version of kde-mac/kde and one dependency needs\n# to be built manually. This is the workaround to get it built.\n$ git clone https://invent.kde.org/frameworks/kio.git\n$ mkdir kio/build\n$ cd kio/build\n$ export CMAKE_PREFIX_PATH=$(brew --prefix qt@5)\n$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..\n$ ninja\n$ sudo ninja install\n$ cd ../..\n\n# Now make sure that the dependencies are available to the system during runtime\n$ ln -sfv "$(brew --prefix)/share/kf5" "$HOME/Library/Application Support"\n$ ln -sfv "$(brew --prefix)/share/knotifications5" "$HOME/Library/Application Support"\n$ ln -sfv "$(brew --prefix)/share/kservices5" "$HOME/Library/Application Support"\n$ ln -sfv "$(brew --prefix)/share/kservicetypes5" "$HOME/Library/Application Support"\n\n# We are now ready to build the heaptrack_gui binaries for analysis on OSX\n$ git clone https://invent.kde.org/sdk/heaptrack.git\n$ cd heaptrack\n$ mkdir build\n$ cd build\n$ CMAKE_PREFIX_PATH=$(brew --prefix qt@5) PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake ..\n$ cmake -DCMAKE_BUILD_TYPE=Release ..\n$ make heaptrack_gui\n$ sudo make install\n# You can now find heaptrack_gui with your gui Applications. It is default\n# placed as /Applications/KDE/heaptrack_gui.app\n'})})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},3799:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/devtools-247fdbb015a564f3376c41f4726423cc.png"},7765:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/load-profile-1a4f5d98c15c710de58f5edccd84319f.png"},6946:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/memory-tab-2606d8555ae2fc8d12d75e03d91e875f.png"},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(6540);const o={},i=a.createContext(o);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[9949],{4508:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var a=n(4848),o=n(8453);const i={title:"Heap Dumps"},s="Heap Dump Analysis",r={id:"contribution/tools/heap-dumps",title:"Heap Dumps",description:"There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.",source:"@site/pages/contribution/tools/heap-dumps.md",sourceDirName:"contribution/tools",slug:"/contribution/tools/heap-dumps",permalink:"/lodestar/contribution/tools/heap-dumps",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/tools/heap-dumps.md",tags:[],version:"current",frontMatter:{title:"Heap Dumps"},sidebar:"tutorialSidebar",previous:{title:"Flame Graphs",permalink:"/lodestar/contribution/tools/flamegraphs"},next:{title:"Core Dumps",permalink:"/lodestar/contribution/tools/core-dumps"}},l={},d=[{value:"JavaScript Heap Dump",id:"javascript-heap-dump",level:2},{value:"Creating a V8 heap dump",id:"creating-a-v8-heap-dump",level:3},{value:"Viewing a V8 heap dump",id:"viewing-a-v8-heap-dump",level:3},{value:"Analyzing a V8 heap dump",id:"analyzing-a-v8-heap-dump",level:3},{value:"Native Heap Dump",id:"native-heap-dump",level:2},{value:"Build collection tools",id:"build-collection-tools",level:3},{value:"Collect a heap dump",id:"collect-a-heap-dump",level:3},{value:"Collecting a heap dump on a running process",id:"collecting-a-heap-dump-on-a-running-process",level:3},{value:"Installing heaptrack-gui on Linux",id:"installing-heaptrack-gui-on-linux",level:3},{value:"Installing heaptrack-gui on OSX",id:"installing-heaptrack-gui-on-osx",level:3}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"heap-dump-analysis",children:"Heap Dump Analysis"}),"\n",(0,a.jsxs)(t.p,{children:["There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by ",(0,a.jsx)(t.code,{children:"node"}),". It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by ",(0,a.jsx)(t.code,{children:"C/C++"})," code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the ",(0,a.jsx)(t.code,{children:"V8"})," runtime. Those are generally created within ",(0,a.jsx)(t.code,{children:"mmap"}),"'ed pages and the native heap dump tools are specific to ",(0,a.jsx)(t.code,{children:"C"})," objects that are created with ",(0,a.jsx)(t.code,{children:"malloc"})," and destroyed via ",(0,a.jsx)(t.code,{children:"free"}),". ",(0,a.jsx)(t.code,{children:"C++"})," is also covered as ",(0,a.jsx)(t.code,{children:"new"})," and ",(0,a.jsx)(t.code,{children:"delete"})," are wrappers around ",(0,a.jsx)(t.code,{children:"malloc"})," and ",(0,a.jsx)(t.code,{children:"free"}),". This is why it is important to understand how to analyze both types of memory usage."]}),"\n",(0,a.jsx)(t.h2,{id:"javascript-heap-dump",children:"JavaScript Heap Dump"}),"\n",(0,a.jsxs)(t.p,{children:["Node has built in ",(0,a.jsx)(t.code,{children:"V8"})," heap dump access and its a very powerful tool for analyzing memory usage. Understanding how the dump is created will both help to understand how it is displayed and how to use the analysis more effectively."]}),"\n",(0,a.jsxs)(t.p,{children:["The ",(0,a.jsx)(t.code,{children:"V8"})," heap dump is a stop the world process because walking the entire heap graph is necessary to create one. This is similar to a full, major garbage collection event. The VM starts at the heap entrance node and walks the entire graph and makes note of every edge that connects each node along the way. Nodes are JSObjects and edges are references between those objects."]}),"\n",(0,a.jsxs)(t.p,{children:["By time the whole heap is walked the full size and values of all nodes are known and all of the connections between those nodes is well understood. The object that is returned is a set of three arrays, the nodes, the edges and the string values that are encountered (because strings are themselves arrays of characters in ",(0,a.jsx)(t.code,{children:"C"})," so they are treated a bit differently by ",(0,a.jsx)(t.code,{children:"V8"}),")."]}),"\n",(0,a.jsxs)(t.h3,{id:"creating-a-v8-heap-dump",children:["Creating a ",(0,a.jsx)(t.code,{children:"V8"})," heap dump"]}),"\n",(0,a.jsxs)(t.p,{children:["There are two functions for creating a heap dump but both call the same functionality under the hood. One streams the result, ",(0,a.jsx)(t.code,{children:'require("v8").getHeapSnapshot([options])'}),', and is primarily intended for use by the Chrome devtools button to "take a snapshot". The second writes the heap dump to a file, ',(0,a.jsx)(t.code,{children:'require("v8").writeHeapSnapshot(filename[,options])'}),"."]}),"\n",(0,a.jsxs)(t.p,{children:["The optional ",(0,a.jsx)(t.code,{children:"options"})," argument, in both cases, is the same and contains two props.",(0,a.jsx)(t.code,{children:"exposeInternals"})," and ",(0,a.jsx)(t.code,{children:"exposeNumericValues"})," to enrich the dump. In many cases its the application layer that one wants to debug so ",(0,a.jsx)(t.code,{children:"exposeInternals"})," is not usually necessary. In ",(0,a.jsx)(t.code,{children:"V8"})," numbers are stored as 32bit integers and the size of pointers is also 32bits. So as an optimization, the pointer to the numeric value can be eliminated and the value itself can be stored in the ",(0,a.jsx)(t.code,{children:"Address"})," of the ",(0,a.jsx)(t.code,{children:"Value"})," instead. ",(0,a.jsx)(t.code,{children:"exposeNumericValues"}),' transcribes those "pointers" to the actual numeric value and appends them to the dump.']}),"\n",(0,a.jsxs)(t.p,{children:["Because heap analysis happens frequently during Lodestar development there is a helper api endpoint to capture a heap dump. ",(0,a.jsx)(t.strong,{children:"It is IMPORTANT"})," that this endpoint is not public facing as it will open the threat of DDOS attack."]}),"\n",(0,a.jsxs)(t.p,{children:["The endpoint accepts a ",(0,a.jsx)(t.code,{children:"POST"})," request and you may include an optional ",(0,a.jsx)(t.code,{children:"dirpath"})," query parameter to specify the directory where the heap dump will be written. If the ",(0,a.jsx)(t.code,{children:"dirpath"})," is not specified then the heap dump will be written to the current working directory."]}),"\n",(0,a.jsx)(t.p,{children:"To create a Lodestar heap dump you can use the following command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"curl -X POST http://localhost:9596/eth/v1/lodestar/write_heapdump?dirpath=/some/directory/path\n"})}),"\n",(0,a.jsxs)(t.h3,{id:"viewing-a-v8-heap-dump",children:["Viewing a ",(0,a.jsx)(t.code,{children:"V8"})," heap dump"]}),"\n",(0,a.jsxs)(t.p,{children:["It is best to analyze on a local development machine so if Lodestar is running on a cloud instance download the dump to the local environment. Open Chrome, or any Chromium based browser (the example photos were taken using Brave). In the url bar type ",(0,a.jsx)(t.code,{children:"chrome:://inspect"})," to bring up the DevTools menu (in brave the url will be rewritten to ",(0,a.jsx)(t.code,{children:"brave://inspect"}),")."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"DevTools",src:n(3799).A+"",width:"3456",height:"2234"})}),"\n",(0,a.jsxs)(t.p,{children:["Click on the ",(0,a.jsx)(t.code,{children:"Open dedicated DevTools for Node"})," link to open the node specific window and click on the ",(0,a.jsx)(t.code,{children:"Memory"})," tab as shown below."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Memory Tab",src:n(6946).A+"",width:"3456",height:"2234"})}),"\n",(0,a.jsxs)(t.p,{children:["Load the profile by either right-clicking on the left pane or by clicking the ",(0,a.jsx)(t.code,{children:"Load"})," button at the bottom."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Load Profile",src:n(7765).A+"",width:"3456",height:"2234"})}),"\n",(0,a.jsxs)(t.h3,{id:"analyzing-a-v8-heap-dump",children:["Analyzing a ",(0,a.jsx)(t.code,{children:"V8"})," heap dump"]}),"\n",(0,a.jsx)(t.p,{children:"Analysis is as much an art as it is a science and the best way to learn is to do it a few times. Generally the goal is looking for memory leaks but reducing memory overhead is also something that happens. This guide will focus on leaks. With memory leaks one is looking for why objects have references that prevent them from being garbage collected."}),"\n",(0,a.jsxs)(t.p,{children:["To spot sources of leaks, focus on objects that have large quantities or very large ",(0,a.jsx)(t.code,{children:"retained size"}),". Retained size is the amount of memory that would be freed if the object was garbage collected. As an example if there is an object that has lots and lots of instances, like 100,000, and they are all pushed into an array then the array will have a very large retained size. This is because the array is holding references to all of the objects that it contains."]}),"\n",(0,a.jsx)(t.p,{children:"If it is not immediately apparent what objects are being leaked then another tool in your arsenal will be to take a second snapshot and compare it to the first. This will show what objects have been created/changed since the first snapshot."}),"\n",(0,a.jsx)(t.p,{children:"If there is an object that has a large retained size but is roughly the same, but not exactly the same, changes are that is NOT the leak. Some objects can get quite large during runtime but if its roughly the same size over time, but not exactly the same, it means that the application is modifying the object (why its not exactly identical in size) but if it hasn't grown significantly over time it can be assumed it is probably the working size of the instances."}),"\n",(0,a.jsx)(t.p,{children:"Try to focus on objects that are growing in size or in number over time. Growing in size means the object is holding references to other objects and growing in number means a function closure somewhere is retaining the small instances."}),"\n",(0,a.jsx)(t.p,{children:"That is the science part, but these clues are just breadcrumbs to follow. In order to actually resolve the leak, one needs to go into the code to figure out where those objects are being created, or more often, why the references to them are being retained. This is where the art comes in."}),"\n",(0,a.jsx)(t.p,{children:"Having a good understanding of the codebase will help to narrow down where to look. It is also common that the leak is not coming directly from Lodestar code, but rather one of the dependencies so be careful not to rule those out."}),"\n",(0,a.jsx)(t.h2,{id:"native-heap-dump",children:"Native Heap Dump"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.em,{children:(0,a.jsx)(t.strong,{children:"note: collecting a native heap dump is only supported on linux, analysis can be done from linux or Mac"})})}),"\n",(0,a.jsxs)(t.p,{children:["There are several tools that can be used to do native heap dump analysis. The most common are ",(0,a.jsx)(t.a,{href:"https://valgrind.org/docs/manual/ms-manual.html",children:(0,a.jsx)(t.code,{children:"massif"})})," from the ",(0,a.jsx)(t.a,{href:"https://valgrind.org/",children:(0,a.jsx)(t.code,{children:"Valgrind"})})," suite, google's ",(0,a.jsx)(t.a,{href:"https://github.com/gperftools/gperftools",children:(0,a.jsx)(t.code,{children:"gperftools"})})," and ",(0,a.jsx)(t.code,{children:"heaptrack"})," from ",(0,a.jsx)(t.a,{href:"https://community.kde.org/Main_Page",children:"KDE"}),". Of the three, ",(0,a.jsx)(t.code,{children:"heaptrack"})," is the most user-friendly tool, and it is specifically designed for the task. It is much faster than ",(0,a.jsx)(t.code,{children:"Valgrind"}),", easier to integrate than ",(0,a.jsx)(t.code,{children:"gperftools"})," and also includes a gui for result analysis. Often times there are also memory allocations that are not related to memory leaks, and tools like ",(0,a.jsx)(t.code,{children:"Valgrind"})," and ",(0,a.jsx)(t.code,{children:"gperftools"})," become less useful. This is why ",(0,a.jsx)(t.code,{children:"heaptrack"})," is the recommended tool for heap dump analysis on Lodestar."]}),"\n",(0,a.jsxs)(t.p,{children:["There are a few things that will make the results with ",(0,a.jsx)(t.code,{children:"heaptrack"})," far better. The most important is using debug builds of all libraries included in a binary, including the application itself. This will make the results usable. Not to say that they will be useless without debug symbols but it will be kinda tough to optimize functions without knowing the function names nor the file and line numbers."]}),"\n",(0,a.jsxs)(t.p,{children:["This is the heart of what ",(0,a.jsx)(t.code,{children:"heaptrack"})," will do for us. It hooks into the memory allocation and adds in stack traces for each ",(0,a.jsx)(t.code,{children:"malloc"})," call site. That way every time memory is reserved there is a way to track back where it happened in the code. ",(0,a.jsx)(t.code,{children:"heaptrack"})," also hooks into the ",(0,a.jsx)(t.code,{children:"free"})," function and checks that versus the allocations to check for memory leaks and for temporary variables that can be optimized. This also allows for optimization of how many of each object is created by identifying high frequency allocations."]}),"\n",(0,a.jsxs)(t.p,{children:["Generally the .heapdump file will be created on a cloud server and then copied to a local machine for analysis, mostly because the gui is not available through ssh. The gui is not required for analysis but it is much easier to use than the command line tools. The first step will be to install ",(0,a.jsx)(t.code,{children:"heaptrack"})," on the target server and to capture a profile."]}),"\n",(0,a.jsx)(t.h3,{id:"build-collection-tools",children:"Build collection tools"}),"\n",(0,a.jsx)(t.p,{children:"Assume the following directory structure:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"\u251c\u2500\u2500 beacon-node\n\u2502\xa0\xa0 \u251c\u2500\u2500 db\n\u2502\xa0\xa0 \u251c\u2500\u2500 logs\n\u2502\xa0\xa0 \u251c\u2500\u2500 start-lodestar.sh\n\u2502\xa0\xa0 \u2514\u2500\u2500 rc-config.yml\n\u251c\u2500\u2500 lodestar\n\u2514\u2500\u2500 node # step below will clone this repo\n"})}),"\n",(0,a.jsxs)(t.p,{children:["We will start from the directory that contains ",(0,a.jsx)(t.code,{children:"lodestar"})," and the ",(0,a.jsx)(t.code,{children:"beacon-node"})," files."]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:'# Install heaptrack\n$ sudo apt-get update\n$ sudo apt-get -y install heaptrack\n\n# Using a debug build of node is recommended and it can be build\n# from source. Clone the node repo to get started.\n$ git clone https://github.com/nodejs/node.git\n$ cd node\n\n# Use whichever version of node you prefer\n$ git checkout v22.1.0\n$ ./configure --debug\n\n# This command only builds the debug version of node and assumes\n# that a release version of node is already installed on the system\n$ make -C out BUILDTYPE=Debug -j$(nproc --all)\n\n# Move the debug version of node the same folder that the release\n# version is installed in and name it `node_debug`. This will put the\n# debug binary on the path and allow you to run it with the\n# `node_debug` command\n$ cp out/Debug/node "$(which node)_debug"\n$ which node_debug\n/your/home/directory/.nvm/versions/node/v20.10.0/bin/node_debug\n\n# Return to the lodestar repo\n$ cd ../lodestar\n\n# Clean the build artifacts and node_modules\n$ yarn clean && yarn clean:nm\n\n# Install the dependencies\n$ yarn install\n\n# Ensure that all native modules are rebuilt with debug symbols. Some\n# modules are prebuilt, like classic-level, and the debug symbols may\n# not be included. If the debugging exercise is focussed around\n# one of these dependencies, then you will need to manually clone those\n# repos and manually build them with debug symbols.\n$ npm rebuild --debug\n'})}),"\n",(0,a.jsx)(t.h3,{id:"collect-a-heap-dump",children:"Collect a heap dump"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"# Move to th `beacon-node` directory\n$ cd ../beacon-node\n\n# Start lodestar with profiling enabled\n$ heaptrack \\\n$ --output ./lodestar.heapdump \\\n$ node_debug \\\n$ --max-old-space-size=8192 \\\n$ ../lodestar/packages/cli/bin/lodestar.js \\\n$ beacon \\\n$ --rcConfig ./rc-config.yml \\\n$ > /dev/null 2>&1 &\n# Wait some period of time for the heap dump data to be collected\n\n# The data will not be persisted until the process is stopped. You can gracefully\n# stop the process with the following command and if you want to hard kill it\n# add `-9` to the end of the `kill` command although that should not be necessary\n$ ps aux | grep lodestar | grep -v grep | awk '{print $2}' | head -n 1 | xargs kill\n"})}),"\n",(0,a.jsx)(t.h3,{id:"collecting-a-heap-dump-on-a-running-process",children:"Collecting a heap dump on a running process"}),"\n",(0,a.jsx)(t.p,{children:"Collecting a heap dump can also be done on a running process. There are both advantages and disadvantages to this approach. The main advantage is that you can collect a heap dump without having to restart. The down side is that the dump will only include allocations/de-allocations while the tracker is running. This means that all the non-paired calls to malloc/free will register as leaks. It will also not give a true representation of how the heap is being used. On the upside, however the dump will be much smaller in size."}),"\n",(0,a.jsxs)(t.p,{children:["It is important to note a warning that is in the ",(0,a.jsx)(t.code,{children:"heaptrack"})," source code:"]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.em,{children:"WARNING: Runtime-attaching heaptrack is UNSTABLE and can lead to CRASHES in your application, especially after you detach heaptrack again. You are hereby warned, use it at your own risk!"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:'# Move to th `beacon-node` directory\n$ cd ../beacon-node\n\n# Start lodestar\n$ node_debug \\\n$ --max-old-space-size=8192 \\\n$ ../lodestar/packages/cli/bin/lodestar.js \\\n$ beacon \\\n$ --rcConfig ./rc-config.yml \\\n$ > /dev/null 2>&1 &\n# Wait some period of time to start collecting the dump\n\n# GDB is required to inject heaptrack into a running process\n# so you may need to install it\n$ sudo apt-get update\n$ sudo apt-get install -y gdb\n\n# Elevated `perf` permissions are also required depending on your\n# system configuration. Change until the next reboot\n$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope\n\n# Get the pid of the lodestar process\n$ export LODESTAR_PID=$(ps aux | grep lodestar | grep -v grep | awk \'{print $2}\' | head -n 1)\n\n# Inject heaptrack into the running process\n$ heaptrack --pid $LODESTAR_PID\n\nheaptrack output will be written to "/home/user/beacon-node/heaptrack.node_debug.111868.zst"\n/usr/lib/heaptrack/libheaptrack_preload.so\ninjecting heaptrack into application via GDB, this might take some time...\ninjection finished\n# Wait some period of time to collect the heap dump. See below\n# for the termination command that can be run from a separate\n# terminal when ready to stop collecting data\nTerminated\nremoving heaptrack injection via GDB, this might take some time...\nHeaptrack finished! Now run the following to investigate the data:\n\n heaptrack --analyze "/home/user/beacon-node/heaptrack.node_debug.111868.zst"\n'})}),"\n",(0,a.jsxs)(t.p,{children:["There is a trap in ",(0,a.jsx)(t.code,{children:"heaptrack"})," but the process uses a nested shell to do the actual injection so it is not possible to just Ctrl+C out of the injected process without corrupting the output file. To properly kill the collection one needs to target the nested shell pid. Here is a helper command to target that process:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"ps -ef | grep '[h]eaptrack --pid' | awk '$3 == '$(ps -ef | grep '[h]eaptrack --pid' | awk '$3 != 1 {print $2}' | head -n 1)' {print $2}' | xargs -r kill\n"})}),"\n",(0,a.jsx)(t.p,{children:"After working with the injected process for a while, I cannot honestly recommend it. It can work in a pinch, and is best suited for when the profiled process can be exited gracefully without repercussions (not on mainnet for instance). The benefit, though, is that the heapdump will be much smaller and targeted to runtime (will not have the transient, startup allocations) which can make it easier to see what is happening."}),"\n",(0,a.jsxs)(t.h3,{id:"installing-heaptrack-gui-on-linux",children:["Installing ",(0,a.jsx)(t.code,{children:"heaptrack-gui"})," on Linux"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"# You can you apt, apt-get or aptitude to install the gui\n$ sudo apt-get update\n$ sudo apt-get install -y heaptrack-gui\n"})}),"\n",(0,a.jsxs)(t.h3,{id:"installing-heaptrack-gui-on-osx",children:["Installing ",(0,a.jsx)(t.code,{children:"heaptrack-gui"})," on OSX"]}),"\n",(0,a.jsx)(t.p,{children:'At the time of writing this there is no official pre-built binary for OSX. This was a bit of a challenge but it was WELL worth the effort as the tool works very well. There were a number of bugs along the way while "using the docs" so your mileage may vary, but this is what worked for me.'}),"\n",(0,a.jsx)(t.p,{children:"Most of the dependencies can be installed via Homebrew and the tool itself needs to be built from source. There was one dependency that needed to be built from source. This process assumes a working folder that the repos can be cloned into."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:'# Start in the root folder where the repos will be cloned\n$ brew install qt@5\n\n# prepare tap of kde-mac/kde\n$ brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git\n$ "$(brew --repo kde-mac/kde)/tools/do-caveats.sh"\n\n# install the kde-mac and other required dependencies\n$ brew install kde-mac/kde/kf5-kcoreaddons \\\n$ kde-mac/kde/kf5-kitemmodels \\\n$ kde-mac/kde/kf5-kconfigwidgets \\\n$ kde-mac/kde/kdiagram \\\n$ extra-cmake-modules \\\n$ ki18n \\\n$ threadweaver \\\n$ boost \\\n$ zstd \\\n$ gettext\n\n# There is a bug in the current version of kde-mac/kde and one dependency needs\n# to be built manually. This is the workaround to get it built.\n$ git clone https://invent.kde.org/frameworks/kio.git\n$ mkdir kio/build\n$ cd kio/build\n$ export CMAKE_PREFIX_PATH=$(brew --prefix qt@5)\n$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..\n$ ninja\n$ sudo ninja install\n$ cd ../..\n\n# Now make sure that the dependencies are available to the system during runtime\n$ ln -sfv "$(brew --prefix)/share/kf5" "$HOME/Library/Application Support"\n$ ln -sfv "$(brew --prefix)/share/knotifications5" "$HOME/Library/Application Support"\n$ ln -sfv "$(brew --prefix)/share/kservices5" "$HOME/Library/Application Support"\n$ ln -sfv "$(brew --prefix)/share/kservicetypes5" "$HOME/Library/Application Support"\n\n# We are now ready to build the heaptrack_gui binaries for analysis on OSX\n$ git clone https://invent.kde.org/sdk/heaptrack.git\n$ cd heaptrack\n$ mkdir build\n$ cd build\n$ CMAKE_PREFIX_PATH=$(brew --prefix qt@5) PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake ..\n$ cmake -DCMAKE_BUILD_TYPE=Release ..\n$ make heaptrack_gui\n$ sudo make install\n# You can now find heaptrack_gui with your gui Applications. It is default\n# placed as /Applications/KDE/heaptrack_gui.app\n'})})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},3799:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/devtools-247fdbb015a564f3376c41f4726423cc.png"},7765:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/load-profile-1a4f5d98c15c710de58f5edccd84319f.png"},6946:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/memory-tab-2606d8555ae2fc8d12d75e03d91e875f.png"},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(6540);const o={},i=a.createContext(o);function s(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a649430.24fe983f.js b/assets/js/3a649430.24fe983f.js deleted file mode 100644 index bb46475d4d07..000000000000 --- a/assets/js/3a649430.24fe983f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[1959],{1947:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var i=n(4848),s=n(8453);const o={},r="Introduction",a={id:"introduction",title:"Introduction",description:"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the most actively used blockchain. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards and has been actively working in the Ethereum space ever since. We are proud to develop Lodestar and to present this documentation as a resource for the Ethereum community.",source:"@site/pages/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/lodestar/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home",permalink:"/lodestar/"},next:{title:"Security Policy",permalink:"/lodestar/security"}},l={},c=[{value:"Proof of Stake",id:"proof-of-stake",level:2},{value:"Consensus Clients",id:"consensus-clients",level:2},{value:"Why Client Diversity?",id:"why-client-diversity",level:2},{value:"Ethereum Reading List",id:"ethereum-reading-list",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(t.p,{children:"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the most actively used blockchain. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards and has been actively working in the Ethereum space ever since. We are proud to develop Lodestar and to present this documentation as a resource for the Ethereum community."}),"\n",(0,i.jsx)(t.h2,{id:"proof-of-stake",children:"Proof of Stake"}),"\n",(0,i.jsx)(t.p,{children:"In Ethereum's Proof of Stake (PoS) model, validators replace miners from the Proof of Work (PoW) system. Validators are Ethereum stakeholders who lock up a portion of their Ether as a stake. The protocol randomly selects these validators to propose new blocks. The chance of being chosen is tied to the size of their stake: the more Ether staked, the higher the probability of being selected to propose the block. Proposers receive transaction fees and block rewards as incentives. Validators are also responsible for voting on the validity of blocks proposed by other validators. However, they face penalties, known as slashing, for actions like double-signing, votes on a block that is not in the majority or going offline, ensuring network integrity and reliability. The PoS mechanism significantly reduces energy consumption compared to PoW, because it does not require extensive computational power. Moreover, PoS tends to facilitate faster transaction validations and block creations, enhancing the overall performance and scalability of the network."}),"\n",(0,i.jsx)(t.h2,{id:"consensus-clients",children:"Consensus Clients"}),"\n",(0,i.jsx)(t.p,{children:"In an effort to promote client diversity there are several beacon-nodes being developed. Each is programmed in a different language and by a different team. The following is a list of the current beacon-node clients:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://lodestar.chainsafe.io/",children:"Lodestar"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://prysmaticlabs.com/",children:"Prysm"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://lighthouse.sigmaprime.io/",children:"Lighthouse"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://consensys.net/knowledge-base/ethereum-2/teku/",children:"Teku"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://nimbus.team/",children:"Nimbus"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://grandine.io",children:"Grandine"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"why-client-diversity",children:"Why Client Diversity?"}),"\n",(0,i.jsx)(t.p,{children:"The Ethereum network's robustness is significantly enhanced by its client diversity, whereby multiple, independently-developed clients conforming to a common specification facilitate seamless interaction and function equivalently across nodes. This client variety not only fosters a rich ecosystem but also provides a buffer against network-wide issues stemming from bugs or malicious attacks targeted at particular clients. For instance, during the Shanghai denial-of-service attack in 2016, the diversified client structure enabled the network to withstand the assault, underscoring the resilience afforded by multiple client configurations."}),"\n",(0,i.jsx)(t.p,{children:"On the consensus layer, client distribution is crucial for maintaining network integrity and finality, ensuring transactions are irreversible once validated. A balanced spread of nodes across various clients helps mitigate risks associated with potential bugs or attacks that could, in extreme cases, derail the consensus process or lead to incorrect chain splits, thereby jeopardizing the network's stability and trust. While the data suggests a dominance of Prysm client on the consensus layer, efforts are ongoing to promote a more even distribution among others like Lighthouse, Teku, Nimbus and Grandine. Encouraging the adoption of minority clients, bolstering their documentation, and leveraging real-time client diversity dashboards are among the strategies being employed to enhance client diversity, which in turn fortifies the Ethereum consensus layer against adversities and fosters a healthier decentralized network ecosystem."}),"\n",(0,i.jsx)(t.p,{children:"The non-finality event in May 2023 on the Ethereum network posed a significant challenge. The issue arose from attestations for a fork, which necessitated state replays to validate the attestations, causing a notable strain on system resources. As a result, nodes fell out of sync, which deterred the accurate tracking of the actual head of the chain. This situation was exacerbated by a decline in attestations during specific epochs, further hampering the consensus mechanism. The Lodestar team noticed late attestations several weeks prior to the event and implemented a feature that attempted to address such challenges by not processing untimely attestations, and thus not requiring expensive state replays\u200b. While it was done for slightly different reasons, the result was the same. Lodestar was able to follow the chain correctly and helped to stabilize the network. This example underscored the importance of client diversity and network resilience against potential forks and replay attacks. These are considered realistic threats, especially in the context of system complexity like in Ethereum's consensus mechanism."}),"\n",(0,i.jsx)(t.h2,{id:"ethereum-reading-list",children:"Ethereum Reading List"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://ethereum.org/en/developers/docs/",children:"Ethereum Docs"})}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://eth2book.info/capella/",children:"Upgrading Ethereum"})," by Ben Edgington"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/ethereumbook/ethereumbook",children:"Ethereum Book"})," by Andreas M. Antonopoulos and Gavin Wood"]}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/ethereum/consensus-specs",children:"Ethereum Consensus Specification"})}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://browse.arxiv.org/pdf/1710.09437.pdf",children:"Casper the Friendly Finality Gadget"})," by Vitalik Buterin and Virgil Griffith"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/protolambda/lmd-ghost",children:"LMD Ghost"})," by protolambda"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(6540);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a649430.b0617821.js b/assets/js/3a649430.b0617821.js new file mode 100644 index 000000000000..888f7ecd3d91 --- /dev/null +++ b/assets/js/3a649430.b0617821.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[1959],{1947:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var i=n(4848),s=n(8453);const o={},r="Introduction",a={id:"introduction",title:"Introduction",description:"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the second-largest blockchain by market capitalization. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards in 2017 and has been actively working in the Ethereum ecosystem ever since. We are proud to develop Lodestar, the only TypeScript based consensus client, and to present this documentation as a resource for the Ethereum community.",source:"@site/pages/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/lodestar/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/introduction.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Home",permalink:"/lodestar/"},next:{title:"Security Policy",permalink:"/lodestar/security"}},c={},l=[{value:"Proof of Stake",id:"proof-of-stake",level:2},{value:"Consensus Clients",id:"consensus-clients",level:2},{value:"Why Client Diversity?",id:"why-client-diversity",level:2},{value:"Ethereum Reading List",id:"ethereum-reading-list",level:2}];function h(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(t.p,{children:"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the second-largest blockchain by market capitalization. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards in 2017 and has been actively working in the Ethereum ecosystem ever since. We are proud to develop Lodestar, the only TypeScript based consensus client, and to present this documentation as a resource for the Ethereum community."}),"\n",(0,i.jsx)(t.h2,{id:"proof-of-stake",children:"Proof of Stake"}),"\n",(0,i.jsx)(t.p,{children:"In Ethereum's Proof of Stake (PoS) model, validators replace miners from the Proof of Work (PoW) system. Validators are Ethereum stakeholders who lock up a portion of their Ether as a stake. The protocol randomly selects these validators to propose new blocks. The chance of being chosen is tied to the size of their stake: the more Ether staked, the higher the probability of being selected to propose the block. Proposers receive transaction fees and block rewards as incentives. Validators are also responsible for voting on the validity of blocks proposed by other validators. However, they also face penalties, known as slashing, for actions like signing two different block proposals in the same slot or voting on two different attestations for the same target epoch, which creates conflicting states. The PoS mechanism significantly reduces energy consumption compared to PoW, because it does not require extensive computational power. Moreover, PoS tends to facilitate faster transaction validations and block creations, enhancing the overall performance and scalability of the network."}),"\n",(0,i.jsx)(t.h2,{id:"consensus-clients",children:"Consensus Clients"}),"\n",(0,i.jsx)(t.p,{children:"In an effort to promote client diversity there are several consensus beacon nodes being developed. Each is programmed in a different language and by a different team. The following is a list of the current open source consensus clients in alphabetical order:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://grandine.io",children:"Grandine (Rust)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://lighthouse.sigmaprime.io/",children:"Lighthouse (Rust)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://lodestar.chainsafe.io/",children:"Lodestar (TypeScript)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://nimbus.team/",children:"Nimbus (Nim)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://prysmaticlabs.com/",children:"Prysm (Golang)"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://consensys.net/knowledge-base/ethereum-2/teku/",children:"Teku (Java)"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"why-client-diversity",children:"Why Client Diversity?"}),"\n",(0,i.jsx)(t.p,{children:"The Ethereum network's robustness is significantly enhanced by its client diversity, whereby multiple, independently-developed clients conforming to a common specification, facilitating seamless interaction and function equivalently across different nodes. This client variety not only fosters a rich ecosystem but also provides a buffer against network-wide issues stemming from bugs or malicious attacks targeted at particular clients. For instance, during the Shanghai denial-of-service attack in 2016, the diversified client structure enabled the network to withstand the assault, underscoring the resilience afforded by multiple client configurations."}),"\n",(0,i.jsxs)(t.p,{children:["On the consensus layer, client distribution is crucial for maintaining network integrity and finality, ensuring transactions are irreversible once validated. A balanced spread of nodes across various clients help to mitigate risks associated with potential bugs or attacks that could, in extreme cases, derail the consensus process (liveness failure) or lead to incorrect chain splits (forking), thereby jeopardizing the network's stability and trust. While the data suggests a ",(0,i.jsx)(t.a,{href:"https://clientdiversity.org",children:"dominance of the Prysm and Lighthouse clients"})," on the consensus layer, efforts are ongoing to promote a more even distribution among others clients. Encouraging the adoption of minority clients, bolstering their documentation, and leveraging real-time client diversity dashboards are among the strategies being employed to enhance client diversity, which in turn fortifies the Ethereum consensus layer against adversities and fosters a healthier decentralized network."]}),"\n",(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.a,{href:"https://medium.com/offchainlabs/post-mortem-report-ethereum-mainnet-finality-05-11-2023-95e271dfd8b2",children:"non-finality event of May 2023"})," on the Ethereum network posed a significant challenge. The issue arose from attestations for a fork, which necessitated state replays to validate the attestations, causing a notable strain on system resources. As a result, nodes fell out of sync, which deterred the accurate tracking of the actual head of the chain. This situation was exacerbated by a decline in attestations during specific epochs, further hampering the consensus mechanism from reaching finality. The Lodestar team noticed late attestations several weeks prior to the event and implemented a feature that attempted to address such challenges by not processing untimely attestations, and thus not requiring expensive state replays\u200b. While it was done for slightly different reasons, the result was the same. Lodestar was able to follow the chain correctly and helped to stabilize the network. This example underscored the importance of client diversity and network resilience against potential forks and replay attacks. These are considered realistic threats, especially in the context of system complexity like in Ethereum's consensus mechanism."]}),"\n",(0,i.jsx)(t.h2,{id:"ethereum-reading-list",children:"Ethereum Reading List"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://ethereum.org/en/developers/docs/",children:"Ethereum Docs"})}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://eth2book.info/capella/",children:"Upgrading Ethereum"})," by Ben Edgington"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/ethereumbook/ethereumbook",children:"Ethereum Book"})," by Andreas M. Antonopoulos and Gavin Wood"]}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://github.com/ethereum/consensus-specs",children:"Ethereum Consensus Specification"})}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://browse.arxiv.org/pdf/1710.09437.pdf",children:"Casper the Friendly Finality Gadget"})," by Vitalik Buterin and Virgil Griffith"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://github.com/protolambda/lmd-ghost",children:"LMD Ghost"})," by protolambda"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var i=n(6540);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/40d332f6.e59eae93.js b/assets/js/40d332f6.e59eae93.js new file mode 100644 index 000000000000..2fe7f41f16fa --- /dev/null +++ b/assets/js/40d332f6.e59eae93.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[5887],{6475:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var i=t(4848),s=t(8453);const r={},o="Quick Start Custom Setup Guide",d={id:"run/getting-started/quick-start-custom-guide",title:"Quick Start Custom Setup Guide",description:"This is a step-by-step guide to utilize @ChainSafe/lodestar-quickstart to setup a Ubuntu-based full Ethereum node using a local execution client and ChainSafe's Lodestar consensus client via Docker (the recommended method to use Lodestar for production environments). This is an adaptation of Somer Esat's guides for the Ethereum staking community.",source:"@site/pages/run/getting-started/quick-start-custom-guide.md",sourceDirName:"run/getting-started",slug:"/run/getting-started/quick-start-custom-guide",permalink:"/lodestar/run/getting-started/quick-start-custom-guide",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/getting-started/quick-start-custom-guide.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Lodestar Quick Start Scripts",permalink:"/lodestar/run/getting-started/quick-start"},next:{title:"Starting a Node",permalink:"/lodestar/run/beacon-management/starting-a-node"}},c={},a=[{value:"Support",id:"support",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Testnet to Mainnet",id:"testnet-to-mainnet",level:2},{value:"Hardware Requirements",id:"hardware-requirements",level:2},{value:"Setup Machine & Repository",id:"setup-machine--repository",level:2},{value:"Install Docker Engine & Docker Compose",id:"install-docker-engine--docker-compose",level:3},{value:"Add Docker's GPG keyrings",id:"add-dockers-gpg-keyrings",level:4},{value:"Add the repository to Apt sources",id:"add-the-repository-to-apt-sources",level:4},{value:"Update Ubuntu",id:"update-ubuntu",level:4},{value:"Install Docker Engine",id:"install-docker-engine",level:4},{value:"Test Docker",id:"test-docker",level:4},{value:"Clone lodestar-quickstart repository",id:"clone-lodestar-quickstart-repository",level:4},{value:"Configure Lodestar Quick Scripts",id:"configure-lodestar-quick-scripts",level:2},{value:"Navigate to the root directory",id:"navigate-to-the-root-directory",level:3},{value:"Create your own JWT Secret",id:"create-your-own-jwt-secret",level:3},{value:"Input your JWT Secret into the import-args.sh script",id:"input-your-jwt-secret-into-the-import-argssh-script",level:3},{value:"Configure feeRecipient",id:"configure-feerecipient",level:3},{value:"Set minimum bid for MEV-Boost validators",id:"set-minimum-bid-for-mev-boost-validators",level:3},{value:"Configuring your Network",id:"configuring-your-network",level:3},{value:"Select your Network",id:"select-your-network",level:3},{value:"Configure MEV-boost relays",id:"configure-mev-boost-relays",level:3},{value:"Configure Lodestar version",id:"configure-lodestar-version",level:3},{value:"Modify your weak subjectivity (checkpoint sync) provider",id:"modify-your-weak-subjectivity-checkpoint-sync-provider",level:3},{value:"Modify other client parameters (For advanced users)",id:"modify-other-client-parameters-for-advanced-users",level:2},{value:"Setup Validators",id:"setup-validators",level:2},{value:"Create validator keystore password",id:"create-validator-keystore-password",level:3},{value:"Option 1: Setup validators with keystores",id:"option-1-setup-validators-with-keystores",level:3},{value:"Copy/Move keystores to lodestar-quickstart/keystores directory",id:"copymove-keystores-to-lodestar-quickstartkeystores-directory",level:4},{value:"Option 2: Setup multiple validator sets with keystores encrypted under different passwords",id:"option-2-setup-multiple-validator-sets-with-keystores-encrypted-under-different-passwords",level:3},{value:"Create validator keystore set directory",id:"create-validator-keystore-set-directory",level:4},{value:"Create validator keystore password",id:"create-validator-keystore-password-1",level:4},{value:"Copy/Move keystores to lodestar-quickstart/validatorset1/keystores directory",id:"copymove-keystores-to-lodestar-quickstartvalidatorset1keystores-directory",level:4},{value:"Option 3: Setup validators with mnemonic",id:"option-3-setup-validators-with-mnemonic",level:3},{value:"Setup Mnemonic",id:"setup-mnemonic",level:4},{value:"Startup Quickstart Script",id:"startup-quickstart-script",level:2},{value:"Quickstart Script Help",id:"quickstart-script-help",level:2},{value:"Check Containers",id:"check-containers",level:3},{value:"Check Container Logs",id:"check-container-logs",level:3},{value:"Check beacon node is progressing",id:"check-beacon-node-is-progressing",level:3},{value:"Check validators are detected and decrypted",id:"check-validators-are-detected-and-decrypted",level:3},{value:"Stop Containers",id:"stop-containers",level:2},{value:"Appendix A - Expanding the Logical Volume",id:"appendix-a---expanding-the-logical-volume",level:2},{value:"Appendix B - Update client images",id:"appendix-b---update-client-images",level:2},{value:"Full Disclaimer",id:"full-disclaimer",level:2}];function l(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"quick-start-custom-setup-guide",children:"Quick Start Custom Setup Guide"}),"\n",(0,i.jsxs)(n.p,{children:["This is a step-by-step guide to utilize ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"@ChainSafe/lodestar-quickstart"})," to setup a Ubuntu-based full Ethereum node using a local execution client and ChainSafe's Lodestar consensus client via Docker (the recommended method to use Lodestar for production environments). This is an adaptation of ",(0,i.jsx)(n.a,{href:"https://someresat.medium.com/",children:"Somer Esat's guides"})," for the Ethereum staking community."]}),"\n",(0,i.jsxs)(n.p,{children:["This guide will provide instructions which include running a local execution node. This guide uses Lodestar's ",(0,i.jsx)(n.code,{children:"stable"})," release branch and supports ",(0,i.jsx)(n.strong,{children:"Holesky"})," testnet setups and ",(0,i.jsx)(n.strong,{children:"Mainnet"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.p,{children:"This guide specifically focuses on using Lodestar's Quickstart scripts which allows for near instant setup with the following technologies:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://releases.ubuntu.com/22.04/",children:"Ubuntu v22.04 (LTS) x64 server"})}),"\n",(0,i.jsxs)(n.li,{children:["Ethereum Execution (eth1) clients:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/ledgerwatch/erigon/releases",children:"Erigon"})," | ",(0,i.jsx)(n.a,{href:"https://github.com/ledgerwatch/erigon",children:"Github"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://geth.ethereum.org/",children:"Go-Ethereum (Geth)"})," | ",(0,i.jsx)(n.a,{href:"https://github.com/ethereum/go-ethereum/releases/",children:"Github"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.hyperledger.org/",children:"Hyperledger Besu"})," | ",(0,i.jsx)(n.a,{href:"https://github.com/hyperledger/besu",children:"Github"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://nethermind.io/",children:"Nethermind"})," | ",(0,i.jsx)(n.a,{href:"https://github.com/NethermindEth/nethermind",children:"Github"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://reth.rs",children:"Rust"})," | ",(0,i.jsx)(n.a,{href:"https://github.com/paradigmxyz/reth",children:"Github"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://lodestar.chainsafe.io/",children:"ChainSafe's Lodestar Ethereum Consensus Client"})," | ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar",children:"Github"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/",children:"Docker Engine"})}),"\n"]})]}),"\n",(0,i.jsx)(n.admonition,{type:"danger",children:(0,i.jsxs)(n.p,{children:["This guide ",(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.em,{children:"does not"})})," assist with securing your server such as secure SSH logins or enabling firewalls. Ensure you have limited access to your server and blocked unused ports with guides such as ",(0,i.jsx)(n.a,{href:"https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet/part-i-installation/guide-or-security-best-practices-for-a-eth2-validator-beaconchain-node",children:"CoinCashew's Security Best Practices for your ETH staking validator node"})," before continuing with this guide."]})}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"This guide is for informational purposes only and does not constitute professional advice. The author does not guarantee accuracy of the information in this article and the author is not responsible for any damages or losses incurred by following this article. A full disclaimer can be found at the bottom of this page \u2014 please read before continuing."})}),"\n",(0,i.jsx)(n.h2,{id:"support",children:"Support"}),"\n",(0,i.jsx)(n.p,{children:"For technical support please reach out to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The Lodestar team actively develops and collaborates on the ",(0,i.jsx)(n.a,{href:"https://discord.gg/642wB3XC3Q",children:"ChainSafe Discord Server"})," under ",(0,i.jsx)(n.strong,{children:(0,i.jsxs)(n.em,{children:["#","\ud83c\udf1f","-lodestar-general"]})})," channel."]}),"\n",(0,i.jsxs)(n.li,{children:["Please subscribe to our Discord server announcements on the ",(0,i.jsx)(n.a,{href:"https://discord.gg/642wB3XC3Q",children:"ChainSafe Discord Server"})," under ",(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.em,{children:"#lodestar-announcements"})})," channel."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"This guide assumes knowledge of Ethereum (ETH), Docker, staking and Linux."}),"\n",(0,i.jsx)(n.p,{children:"You require the following before getting started:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://releases.ubuntu.com/22.04/",children:"Ubuntu Server v22.04 (LTS) amd64"})," or newer, installed and running on a local machine or in the cloud. ",(0,i.jsx)(n.em,{children:"A locally running machine is encouraged for greater decentralization \u2014 if the cloud provider goes down then all nodes hosted with that provider go down."})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["32 ETH to run a solo validator with Lodestar. If running on testnet, contact us in our ",(0,i.jsx)(n.a,{href:"https://discord.gg/642wB3XC3Q",children:"ChainSafe Discord Server"})," for testnet Ether."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"testnet-to-mainnet",children:"Testnet to Mainnet"}),"\n",(0,i.jsx)(n.p,{children:"If moving from a testnet setup to a mainnet setup it is strongly recommended that you start on a fresh (newly installed) server instance. This guide has not been tested for migration scenarios and does not guarantee success if you are using an existing instance with previously installed testnet software."}),"\n",(0,i.jsx)(n.h2,{id:"hardware-requirements",children:"Hardware Requirements"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{}),(0,i.jsx)(n.th,{children:"Minimum"}),(0,i.jsx)(n.th,{children:"Recommended"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Processor"}),(0,i.jsx)(n.td,{children:"Intel Core i3\u20139100 or AMD Ryzen 5 3450"}),(0,i.jsx)(n.td,{children:"Intel Core i7\u20139700 or AMD Ryzen 7 4700"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Memory"}),(0,i.jsx)(n.td,{children:"8 GB RAM"}),(0,i.jsx)(n.td,{children:"16 GB RAM"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Storage"}),(0,i.jsx)(n.td,{children:"130 GB available space SSD"}),(0,i.jsx)(n.td,{children:"200 GB available space SSD"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Internet"}),(0,i.jsx)(n.td,{children:"Reliable broadband with 10mbps upload"}),(0,i.jsx)(n.td,{children:"Reliable broadband with >10mbps upload"})]})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Check your available disk space. Even you have a large SSD there are cases where Ubuntu is reporting only 100GB free. If this applies to you then take a look at ",(0,i.jsx)(n.a,{href:"#appendix-a---expanding-the-logical-volume",children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.em,{children:"Appendix A \u2014 Expanding the Logical Volume."})})})]})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"setup-machine--repository",children:"Setup Machine & Repository"}),"\n",(0,i.jsx)(n.h3,{id:"install-docker-engine--docker-compose",children:"Install Docker Engine & Docker Compose"}),"\n",(0,i.jsx)(n.p,{children:"We must install Docker Engine to run the images on your local machine."}),"\n",(0,i.jsx)(n.h4,{id:"add-dockers-gpg-keyrings",children:"Add Docker's GPG keyrings"}),"\n",(0,i.jsx)(n.p,{children:"Run each line one at a time."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash=",children:"sudo apt-get update\nsudo apt-get install ca-certificates curl gnupg\nsudo install -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\nsudo chmod a+r /etc/apt/keyrings/docker.gpg\n"})}),"\n",(0,i.jsx)(n.h4,{id:"add-the-repository-to-apt-sources",children:"Add the repository to Apt sources"}),"\n",(0,i.jsx)(n.p,{children:"Copy and paste the entire command below."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'echo \\\n "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\\n $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \\\n sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n'})}),"\n",(0,i.jsx)(n.h4,{id:"update-ubuntu",children:"Update Ubuntu"}),"\n",(0,i.jsx)(n.p,{children:"Ensure all updates to your Ubuntu Server are complete."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash=",children:"sudo apt-get update\nsudo apt-get upgrade -y\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Hit ",(0,i.jsx)(n.code,{children:"Enter"})," if required to restart services."]}),"\n",(0,i.jsx)(n.h4,{id:"install-docker-engine",children:"Install Docker Engine"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n"})}),"\n",(0,i.jsx)(n.h4,{id:"test-docker",children:"Test Docker"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo docker run hello-world\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you see the message ",(0,i.jsx)(n.code,{children:"Hello from Docker! This message shows that your installation appears to be working correctly."}),", you can move on to the next step."]}),"\n",(0,i.jsx)(n.h4,{id:"clone-lodestar-quickstart-repository",children:"Clone lodestar-quickstart repository"}),"\n",(0,i.jsxs)(n.p,{children:["Clone the ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar-quickstart",children:"lodestar-quickstart"})," from Github into your local server."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~ && git clone https://github.com/ChainSafe/lodestar-quickstart.git\n"})}),"\n",(0,i.jsx)(n.h2,{id:"configure-lodestar-quick-scripts",children:"Configure Lodestar Quick Scripts"}),"\n",(0,i.jsx)(n.h3,{id:"navigate-to-the-root-directory",children:"Navigate to the root directory"}),"\n",(0,i.jsxs)(n.p,{children:["The script and required files are located within the ",(0,i.jsx)(n.code,{children:"lodestar-quickstart"})," folder."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cd lodestar-quickstart\n"})}),"\n",(0,i.jsx)(n.h3,{id:"create-your-own-jwt-secret",children:"Create your own JWT Secret"}),"\n",(0,i.jsxs)(n.p,{children:["We will generate a JWT secret that is shared by the Execution client and Lodestar in order to have a required secure connection for the ",(0,i.jsx)(n.code,{children:"Engine API"})," on port ",(0,i.jsx)(n.code,{children:"8551"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'openssl rand -hex 32 | tr -d "\\n" > "jwtsecret"\n'})}),"\n",(0,i.jsx)(n.p,{children:"Confirm that your JWT token created."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cat jwtsecret ; echo\n"})}),"\n",(0,i.jsx)(n.p,{children:"Your terminal should display the secret. Copy the token for the next step. Be careful to only copy the 64 characters corresponding to the secret and nothing else."}),"\n",(0,i.jsx)(n.admonition,{type:"danger",children:(0,i.jsxs)(n.p,{children:["\ud83d\udea8"," ",(0,i.jsx)(n.strong,{children:"WARNING:"})," Do not share this secret as it protects your authenticated port 8551."]})}),"\n",(0,i.jsxs)(n.h3,{id:"input-your-jwt-secret-into-the-import-argssh-script",children:["Input your JWT Secret into the ",(0,i.jsx)(n.code,{children:"import-args.sh"})," script"]}),"\n",(0,i.jsxs)(n.p,{children:["Edit the ",(0,i.jsx)(n.code,{children:"import-args.sh"})," file."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"nano import-args.sh\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Replace the 64 characters after ",(0,i.jsx)(n.code,{children:"0x"})," with your token."]}),"\n",(0,i.jsxs)(n.p,{children:["If you are not running validators, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit. Proceed to Configuring your Network."]}),"\n",(0,i.jsx)(n.h3,{id:"configure-feerecipient",children:"Configure feeRecipient"}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["If you are running validators, Ethereum requires validators to set a ",(0,i.jsx)(n.strong,{children:"Fee Recipient"})," which allows you to receive priority fees and MEV rewards when proposing blocks. If you do not set this address, your rewards will be sent to the ",(0,i.jsx)(n.a,{href:"https://etherscan.io/address/0x0000000000000000000000000000000000000000",children:"burn address by default"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["Configure your validator client's feeRecipient address by changing the ",(0,i.jsx)(n.code,{children:"FEE_RECIPIENT"})," line. Ensure you specify an Ethereum address you control."]}),"\n",(0,i.jsxs)(n.p,{children:["An example of a fee recipient set with the address ",(0,i.jsx)(n.code,{children:"0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"}),", you would change the configuration to:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'FEE_RECIPIENT="0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you would like to run ",(0,i.jsx)(n.a,{href:"https://boost.flashbots.net",children:"MEV-Boost"})," with your validators, proceed to the next section."]}),"\n",(0,i.jsxs)(n.p,{children:["If you do not want to run MEV-Boost, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit. Proceed to ",(0,i.jsx)(n.a,{href:"#configuring-your-network",children:"Configuring your Network"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"set-minimum-bid-for-mev-boost-validators",children:"Set minimum bid for MEV-Boost validators"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"(Optional): If you are running validators and would like to use MEV-Boost, follow this section. Otherwise, skip this section."})}),"\n",(0,i.jsx)(n.p,{children:"Validators running MEV-Boost maximize their staking reward by selling blockspace to an open market of builders. MEV-Boost v1.4+ allows you to set a minimum bid threshold to only use an externally built block if it meets or exceeds this parameter."}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"min-bid"})," parameter is denominated in ETH. For example, if you want to set your threshold to 0.03 ETH, set your configuration to ",(0,i.jsx)(n.code,{children:"MIN_BUILDERBID=0.03"})]}),"\n",(0,i.jsxs)(n.p,{children:["When complete, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit."]}),"\n",(0,i.jsx)(n.h3,{id:"configuring-your-network",children:"Configuring your Network"}),"\n",(0,i.jsxs)(n.p,{children:["When using the quick scripts, each supported network has a ",(0,i.jsx)(n.code,{children:".vars"})," file to define the parameters required for configuring the clients to the specified network."]}),"\n",(0,i.jsx)(n.p,{children:"To view the available files, use the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"ls *.vars\n"})}),"\n",(0,i.jsx)(n.h3,{id:"select-your-network",children:"Select your Network"}),"\n",(0,i.jsxs)(n.p,{children:["Each network has specifics variables that you may want to setup for use. We will use ",(0,i.jsx)(n.code,{children:"Holesky"})," to demonstrate connecting to a public testnet."]}),"\n",(0,i.jsxs)(n.p,{children:["Open the ",(0,i.jsx)(n.code,{children:"holesky.vars"})," file."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"nano holesky.vars\n"})}),"\n",(0,i.jsx)(n.h3,{id:"configure-mev-boost-relays",children:"Configure MEV-boost relays"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"(Optional): If you have validators you intend to use for MEV-boost, you can input the relays you want to connect here. Otherwise, skip this section."})}),"\n",(0,i.jsx)(n.p,{children:"You can list multiple relays simply by pasting the relay URL as a variable in this file."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell=",children:"RELAY_A=https://0xRelayPubKey@relay.com\nRELAY_B=https://0xRelayPubKey@relay2.com\n"})}),"\n",(0,i.jsx)(n.p,{children:"Make sure to identify the ones you want to use by editing the line:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell=",children:'RELAYS="$RELAY_A,$RELAY_B"\n'})}),"\n",(0,i.jsx)(n.h3,{id:"configure-lodestar-version",children:"Configure Lodestar version"}),"\n",(0,i.jsxs)(n.p,{children:["The lodestar-quickstart scripts currently defaults to using our ",(0,i.jsx)(n.code,{children:"stable"})," release branch. To use our nightly ",(0,i.jsx)(n.code,{children:"unstable"})," release instead, replace ",(0,i.jsx)(n.code,{children:"LODESTAR_IMAGE=chainsafe/lodestar:latest"})," with ",(0,i.jsx)(n.code,{children:"LODESTAR_IMAGE=chainsafe/lodestar:next"})," in the ",(0,i.jsx)(n.code,{children:"import-images.sh"})," file."]}),"\n",(0,i.jsxs)(n.p,{children:["You may also choose to use a specific version release of Lodestar. To select a specific version, replace the image with ",(0,i.jsx)(n.code,{children:"LODESTAR_IMAGE=chainsafe/lodestar:v1.x.x"})]}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["\u26a0\ufe0f"," We do not recommend using the ",(0,i.jsx)(n.code,{children:"unstable"})," branch or ",(0,i.jsx)(n.code,{children:"@chainsafe/lodestar:next"})," docker versions of Lodestar for production related tasks."]})}),"\n",(0,i.jsx)(n.h3,{id:"modify-your-weak-subjectivity-checkpoint-sync-provider",children:"Modify your weak subjectivity (checkpoint sync) provider"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"(Optional): We use ChainSafe's Lodestar checkpoints by default. You may choose to point your trusted checkpoint at another source or verify the checkpoints with other providers. If you would rather sync from genesis (not recommended), you can skip this step."})}),"\n",(0,i.jsx)(n.p,{children:"Weak subjectivity (checkpoint sync) allows your beacon node to sync within minutes by utilizing a trusted checkpoint from a trusted provider."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"We highly recommend using this feature"})," so you do not need to wait days to sync from genesis and will mitigate your susceptibility to ",(0,i.jsx)(n.a,{href:"https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/",children:"long-range attacks"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Minimize your risk of syncing a malicious chain from a malicious checkpoint by verifying the trusted checkpoint from multiple sources."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["View the community maintained list of ",(0,i.jsx)(n.a,{href:"https://eth-clients.github.io/checkpoint-sync-endpoints/",children:"Beacon Chain checkpoint sync endpoints"})]}),"\n",(0,i.jsx)(n.li,{children:"Verify multiple endpoint links and ensure the latest finalized and latest justified block roots are the same"}),"\n",(0,i.jsx)(n.li,{children:"Choose one of those endpoint URLs"}),"\n",(0,i.jsxs)(n.li,{children:["Replace the ",(0,i.jsx)(n.code,{children:"--checkpointSyncUrl"})," address with your chosen provider."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"NOTE"}),": Ensure you use checkpoint URLs from the list above corresponding to the network you are trying to sync or you ",(0,i.jsx)(n.strong,{children:"will"})," receive errors."]})}),"\n",(0,i.jsxs)(n.p,{children:["When complete, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit."]}),"\n",(0,i.jsx)(n.h2,{id:"modify-other-client-parameters-for-advanced-users",children:"Modify other client parameters (For advanced users)"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"(Optional): We have already set fixed parameters for a seamless setup. If you are looking to customize the default parameters of the clients you are using, follow this section. Otherwise, skip this section."})}),"\n",(0,i.jsxs)(n.p,{children:["Fixed parameters for clients can be modified under the ",(0,i.jsx)(n.code,{children:"fixed.vars"})," configuration file."]}),"\n",(0,i.jsx)(n.p,{children:"Under the selected client, modify or add the custom arguments on their corresponding line."}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsx)(n.p,{children:"The following are links to client documentation for CLI commands:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://chainsafe.github.io/lodestar/reference/cli/",children:(0,i.jsx)(n.strong,{children:"Lodestar CLI Commands"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://docs.nethermind.io/fundamentals/configuration#command-line-options",children:(0,i.jsx)(n.strong,{children:"Nethermind CLI Commands"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://besu.hyperledger.org/en/stable/Reference/CLI/CLI-Syntax/",children:(0,i.jsx)(n.strong,{children:"Besu CLI Commands"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://geth.ethereum.org/docs/interface/command-line-options",children:(0,i.jsx)(n.strong,{children:"Go Ethereum CLI commands"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://github.com/ledgerwatch/erigon#beacon-chain",children:(0,i.jsx)(n.strong,{children:"Erigon CLI commands"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://reth.rs/cli/reth.html",children:(0,i.jsx)(n.strong,{children:"Reth CLI commands"})})}),"\n"]})]}),"\n",(0,i.jsxs)(n.p,{children:["Once complete, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"setup-validators",children:"Setup Validators"}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"Optional: Skip this entire section if you do not intend to run validators."})}),"\n",(0,i.jsx)(n.h3,{id:"create-validator-keystore-password",children:"Create validator keystore password"}),"\n",(0,i.jsxs)(n.p,{children:["Make sure you are in your main quickstart directory. Create the ",(0,i.jsx)(n.code,{children:"pass.txt"})," file containing your validator's decryption password for use."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cd ~/lodestar-quickstart\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"nano pass.txt\n"})}),"\n",(0,i.jsx)(n.p,{children:"Enter the password for your validators."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"Once the validator container is running, you can delete this file from your server. Note that every time you restart this container, you will need this password to decrypt your keystore.json files."})}),"\n",(0,i.jsxs)(n.p,{children:["Once complete, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit."]}),"\n",(0,i.jsx)(n.h3,{id:"option-1-setup-validators-with-keystores",children:"Option 1: Setup validators with keystores"}),"\n",(0,i.jsxs)(n.p,{children:["If you want to setup validators with your ",(0,i.jsx)(n.code,{children:"keystores.json"})," files follow this section. Otherwise, skip this step."]}),"\n",(0,i.jsxs)(n.h4,{id:"copymove-keystores-to-lodestar-quickstartkeystores-directory",children:["Copy/Move keystores to ",(0,i.jsx)(n.code,{children:"lodestar-quickstart/keystores"})," directory"]}),"\n",(0,i.jsxs)(n.p,{children:["Your ",(0,i.jsx)(n.code,{children:"keystore.json"})," file(s) generated from the ",(0,i.jsx)(n.a,{href:"https://github.com/ethereum/staking-deposit-cli",children:(0,i.jsx)(n.code,{children:"staking-deposit-cli"})})," or similar generator for validator keys will be placed in the ",(0,i.jsx)(n.code,{children:"lodestar-quickstart/keystores"})," directory using the ",(0,i.jsx)(n.code,{children:"cp"})," command to copy or ",(0,i.jsx)(n.code,{children:"mv"})," command to move the files."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"mkdir keystores\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"You may choose to use your own method (e.g. SFTP) for copying/uploading keys to your server. This is only a guide."})}),"\n",(0,i.jsx)(n.p,{children:"The format of the command to use is below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cp \n"})}),"\n",(0,i.jsx)(n.p,{children:"An example usage of this command is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cp /home/user/validator_keys/keystore-x.json ~/lodestar-quickstart/keystores\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Ensure your ",(0,i.jsx)(n.code,{children:"keystore.json"})," files are in the ",(0,i.jsx)(n.code,{children:"lodestar-quickstart/keystores"})," directory using ",(0,i.jsx)(n.code,{children:"ls"})," command."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"ls -lsah ~/lodestar-quickstart/keystores/\n"})}),"\n",(0,i.jsx)(n.p,{children:"You should see the keystore files within the directory."}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["Ensure the ",(0,i.jsx)(n.code,{children:"/keystores"})," directory only has the ",(0,i.jsx)(n.code,{children:"keystore-m_xxxxx.json"})," files and nothing else. If you copied in the ",(0,i.jsx)(n.code,{children:"deposit_data-xxxxx.json"})," files, you can remove them by using the ",(0,i.jsx)(n.code,{children:"sudo rm "})," command."]}),(0,i.jsx)(n.p,{children:"Example:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo rm deposit_data-1552658472.json\n"})})]}),"\n",(0,i.jsxs)(n.p,{children:["Continue to the ",(0,i.jsx)(n.a,{href:"#startup-quickstart-script",children:(0,i.jsx)(n.strong,{children:"Startup Quickstart Script"})})," section."]}),"\n",(0,i.jsx)(n.h3,{id:"option-2-setup-multiple-validator-sets-with-keystores-encrypted-under-different-passwords",children:"Option 2: Setup multiple validator sets with keystores encrypted under different passwords"}),"\n",(0,i.jsxs)(n.p,{children:["Optional: If you want to setup validators with your ",(0,i.jsx)(n.code,{children:"keystores.json"})," files but they are not encrypted with the same password, follow this section. Otherwise, skip this step."]}),"\n",(0,i.jsxs)(n.p,{children:["This option will allow you to run multiple validator clients corresponding to each validator keystore set encrypted with the same password. Therefore, we will setup ",(0,i.jsx)(n.code,{children:"validatorset1"})," with one decryption password and ",(0,i.jsx)(n.code,{children:"validatorset2"})," with another decryption password. You can repeat these steps to create subsequent validator sets with different keystore decryption passwords."]}),"\n",(0,i.jsx)(n.h4,{id:"create-validator-keystore-set-directory",children:"Create validator keystore set directory"}),"\n",(0,i.jsxs)(n.p,{children:["Ensure you are in the ",(0,i.jsx)(n.code,{children:"lodestar-quickstart"})," directory and create a folder for your first validator keystore set."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cd ~/lodestar-quickstart\n"})}),"\n",(0,i.jsx)(n.p,{children:"Make the new directory for set one."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"mkdir validatorset1\n"})}),"\n",(0,i.jsx)(n.p,{children:"Navigate into the directory."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cd validatorset1\n"})}),"\n",(0,i.jsx)(n.h4,{id:"create-validator-keystore-password-1",children:"Create validator keystore password"}),"\n",(0,i.jsxs)(n.p,{children:["Create the ",(0,i.jsx)(n.code,{children:"pass.txt"})," file containing your validator's decryption password for use."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"nano pass.txt\n"})}),"\n",(0,i.jsx)(n.p,{children:"Enter the password for your validators."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"Once the validator container is running, you can delete this file from your server. Note that every time you restart this container, you will need this password to decrypt your keystore.json files."})}),"\n",(0,i.jsxs)(n.p,{children:["Once complete, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit."]}),"\n",(0,i.jsxs)(n.h4,{id:"copymove-keystores-to-lodestar-quickstartvalidatorset1keystores-directory",children:["Copy/Move keystores to ",(0,i.jsx)(n.code,{children:"lodestar-quickstart/validatorset1/keystores"})," directory"]}),"\n",(0,i.jsxs)(n.p,{children:["Your ",(0,i.jsx)(n.code,{children:"keystore.json"})," file(s) generated from the ",(0,i.jsx)(n.a,{href:"https://github.com/ethereum/staking-deposit-cli",children:(0,i.jsx)(n.code,{children:"staking-deposit-cli"})})," or similar generator for validator keys will be placed in the ",(0,i.jsx)(n.code,{children:"lodestar-quickstart/validatorset1/keystores"})," directory using the ",(0,i.jsx)(n.code,{children:"sudo cp"})," command to copy or ",(0,i.jsx)(n.code,{children:"sudo mv"})," command to move the files."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"mkdir keystores\n"})}),"\n",(0,i.jsx)(n.p,{children:"The format of the command to use is below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cp \n"})}),"\n",(0,i.jsx)(n.p,{children:"An example usage of this command is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cp /home/user/validator_keys/keystore-x.json ~/lodestar-quickstart/validatorset1/keystores\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Ensure your ",(0,i.jsx)(n.code,{children:"keystore.json"})," files are in the ",(0,i.jsx)(n.code,{children:"lodestar-quickstart/validatorset1/keystores"})," directory using ",(0,i.jsx)(n.code,{children:"ls"})," command."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"ls -lsah ~/lodestar-quickstart/validatorset1/keystores/\n"})}),"\n",(0,i.jsx)(n.p,{children:"You should see the keystore files within the directory."}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsxs)(n.p,{children:["Ensure the ",(0,i.jsx)(n.code,{children:"/keystores"})," directory only has the ",(0,i.jsx)(n.code,{children:"keystore-m_xxxxx.json"})," files and nothing else. If you copied in the ",(0,i.jsx)(n.code,{children:"deposit_data-xxxxx.json"})," files, you can remove them by using the ",(0,i.jsx)(n.code,{children:"sudo rm "})," command."]}),(0,i.jsx)(n.p,{children:"Example:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo rm deposit_data-1552658472.json\n"})})]}),"\n",(0,i.jsxs)(n.p,{children:["Repeat the same steps above for ",(0,i.jsx)(n.code,{children:"validatorset2"})," and any subsequent sets of validators you require. When complete you should have a similar looking directory tree such as the one below:"]}),"\n",(0,i.jsxs)(n.p,{children:["Then, continue to the ",(0,i.jsx)(n.a,{href:"#startup-quickstart-script",children:(0,i.jsx)(n.strong,{children:"Startup Quickstart Script"})})," section. Pay particular attention to startup script example five (5) and (6)."]}),"\n",(0,i.jsx)(n.h3,{id:"option-3-setup-validators-with-mnemonic",children:"Option 3: Setup validators with mnemonic"}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"TESTNET USE ONLY:"})," Do not use this method unless you're validating on a testnet. Your mnemonic will be stored in plaintext on your server, which is unsafe."]})}),"\n",(0,i.jsx)(n.p,{children:"Optional: If you want to setup validators with your mnemonic. Otherwise, skip this step."}),"\n",(0,i.jsx)(n.h4,{id:"setup-mnemonic",children:"Setup Mnemonic"}),"\n",(0,i.jsxs)(n.p,{children:["Select the ",(0,i.jsx)(n.code,{children:".vars"})," file corresponding to the network you want to run. For Holesky, select ",(0,i.jsx)(n.code,{children:"holesky.vars"}),". Open the file with the ",(0,i.jsx)(n.code,{children:"nano"})," text editor and edit the configuration:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"nano holesky.vars\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We will modify the ",(0,i.jsx)(n.code,{children:"LODESTAR_VALIDATOR_MNEMONIC_ARGS="}),". Specifically, the mnemonic located after the ",(0,i.jsx)(n.code,{children:"--fromMnemonic"})," flag."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Replace the default mnemonic with your mnemonic. Ensure it is between the quotations"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Indicate which indexes of the mnemonic you wish Lodestar to run. Specify a specific index number ",(0,i.jsx)(n.code,{children:"--mnemonicIndexes 0"})," or a range of numbers ",(0,i.jsx)(n.code,{children:"--mnemonicIndexes 0..5"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.admonition,{type:"info",children:[(0,i.jsx)(n.p,{children:"If you created your mnemonic with one key, it is likely located in index 0. If you've added to it, the generated keys are likely the subsequent indexes."}),(0,i.jsxs)(n.p,{children:["Therefore, if you generated one key, it is likely in index 0, so you would use ",(0,i.jsx)(n.code,{children:"--mnemonicIndexes 0"}),". If you generated five keys, it is likely in index 0 to 4, so you would use ",(0,i.jsx)(n.code,{children:"--mnemonicIndexes 0..4"})]})]}),"\n",(0,i.jsxs)(n.p,{children:["Once complete, press ",(0,i.jsx)(n.code,{children:"CTRL"})," + ",(0,i.jsx)(n.code,{children:"x"})," then ",(0,i.jsx)(n.code,{children:"y"})," then ",(0,i.jsx)(n.code,{children:"Enter"})," to save and exit."]}),"\n",(0,i.jsxs)(n.p,{children:["Continue to the ",(0,i.jsx)(n.a,{href:"#startup-quickstart-script",children:(0,i.jsx)(n.strong,{children:"Startup Quickstart Script"})})," section."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"startup-quickstart-script",children:"Startup Quickstart Script"}),"\n",(0,i.jsx)(n.p,{children:"Ensure you are in the `~/lodestar-quickstart folder."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cd ~/lodestar-quickstart\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The following are ",(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.em,{children:"example commands"})})," as a template for initiating the quickstart script:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Startup a Sepolia beacon node with no validators and Go Ethereum (Geth) execution client with terminals attached:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'./setup.sh --dataDir sepolia-data --elClient geth --network sepolia --dockerWithSudo --withTerminal "gnome-terminal --disable-factory --"\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Startup Mainnet beacon node with no validators and Nethermind execution client detached from containers (Recommended only when you've verified the setup has initiated properly with terminals attached):"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"./setup.sh --dataDir mainnet-data --elClient nethermind --network mainnet --dockerWithSudo --detached\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Startup Holesky beacon node with validator client (using mnemonic in /keystores) and Erigon execution client detached from containers:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"./setup.sh --dataDir holesky-data --elClient erigon --network holesky --dockerWithSudo --detached --withValidatorMnemonic ~/lodestar-quickstart/\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Startup Mainnet beacon node with validator client (using keystores) with MEV-Boost and Hyperledger Besu execution client detached from containers:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"./setup.sh --dataDir mainnet-data --elClient besu --network mainnet --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/ --withMevBoost\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Startup Holesky beacon node with validator client set one (using keystores) and execution client Geth detached from containers:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"./setup.sh --dataDir holesky-data --elClient geth --network holesky --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/validatorset1\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"You can only start up one set of validator keystores per validator client on the same command. Use the below command (#6) to startup another validator client for another set of validator keys."})}),"\n",(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:"Startup validator client only with validator client set two (using keystores) and execution client Geth detached from containers:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"./setup.sh --dataDir holesky-data --elClient geth --network holesky --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/validatorset2 --justVC\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["The script will standardize naming your containers so running the ",(0,i.jsx)(n.code,{children:"setup.sh"})," twice, will not create two instances of the same containers. The script will standardize naming your containers so running the ",(0,i.jsx)(n.code,{children:"./setup.sh "})," a second time, will not create two instances of the same containers."]})}),"\n",(0,i.jsx)(n.p,{children:"Configure the above commands with what you intend to run using the Quickstart Script Help table below."}),"\n",(0,i.jsx)(n.h2,{id:"quickstart-script-help",children:"Quickstart Script Help"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Command"}),(0,i.jsx)(n.th,{children:"Required/Optional"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"dataDir"})}),(0,i.jsx)(n.td,{children:"Required"}),(0,i.jsx)(n.td,{children:"File location (volume) of the configuration & data for setup. This directory should be non-existent for the first run. If the directory exists, it will skip fetching the configuration, assuming it has been done previously. You can also clean individual directors of CL/EL between the re-runs."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"elClient"})}),(0,i.jsx)(n.td,{children:"Required"}),(0,i.jsxs)(n.td,{children:["The selected EL client you want to run with Lodestar. Options are ",(0,i.jsx)(n.code,{children:"nethermind"}),", ",(0,i.jsx)(n.code,{children:"besu"}),", ",(0,i.jsx)(n.code,{children:"erigon"})," or ",(0,i.jsx)(n.code,{children:"geth"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"network"})}),(0,i.jsx)(n.td,{children:"Required"}),(0,i.jsxs)(n.td,{children:["The network/chain you want to load, reads the corresponding ",(0,i.jsx)(n.code,{children:".vars"})," (for e.g. ",(0,i.jsx)(n.code,{children:"holesky.vars"}),") network configuration , like images, or urls for EL/CL to interact. Example: Default for Holesky is ",(0,i.jsx)(n.code,{children:"--network holesky"})," using ",(0,i.jsx)(n.code,{children:"holesky.vars"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"dockerWithSudo"})}),(0,i.jsx)(n.td,{children:"Optional"}),(0,i.jsxs)(n.td,{children:["Provide this argument if your Docker needs a ",(0,i.jsx)(n.code,{children:"sudo"})," prefix."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--withTerminal"})}),(0,i.jsx)(n.td,{children:"Optional*"}),(0,i.jsx)(n.td,{children:"Provide the terminal command prefix for CL and EL processes to run in your favourite terminal. You may use an alias or a terminal launching script as long as it waits for the command it runs till ends and then closes. If not provided, it will launch the docker processes in in-terminal mode."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--detached"})}),(0,i.jsx)(n.td,{children:"Optional*"}),(0,i.jsx)(n.td,{children:"By default the script will wait for processes and use user input (ctrl +c) to end the processes, however you can pass this option to skip this behavior and just return, for e.g. in case you just want to leave it running."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--withValidatorKeystore"})}),(0,i.jsx)(n.td,{children:"Optional**"}),(0,i.jsxs)(n.td,{children:["Launch a validator client using ",(0,i.jsx)(n.code,{children:"LODESTAR_VALIDATOR_MNEMONIC_ARGS"})," (",(0,i.jsx)(n.code,{children:"--withValidatorMnemonic"}),") or using a folder (",(0,i.jsx)(n.code,{children:"--withValidatorKeystore --justVC"})," connecting to same beacon node."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--withValidatorMnemonic"})}),(0,i.jsx)(n.td,{children:"Optional**"}),(0,i.jsxs)(n.td,{children:["Launch a validator client using mnemonic method.(",(0,i.jsx)(n.code,{children:"LODESTAR_VALIDATOR_MNEMONIC_ARGS"}),") as set in the network vars file."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--withMevBoost"})}),(0,i.jsx)(n.td,{children:"Optional"}),(0,i.jsxs)(n.td,{children:["Launch a MEV-Boost container to interface with multiple relays picked for the corresponding network vars file. When paired with ",(0,i.jsx)(n.code,{children:"--justCL"})," or ",(0,i.jsx)(n.code,{children:"--justVC"})," this only activates the builder arguments in the beacon/validator and use the builder url set in MEVBOOST_URL variable in fixed.vars"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--justEL"})}),(0,i.jsx)(n.td,{children:"Optional"}),(0,i.jsx)(n.td,{children:"Launch only the Execution Layer client."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--justCL"})}),(0,i.jsx)(n.td,{children:"Optional"}),(0,i.jsx)(n.td,{children:"Launch only the Lodestar beacon node."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--justVC"})}),(0,i.jsx)(n.td,{children:"Optional"}),(0,i.jsx)(n.td,{children:"Launch only the Lodestar validator."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--skipImagePull"})}),(0,i.jsx)(n.td,{children:"Optional"}),(0,i.jsx)(n.td,{children:"Launch with only the local Docker images. Do not update them on this run."})]})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"*"})," : Only one of the two options should be provided.\n",(0,i.jsx)(n.code,{children:"**"})," : Only one of the two options should be provided."]})}),"\n",(0,i.jsx)(n.h3,{id:"check-containers",children:"Check Containers"}),"\n",(0,i.jsxs)(n.p,{children:["You can check the status and get the name of your containers by using the ",(0,i.jsx)(n.code,{children:"docker ps"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker ps\n"})}),"\n",(0,i.jsx)(n.p,{children:"The containers should not constantly restart. If they restart, likely a misconfiguration occurred."}),"\n",(0,i.jsx)(n.h3,{id:"check-container-logs",children:"Check Container Logs"}),"\n",(0,i.jsx)(n.p,{children:"You can check the status of what your container is logging to diagnose a problem or follow along the status of your container output."}),"\n",(0,i.jsxs)(n.p,{children:["Check the logs by using the ",(0,i.jsx)(n.code,{children:"docker logs"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker logs \n"})}),"\n",(0,i.jsxs)(n.p,{children:["Follow along the logs by adding the ",(0,i.jsx)(n.code,{children:"-f"})," flag:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker logs -f \n"})}),"\n",(0,i.jsxs)(n.p,{children:["Limit the fetched logs by indicating the latest container out puts by number of lines using the ",(0,i.jsx)(n.code,{children:"-n "})," flag. For the last 10 lines:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker logs -n 10 \n"})}),"\n",(0,i.jsx)(n.h3,{id:"check-beacon-node-is-progressing",children:"Check beacon node is progressing"}),"\n",(0,i.jsx)(n.p,{children:"Your beacon node should initialize and you should see something similar to:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Jul-31 13:35:27.967[] info: Lodestar network=mainnet, version=v1.21.0/ff35faa, commit=ff35faae4ad1697b86d708a0367a95a71648ab6e\nJul-31 13:35:28.344[] info: Connected to LevelDB database path=/data/lodestar/chain-db\nJul-31 13:35:49.828[] info: Initializing beacon from a valid db state slot=9633504, epoch=301047, stateRoot=0xfa2845a6877b98555906a1654941c97d9c05bdd41e61cc0870a967dc9030b156, isWithinWeakSubjectivityPeriod=true\nJul-31 13:35:51.955[chain] info: Historical state worker started\nJul-31 13:35:51.969[eth1] info: Eth1 provider urls=http://localhost:8551\nJul-31 13:35:51.975[execution] info: Execution client urls=http://localhost:8551\nJul-31 13:35:51.977[] info: External builder url=http://localhost:8661\nJul-31 13:36:21.128[network] info: running libp2p instance in worker thread\nJul-31 13:36:21.727[network] info: libp2p worker started peer=15Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW\nJul-31 13:36:27.677[network] info: discv5 worker started peerId=16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, initialENR=enr:-IO4QHGTUd1Zg8LAhUAioOz_ySTKoJLIOa6zltSP_AvvhTFVYw6M6YB35IxsiKxQG7nUgCpUB5SIsNxMntCNlTK9sMEBgmlkgnY0iXNlY3AyNTZrMaEC24cdmzuGnWqSwF-8Hw2gbkAZDzMWW3LsHJfp_kDhy-GDdGNwgiMog3VkcIIeWH, bindAddr4=/ip4/0.0.0.0/udp/9000\nJul-31 13:36:28.134[network] info: PeerId 16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, Multiaddrs /ip4/0.0.0.0/tcp/9000\nJul-31 13:36:28.137[metrics] info: Started metrics HTTP server address=http://127.0.0.1:8008\nJul-31 13:36:28.256[rest] info: Started REST API server address=http://0.0.0.0:9596\nJul-31 13:36:28.257[] info: Searching peers - peers: 0 - slot: 9634080 - head: (slot -576) 0x9d88\u2026d02a - exec-block: syncing(20426302 0xcec4\u2026) - finalized: 0x7feb\u2026c130:301045\nJul-31 13:36:36.461[execution] info: Execution client is synced oldState=ONLINE, newState=SYNCED\nJul-31 13:36:53.019[] info: Syncing - 3.7 minutes left - 2.32 slots/s - slot: 9634082 - head: (slot -515) 0x792f\u2026f8aa - exec-block: valid(20426365 0x58b1\u2026) - finalized: 0x9d88\u2026d02a:301047 - peers: 11\nJul-31 13:38:53.168[] info: Syncing - 11 seconds left - 4.01 slots/s - slot: 9634092 - head: (slot -44) 0x7491\u2026f63e - exec-block: valid(20426841 0xd4b2\u2026) - finalized: 0x1e00\u20266e6b:301062 - peers: 59\nJul-31 13:38:58.051[network] info: Subscribed gossip core topics\nJul-31 13:38:58.132[sync] info: Subscribed gossip core topics\nJul-31 13:39:05.001[] info: Synced - slot: 9634093 - head: 0x35de\u20261f0e - exec-block: valid(20426886 0x10ff\u2026) - finalized: 0x88f8\u20265375:301063 - peers: 70\nJul-31 13:39:17.000[] info: Synced - slot: 9634094 - head: 0x7844\u20263b3e - exec-block: valid(20426887 0x67d1\u2026) - finalized: 0x88f8\u20265375:301063 - peers: 69\nJul-31 13:39:29.000[] info: Synced - slot: 9634095 - head: 0x5516\u2026ba12 - exec-block: valid(20426888 0x4ceb\u2026) - finalized: 0x88f8\u20265375:301063 - peers: 74\n"})}),"\n",(0,i.jsx)(n.h3,{id:"check-validators-are-detected-and-decrypted",children:"Check validators are detected and decrypted"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"OPTIONAL: If you are running validators, you can check the validator client logs to ensure the validator keys exist, has been detected and decrypted."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example command if you are running validators on Goerli with the lodestar-quickstart script:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker logs goerli-validator\n"})}),"\n",(0,i.jsx)(n.p,{children:"You should see something similar to:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Mar-01 03:06:35.048[] info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264\nMar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky\nMar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m\nMar-01 03:06:35.698[] info: 2 local keystores\nMar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea\nMar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e\nMar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596\nMar-01 03:09:23.813[] info: Genesis fetched from the beacon node\nMar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config\nMar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot\nMar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false\nMar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea\nMar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e\nMar-01 03:09:23.830[] info: Validator statuses active=2, total=2\nMar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1\nMar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["It is normal to see ",(0,i.jsx)(n.code,{children:"Error on getProposerDuties"})," in your validator logs as your beacon node and execution node sync up. Give it time."]})}),"\n",(0,i.jsx)(n.h2,{id:"stop-containers",children:"Stop Containers"}),"\n",(0,i.jsxs)(n.p,{children:["You can stop the running containers by using the ",(0,i.jsx)(n.code,{children:"docker stop"})," command and apply it to more than one container if necessary."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker stop \n"})}),"\n",(0,i.jsx)(n.p,{children:"Ensure to remove the container if you don't plan to restart it with the same parameters."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker rm \n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h1,{id:"appendix",children:"Appendix"}),"\n",(0,i.jsx)(n.h2,{id:"appendix-a---expanding-the-logical-volume",children:"Appendix A - Expanding the Logical Volume"}),"\n",(0,i.jsx)(n.p,{children:"There are cases where Ubuntu is provisioning only 200GB of a larger SSD causing users to run out of disk space when syncing their Eth1 node. The error message is similar to:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"Fatal: Failed to register the Ethereum service: write /var/lib/goethereum/geth/chaindata/383234.ldb: no space left on device"})}),"\n",(0,i.jsx)(n.p,{children:"To address this issue, assuming you have a SSD that is larger than 200GB, expand the space allocation for the LVM by following these steps:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo lvdisplay <-- Check your logical volume size\nsudo lvm\nlvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv\nlvextend -l +100%FREE -r /dev/ubuntu-vg/ubuntu-lv\nexit\nsudo resize2fs /dev/ubuntu-vg/ubuntu-lv\ndf -h <-- Check results\n"})}),"\n",(0,i.jsx)(n.p,{children:"That should resize your disk to the maximum available space."}),"\n",(0,i.jsxs)(n.p,{children:["If you need support, please check with the ",(0,i.jsx)(n.a,{href:"https://discord.gg/642wB3XC3Q",children:"ChainSafe Discord"})," under the #","\ud83c\udf1f","-lodestar-general channel."]}),"\n",(0,i.jsx)(n.h2,{id:"appendix-b---update-client-images",children:"Appendix B - Update client images"}),"\n",(0,i.jsx)(n.p,{children:"To update client images, you just need to stop all the containers, remove them and restart the lodestar-quickstart script to automatically check for new images."}),"\n",(0,i.jsxs)(n.p,{children:["You can stop the running containers by using the ",(0,i.jsx)(n.code,{children:"docker stop"})," command with the container names."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker stop \n"})}),"\n",(0,i.jsxs)(n.p,{children:["Remove the containers by using the ",(0,i.jsx)(n.code,{children:"docker rm"})," command."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo docker rm \n"})}),"\n",(0,i.jsxs)(n.p,{children:["Restart your containers using your ",(0,i.jsx)(n.a,{href:"#startup-quickstart-script",children:"Startup Quickstart Script"})," command."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"full-disclaimer",children:"Full Disclaimer"}),"\n",(0,i.jsx)(n.p,{children:"This article (the guide) is for informational purposes only and does not constitute professional advice. The author does not warrant or guarantee the accuracy, integrity, quality, completeness, currency, or validity of any information in this article. All information herein is provided \u201cas is\u201d without warranty of any kind and is subject to change at any time without notice. The author disclaims all express, implied, and statutory warranties of any kind, including warranties as to accuracy, timeliness, completeness, or fitness of the information in this article for any particular purpose. The author is not responsible for any direct, indirect, incidental, consequential or any other damages arising out of or in connection with the use of this article or in reliance on the information available on this article. This includes any personal injury, business interruption, loss of use, lost data, lost profits, or any other pecuniary loss, whether in an action of contract, negligence, or other misuse, even if the author has been informed of the possibility."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var i=t(6540);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c9cac69.88aca9b4.js b/assets/js/4c9cac69.88aca9b4.js new file mode 100644 index 000000000000..7849099d07ef --- /dev/null +++ b/assets/js/4c9cac69.88aca9b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[2539],{4369:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>t});var d=n(4848),r=n(8453);const l={title:"CLI Reference"},o="validator CLI Command",s={id:"run/validator-management/validator-cli",title:"CLI Reference",description:"Run one or multiple validator clients",source:"@site/pages/run/validator-management/validator-cli.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/validator-cli",permalink:"/lodestar/run/validator-management/validator-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/validator-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Starting a Validator Client",permalink:"/lodestar/run/validator-management/vc-configuration"},next:{title:"External Signer",permalink:"/lodestar/run/validator-management/external-signer"}},c={},t=[{value:"Available Sub-Commands",id:"available-sub-commands",level:2},{value:"Examples",id:"examples",level:2},{value:"Base validator command",id:"base-validator-command",level:3},{value:"validator Options",id:"validator-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--rcConfig",id:"--rcconfig",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--keymanager",id:"--keymanager",level:4},{value:"--keymanager.auth",id:"--keymanagerauth",level:4},{value:"--keymanager.tokenFile",id:"--keymanagertokenfile",level:4},{value:"--keymanager.port",id:"--keymanagerport",level:4},{value:"--keymanager.address",id:"--keymanageraddress",level:4},{value:"--keymanager.cors",id:"--keymanagercors",level:4},{value:"--beaconNodes",id:"--beaconnodes",level:4},{value:"--force",id:"--force",level:4},{value:"--graffiti",id:"--graffiti",level:4},{value:"--proposerSettingsFile",id:"--proposersettingsfile",level:4},{value:"--suggestedFeeRecipient",id:"--suggestedfeerecipient",level:4},{value:"--strictFeeRecipientCheck",id:"--strictfeerecipientcheck",level:4},{value:"--defaultGasLimit",id:"--defaultgaslimit",level:4},{value:"--builder",id:"--builder",level:4},{value:"--builder.selection",id:"--builderselection",level:4},{value:"--builder.boostFactor",id:"--builderboostfactor",level:4},{value:"--useProduceBlockV3",id:"--useproduceblockv3",level:4},{value:"--broadcastValidation",id:"--broadcastvalidation",level:4},{value:"--blindedLocal",id:"--blindedlocal",level:4},{value:"--importKeystores",id:"--importkeystores",level:4},{value:"--importKeystoresPassword",id:"--importkeystorespassword",level:4},{value:"--doppelgangerProtection",id:"--doppelgangerprotection",level:4},{value:"--http.requestWireFormat",id:"--httprequestwireformat",level:4},{value:"--http.responseWireFormat",id:"--httpresponsewireformat",level:4},{value:"--externalSigner.url",id:"--externalsignerurl",level:4},{value:"--externalSigner.pubkeys",id:"--externalsignerpubkeys",level:4},{value:"--externalSigner.fetch",id:"--externalsignerfetch",level:4},{value:"--externalSigner.fetchInterval",id:"--externalsignerfetchinterval",level:4},{value:"--distributed",id:"--distributed",level:4},{value:"--metrics",id:"--metrics",level:4},{value:"--metrics.port",id:"--metricsport",level:4},{value:"--metrics.address",id:"--metricsaddress",level:4},{value:"--monitoring.endpoint",id:"--monitoringendpoint",level:4},{value:"--monitoring.interval",id:"--monitoringinterval",level:4},{value:"validator slashing-protection import",id:"validator-slashing-protection-import",level:2},{value:"validator slashing-protection import Options",id:"validator-slashing-protection-import-options",level:3},{value:"--beaconNodes",id:"--beaconnodes-1",level:4},{value:"--force",id:"--force-1",level:4},{value:"--file",id:"--file",level:4},{value:"validator slashing-protection export",id:"validator-slashing-protection-export",level:2},{value:"validator slashing-protection export Options",id:"validator-slashing-protection-export-options",level:3},{value:"--beaconNodes",id:"--beaconnodes-2",level:4},{value:"--force",id:"--force-2",level:4},{value:"--file",id:"--file-1",level:4},{value:"--pubkeys",id:"--pubkeys",level:4},{value:"validator import",id:"validator-import",level:2},{value:"validator import Examples",id:"validator-import-examples",level:3},{value:"validator import Options",id:"validator-import-options",level:3},{value:"--importKeystores",id:"--importkeystores-1",level:4},{value:"--importKeystoresPassword",id:"--importkeystorespassword-1",level:4},{value:"validator list",id:"validator-list",level:2},{value:"validator list Examples",id:"validator-list-examples",level:3},{value:"validator voluntary-exit",id:"validator-voluntary-exit",level:2},{value:"validator voluntary-exit Examples",id:"validator-voluntary-exit-examples",level:3},{value:"validator voluntary-exit Options",id:"validator-voluntary-exit-options",level:3},{value:"--exitEpoch",id:"--exitepoch",level:4},{value:"--pubkeys",id:"--pubkeys-1",level:4},{value:"--yes",id:"--yes",level:4},{value:"validator bls-to-execution-change",id:"validator-bls-to-execution-change",level:2},{value:"validator bls-to-execution-change Examples",id:"validator-bls-to-execution-change-examples",level:3},{value:"validator bls-to-execution-change Options",id:"validator-bls-to-execution-change-options",level:3},{value:"--publicKey",id:"--publickey",level:4},{value:"--fromBlsPrivkey",id:"--fromblsprivkey",level:4},{value:"--toExecutionAddress",id:"--toexecutionaddress",level:4}];function a(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(i.h1,{id:"validator-cli-command",children:[(0,d.jsx)(i.code,{children:"validator"})," CLI Command"]}),"\n",(0,d.jsx)(i.p,{children:"Run one or multiple validator clients"}),"\n",(0,d.jsx)(i.h2,{id:"available-sub-commands",children:"Available Sub-Commands"}),"\n",(0,d.jsxs)(i.p,{children:["The following sub-commands are available with the ",(0,d.jsx)(i.code,{children:"validator"})," command:"]}),"\n",(0,d.jsxs)(i.ul,{children:["\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-slashing-protection-import",children:"validator slashing-protection import"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-slashing-protection-export",children:"validator slashing-protection export"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-import",children:"validator import"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-list",children:"validator list"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-voluntary-exit",children:"validator voluntary-exit"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-bls-to-execution-change",children:"validator bls-to-execution-change"})}),"\n"]}),"\n"]}),"\n",(0,d.jsx)(i.h2,{id:"examples",children:"Examples"}),"\n",(0,d.jsxs)(i.h3,{id:"base-validator-command",children:["Base ",(0,d.jsx)(i.code,{children:"validator"})," command"]}),"\n",(0,d.jsx)(i.p,{children:"Run one validator client with all the keystores available in the directory .holesky/keystores"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator --network holesky\n"})}),"\n",(0,d.jsxs)(i.h2,{id:"validator-options",children:[(0,d.jsx)(i.code,{children:"validator"})," Options"]}),"\n",(0,d.jsx)(i.h4,{id:"--datadir",children:(0,d.jsx)(i.code,{children:"--dataDir"})}),"\n",(0,d.jsx)(i.p,{children:"Lodestar root data directory"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--network",children:(0,d.jsx)(i.code,{children:"--network"})}),"\n",(0,d.jsx)(i.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"mainnet"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--paramsfile",children:(0,d.jsx)(i.code,{children:"--paramsFile"})}),"\n",(0,d.jsx)(i.p,{children:"Network configuration file"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--rcconfig",children:(0,d.jsx)(i.code,{children:"--rcConfig"})}),"\n",(0,d.jsx)(i.p,{children:"RC file to supplement command line args, accepted formats: .yml, .yaml, .json"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--terminal-total-difficulty-override",children:(0,d.jsx)(i.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,d.jsx)(i.p,{children:"Terminal PoW block TTD override"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--terminal-block-hash-override",children:(0,d.jsx)(i.code,{children:"--terminal-block-hash-override"})}),"\n",(0,d.jsx)(i.p,{children:"Terminal PoW block hash override"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--terminal-block-hash-epoch-override",children:(0,d.jsx)(i.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,d.jsx)(i.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--loglevel",children:(0,d.jsx)(i.code,{children:"--logLevel"})}),"\n",(0,d.jsx)(i.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"info"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--logfile",children:(0,d.jsx)(i.code,{children:"--logFile"})}),"\n",(0,d.jsx)(i.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--logfilelevel",children:(0,d.jsx)(i.code,{children:"--logFileLevel"})}),"\n",(0,d.jsx)(i.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"debug"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--logfiledailyrotate",children:(0,d.jsx)(i.code,{children:"--logFileDailyRotate"})}),"\n",(0,d.jsx)(i.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"5"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanager",children:(0,d.jsx)(i.code,{children:"--keymanager"})}),"\n",(0,d.jsx)(i.p,{children:"Enable key manager API server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagerauth",children:(0,d.jsx)(i.code,{children:"--keymanager.auth"})}),"\n",(0,d.jsx)(i.p,{children:"Enable token bearer authentication for key manager API server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"true"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagertokenfile",children:(0,d.jsx)(i.code,{children:"--keymanager.tokenFile"})}),"\n",(0,d.jsx)(i.p,{children:"Path to file containing bearer token used for key manager API authentication"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagerport",children:(0,d.jsx)(i.code,{children:"--keymanager.port"})}),"\n",(0,d.jsx)(i.p,{children:"Set port for key manager API"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"5062"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanageraddress",children:(0,d.jsx)(i.code,{children:"--keymanager.address"})}),"\n",(0,d.jsx)(i.p,{children:"Set host for key manager API"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagercors",children:(0,d.jsx)(i.code,{children:"--keymanager.cors"})}),"\n",(0,d.jsx)(i.p,{children:"Configures the Access-Control-Allow-Origin CORS header for key manager API"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"*"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--beaconnodes",children:(0,d.jsx)(i.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(i.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--force",children:(0,d.jsx)(i.code,{children:"--force"})}),"\n",(0,d.jsx)(i.p,{children:"Open validators even if there's a lockfile. Use with caution"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--graffiti",children:(0,d.jsx)(i.code,{children:"--graffiti"})}),"\n",(0,d.jsx)(i.p,{children:"Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max)"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--proposersettingsfile",children:(0,d.jsx)(i.code,{children:"--proposerSettingsFile"})}),"\n",(0,d.jsx)(i.p,{children:"A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--suggestedfeerecipient",children:(0,d.jsx)(i.code,{children:"--suggestedFeeRecipient"})}),"\n",(0,d.jsx)(i.p,{children:"Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge."}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"0x0000000000000000000000000000000000000000"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--strictfeerecipientcheck",children:(0,d.jsx)(i.code,{children:"--strictFeeRecipientCheck"})}),"\n",(0,d.jsxs)(i.p,{children:["Enable strict checking of the validator's ",(0,d.jsx)(i.code,{children:"feeRecipient"})," with the one returned by engine"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--defaultgaslimit",children:(0,d.jsx)(i.code,{children:"--defaultGasLimit"})}),"\n",(0,d.jsx)(i.p,{children:"Suggested gas limit to the engine/builder for building execution payloads. Only used post merge."}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"30000000"})]}),"\n",(0,d.jsx)(i.h4,{id:"--builder",children:(0,d.jsx)(i.code,{children:"--builder"})}),"\n",(0,d.jsxs)(i.p,{children:["An alias for ",(0,d.jsx)(i.code,{children:"--builder.selection default"})," for the builder flow, ignored if ",(0,d.jsx)(i.code,{children:"--builder.selection"})," is explicitly provided"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--builderselection",children:(0,d.jsx)(i.code,{children:"--builder.selection"})}),"\n",(0,d.jsxs)(i.p,{children:["Builder block selection strategy ",(0,d.jsx)(i.code,{children:"default"}),", ",(0,d.jsx)(i.code,{children:"maxprofit"}),", ",(0,d.jsx)(i.code,{children:"builderalways"}),", ",(0,d.jsx)(i.code,{children:"builderonly"}),", ",(0,d.jsx)(i.code,{children:"executionalways"}),", or ",(0,d.jsx)(i.code,{children:"executiononly"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"executiononly"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--builderboostfactor",children:(0,d.jsx)(i.code,{children:"--builder.boostFactor"})}),"\n",(0,d.jsxs)(i.p,{children:["Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if ",(0,d.jsx)(i.code,{children:"--builder.selection"})," is set to anything other than ",(0,d.jsx)(i.code,{children:"maxprofit"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"100"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--useproduceblockv3",children:(0,d.jsx)(i.code,{children:"--useProduceBlockV3"})}),"\n",(0,d.jsx)(i.p,{children:"Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--broadcastvalidation",children:(0,d.jsx)(i.code,{children:"--broadcastValidation"})}),"\n",(0,d.jsx)(i.p,{children:"Validations to be run by beacon node for the signed block prior to publishing"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"gossip"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--blindedlocal",children:(0,d.jsx)(i.code,{children:"--blindedLocal"})}),"\n",(0,d.jsx)(i.p,{children:"Request fetching local block in blinded format for produceBlockV3"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"false"})]}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystores",children:(0,d.jsx)(i.code,{children:"--importKeystores"})}),"\n",(0,d.jsx)(i.p,{children:"Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "./keystores/*.json" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystorespassword",children:(0,d.jsx)(i.code,{children:"--importKeystoresPassword"})}),"\n",(0,d.jsxs)(i.p,{children:["Path to a file with password to decrypt all keystores from ",(0,d.jsx)(i.code,{children:"importKeystores"})," option"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"./password.txt"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--doppelgangerprotection",children:(0,d.jsx)(i.code,{children:"--doppelgangerProtection"})}),"\n",(0,d.jsx)(i.p,{children:"Enables Doppelganger protection"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--httprequestwireformat",children:(0,d.jsx)(i.code,{children:"--http.requestWireFormat"})}),"\n",(0,d.jsxs)(i.p,{children:["Wire format to use in HTTP requests to beacon node. Can be one of ",(0,d.jsx)(i.code,{children:"json"})," or ",(0,d.jsx)(i.code,{children:"ssz"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"json"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--httpresponsewireformat",children:(0,d.jsx)(i.code,{children:"--http.responseWireFormat"})}),"\n",(0,d.jsxs)(i.p,{children:["Preferred wire format for HTTP responses from beacon node. Can be one of ",(0,d.jsx)(i.code,{children:"json"})," or ",(0,d.jsx)(i.code,{children:"ssz"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"ssz"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerurl",children:(0,d.jsx)(i.code,{children:"--externalSigner.url"})}),"\n",(0,d.jsx)(i.p,{children:"URL to connect to an external signing server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerpubkeys",children:(0,d.jsx)(i.code,{children:"--externalSigner.pubkeys"})}),"\n",(0,d.jsx)(i.p,{children:"List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerfetch",children:(0,d.jsx)(i.code,{children:"--externalSigner.fetch"})}),"\n",(0,d.jsxs)(i.p,{children:["Fetch the list of public keys to validate from an external signer. Cannot be used in combination with ",(0,d.jsx)(i.code,{children:"--externalSigner.pubkeys"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerfetchinterval",children:(0,d.jsx)(i.code,{children:"--externalSigner.fetchInterval"})}),"\n",(0,d.jsx)(i.p,{children:"Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsx)(i.h4,{id:"--distributed",children:(0,d.jsx)(i.code,{children:"--distributed"})}),"\n",(0,d.jsx)(i.p,{children:"Enables specific features required to run as part of a distributed validator cluster"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--metrics",children:(0,d.jsx)(i.code,{children:"--metrics"})}),"\n",(0,d.jsx)(i.p,{children:"Enable the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"false"})]}),"\n",(0,d.jsx)(i.h4,{id:"--metricsport",children:(0,d.jsx)(i.code,{children:"--metrics.port"})}),"\n",(0,d.jsx)(i.p,{children:"Listen TCP port for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"5064"})]}),"\n",(0,d.jsx)(i.h4,{id:"--metricsaddress",children:(0,d.jsx)(i.code,{children:"--metrics.address"})}),"\n",(0,d.jsx)(i.p,{children:"Listen address for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--monitoringendpoint",children:(0,d.jsx)(i.code,{children:"--monitoring.endpoint"})}),"\n",(0,d.jsx)(i.p,{children:"Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in)"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--monitoringinterval",children:(0,d.jsx)(i.code,{children:"--monitoring.interval"})}),"\n",(0,d.jsx)(i.p,{children:"Interval in milliseconds between sending client stats to the remote service"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"60000"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-slashing-protection-import",children:(0,d.jsx)(i.code,{children:"validator slashing-protection import"})}),"\n",(0,d.jsx)(i.p,{children:"Import an interchange file."}),"\n",(0,d.jsxs)(i.h3,{id:"validator-slashing-protection-import-options",children:[(0,d.jsx)(i.code,{children:"validator slashing-protection import"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--beaconnodes-1",children:(0,d.jsx)(i.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(i.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--force-1",children:(0,d.jsx)(i.code,{children:"--force"})}),"\n",(0,d.jsxs)(i.p,{children:["If ",(0,d.jsx)(i.code,{children:"genesisValidatorsRoot"})," can't be fetched from the Beacon node, use a zero hash"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--file",children:(0,d.jsx)(i.code,{children:"--file"})}),"\n",(0,d.jsx)(i.p,{children:"The slashing protection interchange file to import (.json)."}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-slashing-protection-export",children:(0,d.jsx)(i.code,{children:"validator slashing-protection export"})}),"\n",(0,d.jsx)(i.p,{children:"Export an interchange file."}),"\n",(0,d.jsxs)(i.h3,{id:"validator-slashing-protection-export-options",children:[(0,d.jsx)(i.code,{children:"validator slashing-protection export"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--beaconnodes-2",children:(0,d.jsx)(i.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(i.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--force-2",children:(0,d.jsx)(i.code,{children:"--force"})}),"\n",(0,d.jsxs)(i.p,{children:["If ",(0,d.jsx)(i.code,{children:"genesisValidatorsRoot"})," can't be fetched from the Beacon node, use a zero hash"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--file-1",children:(0,d.jsx)(i.code,{children:"--file"})}),"\n",(0,d.jsx)(i.p,{children:"The slashing protection interchange file to export to (.json)."}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--pubkeys",children:(0,d.jsx)(i.code,{children:"--pubkeys"})}),"\n",(0,d.jsx)(i.p,{children:"Export slashing protection data only for a given subset of public keys"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-import",children:(0,d.jsx)(i.code,{children:"validator import"})}),"\n",(0,d.jsx)(i.p,{children:"Imports one or more EIP-2335 keystores into a Lodestar validator client directory, requesting passwords interactively. The directory flag provides a convenient method for importing a directory of keys generated by the eth2-deposit-cli Ethereum Foundation utility."}),"\n",(0,d.jsxs)(i.h3,{id:"validator-import-examples",children:[(0,d.jsx)(i.code,{children:"validator import"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"Import validator keystores generated with the Ethereum Foundation Staking Launchpad"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator import --network holesky --importKeystores $HOME/staking-deposit-cli/validator_keys\n"})}),"\n",(0,d.jsxs)(i.h3,{id:"validator-import-options",children:[(0,d.jsx)(i.code,{children:"validator import"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystores-1",children:(0,d.jsx)(i.code,{children:"--importKeystores"})}),"\n",(0,d.jsx)(i.p,{children:"Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "./keystores/*.json" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystorespassword-1",children:(0,d.jsx)(i.code,{children:"--importKeystoresPassword"})}),"\n",(0,d.jsxs)(i.p,{children:["Path to a file with password to decrypt all keystores from ",(0,d.jsx)(i.code,{children:"importKeystores"})," option"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"./password.txt"'})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-list",children:(0,d.jsx)(i.code,{children:"validator list"})}),"\n",(0,d.jsx)(i.p,{children:"Lists the public keys of all validators"}),"\n",(0,d.jsxs)(i.h3,{id:"validator-list-examples",children:[(0,d.jsx)(i.code,{children:"validator list"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"List all validator public keys previously imported"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator list\n"})}),"\n",(0,d.jsx)(i.h2,{id:"validator-voluntary-exit",children:(0,d.jsx)(i.code,{children:"validator voluntary-exit"})}),"\n",(0,d.jsxs)(i.p,{children:["Performs a voluntary exit for a given set of validators as identified via ",(0,d.jsx)(i.code,{children:"pubkeys"}),". If no ",(0,d.jsx)(i.code,{children:"pubkeys"})," are provided, it will exit all validators that have been imported."]}),"\n",(0,d.jsxs)(i.h3,{id:"validator-voluntary-exit-examples",children:[(0,d.jsx)(i.code,{children:"validator voluntary-exit"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"Perform a voluntary exit for the validator who has a public key 0xF00"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator voluntary-exit --network holesky --pubkeys 0xF00\n"})}),"\n",(0,d.jsx)(i.p,{children:"Perform a voluntary exit for the validator who has a public key 0xF00 and its secret key is on an external signer"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator voluntary-exit --network holesky --externalSigner.url http://signer:9000 --externalSigner.fetch --pubkeys 0xF00\n"})}),"\n",(0,d.jsxs)(i.h3,{id:"validator-voluntary-exit-options",children:[(0,d.jsx)(i.code,{children:"validator voluntary-exit"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--exitepoch",children:(0,d.jsx)(i.code,{children:"--exitEpoch"})}),"\n",(0,d.jsx)(i.p,{children:"The epoch upon which to submit the voluntary exit. If no value is provided, then we default to the current epoch."}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsx)(i.h4,{id:"--pubkeys-1",children:(0,d.jsx)(i.code,{children:"--pubkeys"})}),"\n",(0,d.jsx)(i.p,{children:"Public keys to exit"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsx)(i.h4,{id:"--yes",children:(0,d.jsx)(i.code,{children:"--yes"})}),"\n",(0,d.jsx)(i.p,{children:"Skip confirmation prompt"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-bls-to-execution-change",children:(0,d.jsx)(i.code,{children:"validator bls-to-execution-change"})}),"\n",(0,d.jsxs)(i.p,{children:["Performs BLS To Execution Change for a given validator (as identified via ",(0,d.jsx)(i.code,{children:"publicKey"}),". If no ",(0,d.jsx)(i.code,{children:"publicKey"})," is provided, a prompt will ask the user which validator they would like to choose for BLS To Execution Change."]}),"\n",(0,d.jsxs)(i.h3,{id:"validator-bls-to-execution-change-examples",children:[(0,d.jsx)(i.code,{children:"validator bls-to-execution-change"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"Perform BLS To Execution Change for the validator who has a public key 0xF00"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator bls-to-execution-change --publicKey 0xF00 --fromBlsPrivkey ... --toExecutionAddress ...\n"})}),"\n",(0,d.jsxs)(i.h3,{id:"validator-bls-to-execution-change-options",children:[(0,d.jsx)(i.code,{children:"validator bls-to-execution-change"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--publickey",children:(0,d.jsx)(i.code,{children:"--publicKey"})}),"\n",(0,d.jsx)(i.p,{children:"Validator public key for which to set withdrawal address hence enabling withdrawals"}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--fromblsprivkey",children:(0,d.jsx)(i.code,{children:"--fromBlsPrivkey"})}),"\n",(0,d.jsx)(i.p,{children:"Bls withdrawals private key to sign the message"}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--toexecutionaddress",children:(0,d.jsx)(i.code,{children:"--toExecutionAddress"})}),"\n",(0,d.jsx)(i.p,{children:"Address to which the validator's balances will be set to be withdrawn."}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,d.jsx)(i,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>s});var d=n(6540);const r={},l=d.createContext(r);function o(e){const i=d.useContext(l);return d.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),d.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c9cac69.f0f7bb38.js b/assets/js/4c9cac69.f0f7bb38.js deleted file mode 100644 index 5360e1e49551..000000000000 --- a/assets/js/4c9cac69.f0f7bb38.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[2539],{4369:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>t});var d=n(4848),r=n(8453);const l={title:"CLI Reference"},o="validator CLI Command",s={id:"run/validator-management/validator-cli",title:"CLI Reference",description:"Run one or multiple validator clients",source:"@site/pages/run/validator-management/validator-cli.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/validator-cli",permalink:"/lodestar/run/validator-management/validator-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/validator-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Starting a Validator Client",permalink:"/lodestar/run/validator-management/vc-configuration"},next:{title:"External Signer",permalink:"/lodestar/run/validator-management/external-signer"}},c={},t=[{value:"Available Sub-Commands",id:"available-sub-commands",level:2},{value:"Examples",id:"examples",level:2},{value:"Base validator command",id:"base-validator-command",level:3},{value:"validator Options",id:"validator-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--keymanager",id:"--keymanager",level:4},{value:"--keymanager.auth",id:"--keymanagerauth",level:4},{value:"--keymanager.tokenFile",id:"--keymanagertokenfile",level:4},{value:"--keymanager.port",id:"--keymanagerport",level:4},{value:"--keymanager.address",id:"--keymanageraddress",level:4},{value:"--keymanager.cors",id:"--keymanagercors",level:4},{value:"--beaconNodes",id:"--beaconnodes",level:4},{value:"--force",id:"--force",level:4},{value:"--graffiti",id:"--graffiti",level:4},{value:"--proposerSettingsFile",id:"--proposersettingsfile",level:4},{value:"--suggestedFeeRecipient",id:"--suggestedfeerecipient",level:4},{value:"--strictFeeRecipientCheck",id:"--strictfeerecipientcheck",level:4},{value:"--defaultGasLimit",id:"--defaultgaslimit",level:4},{value:"--builder",id:"--builder",level:4},{value:"--builder.selection",id:"--builderselection",level:4},{value:"--builder.boostFactor",id:"--builderboostfactor",level:4},{value:"--useProduceBlockV3",id:"--useproduceblockv3",level:4},{value:"--broadcastValidation",id:"--broadcastvalidation",level:4},{value:"--blindedLocal",id:"--blindedlocal",level:4},{value:"--importKeystores",id:"--importkeystores",level:4},{value:"--importKeystoresPassword",id:"--importkeystorespassword",level:4},{value:"--doppelgangerProtection",id:"--doppelgangerprotection",level:4},{value:"--http.requestWireFormat",id:"--httprequestwireformat",level:4},{value:"--http.responseWireFormat",id:"--httpresponsewireformat",level:4},{value:"--externalSigner.url",id:"--externalsignerurl",level:4},{value:"--externalSigner.pubkeys",id:"--externalsignerpubkeys",level:4},{value:"--externalSigner.fetch",id:"--externalsignerfetch",level:4},{value:"--externalSigner.fetchInterval",id:"--externalsignerfetchinterval",level:4},{value:"--distributed",id:"--distributed",level:4},{value:"--metrics",id:"--metrics",level:4},{value:"--metrics.port",id:"--metricsport",level:4},{value:"--metrics.address",id:"--metricsaddress",level:4},{value:"--monitoring.endpoint",id:"--monitoringendpoint",level:4},{value:"--monitoring.interval",id:"--monitoringinterval",level:4},{value:"validator slashing-protection import",id:"validator-slashing-protection-import",level:2},{value:"validator slashing-protection import Options",id:"validator-slashing-protection-import-options",level:3},{value:"--beaconNodes",id:"--beaconnodes-1",level:4},{value:"--force",id:"--force-1",level:4},{value:"--file",id:"--file",level:4},{value:"validator slashing-protection export",id:"validator-slashing-protection-export",level:2},{value:"validator slashing-protection export Options",id:"validator-slashing-protection-export-options",level:3},{value:"--beaconNodes",id:"--beaconnodes-2",level:4},{value:"--force",id:"--force-2",level:4},{value:"--file",id:"--file-1",level:4},{value:"--pubkeys",id:"--pubkeys",level:4},{value:"validator import",id:"validator-import",level:2},{value:"validator import Examples",id:"validator-import-examples",level:3},{value:"validator import Options",id:"validator-import-options",level:3},{value:"--importKeystores",id:"--importkeystores-1",level:4},{value:"--importKeystoresPassword",id:"--importkeystorespassword-1",level:4},{value:"validator list",id:"validator-list",level:2},{value:"validator list Examples",id:"validator-list-examples",level:3},{value:"validator voluntary-exit",id:"validator-voluntary-exit",level:2},{value:"validator voluntary-exit Examples",id:"validator-voluntary-exit-examples",level:3},{value:"validator voluntary-exit Options",id:"validator-voluntary-exit-options",level:3},{value:"--exitEpoch",id:"--exitepoch",level:4},{value:"--pubkeys",id:"--pubkeys-1",level:4},{value:"--yes",id:"--yes",level:4},{value:"validator bls-to-execution-change",id:"validator-bls-to-execution-change",level:2},{value:"validator bls-to-execution-change Examples",id:"validator-bls-to-execution-change-examples",level:3},{value:"validator bls-to-execution-change Options",id:"validator-bls-to-execution-change-options",level:3},{value:"--publicKey",id:"--publickey",level:4},{value:"--fromBlsPrivkey",id:"--fromblsprivkey",level:4},{value:"--toExecutionAddress",id:"--toexecutionaddress",level:4}];function a(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(i.h1,{id:"validator-cli-command",children:[(0,d.jsx)(i.code,{children:"validator"})," CLI Command"]}),"\n",(0,d.jsx)(i.p,{children:"Run one or multiple validator clients"}),"\n",(0,d.jsx)(i.h2,{id:"available-sub-commands",children:"Available Sub-Commands"}),"\n",(0,d.jsxs)(i.p,{children:["The following sub-commands are available with the ",(0,d.jsx)(i.code,{children:"validator"})," command:"]}),"\n",(0,d.jsxs)(i.ul,{children:["\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-slashing-protection-import",children:"validator slashing-protection import"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-slashing-protection-export",children:"validator slashing-protection export"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-import",children:"validator import"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-list",children:"validator list"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-voluntary-exit",children:"validator voluntary-exit"})}),"\n"]}),"\n",(0,d.jsxs)(i.li,{children:["\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.a,{href:"#validator-bls-to-execution-change",children:"validator bls-to-execution-change"})}),"\n"]}),"\n"]}),"\n",(0,d.jsx)(i.h2,{id:"examples",children:"Examples"}),"\n",(0,d.jsxs)(i.h3,{id:"base-validator-command",children:["Base ",(0,d.jsx)(i.code,{children:"validator"})," command"]}),"\n",(0,d.jsx)(i.p,{children:"Run one validator client with all the keystores available in the directory .holesky/keystores"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator --network holesky\n"})}),"\n",(0,d.jsxs)(i.h2,{id:"validator-options",children:[(0,d.jsx)(i.code,{children:"validator"})," Options"]}),"\n",(0,d.jsx)(i.h4,{id:"--datadir",children:(0,d.jsx)(i.code,{children:"--dataDir"})}),"\n",(0,d.jsx)(i.p,{children:"Lodestar root data directory"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--network",children:(0,d.jsx)(i.code,{children:"--network"})}),"\n",(0,d.jsx)(i.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"mainnet"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--paramsfile",children:(0,d.jsx)(i.code,{children:"--paramsFile"})}),"\n",(0,d.jsx)(i.p,{children:"Network configuration file"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--terminal-total-difficulty-override",children:(0,d.jsx)(i.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,d.jsx)(i.p,{children:"Terminal PoW block TTD override"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--terminal-block-hash-override",children:(0,d.jsx)(i.code,{children:"--terminal-block-hash-override"})}),"\n",(0,d.jsx)(i.p,{children:"Terminal PoW block hash override"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--terminal-block-hash-epoch-override",children:(0,d.jsx)(i.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,d.jsx)(i.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--loglevel",children:(0,d.jsx)(i.code,{children:"--logLevel"})}),"\n",(0,d.jsx)(i.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"info"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--logfile",children:(0,d.jsx)(i.code,{children:"--logFile"})}),"\n",(0,d.jsx)(i.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--logfilelevel",children:(0,d.jsx)(i.code,{children:"--logFileLevel"})}),"\n",(0,d.jsx)(i.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"debug"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--logfiledailyrotate",children:(0,d.jsx)(i.code,{children:"--logFileDailyRotate"})}),"\n",(0,d.jsx)(i.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"5"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanager",children:(0,d.jsx)(i.code,{children:"--keymanager"})}),"\n",(0,d.jsx)(i.p,{children:"Enable key manager API server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagerauth",children:(0,d.jsx)(i.code,{children:"--keymanager.auth"})}),"\n",(0,d.jsx)(i.p,{children:"Enable token bearer authentication for key manager API server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"true"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagertokenfile",children:(0,d.jsx)(i.code,{children:"--keymanager.tokenFile"})}),"\n",(0,d.jsx)(i.p,{children:"Path to file containing bearer token used for key manager API authentication"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagerport",children:(0,d.jsx)(i.code,{children:"--keymanager.port"})}),"\n",(0,d.jsx)(i.p,{children:"Set port for key manager API"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"5062"})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanageraddress",children:(0,d.jsx)(i.code,{children:"--keymanager.address"})}),"\n",(0,d.jsx)(i.p,{children:"Set host for key manager API"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--keymanagercors",children:(0,d.jsx)(i.code,{children:"--keymanager.cors"})}),"\n",(0,d.jsx)(i.p,{children:"Configures the Access-Control-Allow-Origin CORS header for key manager API"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"*"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--beaconnodes",children:(0,d.jsx)(i.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(i.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--force",children:(0,d.jsx)(i.code,{children:"--force"})}),"\n",(0,d.jsx)(i.p,{children:"Open validators even if there's a lockfile. Use with caution"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--graffiti",children:(0,d.jsx)(i.code,{children:"--graffiti"})}),"\n",(0,d.jsx)(i.p,{children:"Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max)"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--proposersettingsfile",children:(0,d.jsx)(i.code,{children:"--proposerSettingsFile"})}),"\n",(0,d.jsx)(i.p,{children:"A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--suggestedfeerecipient",children:(0,d.jsx)(i.code,{children:"--suggestedFeeRecipient"})}),"\n",(0,d.jsx)(i.p,{children:"Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge."}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"0x0000000000000000000000000000000000000000"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--strictfeerecipientcheck",children:(0,d.jsx)(i.code,{children:"--strictFeeRecipientCheck"})}),"\n",(0,d.jsxs)(i.p,{children:["Enable strict checking of the validator's ",(0,d.jsx)(i.code,{children:"feeRecipient"})," with the one returned by engine"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--defaultgaslimit",children:(0,d.jsx)(i.code,{children:"--defaultGasLimit"})}),"\n",(0,d.jsx)(i.p,{children:"Suggested gas limit to the engine/builder for building execution payloads. Only used post merge."}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"30000000"})]}),"\n",(0,d.jsx)(i.h4,{id:"--builder",children:(0,d.jsx)(i.code,{children:"--builder"})}),"\n",(0,d.jsxs)(i.p,{children:["An alias for ",(0,d.jsx)(i.code,{children:"--builder.selection default"})," for the builder flow, ignored if ",(0,d.jsx)(i.code,{children:"--builder.selection"})," is explicitly provided"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--builderselection",children:(0,d.jsx)(i.code,{children:"--builder.selection"})}),"\n",(0,d.jsxs)(i.p,{children:["Builder block selection strategy ",(0,d.jsx)(i.code,{children:"default"}),", ",(0,d.jsx)(i.code,{children:"maxprofit"}),", ",(0,d.jsx)(i.code,{children:"builderalways"}),", ",(0,d.jsx)(i.code,{children:"builderonly"}),", ",(0,d.jsx)(i.code,{children:"executionalways"}),", or ",(0,d.jsx)(i.code,{children:"executiononly"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"executiononly"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--builderboostfactor",children:(0,d.jsx)(i.code,{children:"--builder.boostFactor"})}),"\n",(0,d.jsxs)(i.p,{children:["Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if ",(0,d.jsx)(i.code,{children:"--builder.selection"})," is set to anything other than ",(0,d.jsx)(i.code,{children:"maxprofit"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"100"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--useproduceblockv3",children:(0,d.jsx)(i.code,{children:"--useProduceBlockV3"})}),"\n",(0,d.jsx)(i.p,{children:"Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--broadcastvalidation",children:(0,d.jsx)(i.code,{children:"--broadcastValidation"})}),"\n",(0,d.jsx)(i.p,{children:"Validations to be run by beacon node for the signed block prior to publishing"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"gossip"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--blindedlocal",children:(0,d.jsx)(i.code,{children:"--blindedLocal"})}),"\n",(0,d.jsx)(i.p,{children:"Request fetching local block in blinded format for produceBlockV3"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"false"})]}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystores",children:(0,d.jsx)(i.code,{children:"--importKeystores"})}),"\n",(0,d.jsx)(i.p,{children:"Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "./keystores/*.json" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystorespassword",children:(0,d.jsx)(i.code,{children:"--importKeystoresPassword"})}),"\n",(0,d.jsxs)(i.p,{children:["Path to a file with password to decrypt all keystores from ",(0,d.jsx)(i.code,{children:"importKeystores"})," option"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"./password.txt"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--doppelgangerprotection",children:(0,d.jsx)(i.code,{children:"--doppelgangerProtection"})}),"\n",(0,d.jsx)(i.p,{children:"Enables Doppelganger protection"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--httprequestwireformat",children:(0,d.jsx)(i.code,{children:"--http.requestWireFormat"})}),"\n",(0,d.jsxs)(i.p,{children:["Wire format to use in HTTP requests to beacon node. Can be one of ",(0,d.jsx)(i.code,{children:"json"})," or ",(0,d.jsx)(i.code,{children:"ssz"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"json"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--httpresponsewireformat",children:(0,d.jsx)(i.code,{children:"--http.responseWireFormat"})}),"\n",(0,d.jsxs)(i.p,{children:["Preferred wire format for HTTP responses from beacon node. Can be one of ",(0,d.jsx)(i.code,{children:"json"})," or ",(0,d.jsx)(i.code,{children:"ssz"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"ssz"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerurl",children:(0,d.jsx)(i.code,{children:"--externalSigner.url"})}),"\n",(0,d.jsx)(i.p,{children:"URL to connect to an external signing server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerpubkeys",children:(0,d.jsx)(i.code,{children:"--externalSigner.pubkeys"})}),"\n",(0,d.jsx)(i.p,{children:"List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerfetch",children:(0,d.jsx)(i.code,{children:"--externalSigner.fetch"})}),"\n",(0,d.jsxs)(i.p,{children:["Fetch the list of public keys to validate from an external signer. Cannot be used in combination with ",(0,d.jsx)(i.code,{children:"--externalSigner.pubkeys"})]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--externalsignerfetchinterval",children:(0,d.jsx)(i.code,{children:"--externalSigner.fetchInterval"})}),"\n",(0,d.jsx)(i.p,{children:"Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsx)(i.h4,{id:"--distributed",children:(0,d.jsx)(i.code,{children:"--distributed"})}),"\n",(0,d.jsx)(i.p,{children:"Enables specific features required to run as part of a distributed validator cluster"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--metrics",children:(0,d.jsx)(i.code,{children:"--metrics"})}),"\n",(0,d.jsx)(i.p,{children:"Enable the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"false"})]}),"\n",(0,d.jsx)(i.h4,{id:"--metricsport",children:(0,d.jsx)(i.code,{children:"--metrics.port"})}),"\n",(0,d.jsx)(i.p,{children:"Listen TCP port for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"5064"})]}),"\n",(0,d.jsx)(i.h4,{id:"--metricsaddress",children:(0,d.jsx)(i.code,{children:"--metrics.address"})}),"\n",(0,d.jsx)(i.p,{children:"Listen address for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(i.h4,{id:"--monitoringendpoint",children:(0,d.jsx)(i.code,{children:"--monitoring.endpoint"})}),"\n",(0,d.jsx)(i.p,{children:"Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in)"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--monitoringinterval",children:(0,d.jsx)(i.code,{children:"--monitoring.interval"})}),"\n",(0,d.jsx)(i.p,{children:"Interval in milliseconds between sending client stats to the remote service"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:"60000"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-slashing-protection-import",children:(0,d.jsx)(i.code,{children:"validator slashing-protection import"})}),"\n",(0,d.jsx)(i.p,{children:"Import an interchange file."}),"\n",(0,d.jsxs)(i.h3,{id:"validator-slashing-protection-import-options",children:[(0,d.jsx)(i.code,{children:"validator slashing-protection import"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--beaconnodes-1",children:(0,d.jsx)(i.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(i.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--force-1",children:(0,d.jsx)(i.code,{children:"--force"})}),"\n",(0,d.jsxs)(i.p,{children:["If ",(0,d.jsx)(i.code,{children:"genesisValidatorsRoot"})," can't be fetched from the Beacon node, use a zero hash"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--file",children:(0,d.jsx)(i.code,{children:"--file"})}),"\n",(0,d.jsx)(i.p,{children:"The slashing protection interchange file to import (.json)."}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-slashing-protection-export",children:(0,d.jsx)(i.code,{children:"validator slashing-protection export"})}),"\n",(0,d.jsx)(i.p,{children:"Export an interchange file."}),"\n",(0,d.jsxs)(i.h3,{id:"validator-slashing-protection-export-options",children:[(0,d.jsx)(i.code,{children:"validator slashing-protection export"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--beaconnodes-2",children:(0,d.jsx)(i.code,{children:"--beaconNodes"})}),"\n",(0,d.jsx)(i.p,{children:"Addresses to connect to BeaconNode"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "http://127.0.0.1:9596" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--force-2",children:(0,d.jsx)(i.code,{children:"--force"})}),"\n",(0,d.jsxs)(i.p,{children:["If ",(0,d.jsx)(i.code,{children:"genesisValidatorsRoot"})," can't be fetched from the Beacon node, use a zero hash"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h4,{id:"--file-1",children:(0,d.jsx)(i.code,{children:"--file"})}),"\n",(0,d.jsx)(i.p,{children:"The slashing protection interchange file to export to (.json)."}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--pubkeys",children:(0,d.jsx)(i.code,{children:"--pubkeys"})}),"\n",(0,d.jsx)(i.p,{children:"Export slashing protection data only for a given subset of public keys"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-import",children:(0,d.jsx)(i.code,{children:"validator import"})}),"\n",(0,d.jsx)(i.p,{children:"Imports one or more EIP-2335 keystores into a Lodestar validator client directory, requesting passwords interactively. The directory flag provides a convenient method for importing a directory of keys generated by the eth2-deposit-cli Ethereum Foundation utility."}),"\n",(0,d.jsxs)(i.h3,{id:"validator-import-examples",children:[(0,d.jsx)(i.code,{children:"validator import"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"Import validator keystores generated with the Ethereum Foundation Staking Launchpad"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator import --network holesky --importKeystores $HOME/staking-deposit-cli/validator_keys\n"})}),"\n",(0,d.jsxs)(i.h3,{id:"validator-import-options",children:[(0,d.jsx)(i.code,{children:"validator import"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystores-1",children:(0,d.jsx)(i.code,{children:"--importKeystores"})}),"\n",(0,d.jsx)(i.p,{children:"Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'[ "./keystores/*.json" ]'})]}),"\n",(0,d.jsx)(i.h4,{id:"--importkeystorespassword-1",children:(0,d.jsx)(i.code,{children:"--importKeystoresPassword"})}),"\n",(0,d.jsxs)(i.p,{children:["Path to a file with password to decrypt all keystores from ",(0,d.jsx)(i.code,{children:"importKeystores"})," option"]}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsxs)(i.p,{children:["default: ",(0,d.jsx)(i.code,{children:'"./password.txt"'})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-list",children:(0,d.jsx)(i.code,{children:"validator list"})}),"\n",(0,d.jsx)(i.p,{children:"Lists the public keys of all validators"}),"\n",(0,d.jsxs)(i.h3,{id:"validator-list-examples",children:[(0,d.jsx)(i.code,{children:"validator list"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"List all validator public keys previously imported"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator list\n"})}),"\n",(0,d.jsx)(i.h2,{id:"validator-voluntary-exit",children:(0,d.jsx)(i.code,{children:"validator voluntary-exit"})}),"\n",(0,d.jsxs)(i.p,{children:["Performs a voluntary exit for a given set of validators as identified via ",(0,d.jsx)(i.code,{children:"pubkeys"}),". If no ",(0,d.jsx)(i.code,{children:"pubkeys"})," are provided, it will exit all validators that have been imported."]}),"\n",(0,d.jsxs)(i.h3,{id:"validator-voluntary-exit-examples",children:[(0,d.jsx)(i.code,{children:"validator voluntary-exit"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"Perform a voluntary exit for the validator who has a public key 0xF00"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator voluntary-exit --network holesky --pubkeys 0xF00\n"})}),"\n",(0,d.jsx)(i.p,{children:"Perform a voluntary exit for the validator who has a public key 0xF00 and its secret key is on an external signer"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator voluntary-exit --network holesky --externalSigner.url http://signer:9000 --externalSigner.fetch --pubkeys 0xF00\n"})}),"\n",(0,d.jsxs)(i.h3,{id:"validator-voluntary-exit-options",children:[(0,d.jsx)(i.code,{children:"validator voluntary-exit"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--exitepoch",children:(0,d.jsx)(i.code,{children:"--exitEpoch"})}),"\n",(0,d.jsx)(i.p,{children:"The epoch upon which to submit the voluntary exit. If no value is provided, then we default to the current epoch."}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"number"})]}),"\n",(0,d.jsx)(i.h4,{id:"--pubkeys-1",children:(0,d.jsx)(i.code,{children:"--pubkeys"})}),"\n",(0,d.jsx)(i.p,{children:"Public keys to exit"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string[]"})]}),"\n",(0,d.jsx)(i.h4,{id:"--yes",children:(0,d.jsx)(i.code,{children:"--yes"})}),"\n",(0,d.jsx)(i.p,{children:"Skip confirmation prompt"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"boolean"})]}),"\n",(0,d.jsx)(i.h2,{id:"validator-bls-to-execution-change",children:(0,d.jsx)(i.code,{children:"validator bls-to-execution-change"})}),"\n",(0,d.jsxs)(i.p,{children:["Performs BLS To Execution Change for a given validator (as identified via ",(0,d.jsx)(i.code,{children:"publicKey"}),". If no ",(0,d.jsx)(i.code,{children:"publicKey"})," is provided, a prompt will ask the user which validator they would like to choose for BLS To Execution Change."]}),"\n",(0,d.jsxs)(i.h3,{id:"validator-bls-to-execution-change-examples",children:[(0,d.jsx)(i.code,{children:"validator bls-to-execution-change"})," Examples"]}),"\n",(0,d.jsx)(i.p,{children:"Perform BLS To Execution Change for the validator who has a public key 0xF00"}),"\n",(0,d.jsx)(i.pre,{children:(0,d.jsx)(i.code,{className:"language-sh",children:"./lodestar validator bls-to-execution-change --publicKey 0xF00 --fromBlsPrivkey ... --toExecutionAddress ...\n"})}),"\n",(0,d.jsxs)(i.h3,{id:"validator-bls-to-execution-change-options",children:[(0,d.jsx)(i.code,{children:"validator bls-to-execution-change"})," Options"]}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.em,{children:"Supports all parent command options plus the following:"})}),"\n",(0,d.jsx)(i.h4,{id:"--publickey",children:(0,d.jsx)(i.code,{children:"--publicKey"})}),"\n",(0,d.jsx)(i.p,{children:"Validator public key for which to set withdrawal address hence enabling withdrawals"}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--fromblsprivkey",children:(0,d.jsx)(i.code,{children:"--fromBlsPrivkey"})}),"\n",(0,d.jsx)(i.p,{children:"Bls withdrawals private key to sign the message"}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]}),"\n",(0,d.jsx)(i.h4,{id:"--toexecutionaddress",children:(0,d.jsx)(i.code,{children:"--toExecutionAddress"})}),"\n",(0,d.jsx)(i.p,{children:"Address to which the validator's balances will be set to be withdrawn."}),"\n",(0,d.jsx)(i.p,{children:"required: true"}),"\n",(0,d.jsxs)(i.p,{children:["type: ",(0,d.jsx)(i.code,{children:"string"})]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,d.jsx)(i,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>s});var d=n(6540);const r={},l=d.createContext(r);function o(e){const i=d.useContext(l);return d.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),d.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4cac2fef.16e2eb75.js b/assets/js/4cac2fef.16e2eb75.js deleted file mode 100644 index cdf923080664..000000000000 --- a/assets/js/4cac2fef.16e2eb75.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[2817],{5978:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var r=o(4848),i=o(8453);const a={title:"Starting a Validator Client"},n="Validator Configuration",s={id:"run/validator-management/vc-configuration",title:"Starting a Validator Client",description:"The following instructions are for stakers utilizing the Lodestar validator client.",source:"@site/pages/run/validator-management/vc-configuration.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/vc-configuration",permalink:"/lodestar/run/validator-management/vc-configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/vc-configuration.md",tags:[],version:"current",frontMatter:{title:"Starting a Validator Client"},sidebar:"tutorialSidebar",previous:{title:"Syncing",permalink:"/lodestar/run/beacon-management/syncing"},next:{title:"CLI Reference",permalink:"/lodestar/run/validator-management/validator-cli"}},l={},d=[{value:"Setup your validator",id:"setup-your-validator",level:2},{value:"Create a keystore",id:"create-a-keystore",level:3},{value:"Import a validator keystore to Lodestar",id:"import-a-validator-keystore-to-lodestar",level:3},{value:"Option 1: Import Keys To Lodestar's Keystores Folder",id:"option-1-import-keys-to-lodestars-keystores-folder",level:4},{value:"Option 2: Import Keys When Starting the Validator",id:"option-2-import-keys-when-starting-the-validator",level:4},{value:"Configuring the fee recipient address",id:"configuring-the-fee-recipient-address",level:3},{value:"Configure your builder selection and/or builder boost factor",id:"configure-your-builder-selection-andor-builder-boost-factor",level:3},{value:"Calculating builder boost factor with examples",id:"calculating-builder-boost-factor-with-examples",level:4},{value:"Submit a validator deposit",id:"submit-a-validator-deposit",level:3},{value:"Mainnet",id:"mainnet",level:4},{value:"Holesky Testnet",id:"holesky-testnet",level:4},{value:"Ephemery Testnet",id:"ephemery-testnet",level:4},{value:"Run the validator",id:"run-the-validator",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"validator-configuration",children:"Validator Configuration"}),"\n",(0,r.jsx)(t.p,{children:"The following instructions are for stakers utilizing the Lodestar validator client."}),"\n",(0,r.jsx)(t.h2,{id:"setup-your-validator",children:"Setup your validator"}),"\n",(0,r.jsx)(t.p,{children:"Validators are represented by a BLS keypair. Use your generated mnemonic from one of the tools above to generate the keystore files required for validator duties on Ethereum using the Lodestar validator client."}),"\n",(0,r.jsx)(t.h3,{id:"create-a-keystore",children:"Create a keystore"}),"\n",(0,r.jsxs)(t.p,{children:["To create a keystore, we recommend using the official ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/staking-deposit-cli/releases",children:"Staking Deposit CLI"})," from the Ethereum Foundation for users comfortable with command line interfaces."]}),"\n",(0,r.jsxs)(t.p,{children:["Alternatively, for a graphical user interface, you can use the ",(0,r.jsx)(t.a,{href:"https://wagyu.gg/",children:"Stakehouse Wagyu Key Generator"})," developed by members of the EthStaker community."]}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsx)(t.p,{children:"These tools will generate keystore files for staking validators as well as the important mnemonic. This mnemonic must be handled and stored securely."})}),"\n",(0,r.jsx)(t.h3,{id:"import-a-validator-keystore-to-lodestar",children:"Import a validator keystore to Lodestar"}),"\n",(0,r.jsxs)(t.p,{children:["To import a validator JSON keystore that was created via one of the methods described above, you must locate the file for import (ex. ",(0,r.jsx)(t.code,{children:"keystore-m_12381_3600_0_0_0-1654128694.json"}),")."]}),"\n",(0,r.jsxs)(t.p,{children:["Inside the keystore JSON file, you should have an ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2335.md#json-schema",children:"EIP-2335 keystore file"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"You will also need the passphrase used the encrypt the keystore. This can be specified interactively, or provided in a plaintext file."}),"\n",(0,r.jsx)(t.h4,{id:"option-1-import-keys-to-lodestars-keystores-folder",children:"Option 1: Import Keys To Lodestar's Keystores Folder"}),"\n",(0,r.jsxs)(t.p,{children:["You can load the keys into the keystore folder using the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#validator-import",children:(0,r.jsx)(t.code,{children:"validator import"})})," command. There are two methods for importing keystores:"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.em,{children:"Interactive passphrase import"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator import --importKeystores ./validator_keys\n"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.em,{children:"Plaintext passphrase file import"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator import --importKeystores ./validator_keys --importKeystoresPassword ./password.txt\n"})}),"\n",(0,r.jsxs)(t.admonition,{type:"info",children:[(0,r.jsxs)(t.p,{children:["The interactive passphrase import method will prompt every keystore in the ",(0,r.jsx)(t.code,{children:"validator_keys"})," folder for import and will ask for the individual password for each keystore. ",(0,r.jsx)(t.strong,{children:"This method will allow you to import multiple keystores with different passwords."})]}),(0,r.jsxs)(t.p,{children:["The plaintext passphrase file import method will allow you to import all keystores in the ",(0,r.jsx)(t.code,{children:"validator_keys"})," folder encrypted with the same password contained in ",(0,r.jsx)(t.code,{children:"password.txt"})," for efficiency."]})]}),"\n",(0,r.jsxs)(t.p,{children:["Once imported with either method, these keystores will be automatically loaded when you start the validator. To list the imported keystores, use the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#validator-list",children:(0,r.jsx)(t.code,{children:"validator list"})})," command."]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h4,{id:"option-2-import-keys-when-starting-the-validator",children:"Option 2: Import Keys When Starting the Validator"}),"\n",(0,r.jsxs)(t.p,{children:["To import keys when you start the validator specify the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--importkeystores",children:(0,r.jsx)(t.code,{children:"--importKeystores"})})," and ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--importkeystorespassword",children:(0,r.jsx)(t.code,{children:"--importKeystoresPassword"})})," flags with the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#base-validator-command",children:(0,r.jsx)(t.code,{children:"validator"})})," command:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator --importKeystores ./validator_keys --importKeystoresPassword ./password.txt\n"})}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsxs)(t.p,{children:["If you import keys using ",(0,r.jsx)(t.code,{children:"--importKeystores"})," at runtime (Option 2) any keys loaded to the keystores folder from Option 1 will be ignored."]})}),"\n",(0,r.jsx)(t.h3,{id:"configuring-the-fee-recipient-address",children:"Configuring the fee recipient address"}),"\n",(0,r.jsxs)(t.p,{children:["Post-Merge Ethereum requires validators to set a ",(0,r.jsx)(t.strong,{children:"Fee Recipient"})," which allows you to receive priority fees when proposing blocks. If you do not set this address, your priority fees will be sent to the ",(0,r.jsx)(t.a,{href:"https://etherscan.io/address/0x0000000000000000000000000000000000000000",children:"burn address"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["Configure your validator client's fee recipient address by using the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--suggestedfeerecipient",children:(0,r.jsx)(t.code,{children:"--suggestedFeeRecipient"})})," flag. Ensure you specify an Ethereum address you control. An example of a fee recipient set with the address ",(0,r.jsx)(t.code,{children:"0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"})," would add the following flag to their configuration: ",(0,r.jsx)(t.code,{children:"--suggestedFeeRecipient 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["You may choose to use the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--strictfeerecipientcheck",children:(0,r.jsx)(t.code,{children:"--strictFeeRecipientCheck"})})," flag to enable a strict check of the fee recipient address with the one returned by the beacon node for added reassurance."]}),"\n",(0,r.jsx)(t.h3,{id:"configure-your-builder-selection-andor-builder-boost-factor",children:"Configure your builder selection and/or builder boost factor"}),"\n",(0,r.jsx)(t.p,{children:"If you are running a beacon node with connected builder relays, you may use these validator configurations to signal which block (builder vs. local execution) the beacon node should produce."}),"\n",(0,r.jsxs)(t.p,{children:["With produceBlockV3 (enabled automatically after the Deneb hard fork), the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderboostfactor",children:(0,r.jsx)(t.code,{children:"--builder.boostFactor"})})," is a percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderselection",children:(0,r.jsx)(t.code,{children:"--builder.selection"})})," is set to anything other than ",(0,r.jsx)(t.code,{children:"maxprofit"}),". Even though this is set on the validator client, the calculation is requested and applied on the beacon node itself. For more information, see the ",(0,r.jsx)(t.a,{href:"https://ethereum.github.io/beacon-APIs/#/ValidatorRequiredApi/produceBlockV3",children:"produceBlockV3 Beacon API"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["With Lodestar's ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderselection",children:(0,r.jsx)(t.code,{children:"--builder.selection"})})," validator options, you can select:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"default"}),": Default setting for Lodestar set at ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=90"}),". This default setting will have a local block boost of ~10%. Note that this value might change in the future depending on what we think is the most appropriate value to help improve censorship resistance of Ethereum."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"maxprofit"}),": An alias of ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=100"}),", which will always choose the more profitable block. Using this option, you may customize your ",(0,r.jsx)(t.code,{children:"--builder.boostFactor"})," to your preference. Examples of its usage are below."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"executionalways"}),": An alias of ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=0"}),", which will select the local execution block, unless it fails to produce due to an error or a delay in the response from the execution client."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"executiononly"}),": Beacon node will be requested to produce local execution block even if builder relays are configured. This option will always select the local execution block and will error if it couldn't produce one."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"builderalways"}),": An alias of ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=18446744073709551615"})," (2**64 - 1), which will select the builder block, unless the builder block fails to produce. The builder block may fail to produce if it's not available, not timely or there is an indication of censorship via ",(0,r.jsx)(t.code,{children:"shouldOverrideBuilder"})," from the execution payload response."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"builderonly"}),": Generally used for distributed validators (DVs). No execution block production will be triggered. Therefore, if a builder block is not produced, the API will fail and ",(0,r.jsx)(t.em,{children:"no block will be produced"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h4,{id:"calculating-builder-boost-factor-with-examples",children:"Calculating builder boost factor with examples"}),"\n",(0,r.jsxs)(t.p,{children:["To calculate the builder boost factor setting, you need to know what percentage you will accept a builder block for against a local execution block using the following formula: ",(0,r.jsx)(t.code,{children:"100*100/(100+percentage)"}),". The value passed to ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderboostfactor",children:(0,r.jsx)(t.code,{children:"--builder.boostFactor"})})," must be a valid number without decimals."]}),"\n",(0,r.jsx)(t.p,{children:"Example 1: I will only accept a builder block with 25% more value than the local execution block."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:"10000/(100+25) = 80\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Therefore, ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=80"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["Example 2: Setting a ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=0"})," will always prefer the local execution block, but will produce an available builder block if the local execution block fails."]}),"\n",(0,r.jsxs)(t.p,{children:["Example 3: Setting a ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=100"})," is the same as signaling ",(0,r.jsx)(t.code,{children:"--builder.selection maxprofit"})," where the validator will always select the most profitable block between the local execution engine and the builder block from the relay."]}),"\n",(0,r.jsx)(t.h3,{id:"submit-a-validator-deposit",children:"Submit a validator deposit"}),"\n",(0,r.jsx)(t.p,{children:"Please use the official Ethereum Launchpad to perform your deposits. Ensure your deposits are sent to the proper beacon chain deposit address on the correct network."}),"\n",(0,r.jsx)(t.h4,{id:"mainnet",children:"Mainnet"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://launchpad.ethereum.org",children:"Ethereum Mainnet Launchpad"})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://etherscan.io/address/0x00000000219ab540356cbb839cbe05303d7705fa",children:"Beacon Chain Deposit Contract"})," ",(0,r.jsx)(t.code,{children:"0x00000000219ab540356cBB839Cbe05303d7705Fa"})]}),"\n"]}),"\n",(0,r.jsx)(t.h4,{id:"holesky-testnet",children:"Holesky Testnet"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://holesky.launchpad.ethereum.org",children:"Ethereum Holesky Testnet Launchpad"})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://holesky.etherscan.io/address/0x4242424242424242424242424242424242424242",children:"Holesky Beacon Chain Deposit Contract"})," ",(0,r.jsx)(t.code,{children:"0x4242424242424242424242424242424242424242"})]}),"\n"]}),"\n",(0,r.jsx)(t.h4,{id:"ephemery-testnet",children:"Ephemery Testnet"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://launchpad.ephemery.dev/",children:"Ethereum Ephemery Testnet Launchpad"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://ephemery.dev/",children:"Ephemeral Testnet Resources"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"run-the-validator",children:"Run the validator"}),"\n",(0,r.jsx)(t.p,{children:"To start a Lodestar validator run the command:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator --network $NETWORK_NAME\n"})}),"\n",(0,r.jsx)(t.p,{children:"You should see confirmation that modules have started."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-txt",children:"Mar-01 03:06:35.048[] info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264\nMar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky\nMar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m\nMar-01 03:06:35.698[] info: 2 local keystores\nMar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea\nMar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e\nMar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596\nMar-01 03:09:23.813[] info: Genesis fetched from the beacon node\nMar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config\nMar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot\nMar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false\nMar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea\nMar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e\nMar-01 03:09:23.830[] info: Validator statuses active=2, total=2\nMar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1\nMar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1\n"})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>s});var r=o(6540);const i={},a=r.createContext(i);function n(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4cac2fef.5466c829.js b/assets/js/4cac2fef.5466c829.js new file mode 100644 index 000000000000..906f023a9b7e --- /dev/null +++ b/assets/js/4cac2fef.5466c829.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[2817],{5978:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var r=o(4848),i=o(8453);const a={title:"Starting a Validator Client"},n="Validator Configuration",s={id:"run/validator-management/vc-configuration",title:"Starting a Validator Client",description:"The following instructions are for stakers utilizing the Lodestar validator client.",source:"@site/pages/run/validator-management/vc-configuration.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/vc-configuration",permalink:"/lodestar/run/validator-management/vc-configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/vc-configuration.md",tags:[],version:"current",frontMatter:{title:"Starting a Validator Client"},sidebar:"tutorialSidebar",previous:{title:"Syncing",permalink:"/lodestar/run/beacon-management/syncing"},next:{title:"CLI Reference",permalink:"/lodestar/run/validator-management/validator-cli"}},l={},d=[{value:"Setup your validator",id:"setup-your-validator",level:2},{value:"Create a keystore",id:"create-a-keystore",level:3},{value:"Import a validator keystore to Lodestar",id:"import-a-validator-keystore-to-lodestar",level:3},{value:"Option 1: Import Keys To Lodestar's Keystores Folder",id:"option-1-import-keys-to-lodestars-keystores-folder",level:4},{value:"Option 2: Import Keys When Starting the Validator",id:"option-2-import-keys-when-starting-the-validator",level:4},{value:"Configuring the fee recipient address",id:"configuring-the-fee-recipient-address",level:3},{value:"Configure your builder selection and/or builder boost factor",id:"configure-your-builder-selection-andor-builder-boost-factor",level:3},{value:"Calculating builder boost factor with examples",id:"calculating-builder-boost-factor-with-examples",level:4},{value:"Submit a validator deposit",id:"submit-a-validator-deposit",level:3},{value:"Mainnet",id:"mainnet",level:4},{value:"Holesky Testnet",id:"holesky-testnet",level:4},{value:"Ephemery Testnet",id:"ephemery-testnet",level:4},{value:"Run the validator",id:"run-the-validator",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"validator-configuration",children:"Validator Configuration"}),"\n",(0,r.jsx)(t.p,{children:"The following instructions are for stakers utilizing the Lodestar validator client."}),"\n",(0,r.jsx)(t.h2,{id:"setup-your-validator",children:"Setup your validator"}),"\n",(0,r.jsx)(t.p,{children:"Validators are represented by a BLS keypair. Use your generated mnemonic from one of the tools above to generate the keystore files required for validator duties on Ethereum using the Lodestar validator client."}),"\n",(0,r.jsx)(t.h3,{id:"create-a-keystore",children:"Create a keystore"}),"\n",(0,r.jsxs)(t.p,{children:["To create a keystore, we recommend using the official ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/staking-deposit-cli/releases",children:"Staking Deposit CLI"})," from the Ethereum Foundation for users comfortable with command line interfaces."]}),"\n",(0,r.jsxs)(t.p,{children:["Alternatively, for a graphical user interface, you can use the ",(0,r.jsx)(t.a,{href:"https://wagyu.gg/",children:"Stakehouse Wagyu Key Generator"})," developed by members of the EthStaker community."]}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsx)(t.p,{children:"These tools will generate keystore files for staking validators as well as the important mnemonic. This mnemonic must be handled and stored securely."})}),"\n",(0,r.jsx)(t.h3,{id:"import-a-validator-keystore-to-lodestar",children:"Import a validator keystore to Lodestar"}),"\n",(0,r.jsxs)(t.p,{children:["To import a validator JSON keystore that was created via one of the methods described above, you must locate the file for import (ex. ",(0,r.jsx)(t.code,{children:"keystore-m_12381_3600_0_0_0-1654128694.json"}),")."]}),"\n",(0,r.jsxs)(t.p,{children:["Inside the keystore JSON file, you should have an ",(0,r.jsx)(t.a,{href:"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2335.md#json-schema",children:"EIP-2335 keystore file"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"You will also need the passphrase used the encrypt the keystore. This can be specified interactively, or provided in a plaintext file."}),"\n",(0,r.jsx)(t.h4,{id:"option-1-import-keys-to-lodestars-keystores-folder",children:"Option 1: Import Keys To Lodestar's Keystores Folder"}),"\n",(0,r.jsxs)(t.p,{children:["You can load the keys into the keystore folder using the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#validator-import",children:(0,r.jsx)(t.code,{children:"validator import"})})," command. There are two methods for importing keystores:"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.em,{children:"Interactive passphrase import"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator import --importKeystores ./validator_keys\n"})}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.em,{children:"Plaintext passphrase file import"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator import --importKeystores ./validator_keys --importKeystoresPassword ./password.txt\n"})}),"\n",(0,r.jsxs)(t.admonition,{type:"info",children:[(0,r.jsxs)(t.p,{children:["The interactive passphrase import method will prompt every keystore in the ",(0,r.jsx)(t.code,{children:"validator_keys"})," folder for import and will ask for the individual password for each keystore. ",(0,r.jsx)(t.strong,{children:"This method will allow you to import multiple keystores with different passwords."})]}),(0,r.jsxs)(t.p,{children:["The plaintext passphrase file import method will allow you to import all keystores in the ",(0,r.jsx)(t.code,{children:"validator_keys"})," folder encrypted with the same password contained in ",(0,r.jsx)(t.code,{children:"password.txt"})," for efficiency."]})]}),"\n",(0,r.jsxs)(t.p,{children:["Once imported with either method, these keystores will be automatically loaded when you start the validator. To list the imported keystores, use the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#validator-list",children:(0,r.jsx)(t.code,{children:"validator list"})})," command."]}),"\n",(0,r.jsx)(t.hr,{}),"\n",(0,r.jsx)(t.h4,{id:"option-2-import-keys-when-starting-the-validator",children:"Option 2: Import Keys When Starting the Validator"}),"\n",(0,r.jsxs)(t.p,{children:["To import keys when you start the validator specify the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--importkeystores",children:(0,r.jsx)(t.code,{children:"--importKeystores"})})," and ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--importkeystorespassword",children:(0,r.jsx)(t.code,{children:"--importKeystoresPassword"})})," flags with the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#base-validator-command",children:(0,r.jsx)(t.code,{children:"validator"})})," command:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator --importKeystores ./validator_keys --importKeystoresPassword ./password.txt\n"})}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsxs)(t.p,{children:["If you import keys using ",(0,r.jsx)(t.code,{children:"--importKeystores"})," at runtime (Option 2) any keys loaded to the keystores folder from Option 1 will be ignored."]})}),"\n",(0,r.jsx)(t.h3,{id:"configuring-the-fee-recipient-address",children:"Configuring the fee recipient address"}),"\n",(0,r.jsxs)(t.p,{children:["Post-Merge Ethereum requires validators to set a ",(0,r.jsx)(t.strong,{children:"Fee Recipient"})," which allows you to receive priority fees when proposing blocks. If you do not set this address, your priority fees will be sent to the ",(0,r.jsx)(t.a,{href:"https://etherscan.io/address/0x0000000000000000000000000000000000000000",children:"burn address"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["Configure your validator client's fee recipient address by using the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--suggestedfeerecipient",children:(0,r.jsx)(t.code,{children:"--suggestedFeeRecipient"})})," flag. Ensure you specify an Ethereum address you control. An example of a fee recipient set with the address ",(0,r.jsx)(t.code,{children:"0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"})," would add the following flag to their configuration: ",(0,r.jsx)(t.code,{children:"--suggestedFeeRecipient 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["You may choose to use the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--strictfeerecipientcheck",children:(0,r.jsx)(t.code,{children:"--strictFeeRecipientCheck"})})," flag to enable a strict check of the fee recipient address with the one returned by the beacon node for added reassurance."]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:["If you would like to set unique proposer metadata (e.g. fee recipient address) for each validator you are running, see the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/proposer-config",children:"Proposer Configuration"})," feature. This feature is also available via the keymanager API."]})}),"\n",(0,r.jsx)(t.h3,{id:"configure-your-builder-selection-andor-builder-boost-factor",children:"Configure your builder selection and/or builder boost factor"}),"\n",(0,r.jsx)(t.p,{children:"If you are running a beacon node with connected builder relays, you may use these validator configurations to signal which block (builder vs. local execution) the beacon node should produce."}),"\n",(0,r.jsxs)(t.p,{children:["With produceBlockV3 (enabled automatically after the Deneb hard fork), the ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderboostfactor",children:(0,r.jsx)(t.code,{children:"--builder.boostFactor"})})," is a percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderselection",children:(0,r.jsx)(t.code,{children:"--builder.selection"})})," is set to anything other than ",(0,r.jsx)(t.code,{children:"maxprofit"}),". Even though this is set on the validator client, the calculation is requested and applied on the beacon node itself. For more information, see the ",(0,r.jsx)(t.a,{href:"https://ethereum.github.io/beacon-APIs/#/ValidatorRequiredApi/produceBlockV3",children:"produceBlockV3 Beacon API"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["With Lodestar's ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderselection",children:(0,r.jsx)(t.code,{children:"--builder.selection"})})," validator options, you can select:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"default"}),": Default setting for Lodestar set at ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=90"}),". This default setting will have a local block boost of ~10%. Note that this value might change in the future depending on what we think is the most appropriate value to help improve censorship resistance of Ethereum."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"maxprofit"}),": An alias of ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=100"}),", which will always choose the more profitable block. Using this option, you may customize your ",(0,r.jsx)(t.code,{children:"--builder.boostFactor"})," to your preference. Examples of its usage are below."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"executionalways"}),": An alias of ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=0"}),", which will select the local execution block, unless it fails to produce due to an error or a delay in the response from the execution client."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"executiononly"}),": Beacon node will be requested to produce local execution block even if builder relays are configured. This option will always select the local execution block and will error if it couldn't produce one."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"builderalways"}),": An alias of ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=18446744073709551615"})," (2**64 - 1), which will select the builder block, unless the builder block fails to produce. The builder block may fail to produce if it's not available, not timely or there is an indication of censorship via ",(0,r.jsx)(t.code,{children:"shouldOverrideBuilder"})," from the execution payload response."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"builderonly"}),": Generally used for distributed validators (DVs). No execution block production will be triggered. Therefore, if a builder block is not produced, the API will fail and ",(0,r.jsx)(t.em,{children:"no block will be produced"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h4,{id:"calculating-builder-boost-factor-with-examples",children:"Calculating builder boost factor with examples"}),"\n",(0,r.jsxs)(t.p,{children:["To calculate the builder boost factor setting, you need to know what percentage you will accept a builder block for against a local execution block using the following formula: ",(0,r.jsx)(t.code,{children:"100*100/(100+percentage)"}),". The value passed to ",(0,r.jsx)(t.a,{href:"/lodestar/run/validator-management/validator-cli#--builderboostfactor",children:(0,r.jsx)(t.code,{children:"--builder.boostFactor"})})," must be a valid number without decimals."]}),"\n",(0,r.jsx)(t.p,{children:"Example 1: I will only accept a builder block with 25% more value than the local execution block."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:"10000/(100+25) = 80\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Therefore, ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=80"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["Example 2: Setting a ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=0"})," will always prefer the local execution block, but will produce an available builder block if the local execution block fails."]}),"\n",(0,r.jsxs)(t.p,{children:["Example 3: Setting a ",(0,r.jsx)(t.code,{children:"--builder.boostFactor=100"})," is the same as signaling ",(0,r.jsx)(t.code,{children:"--builder.selection maxprofit"})," where the validator will always select the most profitable block between the local execution engine and the builder block from the relay."]}),"\n",(0,r.jsx)(t.h3,{id:"submit-a-validator-deposit",children:"Submit a validator deposit"}),"\n",(0,r.jsx)(t.p,{children:"Please use the official Ethereum Launchpad to perform your deposits. Ensure your deposits are sent to the proper beacon chain deposit address on the correct network."}),"\n",(0,r.jsx)(t.h4,{id:"mainnet",children:"Mainnet"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://launchpad.ethereum.org",children:"Ethereum Mainnet Launchpad"})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://etherscan.io/address/0x00000000219ab540356cbb839cbe05303d7705fa",children:"Beacon Chain Deposit Contract"})," ",(0,r.jsx)(t.code,{children:"0x00000000219ab540356cBB839Cbe05303d7705Fa"})]}),"\n"]}),"\n",(0,r.jsx)(t.h4,{id:"holesky-testnet",children:"Holesky Testnet"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://holesky.launchpad.ethereum.org",children:"Ethereum Holesky Testnet Launchpad"})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"https://holesky.etherscan.io/address/0x4242424242424242424242424242424242424242",children:"Holesky Beacon Chain Deposit Contract"})," ",(0,r.jsx)(t.code,{children:"0x4242424242424242424242424242424242424242"})]}),"\n"]}),"\n",(0,r.jsx)(t.h4,{id:"ephemery-testnet",children:"Ephemery Testnet"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://launchpad.ephemery.dev/",children:"Ethereum Ephemery Testnet Launchpad"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://ephemery.dev/",children:"Ephemeral Testnet Resources"})}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"run-the-validator",children:"Run the validator"}),"\n",(0,r.jsx)(t.p,{children:"To start a Lodestar validator run the command:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"./lodestar validator --network $NETWORK_NAME\n"})}),"\n",(0,r.jsx)(t.p,{children:"You should see confirmation that modules have started."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-txt",children:"Mar-01 03:06:35.048[] info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264\nMar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky\nMar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m\nMar-01 03:06:35.698[] info: 2 local keystores\nMar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea\nMar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e\nMar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596\nMar-01 03:09:23.813[] info: Genesis fetched from the beacon node\nMar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config\nMar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot\nMar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false\nMar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea\nMar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e\nMar-01 03:09:23.830[] info: Validator statuses active=2, total=2\nMar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1\nMar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1\n"})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>s});var r=o(6540);const i={},a=r.createContext(i);function n(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5cc7305f.89506942.js b/assets/js/5cc7305f.89506942.js deleted file mode 100644 index 82b1d763a2a6..000000000000 --- a/assets/js/5cc7305f.89506942.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[9673],{3242:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>i});var r=n(4848),s=n(8453);const o={},a=void 0,d={id:"run/logging-and-metrics/dashboards",title:"dashboards",description:"",source:"@site/pages/run/logging-and-metrics/dashboards.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/dashboards",permalink:"/lodestar/run/logging-and-metrics/dashboards",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/dashboards.md",tags:[],version:"current",frontMatter:{}},c={},i=[];function u(t){return(0,r.jsx)(r.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(u,{...t})}):u()}},8453:(t,e,n)=>{n.d(e,{R:()=>a,x:()=>d});var r=n(6540);const s={},o=r.createContext(s);function a(t){const e=r.useContext(o);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function d(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),r.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/5eec63b5.06061164.js b/assets/js/5eec63b5.06061164.js new file mode 100644 index 000000000000..7f39494ebdd0 --- /dev/null +++ b/assets/js/5eec63b5.06061164.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[6635],{8029:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var r=n(4848),i=n(8453);const s={},o="Security Policy",l={id:"security",title:"Security Policy",description:"Supported Versions",source:"@site/pages/security.md",sourceDirName:".",slug:"/security",permalink:"/lodestar/security",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/security.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/lodestar/introduction"},next:{title:"Install Options",permalink:"/lodestar/run/getting-started/installation"}},a={},c=[{value:"Supported Versions",id:"supported-versions",level:2},{value:"Reporting a Vulnerability",id:"reporting-a-vulnerability",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:"security-policy",children:"Security Policy"}),"\n",(0,r.jsx)(t.h2,{id:"supported-versions",children:"Supported Versions"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\u23f3"," Lodestar currently undergoes a quick release cycle with regular minor releases published roughly fortnightly."]}),"\n",(0,r.jsxs)(t.li,{children:["\ud83c\udf10"," We encourage using the ",(0,r.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/releases/latest",children:"most recently released version"})," before reporting an issue."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"reporting-a-vulnerability",children:"Reporting a Vulnerability"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\ud83d\udea8"," Please, send vulnerability reports to ",(0,r.jsx)(t.code,{children:"security@chainsafe.io"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["\u26a0\ufe0f"," ",(0,r.jsx)(t.strong,{children:"Please do not file a public ticket"})," mentioning the vulnerability, as doing so could increase the likelihood of the vulnerability being used before a fix has been created, released and installed on the network."]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var r=n(6540);const i={},s=r.createContext(i);function o(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5eec63b5.e45e4131.js b/assets/js/5eec63b5.e45e4131.js deleted file mode 100644 index 3fe3fab419bf..000000000000 --- a/assets/js/5eec63b5.e45e4131.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[6635],{8029:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var n=r(4848),i=r(8453);const s={},o="Security Policy",l={id:"security",title:"Security Policy",description:"Supported Versions",source:"@site/pages/security.md",sourceDirName:".",slug:"/security",permalink:"/lodestar/security",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/security.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/lodestar/introduction"},next:{title:"Quick Start",permalink:"/lodestar/run/getting-started/quick-start"}},a={},c=[{value:"Supported Versions",id:"supported-versions",level:2},{value:"Reporting a Vulnerability",id:"reporting-a-vulnerability",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"security-policy",children:"Security Policy"}),"\n",(0,n.jsx)(t.h2,{id:"supported-versions",children:"Supported Versions"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\u23f3"," Lodestar currently undergoes a quick release cycle with regular minor releases published roughly fortnightly."]}),"\n",(0,n.jsxs)(t.li,{children:["\ud83c\udf10"," We encourage using the ",(0,n.jsx)(t.a,{href:"https://github.com/ChainSafe/lodestar/releases/latest",children:"most recently released version"})," before reporting an issue."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"reporting-a-vulnerability",children:"Reporting a Vulnerability"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\ud83d\udea8"," Please, send vulnerability reports to ",(0,n.jsx)(t.code,{children:"security@chainsafe.io"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["\u26a0\ufe0f"," ",(0,n.jsx)(t.strong,{children:"Please do not file a public ticket"})," mentioning the vulnerability, as doing so could increase the likelihood of the vulnerability being used before a fix has been created, released and installed on the network."]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function o(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7138bb81.45c01257.js b/assets/js/7138bb81.45c01257.js deleted file mode 100644 index b4b89dd7b499..000000000000 --- a/assets/js/7138bb81.45c01257.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[5463],{7368:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>u,contentTitle:()=>c,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>a});var n=o(4848),r=o(8453);const s={},c="Trouble Shooting",i={id:"trouble-shooting",title:"Trouble Shooting",description:"",source:"@site/pages/trouble-shooting.md",sourceDirName:".",slug:"/trouble-shooting",permalink:"/lodestar/trouble-shooting",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/trouble-shooting.md",tags:[],version:"current",frontMatter:{}},u={},a=[];function l(t){const e={h1:"h1",...(0,r.R)(),...t.components};return(0,n.jsx)(e.h1,{id:"trouble-shooting",children:"Trouble Shooting"})}function d(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(l,{...t})}):l(t)}},8453:(t,e,o)=>{o.d(e,{R:()=>c,x:()=>i});var n=o(6540);const r={},s=n.createContext(r);function c(t){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:c(t.components),n.createElement(s.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/734d20af.9b46206c.js b/assets/js/734d20af.9b46206c.js deleted file mode 100644 index 69a7f87569b1..000000000000 --- a/assets/js/734d20af.9b46206c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3674],{4614:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var i=n(4848),t=n(8453);const r={},o="Contribution Guidelines",l={id:"contribution/getting-started",title:"Contribution Guidelines",description:"Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward.",source:"@site/pages/contribution/getting-started.md",sourceDirName:"contribution",slug:"/contribution/getting-started",permalink:"/lodestar/contribution/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/getting-started.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Supporting Libraries",permalink:"/lodestar/supporting-libraries/"},next:{title:"Setting Up a Testnet",permalink:"/lodestar/contribution/advanced-topics/setting-up-a-testnet"}},d={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"MacOS Specifics",id:"macos-specifics",level:3},{value:"Getting Started",id:"getting-started",level:2},{value:"Tests",id:"tests",level:2},{value:"Devcontainer",id:"devcontainer",level:2},{value:"Common Issues",id:"common-issues",level:3},{value:"Debugging Spec Tests",id:"debugging-spec-tests",level:3},{value:"Docker",id:"docker",level:2},{value:"Beacon node only",id:"beacon-node-only",level:6},{value:"Beacon node and validator",id:"beacon-node-and-validator",level:6},{value:"Dockerized metrics + local beacon node",id:"dockerized-metrics--local-beacon-node",level:6},{value:"First Time Contributor?",id:"first-time-contributor",level:2},{value:"Reporting A Bug?",id:"reporting-a-bug",level:2},{value:"Contribution Process",id:"contribution-process",level:2},{value:"Github Style Guide",id:"github-style-guide",level:2},{value:"Lodestar Monorepo",id:"lodestar-monorepo",level:2},{value:"Style Guide",id:"style-guide",level:2},{value:"Tests style guide",id:"tests-style-guide",level:2},{value:"Logging policy",id:"logging-policy",level:2},{value:"Logging Levels",id:"logging-levels",level:3},{value:"Logging guidelines",id:"logging-guidelines",level:3},{value:"Contributing to Grafana dashboards",id:"contributing-to-grafana-dashboards",level:2},{value:"Using Download Script",id:"using-download-script",level:3},{value:"Contributing to Documentation",id:"contributing-to-documentation",level:2},{value:"Label Guide",id:"label-guide",level:2},{value:"status.* Issues and Pull Request Status",id:"status-issues-and-pull-request-status",level:6},{value:"scope.* Scope Indicator",id:"scope-scope-indicator",level:6},{value:"prio.* Prioritization Indicator",id:"prio-prioritization-indicator",level:6},{value:"spec.* Ethereum Consensus Spec Version Target",id:"spec-ethereum-consensus-spec-version-target",level:6},{value:"Community",id:"community",level:2}];function c(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h6:"h6",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:"contribution-guidelines",children:"Contribution Guidelines"}),"\n",(0,i.jsx)(s.p,{children:"Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward."}),"\n",(0,i.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\u2699"," ",(0,i.jsx)(s.a,{href:"https://nodejs.org/",children:"NodeJS"})," (LTS)"]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddf0"," ",(0,i.jsx)(s.a,{href:"https://classic.yarnpkg.com/lang/en/",children:"Yarn"})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"macos-specifics",children:"MacOS Specifics"}),"\n",(0,i.jsx)(s.p,{children:"When using MacOS, there are a couple of extra prerequisites that are required."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"python"}),"\n",(0,i.jsxs)(s.li,{children:["coreutils (e.g. via ",(0,i.jsx)(s.code,{children:"brew install coreutils"}),")"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\u2699"," Run ",(0,i.jsx)(s.code,{children:"corepack enable"})," to enable ",(0,i.jsx)(s.a,{href:"https://nodejs.org/api/corepack.html",children:"Corepack"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699"," Run ",(0,i.jsx)(s.code,{children:"yarn"})," to install dependencies."]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699"," Run ",(0,i.jsx)(s.code,{children:"yarn build"})," to build lib from source."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udce6"," A ",(0,i.jsx)(s.code,{children:"lodestar"})," binary will be bundled in ",(0,i.jsx)(s.code,{children:"./packages/cli/bin"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udcbb"," Run ",(0,i.jsx)(s.code,{children:"./lodestar --help"})," to get a list of available commands and arguments."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"tests",children:"Tests"}),"\n",(0,i.jsx)(s.p,{children:"To run tests:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(s.code,{children:"yarn test:unit"})," for unit tests."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(s.code,{children:"yarn test:e2e"})," for end-to-end tests."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(s.code,{children:"yarn test:spec"})," for spec tests."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(s.code,{children:"yarn test"})," to run all tests."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(s.code,{children:"yarn check-types"})," to check TypeScript types."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(s.code,{children:"yarn lint"})," to run the linter."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Note that to run ",(0,i.jsx)(s.code,{children:"test:e2e"}),", first ensure that the environment is correctly setup by running the ",(0,i.jsx)(s.code,{children:"run_e2e_env.sh"})," script. This script requires a running docker engine."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"./scripts/run_e2e_env.sh start\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Similarly, run ",(0,i.jsx)(s.code,{children:"yarn download-spec-tests"})," before running ",(0,i.jsx)(s.code,{children:"yarn test:spec"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Contributing to tests:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Test must not depend on external live resources, such that running tests for a commit must be deterministic:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Do not pull data from external APIs like execution JSON RPC (instead run a local node)."}),"\n",(0,i.jsx)(s.li,{children:"Do not pull unpinned versions from DockerHub (use deterministic tag) or Github (checkout commit not branch)."}),"\n",(0,i.jsx)(s.li,{children:"Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"devcontainer",children:"Devcontainer"}),"\n",(0,i.jsxs)(s.p,{children:["A ",(0,i.jsx)(s.a,{href:"https://containers.dev/",children:"devcontainer"})," ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/blob/unstable/.devcontainer/devcontainer.json",children:"configuration"})," is provided to help speed up linux based development environment setup. It will be used by ",(0,i.jsx)(s.a,{href:"https://github.com/features/codespaces",children:"GitHub Codespaces"})," or directly inside VS Code via your local through this ",(0,i.jsx)(s.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"extension"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:'Error: [vitest] Cannot mock "../../src/db/repositories/index.js" because it is already loaded by "src/db/beacon.ts"'})}),"\n",(0,i.jsx)(s.p,{children:"If you observe any error in tests with matching to above error message, that implies you are loading the mocks in the wrong order. The correct order is to import the mocks first and then the actual module. We suggest to import the mocks on very top before any local modules."}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"\u2716 Error: Cannot find package 'async_hooks' imported from"})}),"\n",(0,i.jsxs)(s.p,{children:["If you observe following error running any of the test files that means you are running a file which itself or any dependency of that file imports ",(0,i.jsx)(s.code,{children:"vitest"}),", but you are not running that file with ",(0,i.jsx)(s.code,{children:"vitest"})," runner. Try running it with ",(0,i.jsx)(s.code,{children:"yarn vitest"})," command, not with ",(0,i.jsx)(s.code,{children:"node"})," command."]}),"\n",(0,i.jsx)(s.h3,{id:"debugging-spec-tests",children:"Debugging Spec Tests"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"To fix errors always focus on passing all minimal tests first without running mainnet tests."}),"\n",(0,i.jsx)(s.li,{children:"Spec tests often compare full expected vs actual states in JSON format."}),"\n",(0,i.jsxs)(s.li,{children:["A single logical error can cause many spec tests to fail. To focus on a single test at a time you can use vitest's option ",(0,i.jsx)(s.code,{children:"--bail 1"})," to stop at the first failed test"]}),"\n",(0,i.jsxs)(s.li,{children:["To then run only that failed test you can run against a specific file as use vitest's filters option ",(0,i.jsx)(s.code,{children:"-t "})," to run only one case"]}),"\n",(0,i.jsxs)(s.li,{children:["Before running the tests, make sure to switch to the package directory (e.g. ",(0,i.jsx)(s.code,{children:"packages/beacon-node"}),") to speed up test execution"]}),"\n"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"LODESTAR_PRESET=minimal yarn vitest --run --bail 1 --config vitest.spec.config.ts test/spec/presets/sanity.test.ts -t attester_slashing\n"})}),"\n",(0,i.jsx)(s.h2,{id:"docker",children:"Docker"}),"\n",(0,i.jsxs)(s.p,{children:["The docker-compose file requires that a ",(0,i.jsx)(s.code,{children:".env"})," file be present in this directory. The ",(0,i.jsx)(s.code,{children:"default.env"})," file provides a template and can be copied ",(0,i.jsx)(s.code,{children:".env"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"cp default.env .env\n"})}),"\n",(0,i.jsx)(s.h6,{id:"beacon-node-only",children:"Beacon node only"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"docker-compose up -d\n"})}),"\n",(0,i.jsx)(s.h6,{id:"beacon-node-and-validator",children:"Beacon node and validator"}),"\n",(0,i.jsxs)(s.p,{children:["First, you must have keystores and their secrets available locally at ",(0,i.jsx)(s.code,{children:"./keystores"})," and your ",(0,i.jsx)(s.code,{children:"password.txt"})," in ",(0,i.jsx)(s.code,{children:"./secrets"})]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"docker-compose -f docker-compose.yml -f docker-compose.validator.yml up -d\n"})}),"\n",(0,i.jsx)(s.h6,{id:"dockerized-metrics--local-beacon-node",children:"Dockerized metrics + local beacon node"}),"\n",(0,i.jsxs)(s.p,{children:["Run a local beacon with ",(0,i.jsx)(s.code,{children:"--metrics"})," enabled. Then start Prometheus + Grafana with all dashboards in ",(0,i.jsx)(s.code,{children:"./dashboards"})," automatically loaded running:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"./docker/docker-compose.local_dev.sh\n"})}),"\n",(0,i.jsx)(s.h2,{id:"first-time-contributor",children:"First Time Contributor?"}),"\n",(0,i.jsx)(s.p,{children:"Unsure where to begin contributing to Lodestar? Here are some ideas!"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\u270f\ufe0f"," See any typos? See any verbiage that should be changed or updated? Go for it! Github makes it easy to make contributions right from the browser."]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0e"," Look through our ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee",children:"outstanding unassigned issues"}),". (Hint: look for issues labeled ",(0,i.jsx)(s.code,{children:"good first issue"})," or ",(0,i.jsx)(s.code,{children:"help-wanted"}),"!)"]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udcac"," Join our ",(0,i.jsx)(s.a,{href:"https://discord.gg/aMxzVcr",children:"Discord chat"}),"!\n",(0,i.jsx)(s.a,{href:"https://discord.gg/aMxzVcr",children:(0,i.jsx)(s.img,{src:"https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord",alt:"Discord"})})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"reporting-a-bug",children:"Reporting A Bug?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\ud83d\uddd2"," ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"Create a new issue!"})," Select the type of issue that best fits, and please fill out as much of the information as you can."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"contribution-process",children:"Contribution Process"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Make sure you're familiar with our contribution guidelines ",(0,i.jsx)(s.em,{children:"(this document)"}),"!"]}),"\n",(0,i.jsxs)(s.li,{children:["Create your ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/fork",children:"own fork"})," of this repository."]}),"\n",(0,i.jsx)(s.li,{children:"Make your changes in your local fork."}),"\n",(0,i.jsxs)(s.li,{children:["If you've made a code change, make sure to lint and test your changes (",(0,i.jsx)(s.code,{children:"yarn lint"})," and ",(0,i.jsx)(s.code,{children:"yarn test:unit"}),")."]}),"\n",(0,i.jsx)(s.li,{children:"Make an open pull request when you're ready for it to be reviewed. We review PRs on a regular basis. See Pull request etiquette for more information."}),"\n",(0,i.jsx)(s.li,{children:"You may be asked to sign a Contributor License Agreement (CLA). We make it relatively painless with CLA-bot."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"github-style-guide",children:"Github Style Guide"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Branch Naming"})}),"\n",(0,i.jsxs)(s.p,{children:["If you are contributing from this repository prefix the branch name with your Github username (i.e. ",(0,i.jsx)(s.code,{children:"myusername/short-description"}),")"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Pull Request Naming"})}),"\n",(0,i.jsx)(s.p,{children:"Pull request titles must be:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Adhering to the ",(0,i.jsx)(s.a,{href:"https://www.conventionalcommits.org/en/v1.0.0/#summary",children:"conventional commits"})," spec"]}),"\n",(0,i.jsx)(s.li,{children:"Short and descriptive summary"}),"\n",(0,i.jsx)(s.li,{children:"Written in imperative present tense"}),"\n",(0,i.jsx)(s.li,{children:"Not end with a period"}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"For example:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"feat: add lodestar prover for execution api"}),"\n",(0,i.jsx)(s.li,{children:"fix: ignore known block in publish blinded block flow"}),"\n",(0,i.jsx)(s.li,{children:"refactor(reqresp)!: support byte based handlers"}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Pull Request Etiquette"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Pull requests should remain as drafts when they are not ready for review by maintainers. Open pull requests signal to the maintainers that it's ready for review."}),"\n",(0,i.jsx)(s.li,{children:"If your pull request is no longer applicable or validated to fix an issue, close your pull request."}),"\n",(0,i.jsx)(s.li,{children:"If your pull request is fixable and needs additional changes or commits within a short period of time, switch your pull request into a draft until it's ready."}),"\n",(0,i.jsxs)(s.li,{children:["Otherwise, close your pull request and ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"create a new issue instead."})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"lodestar-monorepo",children:"Lodestar Monorepo"}),"\n",(0,i.jsxs)(s.p,{children:["We're currently experimenting with hosting the majority of lodestar packages and support packages in this repository as a ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Monorepo",children:"monorepo"}),". We're using ",(0,i.jsx)(s.a,{href:"https://lerna.js.org/",children:"Lerna"})," to manage the packages. See ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/tree/unstable/packages",children:"packages/"})," for a list of packages hosted in this repository."]}),"\n",(0,i.jsx)(s.h2,{id:"style-guide",children:"Style Guide"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Lodestar has migrated to using ES modules."}),"\n",(0,i.jsxs)(s.li,{children:["Many module class constructors have the following signature: ",(0,i.jsx)(s.code,{children:"(options, dependencies)"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["e.g.: ",(0,i.jsx)(s.code,{children:"public constructor(opts: IExampleOptions, {db, logger}: IExampleModules)"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Modules should be designed to ",(0,i.jsx)(s.em,{children:'"do one thing and do it well!"'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Consider the interface of a module -- events included, and make sure it is coherent"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Make sure your code is properly linted","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"use an IDE that will show linter errors/warnings"}),"\n",(0,i.jsxs)(s.li,{children:["run ",(0,i.jsx)(s.code,{children:"yarn lint"})," from the command line"]}),"\n",(0,i.jsxs)(s.li,{children:["common rules:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Functions and variables should be ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Camel_case",children:(0,i.jsx)(s.code,{children:"camelCase"})}),", classes should be ",(0,i.jsx)(s.a,{href:"http://wiki.c2.com/?PascalCase",children:(0,i.jsx)(s.code,{children:"PascalCase"})}),", constants should be ",(0,i.jsx)(s.code,{children:"UPPERCASE_WITH_UNDERSCORES"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Use ",(0,i.jsx)(s.code,{children:'"'})," instead of ",(0,i.jsx)(s.code,{children:"'"})]}),"\n",(0,i.jsx)(s.li,{children:"All functions should have types declared for all parameters and return value"}),"\n",(0,i.jsxs)(s.li,{children:["You shouldn't be using TypeScript type ",(0,i.jsx)(s.code,{children:"any"})]}),"\n",(0,i.jsxs)(s.li,{children:["Private class properties should not be prefixed with a ",(0,i.jsx)(s.code,{children:"_"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["e.g.: ",(0,i.jsx)(s.code,{children:"private dirty;"}),", not ",(0,i.jsx)(s.code,{children:"private _dirty;"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Make sure that your code is properly type checked:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"use an IDE that will show type errors"}),"\n",(0,i.jsxs)(s.li,{children:["run ",(0,i.jsx)(s.code,{children:"yarn check-types"})," from the command line"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Make sure that the tests are still passing:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["run ",(0,i.jsx)(s.code,{children:"yarn test:unit"})," from the command line"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Commenting: If your code does something that is not obvious or deviates from standards, leave a comment for other developers to explain your logic and reasoning.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Use ",(0,i.jsx)(s.code,{children:"//"})," commenting format unless it's a comment you want people to see in their IDE."]}),"\n",(0,i.jsxs)(s.li,{children:["Use ",(0,i.jsx)(s.code,{children:"/** */"})," commenting format for documenting a function/variable."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"Code white space can be helpful for reading complex code, please add some."}),"\n",(0,i.jsx)(s.li,{children:"For unit tests, we forbid import stubbing when other approaches are feasible."}),"\n",(0,i.jsxs)(s.li,{children:["Metrics are a ",(0,i.jsx)(s.a,{href:"https://www.youtube.com/watch?v=49_qQDbLjGU",children:"critical part of Lodestar"}),", every large feature should be documented with metrics","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Metrics need to follow the ",(0,i.jsx)(s.a,{href:"https://prometheus.io/docs/practices/naming/",children:"Prometheus Best Practices"})]}),"\n",(0,i.jsxs)(s.li,{children:["For metric names, make sure to add the unit as suffix, e.g. ",(0,i.jsx)(s.code,{children:"_seconds"})," or ",(0,i.jsx)(s.code,{children:"_bytes"})]}),"\n",(0,i.jsxs)(s.li,{children:["Metric code variables on the other hand should not be suffixed, i.e. ",(0,i.jsx)(s.code,{children:"Sec"}),"-suffix should be omitted"]}),"\n",(0,i.jsx)(s.li,{children:"Time-based metrics must use seconds as the unit"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"tests-style-guide",children:"Tests style guide"}),"\n",(0,i.jsx)(s.p,{children:"Test must not depend on external live resources, such that running tests for a commit must be deterministic:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Do not pull data from external APIs like execution JSON RPC (instead run a local node)."}),"\n",(0,i.jsx)(s.li,{children:"Do not pull unpinned versions from dockerhub (use deterministic tag) or Github (checkout commit not branch)."}),"\n",(0,i.jsx)(s.li,{children:"Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment."}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Add assertion messages where possible to ease fixing tests if they fail. If an assertion message is called from multiple times with the same stack trace, you ",(0,i.jsx)(s.strong,{children:"MUST"})," include an assertion message. For example, if an assertion is inside a for loop add some metadata to be able to locate the error source:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-ts",children:'for (const blockResult of blocksResult) {\n expect(blockResult.status).equals("processed", `wrong block ${blockResult.id} result status`);\n}\n'})}),"\n",(0,i.jsx)(s.h2,{id:"logging-policy",children:"Logging policy"}),"\n",(0,i.jsx)(s.h3,{id:"logging-levels",children:"Logging Levels"}),"\n",(0,i.jsx)(s.p,{children:"Contributors must choose the log level carefully to ensure a consistent experience for every type of user:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"error"}),": Critical issues that prevent the application from functioning correctly or cause significant disruption to users. Examples include failed network connections, crashes, or data corruption."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"warn"}),": Situations that may lead to critical issues if not addressed but do not prevent the application from functioning. Examples include configuration issues, deprecated features, or temporary network disruptions."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"info"}),": General sporadic informational about the node's state. Examples include initialization messages, infrequent periodic status updates, or high-level progress reports."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"debug"}),": Detailed diagnostic information that can help developers or users troubleshoot specific issues. Examples include individual request logs for every REST API, networking interactions, or internal components status changes. Alias to ",(0,i.jsx)(s.code,{children:"verbose"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"logging-guidelines",children:"Logging guidelines"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Avoid excessive logging. Log messages should be clear and concise, providing enough information to understand the context and severity of the issue."}),"\n",(0,i.jsx)(s.li,{children:"Do not log sensitive data, such as private keys, user credentials, or personal information."}),"\n",(0,i.jsxs)(s.li,{children:["Do not log arbitrary data from the network as ASCII or UTF8 at levels higher or equal to ",(0,i.jsx)(s.code,{children:"info"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Use clear and concise language. Prefer to log variables in JSON format ",(0,i.jsx)(s.code,{children:'log.debug("Action", {slot})'})," instead of formatting the text yourself ",(0,i.jsx)(s.code,{children:"log.debug('slot=${slot}')"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"Include only relevant context in log messages, sufficient to debug the issue or action it refers to."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"contributing-to-grafana-dashboards",children:"Contributing to Grafana dashboards"}),"\n",(0,i.jsx)(s.p,{children:"To edit or extend an existing Grafana dashboard with minimal diff:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Grab the ",(0,i.jsx)(s.code,{children:".json"})," dashboard file from current unstable"]}),"\n",(0,i.jsxs)(s.li,{children:["Import the file to Grafana via the web UI at ",(0,i.jsx)(s.code,{children:"/dashboard/import"})," without modifying the UID of the dashboard"]}),"\n",(0,i.jsx)(s.li,{children:"Visually edit the dashboard"}),"\n",(0,i.jsx)(s.li,{children:"Once done make sure to leave the exact same visual aspect as before: same refresh interval, time range, etc."}),"\n",(0,i.jsx)(s.li,{children:"Save the dashboard (CTRL+S)"}),"\n",(0,i.jsxs)(s.li,{children:["Run download script, see ",(0,i.jsx)(s.a,{href:"#using-download-script",children:"below"})," on how to use it"]}),"\n",(0,i.jsx)(s.li,{children:"Check git diff of updated dashboards, commit, push and open your PR"}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"using-download-script",children:"Using Download Script"}),"\n",(0,i.jsxs)(s.p,{children:["Create a file ",(0,i.jsx)(s.code,{children:".secrets.env"})," with envs"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"GRAFANA_API_KEY=$token\nGRAFANA_URL=https://yourgrafanaapi.io\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Run script to download dashboards to ",(0,i.jsx)(s.code,{children:"./dashboards"})," folder"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-sh",children:"node scripts/download_dashboards.mjs\n"})}),"\n",(0,i.jsx)(s.h2,{id:"contributing-to-documentation",children:"Contributing to Documentation"}),"\n",(0,i.jsxs)(s.p,{children:["When submitting PRs for documentation updates, build and run the documentation locally to ensure functionality before submission. First generate the CLI documentation with ",(0,i.jsx)(s.code,{children:"yarn docs:build"}),". Then build and serve the documentation locally with ",(0,i.jsx)(s.code,{children:"yarn docs:serve"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["Your locally served documentation will then be accessible at ",(0,i.jsx)(s.a,{href:"http://localhost:3000/lodestar/",children:"http://localhost:3000/lodestar/"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["We also use a spelling ",(0,i.jsx)(s.a,{href:"https://github.com/ChainSafe/lodestar/blob/unstable/.wordlist.txt",children:"word list"})," as part of our documentation checks. If using unrecognized words or abbreviations, please extend the word list to pass checks. Make sure the list is sorted with ",(0,i.jsx)(s.code,{children:"./scripts/wordlist_sort.sh"})," and checked with ",(0,i.jsx)(s.code,{children:"./scripts/wordlist_sort_check.sh"})," for sorting and duplicates."]}),"\n",(0,i.jsx)(s.h2,{id:"label-guide",children:"Label Guide"}),"\n",(0,i.jsx)(s.p,{children:"Issues and pull requests are subject to the following labeling guidelines."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["PRs may have a status label to indicate deviation from the normal process such as ",(0,i.jsx)(s.code,{children:"status-blocked"})," or ",(0,i.jsx)(s.code,{children:"status-do-not-merge"})]}),"\n",(0,i.jsxs)(s.li,{children:["Issues and PRs will be tagged with a ",(0,i.jsx)(s.code,{children:"scope"})," and ",(0,i.jsx)(s.code,{children:"prio"})," to indicate type and priority for triage."]}),"\n",(0,i.jsx)(s.li,{children:"All other labels allow for further evaluation and organization."}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Label descriptions can be found below."}),"\n",(0,i.jsxs)(s.h6,{id:"status-issues-and-pull-request-status",children:[(0,i.jsx)(s.code,{children:"status.*"})," Issues and Pull Request Status"]}),"\n",(0,i.jsx)(s.p,{children:"Status labels apply to issues and pull requests which deviate from normal processes."}),"\n",(0,i.jsxs)(s.h6,{id:"scope-scope-indicator",children:[(0,i.jsx)(s.code,{children:"scope.*"})," Scope Indicator"]}),"\n",(0,i.jsx)(s.p,{children:"Scope is comparable to Module labels but less strict with the definition of components. It applies to both, issues and pull requests."}),"\n",(0,i.jsxs)(s.h6,{id:"prio-prioritization-indicator",children:[(0,i.jsx)(s.code,{children:"prio.*"})," Prioritization Indicator"]}),"\n",(0,i.jsx)(s.p,{children:"A simple indicator of issue prioritization. It mainly applies to issues."}),"\n",(0,i.jsxs)(s.h6,{id:"spec-ethereum-consensus-spec-version-target",children:[(0,i.jsx)(s.code,{children:"spec.*"})," Ethereum Consensus Spec Version Target"]}),"\n",(0,i.jsx)(s.p,{children:"Issues that target a specific version of the Ethereum consensus spec, shall be tagged accordingly."}),"\n",(0,i.jsx)(s.h2,{id:"community",children:"Community"}),"\n",(0,i.jsxs)(s.p,{children:["Come chat with us on ",(0,i.jsx)(s.a,{href:"https://discord.gg/aMxzVcr",children:"Discord"})," and join our public weekly planning meetings!"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>l});var i=n(6540);const t={},r=i.createContext(t);function o(e){const s=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/734d20af.f58da6c5.js b/assets/js/734d20af.f58da6c5.js new file mode 100644 index 000000000000..8fe3ac97d111 --- /dev/null +++ b/assets/js/734d20af.f58da6c5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3674],{4614:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var i=s(4848),t=s(8453);const r={},o="Contribution Guidelines",l={id:"contribution/getting-started",title:"Contribution Guidelines",description:"Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward.",source:"@site/pages/contribution/getting-started.md",sourceDirName:"contribution",slug:"/contribution/getting-started",permalink:"/lodestar/contribution/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/contribution/getting-started.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Supporting Libraries",permalink:"/lodestar/supporting-libraries/"},next:{title:"Setting Up a Testnet",permalink:"/lodestar/contribution/advanced-topics/setting-up-a-testnet"}},d={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"MacOS Specifics",id:"macos-specifics",level:3},{value:"Getting Started",id:"getting-started",level:2},{value:"Tests",id:"tests",level:2},{value:"Devcontainer",id:"devcontainer",level:2},{value:"Common Issues",id:"common-issues",level:3},{value:"Debugging Spec Tests",id:"debugging-spec-tests",level:3},{value:"Docker",id:"docker",level:2},{value:"Beacon node only",id:"beacon-node-only",level:6},{value:"Beacon node and validator",id:"beacon-node-and-validator",level:6},{value:"Dockerized metrics + local beacon node",id:"dockerized-metrics--local-beacon-node",level:6},{value:"First Time Contributor?",id:"first-time-contributor",level:2},{value:"Reporting A Bug?",id:"reporting-a-bug",level:2},{value:"Contribution Process",id:"contribution-process",level:2},{value:"Github Style Guide",id:"github-style-guide",level:2},{value:"Lodestar Monorepo",id:"lodestar-monorepo",level:2},{value:"Style Guide",id:"style-guide",level:2},{value:"Tests style guide",id:"tests-style-guide",level:2},{value:"Logging policy",id:"logging-policy",level:2},{value:"Logging Levels",id:"logging-levels",level:3},{value:"Logging guidelines",id:"logging-guidelines",level:3},{value:"Contributing to Grafana dashboards",id:"contributing-to-grafana-dashboards",level:2},{value:"Using Download Script",id:"using-download-script",level:3},{value:"Contributing to Documentation",id:"contributing-to-documentation",level:2},{value:"Label Guide",id:"label-guide",level:2},{value:"status.* Issues and Pull Request Status",id:"status-issues-and-pull-request-status",level:6},{value:"scope.* Scope Indicator",id:"scope-scope-indicator",level:6},{value:"prio.* Prioritization Indicator",id:"prio-prioritization-indicator",level:6},{value:"spec.* Ethereum Consensus Spec Version Target",id:"spec-ethereum-consensus-spec-version-target",level:6},{value:"Community",id:"community",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h6:"h6",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"contribution-guidelines",children:"Contribution Guidelines"}),"\n",(0,i.jsx)(n.p,{children:"Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward."}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\u2699"," ",(0,i.jsx)(n.a,{href:"https://nodejs.org/",children:"NodeJS"})," (LTS)"]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddf0"," ",(0,i.jsx)(n.a,{href:"https://classic.yarnpkg.com/lang/en/",children:"Yarn"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"macos-specifics",children:"MacOS Specifics"}),"\n",(0,i.jsx)(n.p,{children:"When using MacOS, there are a couple of extra prerequisites that are required."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"python"}),"\n",(0,i.jsxs)(n.li,{children:["coreutils (e.g. via ",(0,i.jsx)(n.code,{children:"brew install coreutils"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\u2699"," Run ",(0,i.jsx)(n.code,{children:"corepack enable"})," to enable ",(0,i.jsx)(n.a,{href:"https://nodejs.org/api/corepack.html",children:"Corepack"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["\u2699"," Run ",(0,i.jsx)(n.code,{children:"yarn"})," to install dependencies."]}),"\n",(0,i.jsxs)(n.li,{children:["\u2699"," Run ",(0,i.jsx)(n.code,{children:"yarn build"})," to build lib from source."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83d\udce6"," A ",(0,i.jsx)(n.code,{children:"lodestar"})," binary will be bundled in ",(0,i.jsx)(n.code,{children:"./packages/cli/bin"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83d\udcbb"," Run ",(0,i.jsx)(n.code,{children:"./lodestar --help"})," to get a list of available commands and arguments."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"tests",children:"Tests"}),"\n",(0,i.jsx)(n.p,{children:"To run tests:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(n.code,{children:"yarn test:unit"})," for unit tests."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(n.code,{children:"yarn test:e2e"})," for end-to-end tests."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(n.code,{children:"yarn test:spec"})," for spec tests."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(n.code,{children:"yarn test"})," to run all tests."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(n.code,{children:"yarn check-types"})," to check TypeScript types."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83e\uddea"," Run ",(0,i.jsx)(n.code,{children:"yarn lint"})," to run the linter."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Note that to run ",(0,i.jsx)(n.code,{children:"test:e2e"}),", first ensure that the environment is correctly setup by running the ",(0,i.jsx)(n.code,{children:"run_e2e_env.sh"})," script. This script requires a running docker engine."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"./scripts/run_e2e_env.sh start\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Similarly, run ",(0,i.jsx)(n.code,{children:"yarn download-spec-tests"})," before running ",(0,i.jsx)(n.code,{children:"yarn test:spec"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Contributing to tests:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Test must not depend on external live resources, such that running tests for a commit must be deterministic:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Do not pull data from external APIs like execution JSON RPC (instead run a local node)."}),"\n",(0,i.jsx)(n.li,{children:"Do not pull unpinned versions from DockerHub (use deterministic tag) or Github (checkout commit not branch)."}),"\n",(0,i.jsx)(n.li,{children:"Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"devcontainer",children:"Devcontainer"}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.a,{href:"https://containers.dev/",children:"devcontainer"})," ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/blob/unstable/.devcontainer/devcontainer.json",children:"configuration"})," is provided to help speed up linux based development environment setup. It will be used by ",(0,i.jsx)(n.a,{href:"https://github.com/features/codespaces",children:"GitHub Codespaces"})," or directly inside VS Code via your local through this ",(0,i.jsx)(n.a,{href:"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers",children:"extension"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:'Error: [vitest] Cannot mock "../../src/db/repositories/index.js" because it is already loaded by "src/db/beacon.ts"'})}),"\n",(0,i.jsx)(n.p,{children:"If you observe any error in tests with matching to above error message, that implies you are loading the mocks in the wrong order. The correct order is to import the mocks first and then the actual module. We suggest to import the mocks on very top before any local modules."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"\u2716 Error: Cannot find package 'async_hooks' imported from"})}),"\n",(0,i.jsxs)(n.p,{children:["If you observe following error running any of the test files that means you are running a file which itself or any dependency of that file imports ",(0,i.jsx)(n.code,{children:"vitest"}),", but you are not running that file with ",(0,i.jsx)(n.code,{children:"vitest"})," runner. Try running it with ",(0,i.jsx)(n.code,{children:"yarn vitest"})," command, not with ",(0,i.jsx)(n.code,{children:"node"})," command."]}),"\n",(0,i.jsx)(n.h3,{id:"debugging-spec-tests",children:"Debugging Spec Tests"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"To fix errors always focus on passing all minimal tests first without running mainnet tests."}),"\n",(0,i.jsx)(n.li,{children:"Spec tests often compare full expected vs actual states in JSON format."}),"\n",(0,i.jsxs)(n.li,{children:["A single logical error can cause many spec tests to fail. To focus on a single test at a time you can use vitest's option ",(0,i.jsx)(n.code,{children:"--bail 1"})," to stop at the first failed test"]}),"\n",(0,i.jsxs)(n.li,{children:["To then run only that failed test you can run against a specific file as use vitest's filters option ",(0,i.jsx)(n.code,{children:"-t "})," to run only one case"]}),"\n",(0,i.jsxs)(n.li,{children:["Before running the tests, make sure to switch to the package directory (e.g. ",(0,i.jsx)(n.code,{children:"packages/beacon-node"}),") to speed up test execution"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"LODESTAR_PRESET=minimal yarn vitest --run --bail 1 --config vitest.spec.config.ts test/spec/presets/sanity.test.ts -t attester_slashing\n"})}),"\n",(0,i.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,i.jsxs)(n.p,{children:["The docker-compose file requires that a ",(0,i.jsx)(n.code,{children:".env"})," file be present in this directory. The ",(0,i.jsx)(n.code,{children:"default.env"})," file provides a template and can be copied ",(0,i.jsx)(n.code,{children:".env"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cp default.env .env\n"})}),"\n",(0,i.jsx)(n.h6,{id:"beacon-node-only",children:"Beacon node only"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"docker-compose up -d\n"})}),"\n",(0,i.jsx)(n.h6,{id:"beacon-node-and-validator",children:"Beacon node and validator"}),"\n",(0,i.jsxs)(n.p,{children:["First, you must have keystores and their secrets available locally at ",(0,i.jsx)(n.code,{children:"./keystores"})," and your ",(0,i.jsx)(n.code,{children:"password.txt"})," in ",(0,i.jsx)(n.code,{children:"./secrets"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"docker-compose -f docker-compose.yml -f docker-compose.validator.yml up -d\n"})}),"\n",(0,i.jsx)(n.h6,{id:"dockerized-metrics--local-beacon-node",children:"Dockerized metrics + local beacon node"}),"\n",(0,i.jsxs)(n.p,{children:["Run a local beacon with ",(0,i.jsx)(n.code,{children:"--metrics"})," enabled. Then start Prometheus + Grafana with all dashboards in ",(0,i.jsx)(n.code,{children:"./dashboards"})," automatically loaded running:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"./docker/docker-compose.local_dev.sh\n"})}),"\n",(0,i.jsx)(n.h2,{id:"first-time-contributor",children:"First Time Contributor?"}),"\n",(0,i.jsx)(n.p,{children:"Unsure where to begin contributing to Lodestar? Here are some ideas!"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\u270f\ufe0f"," See any typos? See any verbiage that should be changed or updated? Go for it! Github makes it easy to make contributions right from the browser."]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83d\udd0e"," Look through our ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee",children:"outstanding unassigned issues"}),". (Hint: look for issues labeled ",(0,i.jsx)(n.code,{children:"good first issue"})," or ",(0,i.jsx)(n.code,{children:"help-wanted"}),"!)"]}),"\n",(0,i.jsxs)(n.li,{children:["\ud83d\udcac"," Join our ",(0,i.jsx)(n.a,{href:"https://discord.gg/aMxzVcr",children:"Discord chat"}),"!\n",(0,i.jsx)(n.a,{href:"https://discord.gg/aMxzVcr",children:(0,i.jsx)(n.img,{src:"https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord",alt:"Discord"})})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"reporting-a-bug",children:"Reporting A Bug?"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\ud83d\uddd2"," ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"Create a new issue!"})," Select the type of issue that best fits, and please fill out as much of the information as you can."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"contribution-process",children:"Contribution Process"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Make sure you're familiar with our contribution guidelines ",(0,i.jsx)(n.em,{children:"(this document)"}),"!"]}),"\n",(0,i.jsxs)(n.li,{children:["Create your ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/fork",children:"own fork"})," of this repository."]}),"\n",(0,i.jsx)(n.li,{children:"Make your changes in your local fork."}),"\n",(0,i.jsxs)(n.li,{children:["If you've made a code change, make sure to lint and test your changes (",(0,i.jsx)(n.code,{children:"yarn lint"})," and ",(0,i.jsx)(n.code,{children:"yarn test:unit"}),")."]}),"\n",(0,i.jsx)(n.li,{children:"Make an open pull request when you're ready for it to be reviewed. We review PRs on a regular basis. See Pull request etiquette for more information."}),"\n",(0,i.jsx)(n.li,{children:"You may be asked to sign a Contributor License Agreement (CLA). We make it relatively painless with CLA-bot."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Please note that trivial, non-code contributions such as spelling, grammar, typos, corrections, comments and link fixes are not acceptable pull requests. Although we appreciate the effort to fix these valid concerns, it is not practical for us to run our CI systems to accommodate minor external contributions which generate minimal value for the purpose of contribution/airdrop farming. It would be appreciated for you to open up an issue instead for our team to aggregate these types of contributions into a batch commit."}),"\n",(0,i.jsx)(n.h2,{id:"github-style-guide",children:"Github Style Guide"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Branch Naming"})}),"\n",(0,i.jsxs)(n.p,{children:["If you are contributing from this repository prefix the branch name with your Github username (i.e. ",(0,i.jsx)(n.code,{children:"myusername/short-description"}),")"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Pull Request Naming"})}),"\n",(0,i.jsx)(n.p,{children:"Pull request titles must be:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Adhering to the ",(0,i.jsx)(n.a,{href:"https://www.conventionalcommits.org/en/v1.0.0/#summary",children:"conventional commits"})," spec"]}),"\n",(0,i.jsx)(n.li,{children:"Short and descriptive summary"}),"\n",(0,i.jsx)(n.li,{children:"Written in imperative present tense"}),"\n",(0,i.jsx)(n.li,{children:"Not end with a period"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"For example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"feat: add lodestar prover for execution api"}),"\n",(0,i.jsx)(n.li,{children:"fix: ignore known block in publish blinded block flow"}),"\n",(0,i.jsx)(n.li,{children:"refactor(reqresp)!: support byte based handlers"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Pull Request Etiquette"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Pull requests should remain as drafts when they are not ready for review by maintainers. Open pull requests signal to the maintainers that it's ready for review."}),"\n",(0,i.jsx)(n.li,{children:"If your pull request is no longer applicable or validated to fix an issue, close your pull request."}),"\n",(0,i.jsx)(n.li,{children:"If your pull request is fixable and needs additional changes or commits within a short period of time, switch your pull request into a draft until it's ready."}),"\n",(0,i.jsxs)(n.li,{children:["Otherwise, close your pull request and ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/issues/new/choose",children:"create a new issue instead."})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"lodestar-monorepo",children:"Lodestar Monorepo"}),"\n",(0,i.jsxs)(n.p,{children:["We're currently experimenting with hosting the majority of lodestar packages and support packages in this repository as a ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Monorepo",children:"monorepo"}),". We're using ",(0,i.jsx)(n.a,{href:"https://lerna.js.org/",children:"Lerna"})," to manage the packages. See ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/tree/unstable/packages",children:"packages/"})," for a list of packages hosted in this repository."]}),"\n",(0,i.jsx)(n.h2,{id:"style-guide",children:"Style Guide"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Lodestar has migrated to using ES modules."}),"\n",(0,i.jsxs)(n.li,{children:["Many module class constructors have the following signature: ",(0,i.jsx)(n.code,{children:"(options, dependencies)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["e.g.: ",(0,i.jsx)(n.code,{children:"public constructor(opts: IExampleOptions, {db, logger}: IExampleModules)"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Modules should be designed to ",(0,i.jsx)(n.em,{children:'"do one thing and do it well!"'}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Consider the interface of a module -- events included, and make sure it is coherent"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Make sure your code is properly linted","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"use an IDE that will show linter errors/warnings"}),"\n",(0,i.jsxs)(n.li,{children:["run ",(0,i.jsx)(n.code,{children:"yarn lint"})," from the command line"]}),"\n",(0,i.jsxs)(n.li,{children:["common rules:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Functions and variables should be ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Camel_case",children:(0,i.jsx)(n.code,{children:"camelCase"})}),", classes should be ",(0,i.jsx)(n.a,{href:"http://wiki.c2.com/?PascalCase",children:(0,i.jsx)(n.code,{children:"PascalCase"})}),", constants should be ",(0,i.jsx)(n.code,{children:"UPPERCASE_WITH_UNDERSCORES"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:'"'})," instead of ",(0,i.jsx)(n.code,{children:"'"})]}),"\n",(0,i.jsx)(n.li,{children:"All functions should have types declared for all parameters and return value"}),"\n",(0,i.jsxs)(n.li,{children:["You shouldn't be using TypeScript type ",(0,i.jsx)(n.code,{children:"any"})]}),"\n",(0,i.jsxs)(n.li,{children:["Private class properties should not be prefixed with a ",(0,i.jsx)(n.code,{children:"_"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["e.g.: ",(0,i.jsx)(n.code,{children:"private dirty;"}),", not ",(0,i.jsx)(n.code,{children:"private _dirty;"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Make sure that your code is properly type checked:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"use an IDE that will show type errors"}),"\n",(0,i.jsxs)(n.li,{children:["run ",(0,i.jsx)(n.code,{children:"yarn check-types"})," from the command line"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Make sure that the tests are still passing:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["run ",(0,i.jsx)(n.code,{children:"yarn test:unit"})," from the command line"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Commenting: If your code does something that is not obvious or deviates from standards, leave a comment for other developers to explain your logic and reasoning.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"//"})," commenting format unless it's a comment you want people to see in their IDE."]}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"/** */"})," commenting format for documenting a function/variable."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Code white space can be helpful for reading complex code, please add some."}),"\n",(0,i.jsx)(n.li,{children:"For unit tests, we forbid import stubbing when other approaches are feasible."}),"\n",(0,i.jsxs)(n.li,{children:["Metrics are a ",(0,i.jsx)(n.a,{href:"https://www.youtube.com/watch?v=49_qQDbLjGU",children:"critical part of Lodestar"}),", every large feature should be documented with metrics","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Metrics need to follow the ",(0,i.jsx)(n.a,{href:"https://prometheus.io/docs/practices/naming/",children:"Prometheus Best Practices"})]}),"\n",(0,i.jsxs)(n.li,{children:["For metric names, make sure to add the unit as suffix, e.g. ",(0,i.jsx)(n.code,{children:"_seconds"})," or ",(0,i.jsx)(n.code,{children:"_bytes"})]}),"\n",(0,i.jsxs)(n.li,{children:["Metric code variables on the other hand should not be suffixed, i.e. ",(0,i.jsx)(n.code,{children:"Sec"}),"-suffix should be omitted"]}),"\n",(0,i.jsx)(n.li,{children:"Time-based metrics must use seconds as the unit"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"tests-style-guide",children:"Tests style guide"}),"\n",(0,i.jsx)(n.p,{children:"Test must not depend on external live resources, such that running tests for a commit must be deterministic:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Do not pull data from external APIs like execution JSON RPC (instead run a local node)."}),"\n",(0,i.jsx)(n.li,{children:"Do not pull unpinned versions from dockerhub (use deterministic tag) or Github (checkout commit not branch)."}),"\n",(0,i.jsx)(n.li,{children:"Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Add assertion messages where possible to ease fixing tests if they fail. If an assertion message is called from multiple times with the same stack trace, you ",(0,i.jsx)(n.strong,{children:"MUST"})," include an assertion message. For example, if an assertion is inside a for loop add some metadata to be able to locate the error source:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:'for (const blockResult of blocksResult) {\n expect(blockResult.status).equals("processed", `wrong block ${blockResult.id} result status`);\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"logging-policy",children:"Logging policy"}),"\n",(0,i.jsx)(n.h3,{id:"logging-levels",children:"Logging Levels"}),"\n",(0,i.jsx)(n.p,{children:"Contributors must choose the log level carefully to ensure a consistent experience for every type of user:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"error"}),": Critical issues that prevent the application from functioning correctly or cause significant disruption to users. Examples include failed network connections, crashes, or data corruption."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"warn"}),": Situations that may lead to critical issues if not addressed but do not prevent the application from functioning. Examples include configuration issues, deprecated features, or temporary network disruptions."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"info"}),": General sporadic informational about the node's state. Examples include initialization messages, infrequent periodic status updates, or high-level progress reports."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"debug"}),": Detailed diagnostic information that can help developers or users troubleshoot specific issues. Examples include individual request logs for every REST API, networking interactions, or internal components status changes. Alias to ",(0,i.jsx)(n.code,{children:"verbose"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"logging-guidelines",children:"Logging guidelines"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Avoid excessive logging. Log messages should be clear and concise, providing enough information to understand the context and severity of the issue."}),"\n",(0,i.jsx)(n.li,{children:"Do not log sensitive data, such as private keys, user credentials, or personal information."}),"\n",(0,i.jsxs)(n.li,{children:["Do not log arbitrary data from the network as ASCII or UTF8 at levels higher or equal to ",(0,i.jsx)(n.code,{children:"info"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Use clear and concise language. Prefer to log variables in JSON format ",(0,i.jsx)(n.code,{children:'log.debug("Action", {slot})'})," instead of formatting the text yourself ",(0,i.jsx)(n.code,{children:"log.debug('slot=${slot}')"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Include only relevant context in log messages, sufficient to debug the issue or action it refers to."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"contributing-to-grafana-dashboards",children:"Contributing to Grafana dashboards"}),"\n",(0,i.jsx)(n.p,{children:"To edit or extend an existing Grafana dashboard with minimal diff:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Grab the ",(0,i.jsx)(n.code,{children:".json"})," dashboard file from current unstable"]}),"\n",(0,i.jsxs)(n.li,{children:["Import the file to Grafana via the web UI at ",(0,i.jsx)(n.code,{children:"/dashboard/import"})," without modifying the UID of the dashboard"]}),"\n",(0,i.jsx)(n.li,{children:"Visually edit the dashboard"}),"\n",(0,i.jsx)(n.li,{children:"Once done make sure to leave the exact same visual aspect as before: same refresh interval, time range, etc."}),"\n",(0,i.jsx)(n.li,{children:"Save the dashboard (CTRL+S)"}),"\n",(0,i.jsxs)(n.li,{children:["Run download script, see ",(0,i.jsx)(n.a,{href:"#using-download-script",children:"below"})," on how to use it"]}),"\n",(0,i.jsx)(n.li,{children:"Check git diff of updated dashboards, commit, push and open your PR"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"using-download-script",children:"Using Download Script"}),"\n",(0,i.jsxs)(n.p,{children:["Create a file ",(0,i.jsx)(n.code,{children:".secrets.env"})," with envs"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"GRAFANA_API_KEY=$token\nGRAFANA_URL=https://yourgrafanaapi.io\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Run script to download dashboards to ",(0,i.jsx)(n.code,{children:"./dashboards"})," folder"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"node scripts/download_dashboards.mjs\n"})}),"\n",(0,i.jsx)(n.h2,{id:"contributing-to-documentation",children:"Contributing to Documentation"}),"\n",(0,i.jsxs)(n.p,{children:["When submitting PRs for documentation updates, build and run the documentation locally to ensure functionality before submission. First generate the CLI documentation with ",(0,i.jsx)(n.code,{children:"yarn docs:build"}),". Then build and serve the documentation locally with ",(0,i.jsx)(n.code,{children:"yarn docs:serve"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Your locally served documentation will then be accessible at ",(0,i.jsx)(n.a,{href:"http://localhost:3000/lodestar/",children:"http://localhost:3000/lodestar/"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also use a spelling ",(0,i.jsx)(n.a,{href:"https://github.com/ChainSafe/lodestar/blob/unstable/.wordlist.txt",children:"word list"})," as part of our documentation checks. If using unrecognized words or abbreviations, please extend the word list to pass checks. Make sure the list is sorted with ",(0,i.jsx)(n.code,{children:"./scripts/wordlist_sort.sh"})," and checked with ",(0,i.jsx)(n.code,{children:"./scripts/wordlist_sort_check.sh"})," for sorting and duplicates."]}),"\n",(0,i.jsx)(n.h2,{id:"label-guide",children:"Label Guide"}),"\n",(0,i.jsx)(n.p,{children:"Issues and pull requests are subject to the following labeling guidelines."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["PRs may have a status label to indicate deviation from the normal process such as ",(0,i.jsx)(n.code,{children:"status-blocked"})," or ",(0,i.jsx)(n.code,{children:"status-do-not-merge"})]}),"\n",(0,i.jsxs)(n.li,{children:["Issues and PRs will be tagged with a ",(0,i.jsx)(n.code,{children:"scope"})," and ",(0,i.jsx)(n.code,{children:"prio"})," to indicate type and priority for triage."]}),"\n",(0,i.jsx)(n.li,{children:"All other labels allow for further evaluation and organization."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Label descriptions can be found below."}),"\n",(0,i.jsxs)(n.h6,{id:"status-issues-and-pull-request-status",children:[(0,i.jsx)(n.code,{children:"status.*"})," Issues and Pull Request Status"]}),"\n",(0,i.jsx)(n.p,{children:"Status labels apply to issues and pull requests which deviate from normal processes."}),"\n",(0,i.jsxs)(n.h6,{id:"scope-scope-indicator",children:[(0,i.jsx)(n.code,{children:"scope.*"})," Scope Indicator"]}),"\n",(0,i.jsx)(n.p,{children:"Scope is comparable to Module labels but less strict with the definition of components. It applies to both, issues and pull requests."}),"\n",(0,i.jsxs)(n.h6,{id:"prio-prioritization-indicator",children:[(0,i.jsx)(n.code,{children:"prio.*"})," Prioritization Indicator"]}),"\n",(0,i.jsx)(n.p,{children:"A simple indicator of issue prioritization. It mainly applies to issues."}),"\n",(0,i.jsxs)(n.h6,{id:"spec-ethereum-consensus-spec-version-target",children:[(0,i.jsx)(n.code,{children:"spec.*"})," Ethereum Consensus Spec Version Target"]}),"\n",(0,i.jsx)(n.p,{children:"Issues that target a specific version of the Ethereum consensus spec, shall be tagged accordingly."}),"\n",(0,i.jsx)(n.h2,{id:"community",children:"Community"}),"\n",(0,i.jsxs)(n.p,{children:["Come chat with us on ",(0,i.jsx)(n.a,{href:"https://discord.gg/aMxzVcr",children:"Discord"})," and join our public weekly planning meetings!"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>l});var i=s(6540);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/88b8b4fa.54549ce2.js b/assets/js/88b8b4fa.54549ce2.js deleted file mode 100644 index 1b21b73751ef..000000000000 --- a/assets/js/88b8b4fa.54549ce2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[8492],{2151:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>a,frontMatter:()=>l,metadata:()=>s,toc:()=>t});var i=d(4848),c=d(8453);const l={title:"CLI Reference"},r="beacon CLI Command",s={id:"run/beacon-management/beacon-cli",title:"CLI Reference",description:"Run a beacon chain node",source:"@site/pages/run/beacon-management/beacon-cli.md",sourceDirName:"run/beacon-management",slug:"/run/beacon-management/beacon-cli",permalink:"/lodestar/run/beacon-management/beacon-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/beacon-management/beacon-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Starting a Node",permalink:"/lodestar/run/beacon-management/starting-a-node"},next:{title:"Data Retention",permalink:"/lodestar/run/beacon-management/data-retention"}},o={},t=[{value:"Examples",id:"examples",level:2},{value:"beacon Options",id:"beacon-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--checkpointSyncUrl",id:"--checkpointsyncurl",level:4},{value:"--checkpointState",id:"--checkpointstate",level:4},{value:"--wssCheckpoint",id:"--wsscheckpoint",level:4},{value:"--forceCheckpointSync",id:"--forcecheckpointsync",level:4},{value:"--private",id:"--private",level:4},{value:"--validatorMonitorLogs",id:"--validatormonitorlogs",level:4},{value:"--disableLightClientServer",id:"--disablelightclientserver",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--rest",id:"--rest",level:4},{value:"--rest.namespace",id:"--restnamespace",level:4},{value:"--rest.cors",id:"--restcors",level:4},{value:"--rest.address",id:"--restaddress",level:4},{value:"--rest.port",id:"--restport",level:4},{value:"--rest.swaggerUI",id:"--restswaggerui",level:4},{value:"--suggestedFeeRecipient",id:"--suggestedfeerecipient",level:4},{value:"--emitPayloadAttributes",id:"--emitpayloadattributes",level:4},{value:"--chain.archiveBlobEpochs",id:"--chainarchiveblobepochs",level:4},{value:"--eth1",id:"--eth1",level:4},{value:"--eth1.providerUrls",id:"--eth1providerurls",level:4},{value:"--execution.urls",id:"--executionurls",level:4},{value:"--execution.timeout",id:"--executiontimeout",level:4},{value:"--execution.retries",id:"--executionretries",level:4},{value:"--execution.retryDelay",id:"--executionretrydelay",level:4},{value:"--execution.engineMock",id:"--executionenginemock",level:4},{value:"--jwtSecret",id:"--jwtsecret",level:4},{value:"--jwtId",id:"--jwtid",level:4},{value:"--builder",id:"--builder",level:4},{value:"--builder.url",id:"--builderurl",level:4},{value:"--builder.timeout",id:"--buildertimeout",level:4},{value:"--builder.faultInspectionWindow",id:"--builderfaultinspectionwindow",level:4},{value:"--builder.allowedFaults",id:"--builderallowedfaults",level:4},{value:"--metrics",id:"--metrics",level:4},{value:"--metrics.port",id:"--metricsport",level:4},{value:"--metrics.address",id:"--metricsaddress",level:4},{value:"--monitoring.endpoint",id:"--monitoringendpoint",level:4},{value:"--monitoring.interval",id:"--monitoringinterval",level:4},{value:"--discv5",id:"--discv5",level:4},{value:"--listenAddress",id:"--listenaddress",level:4},{value:"--port",id:"--port",level:4},{value:"--discoveryPort",id:"--discoveryport",level:4},{value:"--listenAddress6",id:"--listenaddress6",level:4},{value:"--port6",id:"--port6",level:4},{value:"--discoveryPort6",id:"--discoveryport6",level:4},{value:"--bootnodes",id:"--bootnodes",level:4},{value:"--targetPeers",id:"--targetpeers",level:4},{value:"--subscribeAllSubnets",id:"--subscribeallsubnets",level:4},{value:"--disablePeerScoring",id:"--disablepeerscoring",level:4},{value:"--mdns",id:"--mdns",level:4},{value:"--enr.ip",id:"--enrip",level:4},{value:"--enr.tcp",id:"--enrtcp",level:4},{value:"--enr.udp",id:"--enrudp",level:4},{value:"--enr.ip6",id:"--enrip6",level:4},{value:"--enr.tcp6",id:"--enrtcp6",level:4},{value:"--enr.udp6",id:"--enrudp6",level:4},{value:"--nat",id:"--nat",level:4}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.h1,{id:"beacon-cli-command",children:[(0,i.jsx)(n.code,{children:"beacon"})," CLI Command"]}),"\n",(0,i.jsx)(n.p,{children:"Run a beacon chain node"}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.p,{children:"Run a beacon chain node and connect to the holesky testnet"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"./lodestar beacon --network holesky\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"beacon-options",children:[(0,i.jsx)(n.code,{children:"beacon"})," Options"]}),"\n",(0,i.jsx)(n.h4,{id:"--datadir",children:(0,i.jsx)(n.code,{children:"--dataDir"})}),"\n",(0,i.jsx)(n.p,{children:"Lodestar root data directory"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--network",children:(0,i.jsx)(n.code,{children:"--network"})}),"\n",(0,i.jsx)(n.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"mainnet"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--paramsfile",children:(0,i.jsx)(n.code,{children:"--paramsFile"})}),"\n",(0,i.jsx)(n.p,{children:"Network configuration file"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--terminal-total-difficulty-override",children:(0,i.jsx)(n.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,i.jsx)(n.p,{children:"Terminal PoW block TTD override"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--terminal-block-hash-override",children:(0,i.jsx)(n.code,{children:"--terminal-block-hash-override"})}),"\n",(0,i.jsx)(n.p,{children:"Terminal PoW block hash override"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--terminal-block-hash-epoch-override",children:(0,i.jsx)(n.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,i.jsx)(n.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--checkpointsyncurl",children:(0,i.jsx)(n.code,{children:"--checkpointSyncUrl"})}),"\n",(0,i.jsx)(n.p,{children:"Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--checkpointstate",children:(0,i.jsx)(n.code,{children:"--checkpointState"})}),"\n",(0,i.jsx)(n.p,{children:"Set a checkpoint state to start syncing from"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--wsscheckpoint",children:(0,i.jsx)(n.code,{children:"--wssCheckpoint"})}),"\n",(0,i.jsx)(n.p,{children:"Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--forcecheckpointsync",children:(0,i.jsx)(n.code,{children:"--forceCheckpointSync"})}),"\n",(0,i.jsx)(n.p,{children:"Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--private",children:(0,i.jsx)(n.code,{children:"--private"})}),"\n",(0,i.jsx)(n.p,{children:"Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--validatormonitorlogs",children:(0,i.jsx)(n.code,{children:"--validatorMonitorLogs"})}),"\n",(0,i.jsx)(n.p,{children:"Log validator monitor events as info. This requires metrics to be enabled."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--disablelightclientserver",children:(0,i.jsx)(n.code,{children:"--disableLightClientServer"})}),"\n",(0,i.jsx)(n.p,{children:"Disable light client server."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--loglevel",children:(0,i.jsx)(n.code,{children:"--logLevel"})}),"\n",(0,i.jsx)(n.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"info"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--logfile",children:(0,i.jsx)(n.code,{children:"--logFile"})}),"\n",(0,i.jsx)(n.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--logfilelevel",children:(0,i.jsx)(n.code,{children:"--logFileLevel"})}),"\n",(0,i.jsx)(n.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"debug"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--logfiledailyrotate",children:(0,i.jsx)(n.code,{children:"--logFileDailyRotate"})}),"\n",(0,i.jsx)(n.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"5"})]}),"\n",(0,i.jsx)(n.h4,{id:"--rest",children:(0,i.jsx)(n.code,{children:"--rest"})}),"\n",(0,i.jsx)(n.p,{children:"Enable/disable HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--restnamespace",children:(0,i.jsx)(n.code,{children:"--rest.namespace"})}),"\n",(0,i.jsx)(n.p,{children:"Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsx)(n.p,{children:'choices: "beacon", "config", "debug", "events", "lightclient", "lodestar", "node", "proof", "validator", "*"'}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'["beacon","config","debug","events","node","validator","lightclient"]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--restcors",children:(0,i.jsx)(n.code,{children:"--rest.cors"})}),"\n",(0,i.jsx)(n.p,{children:"Configures the Access-Control-Allow-Origin CORS header for HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"*"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--restaddress",children:(0,i.jsx)(n.code,{children:"--rest.address"})}),"\n",(0,i.jsx)(n.p,{children:"Set host for HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--restport",children:(0,i.jsx)(n.code,{children:"--rest.port"})}),"\n",(0,i.jsx)(n.p,{children:"Set port for HTTP API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"9596"})]}),"\n",(0,i.jsx)(n.h4,{id:"--restswaggerui",children:(0,i.jsx)(n.code,{children:"--rest.swaggerUI"})}),"\n",(0,i.jsx)(n.p,{children:"Enable Swagger UI for API exploration at http://{address}:{port}/documentation"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--suggestedfeerecipient",children:(0,i.jsx)(n.code,{children:"--suggestedFeeRecipient"})}),"\n",(0,i.jsxs)(n.p,{children:["Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$) in case validator fails to update for a validator index before calling ",(0,i.jsx)(n.code,{children:"produceBlock"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"0x0000000000000000000000000000000000000000"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--emitpayloadattributes",children:(0,i.jsx)(n.code,{children:"--emitPayloadAttributes"})}),"\n",(0,i.jsxs)(n.p,{children:["Flag to SSE emit execution ",(0,i.jsx)(n.code,{children:"payloadAttributes"})," before every slot"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--chainarchiveblobepochs",children:(0,i.jsx)(n.code,{children:"--chain.archiveBlobEpochs"})}),"\n",(0,i.jsx)(n.p,{children:"Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--eth1",children:(0,i.jsx)(n.code,{children:"--eth1"})}),"\n",(0,i.jsx)(n.p,{children:"Whether to follow the eth1 chain"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--eth1providerurls",children:(0,i.jsx)(n.code,{children:"--eth1.providerUrls"})}),"\n",(0,i.jsx)(n.p,{children:"Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "http://localhost:8545" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionurls",children:(0,i.jsx)(n.code,{children:"--execution.urls"})}),"\n",(0,i.jsx)(n.p,{children:"Urls to execution client engine API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "http://localhost:8551" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--executiontimeout",children:(0,i.jsx)(n.code,{children:"--execution.timeout"})}),"\n",(0,i.jsx)(n.p,{children:"Timeout in milliseconds for execution engine API HTTP client"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"12000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionretries",children:(0,i.jsx)(n.code,{children:"--execution.retries"})}),"\n",(0,i.jsx)(n.p,{children:"Number of retries when calling execution engine API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"2"})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionretrydelay",children:(0,i.jsx)(n.code,{children:"--execution.retryDelay"})}),"\n",(0,i.jsx)(n.p,{children:"Delay time in milliseconds between retries when retrying calls to the execution engine API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"2000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--executionenginemock",children:(0,i.jsx)(n.code,{children:"--execution.engineMock"})}),"\n",(0,i.jsx)(n.p,{children:"Set the execution engine to mock mode (development only)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--jwtsecret",children:(0,i.jsx)(n.code,{children:"--jwtSecret"})}),"\n",(0,i.jsx)(n.p,{children:"File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--jwtid",children:(0,i.jsx)(n.code,{children:"--jwtId"})}),"\n",(0,i.jsx)(n.p,{children:"An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builder",children:(0,i.jsx)(n.code,{children:"--builder"})}),"\n",(0,i.jsx)(n.p,{children:"Enable builder interface"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderurl",children:(0,i.jsx)(n.code,{children:"--builder.url"})}),"\n",(0,i.jsx)(n.p,{children:"Url hosting the builder API"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"http://localhost:8661"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--buildertimeout",children:(0,i.jsx)(n.code,{children:"--builder.timeout"})}),"\n",(0,i.jsx)(n.p,{children:"Timeout in milliseconds for builder API HTTP client"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"12000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderfaultinspectionwindow",children:(0,i.jsx)(n.code,{children:"--builder.faultInspectionWindow"})}),"\n",(0,i.jsx)(n.p,{children:"Window to inspect missed slots for enabling/disabling builder circuit breaker"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--builderallowedfaults",children:(0,i.jsx)(n.code,{children:"--builder.allowedFaults"})}),"\n",(0,i.jsxs)(n.p,{children:["Number of missed slots allowed in the ",(0,i.jsx)(n.code,{children:"faultInspectionWindow"})," for builder circuit"]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--metrics",children:(0,i.jsx)(n.code,{children:"--metrics"})}),"\n",(0,i.jsx)(n.p,{children:"Enable the Prometheus metrics HTTP server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsx)(n.h4,{id:"--metricsport",children:(0,i.jsx)(n.code,{children:"--metrics.port"})}),"\n",(0,i.jsx)(n.p,{children:"Listen TCP port for the Prometheus metrics HTTP server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"8008"})]}),"\n",(0,i.jsx)(n.h4,{id:"--metricsaddress",children:(0,i.jsx)(n.code,{children:"--metrics.address"})}),"\n",(0,i.jsx)(n.p,{children:"Listen address for the Prometheus metrics HTTP server"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--monitoringendpoint",children:(0,i.jsx)(n.code,{children:"--monitoring.endpoint"})}),"\n",(0,i.jsx)(n.p,{children:"Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in)"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--monitoringinterval",children:(0,i.jsx)(n.code,{children:"--monitoring.interval"})}),"\n",(0,i.jsx)(n.p,{children:"Interval in milliseconds between sending client stats to the remote service"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"60000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--discv5",children:(0,i.jsx)(n.code,{children:"--discv5"})}),"\n",(0,i.jsx)(n.p,{children:"Enable discv5"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"true"})]}),"\n",(0,i.jsx)(n.h4,{id:"--listenaddress",children:(0,i.jsx)(n.code,{children:"--listenAddress"})}),"\n",(0,i.jsx)(n.p,{children:"The IPv4 address to listen for p2p UDP and TCP connections"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'"0.0.0.0"'})]}),"\n",(0,i.jsx)(n.h4,{id:"--port",children:(0,i.jsx)(n.code,{children:"--port"})}),"\n",(0,i.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"9000"})]}),"\n",(0,i.jsx)(n.h4,{id:"--discoveryport",children:(0,i.jsx)(n.code,{children:"--discoveryPort"})}),"\n",(0,i.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,i.jsx)(n.code,{children:"port"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"port"})]}),"\n",(0,i.jsx)(n.h4,{id:"--listenaddress6",children:(0,i.jsx)(n.code,{children:"--listenAddress6"})}),"\n",(0,i.jsx)(n.p,{children:"The IPv6 address to listen for p2p UDP and TCP connections"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--port6",children:(0,i.jsx)(n.code,{children:"--port6"})}),"\n",(0,i.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag."}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"9090"})]}),"\n",(0,i.jsx)(n.h4,{id:"--discoveryport6",children:(0,i.jsx)(n.code,{children:"--discoveryPort6"})}),"\n",(0,i.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,i.jsx)(n.code,{children:"port6"})]}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"port6"})]}),"\n",(0,i.jsx)(n.h4,{id:"--bootnodes",children:(0,i.jsx)(n.code,{children:"--bootnodes"})}),"\n",(0,i.jsx)(n.p,{children:"Bootnodes for discv5 discovery"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string[]"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:'[ "[]" ]'})]}),"\n",(0,i.jsx)(n.h4,{id:"--targetpeers",children:(0,i.jsx)(n.code,{children:"--targetPeers"})}),"\n",(0,i.jsx)(n.p,{children:"The target connected peers. Above this number peers will be disconnected"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"100"})]}),"\n",(0,i.jsx)(n.h4,{id:"--subscribeallsubnets",children:(0,i.jsx)(n.code,{children:"--subscribeAllSubnets"})}),"\n",(0,i.jsx)(n.p,{children:"Subscribe to all subnets regardless of validator count"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--disablepeerscoring",children:(0,i.jsx)(n.code,{children:"--disablePeerScoring"})}),"\n",(0,i.jsx)(n.p,{children:"Disable peer scoring, used for testing on devnets"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--mdns",children:(0,i.jsx)(n.code,{children:"--mdns"})}),"\n",(0,i.jsx)(n.p,{children:"Enable mdns local peer discovery"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]}),"\n",(0,i.jsxs)(n.p,{children:["default: ",(0,i.jsx)(n.code,{children:"false"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrip",children:(0,i.jsx)(n.code,{children:"--enr.ip"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR IP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrtcp",children:(0,i.jsx)(n.code,{children:"--enr.tcp"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR TCP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrudp",children:(0,i.jsx)(n.code,{children:"--enr.udp"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR UDP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrip6",children:(0,i.jsx)(n.code,{children:"--enr.ip6"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR IPv6 entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"string"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrtcp6",children:(0,i.jsx)(n.code,{children:"--enr.tcp6"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR (IPv6-specific) TCP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--enrudp6",children:(0,i.jsx)(n.code,{children:"--enr.udp6"})}),"\n",(0,i.jsx)(n.p,{children:"Override ENR (IPv6-specific) UDP entry"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"number"})]}),"\n",(0,i.jsx)(n.h4,{id:"--nat",children:(0,i.jsx)(n.code,{children:"--nat"})}),"\n",(0,i.jsx)(n.p,{children:"Allow configuration of non-local addresses"}),"\n",(0,i.jsxs)(n.p,{children:["type: ",(0,i.jsx)(n.code,{children:"boolean"})]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>s});var i=d(6540);const c={},l=i.createContext(c);function r(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/88b8b4fa.6ef49da5.js b/assets/js/88b8b4fa.6ef49da5.js new file mode 100644 index 000000000000..8a077d4a791c --- /dev/null +++ b/assets/js/88b8b4fa.6ef49da5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[8492],{2151:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>a,frontMatter:()=>l,metadata:()=>s,toc:()=>t});var d=i(4848),c=i(8453);const l={title:"CLI Reference"},r="beacon CLI Command",s={id:"run/beacon-management/beacon-cli",title:"CLI Reference",description:"Run a beacon chain node",source:"@site/pages/run/beacon-management/beacon-cli.md",sourceDirName:"run/beacon-management",slug:"/run/beacon-management/beacon-cli",permalink:"/lodestar/run/beacon-management/beacon-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/beacon-management/beacon-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Starting a Node",permalink:"/lodestar/run/beacon-management/starting-a-node"},next:{title:"Data Retention",permalink:"/lodestar/run/beacon-management/data-retention"}},o={},t=[{value:"Examples",id:"examples",level:2},{value:"beacon Options",id:"beacon-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--rcConfig",id:"--rcconfig",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--genesisStateFile",id:"--genesisstatefile",level:4},{value:"--checkpointSyncUrl",id:"--checkpointsyncurl",level:4},{value:"--checkpointState",id:"--checkpointstate",level:4},{value:"--wssCheckpoint",id:"--wsscheckpoint",level:4},{value:"--forceCheckpointSync",id:"--forcecheckpointsync",level:4},{value:"--ignoreWeakSubjectivityCheck",id:"--ignoreweaksubjectivitycheck",level:4},{value:"--persistNetworkIdentity",id:"--persistnetworkidentity",level:4},{value:"--private",id:"--private",level:4},{value:"--validatorMonitorLogs",id:"--validatormonitorlogs",level:4},{value:"--disableLightClientServer",id:"--disablelightclientserver",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--rest",id:"--rest",level:4},{value:"--rest.namespace",id:"--restnamespace",level:4},{value:"--rest.cors",id:"--restcors",level:4},{value:"--rest.address",id:"--restaddress",level:4},{value:"--rest.port",id:"--restport",level:4},{value:"--rest.swaggerUI",id:"--restswaggerui",level:4},{value:"--suggestedFeeRecipient",id:"--suggestedfeerecipient",level:4},{value:"--emitPayloadAttributes",id:"--emitpayloadattributes",level:4},{value:"--chain.archiveBlobEpochs",id:"--chainarchiveblobepochs",level:4},{value:"--eth1",id:"--eth1",level:4},{value:"--eth1.providerUrls",id:"--eth1providerurls",level:4},{value:"--execution.urls",id:"--executionurls",level:4},{value:"--execution.timeout",id:"--executiontimeout",level:4},{value:"--execution.retries",id:"--executionretries",level:4},{value:"--execution.retryDelay",id:"--executionretrydelay",level:4},{value:"--execution.engineMock",id:"--executionenginemock",level:4},{value:"--jwtSecret",id:"--jwtsecret",level:4},{value:"--jwtId",id:"--jwtid",level:4},{value:"--builder",id:"--builder",level:4},{value:"--builder.url",id:"--builderurl",level:4},{value:"--builder.timeout",id:"--buildertimeout",level:4},{value:"--builder.faultInspectionWindow",id:"--builderfaultinspectionwindow",level:4},{value:"--builder.allowedFaults",id:"--builderallowedfaults",level:4},{value:"--metrics",id:"--metrics",level:4},{value:"--metrics.port",id:"--metricsport",level:4},{value:"--metrics.address",id:"--metricsaddress",level:4},{value:"--monitoring.endpoint",id:"--monitoringendpoint",level:4},{value:"--monitoring.interval",id:"--monitoringinterval",level:4},{value:"--discv5",id:"--discv5",level:4},{value:"--listenAddress",id:"--listenaddress",level:4},{value:"--port",id:"--port",level:4},{value:"--discoveryPort",id:"--discoveryport",level:4},{value:"--listenAddress6",id:"--listenaddress6",level:4},{value:"--port6",id:"--port6",level:4},{value:"--discoveryPort6",id:"--discoveryport6",level:4},{value:"--bootnodes",id:"--bootnodes",level:4},{value:"--targetPeers",id:"--targetpeers",level:4},{value:"--subscribeAllSubnets",id:"--subscribeallsubnets",level:4},{value:"--disablePeerScoring",id:"--disablepeerscoring",level:4},{value:"--mdns",id:"--mdns",level:4},{value:"--enr.ip",id:"--enrip",level:4},{value:"--enr.tcp",id:"--enrtcp",level:4},{value:"--enr.udp",id:"--enrudp",level:4},{value:"--enr.ip6",id:"--enrip6",level:4},{value:"--enr.tcp6",id:"--enrtcp6",level:4},{value:"--enr.udp6",id:"--enrudp6",level:4},{value:"--nat",id:"--nat",level:4}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(n.h1,{id:"beacon-cli-command",children:[(0,d.jsx)(n.code,{children:"beacon"})," CLI Command"]}),"\n",(0,d.jsx)(n.p,{children:"Run a beacon chain node"}),"\n",(0,d.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,d.jsx)(n.p,{children:"Run a beacon chain node and connect to the holesky testnet"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-sh",children:"./lodestar beacon --network holesky\n"})}),"\n",(0,d.jsxs)(n.h2,{id:"beacon-options",children:[(0,d.jsx)(n.code,{children:"beacon"})," Options"]}),"\n",(0,d.jsx)(n.h4,{id:"--datadir",children:(0,d.jsx)(n.code,{children:"--dataDir"})}),"\n",(0,d.jsx)(n.p,{children:"Lodestar root data directory"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--network",children:(0,d.jsx)(n.code,{children:"--network"})}),"\n",(0,d.jsx)(n.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"mainnet"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--paramsfile",children:(0,d.jsx)(n.code,{children:"--paramsFile"})}),"\n",(0,d.jsx)(n.p,{children:"Network configuration file"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--rcconfig",children:(0,d.jsx)(n.code,{children:"--rcConfig"})}),"\n",(0,d.jsx)(n.p,{children:"RC file to supplement command line args, accepted formats: .yml, .yaml, .json"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--terminal-total-difficulty-override",children:(0,d.jsx)(n.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,d.jsx)(n.p,{children:"Terminal PoW block TTD override"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--terminal-block-hash-override",children:(0,d.jsx)(n.code,{children:"--terminal-block-hash-override"})}),"\n",(0,d.jsx)(n.p,{children:"Terminal PoW block hash override"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--terminal-block-hash-epoch-override",children:(0,d.jsx)(n.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,d.jsx)(n.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--genesisstatefile",children:(0,d.jsx)(n.code,{children:"--genesisStateFile"})}),"\n",(0,d.jsx)(n.p,{children:"Path or URL to download a genesis state file in ssz-encoded format"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--checkpointsyncurl",children:(0,d.jsx)(n.code,{children:"--checkpointSyncUrl"})}),"\n",(0,d.jsx)(n.p,{children:"Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--checkpointstate",children:(0,d.jsx)(n.code,{children:"--checkpointState"})}),"\n",(0,d.jsx)(n.p,{children:"Set a checkpoint state to start syncing from"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--wsscheckpoint",children:(0,d.jsx)(n.code,{children:"--wssCheckpoint"})}),"\n",(0,d.jsx)(n.p,{children:"Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--forcecheckpointsync",children:(0,d.jsx)(n.code,{children:"--forceCheckpointSync"})}),"\n",(0,d.jsx)(n.p,{children:"Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--ignoreweaksubjectivitycheck",children:(0,d.jsx)(n.code,{children:"--ignoreWeakSubjectivityCheck"})}),"\n",(0,d.jsx)(n.p,{children:"Ignore the checkpoint sync state failing the weak subjectivity check. This is relevant in testnets where the weak subjectivity period is too small for even few epochs of non finalization causing last finalized to be out of range. This flag is not recommended for mainnet use."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--persistnetworkidentity",children:(0,d.jsx)(n.code,{children:"--persistNetworkIdentity"})}),"\n",(0,d.jsx)(n.p,{children:"Whether to reuse the same peer-id across restarts"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--private",children:(0,d.jsx)(n.code,{children:"--private"})}),"\n",(0,d.jsx)(n.p,{children:"Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--validatormonitorlogs",children:(0,d.jsx)(n.code,{children:"--validatorMonitorLogs"})}),"\n",(0,d.jsx)(n.p,{children:"Log validator monitor events as info. This requires metrics to be enabled."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--disablelightclientserver",children:(0,d.jsx)(n.code,{children:"--disableLightClientServer"})}),"\n",(0,d.jsx)(n.p,{children:"Disable light client server."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--loglevel",children:(0,d.jsx)(n.code,{children:"--logLevel"})}),"\n",(0,d.jsx)(n.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"info"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--logfile",children:(0,d.jsx)(n.code,{children:"--logFile"})}),"\n",(0,d.jsx)(n.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--logfilelevel",children:(0,d.jsx)(n.code,{children:"--logFileLevel"})}),"\n",(0,d.jsx)(n.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"debug"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--logfiledailyrotate",children:(0,d.jsx)(n.code,{children:"--logFileDailyRotate"})}),"\n",(0,d.jsx)(n.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"5"})]}),"\n",(0,d.jsx)(n.h4,{id:"--rest",children:(0,d.jsx)(n.code,{children:"--rest"})}),"\n",(0,d.jsx)(n.p,{children:"Enable/disable HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--restnamespace",children:(0,d.jsx)(n.code,{children:"--rest.namespace"})}),"\n",(0,d.jsx)(n.p,{children:"Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsx)(n.p,{children:'choices: "beacon", "config", "debug", "events", "lightclient", "lodestar", "node", "proof", "validator", "*"'}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'["beacon","config","debug","events","node","validator","lightclient"]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--restcors",children:(0,d.jsx)(n.code,{children:"--rest.cors"})}),"\n",(0,d.jsx)(n.p,{children:"Configures the Access-Control-Allow-Origin CORS header for HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"*"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--restaddress",children:(0,d.jsx)(n.code,{children:"--rest.address"})}),"\n",(0,d.jsx)(n.p,{children:"Set host for HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--restport",children:(0,d.jsx)(n.code,{children:"--rest.port"})}),"\n",(0,d.jsx)(n.p,{children:"Set port for HTTP API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"9596"})]}),"\n",(0,d.jsx)(n.h4,{id:"--restswaggerui",children:(0,d.jsx)(n.code,{children:"--rest.swaggerUI"})}),"\n",(0,d.jsx)(n.p,{children:"Enable Swagger UI for API exploration at http://{address}:{port}/documentation"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--suggestedfeerecipient",children:(0,d.jsx)(n.code,{children:"--suggestedFeeRecipient"})}),"\n",(0,d.jsxs)(n.p,{children:["Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$) in case validator fails to update for a validator index before calling ",(0,d.jsx)(n.code,{children:"produceBlock"}),"."]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"0x0000000000000000000000000000000000000000"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--emitpayloadattributes",children:(0,d.jsx)(n.code,{children:"--emitPayloadAttributes"})}),"\n",(0,d.jsxs)(n.p,{children:["Flag to SSE emit execution ",(0,d.jsx)(n.code,{children:"payloadAttributes"})," before every slot"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--chainarchiveblobepochs",children:(0,d.jsx)(n.code,{children:"--chain.archiveBlobEpochs"})}),"\n",(0,d.jsx)(n.p,{children:"Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--eth1",children:(0,d.jsx)(n.code,{children:"--eth1"})}),"\n",(0,d.jsx)(n.p,{children:"Whether to follow the eth1 chain"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--eth1providerurls",children:(0,d.jsx)(n.code,{children:"--eth1.providerUrls"})}),"\n",(0,d.jsx)(n.p,{children:"Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "http://localhost:8545" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionurls",children:(0,d.jsx)(n.code,{children:"--execution.urls"})}),"\n",(0,d.jsx)(n.p,{children:"Urls to execution client engine API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "http://localhost:8551" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--executiontimeout",children:(0,d.jsx)(n.code,{children:"--execution.timeout"})}),"\n",(0,d.jsx)(n.p,{children:"Timeout in milliseconds for execution engine API HTTP client"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"12000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionretries",children:(0,d.jsx)(n.code,{children:"--execution.retries"})}),"\n",(0,d.jsx)(n.p,{children:"Number of retries when calling execution engine API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"2"})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionretrydelay",children:(0,d.jsx)(n.code,{children:"--execution.retryDelay"})}),"\n",(0,d.jsx)(n.p,{children:"Delay time in milliseconds between retries when retrying calls to the execution engine API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"2000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--executionenginemock",children:(0,d.jsx)(n.code,{children:"--execution.engineMock"})}),"\n",(0,d.jsx)(n.p,{children:"Set the execution engine to mock mode (development only)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--jwtsecret",children:(0,d.jsx)(n.code,{children:"--jwtSecret"})}),"\n",(0,d.jsx)(n.p,{children:"File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--jwtid",children:(0,d.jsx)(n.code,{children:"--jwtId"})}),"\n",(0,d.jsx)(n.p,{children:"An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builder",children:(0,d.jsx)(n.code,{children:"--builder"})}),"\n",(0,d.jsx)(n.p,{children:"Enable builder interface"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderurl",children:(0,d.jsx)(n.code,{children:"--builder.url"})}),"\n",(0,d.jsx)(n.p,{children:"Url hosting the builder API"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"http://localhost:8661"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--buildertimeout",children:(0,d.jsx)(n.code,{children:"--builder.timeout"})}),"\n",(0,d.jsx)(n.p,{children:"Timeout in milliseconds for builder API HTTP client"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"12000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderfaultinspectionwindow",children:(0,d.jsx)(n.code,{children:"--builder.faultInspectionWindow"})}),"\n",(0,d.jsx)(n.p,{children:"Window to inspect missed slots for enabling/disabling builder circuit breaker"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--builderallowedfaults",children:(0,d.jsx)(n.code,{children:"--builder.allowedFaults"})}),"\n",(0,d.jsxs)(n.p,{children:["Number of missed slots allowed in the ",(0,d.jsx)(n.code,{children:"faultInspectionWindow"})," for builder circuit"]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--metrics",children:(0,d.jsx)(n.code,{children:"--metrics"})}),"\n",(0,d.jsx)(n.p,{children:"Enable the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsx)(n.h4,{id:"--metricsport",children:(0,d.jsx)(n.code,{children:"--metrics.port"})}),"\n",(0,d.jsx)(n.p,{children:"Listen TCP port for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"8008"})]}),"\n",(0,d.jsx)(n.h4,{id:"--metricsaddress",children:(0,d.jsx)(n.code,{children:"--metrics.address"})}),"\n",(0,d.jsx)(n.p,{children:"Listen address for the Prometheus metrics HTTP server"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"127.0.0.1"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--monitoringendpoint",children:(0,d.jsx)(n.code,{children:"--monitoring.endpoint"})}),"\n",(0,d.jsx)(n.p,{children:"Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in)"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--monitoringinterval",children:(0,d.jsx)(n.code,{children:"--monitoring.interval"})}),"\n",(0,d.jsx)(n.p,{children:"Interval in milliseconds between sending client stats to the remote service"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"60000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--discv5",children:(0,d.jsx)(n.code,{children:"--discv5"})}),"\n",(0,d.jsx)(n.p,{children:"Enable discv5"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"true"})]}),"\n",(0,d.jsx)(n.h4,{id:"--listenaddress",children:(0,d.jsx)(n.code,{children:"--listenAddress"})}),"\n",(0,d.jsx)(n.p,{children:"The IPv4 address to listen for p2p UDP and TCP connections"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'"0.0.0.0"'})]}),"\n",(0,d.jsx)(n.h4,{id:"--port",children:(0,d.jsx)(n.code,{children:"--port"})}),"\n",(0,d.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"9000"})]}),"\n",(0,d.jsx)(n.h4,{id:"--discoveryport",children:(0,d.jsx)(n.code,{children:"--discoveryPort"})}),"\n",(0,d.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,d.jsx)(n.code,{children:"port"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"port"})]}),"\n",(0,d.jsx)(n.h4,{id:"--listenaddress6",children:(0,d.jsx)(n.code,{children:"--listenAddress6"})}),"\n",(0,d.jsx)(n.p,{children:"The IPv6 address to listen for p2p UDP and TCP connections"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--port6",children:(0,d.jsx)(n.code,{children:"--port6"})}),"\n",(0,d.jsx)(n.p,{children:"The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag."}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"9090"})]}),"\n",(0,d.jsx)(n.h4,{id:"--discoveryport6",children:(0,d.jsx)(n.code,{children:"--discoveryPort6"})}),"\n",(0,d.jsxs)(n.p,{children:["The UDP port that discovery will listen on. Defaults to ",(0,d.jsx)(n.code,{children:"port6"})]}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"port6"})]}),"\n",(0,d.jsx)(n.h4,{id:"--bootnodes",children:(0,d.jsx)(n.code,{children:"--bootnodes"})}),"\n",(0,d.jsx)(n.p,{children:"Bootnodes for discv5 discovery"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string[]"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:'[ "[]" ]'})]}),"\n",(0,d.jsx)(n.h4,{id:"--targetpeers",children:(0,d.jsx)(n.code,{children:"--targetPeers"})}),"\n",(0,d.jsx)(n.p,{children:"The target connected peers. Above this number peers will be disconnected"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"100"})]}),"\n",(0,d.jsx)(n.h4,{id:"--subscribeallsubnets",children:(0,d.jsx)(n.code,{children:"--subscribeAllSubnets"})}),"\n",(0,d.jsx)(n.p,{children:"Subscribe to all subnets regardless of validator count"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--disablepeerscoring",children:(0,d.jsx)(n.code,{children:"--disablePeerScoring"})}),"\n",(0,d.jsx)(n.p,{children:"Disable peer scoring, used for testing on devnets"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--mdns",children:(0,d.jsx)(n.code,{children:"--mdns"})}),"\n",(0,d.jsx)(n.p,{children:"Enable mdns local peer discovery"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]}),"\n",(0,d.jsxs)(n.p,{children:["default: ",(0,d.jsx)(n.code,{children:"false"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrip",children:(0,d.jsx)(n.code,{children:"--enr.ip"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR IP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrtcp",children:(0,d.jsx)(n.code,{children:"--enr.tcp"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR TCP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrudp",children:(0,d.jsx)(n.code,{children:"--enr.udp"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR UDP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrip6",children:(0,d.jsx)(n.code,{children:"--enr.ip6"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR IPv6 entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"string"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrtcp6",children:(0,d.jsx)(n.code,{children:"--enr.tcp6"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR (IPv6-specific) TCP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--enrudp6",children:(0,d.jsx)(n.code,{children:"--enr.udp6"})}),"\n",(0,d.jsx)(n.p,{children:"Override ENR (IPv6-specific) UDP entry"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"number"})]}),"\n",(0,d.jsx)(n.h4,{id:"--nat",children:(0,d.jsx)(n.code,{children:"--nat"})}),"\n",(0,d.jsx)(n.p,{children:"Allow configuration of non-local addresses"}),"\n",(0,d.jsxs)(n.p,{children:["type: ",(0,d.jsx)(n.code,{children:"boolean"})]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>s});var d=i(6540);const c={},l=d.createContext(c);function r(e){const n=d.useContext(l);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),d.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.81ce2695.js b/assets/js/935f2afb.81ce2695.js deleted file mode 100644 index cd9b9fb30874..000000000000 --- a/assets/js/935f2afb.81ce2695.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Home","href":"/lodestar/","docId":"index","unlisted":false},{"type":"link","label":"Introduction","href":"/lodestar/introduction","docId":"introduction","unlisted":false},{"type":"link","label":"Security Policy","href":"/lodestar/security","docId":"security","unlisted":false},{"type":"category","label":"Run A Node","collapsed":false,"items":[{"type":"link","label":"Quick Start","href":"/lodestar/run/getting-started/quick-start","docId":"run/getting-started/quick-start","unlisted":false},{"type":"link","label":"Installation","href":"/lodestar/run/getting-started/installation","docId":"run/getting-started/installation","unlisted":false},{"type":"category","label":"Beacon node","items":[{"type":"link","label":"Starting a Node","href":"/lodestar/run/beacon-management/starting-a-node","docId":"run/beacon-management/starting-a-node","unlisted":false},{"type":"link","label":"CLI Reference","href":"/lodestar/run/beacon-management/beacon-cli","docId":"run/beacon-management/beacon-cli","unlisted":false},{"type":"link","label":"Data Retention","href":"/lodestar/run/beacon-management/data-retention","docId":"run/beacon-management/data-retention","unlisted":false},{"type":"link","label":"Networking","href":"/lodestar/run/beacon-management/networking","docId":"run/beacon-management/networking","unlisted":false},{"type":"link","label":"MEV and Builder Integration","href":"/lodestar/run/beacon-management/mev-and-builder-integration","docId":"run/beacon-management/mev-and-builder-integration","unlisted":false},{"type":"link","label":"Syncing","href":"/lodestar/run/beacon-management/syncing","docId":"run/beacon-management/syncing","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Validator Client","items":[{"type":"link","label":"Starting a Validator Client","href":"/lodestar/run/validator-management/vc-configuration","docId":"run/validator-management/vc-configuration","unlisted":false},{"type":"link","label":"CLI Reference","href":"/lodestar/run/validator-management/validator-cli","docId":"run/validator-management/validator-cli","unlisted":false},{"type":"link","label":"External Signer","href":"/lodestar/run/validator-management/external-signer","docId":"run/validator-management/external-signer","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Logging and Metrics","items":[{"type":"link","label":"Prometheus and Grafana","href":"/lodestar/run/logging-and-metrics/prometheus-grafana","docId":"run/logging-and-metrics/prometheus-grafana","unlisted":false},{"type":"link","label":"Client monitoring","href":"/lodestar/run/logging-and-metrics/client-monitoring","docId":"run/logging-and-metrics/client-monitoring","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Discv5 Bootnode","items":[{"type":"link","label":"CLI Reference","href":"/lodestar/run/bootnode/bootnode-cli","docId":"run/bootnode/bootnode-cli","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsible":true},{"type":"category","label":"Developer Tools","collapsed":false,"items":[{"type":"category","label":"Light Client","items":[{"type":"link","label":"Getting Started","href":"/lodestar/libraries/lightclient-prover/lightclient","docId":"libraries/lightclient-prover/lightclient","unlisted":false},{"type":"link","label":"CLI Reference","href":"/lodestar/libraries/lightclient-prover/lightclient-cli","docId":"libraries/lightclient-prover/lightclient-cli","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Prover","items":[{"type":"link","label":"Getting Started","href":"/lodestar/libraries/lightclient-prover/prover","docId":"libraries/lightclient-prover/prover","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsible":true},{"type":"link","label":"Supporting Libraries","href":"/lodestar/supporting-libraries/","docId":"supporting-libraries/index","unlisted":false},{"type":"category","label":"Contributing","collapsed":false,"items":[{"type":"link","label":"Getting Started","href":"/lodestar/contribution/getting-started","docId":"contribution/getting-started","unlisted":false},{"type":"category","label":"Advanced Topics","items":[{"type":"link","label":"Setting Up a Testnet","href":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","docId":"contribution/advanced-topics/setting-up-a-testnet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Dependency Graph","href":"/lodestar/contribution/depgraph","docId":"contribution/depgraph","unlisted":false},{"type":"category","label":"Development Tools","items":[{"type":"link","label":"CLI Reference","href":"/lodestar/contribution/dev-cli","docId":"contribution/dev-cli","unlisted":false},{"type":"link","label":"Debugging","href":"/lodestar/contribution/tools/debugging","docId":"contribution/tools/debugging","unlisted":false},{"type":"link","label":"Flame Graphs","href":"/lodestar/contribution/tools/flamegraphs","docId":"contribution/tools/flamegraphs","unlisted":false},{"type":"link","label":"Heap Dumps","href":"/lodestar/contribution/tools/heap-dumps","docId":"contribution/tools/heap-dumps","unlisted":false},{"type":"link","label":"Core Dumps","href":"/lodestar/contribution/tools/core-dumps","docId":"contribution/tools/core-dumps","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Testing","items":[{"type":"link","label":"Testing","href":"/lodestar/contribution/testing/","docId":"contribution/testing/index","unlisted":false},{"type":"link","label":"End-To-End Tests","href":"/lodestar/contribution/testing/end-to-end-tests","docId":"contribution/testing/end-to-end-tests","unlisted":false},{"type":"link","label":"Integration Tests","href":"/lodestar/contribution/testing/integration-tests","docId":"contribution/testing/integration-tests","unlisted":false},{"type":"link","label":"Performance Tests","href":"/lodestar/contribution/testing/performance-tests","docId":"contribution/testing/performance-tests","unlisted":false},{"type":"link","label":"Simulation Tests","href":"/lodestar/contribution/testing/simulation-tests","docId":"contribution/testing/simulation-tests","unlisted":false},{"type":"link","label":"Specification Tests","href":"/lodestar/contribution/testing/spec-tests","docId":"contribution/testing/spec-tests","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsible":true},{"type":"link","label":"Frequently Asked Questions","href":"/lodestar/faqs","docId":"faqs","unlisted":false}]},"docs":{"contribution/advanced-topics/block-exploration":{"id":"contribution/advanced-topics/block-exploration","title":"Block Exploration","description":""},"contribution/advanced-topics/doppelganger-detection":{"id":"contribution/advanced-topics/doppelganger-detection","title":"Doppelganger Detection","description":""},"contribution/advanced-topics/migrating-from-other-clients":{"id":"contribution/advanced-topics/migrating-from-other-clients","title":"Migration From Other Clients","description":""},"contribution/advanced-topics/setting-up-a-testnet":{"id":"contribution/advanced-topics/setting-up-a-testnet","title":"Setting Up a Testnet","description":"To quickly test and run Lodestar we recommend starting a local testnet. We recommend a simple configuration of two beacon nodes with multiple validators. The dev scripts can used for simplicity but below instructions provide more insights on how it works and include details about different configurations.","sidebar":"tutorialSidebar"},"contribution/advanced-topics/slashing-protection":{"id":"contribution/advanced-topics/slashing-protection","title":"Slashing Protection","description":""},"contribution/bug-reports":{"id":"contribution/bug-reports","title":"bug-reports","description":""},"contribution/depgraph":{"id":"contribution/depgraph","title":"Dependency Graph","description":"Lodestar Dependency Graph","sidebar":"tutorialSidebar"},"contribution/dev-cli":{"id":"contribution/dev-cli","title":"CLI Reference","description":"Quickly bootstrap a beacon node and multiple validators. Use for development and testing","sidebar":"tutorialSidebar"},"contribution/getting-started":{"id":"contribution/getting-started","title":"Contribution Guidelines","description":"Thanks for your interest in contributing to Lodestar. It\'s people like you that push the Ethereum ecosystem forward.","sidebar":"tutorialSidebar"},"contribution/pr-submission":{"id":"contribution/pr-submission","title":"pr-submission","description":""},"contribution/repo":{"id":"contribution/repo","title":"repo","description":""},"contribution/testing/end-to-end-tests":{"id":"contribution/testing/end-to-end-tests","title":"End-To-End Tests","description":"Check back soon for more information!! We are in the process of updating our docs.","sidebar":"tutorialSidebar"},"contribution/testing/index":{"id":"contribution/testing/index","title":"Testing","description":"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo.","sidebar":"tutorialSidebar"},"contribution/testing/integration-tests":{"id":"contribution/testing/integration-tests","title":"Integration Tests","description":"The following tests are found in packages/beacon-node","sidebar":"tutorialSidebar"},"contribution/testing/performance-tests":{"id":"contribution/testing/performance-tests","title":"Performance Tests","description":"Check back soon for more information!! We are in the process of updating our docs.","sidebar":"tutorialSidebar"},"contribution/testing/simulation-tests":{"id":"contribution/testing/simulation-tests","title":"Simulation Tests","description":"\\"Sim\\" testing for Lodestar is the most comprehensive, and complex, testing that is run. The goal is to fully simulate a testnet and to actuate the code in a way that closely mimics what will happen when turning on Lodestar in the wild. This is a very complex task and requires a lot of moving parts to work together. The following sections will describe the various components and how they work together.","sidebar":"tutorialSidebar"},"contribution/testing/spec-tests":{"id":"contribution/testing/spec-tests","title":"Specification Tests","description":"Check back soon for more information!! We are in the process of updating our docs.","sidebar":"tutorialSidebar"},"contribution/testing/unit-tests":{"id":"contribution/testing/unit-tests","title":"Unit Tests","description":"Check back soon for more information!! We are in the process of updating our docs."},"contribution/tools/core-dumps":{"id":"contribution/tools/core-dumps","title":"Core Dumps","description":"Core dump analysis is some ninja level stuff. Once you get the hang of it you will feel like you have super powers. It will up your game to a whole new level because you will be able to debug issues that seemed impossible before. Post-crash analysis is a very powerful tool to have in your tool belt. A core dump has all of the objects in memory as well as all of the stack frame information at the exact moment the dump was taken, usually when a hard crash occurs.","sidebar":"tutorialSidebar"},"contribution/tools/debugging":{"id":"contribution/tools/debugging","title":"Debugging","description":"This page describes different approaches for debugging Lodestar.","sidebar":"tutorialSidebar"},"contribution/tools/flamegraphs":{"id":"contribution/tools/flamegraphs","title":"Flame Graphs","description":"This guide assumes a running instance of Lodestar and will walk through how to generate a flamegraph for the process while running on Linux. While it is possible to run Lodestar in a number of ways, for performance profiling it is recommended to not use Dockerized implementations. It is best to run Lodestar as a service on a Linux machine. Follow the Lodestar docs to get the service installed and running. Then come back here when you are ready to generate the flamegraph.","sidebar":"tutorialSidebar"},"contribution/tools/heap-dumps":{"id":"contribution/tools/heap-dumps","title":"Heap Dumps","description":"There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap\'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.","sidebar":"tutorialSidebar"},"contribution/tools/perf":{"id":"contribution/tools/perf","title":"perf","description":""},"faqs":{"id":"faqs","title":"Frequently Asked Questions","description":"This section of the documentation will cover common questions and encounters often asked by users and developers.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Home","description":"lodestar logo","sidebar":"tutorialSidebar"},"introduction":{"id":"introduction","title":"Introduction","description":"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the most actively used blockchain. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards and has been actively working in the Ethereum space ever since. We are proud to develop Lodestar and to present this documentation as a resource for the Ethereum community.","sidebar":"tutorialSidebar"},"libraries/api/using-the-api":{"id":"libraries/api/using-the-api","title":"using-the-api","description":""},"libraries/lightclient-prover/lightclient":{"id":"libraries/lightclient-prover/lightclient","title":"Lodestar Light Client","description":"Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state.","sidebar":"tutorialSidebar"},"libraries/lightclient-prover/lightclient-cli":{"id":"libraries/lightclient-prover/lightclient-cli","title":"CLI Reference","description":"Run lightclient","sidebar":"tutorialSidebar"},"libraries/lightclient-prover/prover":{"id":"libraries/lightclient-prover/prover","title":"Lodestar Prover","description":"Discord","sidebar":"tutorialSidebar"},"reference/cli":{"id":"reference/cli","title":"Page relocated","description":"**Welcome! This page has been moved. Please checkout our new docs layout from the Table of Contents! Below are some helpful links to the CLI pages that were split out from this original document**"},"run/beacon-management/beacon-cli":{"id":"run/beacon-management/beacon-cli","title":"CLI Reference","description":"Run a beacon chain node","sidebar":"tutorialSidebar"},"run/beacon-management/data-retention":{"id":"run/beacon-management/data-retention","title":"Data Retention","description":"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information.","sidebar":"tutorialSidebar"},"run/beacon-management/mev-and-builder-integration":{"id":"run/beacon-management/mev-and-builder-integration","title":"MEV and Builder Integration","description":"MEV is a term that refers to the bundling of transactions in one particular order to extract (mostly) arbitrage opportunities on the dApps and decentralized exchanges.","sidebar":"tutorialSidebar"},"run/beacon-management/networking":{"id":"run/beacon-management/networking","title":"Networking","description":"Lodestar will automatically connect to peers on the network. Peers are found through the discv5 protocol and once peers are established communications happen via gossipsub over libp2p. While not necessary, having a basic understanding of how the various protocols and transports work will help with debugging and troubleshooting as some of the more common challenges come up with firewalls and NAT traversal.","sidebar":"tutorialSidebar"},"run/beacon-management/starting-a-node":{"id":"run/beacon-management/starting-a-node","title":"Starting a Node","description":"The following instructions are required to setup and run a Lodestar beacon node.","sidebar":"tutorialSidebar"},"run/beacon-management/syncing":{"id":"run/beacon-management/syncing","title":"Syncing","description":"Syncing an Ethereum node involves obtaining a copy of the blockchain data from other peers in the network to reach a consistent state. This process is crucial for new nodes or nodes that have been offline and need to catch up with the network\'s current state. Syncing can be performed for both the execution layer and the beacon chain, although the focus here will be primarily on the beacon chain.","sidebar":"tutorialSidebar"},"run/bootnode/bootnode-cli":{"id":"run/bootnode/bootnode-cli","title":"CLI Reference","description":"Run a discv5 bootnode. This will NOT perform any beacon node functions, rather, it will run a discv5 service that allows nodes on the network to discover one another.","sidebar":"tutorialSidebar"},"run/getting-started/installation":{"id":"run/getting-started/installation","title":"Installation","description":"Binaries","sidebar":"tutorialSidebar"},"run/getting-started/quick-start":{"id":"run/getting-started/quick-start","title":"Quick Start","description":"Lodestar Quickstart","sidebar":"tutorialSidebar"},"run/logging-and-metrics/client-monitoring":{"id":"run/logging-and-metrics/client-monitoring","title":"Client monitoring","description":"Lodestar has the ability to send client stats to a remote service for collection.","sidebar":"tutorialSidebar"},"run/logging-and-metrics/dashboards":{"id":"run/logging-and-metrics/dashboards","title":"dashboards","description":""},"run/logging-and-metrics/log-management":{"id":"run/logging-and-metrics/log-management","title":"Log Management","description":"Check back soon for more information!!"},"run/logging-and-metrics/metrics-management":{"id":"run/logging-and-metrics/metrics-management","title":"metrics-management","description":""},"run/logging-and-metrics/prometheus-grafana":{"id":"run/logging-and-metrics/prometheus-grafana","title":"Prometheus and Grafana","description":"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it\'s the recommended way to make sure that your node and validator(s) are performing correctly.","sidebar":"tutorialSidebar"},"run/validator-management/external-signer":{"id":"run/validator-management/external-signer","title":"External Signer","description":"Lodestar supports connecting an external signing server like Web3Signer, Diva,","sidebar":"tutorialSidebar"},"run/validator-management/key-management":{"id":"run/validator-management/key-management","title":"key-management","description":""},"run/validator-management/multiple-and-fallback-validation":{"id":"run/validator-management/multiple-and-fallback-validation","title":"multiple-and-fallback-validation","description":""},"run/validator-management/validator-cli":{"id":"run/validator-management/validator-cli","title":"CLI Reference","description":"Run one or multiple validator clients","sidebar":"tutorialSidebar"},"run/validator-management/vc-configuration":{"id":"run/validator-management/vc-configuration","title":"Starting a Validator Client","description":"The following instructions are for stakers utilizing the Lodestar validator client.","sidebar":"tutorialSidebar"},"run/validator-management/withdrawals":{"id":"run/validator-management/withdrawals","title":"withdrawals","description":""},"security":{"id":"security","title":"Security Policy","description":"Supported Versions","sidebar":"tutorialSidebar"},"supporting-libraries/index":{"id":"supporting-libraries/index","title":"Supporting Libraries","description":"Networking","sidebar":"tutorialSidebar"},"supporting-libraries/libraries":{"id":"supporting-libraries/libraries","title":"Lodestar libraries","description":"The Lodestar project is divided into Typescript packages that can be used independently of the CLI. These packages span the breadth of the Ethereum Consensus layer, and are perfect for Typescript developers looking to build around Ethereum."},"trouble-shooting":{"id":"trouble-shooting","title":"Trouble Shooting","description":""}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.fb2d8173.js b/assets/js/935f2afb.fb2d8173.js new file mode 100644 index 000000000000..67e8128ddc48 --- /dev/null +++ b/assets/js/935f2afb.fb2d8173.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[8581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Home","href":"/lodestar/","docId":"index","unlisted":false},{"type":"link","label":"Introduction","href":"/lodestar/introduction","docId":"introduction","unlisted":false},{"type":"link","label":"Security Policy","href":"/lodestar/security","docId":"security","unlisted":false},{"type":"category","label":"Run A Node","collapsed":false,"items":[{"type":"link","label":"Install Options","href":"/lodestar/run/getting-started/installation","docId":"run/getting-started/installation","unlisted":false},{"type":"category","label":"Quick Start","items":[{"type":"link","label":"Lodestar Quick Start Scripts","href":"/lodestar/run/getting-started/quick-start","docId":"run/getting-started/quick-start","unlisted":false},{"type":"link","label":"Quick Start Custom Setup Guide","href":"/lodestar/run/getting-started/quick-start-custom-guide","docId":"run/getting-started/quick-start-custom-guide","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Beacon Node","items":[{"type":"link","label":"Starting a Node","href":"/lodestar/run/beacon-management/starting-a-node","docId":"run/beacon-management/starting-a-node","unlisted":false},{"type":"link","label":"CLI Reference","href":"/lodestar/run/beacon-management/beacon-cli","docId":"run/beacon-management/beacon-cli","unlisted":false},{"type":"link","label":"Data Retention","href":"/lodestar/run/beacon-management/data-retention","docId":"run/beacon-management/data-retention","unlisted":false},{"type":"link","label":"Networking","href":"/lodestar/run/beacon-management/networking","docId":"run/beacon-management/networking","unlisted":false},{"type":"link","label":"MEV and Builder Integration","href":"/lodestar/run/beacon-management/mev-and-builder-integration","docId":"run/beacon-management/mev-and-builder-integration","unlisted":false},{"type":"link","label":"Syncing","href":"/lodestar/run/beacon-management/syncing","docId":"run/beacon-management/syncing","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Validator Client","items":[{"type":"link","label":"Starting a Validator Client","href":"/lodestar/run/validator-management/vc-configuration","docId":"run/validator-management/vc-configuration","unlisted":false},{"type":"link","label":"CLI Reference","href":"/lodestar/run/validator-management/validator-cli","docId":"run/validator-management/validator-cli","unlisted":false},{"type":"link","label":"External Signer","href":"/lodestar/run/validator-management/external-signer","docId":"run/validator-management/external-signer","unlisted":false},{"type":"link","label":"Proposer Configuration","href":"/lodestar/run/validator-management/proposer-config","docId":"run/validator-management/proposer-config","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Logging and Metrics","items":[{"type":"link","label":"Prometheus and Grafana Setup","href":"/lodestar/run/logging-and-metrics/prometheus-grafana","docId":"run/logging-and-metrics/prometheus-grafana","unlisted":false},{"type":"link","label":"Client Monitoring","href":"/lodestar/run/logging-and-metrics/client-monitoring","docId":"run/logging-and-metrics/client-monitoring","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Discv5 Bootnode","items":[{"type":"link","label":"CLI Reference","href":"/lodestar/run/bootnode/bootnode-cli","docId":"run/bootnode/bootnode-cli","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsible":true},{"type":"category","label":"Developer Tools","collapsed":false,"items":[{"type":"category","label":"Light Client","items":[{"type":"link","label":"Getting Started","href":"/lodestar/libraries/lightclient-prover/lightclient","docId":"libraries/lightclient-prover/lightclient","unlisted":false},{"type":"link","label":"CLI Reference","href":"/lodestar/libraries/lightclient-prover/lightclient-cli","docId":"libraries/lightclient-prover/lightclient-cli","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Prover","items":[{"type":"link","label":"Getting Started","href":"/lodestar/libraries/lightclient-prover/prover","docId":"libraries/lightclient-prover/prover","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsible":true},{"type":"link","label":"Supporting Libraries","href":"/lodestar/supporting-libraries/","docId":"supporting-libraries/index","unlisted":false},{"type":"category","label":"Contributing","collapsed":false,"items":[{"type":"link","label":"Getting Started","href":"/lodestar/contribution/getting-started","docId":"contribution/getting-started","unlisted":false},{"type":"category","label":"Advanced Topics","items":[{"type":"link","label":"Setting Up a Testnet","href":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","docId":"contribution/advanced-topics/setting-up-a-testnet","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Dependency Graph","href":"/lodestar/contribution/depgraph","docId":"contribution/depgraph","unlisted":false},{"type":"category","label":"Development Tools","items":[{"type":"link","label":"CLI Reference","href":"/lodestar/contribution/dev-cli","docId":"contribution/dev-cli","unlisted":false},{"type":"link","label":"Debugging","href":"/lodestar/contribution/tools/debugging","docId":"contribution/tools/debugging","unlisted":false},{"type":"link","label":"Flame Graphs","href":"/lodestar/contribution/tools/flamegraphs","docId":"contribution/tools/flamegraphs","unlisted":false},{"type":"link","label":"Heap Dumps","href":"/lodestar/contribution/tools/heap-dumps","docId":"contribution/tools/heap-dumps","unlisted":false},{"type":"link","label":"Core Dumps","href":"/lodestar/contribution/tools/core-dumps","docId":"contribution/tools/core-dumps","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Testing","items":[{"type":"link","label":"Testing","href":"/lodestar/contribution/testing/","docId":"contribution/testing/index","unlisted":false},{"type":"link","label":"End-To-End Tests","href":"/lodestar/contribution/testing/end-to-end-tests","docId":"contribution/testing/end-to-end-tests","unlisted":false},{"type":"link","label":"Integration Tests","href":"/lodestar/contribution/testing/integration-tests","docId":"contribution/testing/integration-tests","unlisted":false},{"type":"link","label":"Performance Tests","href":"/lodestar/contribution/testing/performance-tests","docId":"contribution/testing/performance-tests","unlisted":false},{"type":"link","label":"Simulation Tests","href":"/lodestar/contribution/testing/simulation-tests","docId":"contribution/testing/simulation-tests","unlisted":false},{"type":"link","label":"Specification Tests","href":"/lodestar/contribution/testing/spec-tests","docId":"contribution/testing/spec-tests","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsible":true},{"type":"link","label":"Frequently Asked Questions","href":"/lodestar/faqs","docId":"faqs","unlisted":false}]},"docs":{"contribution/advanced-topics/block-exploration":{"id":"contribution/advanced-topics/block-exploration","title":"Block Exploration","description":""},"contribution/advanced-topics/doppelganger-detection":{"id":"contribution/advanced-topics/doppelganger-detection","title":"Doppelganger Detection","description":""},"contribution/advanced-topics/migrating-from-other-clients":{"id":"contribution/advanced-topics/migrating-from-other-clients","title":"Migration From Other Clients","description":""},"contribution/advanced-topics/setting-up-a-testnet":{"id":"contribution/advanced-topics/setting-up-a-testnet","title":"Setting Up a Testnet","description":"To quickly test and run Lodestar we recommend starting a local testnet. We recommend a simple configuration of two beacon nodes with multiple validators. The dev scripts can used for simplicity but below instructions provide more insights on how it works and include details about different configurations.","sidebar":"tutorialSidebar"},"contribution/advanced-topics/slashing-protection":{"id":"contribution/advanced-topics/slashing-protection","title":"Slashing Protection","description":""},"contribution/bug-reports":{"id":"contribution/bug-reports","title":"bug-reports","description":""},"contribution/depgraph":{"id":"contribution/depgraph","title":"Dependency Graph","description":"Lodestar Dependency Graph","sidebar":"tutorialSidebar"},"contribution/dev-cli":{"id":"contribution/dev-cli","title":"CLI Reference","description":"Quickly bootstrap a beacon node and multiple validators. Use for development and testing","sidebar":"tutorialSidebar"},"contribution/getting-started":{"id":"contribution/getting-started","title":"Contribution Guidelines","description":"Thanks for your interest in contributing to Lodestar. It\'s people like you that push the Ethereum ecosystem forward.","sidebar":"tutorialSidebar"},"contribution/pr-submission":{"id":"contribution/pr-submission","title":"pr-submission","description":""},"contribution/repo":{"id":"contribution/repo","title":"repo","description":""},"contribution/testing/end-to-end-tests":{"id":"contribution/testing/end-to-end-tests","title":"End-To-End Tests","description":"Check back soon for more information!! We are in the process of updating our docs.","sidebar":"tutorialSidebar"},"contribution/testing/index":{"id":"contribution/testing/index","title":"Testing","description":"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo.","sidebar":"tutorialSidebar"},"contribution/testing/integration-tests":{"id":"contribution/testing/integration-tests","title":"Integration Tests","description":"The following tests are found in packages/beacon-node","sidebar":"tutorialSidebar"},"contribution/testing/performance-tests":{"id":"contribution/testing/performance-tests","title":"Performance Tests","description":"Check back soon for more information!! We are in the process of updating our docs.","sidebar":"tutorialSidebar"},"contribution/testing/simulation-tests":{"id":"contribution/testing/simulation-tests","title":"Simulation Tests","description":"\\"Sim\\" testing for Lodestar is the most comprehensive, and complex, testing that is run. The goal is to fully simulate a testnet and to actuate the code in a way that closely mimics what will happen when turning on Lodestar in the wild. This is a very complex task and requires a lot of moving parts to work together. The following sections will describe the various components and how they work together.","sidebar":"tutorialSidebar"},"contribution/testing/spec-tests":{"id":"contribution/testing/spec-tests","title":"Specification Tests","description":"Check back soon for more information!! We are in the process of updating our docs.","sidebar":"tutorialSidebar"},"contribution/testing/unit-tests":{"id":"contribution/testing/unit-tests","title":"Unit Tests","description":"Check back soon for more information!! We are in the process of updating our docs."},"contribution/tools/core-dumps":{"id":"contribution/tools/core-dumps","title":"Core Dumps","description":"Core dump analysis is some ninja level stuff. Once you get the hang of it you will feel like you have super powers. It will up your game to a whole new level because you will be able to debug issues that seemed impossible before. Post-crash analysis is a very powerful tool to have in your tool belt. A core dump has all of the objects in memory as well as all of the stack frame information at the exact moment the dump was taken, usually when a hard crash occurs.","sidebar":"tutorialSidebar"},"contribution/tools/debugging":{"id":"contribution/tools/debugging","title":"Debugging","description":"This page describes different approaches for debugging Lodestar.","sidebar":"tutorialSidebar"},"contribution/tools/flamegraphs":{"id":"contribution/tools/flamegraphs","title":"Flame Graphs","description":"This guide assumes a running instance of Lodestar and will walk through how to generate a flamegraph for the process while running on Linux. While it is possible to run Lodestar in a number of ways, for performance profiling it is recommended to not use Dockerized implementations. It is best to run Lodestar as a service on a Linux machine. Follow the Lodestar docs to get the service installed and running. Then come back here when you are ready to generate the flamegraph.","sidebar":"tutorialSidebar"},"contribution/tools/heap-dumps":{"id":"contribution/tools/heap-dumps","title":"Heap Dumps","description":"There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap\'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.","sidebar":"tutorialSidebar"},"contribution/tools/perf":{"id":"contribution/tools/perf","title":"perf","description":""},"faqs":{"id":"faqs","title":"Frequently Asked Questions","description":"This section of the documentation will cover common questions and common encounters by users and developers.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Home","description":"lodestar logo","sidebar":"tutorialSidebar"},"introduction":{"id":"introduction","title":"Introduction","description":"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the second-largest blockchain by market capitalization. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards in 2017 and has been actively working in the Ethereum ecosystem ever since. We are proud to develop Lodestar, the only TypeScript based consensus client, and to present this documentation as a resource for the Ethereum community.","sidebar":"tutorialSidebar"},"libraries/api/using-the-api":{"id":"libraries/api/using-the-api","title":"using-the-api","description":""},"libraries/lightclient-prover/lightclient":{"id":"libraries/lightclient-prover/lightclient","title":"Lodestar Light Client","description":"Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state.","sidebar":"tutorialSidebar"},"libraries/lightclient-prover/lightclient-cli":{"id":"libraries/lightclient-prover/lightclient-cli","title":"CLI Reference","description":"Run lightclient","sidebar":"tutorialSidebar"},"libraries/lightclient-prover/prover":{"id":"libraries/lightclient-prover/prover","title":"Lodestar Prover","description":"Discord","sidebar":"tutorialSidebar"},"reference/cli":{"id":"reference/cli","title":"Page relocated","description":"**Welcome! This page has been moved. Please checkout our new docs layout from the Table of Contents! Below are some helpful links to the CLI pages that were split out from this original document**"},"run/beacon-management/beacon-cli":{"id":"run/beacon-management/beacon-cli","title":"CLI Reference","description":"Run a beacon chain node","sidebar":"tutorialSidebar"},"run/beacon-management/data-retention":{"id":"run/beacon-management/data-retention","title":"Data Retention","description":"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information.","sidebar":"tutorialSidebar"},"run/beacon-management/mev-and-builder-integration":{"id":"run/beacon-management/mev-and-builder-integration","title":"MEV and Builder Integration","description":"MEV is a term that refers to the bundling of transactions in one particular order to extract (mostly) arbitrage opportunities on the dApps and decentralized exchanges.","sidebar":"tutorialSidebar"},"run/beacon-management/networking":{"id":"run/beacon-management/networking","title":"Networking","description":"Lodestar will automatically connect to peers on the network. Peers are found through the discv5 protocol and once peers are established communications happen via gossipsub over libp2p. While not necessary, having a basic understanding of how the various protocols and transports work will help with debugging and troubleshooting as some of the more common challenges come up with firewalls and NAT traversal.","sidebar":"tutorialSidebar"},"run/beacon-management/starting-a-node":{"id":"run/beacon-management/starting-a-node","title":"Starting a Node","description":"Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal. The following instructions are required to configure and run the Lodestar beacon node. This page assumes you have already setup an Ethereum execution client.","sidebar":"tutorialSidebar"},"run/beacon-management/syncing":{"id":"run/beacon-management/syncing","title":"Syncing","description":"Syncing an Ethereum node involves obtaining a copy of the blockchain data from other peers in the network to reach a consistent state. This process is crucial for new nodes or nodes that have been offline and need to catch up with the network\'s current state. Syncing can be performed for both the execution layer and the beacon chain, although the focus here will be primarily on the beacon chain.","sidebar":"tutorialSidebar"},"run/bootnode/bootnode-cli":{"id":"run/bootnode/bootnode-cli","title":"CLI Reference","description":"Run a discv5 bootnode. This will NOT perform any beacon node functions, rather, it will run a discv5 service that allows nodes on the network to discover one another.","sidebar":"tutorialSidebar"},"run/getting-started/installation":{"id":"run/getting-started/installation","title":"Install Options","description":"Binaries","sidebar":"tutorialSidebar"},"run/getting-started/quick-start":{"id":"run/getting-started/quick-start","title":"Lodestar Quick Start Scripts","description":"In order to make things easier and quicker for all types of users to bootstrap the Lodestar consensus client with a variety of execution clients, we have come up with Lodestar Quickstart Docker scripts!","sidebar":"tutorialSidebar"},"run/getting-started/quick-start-custom-guide":{"id":"run/getting-started/quick-start-custom-guide","title":"Quick Start Custom Setup Guide","description":"This is a step-by-step guide to utilize @ChainSafe/lodestar-quickstart to setup a Ubuntu-based full Ethereum node using a local execution client and ChainSafe\'s Lodestar consensus client via Docker (the recommended method to use Lodestar for production environments). This is an adaptation of Somer Esat\'s guides for the Ethereum staking community.","sidebar":"tutorialSidebar"},"run/logging-and-metrics/client-monitoring":{"id":"run/logging-and-metrics/client-monitoring","title":"Client Monitoring","description":"Lodestar has the ability to send client stats to a remote service for collection.","sidebar":"tutorialSidebar"},"run/logging-and-metrics/prometheus-grafana":{"id":"run/logging-and-metrics/prometheus-grafana","title":"Prometheus and Grafana Setup","description":"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it\'s the recommended way to make sure that your node and validator(s) are performing correctly.","sidebar":"tutorialSidebar"},"run/validator-management/external-signer":{"id":"run/validator-management/external-signer","title":"External Signer","description":"Lodestar supports connecting an external signing server like Web3Signer, Diva,","sidebar":"tutorialSidebar"},"run/validator-management/key-management":{"id":"run/validator-management/key-management","title":"key-management","description":""},"run/validator-management/multiple-and-fallback-validation":{"id":"run/validator-management/multiple-and-fallback-validation","title":"multiple-and-fallback-validation","description":""},"run/validator-management/proposer-config":{"id":"run/validator-management/proposer-config","title":"Proposer Configuration","description":"This is an alpha feature. The feature and its format are subject to change.","sidebar":"tutorialSidebar"},"run/validator-management/validator-cli":{"id":"run/validator-management/validator-cli","title":"CLI Reference","description":"Run one or multiple validator clients","sidebar":"tutorialSidebar"},"run/validator-management/vc-configuration":{"id":"run/validator-management/vc-configuration","title":"Starting a Validator Client","description":"The following instructions are for stakers utilizing the Lodestar validator client.","sidebar":"tutorialSidebar"},"run/validator-management/withdrawals":{"id":"run/validator-management/withdrawals","title":"withdrawals","description":""},"security":{"id":"security","title":"Security Policy","description":"Supported Versions","sidebar":"tutorialSidebar"},"supporting-libraries/index":{"id":"supporting-libraries/index","title":"Supporting Libraries","description":"Networking","sidebar":"tutorialSidebar"},"supporting-libraries/libraries":{"id":"supporting-libraries/libraries","title":"Lodestar libraries","description":"The Lodestar project is divided into TypeScript packages that can be used independently of the CLI. These packages span the breadth of the Ethereum Consensus layer, and are perfect for TypeScript developers looking to build around Ethereum."}}}')}}]); \ No newline at end of file diff --git a/assets/js/97e11fef.ae70a496.js b/assets/js/97e11fef.ae70a496.js deleted file mode 100644 index 4968efc93dea..000000000000 --- a/assets/js/97e11fef.ae70a496.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[333],{3957:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>i,contentTitle:()=>s,default:()=>l,frontMatter:()=>a,metadata:()=>c,toc:()=>g});var o=t(4848),r=t(8453);const a={},s="Log Management",c={id:"run/logging-and-metrics/log-management",title:"Log Management",description:"Check back soon for more information!!",source:"@site/pages/run/logging-and-metrics/log-management.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/log-management",permalink:"/lodestar/run/logging-and-metrics/log-management",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/log-management.md",tags:[],version:"current",frontMatter:{}},i={},g=[];function m(n){const e={h1:"h1",p:"p",...(0,r.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.h1,{id:"log-management",children:"Log Management"}),"\n",(0,o.jsx)(e.p,{children:"Check back soon for more information!!"})]})}function l(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(m,{...n})}):m(n)}},8453:(n,e,t)=>{t.d(e,{R:()=>s,x:()=>c});var o=t(6540);const r={},a=o.createContext(r);function s(n){const e=o.useContext(a);return o.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function c(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),o.createElement(a.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/a542f7c7.04cfaa2e.js b/assets/js/a542f7c7.04cfaa2e.js deleted file mode 100644 index deb61b5e153e..000000000000 --- a/assets/js/a542f7c7.04cfaa2e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[6084],{9894:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var a=t(4848),r=t(8453);const o={},s="Prometheus and Grafana",i={id:"run/logging-and-metrics/prometheus-grafana",title:"Prometheus and Grafana",description:"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly.",source:"@site/pages/run/logging-and-metrics/prometheus-grafana.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/prometheus-grafana",permalink:"/lodestar/run/logging-and-metrics/prometheus-grafana",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/prometheus-grafana.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"External Signer",permalink:"/lodestar/run/validator-management/external-signer"},next:{title:"Client monitoring",permalink:"/lodestar/run/logging-and-metrics/client-monitoring"}},d={},l=[{value:"Prometheus",id:"prometheus",level:2},{value:"Grafana",id:"grafana",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"prometheus-and-grafana",children:"Prometheus and Grafana"}),"\n",(0,a.jsx)(n.p,{children:"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly."}),"\n",(0,a.jsx)(n.h2,{id:"prometheus",children:"Prometheus"}),"\n",(0,a.jsxs)(n.p,{children:["To start, download Prometheus from ",(0,a.jsx)(n.a,{href:"https://prometheus.io/download/",children:"https://prometheus.io/download/"}),".\nUnzip the downloaded .zip file and run Prometheus from its installed location with the lodestar ",(0,a.jsx)(n.code,{children:"prometheus.yml"})," passed in as the configuration file"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sh",children:"./prometheus --config.file=$dataDir/prometheus.yml\n"})}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["8008 is also the default port specified in the ",(0,a.jsx)(n.code,{children:"prometheus.yml"})," in the lodestar repository"]})}),"\n",(0,a.jsx)(n.p,{children:"Then run the Lodestar beacon node with"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sh",children:"lodestar --metrics=true --metrics.port=8008\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Navigate to ",(0,a.jsx)(n.a,{href:"http://localhost:9090/",children:"http://localhost:9090/"})," in your browser to verify that Prometheus is monitoring Lodestar"]}),"\n",(0,a.jsx)(n.h2,{id:"grafana",children:"Grafana"}),"\n",(0,a.jsxs)(n.p,{children:["Download and install Grafana from its official repository ",(0,a.jsx)(n.a,{href:"https://grafana.com/docs/grafana/latest/installation/debian/",children:"https://grafana.com/docs/grafana/latest/installation/debian/"})]}),"\n",(0,a.jsxs)(n.p,{children:["Add Prometheus as a data source to Grafana ",(0,a.jsx)(n.a,{href:"https://prometheus.io/docs/visualization/grafana/#installing",children:"https://prometheus.io/docs/visualization/grafana/#installing"})]}),"\n",(0,a.jsx)(n.p,{children:"An example of relevant metrics of interest to monitor are:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"nodejs_heap_space_size_used_bytes"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"nodejs_eventloop_lag_seconds"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"beaconchain_peers"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"beaconchain_current_slot"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"beaconchain_current_finalized_epoch"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var a=t(6540);const r={},o=a.createContext(r);function s(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a542f7c7.b97e723c.js b/assets/js/a542f7c7.b97e723c.js new file mode 100644 index 000000000000..3899cbc25f40 --- /dev/null +++ b/assets/js/a542f7c7.b97e723c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[6084],{9894:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=t(4848),a=t(8453);const o={},s="Prometheus and Grafana Setup",i={id:"run/logging-and-metrics/prometheus-grafana",title:"Prometheus and Grafana Setup",description:"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly.",source:"@site/pages/run/logging-and-metrics/prometheus-grafana.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/prometheus-grafana",permalink:"/lodestar/run/logging-and-metrics/prometheus-grafana",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/prometheus-grafana.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Proposer Configuration",permalink:"/lodestar/run/validator-management/proposer-config"},next:{title:"Client Monitoring",permalink:"/lodestar/run/logging-and-metrics/client-monitoring"}},d={},c=[{value:"Localized Docker Metrics Script",id:"localized-docker-metrics-script",level:2},{value:"Prometheus Setup",id:"prometheus-setup",level:2},{value:"Grafana Setup",id:"grafana-setup",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"prometheus-and-grafana-setup",children:"Prometheus and Grafana Setup"}),"\n",(0,r.jsx)(n.p,{children:"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly."}),"\n",(0,r.jsx)(n.h2,{id:"localized-docker-metrics-script",children:"Localized Docker Metrics Script"}),"\n",(0,r.jsxs)(n.p,{children:["The Lodestar team has setup a script which will copy the latest dashboards compiled by our team for development purposes. By utilizing the script located in ",(0,r.jsx)(n.code,{children:"/docker/docker-compose.local_dev.sh"}),", you can instantly setup the latest dockerized metrics alongside your local beacon node."]}),"\n",(0,r.jsx)(n.h2,{id:"prometheus-setup",children:"Prometheus Setup"}),"\n",(0,r.jsxs)(n.p,{children:["To start, download Prometheus from ",(0,r.jsx)(n.a,{href:"https://prometheus.io/download/",children:"https://prometheus.io/download/"}),".\nUnzip the downloaded .zip file and run Prometheus from its installed location with the lodestar ",(0,r.jsx)(n.code,{children:"prometheus.yml"})," passed in as the configuration file"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"./prometheus --config.file=$dataDir/prometheus.yml\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["8008 is also the default port specified in the ",(0,r.jsx)(n.code,{children:"prometheus.yml"})," in the lodestar repository"]})}),"\n",(0,r.jsx)(n.p,{children:"Then run the Lodestar beacon node with"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"lodestar --metrics=true --metrics.port=8008\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Navigate to ",(0,r.jsx)(n.a,{href:"http://localhost:9090/",children:"http://localhost:9090/"})," in your browser to verify that Prometheus is monitoring Lodestar"]}),"\n",(0,r.jsx)(n.h2,{id:"grafana-setup",children:"Grafana Setup"}),"\n",(0,r.jsxs)(n.p,{children:["Download and install Grafana from its official repository ",(0,r.jsx)(n.a,{href:"https://grafana.com/docs/grafana/latest/installation/debian/",children:"https://grafana.com/docs/grafana/latest/installation/debian/"})]}),"\n",(0,r.jsxs)(n.p,{children:["Add Prometheus as a data source to Grafana ",(0,r.jsx)(n.a,{href:"https://prometheus.io/docs/visualization/grafana/#installing",children:"https://prometheus.io/docs/visualization/grafana/#installing"})]}),"\n",(0,r.jsx)(n.p,{children:"An example of relevant metrics of interest to monitor are:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"nodejs_heap_space_size_used_bytes"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"nodejs_eventloop_lag_seconds"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"beaconchain_peers"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"beaconchain_current_slot"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"beaconchain_current_finalized_epoch"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var r=t(6540);const a={},o=r.createContext(a);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4496819.6816b8b7.js b/assets/js/c4496819.6816b8b7.js new file mode 100644 index 000000000000..ec7a23c6de0f --- /dev/null +++ b/assets/js/c4496819.6816b8b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[707],{9654:(e,i,l)=>{l.r(i),l.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>a,frontMatter:()=>t,metadata:()=>c,toc:()=>s});var n=l(4848),r=l(8453);const t={title:"CLI Reference"},o="lightclient CLI Command",c={id:"libraries/lightclient-prover/lightclient-cli",title:"CLI Reference",description:"Run lightclient",source:"@site/pages/libraries/lightclient-prover/lightclient-cli.md",sourceDirName:"libraries/lightclient-prover",slug:"/libraries/lightclient-prover/lightclient-cli",permalink:"/lodestar/libraries/lightclient-prover/lightclient-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/libraries/lightclient-prover/lightclient-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Lodestar Light Client",permalink:"/lodestar/libraries/lightclient-prover/lightclient"},next:{title:"Lodestar Prover",permalink:"/lodestar/libraries/lightclient-prover/prover"}},d={},s=[{value:"Examples",id:"examples",level:2},{value:"lightclient Options",id:"lightclient-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--rcConfig",id:"--rcconfig",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--beaconApiUrl",id:"--beaconapiurl",level:4},{value:"--checkpointRoot",id:"--checkpointroot",level:4}];function h(e){const i={code:"code",h1:"h1",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(i.h1,{id:"lightclient-cli-command",children:[(0,n.jsx)(i.code,{children:"lightclient"})," CLI Command"]}),"\n",(0,n.jsx)(i.p,{children:"Run lightclient"}),"\n",(0,n.jsx)(i.h2,{id:"examples",children:"Examples"}),"\n",(0,n.jsx)(i.p,{children:"Run lightclient with holesky network"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-sh",children:"./lodestar lightclient --network holesky\n"})}),"\n",(0,n.jsxs)(i.h2,{id:"lightclient-options",children:[(0,n.jsx)(i.code,{children:"lightclient"})," Options"]}),"\n",(0,n.jsx)(i.h4,{id:"--datadir",children:(0,n.jsx)(i.code,{children:"--dataDir"})}),"\n",(0,n.jsx)(i.p,{children:"Lodestar root data directory"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--network",children:(0,n.jsx)(i.code,{children:"--network"})}),"\n",(0,n.jsx)(i.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:'"mainnet"'})]}),"\n",(0,n.jsx)(i.h4,{id:"--paramsfile",children:(0,n.jsx)(i.code,{children:"--paramsFile"})}),"\n",(0,n.jsx)(i.p,{children:"Network configuration file"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--rcconfig",children:(0,n.jsx)(i.code,{children:"--rcConfig"})}),"\n",(0,n.jsx)(i.p,{children:"RC file to supplement command line args, accepted formats: .yml, .yaml, .json"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--terminal-total-difficulty-override",children:(0,n.jsx)(i.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,n.jsx)(i.p,{children:"Terminal PoW block TTD override"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--terminal-block-hash-override",children:(0,n.jsx)(i.code,{children:"--terminal-block-hash-override"})}),"\n",(0,n.jsx)(i.p,{children:"Terminal PoW block hash override"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--terminal-block-hash-epoch-override",children:(0,n.jsx)(i.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,n.jsx)(i.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--loglevel",children:(0,n.jsx)(i.code,{children:"--logLevel"})}),"\n",(0,n.jsx)(i.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:'"info"'})]}),"\n",(0,n.jsx)(i.h4,{id:"--logfile",children:(0,n.jsx)(i.code,{children:"--logFile"})}),"\n",(0,n.jsx)(i.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--logfilelevel",children:(0,n.jsx)(i.code,{children:"--logFileLevel"})}),"\n",(0,n.jsx)(i.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:'"debug"'})]}),"\n",(0,n.jsx)(i.h4,{id:"--logfiledailyrotate",children:(0,n.jsx)(i.code,{children:"--logFileDailyRotate"})}),"\n",(0,n.jsx)(i.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"number"})]}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:"5"})]}),"\n",(0,n.jsx)(i.h4,{id:"--beaconapiurl",children:(0,n.jsx)(i.code,{children:"--beaconApiUrl"})}),"\n",(0,n.jsx)(i.p,{children:"Url to a beacon node that support lightclient API"}),"\n",(0,n.jsx)(i.p,{children:"required: true"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--checkpointroot",children:(0,n.jsx)(i.code,{children:"--checkpointRoot"})}),"\n",(0,n.jsx)(i.p,{children:"Checkpoint root hex string to sync the lightclient from, start with 0x"}),"\n",(0,n.jsx)(i.p,{children:"required: true"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]})]})}function a(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,i,l)=>{l.d(i,{R:()=>o,x:()=>c});var n=l(6540);const r={},t=n.createContext(r);function o(e){const i=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4496819.bc14a881.js b/assets/js/c4496819.bc14a881.js deleted file mode 100644 index 2093ae529d83..000000000000 --- a/assets/js/c4496819.bc14a881.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[707],{9654:(e,i,l)=>{l.r(i),l.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>a,frontMatter:()=>t,metadata:()=>c,toc:()=>s});var n=l(4848),r=l(8453);const t={title:"CLI Reference"},o="lightclient CLI Command",c={id:"libraries/lightclient-prover/lightclient-cli",title:"CLI Reference",description:"Run lightclient",source:"@site/pages/libraries/lightclient-prover/lightclient-cli.md",sourceDirName:"libraries/lightclient-prover",slug:"/libraries/lightclient-prover/lightclient-cli",permalink:"/lodestar/libraries/lightclient-prover/lightclient-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/libraries/lightclient-prover/lightclient-cli.md",tags:[],version:"current",frontMatter:{title:"CLI Reference"},sidebar:"tutorialSidebar",previous:{title:"Lodestar Light Client",permalink:"/lodestar/libraries/lightclient-prover/lightclient"},next:{title:"Lodestar Prover",permalink:"/lodestar/libraries/lightclient-prover/prover"}},d={},s=[{value:"Examples",id:"examples",level:2},{value:"lightclient Options",id:"lightclient-options",level:2},{value:"--dataDir",id:"--datadir",level:4},{value:"--network",id:"--network",level:4},{value:"--paramsFile",id:"--paramsfile",level:4},{value:"--terminal-total-difficulty-override",id:"--terminal-total-difficulty-override",level:4},{value:"--terminal-block-hash-override",id:"--terminal-block-hash-override",level:4},{value:"--terminal-block-hash-epoch-override",id:"--terminal-block-hash-epoch-override",level:4},{value:"--logLevel",id:"--loglevel",level:4},{value:"--logFile",id:"--logfile",level:4},{value:"--logFileLevel",id:"--logfilelevel",level:4},{value:"--logFileDailyRotate",id:"--logfiledailyrotate",level:4},{value:"--beaconApiUrl",id:"--beaconapiurl",level:4},{value:"--checkpointRoot",id:"--checkpointroot",level:4}];function h(e){const i={code:"code",h1:"h1",h2:"h2",h4:"h4",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(i.h1,{id:"lightclient-cli-command",children:[(0,n.jsx)(i.code,{children:"lightclient"})," CLI Command"]}),"\n",(0,n.jsx)(i.p,{children:"Run lightclient"}),"\n",(0,n.jsx)(i.h2,{id:"examples",children:"Examples"}),"\n",(0,n.jsx)(i.p,{children:"Run lightclient with holesky network"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-sh",children:"./lodestar lightclient --network holesky\n"})}),"\n",(0,n.jsxs)(i.h2,{id:"lightclient-options",children:[(0,n.jsx)(i.code,{children:"lightclient"})," Options"]}),"\n",(0,n.jsx)(i.h4,{id:"--datadir",children:(0,n.jsx)(i.code,{children:"--dataDir"})}),"\n",(0,n.jsx)(i.p,{children:"Lodestar root data directory"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--network",children:(0,n.jsx)(i.code,{children:"--network"})}),"\n",(0,n.jsx)(i.p,{children:"Name of the Ethereum Consensus chain network to join"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.p,{children:'choices: "mainnet", "gnosis", "sepolia", "holesky", "chiado", "ephemery", "mekong", "dev"'}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:'"mainnet"'})]}),"\n",(0,n.jsx)(i.h4,{id:"--paramsfile",children:(0,n.jsx)(i.code,{children:"--paramsFile"})}),"\n",(0,n.jsx)(i.p,{children:"Network configuration file"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--terminal-total-difficulty-override",children:(0,n.jsx)(i.code,{children:"--terminal-total-difficulty-override"})}),"\n",(0,n.jsx)(i.p,{children:"Terminal PoW block TTD override"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--terminal-block-hash-override",children:(0,n.jsx)(i.code,{children:"--terminal-block-hash-override"})}),"\n",(0,n.jsx)(i.p,{children:"Terminal PoW block hash override"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--terminal-block-hash-epoch-override",children:(0,n.jsx)(i.code,{children:"--terminal-block-hash-epoch-override"})}),"\n",(0,n.jsx)(i.p,{children:"Terminal PoW block hash override activation epoch"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--loglevel",children:(0,n.jsx)(i.code,{children:"--logLevel"})}),"\n",(0,n.jsx)(i.p,{children:"Logging verbosity level for emitting logs to terminal"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:'"info"'})]}),"\n",(0,n.jsx)(i.h4,{id:"--logfile",children:(0,n.jsx)(i.code,{children:"--logFile"})}),"\n",(0,n.jsx)(i.p,{children:"Path to output all logs to a persistent log file, use 'none' to disable"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--logfilelevel",children:(0,n.jsx)(i.code,{children:"--logFileLevel"})}),"\n",(0,n.jsx)(i.p,{children:"Logging verbosity level for emitting logs to file"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.p,{children:'choices: "error", "warn", "info", "verbose", "debug", "trace"'}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:'"debug"'})]}),"\n",(0,n.jsx)(i.h4,{id:"--logfiledailyrotate",children:(0,n.jsx)(i.code,{children:"--logFileDailyRotate"})}),"\n",(0,n.jsx)(i.p,{children:"Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"number"})]}),"\n",(0,n.jsxs)(i.p,{children:["default: ",(0,n.jsx)(i.code,{children:"5"})]}),"\n",(0,n.jsx)(i.h4,{id:"--beaconapiurl",children:(0,n.jsx)(i.code,{children:"--beaconApiUrl"})}),"\n",(0,n.jsx)(i.p,{children:"Url to a beacon node that support lightclient API"}),"\n",(0,n.jsx)(i.p,{children:"required: true"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]}),"\n",(0,n.jsx)(i.h4,{id:"--checkpointroot",children:(0,n.jsx)(i.code,{children:"--checkpointRoot"})}),"\n",(0,n.jsx)(i.p,{children:"Checkpoint root hex string to sync the lightclient from, start with 0x"}),"\n",(0,n.jsx)(i.p,{children:"required: true"}),"\n",(0,n.jsxs)(i.p,{children:["type: ",(0,n.jsx)(i.code,{children:"string"})]})]})}function a(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,i,l)=>{l.d(i,{R:()=>o,x:()=>c});var n=l(6540);const r={},t=n.createContext(r);function o(e){const i=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c963cc9c.31244cf1.js b/assets/js/c963cc9c.31244cf1.js new file mode 100644 index 000000000000..84a59b0df78a --- /dev/null +++ b/assets/js/c963cc9c.31244cf1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3208],{352:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=t(4848),i=t(8453);const a={},s="External Signer",l={id:"run/validator-management/external-signer",title:"External Signer",description:"Lodestar supports connecting an external signing server like Web3Signer, Diva,",source:"@site/pages/run/validator-management/external-signer.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/external-signer",permalink:"/lodestar/run/validator-management/external-signer",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/external-signer.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/run/validator-management/validator-cli"},next:{title:"Proposer Configuration",permalink:"/lodestar/run/validator-management/proposer-config"}},o={},c=[{value:"Configuration",id:"configuration",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"external-signer",children:"External Signer"}),"\n",(0,r.jsxs)(n.p,{children:["Lodestar supports connecting an external signing server like ",(0,r.jsx)(n.a,{href:"https://docs.web3signer.consensys.io/",children:"Web3Signer"}),", ",(0,r.jsx)(n.a,{href:"https://docs.shamirlabs.org/",children:"Diva"}),",\nor any other service implementing the ",(0,r.jsx)(n.a,{href:"https://github.com/ethereum/remote-signing-api",children:"remote signing specification"}),". This allows the validator client\nto operate without storing any validator private keys locally by delegating the signing of messages (e.g. attestations, beacon blocks) to the external signer\nwhich is accessed through a ",(0,r.jsx)(n.a,{href:"https://ethereum.github.io/remote-signing-api/",children:"REST API"})," via HTTP(S). This API should not be exposed directly to the public\nInternet and appropriate firewall rules should be in place to restrict access only from the validator client."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["Lodestar provides ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerurl",children:"CLI options"})," to connect an external signer."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:'./lodestar validator --externalSigner.url "http://localhost:9000" --externalSigner.fetch\n'})}),"\n",(0,r.jsx)(n.p,{children:"The validator client will fetch the list of public keys from the external signer and automatically keep them in sync with signers in local validator store\nby adding newly discovered public keys and removing no longer present public keys on external signer."}),"\n",(0,r.jsxs)(n.p,{children:["By default, the list of public keys will be fetched from the external signer once per epoch (6.4 minutes). This interval can be configured by setting ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerfetchinterval",children:(0,r.jsx)(n.code,{children:"--externalSigner.fetchInterval"})})," flag which takes a number in milliseconds."]}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, if it is not desired to use all public keys imported on the external signer, it is also possible to explicitly specify a list of public keys to use\nby setting the ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerpubkeys",children:(0,r.jsx)(n.code,{children:"--externalSigner.pubkeys"})})," flag instead of ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerfetch",children:(0,r.jsx)(n.code,{children:"--externalSigner.fetch"})}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var r=t(6540);const i={},a=r.createContext(i);function s(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c963cc9c.feee3444.js b/assets/js/c963cc9c.feee3444.js deleted file mode 100644 index ac8129b55a9d..000000000000 --- a/assets/js/c963cc9c.feee3444.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[3208],{352:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(4848),a=t(8453);const i={},s="External Signer",l={id:"run/validator-management/external-signer",title:"External Signer",description:"Lodestar supports connecting an external signing server like Web3Signer, Diva,",source:"@site/pages/run/validator-management/external-signer.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/external-signer",permalink:"/lodestar/run/validator-management/external-signer",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/external-signer.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/run/validator-management/validator-cli"},next:{title:"Prometheus and Grafana",permalink:"/lodestar/run/logging-and-metrics/prometheus-grafana"}},o={},c=[{value:"Configuration",id:"configuration",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"external-signer",children:"External Signer"}),"\n",(0,r.jsxs)(n.p,{children:["Lodestar supports connecting an external signing server like ",(0,r.jsx)(n.a,{href:"https://docs.web3signer.consensys.io/",children:"Web3Signer"}),", ",(0,r.jsx)(n.a,{href:"https://docs.shamirlabs.org/",children:"Diva"}),",\nor any other service implementing the ",(0,r.jsx)(n.a,{href:"https://github.com/ethereum/remote-signing-api",children:"remote signing specification"}),". This allows the validator client\nto operate without storing any validator private keys locally by delegating the signing of messages (e.g. attestations, beacon blocks) to the external signer\nwhich is accessed through a ",(0,r.jsx)(n.a,{href:"https://ethereum.github.io/remote-signing-api/",children:"REST API"})," via HTTP(S). This API should not be exposed directly to the public\nInternet and appropriate firewall rules should be in place to restrict access only from the validator client."]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["Lodestar provides ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerurl",children:"CLI options"})," to connect an external signer."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:'./lodestar validator --externalSigner.url "http://localhost:9000" --externalSigner.fetch\n'})}),"\n",(0,r.jsx)(n.p,{children:"The validator client will fetch the list of public keys from the external signer and automatically keep them in sync with signers in local validator store\nby adding newly discovered public keys and removing no longer present public keys on external signer."}),"\n",(0,r.jsxs)(n.p,{children:["By default, the list of public keys will be fetched from the external signer once per epoch (6.4 minutes). This interval can be configured by setting ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerfetchinterval",children:(0,r.jsx)(n.code,{children:"--externalSigner.fetchInterval"})})," flag which takes a number in milliseconds."]}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, if it is not desired to use all public keys imported on the external signer, it is also possible to explicitly specify a list of public keys to use\nby setting the ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerpubkeys",children:(0,r.jsx)(n.code,{children:"--externalSigner.pubkeys"})})," flag instead of ",(0,r.jsx)(n.a,{href:"/lodestar/run/validator-management/validator-cli#--externalsignerfetch",children:(0,r.jsx)(n.code,{children:"--externalSigner.fetch"})}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var r=t(6540);const a={},i=r.createContext(a);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d811cffe.753ec665.js b/assets/js/d811cffe.753ec665.js deleted file mode 100644 index 4ba9d522413e..000000000000 --- a/assets/js/d811cffe.753ec665.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[5505],{2544:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=t(4848),o=t(8453);const r={},s="Client monitoring",a={id:"run/logging-and-metrics/client-monitoring",title:"Client monitoring",description:"Lodestar has the ability to send client stats to a remote service for collection.",source:"@site/pages/run/logging-and-metrics/client-monitoring.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/client-monitoring",permalink:"/lodestar/run/logging-and-metrics/client-monitoring",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/client-monitoring.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Prometheus and Grafana",permalink:"/lodestar/run/logging-and-metrics/prometheus-grafana"},next:{title:"CLI Reference",permalink:"/lodestar/run/bootnode/bootnode-cli"}},c={},l=[{value:"Configuration",id:"configuration",level:2},{value:"Remote endpoint URL",id:"remote-endpoint-url",level:3},{value:"Monitoring interval",id:"monitoring-interval",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"client-monitoring",children:"Client monitoring"}),"\n",(0,i.jsxs)(n.p,{children:["Lodestar has the ability to send client stats to a remote service for collection.\nAt the moment, the main service offering remote monitoring is ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/",children:"beaconcha.in"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Instructions for setting up client monitoring with ",(0,i.jsx)(n.em,{children:"beaconcha.in"})," can be found in their docs about\n",(0,i.jsx)(n.a,{href:"https://kb.beaconcha.in/beaconcha.in-explorer/mobile-app-less-than-greater-than-beacon-node",children:"Mobile App <> Node Monitoring"}),"\nand in your ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/user/settings#app",children:"account settings"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["Lodestar provides CLI options to configure monitoring on both the beacon node ",(0,i.jsx)(n.strong,{children:"and"})," validator client."]}),"\n",(0,i.jsx)(n.h3,{id:"remote-endpoint-url",children:"Remote endpoint URL"}),"\n",(0,i.jsxs)(n.p,{children:["Client monitoring can be enabled by setting the ",(0,i.jsx)(n.code,{children:"--monitoring.endpoint"})," flag to a remote service endpoint URL."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'--monitoring.endpoint "https://beaconcha.in/api/v1/client/metrics?apikey={apikey}&machine={machineName}"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In case of ",(0,i.jsx)(n.em,{children:"beaconcha.in"}),", the API key can be found in your ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/user/settings#api",children:"account settings"}),".\nSetting the machine is optional but it is especially useful if you are monitoring multiple nodes."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsx)(n.p,{children:"When sending data to a remote service you should be conscious about security:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Only use a service that you trust as this will send information which may identify you\nand associate your validators, IP address and other personal information."}),"\n",(0,i.jsxs)(n.li,{children:["Always use a HTTPS connection (i.e. a URL starting with ",(0,i.jsx)(n.code,{children:"https://"}),") to prevent the traffic\nfrom being intercepted in transit and leaking information."]}),"\n"]})]}),"\n",(0,i.jsxs)(n.p,{children:["More details about the data sent to the remote service can be found in the ",(0,i.jsx)(n.a,{href:"https://docs.google.com/document/d/1qPWAVRjPCENlyAjUBwGkHMvz9qLdd_6u9DPZcNxDBpc",children:"specification"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["It is also possible to print out the data sent to the remote service by enabling debug logs which can be done by supplying the ",(0,i.jsx)(n.code,{children:"--logLevel debug"})," flag."]}),"\n",(0,i.jsx)(n.h3,{id:"monitoring-interval",children:"Monitoring interval"}),"\n",(0,i.jsxs)(n.p,{children:["It is possible to adjust the interval between sending client stats to the remote service by setting the ",(0,i.jsx)(n.code,{children:"--monitoring.interval"})," flag.\nIt takes an integer value in milliseconds, the default is ",(0,i.jsx)(n.code,{children:"60000"})," which means data is sent once a minute."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, setting an interval of ",(0,i.jsx)(n.code,{children:"300000"})," would mean the data is only sent every 5 minutes."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"--monitoring.interval 300000\n"})}),"\n",(0,i.jsx)(n.p,{children:"Increasing the monitoring interval can be useful if you are running into rate limit errors when posting large amounts of data for multiple nodes."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d811cffe.970be58e.js b/assets/js/d811cffe.970be58e.js new file mode 100644 index 000000000000..f111cc7a6c60 --- /dev/null +++ b/assets/js/d811cffe.970be58e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[5505],{2544:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=t(4848),o=t(8453);const r={},s="Client Monitoring",a={id:"run/logging-and-metrics/client-monitoring",title:"Client Monitoring",description:"Lodestar has the ability to send client stats to a remote service for collection.",source:"@site/pages/run/logging-and-metrics/client-monitoring.md",sourceDirName:"run/logging-and-metrics",slug:"/run/logging-and-metrics/client-monitoring",permalink:"/lodestar/run/logging-and-metrics/client-monitoring",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/logging-and-metrics/client-monitoring.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Prometheus and Grafana Setup",permalink:"/lodestar/run/logging-and-metrics/prometheus-grafana"},next:{title:"CLI Reference",permalink:"/lodestar/run/bootnode/bootnode-cli"}},c={},l=[{value:"Configuration",id:"configuration",level:2},{value:"Remote endpoint URL",id:"remote-endpoint-url",level:3},{value:"Monitoring interval",id:"monitoring-interval",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"client-monitoring",children:"Client Monitoring"}),"\n",(0,i.jsxs)(n.p,{children:["Lodestar has the ability to send client stats to a remote service for collection.\nAt the moment, the main service offering remote monitoring is ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/",children:"beaconcha.in"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Instructions for setting up client monitoring with ",(0,i.jsx)(n.em,{children:"beaconcha.in"})," can be found in their docs about\n",(0,i.jsx)(n.a,{href:"https://kb.beaconcha.in/beaconcha.in-explorer/mobile-app-less-than-greater-than-beacon-node",children:"Mobile App <> Node Monitoring"}),"\nand in your ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/user/settings#app",children:"account settings"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["Lodestar provides CLI options to configure monitoring on both the beacon node ",(0,i.jsx)(n.strong,{children:"and"})," validator client."]}),"\n",(0,i.jsx)(n.h3,{id:"remote-endpoint-url",children:"Remote endpoint URL"}),"\n",(0,i.jsxs)(n.p,{children:["Client monitoring can be enabled by setting the ",(0,i.jsx)(n.code,{children:"--monitoring.endpoint"})," flag to a remote service endpoint URL."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'--monitoring.endpoint "https://beaconcha.in/api/v1/client/metrics?apikey={apikey}&machine={machineName}"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In case of ",(0,i.jsx)(n.em,{children:"beaconcha.in"}),", the API key can be found in your ",(0,i.jsx)(n.a,{href:"https://beaconcha.in/user/settings#api",children:"account settings"}),".\nSetting the machine is optional but it is especially useful if you are monitoring multiple nodes."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsx)(n.p,{children:"When sending data to a remote service you should be conscious about security:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Only use a service that you trust as this will send information which may identify you\nand associate your validators, IP address and other personal information."}),"\n",(0,i.jsxs)(n.li,{children:["Always use an HTTPS connection (i.e. a URL starting with ",(0,i.jsx)(n.code,{children:"https://"}),") to prevent the traffic\nfrom being intercepted in transit and leaking information."]}),"\n"]})]}),"\n",(0,i.jsxs)(n.p,{children:["More details about the data sent to the remote service can be found in the ",(0,i.jsx)(n.a,{href:"https://docs.google.com/document/d/1qPWAVRjPCENlyAjUBwGkHMvz9qLdd_6u9DPZcNxDBpc",children:"specification"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["It is also possible to print out the data sent to the remote service by enabling debug logs which can be done by supplying the ",(0,i.jsx)(n.code,{children:"--logLevel debug"})," flag."]}),"\n",(0,i.jsx)(n.h3,{id:"monitoring-interval",children:"Monitoring interval"}),"\n",(0,i.jsxs)(n.p,{children:["It is possible to adjust the interval between sending client stats to the remote service by setting the ",(0,i.jsx)(n.code,{children:"--monitoring.interval"})," flag.\nIt takes an integer value in milliseconds, the default is ",(0,i.jsx)(n.code,{children:"60000"})," which means data is sent once a minute."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, setting an interval of ",(0,i.jsx)(n.code,{children:"300000"})," would mean the data is only sent every 5 minutes."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"--monitoring.interval 300000\n"})}),"\n",(0,i.jsx)(n.p,{children:"Increasing the monitoring interval can be useful if you are running into rate limit errors when posting large amounts of data for multiple nodes."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e82326e0.75ab1be4.js b/assets/js/e82326e0.75ab1be4.js new file mode 100644 index 000000000000..3dc9c9c901c2 --- /dev/null +++ b/assets/js/e82326e0.75ab1be4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[7194],{7569:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>t,metadata:()=>c,toc:()=>l});var r=n(4848),o=n(8453);const t={},i="Proposer Configuration",c={id:"run/validator-management/proposer-config",title:"Proposer Configuration",description:"This is an alpha feature. The feature and its format are subject to change.",source:"@site/pages/run/validator-management/proposer-config.md",sourceDirName:"run/validator-management",slug:"/run/validator-management/proposer-config",permalink:"/lodestar/run/validator-management/proposer-config",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/run/validator-management/proposer-config.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"External Signer",permalink:"/lodestar/run/validator-management/external-signer"},next:{title:"Prometheus and Grafana Setup",permalink:"/lodestar/run/logging-and-metrics/prometheus-grafana"}},s={},l=[{value:"Example proposer_config.yaml",id:"example-proposer_configyaml",level:3},{value:"Enable Proposer Configuration",id:"enable-proposer-configuration",level:3}];function p(e){const a={admonition:"admonition",code:"code",h1:"h1",h3:"h3",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.h1,{id:"proposer-configuration",children:"Proposer Configuration"}),"\n",(0,r.jsx)(a.admonition,{type:"warning",children:(0,r.jsx)(a.p,{children:"This is an alpha feature. The feature and its format are subject to change."})}),"\n",(0,r.jsx)(a.p,{children:"With Lodestar's validator client, you can assign specific metadata for each proposer/public key using a proposer configuration file written in YAML file. This will allow you to set specific graffiti, fee recipients and builder settings per validator key."}),"\n",(0,r.jsx)(a.h3,{id:"example-proposer_configyaml",children:"Example proposer_config.yaml"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:'proposer_config:\n "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c":\n graffiti: "graffiti"\n strict_fee_recipient_check: false\n fee_recipient: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\n builder:\n gas_limit: "30000000"\n selection: "executionalways"\n boost_factor: "0"\n "0xa4855c83d868f772a579133d9f23818008417b743e8447e235d8eb78b1d8f8a9f63f98c551beb7de254400f89592314d":\n fee_recipient: "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\n builder:\n gas_limit: "3000000"\n selection: "maxprofit"\n boost_factor: "100"\ndefault_config:\n graffiti: "default graffiti"\n strict_fee_recipient_check: true\n fee_recipient: "0xcccccccccccccccccccccccccccccccccccccccc"\n builder:\n gas_limit: "30000000"\n selection: "default"\n boost_factor: "90"\n'})}),"\n",(0,r.jsx)(a.h3,{id:"enable-proposer-configuration",children:"Enable Proposer Configuration"}),"\n",(0,r.jsxs)(a.p,{children:["After you have configured your proposer configuration YAML file, you can start Lodestar with an additional CLI flag option pointing to the file: ",(0,r.jsx)(a.code,{children:"--proposerSettingsFile /path/to/proposer_config.yaml"}),"."]}),"\n",(0,r.jsxs)(a.admonition,{type:"info",children:[(0,r.jsx)(a.p,{children:"The proposer configuration can also be retrieved via the keymanager API endpoint:"}),(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{children:"GET /eth/v0/validator/{pubkey}/proposer_config\n"})})]})]})}function d(e={}){const{wrapper:a}={...(0,o.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,a,n)=>{n.d(a,{R:()=>i,x:()=>c});var r=n(6540);const o={},t=r.createContext(o);function i(e){const a=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e8d2177f.63038b7d.js b/assets/js/e8d2177f.4c5da8b8.js similarity index 56% rename from assets/js/e8d2177f.63038b7d.js rename to assets/js/e8d2177f.4c5da8b8.js index 0059c2183b5d..074500ac6174 100644 --- a/assets/js/e8d2177f.63038b7d.js +++ b/assets/js/e8d2177f.4c5da8b8.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_lodestar_docs=self.webpackChunk_lodestar_docs||[]).push([[7545],{7565:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=i(4848),s=i(8453);const r={},o="Lodestar Light Client",a={id:"libraries/lightclient-prover/lightclient",title:"Lodestar Light Client",description:"Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state.",source:"@site/pages/libraries/lightclient-prover/lightclient.md",sourceDirName:"libraries/lightclient-prover",slug:"/libraries/lightclient-prover/lightclient",permalink:"/lodestar/libraries/lightclient-prover/lightclient",draft:!1,unlisted:!1,editUrl:"https://github.com/ChainSafe/lodestar/tree/unstable/docs/pages/libraries/lightclient-prover/lightclient.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CLI Reference",permalink:"/lodestar/run/bootnode/bootnode-cli"},next:{title:"CLI Reference",permalink:"/lodestar/libraries/lightclient-prover/lightclient-cli"}},l={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Requirements for Running a Light-Client",id:"requirements-for-running-a-light-client",level:2},{value:"Getting started",id:"getting-started",level:2},{value:"Light-Client CLI Example",id:"light-client-cli-example",level:2},{value:"Light-Client Programmatic Example",id:"light-client-programmatic-example",level:2},{value:"Browser Integration",id:"browser-integration",level:2},{value:"Contributors",id:"contributors",level:2},{value:"License",id:"license",level:2}];function h(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"lodestar-light-client",children:"Lodestar Light Client"}),"\n",(0,n.jsx)(t.p,{children:"Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state."}),"\n",(0,n.jsx)(t.p,{children:"Unlike full nodes, light clients do not download and store the entire blockchain. Instead, they download only the headers of each block and employ Merkle proofs to verify transactions. This enables a quick synchronization with the network and access the latest information without using significant system resources\u200b. This streamlined approach to accessing Ethereum is crucial, especially in scenarios where full-scale network participation is infeasible or undesired."}),"\n",(0,n.jsx)(t.p,{children:"The evolution of light clients is emblematic of the broader trajectory of Ethereum towards becoming more accessible and resource-efficient, making blockchain technology more inclusive and adaptable to a wide array of use cases and environments. The Altair hard fork introduced sync committees to allow light-clients to synchronize to the network."}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://discord.gg/aMxzVcr",children:(0,n.jsx)(t.img,{src:"https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord",alt:"Discord"})}),"\n",(0,n.jsx)(t.a,{href:"https://github.com/ethereum/consensus-specs/releases/tag/v1.4.0",children:(0,n.jsx)(t.img,{src:"https://img.shields.io/badge/ETH%20consensus--spec-1.4.0-blue",alt:"Eth Consensus Spec v1.4.0"})}),"\n",(0,n.jsx)(t.img,{src:"https://img.shields.io/badge/ES-2021-yellow",alt:"ES Version"}),"\n",(0,n.jsx)(t.img,{src:"https://img.shields.io/badge/node-16.x-green",alt:"Node Version"}),"\n",(0,n.jsx)(t.img,{src:"https://img.shields.io/badge/yarn-%232C8EBB.svg?style=for-the-badge&logo=yarn&logoColor=white",alt:"Yarn"})]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["This package is part of ",(0,n.jsx)(t.a,{href:"https://lodestar.chainsafe.io",children:"ChainSafe's Lodestar"})," project"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"requirements-for-running-a-light-client",children:"Requirements for Running a Light-Client"}),"\n",(0,n.jsxs)(t.p,{children:["Access to an beacon node that supports the light client specification is necessary. The client must support the following routes from the ",(0,n.jsx)(t.a,{href:"https://github.com/ethereum/beacon-APIs/tree/v2.5.0/apis/beacon/light_client",children:"consensus API spec"}),":"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.5.0#/Beacon/getLightClientUpdatesByRange",children:(0,n.jsx)(t.code,{children:"GET /eth/v1/beacon/light_client/updates"})})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.5.0#/Beacon/getLightClientOptimisticUpdate",children:(0,n.jsx)(t.code,{children:"GET /eth/v1/beacon/light_client/optimistic_update"})})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.5.0#/Beacon/getLightClientFinalityUpdate",children:(0,n.jsx)(t.code,{children:"GET /eth/v1/beacon/light_client/finality_update"})})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://ethereum.github.io/beacon-APIs/?urls.primaryName=v2.5.0#/Beacon/getLightClientBootstrap",children:(0,n.jsx)(t.code,{children:"GET /eth/v1/beacon/light_client/bootstrap/{block_root}"})})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["System requirements are quite low so its possible to run a light client in the browser as part of a website. There are a few examples of this on github that you can use as reference, our ",(0,n.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/libraries/lightclient-prover/prover",children:"prover"})," being one of them."]}),"\n",(0,n.jsxs)(t.p,{children:["You can find more information about the light-client protocol in the ",(0,n.jsx)(t.a,{href:"https://github.com/ethereum/consensus-specs",children:"specification"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Follow the ",(0,n.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/getting-started/installation",children:"installation guide"})," or ",(0,n.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/getting-started/installation/#docker-installation",children:"Docker install"})," to install Lodestar."]}),"\n",(0,n.jsxs)(t.li,{children:["Quickly try out the whole stack by ",(0,n.jsx)(t.a,{href:"https://chainsafe.github.io/lodestar/advanced-topics/setting-up-a-testnet",children:"starting a local testnet"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"light-client-cli-example",children:"Light-Client CLI Example"}),"\n",(0,n.jsx)(t.p,{children:"It is possible to start up the light-client as a standalone process."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'lodestar lightclient \\\n --network sepolia \\\n --beaconApiUrl https://lodestar-sepolia.chainsafe.io \\\n --checkpointRoot "0xccaff4b99986a7b05e06738f1828a32e40799b277fd9f9ff069be55341fe0229"\n'})}),"\n",(0,n.jsx)(t.h2,{id:"light-client-programmatic-example",children:"Light-Client Programmatic Example"}),"\n",(0,n.jsxs)(t.p,{children:["For this example we will assume there is a running beacon node at ",(0,n.jsx)(t.code,{children:"https://lodestar-sepolia.chainsafe.io"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-ts",children:'import {Lightclient, LightclientEvent} from "@lodestar/light-client";\nimport {LightClientRestTransport} from "@lodestar/light-client/transport";\nimport {\n getFinalizedSyncCheckpoint,\n getGenesisData,\n getConsoleLogger,\n getApiFromUrl,\n getChainForkConfigFromNetwork,\n} from "@lodestar/light-client/utils";\n\nconst config = getChainForkConfigFromNetwork("sepolia");\nconst logger = getConsoleLogger({logDebug: Boolean(process.env.DEBUG)});\nconst api = getApiFromUrl("https://lodestar-sepolia.chainsafe.io", "sepolia");\n\nconst lightclient = await Lightclient.initializeFromCheckpointRoot({\n config,\n logger,\n transport: new LightClientRestTransport(api),\n genesisData: await getGenesisData(api),\n checkpointRoot: await getFinalizedSyncCheckpoint(api),\n opts: {\n allowForcedUpdates: true,\n updateHeadersOnForcedUpdate: true,\n },\n});\n\n// Wait for the lightclient to start\nawait lightclient.start();\n\nlogger.info("Lightclient synced");\n\nlightclient.emitter.on(LightclientEvent.lightClientFinalityHeader, async (finalityUpdate) => {\n logger.info("Received finality update", {slot: finalityUpdate.beacon.slot});\n});\n\nlightclient.emitter.on(LightclientEvent.lightClientOptimisticHeader, async (optimisticUpdate) => {\n logger.info("Received optimistic update", {slot: optimisticUpdate.beacon.slot});\n});\n'})}),"\n",(0,n.jsx)(t.h2,{id:"browser-integration",children:"Browser Integration"}),"\n",(0,n.jsxs)(t.p,{children:["If you want to use Lightclient in browser and facing some issues in building it with bundlers like webpack, vite. We suggest to use our distribution build. The support for single distribution build is started from ",(0,n.jsx)(t.code,{children:"1.20.0"})," version."]}),"\n",(0,n.jsxs)(t.p,{children:["Directly link the dist build with the ",(0,n.jsx)(t.code,{children:" - - + + -
+
\ No newline at end of file diff --git a/contribution/advanced-topics/doppelganger-detection/index.html b/contribution/advanced-topics/doppelganger-detection/index.html index 769c708f1263..1a5beb03e597 100644 --- a/contribution/advanced-topics/doppelganger-detection/index.html +++ b/contribution/advanced-topics/doppelganger-detection/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
+
\ No newline at end of file diff --git a/contribution/advanced-topics/migrating-from-other-clients/index.html b/contribution/advanced-topics/migrating-from-other-clients/index.html index e5f65614cc50..9330cf1eb48b 100644 --- a/contribution/advanced-topics/migrating-from-other-clients/index.html +++ b/contribution/advanced-topics/migrating-from-other-clients/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
+
\ No newline at end of file diff --git a/contribution/advanced-topics/setting-up-a-testnet/index.html b/contribution/advanced-topics/setting-up-a-testnet/index.html index 4c2bc46a22e8..be7d53b127cf 100644 --- a/contribution/advanced-topics/setting-up-a-testnet/index.html +++ b/contribution/advanced-topics/setting-up-a-testnet/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

Setting-Up a Testnet

+

Setting-Up a Testnet

To quickly test and run Lodestar we recommend starting a local testnet. We recommend a simple configuration of two beacon nodes with multiple validators. The dev scripts can used for simplicity but below instructions provide more insights on how it works and include details about different configurations.

note

The testnet set up in this guide is meant to be short-lived / ephemeral and should primarily be used for development and testing. Please refer to Ethereum In a Box or Kurtosis ethereum package to set up a long-lived private network or devnet.

Terminal 1

@@ -47,6 +47,6 @@

Pos
  • --params.ALTAIR_FORK_EPOCH 0
  • --params.BELLATRIX_FORK_EPOCH 0
  • --terminal-total-difficulty-override 0
  • -

    +
    \ No newline at end of file diff --git a/contribution/advanced-topics/slashing-protection/index.html b/contribution/advanced-topics/slashing-protection/index.html index 7b34aad70ac3..8fdcf8a8498f 100644 --- a/contribution/advanced-topics/slashing-protection/index.html +++ b/contribution/advanced-topics/slashing-protection/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
    +
    \ No newline at end of file diff --git a/contribution/bug-reports/index.html b/contribution/bug-reports/index.html index 19a275cf36f7..aaad32016c6e 100644 --- a/contribution/bug-reports/index.html +++ b/contribution/bug-reports/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + - +
    \ No newline at end of file diff --git a/contribution/depgraph/index.html b/contribution/depgraph/index.html index 88fa62c46177..88077961cc33 100644 --- a/contribution/depgraph/index.html +++ b/contribution/depgraph/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Dependency Graph

    Lodestar Dependency Graph

    +
    +

    @libp2p/js-libp2p is the JavaScript implementation of the libp2p networking stack used in Ethereum's networking stack.

    \ No newline at end of file diff --git a/contribution/dev-cli/index.html b/contribution/dev-cli/index.html index 5e1d0b7c5ad3..b7dff0d73ef5 100644 --- a/contribution/dev-cli/index.html +++ b/contribution/dev-cli/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    dev CLI Command

    +

    dev CLI Command

    Quickly bootstrap a beacon node and multiple validators. Use for development and testing

    Examples

    Start a single beacon node with 8 interop validators

    @@ -25,6 +25,9 @@

    --network--paramsFile

    Network configuration file

    type: string

    +

    --rcConfig

    +

    RC file to supplement command line args, accepted formats: .yml, .yaml, .json

    +

    type: string

    --terminal-total-difficulty-override

    Terminal PoW block TTD override

    type: string

    @@ -34,6 +37,9 @@

    --terminal-block-hash-epoch-override

    Terminal PoW block hash override activation epoch

    type: string

    +

    --genesisStateFile

    +

    Path or URL to download a genesis state file in ssz-encoded format

    +

    type: string

    --checkpointSyncUrl

    Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint

    type: string

    @@ -46,6 +52,12 @@

    --wssC

    --forceCheckpointSync

    Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while.

    type: boolean

    +

    --ignoreWeakSubjectivityCheck

    +

    Ignore the checkpoint sync state failing the weak subjectivity check. This is relevant in testnets where the weak subjectivity period is too small for even few epochs of non finalization causing last finalized to be out of range. This flag is not recommended for mainnet use.

    +

    type: boolean

    +

    --persistNetworkIdentity

    +

    Whether to reuse the same peer-id across restarts

    +

    type: boolean

    --private

    Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests

    type: boolean

    @@ -358,6 +370,6 @@

    --reset

    type: boolean

    --dumpTestnetFiles

    Dump testnet files and exit

    -

    type: string

    +

    type: string

    \ No newline at end of file diff --git a/contribution/getting-started/index.html b/contribution/getting-started/index.html index fb1bce9a8716..16aab34b1282 100644 --- a/contribution/getting-started/index.html +++ b/contribution/getting-started/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Contribution Guidelines

    +

    Contribution Guidelines

    Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward.

    Prerequisites

      @@ -100,6 +100,7 @@

      Contrib
    • Make an open pull request when you're ready for it to be reviewed. We review PRs on a regular basis. See Pull request etiquette for more information.
    • You may be asked to sign a Contributor License Agreement (CLA). We make it relatively painless with CLA-bot.
    • +

      Please note that trivial, non-code contributions such as spelling, grammar, typos, corrections, comments and link fixes are not acceptable pull requests. Although we appreciate the effort to fix these valid concerns, it is not practical for us to run our CI systems to accommodate minor external contributions which generate minimal value for the purpose of contribution/airdrop farming. It would be appreciated for you to open up an issue instead for our team to aggregate these types of contributions into a batch commit.

      Github Style Guide

      Branch Naming

      If you are contributing from this repository prefix the branch name with your Github username (i.e. myusername/short-description)

      @@ -249,6 +250,6 @@
      spec.* Ethereum Consensus Spec Version Target

      Issues that target a specific version of the Ethereum consensus spec, shall be tagged accordingly.

      Community

      -

      Come chat with us on Discord and join our public weekly planning meetings!

    +

    Come chat with us on Discord and join our public weekly planning meetings!

    \ No newline at end of file diff --git a/contribution/pr-submission/index.html b/contribution/pr-submission/index.html index 4d37b2358917..0795b06ee9b5 100644 --- a/contribution/pr-submission/index.html +++ b/contribution/pr-submission/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
    +
    \ No newline at end of file diff --git a/contribution/repo/index.html b/contribution/repo/index.html index 6648213ea1d1..120335a72258 100644 --- a/contribution/repo/index.html +++ b/contribution/repo/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + - + \ No newline at end of file diff --git a/contribution/testing/end-to-end-tests/index.html b/contribution/testing/end-to-end-tests/index.html index 2c5c06421e91..43f35e41373f 100644 --- a/contribution/testing/end-to-end-tests/index.html +++ b/contribution/testing/end-to-end-tests/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + - + \ No newline at end of file diff --git a/contribution/testing/index.html b/contribution/testing/index.html index 973fe2d51bf6..6bfa865f75ea 100644 --- a/contribution/testing/index.html +++ b/contribution/testing/index.html @@ -4,13 +4,13 @@ Lodestar Documentation - - + + -

    Testing

    +

    Testing

    Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo.

    -

    There are few flags you can set through env variables to override behavior of testing and it's output.

    +

    There are a few flags you can set through env variables to override behavior of testing and its output.

    ENV variableEffectImpact
    TEST_COMPACT_DIFFAllWill strip down the object difference rendered during test failures. Very useful for large object matching.
    TEST_QUIET_CONSOLEAllWill strip down console output. Reduce console flickering.
    TEST_COMPACT_OUTPUTAllDisplay a condensed summary of tests run. Use vitest basic reporter.

    Unit Tests

    This is the most fundamental type of test in most code bases. In all instances mocks, stubs and other forms of isolation are used to test code on a functional, unit level. See the Unit Tests page for more information.

    @@ -19,10 +19,10 @@

    Spec TestsPerformance Tests

    Node.js is an unforgiving virtual machine when it comes to high performance, multi-threaded applications. In order to ensure that Lodestar can not only keep up with the chain, but to push the boundary of what is possible, there are lots of performance tests that benchmark programming paradigms and prevent regression. See the Performance Testing page for more information.

    End-To-End Tests

    -

    E2E test are where Lodestar is run in its full form, often from the CLI as a user would to check that the system as a whole works as expected. These tests are meant to exercise the entire system in isolation and there is no network interaction, nor interaction with any other code outside of Lodestar. See the End-To-End Testing page for more information.

    +

    E2E tests are where Lodestar is run in its full form, often from the CLI as a user would to check that the system as a whole works as expected. These tests are meant to exercise the entire system in isolation and there is no network interaction, nor interaction with any other code outside of Lodestar. See the End-To-End Testing page for more information.

    Integration Tests

    Integration tests are meant to test how Lodestar interacts with other clients, but are not considered full simulations. This is where Lodestar may make API calls or otherwise work across the process boundary, but there is required mocking, stubbing, or class isolation. An example of this is using the ExecutionEngine class to make API calls to a Geth instance to check that the http requests are properly formatted.

    Simulation Tests

    -

    These are the most comprehensive types of tests. They aim to test Lodestar in a fully functioning ephemeral devnet environment. See the Simulation Testing page for more information.

    +

    These are the most comprehensive types of tests. They aim to test Lodestar in a fully functioning ephemeral devnet environment. See the Simulation Testing page for more information.

    \ No newline at end of file diff --git a/contribution/testing/integration-tests/index.html b/contribution/testing/integration-tests/index.html index ac7b67e0c2d9..38a07eba4946 100644 --- a/contribution/testing/integration-tests/index.html +++ b/contribution/testing/integration-tests/index.html @@ -4,13 +4,13 @@ Lodestar Documentation - - + + -

    Integration Tests

    + +

    yarn test:sim:blobs

    \ No newline at end of file diff --git a/contribution/testing/performance-tests/index.html b/contribution/testing/performance-tests/index.html index 462e690f2a61..e00eff776109 100644 --- a/contribution/testing/performance-tests/index.html +++ b/contribution/testing/performance-tests/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + - + \ No newline at end of file diff --git a/contribution/testing/simulation-tests/index.html b/contribution/testing/simulation-tests/index.html index bab8645377a6..48de93a74658 100644 --- a/contribution/testing/simulation-tests/index.html +++ b/contribution/testing/simulation-tests/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Simulation Tests

    +

    Simulation Tests

    "Sim" testing for Lodestar is the most comprehensive, and complex, testing that is run. The goal is to fully simulate a testnet and to actuate the code in a way that closely mimics what will happen when turning on Lodestar in the wild. This is a very complex task and requires a lot of moving parts to work together. The following sections will describe the various components and how they work together.

    At a very high level, simulation testing will setup a testnet from genesis and let proceed through "normal" execution exactly as the nodes would under production circumstances. To get feedback there are regular checks along the way to asses how the testnet nodes are working. These "assertions" can be added and removed at will to allow developers to check for specific conditions in a tightly controlled, reproducible, environment to get high quality and actionable feedback on how Lodestar performs. The end goal of these tests is to to run a full Lodestar client in an environment that is as close to what an end user would experience.

    These tests usually setup full testnets with multiple consensus clients and their paired execution node. In many instance we are looking to just exercise the Lodestar code but there are some places where there is also testing to see how Lodestar works in relation to the other consensus clients, like Lighthouse. As you can imagine, there is quite a bit of machinery that is responsible for setting up and managing the simulations and assertions. This section will help to go over those bits and pieces. Many, but not all, of these classes can be found in packages/cli/test/utils/simulation.

    @@ -85,6 +85,6 @@

    Simulatio
    • node-1-beacon_lodestar.log: The is the first node in the simulation. It is the consensus layer. It is running the lodestar validator client.
    • range-sync-execution_geth.log: This is the node that was added to test pulling history in range sync mode. It was the execution layer and was running the geth execution client.
    • -

    +
    \ No newline at end of file diff --git a/contribution/testing/spec-tests/index.html b/contribution/testing/spec-tests/index.html index 59a35c69cd07..98e5016bc7fb 100644 --- a/contribution/testing/spec-tests/index.html +++ b/contribution/testing/spec-tests/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + - + \ No newline at end of file diff --git a/contribution/testing/unit-tests/index.html b/contribution/testing/unit-tests/index.html index 469dbb003274..b0274dcde0ea 100644 --- a/contribution/testing/unit-tests/index.html +++ b/contribution/testing/unit-tests/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + +

    Unit Tests

    -

    Check back soon for more information!! We are in the process of updating our docs.

    +

    Check back soon for more information!! We are in the process of updating our docs.

    \ No newline at end of file diff --git a/contribution/tools/core-dumps/index.html b/contribution/tools/core-dumps/index.html index 2acaaec35a6a..a3f117618d74 100644 --- a/contribution/tools/core-dumps/index.html +++ b/contribution/tools/core-dumps/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Core Dump Analysis

    +

    Core Dump Analysis

    Core dump analysis is some ninja level stuff. Once you get the hang of it you will feel like you have super powers. It will up your game to a whole new level because you will be able to debug issues that seemed impossible before. Post-crash analysis is a very powerful tool to have in your tool belt. A core dump has all of the objects in memory as well as all of the stack frame information at the exact moment the dump was taken, usually when a hard crash occurs.

    It is important to note that debug symbols will greatly aid you in your debugging for issues related to native code like C/C++. When compiled languages are optimized the compiler will often strip out identifiers and all that will be remaining are mangled symbols and addresses. Compiling with debug symbols will leave all of the identifiers, file names and line numbers in-tact.

    While it is not always practical to be running code in a Debug version of node, if you run across a persistent issue it will be helpful to recreate it on a debug build and to use that for analysis.

    @@ -29,6 +29,6 @@

    Analyz
    # remember that the node binary must be the exact same one that was running when the core was created
    $ llnode -f /path/to/node_debug -c /Users/ninja_user/coredumps/node.coredump
    (lldb) target create "node_debug" --core "node.coredump"
    Core file '/Users/ninja_user/coredumps/node.coredump' (x86_64) was loaded.
    (lldb) plugin load '/Users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib'
    (lldb) settings set prompt '(llnode) '
    (llnode)

    Once the dump is loaded the first few steps will be to figure out what types of objects were in memory and what was the processor working on when the crash occurred. Lets start with the stack trace.

    There are two distinct commands for pulling the stack because node is both a native runtime and a virtual machine. The bt, back trace, command will pull the native stack frames and the v8 bt command will use the llnode plugin to pull the JavaScript stack frames. Newer versions of llnode will automatically pull the JavaScript stack frames when the bt command is run but it is still good to know the difference. It is also possible to add the all verb to the bt command and it will pull the back trace for all threads.

    -

    To start looking through memory there are two commands that are helpful. The v8 findjsobjects command will list all of the JavaScript objects in memory. The v8 findjsinstances command will list all of the instances of a particular JavaScript object.

    +

    To start looking through memory there are two commands that are helpful. The v8 findjsobjects command will list all of the JavaScript objects in memory. The v8 findjsinstances command will list all of the instances of a particular JavaScript object.

    \ No newline at end of file diff --git a/contribution/tools/debugging/index.html b/contribution/tools/debugging/index.html index 9b9d2a03d852..0751dfed8193 100644 --- a/contribution/tools/debugging/index.html +++ b/contribution/tools/debugging/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Debugging

    +

    Debugging

    This page describes different approaches for debugging Lodestar.

    VS Code launch config

    The simplest way to debug is to use the provided launch.template.json configurations. Copy them as .vscode/launch.json and they will be made available in the Run and Debug section in VS Code. Adapt as needed, e.g. by adding additional arguments to the beacon configuration to match your needs.

    @@ -20,6 +20,6 @@

    At
  • add following code to the worker
  • import inspector from "node:inspector";
    inspector.open();
    inspector.waitForDebugger();
    -

    Use VS Code or Chrome devtools to debug those processes.

    +

    Use VS Code or Chrome devtools to debug those processes.

    \ No newline at end of file diff --git a/contribution/tools/flamegraphs/index.html b/contribution/tools/flamegraphs/index.html index 6e822c8227b4..4d08042e899a 100644 --- a/contribution/tools/flamegraphs/index.html +++ b/contribution/tools/flamegraphs/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Generating Flamegraphs for a Running Node Service on Linux

    +

    Generating Flamegraphs for a Running Node Service on Linux

    This guide assumes a running instance of Lodestar and will walk through how to generate a flamegraph for the process while running on Linux. While it is possible to run Lodestar in a number of ways, for performance profiling it is recommended to not use Dockerized implementations. It is best to run Lodestar as a service on a Linux machine. Follow the Lodestar docs to get the service installed and running. Then come back here when you are ready to generate the flamegraph.

    Modifying Linux and Lodestar

    Use the following two commands to install perf for generating the stack traces. You may get a warning about needing to restart the VM due to kernel updates. This is nothing to be concerned with and if so, cancel out of the restart dialog.

    @@ -75,6 +75,6 @@

    Collecti
  • https://gist.github.com/zeusdeux/aac6f8500917319213c5
  • https://gist.github.com/loderunner/36724cc9ee8db66db305
  • https://keith.github.io/xcode-man-pages/xctrace.1.html
  • -

    +
    \ No newline at end of file diff --git a/contribution/tools/heap-dumps/index.html b/contribution/tools/heap-dumps/index.html index 40bc00004f89..33c97c4118d8 100644 --- a/contribution/tools/heap-dumps/index.html +++ b/contribution/tools/heap-dumps/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Heap Dump Analysis

    +

    Heap Dump Analysis

    There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.

    JavaScript Heap Dump

    Node has built in V8 heap dump access and its a very powerful tool for analyzing memory usage. Understanding how the dump is created will both help to understand how it is displayed and how to use the analysis more effectively.

    @@ -26,7 +26,7 @@

    Viewi

    DevTools

    Click on the Open dedicated DevTools for Node link to open the node specific window and click on the Memory tab as shown below.

    Memory Tab

    -

    Load the profile by either right clicking on the left pane or by clicking the Load button at the bottom.

    +

    Load the profile by either right-clicking on the left pane or by clicking the Load button at the bottom.

    Load Profile

    Analyzing a V8 heap dump

    Analysis is as much an art as it is a science and the best way to learn is to do it a few times. Generally the goal is looking for memory leaks but reducing memory overhead is also something that happens. This guide will focus on leaks. With memory leaks one is looking for why objects have references that prevent them from being garbage collected.

    @@ -38,7 +38,7 @@

    Ana

    Having a good understanding of the codebase will help to narrow down where to look. It is also common that the leak is not coming directly from Lodestar code, but rather one of the dependencies so be careful not to rule those out.

    Native Heap Dump

    note: collecting a native heap dump is only supported on linux, analysis can be done from linux or Mac

    -

    There are several tools that can be used to do native heap dump analysis. The most common are massif from the Valgrind suite, google's gperftools and heaptrack from KDE. Of the three, heaptrack is the most user friendly tool, and it is specifically designed for the task. It is much faster than Valgrind, easier to integrate than gperftools and also includes a gui for result analysis. Often times there are also memory allocations that are not related to memory leaks, and tools like Valgrind and gperftools become less useful. This is why heaptrack is the recommended tool for heap dump analysis on Lodestar.

    +

    There are several tools that can be used to do native heap dump analysis. The most common are massif from the Valgrind suite, google's gperftools and heaptrack from KDE. Of the three, heaptrack is the most user-friendly tool, and it is specifically designed for the task. It is much faster than Valgrind, easier to integrate than gperftools and also includes a gui for result analysis. Often times there are also memory allocations that are not related to memory leaks, and tools like Valgrind and gperftools become less useful. This is why heaptrack is the recommended tool for heap dump analysis on Lodestar.

    There are a few things that will make the results with heaptrack far better. The most important is using debug builds of all libraries included in a binary, including the application itself. This will make the results usable. Not to say that they will be useless without debug symbols but it will be kinda tough to optimize functions without knowing the function names nor the file and line numbers.

    This is the heart of what heaptrack will do for us. It hooks into the memory allocation and adds in stack traces for each malloc call site. That way every time memory is reserved there is a way to track back where it happened in the code. heaptrack also hooks into the free function and checks that versus the allocations to check for memory leaks and for temporary variables that can be optimized. This also allows for optimization of how many of each object is created by identifying high frequency allocations.

    Generally the .heapdump file will be created on a cloud server and then copied to a local machine for analysis, mostly because the gui is not available through ssh. The gui is not required for analysis but it is much easier to use than the command line tools. The first step will be to install heaptrack on the target server and to capture a profile.

    @@ -62,6 +62,6 @@

    Installing heaptrack-gui on OSX

    At the time of writing this there is no official pre-built binary for OSX. This was a bit of a challenge but it was WELL worth the effort as the tool works very well. There were a number of bugs along the way while "using the docs" so your mileage may vary, but this is what worked for me.

    Most of the dependencies can be installed via Homebrew and the tool itself needs to be built from source. There was one dependency that needed to be built from source. This process assumes a working folder that the repos can be cloned into.

    -
    # Start in the root folder where the repos will be cloned
    $ brew install qt@5

    # prepare tap of kde-mac/kde
    $ brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git
    $ "$(brew --repo kde-mac/kde)/tools/do-caveats.sh"

    # install the kde-mac and other required dependencies
    $ brew install kde-mac/kde/kf5-kcoreaddons \
    $ kde-mac/kde/kf5-kitemmodels \
    $ kde-mac/kde/kf5-kconfigwidgets \
    $ kde-mac/kde/kdiagram \
    $ extra-cmake-modules \
    $ ki18n \
    $ threadweaver \
    $ boost \
    $ zstd \
    $ gettext

    # There is a bug in the current version of kde-mac/kde and one dependency needs
    # to be built manually. This is the workaround to get it built.
    $ git clone https://invent.kde.org/frameworks/kio.git
    $ mkdir kio/build
    $ cd kio/build
    $ export CMAKE_PREFIX_PATH=$(brew --prefix qt@5)
    $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
    $ ninja
    $ sudo ninja install
    $ cd ../..

    # Now make sure that the dependencies are available to the system during runtime
    $ ln -sfv "$(brew --prefix)/share/kf5" "$HOME/Library/Application Support"
    $ ln -sfv "$(brew --prefix)/share/knotifications5" "$HOME/Library/Application Support"
    $ ln -sfv "$(brew --prefix)/share/kservices5" "$HOME/Library/Application Support"
    $ ln -sfv "$(brew --prefix)/share/kservicetypes5" "$HOME/Library/Application Support"

    # We are now ready to build the heaptrack_gui binaries for analysis on OSX
    $ git clone https://invent.kde.org/sdk/heaptrack.git
    $ cd heaptrack
    $ mkdir build
    $ cd build
    $ CMAKE_PREFIX_PATH=$(brew --prefix qt@5) PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake ..
    $ cmake -DCMAKE_BUILD_TYPE=Release ..
    $ make heaptrack_gui
    $ sudo make install
    # You can now find heaptrack_gui with your gui Applications. It is default
    # placed as /Applications/KDE/heaptrack_gui.app
    +
    # Start in the root folder where the repos will be cloned
    $ brew install qt@5

    # prepare tap of kde-mac/kde
    $ brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git
    $ "$(brew --repo kde-mac/kde)/tools/do-caveats.sh"

    # install the kde-mac and other required dependencies
    $ brew install kde-mac/kde/kf5-kcoreaddons \
    $ kde-mac/kde/kf5-kitemmodels \
    $ kde-mac/kde/kf5-kconfigwidgets \
    $ kde-mac/kde/kdiagram \
    $ extra-cmake-modules \
    $ ki18n \
    $ threadweaver \
    $ boost \
    $ zstd \
    $ gettext

    # There is a bug in the current version of kde-mac/kde and one dependency needs
    # to be built manually. This is the workaround to get it built.
    $ git clone https://invent.kde.org/frameworks/kio.git
    $ mkdir kio/build
    $ cd kio/build
    $ export CMAKE_PREFIX_PATH=$(brew --prefix qt@5)
    $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
    $ ninja
    $ sudo ninja install
    $ cd ../..

    # Now make sure that the dependencies are available to the system during runtime
    $ ln -sfv "$(brew --prefix)/share/kf5" "$HOME/Library/Application Support"
    $ ln -sfv "$(brew --prefix)/share/knotifications5" "$HOME/Library/Application Support"
    $ ln -sfv "$(brew --prefix)/share/kservices5" "$HOME/Library/Application Support"
    $ ln -sfv "$(brew --prefix)/share/kservicetypes5" "$HOME/Library/Application Support"

    # We are now ready to build the heaptrack_gui binaries for analysis on OSX
    $ git clone https://invent.kde.org/sdk/heaptrack.git
    $ cd heaptrack
    $ mkdir build
    $ cd build
    $ CMAKE_PREFIX_PATH=$(brew --prefix qt@5) PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake ..
    $ cmake -DCMAKE_BUILD_TYPE=Release ..
    $ make heaptrack_gui
    $ sudo make install
    # You can now find heaptrack_gui with your gui Applications. It is default
    # placed as /Applications/KDE/heaptrack_gui.app
    \ No newline at end of file diff --git a/contribution/tools/perf/index.html b/contribution/tools/perf/index.html index 9e77cc933998..e032afbd1001 100644 --- a/contribution/tools/perf/index.html +++ b/contribution/tools/perf/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + - + \ No newline at end of file diff --git a/faqs/index.html b/faqs/index.html index 9340618ac26a..243c4b192e3e 100644 --- a/faqs/index.html +++ b/faqs/index.html @@ -3,13 +3,13 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Frequently Asked Questions

    -

    This section of the documentation will cover common questions and encounters often asked by users and developers.

    +

    Frequently Asked Questions

    +

    This section of the documentation will cover common questions and common encounters by users and developers.

    Tooling

    "Package manager issues"

    Lodestar relies on Corepack and associated packageManager value to manage its package manager version.

    Make sure corepack is correctly enabled if you encounter some package manager related issues:

    corepack enable

    Troubleshooting Lodestar

    @@ -20,6 +20,6 @@

    Using Kuber them similar to command line arguments, meaning any unknown argument will cause an error.

    ✖ Unknown arguments: servicePort, servicePortEthConsensusP2p,
    port9000Tcp, port9000TcpPort, port9000TcpProto, port9000TcpAddr, serviceHost

    The extra arguments are present because Kubernetes automatically adds environment variables to the Pod based on the name (metadata.name) defined in the associated Service. -To resolve the issue, this name has to be changed to something that does not start with lodestar.

    Reference Issue: #6045

    +To resolve the issue, this name has to be changed to something that does not start with lodestar.

    Reference Issue: #6045

    \ No newline at end of file diff --git a/index.html b/index.html index fbb59d7e2e4c..de42df13e5ba 100644 --- a/index.html +++ b/index.html @@ -4,19 +4,19 @@ Lodestar Documentation - - + + -

    Home

    lodestar logo

    -

    Welcome to the Lodestar documentation

    +

    Home

    lodestar logo

    +

    Welcome to the Lodestar Documentation

    -

    Lodestar is an open-source Ethereum Consensus client and Typescript ecosystem, maintained by ChainSafe Systems

    +

    Lodestar is an open-source Ethereum Consensus client and TypeScript ecosystem, maintained by ChainSafe Systems

    -

    Getting started

    +

    Getting Started

    Specifications

    Hardware specifications minimum / recommended, to run the Lodestar client.

    -
    MinimumRecommended
    ProcessorIntel Core i3–9100 or AMD Ryzen 5 3450Intel Core i7–9700 or AMD Ryzen 7 4700
    Memory16GB RAM32GB RAM
    Storage100GB available space SSD1TB available space SSD
    InternetBroadband connectionBroadband connection
    -

    About these docs

    -

    This documentation is open source, contribute at Github Lodestar repository /docs.

    -

    Need assistance?

    -

    If you have questions about this documentation, feel free to talk to us on our ChainSafe Discord or open an issue and a member of the team or our community will be happy to assist you.

    +
    MinimumRecommended
    ProcessorIntel Core i3–9100 or AMD Ryzen 5 3450Intel Core i7–9700 or AMD Ryzen 7 4700
    Memory8 GB RAM16 GB RAM
    Storage130 GB available space SSD200 GB available space SSD
    InternetReliable broadband with 10mbps uploadReliable broadband with >10mbps upload
    +

    Execution Client

    +

    If you run the execution client on the same host, you will need to check their requirements and add them to the above requirements. Broadly, to run both an execution and a consensus client on the same machine, we recommend a 4 TB SSD and 32 GB RAM.

    +

    About These Docs

    +

    This documentation is open source, contribute on our Github Lodestar repository /docs.

    +

    Need Assistance?

    +

    If you have questions about this documentation, feel free to talk to us on our ChainSafe Discord or open an issue and a member of the team or our community will be happy to assist you.

    \ No newline at end of file diff --git a/install b/install new file mode 100644 index 000000000000..f6db9948eeda --- /dev/null +++ b/install @@ -0,0 +1,91 @@ +#!/bin/bash + +# ASCII art +echo " _ _ _ " +echo " | | | | | | " +echo " | | ___ __| | ___ ___| |_ __ _ _ __ " +echo " | |/ _ \ / _ |/ _ \/ __| __/ _ | __|" +echo " | | (_) | (_| | __/\__ \ || (_| | | " +echo " |_|\___/ \__ _|\___||___/\__\__ _|_| " +echo "" + +# Declare directories +TEMP_DIR=$(mktemp -d) +LOCAL_BIN="$HOME/.local/bin" + +# Ensure ~/.local/bin exists +mkdir -p "$LOCAL_BIN" + +# Inform the user about temporary directory usage +echo "Using temporary directory: $TEMP_DIR" + +# Fetch the latest release tag from GitHub +echo "Fetching the latest version information..." +VERSION=$(curl -s "https://api.github.com/repos/ChainSafe/lodestar/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + +# Check if VERSION is empty +if [ -z "$VERSION" ]; then + echo "Failed to fetch the latest version. Exiting." + exit 1 +fi + +echo "Latest version detected: $VERSION" + +# Detect the operating system and architecture +OS=$(uname -s) +ARCH=$(uname -m) + +# Translate architecture to expected format +case $ARCH in + x86_64) ARCH="amd64" ;; + aarch64|arm64) ARCH="arm64" ;; + *) + echo "Unsupported architecture: $ARCH. Exiting." + exit 1 + ;; +esac + +# Translate OS to expected format +case $OS in + Linux) PLATFORM="linux-$ARCH" ;; + *) + echo "Unsupported operating system: $OS. Exiting." + exit 1 + ;; +esac + +# Construct the download URL +URL="https://github.com/ChainSafe/lodestar/releases/download/$VERSION/lodestar-$VERSION-$PLATFORM.tar.gz" +echo "Downloading from: $URL" + +# Download the tarball +if ! wget "$URL" -O "$TEMP_DIR/lodestar-$VERSION-$PLATFORM.tar.gz"; then + echo "Download failed. Exiting." + exit 1 +fi + +# Extract the tarball +echo "Extracting the binary..." +if ! tar -xzf "$TEMP_DIR/lodestar-$VERSION-$PLATFORM.tar.gz" -C "$TEMP_DIR"; then + echo "Extraction failed. Exiting." + exit 1 +fi + +# Move the binary to ~/.local/bin +echo "Moving the binary to $LOCAL_BIN..." +mv "$TEMP_DIR/lodestar" "$LOCAL_BIN/" +chmod +x "$LOCAL_BIN/lodestar" + +# Verify if ~/.local/bin is in PATH +if [[ ":$PATH:" != *":$LOCAL_BIN:"* ]]; then + echo "Adding $LOCAL_BIN to PATH..." + echo 'export PATH="$PATH:$HOME/.local/bin"' >> "$HOME/.bashrc" + echo "Run 'source ~/.bashrc' to apply changes to your shell." +fi + +# Clean up the temporary directory +rm -rf "$TEMP_DIR" + +# Inform the user of successful installation +echo "Installation complete!" +echo "Run 'lodestar --help' to get started." diff --git a/introduction/index.html b/introduction/index.html index 800ffb361ef1..20d8c8bae1cb 100644 --- a/introduction/index.html +++ b/introduction/index.html @@ -3,29 +3,29 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Introduction

    -

    Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the most actively used blockchain. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards and has been actively working in the Ethereum space ever since. We are proud to develop Lodestar and to present this documentation as a resource for the Ethereum community.

    +

    Introduction

    +

    Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the second-largest blockchain by market capitalization. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards in 2017 and has been actively working in the Ethereum ecosystem ever since. We are proud to develop Lodestar, the only TypeScript based consensus client, and to present this documentation as a resource for the Ethereum community.

    Proof of Stake

    -

    In Ethereum's Proof of Stake (PoS) model, validators replace miners from the Proof of Work (PoW) system. Validators are Ethereum stakeholders who lock up a portion of their Ether as a stake. The protocol randomly selects these validators to propose new blocks. The chance of being chosen is tied to the size of their stake: the more Ether staked, the higher the probability of being selected to propose the block. Proposers receive transaction fees and block rewards as incentives. Validators are also responsible for voting on the validity of blocks proposed by other validators. However, they face penalties, known as slashing, for actions like double-signing, votes on a block that is not in the majority or going offline, ensuring network integrity and reliability. The PoS mechanism significantly reduces energy consumption compared to PoW, because it does not require extensive computational power. Moreover, PoS tends to facilitate faster transaction validations and block creations, enhancing the overall performance and scalability of the network.

    +

    In Ethereum's Proof of Stake (PoS) model, validators replace miners from the Proof of Work (PoW) system. Validators are Ethereum stakeholders who lock up a portion of their Ether as a stake. The protocol randomly selects these validators to propose new blocks. The chance of being chosen is tied to the size of their stake: the more Ether staked, the higher the probability of being selected to propose the block. Proposers receive transaction fees and block rewards as incentives. Validators are also responsible for voting on the validity of blocks proposed by other validators. However, they also face penalties, known as slashing, for actions like signing two different block proposals in the same slot or voting on two different attestations for the same target epoch, which creates conflicting states. The PoS mechanism significantly reduces energy consumption compared to PoW, because it does not require extensive computational power. Moreover, PoS tends to facilitate faster transaction validations and block creations, enhancing the overall performance and scalability of the network.

    Consensus Clients

    -

    In an effort to promote client diversity there are several beacon-nodes being developed. Each is programmed in a different language and by a different team. The following is a list of the current beacon-node clients:

    +

    In an effort to promote client diversity there are several consensus beacon nodes being developed. Each is programmed in a different language and by a different team. The following is a list of the current open source consensus clients in alphabetical order:

    Why Client Diversity?

    -

    The Ethereum network's robustness is significantly enhanced by its client diversity, whereby multiple, independently-developed clients conforming to a common specification facilitate seamless interaction and function equivalently across nodes. This client variety not only fosters a rich ecosystem but also provides a buffer against network-wide issues stemming from bugs or malicious attacks targeted at particular clients. For instance, during the Shanghai denial-of-service attack in 2016, the diversified client structure enabled the network to withstand the assault, underscoring the resilience afforded by multiple client configurations.

    -

    On the consensus layer, client distribution is crucial for maintaining network integrity and finality, ensuring transactions are irreversible once validated. A balanced spread of nodes across various clients helps mitigate risks associated with potential bugs or attacks that could, in extreme cases, derail the consensus process or lead to incorrect chain splits, thereby jeopardizing the network's stability and trust. While the data suggests a dominance of Prysm client on the consensus layer, efforts are ongoing to promote a more even distribution among others like Lighthouse, Teku, Nimbus and Grandine. Encouraging the adoption of minority clients, bolstering their documentation, and leveraging real-time client diversity dashboards are among the strategies being employed to enhance client diversity, which in turn fortifies the Ethereum consensus layer against adversities and fosters a healthier decentralized network ecosystem.

    -

    The non-finality event in May 2023 on the Ethereum network posed a significant challenge. The issue arose from attestations for a fork, which necessitated state replays to validate the attestations, causing a notable strain on system resources. As a result, nodes fell out of sync, which deterred the accurate tracking of the actual head of the chain. This situation was exacerbated by a decline in attestations during specific epochs, further hampering the consensus mechanism. The Lodestar team noticed late attestations several weeks prior to the event and implemented a feature that attempted to address such challenges by not processing untimely attestations, and thus not requiring expensive state replays​. While it was done for slightly different reasons, the result was the same. Lodestar was able to follow the chain correctly and helped to stabilize the network. This example underscored the importance of client diversity and network resilience against potential forks and replay attacks. These are considered realistic threats, especially in the context of system complexity like in Ethereum's consensus mechanism.

    +

    The Ethereum network's robustness is significantly enhanced by its client diversity, whereby multiple, independently-developed clients conforming to a common specification, facilitating seamless interaction and function equivalently across different nodes. This client variety not only fosters a rich ecosystem but also provides a buffer against network-wide issues stemming from bugs or malicious attacks targeted at particular clients. For instance, during the Shanghai denial-of-service attack in 2016, the diversified client structure enabled the network to withstand the assault, underscoring the resilience afforded by multiple client configurations.

    +

    On the consensus layer, client distribution is crucial for maintaining network integrity and finality, ensuring transactions are irreversible once validated. A balanced spread of nodes across various clients help to mitigate risks associated with potential bugs or attacks that could, in extreme cases, derail the consensus process (liveness failure) or lead to incorrect chain splits (forking), thereby jeopardizing the network's stability and trust. While the data suggests a dominance of the Prysm and Lighthouse clients on the consensus layer, efforts are ongoing to promote a more even distribution among others clients. Encouraging the adoption of minority clients, bolstering their documentation, and leveraging real-time client diversity dashboards are among the strategies being employed to enhance client diversity, which in turn fortifies the Ethereum consensus layer against adversities and fosters a healthier decentralized network.

    +

    The non-finality event of May 2023 on the Ethereum network posed a significant challenge. The issue arose from attestations for a fork, which necessitated state replays to validate the attestations, causing a notable strain on system resources. As a result, nodes fell out of sync, which deterred the accurate tracking of the actual head of the chain. This situation was exacerbated by a decline in attestations during specific epochs, further hampering the consensus mechanism from reaching finality. The Lodestar team noticed late attestations several weeks prior to the event and implemented a feature that attempted to address such challenges by not processing untimely attestations, and thus not requiring expensive state replays​. While it was done for slightly different reasons, the result was the same. Lodestar was able to follow the chain correctly and helped to stabilize the network. This example underscored the importance of client diversity and network resilience against potential forks and replay attacks. These are considered realistic threats, especially in the context of system complexity like in Ethereum's consensus mechanism.

    Ethereum Reading List

    +
    \ No newline at end of file diff --git a/libraries/api/using-the-api/index.html b/libraries/api/using-the-api/index.html index 1b65ae982fcd..69bdee3e70c1 100644 --- a/libraries/api/using-the-api/index.html +++ b/libraries/api/using-the-api/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
    +
    \ No newline at end of file diff --git a/libraries/lightclient-prover/lightclient-cli/index.html b/libraries/lightclient-prover/lightclient-cli/index.html index 1b03a5aca21b..353db5b58842 100644 --- a/libraries/lightclient-prover/lightclient-cli/index.html +++ b/libraries/lightclient-prover/lightclient-cli/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    lightclient CLI Command

    +

    lightclient CLI Command

    Run lightclient

    Examples

    Run lightclient with holesky network

    @@ -25,6 +25,9 @@

    --network--paramsFile

    Network configuration file

    type: string

    +

    --rcConfig

    +

    RC file to supplement command line args, accepted formats: .yml, .yaml, .json

    +

    type: string

    --terminal-total-difficulty-override

    Terminal PoW block TTD override

    type: string

    @@ -58,6 +61,6 @@

    --beaco

    --checkpointRoot

    Checkpoint root hex string to sync the lightclient from, start with 0x

    required: true

    -

    type: string

    +

    type: string

    \ No newline at end of file diff --git a/libraries/lightclient-prover/lightclient/index.html b/libraries/lightclient-prover/lightclient/index.html index 5c623f6903ec..b58236aa03ae 100644 --- a/libraries/lightclient-prover/lightclient/index.html +++ b/libraries/lightclient-prover/lightclient/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Lodestar Light Client

    +

    Lodestar Light Client

    Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state.

    Unlike full nodes, light clients do not download and store the entire blockchain. Instead, they download only the headers of each block and employ Merkle proofs to verify transactions. This enables a quick synchronization with the network and access the latest information without using significant system resources​. This streamlined approach to accessing Ethereum is crucial, especially in scenarios where full-scale network participation is infeasible or undesired.

    The evolution of light clients is emblematic of the broader trajectory of Ethereum towards becoming more accessible and resource-efficient, making blockchain technology more inclusive and adaptable to a wide array of use cases and environments. The Altair hard fork introduced sync committees to allow light-clients to synchronize to the network.

    @@ -22,7 +22,7 @@

    Prerequisites<

    This package is part of ChainSafe's Lodestar project

    Requirements for Running a Light-Client

    -

    Access to an beacon node that supports the light client specification is necessary. The client must support the following routes from the consensus API spec:

    +

    Access to a beacon node that supports the light client specification is necessary. The client must support the following routes from the consensus API spec:

    • GET /eth/v1/beacon/light_client/updates
    • GET /eth/v1/beacon/light_client/optimistic_update
    • @@ -33,8 +33,8 @@

      specification.

      Getting started

      Light-Client CLI Example

      It is possible to start up the light-client as a standalone process.

      @@ -43,7 +43,7 @@

      import {Lightclient, LightclientEvent} from "@lodestar/light-client";
      import {LightClientRestTransport} from "@lodestar/light-client/transport";
      import {
      getFinalizedSyncCheckpoint,
      getGenesisData,
      getConsoleLogger,
      getApiFromUrl,
      getChainForkConfigFromNetwork,
      } from "@lodestar/light-client/utils";

      const config = getChainForkConfigFromNetwork("sepolia");
      const logger = getConsoleLogger({logDebug: Boolean(process.env.DEBUG)});
      const api = getApiFromUrl("https://lodestar-sepolia.chainsafe.io", "sepolia");

      const lightclient = await Lightclient.initializeFromCheckpointRoot({
      config,
      logger,
      transport: new LightClientRestTransport(api),
      genesisData: await getGenesisData(api),
      checkpointRoot: await getFinalizedSyncCheckpoint(api),
      opts: {
      allowForcedUpdates: true,
      updateHeadersOnForcedUpdate: true,
      },
      });

      // Wait for the lightclient to start
      await lightclient.start();

      logger.info("Lightclient synced");

      lightclient.emitter.on(LightclientEvent.lightClientFinalityHeader, async (finalityUpdate) => {
      logger.info("Received finality update", {slot: finalityUpdate.beacon.slot});
      });

      lightclient.emitter.on(LightclientEvent.lightClientOptimisticHeader, async (optimisticUpdate) => {
      logger.info("Received optimistic update", {slot: optimisticUpdate.beacon.slot});
      });

    Browser Integration

    -

    If you want to use Lightclient in browser and facing some issues in building it with bundlers like webpack, vite. We suggest to use our distribution build. The support for single distribution build is started from 1.20.0 version.

    +

    If you want to use Lightclient in browser and are facing some issues in building it with bundlers like webpack, vite. We suggest using our distribution build. The support for single distribution build is started from 1.20.0 version.

    Directly link the dist build with the <script /> tag with tools like unpkg or other. e.g.

    <script src="https://www.unpkg.com/@lodestar/light-client@1.20.0/dist/lightclient.min.mjs" type="module">

    Then the lightclient package will be exposed to globalThis, in case of browser environment that will be window. You can access the package as window.lodestar.lightclient. All named exports will also be available from this interface. e.g. window.lodestar.lightclient.transport.

    @@ -52,6 +52,6 @@

    Browser

    Contributors

    Read our contribution documentation, submit an issue or talk to us on our discord!

    License

    -

    Apache-2.0 ChainSafe Systems

    +

    Apache-2.0 ChainSafe Systems

    \ No newline at end of file diff --git a/libraries/lightclient-prover/prover/index.html b/libraries/lightclient-prover/prover/index.html index 6f6de8d6ec40..74a5cd8dc48a 100644 --- a/libraries/lightclient-prover/prover/index.html +++ b/libraries/lightclient-prover/prover/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Lodestar Prover

    + +

    Apache-2.0 ChainSafe Systems

    \ No newline at end of file diff --git a/reference/cli/index.html b/reference/cli/index.html index a32d8eb621ad..eaaaeefdf77f 100644 --- a/reference/cli/index.html +++ b/reference/cli/index.html @@ -4,8 +4,8 @@ Lodestar Documentation - - + +
    + \ No newline at end of file diff --git a/run/beacon-management/beacon-cli/index.html b/run/beacon-management/beacon-cli/index.html index 61047919b875..8d6c384849cd 100644 --- a/run/beacon-management/beacon-cli/index.html +++ b/run/beacon-management/beacon-cli/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    beacon CLI Command

    +

    beacon CLI Command

    Run a beacon chain node

    Examples

    Run a beacon chain node and connect to the holesky testnet

    @@ -25,6 +25,9 @@

    --network--paramsFile

    Network configuration file

    type: string

    +

    --rcConfig

    +

    RC file to supplement command line args, accepted formats: .yml, .yaml, .json

    +

    type: string

    --terminal-total-difficulty-override

    Terminal PoW block TTD override

    type: string

    @@ -34,6 +37,9 @@

    --terminal-block-hash-epoch-override

    Terminal PoW block hash override activation epoch

    type: string

    +

    --genesisStateFile

    +

    Path or URL to download a genesis state file in ssz-encoded format

    +

    type: string

    --checkpointSyncUrl

    Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint

    type: string

    @@ -46,6 +52,12 @@

    --wssC

    --forceCheckpointSync

    Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while.

    type: boolean

    +

    --ignoreWeakSubjectivityCheck

    +

    Ignore the checkpoint sync state failing the weak subjectivity check. This is relevant in testnets where the weak subjectivity period is too small for even few epochs of non finalization causing last finalized to be out of range. This flag is not recommended for mainnet use.

    +

    type: boolean

    +

    --persistNetworkIdentity

    +

    Whether to reuse the same peer-id across restarts

    +

    type: boolean

    --private

    Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests

    type: boolean

    @@ -242,6 +254,6 @@

    --enr.udp6type: number

    --nat

    Allow configuration of non-local addresses

    -

    type: boolean

    +

    type: boolean

    \ No newline at end of file diff --git a/run/beacon-management/data-retention/index.html b/run/beacon-management/data-retention/index.html index 2ca0b1c5f94e..d82c372e8e72 100644 --- a/run/beacon-management/data-retention/index.html +++ b/run/beacon-management/data-retention/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Data Retention

    +

    Data Retention

    There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information.

    There are several processes that need to store data for Lodestar. These data sets can grow quite large over time so it is important to understand how to manage them so the host machine can support operations effectively.

    $executionDir # this changes depending on the execution client
    └── execution-db

    $dataDir # specified by --dataDir on the beacon command
    ├── .log_rotate_audit.json
    ├── beacon.log # there can be many of these
    ├── enr
    ├── peer-id.json
    ├── chain-db # default if --dbDir not specified
    │ └── (db files)
    └── peerstore # default if --peerStoreDir not specified
    └── (peerstore files)

    $dataDir # specified by --dataDir on the validator command
    ├── .log_rotate_audit.json
    ├── validator.log # there can be many of these
    ├── validator-db # default if --validatorsDbDir not specified
    │ └── (db files)
    ├── proposerConfigs # default if --proposerDir not specified
    │ └── (config files)
    ├── cache # default if --cacheDir not specified
    │ └── (cache files)
    ├── secrets # default if --secretsDir not specified
    │ ├── 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037...
    │ └── 0xa329f988c16993768299643d918a2694892c012765d896a16f...
    ├── keystores # default if --keystoresDir not specified
    │ ├── 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037...
    │ │ └── voting-keystore.json
    │ └── 0xa329f988c16993768299643d918a2694892c012765d896a16f...
    │ └── voting-keystore.json
    └── remoteKeys # default if --remoteKeysDir not specified
    └── 0xa329f988c16993768299643d918a2694892c012765d896a16f.json
    @@ -20,7 +20,7 @@

    Data Managem
  • validator-db grows at less than 2MB per year, per key (2000 keys = 4GB per year)
  • keystores, keystore-cache and peerstore are not usually very large and are not expected to grow much during normal operation.

    -

    Logs can also become quite large so please check out the section on log management for more information.

    -

    There is really only one flag that is needed to manage the data for Lodestar, --dataDir. Other than that handling log management is really the heart of the data management story. Beacon node data is what it is. Depending on the execution client that is chosen, there may be flags to help with data storage growth but that is outside the scope of this document.

    +

    Logs can also become quite large so please check out the section on log management for more information.

    +

    There is really only one flag that is needed to manage the data for Lodestar, --dataDir. Other than that handling log management is really the heart of the data management story. Beacon node data is what it is. Depending on the execution client that is chosen, there may be flags to help with data storage growth but that is outside the scope of this document.

    \ No newline at end of file diff --git a/run/beacon-management/mev-and-builder-integration/index.html b/run/beacon-management/mev-and-builder-integration/index.html index 158a541c7e5a..c1c45756bdd8 100644 --- a/run/beacon-management/mev-and-builder-integration/index.html +++ b/run/beacon-management/mev-and-builder-integration/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    MEV & Merge

    +

    MEV & Merge

    MEV is a term that refers to the bundling of transactions in one particular order to extract (mostly) arbitrage opportunities on the dApps and decentralized exchanges.

    And the ones who gets to include these execution payloads (miners before the merge, validators after the merge) in the canonical chain get paid a per-block reward which essentially should be higher than the normal payload inclusion reward (including transactions tips).

    Currently these happen with miners running forked versions of their favorite execution client, integrating with these "builders" but in the post-merge world they get a more native and standard integration with the CL.

    @@ -27,6 +27,6 @@
    +

    Even though its possible to directly hook lodestar with an external Builder/Relay, its recommended to interface it with the MEV world via local MEV-BOOST multiplexer which can integrate multiple builder/relays for you and provide some payload verification on top, as currently Lodestar assumes this to be a trusted endpoint.

    \ No newline at end of file diff --git a/run/beacon-management/networking/index.html b/run/beacon-management/networking/index.html index 5bb10badc9ca..6c20b5615944 100644 --- a/run/beacon-management/networking/index.html +++ b/run/beacon-management/networking/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Networking

    +

    Networking

    Lodestar will automatically connect to peers on the network. Peers are found through the discv5 protocol and once peers are established communications happen via gossipsub over libp2p. While not necessary, having a basic understanding of how the various protocols and transports work will help with debugging and troubleshooting as some of the more common challenges come up with firewalls and NAT traversal.

    Networking Flags

    Some of the important Lodestar flags related to networking are:

    @@ -74,6 +74,6 @@

    Firewall
  • 8551/TCP - Execution engine port for Lodestar to communicate with the execution client
  • NAT Traversal

    -

    Lodestar does not support UPnP. If you are behind a NAT you will need to manually forward the ports listed above.

    +

    Lodestar does not support UPnP. If you are behind a NAT you will need to manually forward the ports listed above.

    \ No newline at end of file diff --git a/run/beacon-management/starting-a-node/index.html b/run/beacon-management/starting-a-node/index.html index 181e9fb12f7b..eb8340559bd2 100644 --- a/run/beacon-management/starting-a-node/index.html +++ b/run/beacon-management/starting-a-node/index.html @@ -3,27 +3,25 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Beacon management

    -

    The following instructions are required to setup and run a Lodestar beacon node.

    -

    Connect to mainnet or a public testnet

    -

    Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal.

    -

    Make sure Lodestar is installed in your local environment, following the chosen install method. The following command should return a non error message.

    +

    Beacon Management

    +

    Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal. The following instructions are required to configure and run the Lodestar beacon node. This page assumes you have already setup an Ethereum execution client.

    +

    Connect to Mainnet or a Public Testnet

    +

    Make sure Lodestar is installed in your local environment, following the chosen Installation method. The following command should return a non-error message.

    ./lodestar --help

    For a complete list of beacon node CLI commands and options, see the beacon CLI Command section.

    -

    To select a known testnet or mainnet, use the --network flag. mainnet is selected by default, and a list of available networks is listed with the --help flag. Setting the --network flag will conveniently configure the beacon node or validator client for the selected network. For power users, any configuration option should be able to be overridden.

    -

    Configure the Lodestar JWT authentication token

    -

    Post-Merge Ethereum will require secure authentication with the Engine API connection on your chosen Execution node.

    -
    info

    Post-Merge Ethereum requires a secure, authenticated connection to the Execution client on port 8551. We recommend setting this up now to ensure a proper configuration before the Merge.

    -

    Generate a secret key

    +

    To select a known testnet or mainnet, use the --network flag. The option mainnet is selected by default, and a list of available networks is listed with the --help flag. Setting the --network flag will conveniently configure the beacon node for the selected network. For power users, any configuration option should be able to be overridden.

    +

    Configure the Lodestar JWT Authentication Token

    +

    Ethereum requires a secure authentication with the Engine API for connecting to your chosen execution client on port 8551.

    +

    Generate a Secret Key

    You must generate a secret 32-byte (64 characters) hexadecimal string that will be used to authenticate with an execution node. You can use the following command in most terminals to generate a random secret: openssl rand -hex 32. Or you can use an online generator. Save this secret key into a text file and note where you store this file.

    -

    Configure Lodestar to locate the JWT secret

    +

    Configure Lodestar to Locate the JWT Secret

    When starting up a Lodestar beacon node in any configuration, ensure you add the --jwtSecret $JWT_SECRET_PATH flag to point to the saved secret key file.

    -

    Ensure JWT is configured with your execution node

    +

    Configure the Execution Client with the JWT Secret

    For Go Ethereum: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here.

    For Nethermind: @@ -34,37 +32,36 @@

    here.

    For Reth: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here.

    -

    Run a beacon node

    -

    To start a Lodestar beacon run the command:

    +

    Run the Beacon Node

    +

    To start the Lodestar beacon, run the command:

    ./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH
    -

    This will assume an execution-layer client is available at the default -location of https://localhost:8545.

    -

    In case execution-layer clients are available at different locations, use --execution.urls to specify these locations in the command:

    +

    This will assume an execution client is available at the default location of https://localhost:8545.

    +

    If the execution clients are available at different locations, use the flag --execution.urls to specify these locations in the command:

    ./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH --execution.urls $EL_URL1 $EL_URL2
    -

    Immediately you should see confirmation that the node has started

    -
    Apr-20 15:12:45.274[]                 info: Lodestar network=mainnet, version=v1.7.2, commit=
    Apr-20 15:12:45.327[] info: Connected to LevelDB database path=/data/mt1/chain-db
    Apr-20 15:12:57.747[] info: Initializing beacon from a valid db state slot=6264480, epoch=195765, stateRoot=0x8133cd4d0be59c3e94405f902fe0ad68ffaa5013b525dddb6285b91ad79716f6, isWithinWeakSubjectivityPeriod=true
    Apr-20 15:13:18.077[network] info: PeerId 16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ, Multiaddrs /ip4/127.0.0.1/tcp/9000/p2p/16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ,/ip4/10.244.0.199/tcp/9000/p2p/16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ
    Apr-20 15:13:18.270[rest] info: Started REST API server address=http://127.0.0.1:9596
    Apr-20 15:13:18.271[] warn: Low peer count peers=0
    Apr-20 15:13:18.280[] info: Searching peers - peers: 0 - slot: 6264964 - head: (slot - 484) 0x7ee6…2a15 - exec-block: syncing(17088043 0x9442…) - finalized: 0xe359…4d7e:195763
    Apr-20 15:13:23.009[chain] info: Validated transition configuration with execution client terminalTotalDifficulty=0xc70d808a128d7380000, terminalBlockHash=0x0000000000000000000000000000000000000000000000000000000000000000, terminalBlockNumber=0x0
    Apr-20 15:13:29.287[] info: Syncing - ? left - 0.00 slots/s - slot: 6264965 - head: (slot - 485) 0x7ee6…2a15 - exec-block: syncing(17088043 0x9442…) - finalized: 0xe359…4d7e:195763 - peers: 1
    Apr-20 15:14:41.003[] info: Syncing - 22 seconds left - 4.92 slots/s - slot: 6264971 - head: (slot - 108) 0xd15f…b605 - exec-block: valid(17088414 0x3dba…) - finalized: 0x70fd…5157:195775 - peers: 4
    Apr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot - 45) 0x44e4…20a4 - exec-block: valid(17088475 0xca61…) - finalized: 0x9cbd…ba83:195776 - peers: 8
    Apr-20 15:15:01.443[network] info: Subscribed gossip core topics
    Apr-20 15:15:01.446[sync] info: Subscribed gossip core topics
    Apr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea…c655 - exec-block: valid(17088521 0xca9b…) - finalized: 0x6981…682f:195778 - peers: 6
    -
    info

    If your node is stuck with Searching for peers review your network configuration to make sure your ports are open.

    +

    Your initial logs should confirm that the node has started.

    +
    Jul-31 13:35:27.967[]                 info: Lodestar network=mainnet, version=v1.21.0/ff35faa, commit=ff35faae4ad1697b86d708a0367a95a71648ab6e
    Jul-31 13:35:28.344[] info: Connected to LevelDB database path=/data/lodestar/chain-db
    Jul-31 13:35:49.828[] info: Initializing beacon from a valid db state slot=9633504, epoch=301047, stateRoot=0xfa2845a6877b98555906a1654941c97d9c05bdd41e61cc0870a967dc9030b156, isWithinWeakSubjectivityPeriod=true
    Jul-31 13:35:51.955[chain] info: Historical state worker started
    Jul-31 13:35:51.969[eth1] info: Eth1 provider urls=http://localhost:8551
    Jul-31 13:35:51.975[execution] info: Execution client urls=http://localhost:8551
    Jul-31 13:35:51.977[] info: External builder url=http://localhost:8661
    Jul-31 13:36:21.128[network] info: running libp2p instance in worker thread
    Jul-31 13:36:21.727[network] info: libp2p worker started peer=15Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW
    Jul-31 13:36:27.677[network] info: discv5 worker started peerId=16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, initialENR=enr:-IO4QHGTUd1Zg8LAhUAioOz_ySTKoJLIOa6zltSP_AvvhTFVYw6M6YB35IxsiKxQG7nUgCpUB5SIsNxMntCNlTK9sMEBgmlkgnY0iXNlY3AyNTZrMaEC24cdmzuGnWqSwF-8Hw2gbkAZDzMWW3LsHJfp_kDhy-GDdGNwgiMog3VkcIIeWH, bindAddr4=/ip4/0.0.0.0/udp/9000
    Jul-31 13:36:28.134[network] info: PeerId 16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, Multiaddrs /ip4/0.0.0.0/tcp/9000
    Jul-31 13:36:28.137[metrics] info: Started metrics HTTP server address=http://127.0.0.1:8008
    Jul-31 13:36:28.256[rest] info: Started REST API server address=http://0.0.0.0:9596
    Jul-31 13:36:28.257[] info: Searching peers - peers: 0 - slot: 9634080 - head: (slot -576) 0x9d88…d02a - exec-block: syncing(20426302 0xcec4…) - finalized: 0x7feb…c130:301045
    Jul-31 13:36:36.461[execution] info: Execution client is synced oldState=ONLINE, newState=SYNCED
    Jul-31 13:36:53.019[] info: Syncing - 3.7 minutes left - 2.32 slots/s - slot: 9634082 - head: (slot -515) 0x792f…f8aa - exec-block: valid(20426365 0x58b1…) - finalized: 0x9d88…d02a:301047 - peers: 11
    Jul-31 13:38:53.168[] info: Syncing - 11 seconds left - 4.01 slots/s - slot: 9634092 - head: (slot -44) 0x7491…f63e - exec-block: valid(20426841 0xd4b2…) - finalized: 0x1e00…6e6b:301062 - peers: 59
    Jul-31 13:38:58.051[network] info: Subscribed gossip core topics
    Jul-31 13:38:58.132[sync] info: Subscribed gossip core topics
    Jul-31 13:39:05.001[] info: Synced - slot: 9634093 - head: 0x35de…1f0e - exec-block: valid(20426886 0x10ff…) - finalized: 0x88f8…5375:301063 - peers: 70
    Jul-31 13:39:17.000[] info: Synced - slot: 9634094 - head: 0x7844…3b3e - exec-block: valid(20426887 0x67d1…) - finalized: 0x88f8…5375:301063 - peers: 69
    Jul-31 13:39:29.000[] info: Synced - slot: 9634095 - head: 0x5516…ba12 - exec-block: valid(20426888 0x4ceb…) - finalized: 0x88f8…5375:301063 - peers: 74
    +
    info

    If your node is stuck with Searching peers, review your network configuration to make sure your ports are open and forwarded to your host machine.

    By default, Lodestar stores all configuration and chain data at the path $XDG_DATA_HOME/lodestar/$NETWORK_NAME.

    -

    A young testnet should take a few hours to sync. If you see multiple or consistent errors in the logs, please open a Github issue or reach out to us in Discord. Just by reporting anomalies you are helping accelerate the progress of Ethereum Consensus, thanks for contributing!

    -
    warning

    It is dangerous to expose your Beacon APIs publicly as there is no default authentication mechanism provided. Ensure your beacon node host is not exposing ports 8545 or 9596 outside of your internal network.

    +

    A young testnet should take a few hours to sync. If you see multiple or consistent errors in the logs, please open a Github issue or reach out to us in Discord. By reporting anomalies, you are helping to accelerate the progress of Ethereum consensus and we thank you for contributing!

    +
    warning

    It is dangerous to expose your Beacon or Execution APIs publicly as there is no default authentication mechanism provided. Ensure your beacon node host is not exposing ports 8545 or 9596 outside of your internal network.

    Checkpoint Sync

    -

    If you are starting your node from a blank db, like starting from genesis, or from the last saved state in db and the network is now far ahead, your node will be susceptible to "long range attacks." Ethereum's solution to this is via something called weak subjectivity. Read Vitalik's illuminating post explaining weak subjectivity..

    -

    If you have a synced beacon node available (e.g., your friend's node or an infrastructure provider) and a trusted checkpoint you can rely on, you can start off your beacon node in under a minute! And at the same time kicking the "long range attack" in its butt!

    +

    If you are starting your node from a blank database, or from a last saved database state that is too old (outside of the weak subjectivity period), your node will be susceptible to "long range attacks." Ethereum's solution to this attack is via something called weak subjectivity. Read Vitalik's illuminating post explaining weak subjectivity..

    +

    If you have a synced beacon node available (e.g., your friend's node or a trusted infrastructure provider) to serve a trusted checkpoint you can rely on, you can start syncing your beacon node from that available checkpoint with the flag --checkpointSyncUrl and passing in the URL of the checkpoint provider. This will allow your beacon node to sync within minutes rather than several days.

    +

    The Ethereum community has maintained a set of public beacon chain checkpoints that serve these sync endpoints to the larger community. You can correlate the state root and the block root with more than one provider to verify the checkpoints being served follow the same canonical chain.

    Just supply these extra arguments to your beacon node command:

    --checkpointSyncUrl <synced node url> [--wssCheckpoint <trusted checkpoint in root:epoch format>]
    -

    In case you really trust checkpointSyncUrl then you may skip providing wssCheckpoint, which will then result into your beacon node syncing and starting off the recently finalized state from the trusted URL.

    -
    warning

    Please use this option very carefully (and at your own risk), a malicious server URL can put you on the wrong chain with a danger of you losing your funds by social engineering. -If possible, validate your wssCheckpoint from multiple places (e.g. different client distributions) or from other trusted sources. This will highly reduce the risk of starting off on a malicious chain. -This list of public endpoints maintained by the Ethereum community may be used for reference.

    -

    Taking too long to sync?

    -

    After your node has been offline for a while, it might be the case that it takes a long time to sync even though a checkpointSyncUrl is specified. -This is due to the fact that the last db state is still within the weak subjectivity period (~15 days on mainnet) which causes the node -to sync from the db state instead of the checkpoint state.

    -

    It is possible to force syncing from checkpoint state by supplying the --forceCheckpointSync flag. This option is only recommended if it is absolutely +

    In case you really trust the --checkpointSyncUrl provider, then you may skip providing --wssCheckpoint, which will then result into your beacon node syncing and starting off the recently finalized state from the trusted URL.

    +
    warning

    Please be aware that a malicious checkpoint sync server URL can put you on the wrong chain with a danger of you losing your funds by social engineering. +If possible, validate your wssCheckpoint state from multiple places (e.g. different client distributions) or from other trusted sources. This will highly reduce the risk of starting off on a malicious chain. This list of public endpoints maintained by the Ethereum community may be used for reference.

    +

    Still Taking Long to Sync?

    +

    After your node has been offline for a while, it might be the case that it takes a long time to sync even though a --checkpointSyncUrl is specified. +This is due to the fact that the last database state is still within the weak subjectivity period (~15 days on mainnet) which causes the node +to sync from the database state instead of the checkpoint state.

    +

    It is possible to force syncing from a checkpoint state by supplying the --forceCheckpointSync flag. This option is only recommended if it is absolutely necessary for the node to be synced right away to fulfill its duties as there is an inherent risk each time the state is obtained from an external source.

    -

    Guide to the sync logs

    -

    Lodestar beacon sync log aims to provide information of utmost importance about your node and yet be succinct at the same time. You may see the sync logs in the following format:

    -

    [Sync status] - [ Slot info ] - [Head info] - [Exec block info] - [Finalized info] - [Peers info]

    +

    Sync Log Guide

    +

    The Lodestar beacon sync log aims to provide information of utmost importance about the state of your node and be succinct at the same time. You may see the sync logs in the following format:

    +

    [Sync status] - [ Slot info ] - [Head info] - [Execution block info] - [Finalized info] - [Peers info]

    See the following example of different kinds of sync log:

    Apr-20 15:24:08.034[]                 info: Searching peers - peers: 0 - slot: 6265018 - head: 6264018 0xed93…7b0a - exec-block: syncing(17088476 0x9649…) - finalized: 0xbf30…7e7c:195777
    Apr-20 15:24:17.000[] info: Searching peers - peers: 0 - slot: 6265019 - head: 6264018 0xed93…7b0a - exec-block: syncing(17088476 0x9649…) - finalized: 0xbf30…7e7c:195777
    Apr-20 15:13:41.298[]                 info: Syncing - 2.5 minutes left - 2.78 slots/s - slot: 6264966 - head: 6262966 0x5cec…f5b8 - exec-block: valid(17088105 0x6f74…) - finalized: 0x5cc0…3874:195764 - peers: 1
    Apr-20 15:13:41.298[] info: Syncing - 2 minutes left - 2.78 slots/s - slot: 6264967 - head: 6263965 0x5cec…f5b8 - exec-block: valid(17088105 0x6f74…) - finalized: 0x5cc0…3874:195764 - peers: 1
    @@ -73,25 +70,30 @@

    Guide
    Apr-20 15:15:41.001[]                 info: Synced - slot: 6264976 - head: (slot -1) 0x17c6…71a7 - exec-block: valid(17088524 0x5bc1…) - finalized: 0x6981…682f:195778 - peers: 8
    Apr-20 15:15:53.001[] info: Synced - slot: 6264977 - head: (slot -2) 0x17c6…71a7 - exec-block: valid(17088524 0x5bc1…) - finalized: 0x6981…682f:195778 - peers: 8
    Apr-20 15:16:05.000[]                 info: Synced - slot: 6264978 - head: 0xc9fd…28c5 - exec-block: valid(17088526 0xb5bf…) - finalized: 0x6981…682f:195778 - peers: 8
    Apr-20 15:16:17.017[] info: Synced - slot: 6264979 - head: 0xde91…d4cb - exec-block: valid(17088527 0xa488…) - finalized: 0x6981…682f:195778 - peers: 7
      +
    1. Sync status: This status takes three values:
    2. +
    +
      +
    • Synced: The node is currently synced
    • +
    • Syncing The node is currently in the syncing process
    • +
    • Searching: The node is is still looking for viable peers from where it can download blocks
    • +
    +
    1. -

      Sync status: Takes three values : Synced or Syncing (along with sync speed info) or Searching if node is is still looking for viable peers from where it can download blocks.

      -
    2. -
    3. -

      Slot (clock) info: What is the current ongoing slot as per the chain genesis

      +

      Slot (clock) info: The current ongoing slot as per the chain genesis

    4. -

      Head info: It specifies where the local chain head hash is. In case its far behind the Slot (clock) then it independently shows the head slot else it show how far behind from the Slot it is if difference < 1000.

      +

      Head info: Specifies where the local beacon chain head hash is. In case it's far behind the Slot (clock), then it independently shows the head slot. Else, it will show how far behind the node is from the Slot (if the difference is < 1000)

    5. -

      Execution block info: It provides the execution information about the head whether its confirmed valid or execution layer is still syncing to it, as well as its number and a short hash to easy identification.

      +

      Execution block info: Provides the information about the execution block head, whether its confirmed valid or still syncing to it. In parenthesis, it shows the current execution block number and a short hash for easy identification

    6. -

      Finalized info: What is the current local finalized checkpoint in the format of [checkpoint root]:[checkpoint epoch], for e.g.: 0xd7ba…8386:189636

      +

      Finalized info: Shows the current local finalized checkpoint in the format of [checkpoint root]:[checkpoint epoch]. For example: 0xd7ba…8386:189636 shows a checkpoint root of 0xd7ba…8386 in epoch 189636

    7. -

      Peer info: Current total number of outbound or inbound peers, for e.g.: peers: 27

      +

      Peer info: Current total number of outbound and inbound peers

    -

    For more insight into how a Lodestar beacon node is functioning, you may setup lodestar metrics and use the prepared Grafana dashboards that are found in the repository. Check out our section on Prometheus and Grafana for more details.

    +

    For more insight into how a Lodestar beacon node is functioning, you may setup Lodestar metrics with the --metrics flag and use the prepared Grafana dashboards that are found in the repository. Check out our section on Prometheus and Grafana for more details.

    \ No newline at end of file diff --git a/run/beacon-management/syncing/index.html b/run/beacon-management/syncing/index.html index a5b8989535e6..e0500e7f30ec 100644 --- a/run/beacon-management/syncing/index.html +++ b/run/beacon-management/syncing/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Syncing

    +

    Syncing

    Syncing an Ethereum node involves obtaining a copy of the blockchain data from other peers in the network to reach a consistent state. This process is crucial for new nodes or nodes that have been offline and need to catch up with the network's current state. Syncing can be performed for both the execution layer and the beacon chain, although the focus here will be primarily on the beacon chain.

    Lodestar allows for several methods of syncing however the recommended method is checkpoint sync as it is the fastest and least resource intensive. It is generally a good idea to sync via a --checkpointSyncUrl. If starting at a specific point is necessary specify the --checkpointState that should be where the sync begins.

    Weak Subjectivity

    @@ -32,6 +32,6 @@

    Syncing Lod
  • --checkpointState
  • --wssCheckpoint
  • --forceCheckpointSync
  • -

    +
    \ No newline at end of file diff --git a/run/bootnode/bootnode-cli/index.html b/run/bootnode/bootnode-cli/index.html index fd15023a0552..b89c01a38197 100644 --- a/run/bootnode/bootnode-cli/index.html +++ b/run/bootnode/bootnode-cli/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    bootnode CLI Command

    +

    bootnode CLI Command

    Run a discv5 bootnode. This will NOT perform any beacon node functions, rather, it will run a discv5 service that allows nodes on the network to discover one another.

    bootnode Options

    --dataDir

    @@ -22,6 +22,9 @@

    --network--paramsFile

    Network configuration file

    type: string

    +

    --rcConfig

    +

    RC file to supplement command line args, accepted formats: .yml, .yaml, .json

    +

    type: string

    --terminal-total-difficulty-override

    Terminal PoW block TTD override

    type: string

    @@ -99,6 +102,6 @@

    --metric

    --metrics.address

    Listen address for the Prometheus metrics HTTP server

    type: string

    -

    default: "127.0.0.1"

    +

    default: "127.0.0.1"

    \ No newline at end of file diff --git a/run/getting-started/installation/index.html b/run/getting-started/installation/index.html index 5bd99083b016..747dec4b77d3 100644 --- a/run/getting-started/installation/index.html +++ b/run/getting-started/installation/index.html @@ -3,14 +3,16 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Installation

    +

    Install Options

    Binaries

    -

    Binaries can be downloaded from the release page under the Assets section.

    +

    Binaries can be downloaded from the Lodestar release page under the Assets section.

    +

    Run the following command to install the latest version

    +
    curl -fsSL https://chainsafe.github.io/lodestar/install | bash

    Docker Installation

    The chainsafe/lodestar Docker Hub repository is maintained actively. It contains the lodestar CLI preinstalled.

    info

    The Docker Hub image tagged as chainsafe/lodestar:next is run on CI every commit on our unstable branch. @@ -47,6 +49,6 @@

    Known IssuesIf you stump upon this issue while running Yarn, it's because Python 3.12 had removed distutils package. That package is required for node build tool. You can install it with following command.

    pip3 install setuptools --force-reinstall --user
    -
    danger

    For mainnet (production) usage, we only recommend installing with docker due to NPM supply chain attacks. Until a safer installation method has been found, do not use this install method except for experimental purposes only.

    +
    danger

    For mainnet (production) usage, we only recommend installing with Docker, using binaries or building from source due to NPM supply chain attacks. Until a safer installation method has been found, do not use this install method except for experimental purposes only.

    \ No newline at end of file diff --git a/run/getting-started/quick-start-custom-guide/index.html b/run/getting-started/quick-start-custom-guide/index.html new file mode 100644 index 000000000000..89e3f6e0706a --- /dev/null +++ b/run/getting-started/quick-start-custom-guide/index.html @@ -0,0 +1,303 @@ + + + + + +Lodestar Documentation + + + + +

    Quick Start Custom Setup Guide

    +

    This is a step-by-step guide to utilize @ChainSafe/lodestar-quickstart to setup a Ubuntu-based full Ethereum node using a local execution client and ChainSafe's Lodestar consensus client via Docker (the recommended method to use Lodestar for production environments). This is an adaptation of Somer Esat's guides for the Ethereum staking community.

    +

    This guide will provide instructions which include running a local execution node. This guide uses Lodestar's stable release branch and supports Holesky testnet setups and Mainnet.

    +
    info

    This guide specifically focuses on using Lodestar's Quickstart scripts which allows for near instant setup with the following technologies:

    +
    danger

    This guide does not assist with securing your server such as secure SSH logins or enabling firewalls. Ensure you have limited access to your server and blocked unused ports with guides such as CoinCashew's Security Best Practices for your ETH staking validator node before continuing with this guide.

    +
    warning

    This guide is for informational purposes only and does not constitute professional advice. The author does not guarantee accuracy of the information in this article and the author is not responsible for any damages or losses incurred by following this article. A full disclaimer can be found at the bottom of this page — please read before continuing.

    +

    Support

    +

    For technical support please reach out to:

    +
      +
    • The Lodestar team actively develops and collaborates on the ChainSafe Discord Server under #🌟-lodestar-general channel.
    • +
    • Please subscribe to our Discord server announcements on the ChainSafe Discord Server under #lodestar-announcements channel.
    • +
    +

    Prerequisites

    +

    This guide assumes knowledge of Ethereum (ETH), Docker, staking and Linux.

    +

    You require the following before getting started:

    +
      +
    • +

      Ubuntu Server v22.04 (LTS) amd64 or newer, installed and running on a local machine or in the cloud. A locally running machine is encouraged for greater decentralization — if the cloud provider goes down then all nodes hosted with that provider go down.

      +
    • +
    • +

      32 ETH to run a solo validator with Lodestar. If running on testnet, contact us in our ChainSafe Discord Server for testnet Ether.

      +
    • +
    +

    Testnet to Mainnet

    +

    If moving from a testnet setup to a mainnet setup it is strongly recommended that you start on a fresh (newly installed) server instance. This guide has not been tested for migration scenarios and does not guarantee success if you are using an existing instance with previously installed testnet software.

    +

    Hardware Requirements

    +
    MinimumRecommended
    ProcessorIntel Core i3–9100 or AMD Ryzen 5 3450Intel Core i7–9700 or AMD Ryzen 7 4700
    Memory8 GB RAM16 GB RAM
    Storage130 GB available space SSD200 GB available space SSD
    InternetReliable broadband with 10mbps uploadReliable broadband with >10mbps upload
    +
    info

    Check your available disk space. Even you have a large SSD there are cases where Ubuntu is reporting only 100GB free. If this applies to you then take a look at Appendix A — Expanding the Logical Volume.

    +
    +

    Setup Machine & Repository

    +

    Install Docker Engine & Docker Compose

    +

    We must install Docker Engine to run the images on your local machine.

    +

    Add Docker's GPG keyrings

    +

    Run each line one at a time.

    +
    sudo apt-get update
    sudo apt-get install ca-certificates curl gnupg
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
    +

    Add the repository to Apt sources

    +

    Copy and paste the entire command below.

    +
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    +

    Update Ubuntu

    +

    Ensure all updates to your Ubuntu Server are complete.

    +
    sudo apt-get update
    sudo apt-get upgrade -y
    +

    Hit Enter if required to restart services.

    +

    Install Docker Engine

    +
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    +

    Test Docker

    +
    sudo docker run hello-world
    +

    If you see the message Hello from Docker! This message shows that your installation appears to be working correctly., you can move on to the next step.

    +

    Clone lodestar-quickstart repository

    +

    Clone the lodestar-quickstart from Github into your local server.

    +
    cd ~ && git clone https://github.com/ChainSafe/lodestar-quickstart.git
    +

    Configure Lodestar Quick Scripts

    + +

    The script and required files are located within the lodestar-quickstart folder.

    +
    cd lodestar-quickstart
    +

    Create your own JWT Secret

    +

    We will generate a JWT secret that is shared by the Execution client and Lodestar in order to have a required secure connection for the Engine API on port 8551.

    +
    openssl rand -hex 32 | tr -d "\n" > "jwtsecret"
    +

    Confirm that your JWT token created.

    +
    cat jwtsecret ; echo
    +

    Your terminal should display the secret. Copy the token for the next step. Be careful to only copy the 64 characters corresponding to the secret and nothing else.

    +
    danger

    🚨 WARNING: Do not share this secret as it protects your authenticated port 8551.

    +

    Input your JWT Secret into the import-args.sh script

    +

    Edit the import-args.sh file.

    +
    nano import-args.sh
    +

    Replace the 64 characters after 0x with your token.

    +

    If you are not running validators, press CTRL + x then y then Enter to save and exit. Proceed to Configuring your Network.

    +

    Configure feeRecipient

    +
    warning

    If you are running validators, Ethereum requires validators to set a Fee Recipient which allows you to receive priority fees and MEV rewards when proposing blocks. If you do not set this address, your rewards will be sent to the burn address by default.

    +

    Configure your validator client's feeRecipient address by changing the FEE_RECIPIENT line. Ensure you specify an Ethereum address you control.

    +

    An example of a fee recipient set with the address 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d, you would change the configuration to:

    +
    FEE_RECIPIENT="0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d"
    +

    If you would like to run MEV-Boost with your validators, proceed to the next section.

    +

    If you do not want to run MEV-Boost, press CTRL + x then y then Enter to save and exit. Proceed to Configuring your Network.

    +

    Set minimum bid for MEV-Boost validators

    +
    info

    (Optional): If you are running validators and would like to use MEV-Boost, follow this section. Otherwise, skip this section.

    +

    Validators running MEV-Boost maximize their staking reward by selling blockspace to an open market of builders. MEV-Boost v1.4+ allows you to set a minimum bid threshold to only use an externally built block if it meets or exceeds this parameter.

    +

    The min-bid parameter is denominated in ETH. For example, if you want to set your threshold to 0.03 ETH, set your configuration to MIN_BUILDERBID=0.03

    +

    When complete, press CTRL + x then y then Enter to save and exit.

    +

    Configuring your Network

    +

    When using the quick scripts, each supported network has a .vars file to define the parameters required for configuring the clients to the specified network.

    +

    To view the available files, use the command:

    +
    ls *.vars
    +

    Select your Network

    +

    Each network has specifics variables that you may want to setup for use. We will use Holesky to demonstrate connecting to a public testnet.

    +

    Open the holesky.vars file.

    +
    nano holesky.vars
    +

    Configure MEV-boost relays

    +
    info

    (Optional): If you have validators you intend to use for MEV-boost, you can input the relays you want to connect here. Otherwise, skip this section.

    +

    You can list multiple relays simply by pasting the relay URL as a variable in this file.

    +
    RELAY_A=https://0xRelayPubKey@relay.com
    RELAY_B=https://0xRelayPubKey@relay2.com
    +

    Make sure to identify the ones you want to use by editing the line:

    +
    RELAYS="$RELAY_A,$RELAY_B"
    +

    Configure Lodestar version

    +

    The lodestar-quickstart scripts currently defaults to using our stable release branch. To use our nightly unstable release instead, replace LODESTAR_IMAGE=chainsafe/lodestar:latest with LODESTAR_IMAGE=chainsafe/lodestar:next in the import-images.sh file.

    +

    You may also choose to use a specific version release of Lodestar. To select a specific version, replace the image with LODESTAR_IMAGE=chainsafe/lodestar:v1.x.x

    +
    warning

    ⚠️ We do not recommend using the unstable branch or @chainsafe/lodestar:next docker versions of Lodestar for production related tasks.

    +

    Modify your weak subjectivity (checkpoint sync) provider

    +
    note

    (Optional): We use ChainSafe's Lodestar checkpoints by default. You may choose to point your trusted checkpoint at another source or verify the checkpoints with other providers. If you would rather sync from genesis (not recommended), you can skip this step.

    +

    Weak subjectivity (checkpoint sync) allows your beacon node to sync within minutes by utilizing a trusted checkpoint from a trusted provider.

    +

    We highly recommend using this feature so you do not need to wait days to sync from genesis and will mitigate your susceptibility to long-range attacks.

    +

    Minimize your risk of syncing a malicious chain from a malicious checkpoint by verifying the trusted checkpoint from multiple sources.

    +
      +
    1. View the community maintained list of Beacon Chain checkpoint sync endpoints
    2. +
    3. Verify multiple endpoint links and ensure the latest finalized and latest justified block roots are the same
    4. +
    5. Choose one of those endpoint URLs
    6. +
    7. Replace the --checkpointSyncUrl address with your chosen provider.
    8. +
    +
    info

    NOTE: Ensure you use checkpoint URLs from the list above corresponding to the network you are trying to sync or you will receive errors.

    +

    When complete, press CTRL + x then y then Enter to save and exit.

    +

    Modify other client parameters (For advanced users)

    +
    info

    (Optional): We have already set fixed parameters for a seamless setup. If you are looking to customize the default parameters of the clients you are using, follow this section. Otherwise, skip this section.

    +

    Fixed parameters for clients can be modified under the fixed.vars configuration file.

    +

    Under the selected client, modify or add the custom arguments on their corresponding line.

    +
    note
    +

    Once complete, press CTRL + x then y then Enter to save and exit.

    +
    +

    Setup Validators

    +
    info

    Optional: Skip this entire section if you do not intend to run validators.

    +

    Create validator keystore password

    +

    Make sure you are in your main quickstart directory. Create the pass.txt file containing your validator's decryption password for use.

    +
    cd ~/lodestar-quickstart
    +
    nano pass.txt
    +

    Enter the password for your validators.

    +
    info

    Once the validator container is running, you can delete this file from your server. Note that every time you restart this container, you will need this password to decrypt your keystore.json files.

    +

    Once complete, press CTRL + x then y then Enter to save and exit.

    +

    Option 1: Setup validators with keystores

    +

    If you want to setup validators with your keystores.json files follow this section. Otherwise, skip this step.

    +

    Copy/Move keystores to lodestar-quickstart/keystores directory

    +

    Your keystore.json file(s) generated from the staking-deposit-cli or similar generator for validator keys will be placed in the lodestar-quickstart/keystores directory using the cp command to copy or mv command to move the files.

    +
    mkdir keystores
    +
    info

    You may choose to use your own method (e.g. SFTP) for copying/uploading keys to your server. This is only a guide.

    +

    The format of the command to use is below:

    +
    cp <from_directory/keystore-x.json> <to_directory>
    +

    An example usage of this command is:

    +
    cp /home/user/validator_keys/keystore-x.json ~/lodestar-quickstart/keystores
    +

    Ensure your keystore.json files are in the lodestar-quickstart/keystores directory using ls command.

    +
    ls -lsah  ~/lodestar-quickstart/keystores/
    +

    You should see the keystore files within the directory.

    +
    info

    Ensure the /keystores directory only has the keystore-m_xxxxx.json files and nothing else. If you copied in the deposit_data-xxxxx.json files, you can remove them by using the sudo rm <file> command.

    Example:

    sudo rm deposit_data-1552658472.json
    +

    Continue to the Startup Quickstart Script section.

    +

    Option 2: Setup multiple validator sets with keystores encrypted under different passwords

    +

    Optional: If you want to setup validators with your keystores.json files but they are not encrypted with the same password, follow this section. Otherwise, skip this step.

    +

    This option will allow you to run multiple validator clients corresponding to each validator keystore set encrypted with the same password. Therefore, we will setup validatorset1 with one decryption password and validatorset2 with another decryption password. You can repeat these steps to create subsequent validator sets with different keystore decryption passwords.

    +

    Create validator keystore set directory

    +

    Ensure you are in the lodestar-quickstart directory and create a folder for your first validator keystore set.

    +
    cd ~/lodestar-quickstart
    +

    Make the new directory for set one.

    +
    mkdir validatorset1
    +

    Navigate into the directory.

    +
    cd validatorset1
    +

    Create validator keystore password

    +

    Create the pass.txt file containing your validator's decryption password for use.

    +
    nano pass.txt
    +

    Enter the password for your validators.

    +
    info

    Once the validator container is running, you can delete this file from your server. Note that every time you restart this container, you will need this password to decrypt your keystore.json files.

    +

    Once complete, press CTRL + x then y then Enter to save and exit.

    +

    Copy/Move keystores to lodestar-quickstart/validatorset1/keystores directory

    +

    Your keystore.json file(s) generated from the staking-deposit-cli or similar generator for validator keys will be placed in the lodestar-quickstart/validatorset1/keystores directory using the sudo cp command to copy or sudo mv command to move the files.

    +
    mkdir keystores
    +

    The format of the command to use is below:

    +
    cp <from_directory/keystore-x.json> <to_directory>
    +

    An example usage of this command is:

    +
    cp /home/user/validator_keys/keystore-x.json ~/lodestar-quickstart/validatorset1/keystores
    +

    Ensure your keystore.json files are in the lodestar-quickstart/validatorset1/keystores directory using ls command.

    +
    ls -lsah  ~/lodestar-quickstart/validatorset1/keystores/
    +

    You should see the keystore files within the directory.

    +
    info

    Ensure the /keystores directory only has the keystore-m_xxxxx.json files and nothing else. If you copied in the deposit_data-xxxxx.json files, you can remove them by using the sudo rm <file> command.

    Example:

    sudo rm deposit_data-1552658472.json
    +

    Repeat the same steps above for validatorset2 and any subsequent sets of validators you require. When complete you should have a similar looking directory tree such as the one below:

    +

    Then, continue to the Startup Quickstart Script section. Pay particular attention to startup script example five (5) and (6).

    +

    Option 3: Setup validators with mnemonic

    +
    warning

    TESTNET USE ONLY: Do not use this method unless you're validating on a testnet. Your mnemonic will be stored in plaintext on your server, which is unsafe.

    +

    Optional: If you want to setup validators with your mnemonic. Otherwise, skip this step.

    +

    Setup Mnemonic

    +

    Select the .vars file corresponding to the network you want to run. For Holesky, select holesky.vars. Open the file with the nano text editor and edit the configuration:

    +
    nano holesky.vars
    +

    We will modify the LODESTAR_VALIDATOR_MNEMONIC_ARGS=. Specifically, the mnemonic located after the --fromMnemonic flag.

    +
      +
    • +

      Replace the default mnemonic with your mnemonic. Ensure it is between the quotations

      +
    • +
    • +

      Indicate which indexes of the mnemonic you wish Lodestar to run. Specify a specific index number --mnemonicIndexes 0 or a range of numbers --mnemonicIndexes 0..5

      +
    • +
    +
    info

    If you created your mnemonic with one key, it is likely located in index 0. If you've added to it, the generated keys are likely the subsequent indexes.

    Therefore, if you generated one key, it is likely in index 0, so you would use --mnemonicIndexes 0. If you generated five keys, it is likely in index 0 to 4, so you would use --mnemonicIndexes 0..4

    +

    Once complete, press CTRL + x then y then Enter to save and exit.

    +

    Continue to the Startup Quickstart Script section.

    +
    +

    Startup Quickstart Script

    +

    Ensure you are in the `~/lodestar-quickstart folder.

    +
    cd ~/lodestar-quickstart
    +

    The following are example commands as a template for initiating the quickstart script:

    +
      +
    1. Startup a Sepolia beacon node with no validators and Go Ethereum (Geth) execution client with terminals attached:
    2. +
    +
    ./setup.sh --dataDir sepolia-data --elClient geth --network sepolia --dockerWithSudo --withTerminal "gnome-terminal --disable-factory --"
    +
      +
    1. Startup Mainnet beacon node with no validators and Nethermind execution client detached from containers (Recommended only when you've verified the setup has initiated properly with terminals attached):
    2. +
    +
    ./setup.sh --dataDir mainnet-data --elClient nethermind --network mainnet --dockerWithSudo --detached
    +
      +
    1. Startup Holesky beacon node with validator client (using mnemonic in /keystores) and Erigon execution client detached from containers:
    2. +
    +
    ./setup.sh --dataDir holesky-data --elClient erigon --network holesky --dockerWithSudo --detached --withValidatorMnemonic ~/lodestar-quickstart/
    +
      +
    1. Startup Mainnet beacon node with validator client (using keystores) with MEV-Boost and Hyperledger Besu execution client detached from containers:
    2. +
    +
    ./setup.sh --dataDir mainnet-data --elClient besu --network mainnet --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/ --withMevBoost
    +
      +
    1. Startup Holesky beacon node with validator client set one (using keystores) and execution client Geth detached from containers:
    2. +
    +
    ./setup.sh --dataDir holesky-data --elClient geth --network holesky --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/validatorset1
    +
    warning

    You can only start up one set of validator keystores per validator client on the same command. Use the below command (#6) to startup another validator client for another set of validator keys.

    +
      +
    1. Startup validator client only with validator client set two (using keystores) and execution client Geth detached from containers:
    2. +
    +
    ./setup.sh --dataDir holesky-data --elClient geth --network holesky --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/validatorset2 --justVC
    +
    info

    The script will standardize naming your containers so running the setup.sh twice, will not create two instances of the same containers. The script will standardize naming your containers so running the ./setup.sh <args> a second time, will not create two instances of the same containers.

    +

    Configure the above commands with what you intend to run using the Quickstart Script Help table below.

    +

    Quickstart Script Help

    +
    CommandRequired/OptionalDescription
    dataDirRequiredFile location (volume) of the configuration & data for setup. This directory should be non-existent for the first run. If the directory exists, it will skip fetching the configuration, assuming it has been done previously. You can also clean individual directors of CL/EL between the re-runs.
    elClientRequiredThe selected EL client you want to run with Lodestar. Options are nethermind, besu, erigon or geth.
    networkRequiredThe network/chain you want to load, reads the corresponding .vars (for e.g. holesky.vars) network configuration , like images, or urls for EL/CL to interact. Example: Default for Holesky is --network holesky using holesky.vars.
    dockerWithSudoOptionalProvide this argument if your Docker needs a sudo prefix.
    --withTerminalOptional*Provide the terminal command prefix for CL and EL processes to run in your favourite terminal. You may use an alias or a terminal launching script as long as it waits for the command it runs till ends and then closes. If not provided, it will launch the docker processes in in-terminal mode.
    --detachedOptional*By default the script will wait for processes and use user input (ctrl +c) to end the processes, however you can pass this option to skip this behavior and just return, for e.g. in case you just want to leave it running.
    --withValidatorKeystoreOptional**Launch a validator client using LODESTAR_VALIDATOR_MNEMONIC_ARGS (--withValidatorMnemonic) or using a folder (--withValidatorKeystore <abs path to folder) having keystores and pass.txt (which advance users may modify in LODESTAR_VALIDATOR_KEYSTORE_ARGS as per their setup). Users can spin up multiple validators using --withValidatorMnemonic <folder path> --justVC connecting to same beacon node.
    --withValidatorMnemonicOptional**Launch a validator client using mnemonic method.(LODESTAR_VALIDATOR_MNEMONIC_ARGS) as set in the network vars file.
    --withMevBoostOptionalLaunch a MEV-Boost container to interface with multiple relays picked for the corresponding network vars file. When paired with --justCL or --justVC this only activates the builder arguments in the beacon/validator and use the builder url set in MEVBOOST_URL variable in fixed.vars
    --justELOptionalLaunch only the Execution Layer client.
    --justCLOptionalLaunch only the Lodestar beacon node.
    --justVCOptionalLaunch only the Lodestar validator.
    --skipImagePullOptionalLaunch with only the local Docker images. Do not update them on this run.
    +
    note

    * : Only one of the two options should be provided. +** : Only one of the two options should be provided.

    +

    Check Containers

    +

    You can check the status and get the name of your containers by using the docker ps command:

    +
    sudo docker ps
    +

    The containers should not constantly restart. If they restart, likely a misconfiguration occurred.

    +

    Check Container Logs

    +

    You can check the status of what your container is logging to diagnose a problem or follow along the status of your container output.

    +

    Check the logs by using the docker logs command:

    +
    sudo docker logs <CONTAINER NAME>
    +

    Follow along the logs by adding the -f flag:

    +
    sudo docker logs -f <CONTAINER NAME>
    +

    Limit the fetched logs by indicating the latest container out puts by number of lines using the -n <number> flag. For the last 10 lines:

    +
    sudo docker logs -n 10 <CONTAINER NAME>
    +

    Check beacon node is progressing

    +

    Your beacon node should initialize and you should see something similar to:

    +
    Jul-31 13:35:27.967[]                 info: Lodestar network=mainnet, version=v1.21.0/ff35faa, commit=ff35faae4ad1697b86d708a0367a95a71648ab6e
    Jul-31 13:35:28.344[] info: Connected to LevelDB database path=/data/lodestar/chain-db
    Jul-31 13:35:49.828[] info: Initializing beacon from a valid db state slot=9633504, epoch=301047, stateRoot=0xfa2845a6877b98555906a1654941c97d9c05bdd41e61cc0870a967dc9030b156, isWithinWeakSubjectivityPeriod=true
    Jul-31 13:35:51.955[chain] info: Historical state worker started
    Jul-31 13:35:51.969[eth1] info: Eth1 provider urls=http://localhost:8551
    Jul-31 13:35:51.975[execution] info: Execution client urls=http://localhost:8551
    Jul-31 13:35:51.977[] info: External builder url=http://localhost:8661
    Jul-31 13:36:21.128[network] info: running libp2p instance in worker thread
    Jul-31 13:36:21.727[network] info: libp2p worker started peer=15Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW
    Jul-31 13:36:27.677[network] info: discv5 worker started peerId=16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, initialENR=enr:-IO4QHGTUd1Zg8LAhUAioOz_ySTKoJLIOa6zltSP_AvvhTFVYw6M6YB35IxsiKxQG7nUgCpUB5SIsNxMntCNlTK9sMEBgmlkgnY0iXNlY3AyNTZrMaEC24cdmzuGnWqSwF-8Hw2gbkAZDzMWW3LsHJfp_kDhy-GDdGNwgiMog3VkcIIeWH, bindAddr4=/ip4/0.0.0.0/udp/9000
    Jul-31 13:36:28.134[network] info: PeerId 16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, Multiaddrs /ip4/0.0.0.0/tcp/9000
    Jul-31 13:36:28.137[metrics] info: Started metrics HTTP server address=http://127.0.0.1:8008
    Jul-31 13:36:28.256[rest] info: Started REST API server address=http://0.0.0.0:9596
    Jul-31 13:36:28.257[] info: Searching peers - peers: 0 - slot: 9634080 - head: (slot -576) 0x9d88…d02a - exec-block: syncing(20426302 0xcec4…) - finalized: 0x7feb…c130:301045
    Jul-31 13:36:36.461[execution] info: Execution client is synced oldState=ONLINE, newState=SYNCED
    Jul-31 13:36:53.019[] info: Syncing - 3.7 minutes left - 2.32 slots/s - slot: 9634082 - head: (slot -515) 0x792f…f8aa - exec-block: valid(20426365 0x58b1…) - finalized: 0x9d88…d02a:301047 - peers: 11
    Jul-31 13:38:53.168[] info: Syncing - 11 seconds left - 4.01 slots/s - slot: 9634092 - head: (slot -44) 0x7491…f63e - exec-block: valid(20426841 0xd4b2…) - finalized: 0x1e00…6e6b:301062 - peers: 59
    Jul-31 13:38:58.051[network] info: Subscribed gossip core topics
    Jul-31 13:38:58.132[sync] info: Subscribed gossip core topics
    Jul-31 13:39:05.001[] info: Synced - slot: 9634093 - head: 0x35de…1f0e - exec-block: valid(20426886 0x10ff…) - finalized: 0x88f8…5375:301063 - peers: 70
    Jul-31 13:39:17.000[] info: Synced - slot: 9634094 - head: 0x7844…3b3e - exec-block: valid(20426887 0x67d1…) - finalized: 0x88f8…5375:301063 - peers: 69
    Jul-31 13:39:29.000[] info: Synced - slot: 9634095 - head: 0x5516…ba12 - exec-block: valid(20426888 0x4ceb…) - finalized: 0x88f8…5375:301063 - peers: 74
    +

    Check validators are detected and decrypted

    +
    +

    OPTIONAL: If you are running validators, you can check the validator client logs to ensure the validator keys exist, has been detected and decrypted.

    +
    +

    Here is an example command if you are running validators on Goerli with the lodestar-quickstart script:

    +
    sudo docker logs goerli-validator
    +

    You should see something similar to:

    +
    Mar-01 03:06:35.048[]                 info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264
    Mar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky
    Mar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m
    Mar-01 03:06:35.698[] info: 2 local keystores
    Mar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea
    Mar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e
    Mar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596
    Mar-01 03:09:23.813[] info: Genesis fetched from the beacon node
    Mar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config
    Mar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot
    Mar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false
    Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea
    Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e
    Mar-01 03:09:23.830[] info: Validator statuses active=2, total=2
    Mar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1
    Mar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1
    +
    info

    It is normal to see Error on getProposerDuties in your validator logs as your beacon node and execution node sync up. Give it time.

    +

    Stop Containers

    +

    You can stop the running containers by using the docker stop command and apply it to more than one container if necessary.

    +
    sudo docker stop <CONTAINER NAME> <CONTAINER NAME 2>
    +

    Ensure to remove the container if you don't plan to restart it with the same parameters.

    +
    sudo docker rm <CONTAINER NAME> <CONTAINER NAME 2>
    +
    +

    Appendix

    +

    Appendix A - Expanding the Logical Volume

    +

    There are cases where Ubuntu is provisioning only 200GB of a larger SSD causing users to run out of disk space when syncing their Eth1 node. The error message is similar to:

    +

    Fatal: Failed to register the Ethereum service: write /var/lib/goethereum/geth/chaindata/383234.ldb: no space left on device

    +

    To address this issue, assuming you have a SSD that is larger than 200GB, expand the space allocation for the LVM by following these steps:

    +
    sudo lvdisplay  <-- Check your logical volume size
    sudo lvm
    lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
    lvextend -l +100%FREE -r /dev/ubuntu-vg/ubuntu-lv
    exit
    sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
    df -h <-- Check results
    +

    That should resize your disk to the maximum available space.

    +

    If you need support, please check with the ChainSafe Discord under the #🌟-lodestar-general channel.

    +

    Appendix B - Update client images

    +

    To update client images, you just need to stop all the containers, remove them and restart the lodestar-quickstart script to automatically check for new images.

    +

    You can stop the running containers by using the docker stop command with the container names.

    +
    sudo docker stop <CONTAINER NAME 1> <CONTAINER NAME 2> <CONTAINER NAME 3>
    +

    Remove the containers by using the docker rm command.

    +
    sudo docker rm <CONTAINER NAME 1> <CONTAINER NAME 2> <CONTAINER NAME 3>
    +

    Restart your containers using your Startup Quickstart Script command.

    +
    +

    Full Disclaimer

    +

    This article (the guide) is for informational purposes only and does not constitute professional advice. The author does not warrant or guarantee the accuracy, integrity, quality, completeness, currency, or validity of any information in this article. All information herein is provided “as is” without warranty of any kind and is subject to change at any time without notice. The author disclaims all express, implied, and statutory warranties of any kind, including warranties as to accuracy, timeliness, completeness, or fitness of the information in this article for any particular purpose. The author is not responsible for any direct, indirect, incidental, consequential or any other damages arising out of or in connection with the use of this article or in reliance on the information available on this article. This includes any personal injury, business interruption, loss of use, lost data, lost profits, or any other pecuniary loss, whether in an action of contract, negligence, or other misuse, even if the author has been informed of the possibility.

    + + \ No newline at end of file diff --git a/run/getting-started/quick-start/index.html b/run/getting-started/quick-start/index.html index f8b5b8355158..f014fb9c21ed 100644 --- a/run/getting-started/quick-start/index.html +++ b/run/getting-started/quick-start/index.html @@ -3,23 +3,22 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Quick Start

    Lodestar Quickstart

    -

    In order to make things easy for users to onboard and try the Ethereum Proof of Stake we have come up with Lodestar quick start scripts!

    -

    ✅ Zero Configuration -✅ All testnets supported along with mainnet -✅ All mainstream Execution Clients integrated

    -

    With just single command you can run lodestar with various execution engines, switch them up to see the Optimistic sync work its magic and eventually brings lodestar and the execution engine in sync

    -

    Customizations

    -

    You can adapt them to your production setups with ease! Here is a simple guide for you to follow along:

    -

    👉 Lodestar Quick Setup Guide

    +

    Lodestar Quick Start Scripts

    In order to make things easier and quicker for all types of users to bootstrap the Lodestar consensus client with a variety of execution clients, we have come up with Lodestar Quickstart Docker scripts!

    +
      +
    • ✅ Zero configuration
    • +
    • ✅ Single command startup
    • +
    • ✅ All testnets supported along with mainnet
    • +
    • ✅ All mainstream execution clients integrated
    • +

    Support

    -

    We actively maintain and update the configurations of running lodestar with the top of the line execution engines for various PoS networks so you have the minimum possible figuring out to do.

    -

    In case you are facing any issues with the quick start guide, do reach us out on lodestar discord! -Happy to help! 🙏🙏🙏

    +

    We actively maintain and update the configurations of running Lodestar with the most commonly used execution clients for various test/production networks so there is minimal configuration required for a standard setup.

    +

    If you have questions about these scripts, documentation or repository, feel free to talk to us on our ChainSafe Discord or open an issue and a member of the team or our community will be happy to assist you.

    +

    Customizations (Optional)

    +

    You can further adapt our Quickstart Docker scripts to your node setups with ease! Use our Quickstart Custom Setup Guide!

    \ No newline at end of file diff --git a/run/logging-and-metrics/client-monitoring/index.html b/run/logging-and-metrics/client-monitoring/index.html index 9f32a44380aa..c1390d634292 100644 --- a/run/logging-and-metrics/client-monitoring/index.html +++ b/run/logging-and-metrics/client-monitoring/index.html @@ -3,12 +3,12 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Client monitoring

    +

    Client Monitoring

    Lodestar has the ability to send client stats to a remote service for collection. At the moment, the main service offering remote monitoring is beaconcha.in.

    Instructions for setting up client monitoring with beaconcha.in can be found in their docs about @@ -24,7 +24,7 @@

    Remote e
    note

    When sending data to a remote service you should be conscious about security:

    • Only use a service that you trust as this will send information which may identify you and associate your validators, IP address and other personal information.
    • -
    • Always use a HTTPS connection (i.e. a URL starting with https://) to prevent the traffic +
    • Always use an HTTPS connection (i.e. a URL starting with https://) to prevent the traffic from being intercepted in transit and leaking information.

    More details about the data sent to the remote service can be found in the specification.

    @@ -34,6 +34,6 @@

    Monitori It takes an integer value in milliseconds, the default is 60000 which means data is sent once a minute.

    For example, setting an interval of 300000 would mean the data is only sent every 5 minutes.

    --monitoring.interval 300000
    -

    Increasing the monitoring interval can be useful if you are running into rate limit errors when posting large amounts of data for multiple nodes.

    +

    Increasing the monitoring interval can be useful if you are running into rate limit errors when posting large amounts of data for multiple nodes.

    \ No newline at end of file diff --git a/run/logging-and-metrics/dashboards/index.html b/run/logging-and-metrics/dashboards/index.html deleted file mode 100644 index e85fed44078f..000000000000 --- a/run/logging-and-metrics/dashboards/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -Lodestar Documentation - - - - - - - \ No newline at end of file diff --git a/run/logging-and-metrics/log-management/index.html b/run/logging-and-metrics/log-management/index.html deleted file mode 100644 index 9cfa75fba2a2..000000000000 --- a/run/logging-and-metrics/log-management/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - -Lodestar Documentation - - - - -
    - - \ No newline at end of file diff --git a/run/logging-and-metrics/metrics-management/index.html b/run/logging-and-metrics/metrics-management/index.html deleted file mode 100644 index e807ce07acd9..000000000000 --- a/run/logging-and-metrics/metrics-management/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -Lodestar Documentation - - - - -
    - - \ No newline at end of file diff --git a/run/logging-and-metrics/prometheus-grafana/index.html b/run/logging-and-metrics/prometheus-grafana/index.html index 9aea8b0976b5..d6091de63f31 100644 --- a/run/logging-and-metrics/prometheus-grafana/index.html +++ b/run/logging-and-metrics/prometheus-grafana/index.html @@ -3,14 +3,16 @@ -Lodestar Documentation - - +Lodestar Documentation + + -

    Prometheus and Grafana

    +

    Prometheus and Grafana Setup

    Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly.

    -

    Prometheus

    +

    Localized Docker Metrics Script

    +

    The Lodestar team has setup a script which will copy the latest dashboards compiled by our team for development purposes. By utilizing the script located in /docker/docker-compose.local_dev.sh, you can instantly setup the latest dockerized metrics alongside your local beacon node.

    +

    Prometheus Setup

    To start, download Prometheus from https://prometheus.io/download/. Unzip the downloaded .zip file and run Prometheus from its installed location with the lodestar prometheus.yml passed in as the configuration file

    ./prometheus --config.file=$dataDir/prometheus.yml
    @@ -18,7 +20,7 @@

    PrometheusThen run the Lodestar beacon node with

    lodestar --metrics=true --metrics.port=8008

    Navigate to http://localhost:9090/ in your browser to verify that Prometheus is monitoring Lodestar

    -

    Grafana

    +

    Grafana Setup

    Download and install Grafana from its official repository https://grafana.com/docs/grafana/latest/installation/debian/

    Add Prometheus as a data source to Grafana https://prometheus.io/docs/visualization/grafana/#installing

    An example of relevant metrics of interest to monitor are:

    @@ -28,6 +30,6 @@

    Grafana

    +
    \ No newline at end of file diff --git a/run/run/getting-started/quick-start-custom-guide/index.html b/run/run/getting-started/quick-start-custom-guide/index.html new file mode 100644 index 000000000000..1021ee338221 --- /dev/null +++ b/run/run/getting-started/quick-start-custom-guide/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/run/run/logging-and-metrics/dashboards/index.html b/run/run/logging-and-metrics/dashboards/index.html deleted file mode 100644 index 3d3f3e21e798..000000000000 --- a/run/run/logging-and-metrics/dashboards/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/run/run/logging-and-metrics/log-management/index.html b/run/run/logging-and-metrics/log-management/index.html deleted file mode 100644 index ac84c1513236..000000000000 --- a/run/run/logging-and-metrics/log-management/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/run/run/logging-and-metrics/metrics-management/index.html b/run/run/logging-and-metrics/metrics-management/index.html deleted file mode 100644 index bc304f965801..000000000000 --- a/run/run/logging-and-metrics/metrics-management/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/run/run/validator-management/proposer-config/index.html b/run/run/validator-management/proposer-config/index.html new file mode 100644 index 000000000000..39b899680929 --- /dev/null +++ b/run/run/validator-management/proposer-config/index.html @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/run/validator-management/external-signer/index.html b/run/validator-management/external-signer/index.html index ae52d9846331..4866aa452d92 100644 --- a/run/validator-management/external-signer/index.html +++ b/run/validator-management/external-signer/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    External Signer

    +

    External Signer

    Lodestar supports connecting an external signing server like Web3Signer, Diva, or any other service implementing the remote signing specification. This allows the validator client to operate without storing any validator private keys locally by delegating the signing of messages (e.g. attestations, beacon blocks) to the external signer @@ -21,6 +21,6 @@

    Configuration< by adding newly discovered public keys and removing no longer present public keys on external signer.

    By default, the list of public keys will be fetched from the external signer once per epoch (6.4 minutes). This interval can be configured by setting --externalSigner.fetchInterval flag which takes a number in milliseconds.

    Alternatively, if it is not desired to use all public keys imported on the external signer, it is also possible to explicitly specify a list of public keys to use -by setting the --externalSigner.pubkeys flag instead of --externalSigner.fetch.

    +by setting the --externalSigner.pubkeys flag instead of --externalSigner.fetch.

    \ No newline at end of file diff --git a/run/validator-management/key-management/index.html b/run/validator-management/key-management/index.html index 43d723ab1531..d7dfdc21196b 100644 --- a/run/validator-management/key-management/index.html +++ b/run/validator-management/key-management/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
    +
    \ No newline at end of file diff --git a/run/validator-management/multiple-and-fallback-validation/index.html b/run/validator-management/multiple-and-fallback-validation/index.html index 9b236ecbcf03..10f7244728a3 100644 --- a/run/validator-management/multiple-and-fallback-validation/index.html +++ b/run/validator-management/multiple-and-fallback-validation/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -
    +
    \ No newline at end of file diff --git a/run/validator-management/proposer-config/index.html b/run/validator-management/proposer-config/index.html new file mode 100644 index 000000000000..da7c5c2b2c6c --- /dev/null +++ b/run/validator-management/proposer-config/index.html @@ -0,0 +1,20 @@ + + + + + +Lodestar Documentation + + + + +

    Proposer Configuration

    +
    warning

    This is an alpha feature. The feature and its format are subject to change.

    +

    With Lodestar's validator client, you can assign specific metadata for each proposer/public key using a proposer configuration file written in YAML file. This will allow you to set specific graffiti, fee recipients and builder settings per validator key.

    +

    Example proposer_config.yaml

    +
    proposer_config:
    "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c":
    graffiti: "graffiti"
    strict_fee_recipient_check: false
    fee_recipient: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    builder:
    gas_limit: "30000000"
    selection: "executionalways"
    boost_factor: "0"
    "0xa4855c83d868f772a579133d9f23818008417b743e8447e235d8eb78b1d8f8a9f63f98c551beb7de254400f89592314d":
    fee_recipient: "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    builder:
    gas_limit: "3000000"
    selection: "maxprofit"
    boost_factor: "100"
    default_config:
    graffiti: "default graffiti"
    strict_fee_recipient_check: true
    fee_recipient: "0xcccccccccccccccccccccccccccccccccccccccc"
    builder:
    gas_limit: "30000000"
    selection: "default"
    boost_factor: "90"
    +

    Enable Proposer Configuration

    +

    After you have configured your proposer configuration YAML file, you can start Lodestar with an additional CLI flag option pointing to the file: --proposerSettingsFile /path/to/proposer_config.yaml.

    +
    info

    The proposer configuration can also be retrieved via the keymanager API endpoint:

    GET /eth/v0/validator/{pubkey}/proposer_config
    + + \ No newline at end of file diff --git a/run/validator-management/validator-cli/index.html b/run/validator-management/validator-cli/index.html index ae59ecb30799..5ca843609adc 100644 --- a/run/validator-management/validator-cli/index.html +++ b/run/validator-management/validator-cli/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    validator CLI Command

    +

    validator CLI Command

    Run one or multiple validator clients

    Available Sub-Commands

    The following sub-commands are available with the validator command:

    @@ -48,6 +48,9 @@

    --network--paramsFile

    Network configuration file

    type: string

    +

    --rcConfig

    +

    RC file to supplement command line args, accepted formats: .yml, .yaml, .json

    +

    type: string

    --terminal-total-difficulty-override

    Terminal PoW block TTD override

    type: string

    @@ -284,6 +287,6 @@

    --fro

    --toExecutionAddress

    Address to which the validator's balances will be set to be withdrawn.

    required: true

    -

    type: string

    +

    type: string

    \ No newline at end of file diff --git a/run/validator-management/vc-configuration/index.html b/run/validator-management/vc-configuration/index.html index 19baf345a93a..9f07232f081f 100644 --- a/run/validator-management/vc-configuration/index.html +++ b/run/validator-management/vc-configuration/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Validator Configuration

    +

    Validator Configuration

    The following instructions are for stakers utilizing the Lodestar validator client.

    Setup your validator

    Validators are represented by a BLS keypair. Use your generated mnemonic from one of the tools above to generate the keystore files required for validator duties on Ethereum using the Lodestar validator client.

    @@ -37,6 +37,7 @@

    burn address.

    Configure your validator client's fee recipient address by using the --suggestedFeeRecipient flag. Ensure you specify an Ethereum address you control. An example of a fee recipient set with the address 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d would add the following flag to their configuration: --suggestedFeeRecipient 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d.

    You may choose to use the --strictFeeRecipientCheck flag to enable a strict check of the fee recipient address with the one returned by the beacon node for added reassurance.

    +
    note

    If you would like to set unique proposer metadata (e.g. fee recipient address) for each validator you are running, see the Proposer Configuration feature. This feature is also available via the keymanager API.

    Configure your builder selection and/or builder boost factor

    If you are running a beacon node with connected builder relays, you may use these validator configurations to signal which block (builder vs. local execution) the beacon node should produce.

    With produceBlockV3 (enabled automatically after the Deneb hard fork), the --builder.boostFactor is a percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit. Even though this is set on the validator client, the calculation is requested and applied on the beacon node itself. For more information, see the produceBlockV3 Beacon API.

    @@ -77,6 +78,6 @@

    Run the va

    To start a Lodestar validator run the command:

    ./lodestar validator --network $NETWORK_NAME

    You should see confirmation that modules have started.

    -
    Mar-01 03:06:35.048[]                 info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264
    Mar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky
    Mar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m
    Mar-01 03:06:35.698[] info: 2 local keystores
    Mar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea
    Mar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e
    Mar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596
    Mar-01 03:09:23.813[] info: Genesis fetched from the beacon node
    Mar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config
    Mar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot
    Mar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false
    Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea
    Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e
    Mar-01 03:09:23.830[] info: Validator statuses active=2, total=2
    Mar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1
    Mar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1

    +
    Mar-01 03:06:35.048[]                 info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264
    Mar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky
    Mar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m
    Mar-01 03:06:35.698[] info: 2 local keystores
    Mar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea
    Mar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e
    Mar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596
    Mar-01 03:09:23.813[] info: Genesis fetched from the beacon node
    Mar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config
    Mar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot
    Mar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false
    Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea
    Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e
    Mar-01 03:09:23.830[] info: Validator statuses active=2, total=2
    Mar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1
    Mar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1
    \ No newline at end of file diff --git a/run/validator-management/withdrawals/index.html b/run/validator-management/withdrawals/index.html index 1d1f6caca98f..0132f287e219 100644 --- a/run/validator-management/withdrawals/index.html +++ b/run/validator-management/withdrawals/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + - +
    \ No newline at end of file diff --git a/search-index.json b/search-index.json index 1260a1b6b189..6e596bf5e35c 100644 --- a/search-index.json +++ b/search-index.json @@ -1 +1 @@ -[{"documents":[{"i":1,"t":"Block Exploration","u":"/lodestar/contribution/advanced-topics/block-exploration","b":[]},{"i":2,"t":"Home","u":"/lodestar/","b":[]},{"i":13,"t":"Migration From Other Clients","u":"/lodestar/contribution/advanced-topics/migrating-from-other-clients","b":[]},{"i":14,"t":"Slashing Protection","u":"/lodestar/contribution/advanced-topics/slashing-protection","b":[]},{"i":15,"t":"Doppelganger Detection","u":"/lodestar/contribution/advanced-topics/doppelganger-detection","b":[]},{"i":16,"t":"Setting-Up a Testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","b":["Contributing","Advanced Topics"]},{"i":20,"t":"bug-reports","u":"/lodestar/contribution/bug-reports","b":[]},{"i":21,"t":"Contribution Guidelines","u":"/lodestar/contribution/getting-started","b":["Contributing"]},{"i":68,"t":"Dependency Graph","u":"/lodestar/contribution/depgraph","b":["Contributing"]},{"i":123,"t":"dev CLI Command","u":"/lodestar/contribution/dev-cli","b":["Contributing","Development Tools"]},{"i":129,"t":"pr-submission","u":"/lodestar/contribution/pr-submission","b":[]},{"i":130,"t":"repo","u":"/lodestar/contribution/repo","b":[]},{"i":131,"t":"End-To-End Tests","u":"/lodestar/contribution/testing/end-to-end-tests","b":["Contributing","Testing"]},{"i":133,"t":"Testing","u":"/lodestar/contribution/testing/","b":["Contributing","Testing"]},{"i":147,"t":"Integration Tests","u":"/lodestar/contribution/testing/integration-tests","b":["Contributing","Testing"]},{"i":149,"t":"Performance Tests","u":"/lodestar/contribution/testing/performance-tests","b":["Contributing","Testing"]},{"i":151,"t":"Simulation Tests","u":"/lodestar/contribution/testing/simulation-tests","b":["Contributing","Testing"]},{"i":177,"t":"Unit Tests","u":"/lodestar/contribution/testing/unit-tests","b":[]},{"i":179,"t":"Specification Tests","u":"/lodestar/contribution/testing/spec-tests","b":["Contributing","Testing"]},{"i":181,"t":"Debugging","u":"/lodestar/contribution/tools/debugging","b":["Contributing","Development Tools"]},{"i":187,"t":"Core Dump Analysis","u":"/lodestar/contribution/tools/core-dumps","b":["Contributing","Development Tools"]},{"i":195,"t":"Generating Flamegraphs for a Running Node Service on Linux","u":"/lodestar/contribution/tools/flamegraphs","b":["Contributing","Development Tools"]},{"i":222,"t":"perf","u":"/lodestar/contribution/tools/perf","b":[]},{"i":223,"t":"Heap Dump Analysis","u":"/lodestar/contribution/tools/heap-dumps","b":["Contributing","Development Tools"]},{"i":245,"t":"Frequently Asked Questions","u":"/lodestar/faqs","b":[]},{"i":254,"t":"using-the-api","u":"/lodestar/libraries/api/using-the-api","b":[]},{"i":255,"t":"Introduction","u":"/lodestar/introduction","b":[]},{"i":265,"t":"lightclient CLI Command","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","b":["Developer Tools","Light Client"]},{"i":271,"t":"Lodestar Light Client","u":"/lodestar/libraries/lightclient-prover/lightclient","b":["Developer Tools","Light Client"]},{"i":289,"t":"Lodestar Prover","u":"/lodestar/libraries/lightclient-prover/prover","b":["Developer Tools","Prover"]},{"i":311,"t":"Page relocated","u":"/lodestar/reference/cli","b":[]},{"i":313,"t":"beacon CLI Command","u":"/lodestar/run/beacon-management/beacon-cli","b":["Run A Node","Beacon node"]},{"i":319,"t":"Data Retention","u":"/lodestar/run/beacon-management/data-retention","b":["Run A Node","Beacon node"]},{"i":323,"t":"MEV & Merge","u":"/lodestar/run/beacon-management/mev-and-builder-integration","b":["Run A Node","Beacon node"]},{"i":329,"t":"Networking","u":"/lodestar/run/beacon-management/networking","b":["Run A Node","Beacon node"]},{"i":349,"t":"Beacon management","u":"/lodestar/run/beacon-management/starting-a-node","b":["Run A Node","Beacon node"]},{"i":367,"t":"bootnode CLI Command","u":"/lodestar/run/bootnode/bootnode-cli","b":["Run A Node","Discv5 Bootnode"]},{"i":371,"t":"Syncing","u":"/lodestar/run/beacon-management/syncing","b":["Run A Node","Beacon node"]},{"i":386,"t":"Quick Start","u":"/lodestar/run/getting-started/quick-start","b":["Run A Node"]},{"i":393,"t":"Installation","u":"/lodestar/run/getting-started/installation","b":["Run A Node"]},{"i":413,"t":"Client monitoring","u":"/lodestar/run/logging-and-metrics/client-monitoring","b":["Run A Node","Logging and Metrics"]},{"i":421,"t":"dashboards","u":"/lodestar/run/logging-and-metrics/dashboards","b":[]},{"i":422,"t":"metrics-management","u":"/lodestar/run/logging-and-metrics/metrics-management","b":[]},{"i":423,"t":"Log Management","u":"/lodestar/run/logging-and-metrics/log-management","b":[]},{"i":425,"t":"Prometheus and Grafana","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","b":["Run A Node","Logging and Metrics"]},{"i":431,"t":"key-management","u":"/lodestar/run/validator-management/key-management","b":[]},{"i":432,"t":"multiple-and-fallback-validation","u":"/lodestar/run/validator-management/multiple-and-fallback-validation","b":[]},{"i":433,"t":"External Signer","u":"/lodestar/run/validator-management/external-signer","b":["Run A Node","Validator Client"]},{"i":437,"t":"withdrawals","u":"/lodestar/run/validator-management/withdrawals","b":[]},{"i":438,"t":"Security Policy","u":"/lodestar/security","b":[]},{"i":443,"t":"validator CLI Command","u":"/lodestar/run/validator-management/validator-cli","b":["Run A Node","Validator Client"]},{"i":482,"t":"Lodestar libraries","u":"/lodestar/supporting-libraries/libraries","b":[]},{"i":493,"t":"Supporting Libraries","u":"/lodestar/supporting-libraries/","b":[]},{"i":503,"t":"Trouble Shooting","u":"/lodestar/trouble-shooting","b":[]},{"i":504,"t":"Validator Configuration","u":"/lodestar/run/validator-management/vc-configuration","b":["Run A Node","Validator Client"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,3.698,1,3.698]],["t/2",[2,4.612]],["t/13",[3,3.698,4,2.833]],["t/14",[5,3.698,6,3.698]],["t/15",[7,3.698,8,3.698]],["t/16",[9,3.087,10,3.087,11,3.087]],["t/20",[12,3.698,13,3.698]],["t/21",[14,3.698,15,3.698]],["t/68",[16,3.698,17,3.698]],["t/123",[18,3.087,19,1.979,20,1.979]],["t/129",[21,3.698,22,3.698]],["t/130",[23,4.612]],["t/131",[24,4.449,25,1.714]],["t/133",[25,2.561]],["t/147",[25,2.054,26,3.698]],["t/149",[25,2.054,27,3.698]],["t/151",[25,2.054,28,3.698]],["t/177",[25,2.054,29,3.698]],["t/179",[25,2.054,30,3.698]],["t/181",[31,4.612]],["t/187",[32,3.087,33,2.651,34,2.651]],["t/195",[35,2.063,36,2.063,37,2.063,38,2.063,39,2.063,40,2.063]],["t/222",[41,4.612]],["t/223",[33,2.651,34,2.651,42,3.087]],["t/245",[43,3.087,44,3.087,45,3.087]],["t/254",[46,3.698,47,3.698]],["t/255",[48,4.612]],["t/265",[19,1.979,20,1.979,49,3.087]],["t/271",[4,2.364,50,2.364,51,3.087]],["t/289",[50,2.833,52,3.698]],["t/311",[53,3.698,54,3.698]],["t/313",[19,1.979,20,1.979,55,2.651]],["t/319",[56,3.698,57,3.698]],["t/323",[58,3.087,59,3.087,60,3.087]],["t/329",[61,4.612]],["t/349",[55,3.176,62,2.576]],["t/367",[19,1.979,20,1.979,63,3.087]],["t/371",[64,4.612]],["t/386",[65,3.698,66,3.698]],["t/393",[67,4.612]],["t/413",[4,2.833,68,3.698]],["t/421",[69,4.612]],["t/422",[62,2.576,70,3.698]],["t/423",[62,2.576,71,3.698]],["t/425",[72,3.698,73,3.698]],["t/431",[62,2.576,74,3.698]],["t/432",[75,3.087,76,3.087,77,2.364]],["t/433",[78,3.698,79,3.698]],["t/437",[80,4.612]],["t/438",[81,3.698,82,3.698]],["t/443",[19,1.979,20,1.979,77,2.364]],["t/482",[50,2.833,83,3.176]],["t/493",[83,3.176,84,3.698]],["t/503",[85,3.698,86,3.698]],["t/504",[77,2.833,87,3.698]]],"invertedIndex":[["",{"_index":59,"t":{"323":{"position":[[4,1]]}}}],["analysi",{"_index":34,"t":{"187":{"position":[[10,8]]},"223":{"position":[[10,8]]}}}],["api",{"_index":47,"t":{"254":{"position":[[10,3]]}}}],["ask",{"_index":44,"t":{"245":{"position":[[11,5]]}}}],["beacon",{"_index":55,"t":{"313":{"position":[[0,6]]},"349":{"position":[[0,6]]}}}],["block",{"_index":0,"t":{"1":{"position":[[0,5]]}}}],["bootnod",{"_index":63,"t":{"367":{"position":[[0,8]]}}}],["bug",{"_index":12,"t":{"20":{"position":[[0,3]]}}}],["cli",{"_index":19,"t":{"123":{"position":[[4,3]]},"265":{"position":[[12,3]]},"313":{"position":[[7,3]]},"367":{"position":[[9,3]]},"443":{"position":[[10,3]]}}}],["client",{"_index":4,"t":{"13":{"position":[[21,7]]},"271":{"position":[[15,6]]},"413":{"position":[[0,6]]}}}],["command",{"_index":20,"t":{"123":{"position":[[8,7]]},"265":{"position":[[16,7]]},"313":{"position":[[11,7]]},"367":{"position":[[13,7]]},"443":{"position":[[14,7]]}}}],["configur",{"_index":87,"t":{"504":{"position":[[10,13]]}}}],["contribut",{"_index":14,"t":{"21":{"position":[[0,12]]}}}],["core",{"_index":32,"t":{"187":{"position":[[0,4]]}}}],["dashboard",{"_index":69,"t":{"421":{"position":[[0,10]]}}}],["data",{"_index":56,"t":{"319":{"position":[[0,4]]}}}],["debug",{"_index":31,"t":{"181":{"position":[[0,9]]}}}],["depend",{"_index":16,"t":{"68":{"position":[[0,10]]}}}],["detect",{"_index":8,"t":{"15":{"position":[[13,9]]}}}],["dev",{"_index":18,"t":{"123":{"position":[[0,3]]}}}],["doppelgang",{"_index":7,"t":{"15":{"position":[[0,12]]}}}],["dump",{"_index":33,"t":{"187":{"position":[[5,4]]},"223":{"position":[[5,4]]}}}],["end",{"_index":24,"t":{"131":{"position":[[0,3],[7,3]]}}}],["explor",{"_index":1,"t":{"1":{"position":[[6,11]]}}}],["extern",{"_index":78,"t":{"433":{"position":[[0,8]]}}}],["fallback",{"_index":76,"t":{"432":{"position":[[13,8]]}}}],["flamegraph",{"_index":36,"t":{"195":{"position":[[11,11]]}}}],["frequent",{"_index":43,"t":{"245":{"position":[[0,10]]}}}],["gener",{"_index":35,"t":{"195":{"position":[[0,10]]}}}],["grafana",{"_index":73,"t":{"425":{"position":[[15,7]]}}}],["graph",{"_index":17,"t":{"68":{"position":[[11,5]]}}}],["guidelin",{"_index":15,"t":{"21":{"position":[[13,10]]}}}],["heap",{"_index":42,"t":{"223":{"position":[[0,4]]}}}],["home",{"_index":2,"t":{"2":{"position":[[0,4]]}}}],["instal",{"_index":67,"t":{"393":{"position":[[0,12]]}}}],["integr",{"_index":26,"t":{"147":{"position":[[0,11]]}}}],["introduct",{"_index":48,"t":{"255":{"position":[[0,12]]}}}],["key",{"_index":74,"t":{"431":{"position":[[0,3]]}}}],["librari",{"_index":83,"t":{"482":{"position":[[9,9]]},"493":{"position":[[11,9]]}}}],["light",{"_index":51,"t":{"271":{"position":[[9,5]]}}}],["lightclient",{"_index":49,"t":{"265":{"position":[[0,11]]}}}],["linux",{"_index":40,"t":{"195":{"position":[[53,5]]}}}],["lodestar",{"_index":50,"t":{"271":{"position":[[0,8]]},"289":{"position":[[0,8]]},"482":{"position":[[0,8]]}}}],["log",{"_index":71,"t":{"423":{"position":[[0,3]]}}}],["manag",{"_index":62,"t":{"349":{"position":[[7,10]]},"422":{"position":[[8,10]]},"423":{"position":[[4,10]]},"431":{"position":[[4,10]]}}}],["merg",{"_index":60,"t":{"323":{"position":[[6,5]]}}}],["metric",{"_index":70,"t":{"422":{"position":[[0,7]]}}}],["mev",{"_index":58,"t":{"323":{"position":[[0,3]]}}}],["migrat",{"_index":3,"t":{"13":{"position":[[0,9]]}}}],["monitor",{"_index":68,"t":{"413":{"position":[[7,10]]}}}],["multipl",{"_index":75,"t":{"432":{"position":[[0,8]]}}}],["network",{"_index":61,"t":{"329":{"position":[[0,10]]}}}],["node",{"_index":38,"t":{"195":{"position":[[37,4]]}}}],["page",{"_index":53,"t":{"311":{"position":[[0,4]]}}}],["perf",{"_index":41,"t":{"222":{"position":[[0,4]]}}}],["perform",{"_index":27,"t":{"149":{"position":[[0,11]]}}}],["polici",{"_index":82,"t":{"438":{"position":[[9,6]]}}}],["pr",{"_index":21,"t":{"129":{"position":[[0,2]]}}}],["prometheu",{"_index":72,"t":{"425":{"position":[[0,10]]}}}],["protect",{"_index":6,"t":{"14":{"position":[[9,10]]}}}],["prover",{"_index":52,"t":{"289":{"position":[[9,6]]}}}],["question",{"_index":45,"t":{"245":{"position":[[17,9]]}}}],["quick",{"_index":65,"t":{"386":{"position":[[0,5]]}}}],["reloc",{"_index":54,"t":{"311":{"position":[[5,9]]}}}],["repo",{"_index":23,"t":{"130":{"position":[[0,4]]}}}],["report",{"_index":13,"t":{"20":{"position":[[4,7]]}}}],["retent",{"_index":57,"t":{"319":{"position":[[5,9]]}}}],["run",{"_index":37,"t":{"195":{"position":[[29,7]]}}}],["secur",{"_index":81,"t":{"438":{"position":[[0,8]]}}}],["servic",{"_index":39,"t":{"195":{"position":[[42,7]]}}}],["set",{"_index":9,"t":{"16":{"position":[[0,7]]}}}],["shoot",{"_index":86,"t":{"503":{"position":[[8,8]]}}}],["signer",{"_index":79,"t":{"433":{"position":[[9,6]]}}}],["simul",{"_index":28,"t":{"151":{"position":[[0,10]]}}}],["slash",{"_index":5,"t":{"14":{"position":[[0,8]]}}}],["specif",{"_index":30,"t":{"179":{"position":[[0,13]]}}}],["start",{"_index":66,"t":{"386":{"position":[[6,5]]}}}],["submiss",{"_index":22,"t":{"129":{"position":[[3,10]]}}}],["support",{"_index":84,"t":{"493":{"position":[[0,10]]}}}],["sync",{"_index":64,"t":{"371":{"position":[[0,7]]}}}],["test",{"_index":25,"t":{"131":{"position":[[11,5]]},"133":{"position":[[0,7]]},"147":{"position":[[12,5]]},"149":{"position":[[12,5]]},"151":{"position":[[11,5]]},"177":{"position":[[5,5]]},"179":{"position":[[14,5]]}}}],["testnet",{"_index":11,"t":{"16":{"position":[[13,7]]}}}],["troubl",{"_index":85,"t":{"503":{"position":[[0,7]]}}}],["unit",{"_index":29,"t":{"177":{"position":[[0,4]]}}}],["up",{"_index":10,"t":{"16":{"position":[[8,2]]}}}],["us",{"_index":46,"t":{"254":{"position":[[0,5]]}}}],["valid",{"_index":77,"t":{"432":{"position":[[22,10]]},"443":{"position":[[0,9]]},"504":{"position":[[0,9]]}}}],["withdraw",{"_index":80,"t":{"437":{"position":[[0,11]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Welcome to the Lodestar documentation","u":"/lodestar/","h":"#welcome-to-the-lodestar-documentation","p":2},{"i":5,"t":"Getting started","u":"/lodestar/","h":"#getting-started","p":2},{"i":7,"t":"Specifications","u":"/lodestar/","h":"#specifications","p":2},{"i":9,"t":"About these docs","u":"/lodestar/","h":"#about-these-docs","p":2},{"i":11,"t":"Need assistance?","u":"/lodestar/","h":"#need-assistance","p":2},{"i":18,"t":"Post-Merge local testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","h":"#post-merge-local-testnet","p":16},{"i":23,"t":"Prerequisites","u":"/lodestar/contribution/getting-started","h":"#prerequisites","p":21},{"i":25,"t":"MacOS Specifics","u":"/lodestar/contribution/getting-started","h":"#macos-specifics","p":21},{"i":27,"t":"Getting Started","u":"/lodestar/contribution/getting-started","h":"#getting-started","p":21},{"i":29,"t":"Tests","u":"/lodestar/contribution/getting-started","h":"#tests","p":21},{"i":31,"t":"Devcontainer","u":"/lodestar/contribution/getting-started","h":"#devcontainer","p":21},{"i":33,"t":"Common Issues","u":"/lodestar/contribution/getting-started","h":"#common-issues","p":21},{"i":35,"t":"Debugging Spec Tests","u":"/lodestar/contribution/getting-started","h":"#debugging-spec-tests","p":21},{"i":37,"t":"Docker","u":"/lodestar/contribution/getting-started","h":"#docker","p":21},{"i":39,"t":"First Time Contributor?","u":"/lodestar/contribution/getting-started","h":"#first-time-contributor","p":21},{"i":41,"t":"Reporting A Bug?","u":"/lodestar/contribution/getting-started","h":"#reporting-a-bug","p":21},{"i":43,"t":"Contribution Process","u":"/lodestar/contribution/getting-started","h":"#contribution-process","p":21},{"i":45,"t":"Github Style Guide","u":"/lodestar/contribution/getting-started","h":"#github-style-guide","p":21},{"i":47,"t":"Lodestar Monorepo","u":"/lodestar/contribution/getting-started","h":"#lodestar-monorepo","p":21},{"i":49,"t":"Style Guide","u":"/lodestar/contribution/getting-started","h":"#style-guide","p":21},{"i":51,"t":"Tests style guide","u":"/lodestar/contribution/getting-started","h":"#tests-style-guide","p":21},{"i":53,"t":"Logging policy","u":"/lodestar/contribution/getting-started","h":"#logging-policy","p":21},{"i":54,"t":"Logging Levels","u":"/lodestar/contribution/getting-started","h":"#logging-levels","p":21},{"i":56,"t":"Logging guidelines","u":"/lodestar/contribution/getting-started","h":"#logging-guidelines","p":21},{"i":58,"t":"Contributing to Grafana dashboards","u":"/lodestar/contribution/getting-started","h":"#contributing-to-grafana-dashboards","p":21},{"i":60,"t":"Using Download Script","u":"/lodestar/contribution/getting-started","h":"#using-download-script","p":21},{"i":62,"t":"Contributing to Documentation","u":"/lodestar/contribution/getting-started","h":"#contributing-to-documentation","p":21},{"i":64,"t":"Label Guide","u":"/lodestar/contribution/getting-started","h":"#label-guide","p":21},{"i":66,"t":"Community","u":"/lodestar/contribution/getting-started","h":"#community","p":21},{"i":69,"t":"Lodestar Dependency Graph","u":"/lodestar/contribution/depgraph","h":"#lodestar-dependency-graph","p":68},{"i":71,"t":"Lodestar Monorepo","u":"/lodestar/contribution/depgraph","h":"#lodestar-monorepo","p":68},{"i":73,"t":"@chainsafe/lodestar","u":"/lodestar/contribution/depgraph","h":"#chainsafelodestar","p":68},{"i":75,"t":"@lodestar/api","u":"/lodestar/contribution/depgraph","h":"#lodestarapi","p":68},{"i":77,"t":"@lodestar/beacon-node","u":"/lodestar/contribution/depgraph","h":"#lodestarbeacon-node","p":68},{"i":79,"t":"@lodestar/config","u":"/lodestar/contribution/depgraph","h":"#lodestarconfig","p":68},{"i":81,"t":"@lodestar/db","u":"/lodestar/contribution/depgraph","h":"#lodestardb","p":68},{"i":83,"t":"@lodestar/flare","u":"/lodestar/contribution/depgraph","h":"#lodestarflare","p":68},{"i":85,"t":"@lodestar/fork-choice","u":"/lodestar/contribution/depgraph","h":"#lodestarfork-choice","p":68},{"i":87,"t":"@lodestar/light-client","u":"/lodestar/contribution/depgraph","h":"#lodestarlight-client","p":68},{"i":89,"t":"@lodestar/logger","u":"/lodestar/contribution/depgraph","h":"#lodestarlogger","p":68},{"i":91,"t":"@lodestar/params","u":"/lodestar/contribution/depgraph","h":"#lodestarparams","p":68},{"i":93,"t":"@lodestar/prover","u":"/lodestar/contribution/depgraph","h":"#lodestarprover","p":68},{"i":95,"t":"@lodestar/reqresp","u":"/lodestar/contribution/depgraph","h":"#lodestarreqresp","p":68},{"i":97,"t":"@lodestar/spec-test-util","u":"/lodestar/contribution/depgraph","h":"#lodestarspec-test-util","p":68},{"i":99,"t":"@lodestar/state-transition","u":"/lodestar/contribution/depgraph","h":"#lodestarstate-transition","p":68},{"i":101,"t":"@lodestar/types","u":"/lodestar/contribution/depgraph","h":"#lodestartypes","p":68},{"i":103,"t":"@lodestar/utils","u":"/lodestar/contribution/depgraph","h":"#lodestarutils","p":68},{"i":105,"t":"@lodestar/validator","u":"/lodestar/contribution/depgraph","h":"#lodestarvalidator","p":68},{"i":107,"t":"External Dependencies","u":"/lodestar/contribution/depgraph","h":"#external-dependencies","p":68},{"i":109,"t":"@chainsafe/blst-ts","u":"/lodestar/contribution/depgraph","h":"#chainsafeblst-ts","p":68},{"i":111,"t":"@chainsafe/discv5","u":"/lodestar/contribution/depgraph","h":"#chainsafediscv5","p":68},{"i":113,"t":"@chainsafe/js-libp2p-gossipsub","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-gossipsub","p":68},{"i":115,"t":"@chainsafe/js-libp2p-noise","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-noise","p":68},{"i":117,"t":"@chainsafe/js-libp2p-yamux","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-yamux","p":68},{"i":119,"t":"@chainsafe/ssz","u":"/lodestar/contribution/depgraph","h":"#chainsafessz","p":68},{"i":121,"t":"@libp2p/js-libp2p","u":"/lodestar/contribution/depgraph","h":"#libp2pjs-libp2p","p":68},{"i":125,"t":"Examples","u":"/lodestar/contribution/dev-cli","h":"#examples","p":123},{"i":127,"t":"dev Options","u":"/lodestar/contribution/dev-cli","h":"#dev-options","p":123},{"i":135,"t":"Unit Tests","u":"/lodestar/contribution/testing/","h":"#unit-tests","p":133},{"i":137,"t":"Spec Tests","u":"/lodestar/contribution/testing/","h":"#spec-tests","p":133},{"i":139,"t":"Performance Tests","u":"/lodestar/contribution/testing/","h":"#performance-tests","p":133},{"i":141,"t":"End-To-End Tests","u":"/lodestar/contribution/testing/","h":"#end-to-end-tests","p":133},{"i":143,"t":"Integration Tests","u":"/lodestar/contribution/testing/","h":"#integration-tests","p":133},{"i":145,"t":"Simulation Tests","u":"/lodestar/contribution/testing/","h":"#simulation-tests","p":133},{"i":153,"t":"Running Sim Tests","u":"/lodestar/contribution/testing/simulation-tests","h":"#running-sim-tests","p":151},{"i":155,"t":"Environment Variables","u":"/lodestar/contribution/testing/simulation-tests","h":"#environment-variables","p":151},{"i":157,"t":"test:sim:multifork","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmultifork","p":151},{"i":159,"t":"test:sim:endpoints","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimendpoints","p":151},{"i":161,"t":"test:sim:deneb","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimdeneb","p":151},{"i":163,"t":"test:sim:mixedcleint","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmixedcleint","p":151},{"i":165,"t":"Sim Test Infrastructure","u":"/lodestar/contribution/testing/simulation-tests","h":"#sim-test-infrastructure","p":151},{"i":167,"t":"Simulation Environment","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-environment","p":151},{"i":169,"t":"Simulation Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-assertions","p":151},{"i":171,"t":"Custom Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#custom-assertions","p":151},{"i":173,"t":"Simulation Reports","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-reports","p":151},{"i":175,"t":"Simulation Logging","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-logging","p":151},{"i":183,"t":"VS Code launch config","u":"/lodestar/contribution/tools/debugging","h":"#vs-code-launch-config","p":181},{"i":185,"t":"Attach to running process","u":"/lodestar/contribution/tools/debugging","h":"#attach-to-running-process","p":181},{"i":189,"t":"Installing llnode","u":"/lodestar/contribution/tools/core-dumps","h":"#installing-llnode","p":187},{"i":191,"t":"Collecting a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#collecting-a-core-dump","p":187},{"i":193,"t":"Analyzing a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#analyzing-a-core-dump","p":187},{"i":197,"t":"Modifying Linux and Lodestar","u":"/lodestar/contribution/tools/flamegraphs","h":"#modifying-linux-and-lodestar","p":195},{"i":199,"t":"Example start_lodestar.sh","u":"/lodestar/contribution/tools/flamegraphs","h":"#example-start_lodestarsh","p":195},{"i":201,"t":"Capturing Stack Traces","u":"/lodestar/contribution/tools/flamegraphs","h":"#capturing-stack-traces","p":195},{"i":203,"t":"Rendering a Flamegraph","u":"/lodestar/contribution/tools/flamegraphs","h":"#rendering-a-flamegraph","p":195},{"i":205,"t":"Installation","u":"/lodestar/contribution/tools/flamegraphs","h":"#installation","p":195},{"i":207,"t":"Usage","u":"/lodestar/contribution/tools/flamegraphs","h":"#usage","p":195},{"i":209,"t":"Filtering Results","u":"/lodestar/contribution/tools/flamegraphs","h":"#filtering-results","p":195},{"i":211,"t":"Unfiltered","u":"/lodestar/contribution/tools/flamegraphs","h":"#unfiltered","p":195},{"i":212,"t":"Filtered","u":"/lodestar/contribution/tools/flamegraphs","h":"#filtered","p":195},{"i":213,"t":"References","u":"/lodestar/contribution/tools/flamegraphs","h":"#references","p":195},{"i":214,"t":"List of Web References","u":"/lodestar/contribution/tools/flamegraphs","h":"#list-of-web-references","p":195},{"i":216,"t":"Visualization Tools","u":"/lodestar/contribution/tools/flamegraphs","h":"#visualization-tools","p":195},{"i":218,"t":"Collecting on Linux","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-linux","p":195},{"i":220,"t":"Collecting on MacOS","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-macos","p":195},{"i":225,"t":"JavaScript Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#javascript-heap-dump","p":223},{"i":227,"t":"Creating a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#creating-a-v8-heap-dump","p":223},{"i":229,"t":"Viewing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#viewing-a-v8-heap-dump","p":223},{"i":231,"t":"Analyzing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#analyzing-a-v8-heap-dump","p":223},{"i":233,"t":"Native Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#native-heap-dump","p":223},{"i":235,"t":"Build collection tools","u":"/lodestar/contribution/tools/heap-dumps","h":"#build-collection-tools","p":223},{"i":237,"t":"Collect a heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#collect-a-heap-dump","p":223},{"i":239,"t":"Collecting a heap dump on a running process","u":"/lodestar/contribution/tools/heap-dumps","h":"#collecting-a-heap-dump-on-a-running-process","p":223},{"i":241,"t":"Installing heaptrack-gui on Linux","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-linux","p":223},{"i":243,"t":"Installing heaptrack-gui on OSX","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-osx","p":223},{"i":247,"t":"Tooling","u":"/lodestar/faqs","h":"#tooling","p":245},{"i":249,"t":"Troubleshooting Lodestar","u":"/lodestar/faqs","h":"#troubleshooting-lodestar","p":245},{"i":250,"t":"Running a beacon node","u":"/lodestar/faqs","h":"#running-a-beacon-node","p":245},{"i":252,"t":"Using Kubernetes","u":"/lodestar/faqs","h":"#using-kubernetes","p":245},{"i":257,"t":"Proof of Stake","u":"/lodestar/introduction","h":"#proof-of-stake","p":255},{"i":259,"t":"Consensus Clients","u":"/lodestar/introduction","h":"#consensus-clients","p":255},{"i":261,"t":"Why Client Diversity?","u":"/lodestar/introduction","h":"#why-client-diversity","p":255},{"i":263,"t":"Ethereum Reading List","u":"/lodestar/introduction","h":"#ethereum-reading-list","p":255},{"i":267,"t":"Examples","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#examples","p":265},{"i":269,"t":"lightclient Options","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#lightclient-options","p":265},{"i":273,"t":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#prerequisites","p":271},{"i":275,"t":"Requirements for Running a Light-Client","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#requirements-for-running-a-light-client","p":271},{"i":277,"t":"Getting started","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#getting-started","p":271},{"i":279,"t":"Light-Client CLI Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-cli-example","p":271},{"i":281,"t":"Light-Client Programmatic Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-programmatic-example","p":271},{"i":283,"t":"Browser Integration","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#browser-integration","p":271},{"i":285,"t":"Contributors","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#contributors","p":271},{"i":287,"t":"License","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#license","p":271},{"i":291,"t":"Usage","u":"/lodestar/libraries/lightclient-prover/prover","h":"#usage","p":289},{"i":293,"t":"How to detect a web3 provider","u":"/lodestar/libraries/lightclient-prover/prover","h":"#how-to-detect-a-web3-provider","p":289},{"i":295,"t":"Supported Web3 Methods","u":"/lodestar/libraries/lightclient-prover/prover","h":"#supported-web3-methods","p":289},{"i":297,"t":"Non-supported features","u":"/lodestar/libraries/lightclient-prover/prover","h":"#non-supported-features","p":289},{"i":299,"t":"Warnings","u":"/lodestar/libraries/lightclient-prover/prover","h":"#warnings","p":289},{"i":301,"t":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/prover","h":"#prerequisites","p":289},{"i":303,"t":"What you need","u":"/lodestar/libraries/lightclient-prover/prover","h":"#what-you-need","p":289},{"i":305,"t":"Getting started","u":"/lodestar/libraries/lightclient-prover/prover","h":"#getting-started","p":289},{"i":307,"t":"Contributors","u":"/lodestar/libraries/lightclient-prover/prover","h":"#contributors","p":289},{"i":309,"t":"License","u":"/lodestar/libraries/lightclient-prover/prover","h":"#license","p":289},{"i":315,"t":"Examples","u":"/lodestar/run/beacon-management/beacon-cli","h":"#examples","p":313},{"i":317,"t":"beacon Options","u":"/lodestar/run/beacon-management/beacon-cli","h":"#beacon-options","p":313},{"i":321,"t":"Data Management","u":"/lodestar/run/beacon-management/data-retention","h":"#data-management","p":319},{"i":325,"t":"Lodestar and Builder API","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#lodestar-and-builder-api","p":323},{"i":327,"t":"Configure Lodestar setup for MEV","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#configure-lodestar-setup-for-mev","p":323},{"i":331,"t":"Networking Flags","u":"/lodestar/run/beacon-management/networking","h":"#networking-flags","p":329},{"i":333,"t":"Peer Discovery (Discv5)","u":"/lodestar/run/beacon-management/networking","h":"#peer-discovery-discv5","p":329},{"i":335,"t":"ENR","u":"/lodestar/run/beacon-management/networking","h":"#enr","p":329},{"i":337,"t":"Peer Communication (gossipsub and Req/Resp)","u":"/lodestar/run/beacon-management/networking","h":"#peer-communication-gossipsub-and-reqresp","p":329},{"i":339,"t":"Gossipsub","u":"/lodestar/run/beacon-management/networking","h":"#gossipsub","p":329},{"i":341,"t":"Req/Resp","u":"/lodestar/run/beacon-management/networking","h":"#reqresp","p":329},{"i":343,"t":"Data Transport (libp2p)","u":"/lodestar/run/beacon-management/networking","h":"#data-transport-libp2p","p":329},{"i":345,"t":"Firewall Management","u":"/lodestar/run/beacon-management/networking","h":"#firewall-management","p":329},{"i":347,"t":"NAT Traversal","u":"/lodestar/run/beacon-management/networking","h":"#nat-traversal","p":329},{"i":351,"t":"Connect to mainnet or a public testnet","u":"/lodestar/run/beacon-management/starting-a-node","h":"#connect-to-mainnet-or-a-public-testnet","p":349},{"i":353,"t":"Configure the Lodestar JWT authentication token","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-the-lodestar-jwt-authentication-token","p":349},{"i":355,"t":"Generate a secret key","u":"/lodestar/run/beacon-management/starting-a-node","h":"#generate-a-secret-key","p":349},{"i":357,"t":"Configure Lodestar to locate the JWT secret","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-lodestar-to-locate-the-jwt-secret","p":349},{"i":359,"t":"Ensure JWT is configured with your execution node","u":"/lodestar/run/beacon-management/starting-a-node","h":"#ensure-jwt-is-configured-with-your-execution-node","p":349},{"i":361,"t":"Run a beacon node","u":"/lodestar/run/beacon-management/starting-a-node","h":"#run-a-beacon-node","p":349},{"i":363,"t":"Checkpoint Sync","u":"/lodestar/run/beacon-management/starting-a-node","h":"#checkpoint-sync","p":349},{"i":365,"t":"Guide to the sync logs","u":"/lodestar/run/beacon-management/starting-a-node","h":"#guide-to-the-sync-logs","p":349},{"i":369,"t":"bootnode Options","u":"/lodestar/run/bootnode/bootnode-cli","h":"#bootnode-options","p":367},{"i":373,"t":"Weak Subjectivity","u":"/lodestar/run/beacon-management/syncing","h":"#weak-subjectivity","p":371},{"i":375,"t":"Syncing Methods","u":"/lodestar/run/beacon-management/syncing","h":"#syncing-methods","p":371},{"i":376,"t":"Checkpoint Sync","u":"/lodestar/run/beacon-management/syncing","h":"#checkpoint-sync","p":371},{"i":378,"t":"Historical Sync","u":"/lodestar/run/beacon-management/syncing","h":"#historical-sync","p":371},{"i":380,"t":"Range Sync","u":"/lodestar/run/beacon-management/syncing","h":"#range-sync","p":371},{"i":382,"t":"Backfill Sync","u":"/lodestar/run/beacon-management/syncing","h":"#backfill-sync","p":371},{"i":384,"t":"Syncing Lodestar","u":"/lodestar/run/beacon-management/syncing","h":"#syncing-lodestar","p":371},{"i":387,"t":"Lodestar Quickstart","u":"/lodestar/run/getting-started/quick-start","h":"#lodestar-quickstart","p":386},{"i":389,"t":"Customizations","u":"/lodestar/run/getting-started/quick-start","h":"#customizations","p":386},{"i":391,"t":"Support","u":"/lodestar/run/getting-started/quick-start","h":"#support","p":386},{"i":394,"t":"Binaries","u":"/lodestar/run/getting-started/installation","h":"#binaries","p":393},{"i":396,"t":"Docker Installation","u":"/lodestar/run/getting-started/installation","h":"#docker-installation","p":393},{"i":398,"t":"Build from Source","u":"/lodestar/run/getting-started/installation","h":"#build-from-source","p":393},{"i":399,"t":"Prerequisites","u":"/lodestar/run/getting-started/installation","h":"#prerequisites","p":393},{"i":401,"t":"Clone repository","u":"/lodestar/run/getting-started/installation","h":"#clone-repository","p":393},{"i":403,"t":"Install packages","u":"/lodestar/run/getting-started/installation","h":"#install-packages","p":393},{"i":405,"t":"Build source code","u":"/lodestar/run/getting-started/installation","h":"#build-source-code","p":393},{"i":407,"t":"Lodestar CLI","u":"/lodestar/run/getting-started/installation","h":"#lodestar-cli","p":393},{"i":409,"t":"Known Issues","u":"/lodestar/run/getting-started/installation","h":"#known-issues","p":393},{"i":411,"t":"Install from NPM [not recommended]","u":"/lodestar/run/getting-started/installation","h":"#install-from-npm-not-recommended","p":393},{"i":415,"t":"Configuration","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#configuration","p":413},{"i":417,"t":"Remote endpoint URL","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#remote-endpoint-url","p":413},{"i":419,"t":"Monitoring interval","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#monitoring-interval","p":413},{"i":427,"t":"Prometheus","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#prometheus","p":425},{"i":429,"t":"Grafana","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#grafana","p":425},{"i":435,"t":"Configuration","u":"/lodestar/run/validator-management/external-signer","h":"#configuration","p":433},{"i":439,"t":"Supported Versions","u":"/lodestar/security","h":"#supported-versions","p":438},{"i":441,"t":"Reporting a Vulnerability","u":"/lodestar/security","h":"#reporting-a-vulnerability","p":438},{"i":445,"t":"Available Sub-Commands","u":"/lodestar/run/validator-management/validator-cli","h":"#available-sub-commands","p":443},{"i":447,"t":"Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#examples","p":443},{"i":448,"t":"Base validator command","u":"/lodestar/run/validator-management/validator-cli","h":"#base-validator-command","p":443},{"i":450,"t":"validator Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-options","p":443},{"i":452,"t":"validator slashing-protection import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import","p":443},{"i":454,"t":"validator slashing-protection import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import-options","p":443},{"i":456,"t":"validator slashing-protection export","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export","p":443},{"i":458,"t":"validator slashing-protection export Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export-options","p":443},{"i":460,"t":"validator import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import","p":443},{"i":462,"t":"validator import Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-examples","p":443},{"i":464,"t":"validator import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-options","p":443},{"i":466,"t":"validator list","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list","p":443},{"i":468,"t":"validator list Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list-examples","p":443},{"i":470,"t":"validator voluntary-exit","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit","p":443},{"i":472,"t":"validator voluntary-exit Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-examples","p":443},{"i":474,"t":"validator voluntary-exit Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-options","p":443},{"i":476,"t":"validator bls-to-execution-change","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change","p":443},{"i":478,"t":"validator bls-to-execution-change Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-examples","p":443},{"i":480,"t":"validator bls-to-execution-change Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-options","p":443},{"i":484,"t":"Monorepo libraries","u":"/lodestar/supporting-libraries/libraries","h":"#monorepo-libraries","p":482},{"i":486,"t":"Other libraries","u":"/lodestar/supporting-libraries/libraries","h":"#other-libraries","p":482},{"i":487,"t":"BLS Utilities","u":"/lodestar/supporting-libraries/libraries","h":"#bls-utilities","p":482},{"i":489,"t":"Hashing","u":"/lodestar/supporting-libraries/libraries","h":"#hashing","p":482},{"i":491,"t":"Networking","u":"/lodestar/supporting-libraries/libraries","h":"#networking","p":482},{"i":494,"t":"Networking","u":"/lodestar/supporting-libraries/","h":"#networking","p":493},{"i":495,"t":"LibP2P","u":"/lodestar/supporting-libraries/","h":"#libp2p","p":493},{"i":497,"t":"Discv5","u":"/lodestar/supporting-libraries/","h":"#discv5","p":493},{"i":499,"t":"Serialization and Hashing","u":"/lodestar/supporting-libraries/","h":"#serialization-and-hashing","p":493},{"i":501,"t":"BLS","u":"/lodestar/supporting-libraries/","h":"#bls","p":493},{"i":506,"t":"Setup your validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#setup-your-validator","p":504},{"i":508,"t":"Create a keystore","u":"/lodestar/run/validator-management/vc-configuration","h":"#create-a-keystore","p":504},{"i":510,"t":"Import a validator keystore to Lodestar","u":"/lodestar/run/validator-management/vc-configuration","h":"#import-a-validator-keystore-to-lodestar","p":504},{"i":512,"t":"Configuring the fee recipient address","u":"/lodestar/run/validator-management/vc-configuration","h":"#configuring-the-fee-recipient-address","p":504},{"i":514,"t":"Configure your builder selection and/or builder boost factor","u":"/lodestar/run/validator-management/vc-configuration","h":"#configure-your-builder-selection-andor-builder-boost-factor","p":504},{"i":516,"t":"Submit a validator deposit","u":"/lodestar/run/validator-management/vc-configuration","h":"#submit-a-validator-deposit","p":504},{"i":518,"t":"Run the validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#run-the-validator","p":504}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,4.385,1,2.392,2,3.936]],["t/5",[3,4.073,4,4.073]],["t/7",[5,5.795]],["t/9",[6,6.455]],["t/11",[7,4.688,8,5.222]],["t/18",[9,3.779,10,3.779,11,3.779,12,3.392]],["t/23",[13,5.035]],["t/25",[5,4.688,14,4.688]],["t/27",[3,4.073,4,4.073]],["t/29",[15,3.714]],["t/31",[16,6.455]],["t/33",[17,5.222,18,4.688]],["t/35",[15,2.523,19,4.385,20,3.936]],["t/37",[21,5.795]],["t/39",[22,4.385,23,4.385,24,3.641]],["t/41",[25,4.336,26,5.222]],["t/43",[27,4.336,28,4.336]],["t/45",[29,4.385,30,3.641,31,3.244]],["t/47",[1,2.849,32,4.336]],["t/49",[30,4.336,31,3.863]],["t/51",[15,2.523,30,3.641,31,3.244]],["t/53",[33,3.863,34,5.222]],["t/54",[33,3.863,35,5.222]],["t/56",[33,3.863,36,5.222]],["t/58",[27,3.641,37,3.936,38,4.385]],["t/60",[39,3.936,40,4.385,41,4.385]],["t/62",[2,4.688,27,4.336]],["t/64",[31,3.863,42,5.222]],["t/66",[43,5.795]],["t/69",[1,2.392,44,3.936,45,4.385]],["t/71",[1,2.849,32,4.336]],["t/73",[46,6.455]],["t/75",[47,6.455]],["t/77",[48,5.222,49,4.073]],["t/79",[50,6.455]],["t/81",[51,6.455]],["t/83",[52,6.455]],["t/85",[53,5.222,54,5.222]],["t/87",[55,5.222,56,3.689]],["t/89",[57,6.455]],["t/91",[58,6.455]],["t/93",[59,6.455]],["t/95",[60,6.455]],["t/97",[15,2.523,61,4.385,62,3.936]],["t/99",[63,5.222,64,5.222]],["t/101",[65,6.455]],["t/103",[66,6.455]],["t/105",[67,6.455]],["t/107",[44,4.688,68,5.222]],["t/109",[69,5.222,70,5.222]],["t/111",[71,6.455]],["t/113",[72,3.641,73,3.097,74,3.641]],["t/115",[72,3.641,73,3.097,75,4.385]],["t/117",[72,3.641,73,3.097,76,4.385]],["t/119",[77,6.455]],["t/121",[73,3.689,78,5.222]],["t/125",[79,3.822]],["t/127",[80,5.222,81,3.187]],["t/135",[15,3.005,82,5.222]],["t/137",[15,3.005,20,4.688]],["t/139",[15,3.005,83,5.222]],["t/141",[15,2.523,84,6.268]],["t/143",[15,3.005,85,4.688]],["t/145",[15,3.005,86,3.863]],["t/153",[15,2.523,87,2.971,88,3.936]],["t/155",[89,4.688,90,5.222]],["t/157",[91,6.455]],["t/159",[92,6.455]],["t/161",[93,6.455]],["t/163",[94,6.455]],["t/165",[15,2.523,88,3.936,95,4.385]],["t/167",[86,3.863,89,4.688]],["t/169",[86,3.863,96,4.688]],["t/171",[96,4.688,97,4.688]],["t/173",[25,4.336,86,3.863]],["t/175",[33,3.863,86,3.863]],["t/183",[98,3.779,99,3.392,100,3.779,101,3.779]],["t/185",[28,3.641,87,2.971,102,4.385]],["t/189",[103,3.539,104,5.222]],["t/191",[105,3.097,106,3.936,107,2.764]],["t/193",[106,3.936,107,2.764,108,3.936]],["t/197",[1,2.392,109,4.385,110,3.641]],["t/199",[79,3.092,111,5.222]],["t/201",[112,4.385,113,4.385,114,4.385]],["t/203",[115,5.222,116,5.222]],["t/205",[103,4.374]],["t/207",[117,5.795]],["t/209",[118,4.688,119,5.222]],["t/211",[120,6.455]],["t/212",[118,5.795]],["t/213",[121,5.795]],["t/214",[121,3.936,122,3.42,123,4.385]],["t/216",[124,5.222,125,4.336]],["t/218",[105,3.689,110,4.336]],["t/220",[14,4.688,105,3.689]],["t/225",[107,2.764,126,4.385,127,2.971]],["t/227",[107,2.382,127,2.561,128,3.392,129,3.138]],["t/229",[107,2.382,127,2.561,129,3.138,130,3.779]],["t/231",[107,2.382,108,3.392,127,2.561,129,3.138]],["t/233",[107,2.764,127,2.971,131,4.385]],["t/235",[105,3.097,125,3.641,132,3.641]],["t/237",[105,3.097,107,2.764,127,2.971]],["t/239",[28,2.757,87,2.25,105,2.345,107,2.093,127,2.25]],["t/241",[103,2.561,110,3.138,133,3.392,134,3.392]],["t/243",[103,2.561,133,3.392,134,3.392,135,3.779]],["t/247",[125,5.36]],["t/249",[1,2.849,136,5.222]],["t/250",[49,3.42,87,2.971,137,3.641]],["t/252",[39,4.688,138,5.222]],["t/257",[139,5.222,140,5.222]],["t/259",[56,3.689,141,5.222]],["t/261",[56,3.689,142,5.222]],["t/263",[122,3.42,143,4.385,144,4.385]],["t/267",[79,3.822]],["t/269",[81,3.187,145,5.222]],["t/273",[13,5.035]],["t/275",[56,2.669,87,2.561,146,3.779,147,3.138]],["t/277",[3,4.073,4,4.073]],["t/279",[56,2.669,79,2.237,147,3.138,148,3.392]],["t/281",[56,2.669,79,2.237,147,3.138,149,3.779]],["t/283",[85,4.688,150,5.222]],["t/285",[24,5.36]],["t/287",[151,5.795]],["t/291",[117,5.795]],["t/293",[152,4.385,153,3.936,154,4.385]],["t/295",[153,3.936,155,3.42,156,3.936]],["t/297",[155,3.42,157,4.385,158,4.385]],["t/299",[159,6.455]],["t/301",[13,5.035]],["t/303",[7,5.795]],["t/305",[3,4.073,4,4.073]],["t/307",[24,5.36]],["t/309",[151,5.795]],["t/315",[79,3.822]],["t/317",[81,3.187,137,4.336]],["t/321",[160,4.688,161,4.688]],["t/325",[1,2.392,162,3.936,163,4.385]],["t/327",[1,2.062,164,2.466,165,3.392,166,3.779]],["t/331",[167,4.336,168,5.222]],["t/333",[169,3.936,170,4.385,171,3.936]],["t/335",[172,6.455]],["t/337",[43,3.392,74,3.138,169,3.392,173,3.392]],["t/339",[74,5.36]],["t/341",[173,5.795]],["t/343",[73,3.097,160,3.936,174,4.385]],["t/345",[161,4.688,175,5.222]],["t/347",[176,5.222,177,5.222]],["t/351",[12,3.392,178,3.779,179,3.779,180,3.779]],["t/353",[1,1.812,164,2.167,181,2.757,182,3.32,183,3.32]],["t/355",[184,4.385,185,3.936,186,4.385]],["t/357",[1,1.812,164,2.167,181,2.757,185,2.981,187,3.32]],["t/359",[49,2.59,164,2.167,181,2.757,188,3.32,189,2.59]],["t/361",[49,3.42,87,2.971,137,3.641]],["t/363",[190,4.688,191,3.408]],["t/365",[31,3.244,33,3.244,191,2.862]],["t/369",[81,3.187,192,5.222]],["t/373",[193,5.222,194,5.222]],["t/375",[156,4.688,191,3.408]],["t/376",[190,4.688,191,3.408]],["t/378",[191,3.408,195,5.222]],["t/380",[191,3.408,196,5.222]],["t/382",[191,3.408,197,5.222]],["t/384",[1,2.849,191,3.408]],["t/387",[1,2.849,198,5.222]],["t/389",[97,5.795]],["t/391",[155,5.035]],["t/394",[199,6.455]],["t/396",[21,4.688,103,3.539]],["t/398",[132,4.336,200,4.688]],["t/399",[13,5.035]],["t/401",[201,5.222,202,5.222]],["t/403",[103,3.539,203,5.222]],["t/405",[99,3.936,132,3.641,200,3.936]],["t/407",[1,2.849,148,4.688]],["t/409",[18,4.688,204,5.222]],["t/411",[103,2.971,205,4.385,206,4.385]],["t/415",[164,4.212]],["t/417",[207,4.385,208,4.385,209,4.385]],["t/419",[210,5.222,211,5.222]],["t/427",[212,6.455]],["t/429",[37,5.795]],["t/435",[164,4.212]],["t/439",[155,4.073,213,5.222]],["t/441",[25,4.336,214,5.222]],["t/445",[215,4.385,216,4.385,217,3.936]],["t/447",[79,3.822]],["t/448",[217,3.936,218,4.385,219,2.047]],["t/450",[81,3.187,219,2.437]],["t/452",[219,1.764,220,2.948,221,2.948,222,2.669]],["t/454",[81,2.026,219,1.55,220,2.59,221,2.59,222,2.345]],["t/456",[219,1.764,220,2.948,221,2.948,223,3.392]],["t/458",[81,2.026,219,1.55,220,2.59,221,2.59,223,2.981]],["t/460",[219,2.437,222,3.689]],["t/462",[79,2.596,219,2.047,222,3.097]],["t/464",[81,2.676,219,2.047,222,3.097]],["t/466",[122,4.073,219,2.437]],["t/468",[79,2.596,122,3.42,219,2.047]],["t/470",[219,2.047,224,3.641,225,3.641]],["t/472",[79,2.237,219,1.764,224,3.138,225,3.138]],["t/474",[81,2.306,219,1.764,224,3.138,225,3.138]],["t/476",[189,2.948,219,1.764,226,2.796,227,3.138]],["t/478",[79,1.966,189,2.59,219,1.55,226,2.456,227,2.757]],["t/480",[81,2.026,189,2.59,219,1.55,226,2.456,227,2.757]],["t/484",[32,4.336,228,4.688]],["t/486",[228,5.795]],["t/487",[62,4.688,226,3.863]],["t/489",[229,5.795]],["t/491",[167,5.36]],["t/494",[167,5.36]],["t/495",[73,4.559]],["t/497",[171,5.795]],["t/499",[229,4.688,230,5.222]],["t/501",[226,4.775]],["t/506",[165,4.688,219,2.437]],["t/508",[128,4.688,231,4.688]],["t/510",[1,2.062,219,1.764,222,2.669,231,3.392]],["t/512",[164,2.466,232,3.779,233,3.779,234,3.779]],["t/514",[162,3.858,164,1.743,235,2.672,236,2.672,237,2.672,238,2.672]],["t/516",[219,2.047,239,4.385,240,4.385]],["t/518",[87,3.539,219,2.437]]],"invertedIndex":[["address",{"_index":234,"t":{"512":{"position":[[30,7]]}}}],["analyz",{"_index":108,"t":{"193":{"position":[[0,9]]},"231":{"position":[[0,9]]}}}],["and/or",{"_index":236,"t":{"514":{"position":[[33,6]]}}}],["api",{"_index":163,"t":{"325":{"position":[[21,3]]}}}],["assert",{"_index":96,"t":{"169":{"position":[[11,10]]},"171":{"position":[[7,10]]}}}],["assist",{"_index":8,"t":{"11":{"position":[[5,11]]}}}],["attach",{"_index":102,"t":{"185":{"position":[[0,6]]}}}],["authent",{"_index":182,"t":{"353":{"position":[[27,14]]}}}],["avail",{"_index":215,"t":{"445":{"position":[[0,9]]}}}],["backfil",{"_index":197,"t":{"382":{"position":[[0,8]]}}}],["base",{"_index":218,"t":{"448":{"position":[[0,4]]}}}],["beacon",{"_index":137,"t":{"250":{"position":[[10,6]]},"317":{"position":[[0,6]]},"361":{"position":[[6,6]]}}}],["binari",{"_index":199,"t":{"394":{"position":[[0,8]]}}}],["bl",{"_index":226,"t":{"476":{"position":[[10,3]]},"478":{"position":[[10,3]]},"480":{"position":[[10,3]]},"487":{"position":[[0,3]]},"501":{"position":[[0,3]]}}}],["boost",{"_index":237,"t":{"514":{"position":[[48,5]]}}}],["bootnod",{"_index":192,"t":{"369":{"position":[[0,8]]}}}],["browser",{"_index":150,"t":{"283":{"position":[[0,7]]}}}],["bug",{"_index":26,"t":{"41":{"position":[[12,4]]}}}],["build",{"_index":132,"t":{"235":{"position":[[0,5]]},"398":{"position":[[0,5]]},"405":{"position":[[0,5]]}}}],["builder",{"_index":162,"t":{"325":{"position":[[13,7]]},"514":{"position":[[15,7],[40,7]]}}}],["captur",{"_index":112,"t":{"201":{"position":[[0,9]]}}}],["chainsafe/blst",{"_index":69,"t":{"109":{"position":[[0,15]]}}}],["chainsafe/discv5",{"_index":71,"t":{"111":{"position":[[0,17]]}}}],["chainsafe/j",{"_index":72,"t":{"113":{"position":[[0,13]]},"115":{"position":[[0,13]]},"117":{"position":[[0,13]]}}}],["chainsafe/lodestar",{"_index":46,"t":{"73":{"position":[[0,19]]}}}],["chainsafe/ssz",{"_index":77,"t":{"119":{"position":[[0,14]]}}}],["chang",{"_index":227,"t":{"476":{"position":[[27,6]]},"478":{"position":[[27,6]]},"480":{"position":[[27,6]]}}}],["checkpoint",{"_index":190,"t":{"363":{"position":[[0,10]]},"376":{"position":[[0,10]]}}}],["choic",{"_index":54,"t":{"85":{"position":[[15,6]]}}}],["cli",{"_index":148,"t":{"279":{"position":[[13,3]]},"407":{"position":[[9,3]]}}}],["client",{"_index":56,"t":{"87":{"position":[[16,6]]},"259":{"position":[[10,7]]},"261":{"position":[[4,6]]},"275":{"position":[[33,6]]},"279":{"position":[[6,6]]},"281":{"position":[[6,6]]}}}],["clone",{"_index":201,"t":{"401":{"position":[[0,5]]}}}],["code",{"_index":99,"t":{"183":{"position":[[3,4]]},"405":{"position":[[13,4]]}}}],["collect",{"_index":105,"t":{"191":{"position":[[0,10]]},"218":{"position":[[0,10]]},"220":{"position":[[0,10]]},"235":{"position":[[6,10]]},"237":{"position":[[0,7]]},"239":{"position":[[0,10]]}}}],["command",{"_index":217,"t":{"445":{"position":[[14,8]]},"448":{"position":[[15,7]]}}}],["common",{"_index":17,"t":{"33":{"position":[[0,6]]}}}],["commun",{"_index":43,"t":{"66":{"position":[[0,9]]},"337":{"position":[[5,13]]}}}],["config",{"_index":101,"t":{"183":{"position":[[15,6]]}}}],["configur",{"_index":164,"t":{"327":{"position":[[0,9]]},"353":{"position":[[0,9]]},"357":{"position":[[0,9]]},"359":{"position":[[14,10]]},"415":{"position":[[0,13]]},"435":{"position":[[0,13]]},"512":{"position":[[0,11]]},"514":{"position":[[0,9]]}}}],["connect",{"_index":178,"t":{"351":{"position":[[0,7]]}}}],["consensu",{"_index":141,"t":{"259":{"position":[[0,9]]}}}],["contribut",{"_index":27,"t":{"43":{"position":[[0,12]]},"58":{"position":[[0,12]]},"62":{"position":[[0,12]]}}}],["contributor",{"_index":24,"t":{"39":{"position":[[11,12]]},"285":{"position":[[0,12]]},"307":{"position":[[0,12]]}}}],["core",{"_index":106,"t":{"191":{"position":[[13,4]]},"193":{"position":[[12,4]]}}}],["creat",{"_index":128,"t":{"227":{"position":[[0,8]]},"508":{"position":[[0,6]]}}}],["custom",{"_index":97,"t":{"171":{"position":[[0,6]]},"389":{"position":[[0,14]]}}}],["dashboard",{"_index":38,"t":{"58":{"position":[[24,10]]}}}],["data",{"_index":160,"t":{"321":{"position":[[0,4]]},"343":{"position":[[0,4]]}}}],["debug",{"_index":19,"t":{"35":{"position":[[0,9]]}}}],["depend",{"_index":44,"t":{"69":{"position":[[9,10]]},"107":{"position":[[9,12]]}}}],["deposit",{"_index":240,"t":{"516":{"position":[[19,7]]}}}],["detect",{"_index":152,"t":{"293":{"position":[[7,6]]}}}],["dev",{"_index":80,"t":{"127":{"position":[[0,3]]}}}],["devcontain",{"_index":16,"t":{"31":{"position":[[0,12]]}}}],["discoveri",{"_index":170,"t":{"333":{"position":[[5,9]]}}}],["discv5",{"_index":171,"t":{"333":{"position":[[15,8]]},"497":{"position":[[0,6]]}}}],["divers",{"_index":142,"t":{"261":{"position":[[11,10]]}}}],["doc",{"_index":6,"t":{"9":{"position":[[12,4]]}}}],["docker",{"_index":21,"t":{"37":{"position":[[0,6]]},"396":{"position":[[0,6]]}}}],["document",{"_index":2,"t":{"3":{"position":[[24,13]]},"62":{"position":[[16,13]]}}}],["download",{"_index":40,"t":{"60":{"position":[[6,8]]}}}],["dump",{"_index":107,"t":{"191":{"position":[[18,4]]},"193":{"position":[[17,4]]},"225":{"position":[[16,4]]},"227":{"position":[[19,4]]},"229":{"position":[[18,4]]},"231":{"position":[[20,4]]},"233":{"position":[[12,4]]},"237":{"position":[[15,4]]},"239":{"position":[[18,4]]}}}],["end",{"_index":84,"t":{"141":{"position":[[0,3],[7,3]]}}}],["endpoint",{"_index":208,"t":{"417":{"position":[[7,8]]}}}],["enr",{"_index":172,"t":{"335":{"position":[[0,3]]}}}],["ensur",{"_index":188,"t":{"359":{"position":[[0,6]]}}}],["environ",{"_index":89,"t":{"155":{"position":[[0,11]]},"167":{"position":[[11,11]]}}}],["ethereum",{"_index":143,"t":{"263":{"position":[[0,8]]}}}],["exampl",{"_index":79,"t":{"125":{"position":[[0,8]]},"199":{"position":[[0,7]]},"267":{"position":[[0,8]]},"279":{"position":[[17,7]]},"281":{"position":[[26,7]]},"315":{"position":[[0,8]]},"447":{"position":[[0,8]]},"462":{"position":[[17,8]]},"468":{"position":[[15,8]]},"472":{"position":[[25,8]]},"478":{"position":[[34,8]]}}}],["execut",{"_index":189,"t":{"359":{"position":[[35,9]]},"476":{"position":[[17,9]]},"478":{"position":[[17,9]]},"480":{"position":[[17,9]]}}}],["exit",{"_index":225,"t":{"470":{"position":[[20,4]]},"472":{"position":[[20,4]]},"474":{"position":[[20,4]]}}}],["export",{"_index":223,"t":{"456":{"position":[[30,6]]},"458":{"position":[[30,6]]}}}],["extern",{"_index":68,"t":{"107":{"position":[[0,8]]}}}],["factor",{"_index":238,"t":{"514":{"position":[[54,6]]}}}],["featur",{"_index":158,"t":{"297":{"position":[[14,8]]}}}],["fee",{"_index":232,"t":{"512":{"position":[[16,3]]}}}],["filter",{"_index":118,"t":{"209":{"position":[[0,9]]},"212":{"position":[[0,8]]}}}],["firewal",{"_index":175,"t":{"345":{"position":[[0,8]]}}}],["first",{"_index":22,"t":{"39":{"position":[[0,5]]}}}],["flag",{"_index":168,"t":{"331":{"position":[[11,5]]}}}],["flamegraph",{"_index":116,"t":{"203":{"position":[[12,10]]}}}],["gener",{"_index":184,"t":{"355":{"position":[[0,8]]}}}],["get",{"_index":3,"t":{"5":{"position":[[0,7]]},"27":{"position":[[0,7]]},"277":{"position":[[0,7]]},"305":{"position":[[0,7]]}}}],["github",{"_index":29,"t":{"45":{"position":[[0,6]]}}}],["gossipsub",{"_index":74,"t":{"113":{"position":[[21,9]]},"337":{"position":[[19,10]]},"339":{"position":[[0,9]]}}}],["grafana",{"_index":37,"t":{"58":{"position":[[16,7]]},"429":{"position":[[0,7]]}}}],["graph",{"_index":45,"t":{"69":{"position":[[20,5]]}}}],["gui",{"_index":134,"t":{"241":{"position":[[21,3]]},"243":{"position":[[21,3]]}}}],["guid",{"_index":31,"t":{"45":{"position":[[13,5]]},"49":{"position":[[6,5]]},"51":{"position":[[12,5]]},"64":{"position":[[6,5]]},"365":{"position":[[0,5]]}}}],["guidelin",{"_index":36,"t":{"56":{"position":[[8,10]]}}}],["hash",{"_index":229,"t":{"489":{"position":[[0,7]]},"499":{"position":[[18,7]]}}}],["heap",{"_index":127,"t":{"225":{"position":[[11,4]]},"227":{"position":[[14,4]]},"229":{"position":[[13,4]]},"231":{"position":[[15,4]]},"233":{"position":[[7,4]]},"237":{"position":[[10,4]]},"239":{"position":[[13,4]]}}}],["heaptrack",{"_index":133,"t":{"241":{"position":[[11,9]]},"243":{"position":[[11,9]]}}}],["histor",{"_index":195,"t":{"378":{"position":[[0,10]]}}}],["import",{"_index":222,"t":{"452":{"position":[[30,6]]},"454":{"position":[[30,6]]},"460":{"position":[[10,6]]},"462":{"position":[[10,6]]},"464":{"position":[[10,6]]},"510":{"position":[[0,6]]}}}],["infrastructur",{"_index":95,"t":{"165":{"position":[[9,14]]}}}],["instal",{"_index":103,"t":{"189":{"position":[[0,10]]},"205":{"position":[[0,12]]},"241":{"position":[[0,10]]},"243":{"position":[[0,10]]},"396":{"position":[[7,12]]},"403":{"position":[[0,7]]},"411":{"position":[[0,7]]}}}],["integr",{"_index":85,"t":{"143":{"position":[[0,11]]},"283":{"position":[[8,11]]}}}],["interv",{"_index":211,"t":{"419":{"position":[[11,8]]}}}],["issu",{"_index":18,"t":{"33":{"position":[[7,6]]},"409":{"position":[[6,6]]}}}],["javascript",{"_index":126,"t":{"225":{"position":[[0,10]]}}}],["jwt",{"_index":181,"t":{"353":{"position":[[23,3]]},"357":{"position":[[33,3]]},"359":{"position":[[7,3]]}}}],["key",{"_index":186,"t":{"355":{"position":[[18,3]]}}}],["keystor",{"_index":231,"t":{"508":{"position":[[9,8]]},"510":{"position":[[19,8]]}}}],["known",{"_index":204,"t":{"409":{"position":[[0,5]]}}}],["kubernet",{"_index":138,"t":{"252":{"position":[[6,10]]}}}],["label",{"_index":42,"t":{"64":{"position":[[0,5]]}}}],["launch",{"_index":100,"t":{"183":{"position":[[8,6]]}}}],["level",{"_index":35,"t":{"54":{"position":[[8,6]]}}}],["libp2p",{"_index":73,"t":{"113":{"position":[[14,6]]},"115":{"position":[[14,6]]},"117":{"position":[[14,6]]},"121":{"position":[[11,6]]},"343":{"position":[[15,8]]},"495":{"position":[[0,6]]}}}],["libp2p/j",{"_index":78,"t":{"121":{"position":[[0,10]]}}}],["librari",{"_index":228,"t":{"484":{"position":[[9,9]]},"486":{"position":[[6,9]]}}}],["licens",{"_index":151,"t":{"287":{"position":[[0,7]]},"309":{"position":[[0,7]]}}}],["light",{"_index":147,"t":{"275":{"position":[[27,5]]},"279":{"position":[[0,5]]},"281":{"position":[[0,5]]}}}],["lightclient",{"_index":145,"t":{"269":{"position":[[0,11]]}}}],["linux",{"_index":110,"t":{"197":{"position":[[10,5]]},"218":{"position":[[14,5]]},"241":{"position":[[28,5]]}}}],["list",{"_index":122,"t":{"214":{"position":[[0,4]]},"263":{"position":[[17,4]]},"466":{"position":[[10,4]]},"468":{"position":[[10,4]]}}}],["llnode",{"_index":104,"t":{"189":{"position":[[11,6]]}}}],["local",{"_index":11,"t":{"18":{"position":[[11,5]]}}}],["locat",{"_index":187,"t":{"357":{"position":[[22,6]]}}}],["lodestar",{"_index":1,"t":{"3":{"position":[[15,8]]},"47":{"position":[[0,8]]},"69":{"position":[[0,8]]},"71":{"position":[[0,8]]},"197":{"position":[[20,8]]},"249":{"position":[[16,8]]},"325":{"position":[[0,8]]},"327":{"position":[[10,8]]},"353":{"position":[[14,8]]},"357":{"position":[[10,8]]},"384":{"position":[[8,8]]},"387":{"position":[[0,8]]},"407":{"position":[[0,8]]},"510":{"position":[[31,8]]}}}],["lodestar/api",{"_index":47,"t":{"75":{"position":[[0,13]]}}}],["lodestar/beacon",{"_index":48,"t":{"77":{"position":[[0,16]]}}}],["lodestar/config",{"_index":50,"t":{"79":{"position":[[0,16]]}}}],["lodestar/db",{"_index":51,"t":{"81":{"position":[[0,12]]}}}],["lodestar/flar",{"_index":52,"t":{"83":{"position":[[0,15]]}}}],["lodestar/fork",{"_index":53,"t":{"85":{"position":[[0,14]]}}}],["lodestar/light",{"_index":55,"t":{"87":{"position":[[0,15]]}}}],["lodestar/logg",{"_index":57,"t":{"89":{"position":[[0,16]]}}}],["lodestar/param",{"_index":58,"t":{"91":{"position":[[0,16]]}}}],["lodestar/prov",{"_index":59,"t":{"93":{"position":[[0,16]]}}}],["lodestar/reqresp",{"_index":60,"t":{"95":{"position":[[0,17]]}}}],["lodestar/spec",{"_index":61,"t":{"97":{"position":[[0,14]]}}}],["lodestar/st",{"_index":63,"t":{"99":{"position":[[0,15]]}}}],["lodestar/typ",{"_index":65,"t":{"101":{"position":[[0,15]]}}}],["lodestar/util",{"_index":66,"t":{"103":{"position":[[0,15]]}}}],["lodestar/valid",{"_index":67,"t":{"105":{"position":[[0,19]]}}}],["log",{"_index":33,"t":{"53":{"position":[[0,7]]},"54":{"position":[[0,7]]},"56":{"position":[[0,7]]},"175":{"position":[[11,7]]},"365":{"position":[[18,4]]}}}],["maco",{"_index":14,"t":{"25":{"position":[[0,5]]},"220":{"position":[[14,5]]}}}],["mainnet",{"_index":179,"t":{"351":{"position":[[11,7]]}}}],["manag",{"_index":161,"t":{"321":{"position":[[5,10]]},"345":{"position":[[9,10]]}}}],["merg",{"_index":10,"t":{"18":{"position":[[5,5]]}}}],["method",{"_index":156,"t":{"295":{"position":[[15,7]]},"375":{"position":[[8,7]]}}}],["mev",{"_index":166,"t":{"327":{"position":[[29,3]]}}}],["modifi",{"_index":109,"t":{"197":{"position":[[0,9]]}}}],["monitor",{"_index":210,"t":{"419":{"position":[[0,10]]}}}],["monorepo",{"_index":32,"t":{"47":{"position":[[9,8]]},"71":{"position":[[9,8]]},"484":{"position":[[0,8]]}}}],["nat",{"_index":176,"t":{"347":{"position":[[0,3]]}}}],["nativ",{"_index":131,"t":{"233":{"position":[[0,6]]}}}],["need",{"_index":7,"t":{"11":{"position":[[0,4]]},"303":{"position":[[9,4]]}}}],["network",{"_index":167,"t":{"331":{"position":[[0,10]]},"491":{"position":[[0,10]]},"494":{"position":[[0,10]]}}}],["node",{"_index":49,"t":{"77":{"position":[[17,4]]},"250":{"position":[[17,4]]},"359":{"position":[[45,4]]},"361":{"position":[[13,4]]}}}],["nois",{"_index":75,"t":{"115":{"position":[[21,5]]}}}],["non",{"_index":157,"t":{"297":{"position":[[0,3]]}}}],["npm",{"_index":205,"t":{"411":{"position":[[13,3]]}}}],["option",{"_index":81,"t":{"127":{"position":[[4,7]]},"269":{"position":[[12,7]]},"317":{"position":[[7,7]]},"369":{"position":[[9,7]]},"450":{"position":[[10,7]]},"454":{"position":[[37,7]]},"458":{"position":[[37,7]]},"464":{"position":[[17,7]]},"474":{"position":[[25,7]]},"480":{"position":[[34,7]]}}}],["osx",{"_index":135,"t":{"243":{"position":[[28,3]]}}}],["packag",{"_index":203,"t":{"403":{"position":[[8,8]]}}}],["peer",{"_index":169,"t":{"333":{"position":[[0,4]]},"337":{"position":[[0,4]]}}}],["perform",{"_index":83,"t":{"139":{"position":[[0,11]]}}}],["polici",{"_index":34,"t":{"53":{"position":[[8,6]]}}}],["post",{"_index":9,"t":{"18":{"position":[[0,4]]}}}],["prerequisit",{"_index":13,"t":{"23":{"position":[[0,13]]},"273":{"position":[[0,13]]},"301":{"position":[[0,13]]},"399":{"position":[[0,13]]}}}],["process",{"_index":28,"t":{"43":{"position":[[13,7]]},"185":{"position":[[18,7]]},"239":{"position":[[36,7]]}}}],["programmat",{"_index":149,"t":{"281":{"position":[[13,12]]}}}],["prometheu",{"_index":212,"t":{"427":{"position":[[0,10]]}}}],["proof",{"_index":139,"t":{"257":{"position":[[0,5]]}}}],["protect",{"_index":221,"t":{"452":{"position":[[19,10]]},"454":{"position":[[19,10]]},"456":{"position":[[19,10]]},"458":{"position":[[19,10]]}}}],["provid",{"_index":154,"t":{"293":{"position":[[21,8]]}}}],["public",{"_index":180,"t":{"351":{"position":[[24,6]]}}}],["quickstart",{"_index":198,"t":{"387":{"position":[[9,10]]}}}],["rang",{"_index":196,"t":{"380":{"position":[[0,5]]}}}],["read",{"_index":144,"t":{"263":{"position":[[9,7]]}}}],["recipi",{"_index":233,"t":{"512":{"position":[[20,9]]}}}],["recommend",{"_index":206,"t":{"411":{"position":[[22,12]]}}}],["refer",{"_index":121,"t":{"213":{"position":[[0,10]]},"214":{"position":[[12,10]]}}}],["remot",{"_index":207,"t":{"417":{"position":[[0,6]]}}}],["render",{"_index":115,"t":{"203":{"position":[[0,9]]}}}],["report",{"_index":25,"t":{"41":{"position":[[0,9]]},"173":{"position":[[11,7]]},"441":{"position":[[0,9]]}}}],["repositori",{"_index":202,"t":{"401":{"position":[[6,10]]}}}],["req/resp",{"_index":173,"t":{"337":{"position":[[34,9]]},"341":{"position":[[0,8]]}}}],["requir",{"_index":146,"t":{"275":{"position":[[0,12]]}}}],["result",{"_index":119,"t":{"209":{"position":[[10,7]]}}}],["run",{"_index":87,"t":{"153":{"position":[[0,7]]},"185":{"position":[[10,7]]},"239":{"position":[[28,7]]},"250":{"position":[[0,7]]},"275":{"position":[[17,7]]},"361":{"position":[[0,3]]},"518":{"position":[[0,3]]}}}],["script",{"_index":41,"t":{"60":{"position":[[15,6]]}}}],["secret",{"_index":185,"t":{"355":{"position":[[11,6]]},"357":{"position":[[37,6]]}}}],["select",{"_index":235,"t":{"514":{"position":[[23,9]]}}}],["serial",{"_index":230,"t":{"499":{"position":[[0,13]]}}}],["setup",{"_index":165,"t":{"327":{"position":[[19,5]]},"506":{"position":[[0,5]]}}}],["sim",{"_index":88,"t":{"153":{"position":[[8,3]]},"165":{"position":[[0,3]]}}}],["simul",{"_index":86,"t":{"145":{"position":[[0,10]]},"167":{"position":[[0,10]]},"169":{"position":[[0,10]]},"173":{"position":[[0,10]]},"175":{"position":[[0,10]]}}}],["slash",{"_index":220,"t":{"452":{"position":[[10,8]]},"454":{"position":[[10,8]]},"456":{"position":[[10,8]]},"458":{"position":[[10,8]]}}}],["sourc",{"_index":200,"t":{"398":{"position":[[11,6]]},"405":{"position":[[6,6]]}}}],["spec",{"_index":20,"t":{"35":{"position":[[10,4]]},"137":{"position":[[0,4]]}}}],["specif",{"_index":5,"t":{"7":{"position":[[0,14]]},"25":{"position":[[6,9]]}}}],["stack",{"_index":113,"t":{"201":{"position":[[10,5]]}}}],["stake",{"_index":140,"t":{"257":{"position":[[9,5]]}}}],["start",{"_index":4,"t":{"5":{"position":[[8,7]]},"27":{"position":[[8,7]]},"277":{"position":[[8,7]]},"305":{"position":[[8,7]]}}}],["start_lodestar.sh",{"_index":111,"t":{"199":{"position":[[8,17]]}}}],["style",{"_index":30,"t":{"45":{"position":[[7,5]]},"49":{"position":[[0,5]]},"51":{"position":[[6,5]]}}}],["sub",{"_index":216,"t":{"445":{"position":[[10,3]]}}}],["subject",{"_index":194,"t":{"373":{"position":[[5,12]]}}}],["submit",{"_index":239,"t":{"516":{"position":[[0,6]]}}}],["support",{"_index":155,"t":{"295":{"position":[[0,9]]},"297":{"position":[[4,9]]},"391":{"position":[[0,7]]},"439":{"position":[[0,9]]}}}],["sync",{"_index":191,"t":{"363":{"position":[[11,4]]},"365":{"position":[[13,4]]},"375":{"position":[[0,7]]},"376":{"position":[[11,4]]},"378":{"position":[[11,4]]},"380":{"position":[[6,4]]},"382":{"position":[[9,4]]},"384":{"position":[[0,7]]}}}],["test",{"_index":15,"t":{"29":{"position":[[0,5]]},"35":{"position":[[15,5]]},"51":{"position":[[0,5]]},"97":{"position":[[15,4]]},"135":{"position":[[5,5]]},"137":{"position":[[5,5]]},"139":{"position":[[12,5]]},"141":{"position":[[11,5]]},"143":{"position":[[12,5]]},"145":{"position":[[11,5]]},"153":{"position":[[12,5]]},"165":{"position":[[4,4]]}}}],["test:sim:deneb",{"_index":93,"t":{"161":{"position":[[0,14]]}}}],["test:sim:endpoint",{"_index":92,"t":{"159":{"position":[[0,18]]}}}],["test:sim:mixedcleint",{"_index":94,"t":{"163":{"position":[[0,20]]}}}],["test:sim:multifork",{"_index":91,"t":{"157":{"position":[[0,18]]}}}],["testnet",{"_index":12,"t":{"18":{"position":[[17,7]]},"351":{"position":[[31,7]]}}}],["time",{"_index":23,"t":{"39":{"position":[[6,4]]}}}],["token",{"_index":183,"t":{"353":{"position":[[42,5]]}}}],["tool",{"_index":125,"t":{"216":{"position":[[14,5]]},"235":{"position":[[17,5]]},"247":{"position":[[0,7]]}}}],["trace",{"_index":114,"t":{"201":{"position":[[16,6]]}}}],["transit",{"_index":64,"t":{"99":{"position":[[16,10]]}}}],["transport",{"_index":174,"t":{"343":{"position":[[5,9]]}}}],["travers",{"_index":177,"t":{"347":{"position":[[4,9]]}}}],["troubleshoot",{"_index":136,"t":{"249":{"position":[[0,15]]}}}],["ts",{"_index":70,"t":{"109":{"position":[[16,2]]}}}],["unfilt",{"_index":120,"t":{"211":{"position":[[0,10]]}}}],["unit",{"_index":82,"t":{"135":{"position":[[0,4]]}}}],["url",{"_index":209,"t":{"417":{"position":[[16,3]]}}}],["us",{"_index":39,"t":{"60":{"position":[[0,5]]},"252":{"position":[[0,5]]}}}],["usag",{"_index":117,"t":{"207":{"position":[[0,5]]},"291":{"position":[[0,5]]}}}],["util",{"_index":62,"t":{"97":{"position":[[20,4]]},"487":{"position":[[4,9]]}}}],["v8",{"_index":129,"t":{"227":{"position":[[11,2]]},"229":{"position":[[10,2]]},"231":{"position":[[12,2]]}}}],["valid",{"_index":219,"t":{"448":{"position":[[5,9]]},"450":{"position":[[0,9]]},"452":{"position":[[0,9]]},"454":{"position":[[0,9]]},"456":{"position":[[0,9]]},"458":{"position":[[0,9]]},"460":{"position":[[0,9]]},"462":{"position":[[0,9]]},"464":{"position":[[0,9]]},"466":{"position":[[0,9]]},"468":{"position":[[0,9]]},"470":{"position":[[0,9]]},"472":{"position":[[0,9]]},"474":{"position":[[0,9]]},"476":{"position":[[0,9]]},"478":{"position":[[0,9]]},"480":{"position":[[0,9]]},"506":{"position":[[11,9]]},"510":{"position":[[9,9]]},"516":{"position":[[9,9]]},"518":{"position":[[8,9]]}}}],["variabl",{"_index":90,"t":{"155":{"position":[[12,9]]}}}],["version",{"_index":213,"t":{"439":{"position":[[10,8]]}}}],["view",{"_index":130,"t":{"229":{"position":[[0,7]]}}}],["visual",{"_index":124,"t":{"216":{"position":[[0,13]]}}}],["voluntari",{"_index":224,"t":{"470":{"position":[[10,9]]},"472":{"position":[[10,9]]},"474":{"position":[[10,9]]}}}],["vs",{"_index":98,"t":{"183":{"position":[[0,2]]}}}],["vulner",{"_index":214,"t":{"441":{"position":[[12,13]]}}}],["warn",{"_index":159,"t":{"299":{"position":[[0,8]]}}}],["weak",{"_index":193,"t":{"373":{"position":[[0,4]]}}}],["web",{"_index":123,"t":{"214":{"position":[[8,3]]}}}],["web3",{"_index":153,"t":{"293":{"position":[[16,4]]},"295":{"position":[[10,4]]}}}],["welcom",{"_index":0,"t":{"3":{"position":[[0,7]]}}}],["yamux",{"_index":76,"t":{"117":{"position":[[21,5]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":4,"t":"Lodestar is an open-source Ethereum Consensus client and Typescript ecosystem, maintained by ChainSafe Systems","s":"Welcome to the Lodestar documentation","u":"/lodestar/","h":"#welcome-to-the-lodestar-documentation","p":2},{"i":6,"t":"Follow the instructions for build from source, binaries, or Docker to install Lodestar. Or use our Lodestar Quickstart scripts. Use Lodestar libraries in your next Ethereum Typescript project. Run a beacon node on mainnet or a public testnet. Utilize the whole stack by starting a local testnet. View the Lodestar Beacon CLI commands and options Prospective contributors can read the contributing section to understand how we develop and test on Lodestar. If you have questions submit an issue or join us on Discord! Please note our security policy.","s":"Getting started","u":"/lodestar/","h":"#getting-started","p":2},{"i":8,"t":"Hardware specifications minimum / recommended, to run the Lodestar client. Minimum Recommended Processor Intel Core i3–9100 or AMD Ryzen 5 3450 Intel Core i7–9700 or AMD Ryzen 7 4700 Memory 16GB RAM 32GB RAM Storage 100GB available space SSD 1TB available space SSD Internet Broadband connection Broadband connection","s":"Specifications","u":"/lodestar/","h":"#specifications","p":2},{"i":10,"t":"This documentation is open source, contribute at Github Lodestar repository /docs.","s":"About these docs","u":"/lodestar/","h":"#about-these-docs","p":2},{"i":12,"t":"If you have questions about this documentation, feel free to talk to us on our ChainSafe Discord or open an issue and a member of the team or our community will be happy to assist you.","s":"Need assistance?","u":"/lodestar/","h":"#need-assistance","p":2},{"i":17,"t":"To quickly test and run Lodestar we recommend starting a local testnet. We recommend a simple configuration of two beacon nodes with multiple validators. The dev scripts can used for simplicity but below instructions provide more insights on how it works and include details about different configurations. note The testnet set up in this guide is meant to be short-lived / ephemeral and should primarily be used for development and testing. Please refer to Ethereum In a Box or Kurtosis ethereum package to set up a long-lived private network or devnet. Terminal 1 Run a beacon node as a bootnode, with 8 validators with the following command. ./lodestar dev \\ --genesisValidators 8 \\ --genesisTime 1669713528 \\ --startValidators 0..7 \\ --enr.ip 127.0.0.1 \\ --enr.udp 9000 \\ --dataDir \\ --reset --genesisValidators and --genesisTime define the genesis state of the beacon chain. --dataDir defines a path where Lodestar should store the beacon state. --enr.ip sets the ENR IP entry for the node (essential for second node to connect via enr) and --enr.udp exposes the Discv5 discovery service (if you want to connect more than 1 node and enable discovery amongst them via bootnode). Lastly the --reset flag ensures the state is cleared on each restart - which is useful when testing locally. Once the node has started, make a request to curl http://localhost:9596/eth/v1/node/identity and copy the enr value. This would be used to connect from the second node. ENR stands for Ethereum node records, which is a format for conveying p2p connectivity information for Ethereum nodes. For more info see EIP-778. Terminal 2 Start the second node without starting any validators and connect to the first node by supplying the copied enr value: ./lodestar dev \\ --genesisValidators 8 \\ --genesisTime 1669713528 \\ --dataDir \\ --port 9001 \\ --rest.port 9597 \\ --network.connectToDiscv5Bootnodes true \\ --bootnodes \\ --reset By default, Lodestar starts as many validators as the number supplied by --genesisValidators. In order to not start any validator, this is overridden by the --startValidators option. Passing a value of 0..0 means no validators should be started. Also, take note that the values of --genesisValidators and --genesisTime must be the same as the ones passed to the first node in order for the two nodes to have the same beacon chain. Also --port and --rest.port are supplied since the default values will already be in use by the first node. The --network.connectToDiscv5Bootnodes flags needs to be set to true as this is needed to allow connection to boot ENRs on local devnet. The exact ENR of node to connect to is then supplied via the --bootnodes flag. Once the second node starts, you should see an output similar to the following in either of the terminals: Eph 167991/6 6.007 [] info: Searching peers - peers: 1 - slot: 5375718 (skipped 5375718) - head: 0 0xcc67…3345 - finalized: 0x0000…0000:0 For further confirmation that both nodes are connected as peers, make a request to the /eth/v1/node/peers endpoint. For example, making the request on the first node via the following command: curl http://localhost:9596/eth/v1/node/peers | jq will give a result similar to the following: { \"data\": [ { \"peer_id\": \"...\", \"enr\": \"\", \"last_seen_p2p_address\": \"....\", \"direction\": \"inbound\", \"state\": \"connected\" } ], \"meta\": { \"count\": 1 } }","s":"Setting-Up a Testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","h":"","p":16},{"i":19,"t":"To set up a local testnet with a Post-Merge configuration, you may need to add the following parameters (in addition to the parameters described above) to your lodestar dev command: --params.ALTAIR_FORK_EPOCH 0 --params.BELLATRIX_FORK_EPOCH 0 --terminal-total-difficulty-override 0","s":"Post-Merge local testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","h":"#post-merge-local-testnet","p":16},{"i":22,"t":"Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward.","s":"Contribution Guidelines","u":"/lodestar/contribution/getting-started","h":"","p":21},{"i":24,"t":"⚙ NodeJS (LTS) 🧰 Yarn","s":"Prerequisites","u":"/lodestar/contribution/getting-started","h":"#prerequisites","p":21},{"i":26,"t":"When using MacOS, there are a couple of extra prerequisites that are required. python coreutils (e.g. via brew install coreutils)","s":"MacOS Specifics","u":"/lodestar/contribution/getting-started","h":"#macos-specifics","p":21},{"i":28,"t":"⚙ Run corepack enable to enable Corepack. ⚙ Run yarn to install dependencies. ⚙ Run yarn build to build lib from source. 📦 A lodestar binary will be bundled in ./packages/cli/bin. 💻 Run ./lodestar --help to get a list of available commands and arguments.","s":"Getting Started","u":"/lodestar/contribution/getting-started","h":"#getting-started","p":21},{"i":30,"t":"To run tests: 🧪 Run yarn test:unit for unit tests. 🧪 Run yarn test:e2e for end-to-end tests. 🧪 Run yarn test:spec for spec tests. 🧪 Run yarn test to run all tests. 🧪 Run yarn check-types to check TypeScript types. 🧪 Run yarn lint to run the linter. Note that to run test:e2e, first ensure that the environment is correctly setup by running the run_e2e_env.sh script. This script requires a running docker engine. ./scripts/run_e2e_env.sh start Similarly, run yarn download-spec-tests before running yarn test:spec. Contributing to tests: Test must not depend on external live resources, such that running tests for a commit must be deterministic: Do not pull data from external APIs like execution JSON RPC (instead run a local node). Do not pull unpinned versions from DockerHub (use deterministic tag) or Github (checkout commit not branch). Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment.","s":"Tests","u":"/lodestar/contribution/getting-started","h":"#tests","p":21},{"i":32,"t":"A devcontainer configuration is provided to help speed up linux based development environment setup. It will be used by GitHub Codespaces or directly inside VS Code via your local through this extension.","s":"Devcontainer","u":"/lodestar/contribution/getting-started","h":"#devcontainer","p":21},{"i":34,"t":"Error: [vitest] Cannot mock \"../../src/db/repositories/index.js\" because it is already loaded by \"src/db/beacon.ts\" If you observe any error in tests with matching to above error message, that implies you are loading the mocks in the wrong order. The correct order is to import the mocks first and then the actual module. We suggest to import the mocks on very top before any local modules. ✖ Error: Cannot find package 'async_hooks' imported from If you observe following error running any of the test files that means you are running a file which itself or any dependency of that file imports vitest, but you are not running that file with vitest runner. Try running it with yarn vitest command, not with node command.","s":"Common Issues","u":"/lodestar/contribution/getting-started","h":"#common-issues","p":21},{"i":36,"t":"To fix errors always focus on passing all minimal tests first without running mainnet tests. Spec tests often compare full expected vs actual states in JSON format. A single logical error can cause many spec tests to fail. To focus on a single test at a time you can use vitest's option --bail 1 to stop at the first failed test To then run only that failed test you can run against a specific file as use vitest's filters option -t to run only one case Before running the tests, make sure to switch to the package directory (e.g. packages/beacon-node) to speed up test execution LODESTAR_PRESET=minimal yarn vitest --run --bail 1 --config vitest.spec.config.ts test/spec/presets/sanity.test.ts -t attester_slashing","s":"Debugging Spec Tests","u":"/lodestar/contribution/getting-started","h":"#debugging-spec-tests","p":21},{"i":38,"t":"The docker-compose file requires that a .env file be present in this directory. The default.env file provides a template and can be copied .env: cp default.env .env Beacon node only​ docker-compose up -d Beacon node and validator​ First, you must have keystores and their secrets available locally at ./keystores and your password.txt in ./secrets docker-compose -f docker-compose.yml -f docker-compose.validator.yml up -d Dockerized metrics + local beacon node​ Run a local beacon with --metrics enabled. Then start Prometheus + Grafana with all dashboards in ./dashboards automatically loaded running: ./docker/docker-compose.local_dev.sh","s":"Docker","u":"/lodestar/contribution/getting-started","h":"#docker","p":21},{"i":40,"t":"Unsure where to begin contributing to Lodestar? Here are some ideas! ✏️ See any typos? See any verbiage that should be changed or updated? Go for it! Github makes it easy to make contributions right from the browser. 🔎 Look through our outstanding unassigned issues. (Hint: look for issues labeled good first issue or help-wanted!) 💬 Join our Discord chat!","s":"First Time Contributor?","u":"/lodestar/contribution/getting-started","h":"#first-time-contributor","p":21},{"i":42,"t":"🗒 Create a new issue! Select the type of issue that best fits, and please fill out as much of the information as you can.","s":"Reporting A Bug?","u":"/lodestar/contribution/getting-started","h":"#reporting-a-bug","p":21},{"i":44,"t":"Make sure you're familiar with our contribution guidelines (this document)! Create your own fork of this repository. Make your changes in your local fork. If you've made a code change, make sure to lint and test your changes (yarn lint and yarn test:unit). Make an open pull request when you're ready for it to be reviewed. We review PRs on a regular basis. See Pull request etiquette for more information. You may be asked to sign a Contributor License Agreement (CLA). We make it relatively painless with CLA-bot.","s":"Contribution Process","u":"/lodestar/contribution/getting-started","h":"#contribution-process","p":21},{"i":46,"t":"Branch Naming If you are contributing from this repository prefix the branch name with your Github username (i.e. myusername/short-description) Pull Request Naming Pull request titles must be: Adhering to the conventional commits spec Short and descriptive summary Written in imperative present tense Not end with a period For example: feat: add lodestar prover for execution api fix: ignore known block in publish blinded block flow refactor(reqresp)!: support byte based handlers Pull Request Etiquette Pull requests should remain as drafts when they are not ready for review by maintainers. Open pull requests signal to the maintainers that it's ready for review. If your pull request is no longer applicable or validated to fix an issue, close your pull request. If your pull request is fixable and needs additional changes or commits within a short period of time, switch your pull request into a draft until it's ready. Otherwise, close your pull request and create a new issue instead.","s":"Github Style Guide","u":"/lodestar/contribution/getting-started","h":"#github-style-guide","p":21},{"i":48,"t":"We're currently experimenting with hosting the majority of lodestar packages and support packages in this repository as a monorepo. We're using Lerna to manage the packages. See packages/ for a list of packages hosted in this repository.","s":"Lodestar Monorepo","u":"/lodestar/contribution/getting-started","h":"#lodestar-monorepo","p":21},{"i":50,"t":"Lodestar has migrated to using ES modules. Many module class constructors have the following signature: (options, dependencies) e.g.: public constructor(opts: IExampleOptions, {db, logger}: IExampleModules) Modules should be designed to \"do one thing and do it well!\" Consider the interface of a module -- events included, and make sure it is coherent Make sure your code is properly linted use an IDE that will show linter errors/warnings run yarn lint from the command line common rules: Functions and variables should be camelCase, classes should be PascalCase, constants should be UPPERCASE_WITH_UNDERSCORES. Use \" instead of ' All functions should have types declared for all parameters and return value You shouldn't be using TypeScript type any Private class properties should not be prefixed with a _ e.g.: private dirty;, not private _dirty; Make sure that your code is properly type checked: use an IDE that will show type errors run yarn check-types from the command line Make sure that the tests are still passing: run yarn test:unit from the command line Commenting: If your code does something that is not obvious or deviates from standards, leave a comment for other developers to explain your logic and reasoning. Use // commenting format unless it's a comment you want people to see in their IDE. Use /** */ commenting format for documenting a function/variable. Code white space can be helpful for reading complex code, please add some. For unit tests, we forbid import stubbing when other approaches are feasible. Metrics are a critical part of Lodestar, every large feature should be documented with metrics Metrics need to follow the Prometheus Best Practices For metric names, make sure to add the unit as suffix, e.g. _seconds or _bytes Metric code variables on the other hand should not be suffixed, i.e. Sec-suffix should be omitted Time-based metrics must use seconds as the unit","s":"Style Guide","u":"/lodestar/contribution/getting-started","h":"#style-guide","p":21},{"i":52,"t":"Test must not depend on external live resources, such that running tests for a commit must be deterministic: Do not pull data from external APIs like execution JSON RPC (instead run a local node). Do not pull unpinned versions from dockerhub (use deterministic tag) or Github (checkout commit not branch). Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment. Add assertion messages where possible to ease fixing tests if they fail. If an assertion message is called from multiple times with the same stack trace, you MUST include an assertion message. For example, if an assertion is inside a for loop add some metadata to be able to locate the error source: for (const blockResult of blocksResult) { expect(blockResult.status).equals(\"processed\", `wrong block ${blockResult.id} result status`); }","s":"Tests style guide","u":"/lodestar/contribution/getting-started","h":"#tests-style-guide","p":21},{"i":55,"t":"Contributors must choose the log level carefully to ensure a consistent experience for every type of user: error: Critical issues that prevent the application from functioning correctly or cause significant disruption to users. Examples include failed network connections, crashes, or data corruption. warn: Situations that may lead to critical issues if not addressed but do not prevent the application from functioning. Examples include configuration issues, deprecated features, or temporary network disruptions. info: General sporadic informational about the node's state. Examples include initialization messages, infrequent periodic status updates, or high-level progress reports. debug: Detailed diagnostic information that can help developers or users troubleshoot specific issues. Examples include individual request logs for every REST API, networking interactions, or internal components status changes. Alias to verbose.","s":"Logging Levels","u":"/lodestar/contribution/getting-started","h":"#logging-levels","p":21},{"i":57,"t":"Avoid excessive logging. Log messages should be clear and concise, providing enough information to understand the context and severity of the issue. Do not log sensitive data, such as private keys, user credentials, or personal information. Do not log arbitrary data from the network as ASCII or UTF8 at levels higher or equal to info. Use clear and concise language. Prefer to log variables in JSON format log.debug(\"Action\", {slot}) instead of formatting the text yourself log.debug('slot=${slot}'). Include only relevant context in log messages, sufficient to debug the issue or action it refers to.","s":"Logging guidelines","u":"/lodestar/contribution/getting-started","h":"#logging-guidelines","p":21},{"i":59,"t":"To edit or extend an existing Grafana dashboard with minimal diff: Grab the .json dashboard file from current unstable Import the file to Grafana via the web UI at /dashboard/import without modifying the UID of the dashboard Visually edit the dashboard Once done make sure to leave the exact same visual aspect as before: same refresh interval, time range, etc. Save the dashboard (CTRL+S) Run download script, see below on how to use it Check git diff of updated dashboards, commit, push and open your PR","s":"Contributing to Grafana dashboards","u":"/lodestar/contribution/getting-started","h":"#contributing-to-grafana-dashboards","p":21},{"i":61,"t":"Create a file .secrets.env with envs GRAFANA_API_KEY=$token GRAFANA_URL=https://yourgrafanaapi.io Run script to download dashboards to ./dashboards folder node scripts/download_dashboards.mjs","s":"Using Download Script","u":"/lodestar/contribution/getting-started","h":"#using-download-script","p":21},{"i":63,"t":"When submitting PRs for documentation updates, build and run the documentation locally to ensure functionality before submission. First generate the CLI documentation with yarn docs:build. Then build and serve the documentation locally with yarn docs:serve. Your locally served documentation will then be accessible at http://localhost:3000/lodestar/. We also use a spelling word list as part of our documentation checks. If using unrecognized words or abbreviations, please extend the word list to pass checks. Make sure the list is sorted with ./scripts/wordlist_sort.sh and checked with ./scripts/wordlist_sort_check.sh for sorting and duplicates.","s":"Contributing to Documentation","u":"/lodestar/contribution/getting-started","h":"#contributing-to-documentation","p":21},{"i":65,"t":"Issues and pull requests are subject to the following labeling guidelines. PRs may have a status label to indicate deviation from the normal process such as status-blocked or status-do-not-merge Issues and PRs will be tagged with a scope and prio to indicate type and priority for triage. All other labels allow for further evaluation and organization. Label descriptions can be found below. status.* Issues and Pull Request Status​ Status labels apply to issues and pull requests which deviate from normal processes. scope.* Scope Indicator​ Scope is comparable to Module labels but less strict with the definition of components. It applies to both, issues and pull requests. prio.* Prioritization Indicator​ A simple indicator of issue prioritization. It mainly applies to issues. spec.* Ethereum Consensus Spec Version Target​ Issues that target a specific version of the Ethereum consensus spec, shall be tagged accordingly.","s":"Label Guide","u":"/lodestar/contribution/getting-started","h":"#label-guide","p":21},{"i":67,"t":"Come chat with us on Discord and join our public weekly planning meetings!","s":"Community","u":"/lodestar/contribution/getting-started","h":"#community","p":21},{"i":70,"t":"This is a diagram of the various Lodestar packages in the monorepo, how they fit together and interact with major external dependencies: note This dependency graph only applies to dependencies as they are used in the src/ folders of each package, not in test/","s":"Lodestar Dependency Graph","u":"/lodestar/contribution/depgraph","h":"#lodestar-dependency-graph","p":68},{"i":72,"t":"For a list of all the packages in the monorepo and a description for each, click here. Below is a brief summary of each package in alphabetical order.","s":"Lodestar Monorepo","u":"/lodestar/contribution/depgraph","h":"#lodestar-monorepo","p":68},{"i":74,"t":"@chainsafe/lodestar combines everything together for CLI usage and configuration of the beacon node and validator.","s":"@chainsafe/lodestar","u":"/lodestar/contribution/depgraph","h":"#chainsafelodestar","p":68},{"i":76,"t":"@lodestar/api contains a TypeScript REST client for the Ethereum Consensus API.","s":"@lodestar/api","u":"/lodestar/contribution/depgraph","h":"#lodestarapi","p":68},{"i":78,"t":"@lodestar/beacon-node contains the actual beacon node process itself, which is the aggregate of all the above packages and the \"brain\" of the Lodestar beacon chain implementation. All of the node modules live in this package as well.","s":"@lodestar/beacon-node","u":"/lodestar/contribution/depgraph","h":"#lodestarbeacon-node","p":68},{"i":80,"t":"@lodestar/config combines @lodestar/params and @lodestar/types together to be used as a single config object across the other Lodestar packages.","s":"@lodestar/config","u":"/lodestar/contribution/depgraph","h":"#lodestarconfig","p":68},{"i":82,"t":"@lodestar/db is where all persistent data about the beacon node is stored. Any package that needs to read or write persistent beacon node data depends on @lodestar/db.","s":"@lodestar/db","u":"/lodestar/contribution/depgraph","h":"#lodestardb","p":68},{"i":84,"t":"@lodestar/flare is a command tool used for easily triggering non-standard actions and debugging for researchers, developers and testers. Use with care.","s":"@lodestar/flare","u":"/lodestar/contribution/depgraph","h":"#lodestarflare","p":68},{"i":86,"t":"@lodestar/fork-choice holds the methods for reading/writing the fork choice DAG. The @lodestar/beacon-node package is the sole consumer of this package because the beacon node itself is what controls when the fork choice DAG is updated. For a good explanation on how the fork choice itself works, see the annotated fork choice spec. This is an annotated version of the Ethereum Consensus fork choice spec which @lodestar/fork-choice is based on.","s":"@lodestar/fork-choice","u":"/lodestar/contribution/depgraph","h":"#lodestarfork-choice","p":68},{"i":88,"t":"@lodestar/light-client is our light client designed to interact with the Ethereum blockchain in a trust-minimized matter via the sync committee and the light-client protocol.","s":"@lodestar/light-client","u":"/lodestar/contribution/depgraph","h":"#lodestarlight-client","p":68},{"i":90,"t":"@lodestar/logger is a common NodeJS logger for Lodestar binaries, which is required for worker threads to instantiate new loggers with consistent settings.","s":"@lodestar/logger","u":"/lodestar/contribution/depgraph","h":"#lodestarlogger","p":68},{"i":92,"t":"@lodestar/params contains the parameters for configuring an Ethereum Consensus network. For example, the mainnet params.","s":"@lodestar/params","u":"/lodestar/contribution/depgraph","h":"#lodestarparams","p":68},{"i":94,"t":"@lodestar/prover is a web3 provider and a proxy to enable verification of JSON-RPC calls to the execution client using the light-client protocol.","s":"@lodestar/prover","u":"/lodestar/contribution/depgraph","h":"#lodestarprover","p":68},{"i":96,"t":"@lodestar/reqresp contains the TypeScript implementation of the Ethereum Consensus Req/Resp protocol.","s":"@lodestar/reqresp","u":"/lodestar/contribution/depgraph","h":"#lodestarreqresp","p":68},{"i":98,"t":"@lodestar/spec-test-util is a Vitest test utility harness used for adhering to the Ethereum Consensus specification tests.","s":"@lodestar/spec-test-util","u":"/lodestar/contribution/depgraph","h":"#lodestarspec-test-util","p":68},{"i":100,"t":"@lodestar/state-transition contains the Lodestar implementation of the beacon state transition function, which is used by @lodestar/beacon-node to perform the actual beacon state transition. This package also contains various functions used to calculate info about the beacon chain (such as computeEpochAtSlot) which are used by @lodestar/fork-choice and @lodestar/validator","s":"@lodestar/state-transition","u":"/lodestar/contribution/depgraph","h":"#lodestarstate-transition","p":68},{"i":102,"t":"@lodestar/types contains Ethereum Consensus ssz types and data structures.","s":"@lodestar/types","u":"/lodestar/contribution/depgraph","h":"#lodestartypes","p":68},{"i":104,"t":"@lodestar/utils contains various utilities that are common among the various Lodestar monorepo packages.","s":"@lodestar/utils","u":"/lodestar/contribution/depgraph","h":"#lodestarutils","p":68},{"i":106,"t":"@lodestar/validator contains the validator client. The sole consumer of this package is @chainsafe/lodestar, which provides CLI access to run and configure the validator client. However, the validator client communicates to a REST API that is contained in @lodestar/beacon-node (specifically in the api module) to perform the validator duties.","s":"@lodestar/validator","u":"/lodestar/contribution/depgraph","h":"#lodestarvalidator","p":68},{"i":108,"t":"Below is a brief summary, listed alphabetically, of each of our main external dependencies managed externally from our monorepo.","s":"External Dependencies","u":"/lodestar/contribution/depgraph","h":"#external-dependencies","p":68},{"i":110,"t":"@chainsafe/blst-ts` is our TypeScript wrapper for @supranational/blst native bindings, a highly performant BLS12-381 signature library.","s":"@chainsafe/blst-ts","u":"/lodestar/contribution/depgraph","h":"#chainsafeblst-ts","p":68},{"i":112,"t":"@chainsafe/discv5 is our monorepo containing our TypeScript implementation of the discv5 Node Discovery Protocol v5.","s":"@chainsafe/discv5","u":"/lodestar/contribution/depgraph","h":"#chainsafediscv5","p":68},{"i":114,"t":"@chainsafe/js-libp2p-gossipsub is an implementation of pubsub based on mmeshsub and floodsub. Specified under @libp2p/specs/pubsub/gossipsub.","s":"@chainsafe/js-libp2p-gossipsub","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-gossipsub","p":68},{"i":116,"t":"@chainsafe/js-libp2p-noise contains the TypeScript implementation of the Noise protocol, an encryption protocol used in @libp2p/specs/noise.","s":"@chainsafe/js-libp2p-noise","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-noise","p":68},{"i":118,"t":"@chainsafe/js-libp2p-yamux contains the JavaScript implementation of the Yamux multiplexer from Hashicorp designed for usage with js-libp2p.","s":"@chainsafe/js-libp2p-yamux","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-yamux","p":68},{"i":120,"t":"@chainsafe/ssz contains the packages as a monorepo related to the Simple Serialize.","s":"@chainsafe/ssz","u":"/lodestar/contribution/depgraph","h":"#chainsafessz","p":68},{"i":122,"t":"@libp2p/js-libp2p is the JavaScript implementation of the libp2p networking stack used in Ethereum's networking stack.","s":"@libp2p/js-libp2p","u":"/lodestar/contribution/depgraph","h":"#libp2pjs-libp2p","p":68},{"i":124,"t":"Quickly bootstrap a beacon node and multiple validators. Use for development and testing","s":"dev CLI Command","u":"/lodestar/contribution/dev-cli","h":"","p":123},{"i":126,"t":"Start a single beacon node with 8 interop validators ./lodestar dev --genesisValidators 8 --reset","s":"Examples","u":"/lodestar/contribution/dev-cli","h":"#examples","p":123},{"i":128,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --checkpointSyncUrl​ Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint type: string --checkpointState​ Set a checkpoint state to start syncing from type: string --wssCheckpoint​ Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234. type: string --forceCheckpointSync​ Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while. type: boolean --private​ Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests type: boolean --validatorMonitorLogs​ Log validator monitor events as info. This requires metrics to be enabled. type: boolean --disableLightClientServer​ Disable light client server. type: boolean --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --rest​ Enable/disable HTTP API type: boolean default: true --rest.namespace​ Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces type: string[] choices: \"beacon\", \"config\", \"debug\", \"events\", \"lightclient\", \"lodestar\", \"node\", \"proof\", \"validator\", \"*\" default: [\"beacon\",\"config\",\"debug\",\"events\",\"node\",\"validator\",\"lightclient\"] --rest.cors​ Configures the Access-Control-Allow-Origin CORS header for HTTP API type: string default: \"*\" --rest.address​ Set host for HTTP API type: string default: \"127.0.0.1\" --rest.port​ Set port for HTTP API type: number default: 9596 --rest.swaggerUI​ Enable Swagger UI for API exploration at http://{address}:{port}/documentation type: boolean default: true --suggestedFeeRecipient​ Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge. type: string default: \"0x0000000000000000000000000000000000000000\" --emitPayloadAttributes​ Flag to SSE emit execution payloadAttributes before every slot type: boolean default: false --chain.archiveBlobEpochs​ Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS) type: number --eth1​ Whether to follow the eth1 chain type: boolean --eth1.providerUrls​ Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s) type: string[] default: [ \"http://localhost:8545\" ] --execution.urls​ Urls to execution client engine API type: string[] default: [ \"http://localhost:8551\" ] --execution.timeout​ Timeout in milliseconds for execution engine API HTTP client type: number default: 12000 --execution.retries​ Number of retries when calling execution engine API type: number default: 2 --execution.retryDelay​ Delay time in milliseconds between retries when retrying calls to the execution engine API type: number default: 2000 --execution.engineMock​ Set the execution engine to mock mode (development only) type: boolean --jwtSecret​ File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client. type: string --jwtId​ An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis type: string --builder​ An alias for --builder.selection default for the builder flow, ignored if --builder.selection is explicitly provided type: boolean --builder.url​ Url hosting the builder API type: string default: \"http://localhost:8661\" --builder.timeout​ Timeout in milliseconds for builder API HTTP client type: number default: 12000 --builder.faultInspectionWindow​ Window to inspect missed slots for enabling/disabling builder circuit breaker type: number --builder.allowedFaults​ Number of missed slots allowed in the faultInspectionWindow for builder circuit type: number --metrics​ Enable the Prometheus metrics HTTP server type: boolean default: false --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 5064 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\" --monitoring.endpoint​ Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in) type: string --monitoring.interval​ Interval in milliseconds between sending client stats to the remote service type: number default: 60000 --discv5​ Enable discv5 type: boolean default: true --listenAddress​ The IPv4 address to listen for p2p UDP and TCP connections type: string default: \"0.0.0.0\" --port​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag. type: number default: 9000 --discoveryPort​ The UDP port that discovery will listen on. Defaults to port type: number default: port --listenAddress6​ The IPv6 address to listen for p2p UDP and TCP connections type: string --port6​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag. type: number default: 9090 --discoveryPort6​ The UDP port that discovery will listen on. Defaults to port6 type: number default: port6 --bootnodes​ Bootnodes for discv5 discovery type: string[] default: [ \"[]\" ] --targetPeers​ The target connected peers. Above this number peers will be disconnected type: number default: 100 --subscribeAllSubnets​ Subscribe to all subnets regardless of validator count type: boolean default: false --disablePeerScoring​ Disable peer scoring, used for testing on devnets type: boolean default: false --mdns​ Enable mdns local peer discovery type: boolean default: false --enr.ip​ Override ENR IP entry type: string --enr.tcp​ Override ENR TCP entry type: number --enr.udp​ Override ENR UDP entry type: number --enr.ip6​ Override ENR IPv6 entry type: string --enr.tcp6​ Override ENR (IPv6-specific) TCP entry type: number --enr.udp6​ Override ENR (IPv6-specific) UDP entry type: number --nat​ Allow configuration of non-local addresses type: boolean --keymanager​ Enable key manager API server type: boolean --keymanager.auth​ Enable token bearer authentication for key manager API server type: boolean default: true --keymanager.tokenFile​ Path to file containing bearer token used for key manager API authentication type: string --keymanager.port​ Set port for key manager API type: number default: 5062 --keymanager.address​ Set host for key manager API type: string default: \"127.0.0.1\" --keymanager.cors​ Configures the Access-Control-Allow-Origin CORS header for key manager API type: string default: \"*\" --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ Open validators even if there's a lockfile. Use with caution type: boolean --graffiti​ Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max) type: string --proposerSettingsFile​ A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change type: string --strictFeeRecipientCheck​ Enable strict checking of the validator's feeRecipient with the one returned by engine type: boolean --defaultGasLimit​ Suggested gas limit to the engine/builder for building execution payloads. Only used post merge. type: number default: 30000000 --builder.selection​ Builder block selection strategy default, maxprofit, builderalways, builderonly, executionalways, or executiononly type: string default: \"executiononly\" --builder.boostFactor​ Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit type: string default: \"100\" --useProduceBlockV3​ Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks type: boolean --broadcastValidation​ Validations to be run by beacon node for the signed block prior to publishing type: string default: \"gossip\" --blindedLocal​ Request fetching local block in blinded format for produceBlockV3 type: boolean default: false --importKeystores​ Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators type: string[] default: [ \"./keystores/*.json\" ] --importKeystoresPassword​ Path to a file with password to decrypt all keystores from importKeystores option type: string default: \"./password.txt\" --doppelgangerProtection​ Enables Doppelganger protection type: boolean --http.requestWireFormat​ Wire format to use in HTTP requests to beacon node. Can be one of json or ssz type: string default: \"json\" --http.responseWireFormat​ Preferred wire format for HTTP responses from beacon node. Can be one of json or ssz type: string default: \"ssz\" --externalSigner.url​ URL to connect to an external signing server type: string --externalSigner.pubkeys​ List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys type: string[] --externalSigner.fetch​ Fetch the list of public keys to validate from an external signer. Cannot be used in combination with --externalSigner.pubkeys type: boolean --externalSigner.fetchInterval​ Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default type: number --distributed​ Enables specific features required to run as part of a distributed validator cluster type: boolean --genesisEth1Hash​ If present it will create genesis with this eth1 hash. type: string --genesisValidators​ If present it will create genesis with interop validators and start chain. type: number default: 8 --startValidators​ Start interop validators in inclusive range with notation '0..7' type: string --genesisTime​ genesis_time to initialize interop genesis state type: number default: now --reset​ To delete chain and validator directories type: boolean --dumpTestnetFiles​ Dump testnet files and exit type: string","s":"dev Options","u":"/lodestar/contribution/dev-cli","h":"#dev-options","p":123},{"i":132,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"End-To-End Tests","u":"/lodestar/contribution/testing/end-to-end-tests","h":"","p":131},{"i":134,"t":"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo. There are few flags you can set through env variables to override behavior of testing and it's output. ENV variable Effect Impact TEST_COMPACT_DIFF All Will strip down the object difference rendered during test failures. Very useful for large object matching. TEST_QUIET_CONSOLE All Will strip down console output. Reduce console flickering. TEST_COMPACT_OUTPUT All Display a condensed summary of tests run. Use vitest basic reporter.","s":"Testing","u":"/lodestar/contribution/testing/","h":"","p":133},{"i":136,"t":"This is the most fundamental type of test in most code bases. In all instances mocks, stubs and other forms of isolation are used to test code on a functional, unit level. See the Unit Tests page for more information.","s":"Unit Tests","u":"/lodestar/contribution/testing/","h":"#unit-tests","p":133},{"i":138,"t":"The Ethereum Consensus Specifications are what ensure that the various consensus clients do not diverge on critical computations and will work harmoniously on the network. See the Spec Tests page for more information.","s":"Spec Tests","u":"/lodestar/contribution/testing/","h":"#spec-tests","p":133},{"i":140,"t":"Node.js is an unforgiving virtual machine when it comes to high performance, multi-threaded applications. In order to ensure that Lodestar can not only keep up with the chain, but to push the boundary of what is possible, there are lots of performance tests that benchmark programming paradigms and prevent regression. See the Performance Testing page for more information.","s":"Performance Tests","u":"/lodestar/contribution/testing/","h":"#performance-tests","p":133},{"i":142,"t":"E2E test are where Lodestar is run in its full form, often from the CLI as a user would to check that the system as a whole works as expected. These tests are meant to exercise the entire system in isolation and there is no network interaction, nor interaction with any other code outside of Lodestar. See the End-To-End Testing page for more information.","s":"End-To-End Tests","u":"/lodestar/contribution/testing/","h":"#end-to-end-tests","p":133},{"i":144,"t":"Integration tests are meant to test how Lodestar interacts with other clients, but are not considered full simulations. This is where Lodestar may make API calls or otherwise work across the process boundary, but there is required mocking, stubbing, or class isolation. An example of this is using the ExecutionEngine class to make API calls to a Geth instance to check that the http requests are properly formatted.","s":"Integration Tests","u":"/lodestar/contribution/testing/","h":"#integration-tests","p":133},{"i":146,"t":"These are the most comprehensive types of tests. They aim to test Lodestar in a fully functioning ephemeral devnet environment. See the Simulation Testing page for more information.","s":"Simulation Tests","u":"/lodestar/contribution/testing/","h":"#simulation-tests","p":133},{"i":148,"t":"The following tests are found in packages/beacon-node test:sim:mergemock​ yarn test:sim:blobs​","s":"Integration Tests","u":"/lodestar/contribution/testing/integration-tests","h":"","p":147},{"i":150,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"Performance Tests","u":"/lodestar/contribution/testing/performance-tests","h":"","p":149},{"i":152,"t":"\"Sim\" testing for Lodestar is the most comprehensive, and complex, testing that is run. The goal is to fully simulate a testnet and to actuate the code in a way that closely mimics what will happen when turning on Lodestar in the wild. This is a very complex task and requires a lot of moving parts to work together. The following sections will describe the various components and how they work together. At a very high level, simulation testing will setup a testnet from genesis and let proceed through \"normal\" execution exactly as the nodes would under production circumstances. To get feedback there are regular checks along the way to asses how the testnet nodes are working. These \"assertions\" can be added and removed at will to allow developers to check for specific conditions in a tightly controlled, reproducible, environment to get high quality and actionable feedback on how Lodestar performs. The end goal of these tests is to to run a full Lodestar client in an environment that is as close to what an end user would experience. These tests usually setup full testnets with multiple consensus clients and their paired execution node. In many instance we are looking to just exercise the Lodestar code but there are some places where there is also testing to see how Lodestar works in relation to the other consensus clients, like Lighthouse. As you can imagine, there is quite a bit of machinery that is responsible for setting up and managing the simulations and assertions. This section will help to go over those bits and pieces. Many, but not all, of these classes can be found in packages/cli/test/utils/simulation.","s":"Simulation Tests","u":"/lodestar/contribution/testing/simulation-tests","h":"","p":151},{"i":154,"t":"There are a number of sim tests that are available and each has a slightly different purpose. All are run by CI and must pass for a PR to be valid for merging. Most tests require a couple of environment variables to be set.","s":"Running Sim Tests","u":"/lodestar/contribution/testing/simulation-tests","h":"#running-sim-tests","p":151},{"i":156,"t":"To see what typical values for these are check out the .env.test file in the root directory. GETH_DOCKER_IMAGE: The geth docker image that will be used NETHERMIND_IMAGE: The nethermind docker image that will be used LIGHTHOUSE_IMAGE: The lighthouse docker image that will be used","s":"Environment Variables","u":"/lodestar/contribution/testing/simulation-tests","h":"#environment-variables","p":151},{"i":158,"t":"The multi-fork sim test checks most of the functionality Lodestar provides. Is verifies that Lodestar is capable of peering, moving through all of the forks and using various sync methods in a testnet environment. Lodestar is tested with both Geth and Nethermind as the execution client. It also checks a Lighthouse/Geth node for cross client compatibility. yarn workspace @chainsafe/lodestar test:sim:multifork","s":"test:sim:multifork","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmultifork","p":151},{"i":160,"t":"This tests that various endpoints of the beacon node and validator client are working as expected. yarn workspace @chainsafe/lodestar test:sim:endpoints","s":"test:sim:endpoints","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimendpoints","p":151},{"i":162,"t":"This test is still included in our CI but is no longer as important as it once was. Lodestar is often the first client to implement new features and this test was created before geth was upgraded with the features required to support the Deneb fork. To test that Lodestar was ready this test uses mocked geth instances. It is left as a placeholder for when the next fork comes along that requires a similar approach.","s":"test:sim:deneb","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimdeneb","p":151},{"i":164,"t":"Checks that Lodestar is compatible with other consensus validators and vice-versa. All tests use Geth as the EL. yarn workspace @chainsafe/lodestar test:sim:mixedclient","s":"test:sim:mixedcleint","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmixedcleint","p":151},{"i":166,"t":"When setting up and running the simulations, interactions with the nodes is through the published node API's. All functionality is actuated via http request and by \"plugging in\" this way it is possible to run the nodes in a stand-alone fashion, as they would be run in production, but to still achieve a tightly monitored and controlled environment. If code needs to be executed on a \"class by class\" basis or with mocking involved then the test is not a simulation test and would fall into one of the other testing categories. See the Testing Overview page for more information on the other types of tests available for Lodestar.","s":"Sim Test Infrastructure","u":"/lodestar/contribution/testing/simulation-tests","h":"#sim-test-infrastructure","p":151},{"i":168,"t":"The simulation environment has many pieces and those are orchestrated by the SimulationEnvironment class. The testnet nodes will be run as a mixture of Docker containers and bare metal code execution via Node.js. In order to monitor the various clients there is a SimulationTracker that's primary function is to register assertions that will track and gauge how the nodes are doing during the simulation. See the section on Simulation Assertions below for more information on them. There is an EpochClock that has helper functions related to timing of slots and epochs and there is also a Runner that will help to start/stop the various Docker container and spawn the Node.js child processes as necessary. The SimulationEnvironment is the orchestrator for all the various functions to great the test net and start it from genesis. It is also how the various forks are configured to exercise code through various fork transitions.","s":"Simulation Environment","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-environment","p":151},{"i":170,"t":"These are the secret sauce for making the simulation tests meaningful. There are several predefined assertions that can be added to a simulation tracker and one can also create custom assertions and add them to the environment. Assertions can be added per slot, per epoch, per fork or per node. They can even be added to check conditions across nodes. Assertions are added to the SimulationTracker with the register method and the tracker follows the environment to make sure that assertions are run at the appropriate times, and on the correct targets. Assertions are implemented via API calls to the various targets and meta from the API calls is stored and used to assert that the desired conditions were met. Any information that can be retrieved via API call can be added to the assertion stores for validation, and validations can be asserted at a specific time or on an interval. There are a number of assertions that are added to simulations by default. They are: inclusionDelayAssertion attestationsCountAssertion attestationParticipationAssertion connectedPeerCountAssertion finalizedAssertion headAssertion missedBlocksAssertion syncCommitteeParticipationAssertion Because of the flexibility, and complexity, there is a section specifically for how to create custom assertions below. See custom assertions for more info.","s":"Simulation Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-assertions","p":151},{"i":172,"t":"Check back soon for more information on how to create custom assertions.","s":"Custom Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#custom-assertions","p":151},{"i":174,"t":"Sim tests that are run using the simulation framework output a table of information to the console. The table summarizes the state of all of the nodes and the network at each slot. Here is an example of the table and how to interpret it: ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ │ fork │ eph │ slot │ head │ finzed │ peers │ attCount │ incDelay │ errors │ ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ │ capella │ 9/0 │ 72 │ 0x95c4.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/1 │ 73 │ 0x9dfc.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/2 │ 74 │ 0xdf3f.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/3 │ 75 │ 0xbeae.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/4 │ 76 │ 0x15fa.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/5 │ 77 │ 0xf8ff.. │ 56 │ 2,3,3,2 │ 16 │ 1.00 │ 0 │ │ capella │ 9/6 │ 78 │ 0x8199.. │ 56 │ 2,3,3,2 │ 16 │ 1.20 │ 0 │ │ capella │ 9/7 │ 79 │ different │ 56 │ 2,3,3,2 │ 16 │ 1.50 │ 2 │ ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ │ Att Participation: H: 0.75, S: 1.00, T: 0.75 - SC Participation: 1.00 │ ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ Slot Information​ fork: shows what fork is currently being tested eph: During simulation tests the Lodestar repo is setup to use 8 slot per epoch so what is shown is the epoch number and the slot number within that epoch as epoch/slot slot: The slot number that is currently being processed head: If all clients have the same head the first couple of bytes of the hash are shown. If all clients do not have the same head different is reported. finzed: Shows the number of the last finalized slot peers: The number of peers that each node is connected to. If all have the same number then only a single value is shown. If they do not have the same number of peers count for each node is reported in a comma-separated list attCount: The number of attestations that the node has seen. incDelay: The average number of slots inclusion delay was experienced for the attestations. Often attestations for the current head arrive more than one slot behind and this value tracks that errors: The number of errors that were encountered during the slot Epoch Information​ H: The percentage of nodes, at epoch transition, that voted for the head block S: The percentage of nodes, at epoch transition, that voted for the source block T: The percentage of nodes, at epoch transition, that voted for the target block SC Participation: The sync committee participation rate","s":"Simulation Reports","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-reports","p":151},{"i":176,"t":"The simulation environment will capture all of the logs from all nodes that are running. The logs can be found in the packages/cli/test-logs directory. The logs are named with the following convention: -_.log Some examples are: node-1-beacon_lodestar.log: The is the first node in the simulation. It is the consensus layer. It is running the lodestar validator client. range-sync-execution_geth.log: This is the node that was added to test pulling history in range sync mode. It was the execution layer and was running the geth execution client.","s":"Simulation Logging","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-logging","p":151},{"i":178,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"Unit Tests","u":"/lodestar/contribution/testing/unit-tests","h":"","p":177},{"i":180,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"Specification Tests","u":"/lodestar/contribution/testing/spec-tests","h":"","p":179},{"i":182,"t":"This page describes different approaches for debugging Lodestar.","s":"Debugging","u":"/lodestar/contribution/tools/debugging","h":"","p":181},{"i":184,"t":"The simplest way to debug is to use the provided launch.template.json configurations. Copy them as .vscode/launch.json and they will be made available in the Run and Debug section in VS Code. Adapt as needed, e.g. by adding additional arguments to the beacon configuration to match your needs. VS Code supports debugging Workers out of the box when using those configurations.","s":"VS Code launch config","u":"/lodestar/contribution/tools/debugging","h":"#vs-code-launch-config","p":181},{"i":186,"t":"Remote lodestar processes can also be debugged by leveraging node:inspector. Adding --inspect to the node CLI (e.g. NODE_OPTIONS=--inspect ./lodestar beacon) allows to debug the main thread. To debug a specific Worker, follow those steps: remove --inspect from node CLI add following code to the worker import inspector from \"node:inspector\"; inspector.open(); inspector.waitForDebugger(); Use VS Code or Chrome devtools to debug those processes.","s":"Attach to running process","u":"/lodestar/contribution/tools/debugging","h":"#attach-to-running-process","p":181},{"i":188,"t":"Core dump analysis is some ninja level stuff. Once you get the hang of it you will feel like you have super powers. It will up your game to a whole new level because you will be able to debug issues that seemed impossible before. Post-crash analysis is a very powerful tool to have in your tool belt. A core dump has all of the objects in memory as well as all of the stack frame information at the exact moment the dump was taken, usually when a hard crash occurs. It is important to note that debug symbols will greatly aid you in your debugging for issues related to native code like C/C++. When compiled languages are optimized the compiler will often strip out identifiers and all that will be remaining are mangled symbols and addresses. Compiling with debug symbols will leave all of the identifiers, file names and line numbers in-tact. While it is not always practical to be running code in a Debug version of node, if you run across a persistent issue it will be helpful to recreate it on a debug build and to use that for analysis. It is important to note that the EXACT binary that was running when the dump was created MUST be loaded when doing analysis. There is a lot of information in the dump that is specific to the binary that was running (like function offsets, etc). If you load a different binary you will get a lot of errors and the analysis will not be useful (if it loads at all). It is also a nice-to-know that you can create the dump on linux, using a linux compiled version of node, and then read it on a mac. All that is needed is to download the node binary and dump file to the mac. It is possible to load them into a mac compiled version of llnode and all will work as expected. Its just the meta in the linux binary that is needed for analysis, it doesn't actually run the code.","s":"Core Dump Analysis","u":"/lodestar/contribution/tools/core-dumps","h":"","p":187},{"i":190,"t":"llnode is a Node.js plugin for the LLDB debugger. It is the officially sanctioned tool from Node and powerful way to do postmortem analysis of Node.js processes. The process for install is pretty straight-forward unless you have an M1 mac. XCode ships with an instance of lldb and installing llnode is as simple as running npm install -g llnode. On an M1 mac the install will work fine but the plugin will crash at load time. See this issue for updates. The workaround is to install lldb via homebrew. # should only be necessary on M1 macs at time of writing $ brew install llvm $ echo 'export PATH=\"/opt/homebrew/opt/llvm/bin:$PATH\"' >> ~/.zshrc $ # note that its before recopying PATH to make sure it resolves $ zsh ~/.zshrc $ which llvm-config /opt/homebrew/opt/llvm/bin/llvm-config # if this is not what comes up restart the shell $ npm install -g llnode $ llnode (lldb) plugin load '/Users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib' (lldb) settings set prompt '(llnode) ' (llnode)","s":"Installing llnode","u":"/lodestar/contribution/tools/core-dumps","h":"#installing-llnode","p":187},{"i":192,"t":"Before a core dump can be created the system must be enabled. ulimit -c unlimited This is a critical step. If that command is not run the core will not be dumped to disk. Core dumps are normally created by the kernel when certain process signals are encountered. SIGSEGV is the most common signal that will cause a dump and its sent by the kernel to the process when a segfault occurs. SIGSEGV is not the only signal that works and you can see the full list here under the \"Standard Signals\" section (all the ones that say \"Core\" in the \"Action\" column). If you want to create a dump on demand you can use the gcore command on linux. This will create a dump of the process without killing it. If you don't mind termination you can also use kill -SIGSEGV to send the a dump signal to the process.","s":"Collecting a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#collecting-a-core-dump","p":187},{"i":194,"t":"Once you collect the core dump you can load it into llnode for debugging. # remember that the node binary must be the exact same one that was running when the core was created $ llnode -f /path/to/node_debug -c /Users/ninja_user/coredumps/node.coredump (lldb) target create \"node_debug\" --core \"node.coredump\" Core file '/Users/ninja_user/coredumps/node.coredump' (x86_64) was loaded. (lldb) plugin load '/Users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib' (lldb) settings set prompt '(llnode) ' (llnode) Once the dump is loaded the first few steps will be to figure out what types of objects were in memory and what was the processor working on when the crash occurred. Lets start with the stack trace. There are two distinct commands for pulling the stack because node is both a native runtime and a virtual machine. The bt, back trace, command will pull the native stack frames and the v8 bt command will use the llnode plugin to pull the JavaScript stack frames. Newer versions of llnode will automatically pull the JavaScript stack frames when the bt command is run but it is still good to know the difference. It is also possible to add the all verb to the bt command and it will pull the back trace for all threads. To start looking through memory there are two commands that are helpful. The v8 findjsobjects command will list all of the JavaScript objects in memory. The v8 findjsinstances command will list all of the instances of a particular JavaScript object.","s":"Analyzing a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#analyzing-a-core-dump","p":187},{"i":196,"t":"This guide assumes a running instance of Lodestar and will walk through how to generate a flamegraph for the process while running on Linux. While it is possible to run Lodestar in a number of ways, for performance profiling it is recommended to not use Dockerized implementations. It is best to run Lodestar as a service on a Linux machine. Follow the Lodestar docs to get the service installed and running. Then come back here when you are ready to generate the flamegraph.","s":"Generating Flamegraphs for a Running Node Service on Linux","u":"/lodestar/contribution/tools/flamegraphs","h":"","p":195},{"i":198,"t":"Use the following two commands to install perf for generating the stack traces. You may get a warning about needing to restart the VM due to kernel updates. This is nothing to be concerned with and if so, cancel out of the restart dialog. sudo apt-get install linux-tools-common linux-tools-generic sudo apt-get install linux-tools-`uname -r` # empirically this throws if run on the same line above Next we need to update the Lodestar service by modifying the start script. We need to add a necessary flag --perf-basic-prof to allow the stack traces to be useful. Node is a virtual machine and perf is designed to capture host stack traces. In order to allow the JavaScript functions to be captured meaningfully, v8 can provide some help. Generally Lodestar is started with a script like the following:","s":"Modifying Linux and Lodestar","u":"/lodestar/contribution/tools/flamegraphs","h":"#modifying-linux-and-lodestar","p":195},{"i":200,"t":"node \\ --perf-basic-prof \\ --max-old-space-size=8192 \\ /usr/src/lodestar/packages/cli/bin/lodestar \\ beacon \\ --rcConfig /home/devops/beacon/rcconfig.yml After updating the start script, restart the node process running the beacon service. Note in the command below, that the beacon service may have a different name or restart command, depending on your setup. admin@12.34.56.78: sudo systemctl restart beacon The flag that was added notifies V8 to output a map of functions and their addresses. This is necessary for perf to generate the stack traces for the virtual machine in addition to the traditional host stack traces. There is a very small, performance overhead to output the maps. After a short while, once the process runs for a bit the functions will no longer be moving in memory and the overhead will be significantly reduced. The VM will still be moving objects around but this flag is generally safe to run in production. After a few minutes of running, listing the directory with the start script (process.cwd()) will look similar: -rw-r--r-- 1 admin admin 9701529 May 22 00:36 beacon-2023-05-22.log -rwxrwxr-x 1 admin root 421 May 22 00:31 beacon_run.sh drwxr-xr-x 2 admin admin 917504 May 22 00:35 chain-db -rw-r--r-- 1 admin admin 2861242 May 22 00:36 isolate-0x6761520-2085004-v8.log -rw-r--r-- 1 admin admin 203172 May 22 00:36 isolate-0x7fa2f0001060-2085004-v8.log -rw-r--r-- 1 admin admin 68044 May 22 00:36 isolate-0x7fcd80001060-2085004-v8.log -rw-r--r-- 1 admin admin 420809 May 22 00:36 isolate-0x7fcd84001060-2085004-v8.log -rw-r--r-- 1 admin admin 123919 May 22 00:36 isolate-0x7fcd88001060-2085004-v8.log -rw-r--r-- 1 admin admin 94391 May 22 00:35 isolate-0x7fcd8c001060-2085004-v8.log -rw-r--r-- 1 admin admin 183831 May 22 00:36 isolate-0x7fcd90000e60-2085004-v8.log -rw-r--r-- 1 admin admin 152786 May 22 00:36 isolate-0x7fcd94000e60-2085004-v8.log -rw-r--r-- 1 admin admin 262333 May 22 00:36 isolate-0x7fcd98000e60-2085004-v8.log -rw-r--r-- 1 admin admin 218473 May 22 00:36 isolate-0x7fcd9c000e60-2085004-v8.log -rw-r--r-- 1 admin admin 366788 May 22 00:36 isolate-0x7fcda0000e60-2085004-v8.log -rw-r--r-- 1 admin admin 304917 May 22 00:36 isolate-0x7fcda4000e60-2085004-v8.log -rw-r--r-- 1 admin admin 586238 May 22 00:36 isolate-0x7fcda8000e60-2085004-v8.log -rw-r--r-- 1 admin admin 450675 May 22 00:36 isolate-0x7fcdac000e60-2085004-v8.log -rw-r--r-- 1 admin admin 768470 May 22 00:36 isolate-0x7fcdb8000d60-2085004-v8.log -rw-r--r-- 1 admin root 559 May 21 14:17 rcconfig.yml The isolate-*-v8.log files are the maps that v8 outputs for the perf command to reference. You are now ready to collect the stack traces.","s":"Example start_lodestar.sh","u":"/lodestar/contribution/tools/flamegraphs","h":"#example-start_lodestarsh","p":195},{"i":202,"t":"The first command below will run perf for 60 seconds, and then save the output to a file named perf.out. The second one will merge the exported, unknown, tokens with the isolate maps and output full stack traces for the render. Running both perf commands in the folder with the isolate maps will allow the data to be seamlessly spliced. Once the output is saved, update the permissions so the file can be copied to your local machine via scp. You can modify the frequency of capture by changing -F 99 to a different number. Try to stay away from whole numbers as they are more likely to cause interference with periodically scheduled tasks. As an example use 99Hz or 997Hz instead of 100Hz or 1000Hz. In testing neither seemed to have an appreciable affect on CPU usage when run for a short period of time. To change the period of capture adjust the sleep duration (which is in seconds). The pgrep command is used to find the process id to capture against. Feel free to pass a number to the -p flag if you know the process id, or adjust the file path if the executable is in a different location. admin@12.34.56.78: sudo perf record -F 99 -p $(pgrep -f '/usr/src/lodestar/packages/cli/bin/lodestar beacon') -g -- sleep 60 admin@12.34.56.78: sudo perf script -f > perf.out admin@12.34.56.78: sudo chmod 777 ~/beacon/perf.out And then copy the perf.out file to your local machine to render the flamegraph. Running at 99Hz for 180 seconds results in a file size of about 3.5MB and 997Hz for 60 seconds is roughly 4.4MB. scp admin@12.34.56.78:/home/devops/beacon/out.perf /some_temp_dir/perf.out","s":"Capturing Stack Traces","u":"/lodestar/contribution/tools/flamegraphs","h":"#capturing-stack-traces","p":195},{"i":204,"t":"By far the best tool to render flamegraphs is flamescope from Netflix. It allows for easy analysis and zooming into specific time periods. It also give a holistic view of how the process is performing over time.","s":"Rendering a Flamegraph","u":"/lodestar/contribution/tools/flamegraphs","h":"#rendering-a-flamegraph","p":195},{"i":206,"t":"Python3 is required. Clone the repository and install the dependencies: The original is no longer maintained and had a configuration bug. This is a fork that fixes the issue. git clone https://github.com/matthewkeil/flamescope cd flamescope pip3 install -r requirements.txt yarn","s":"Installation","u":"/lodestar/contribution/tools/flamegraphs","h":"#installation","p":195},{"i":208,"t":"mv /some_temp_dir/perf.out /path/to/flamescope/examples yarn dev Then navigate in a browser to http://localhost:8080 and begin analyzing the data.","s":"Usage","u":"/lodestar/contribution/tools/flamegraphs","h":"#usage","p":195},{"i":210,"t":"There can be a lot of \"noise\" in the stack traces with libc, v8 and libuv calls. It is possible to filter the results to make it more useful, but note this will skew the results. Looking at the graph both filtered and unfiltered can be beneficial. The following sed command will remove the noise from the stack traces. sed -r -e \"/( __libc_start| uv_| LazyCompile | v8::internal::| node::| Builtins_| Builtin:| Stub:| LoadIC:| \\\\[unknown\\\\]| LoadPolymorphicIC:)/d\" -e 's/ LazyCompile:[*~]?/ /'","s":"Filtering Results","u":"/lodestar/contribution/tools/flamegraphs","h":"#filtering-results","p":195},{"i":215,"t":"https://www.brendangregg.com/flamegraphs.html https://nodejs.org/en/docs/guides/diagnostics-flamegraph https://netflixtechblog.com/netflix-flamescope-a57ca19d47bb https://jaanhio.me/blog/nodejs-flamegraph-analysis/ (this was a great one about filtering methodology) https://medium.com/voodoo-engineering/node-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2","s":"List of Web References","u":"/lodestar/contribution/tools/flamegraphs","h":"#list-of-web-references","p":195},{"i":217,"t":"flamescope","s":"Visualization Tools","u":"/lodestar/contribution/tools/flamegraphs","h":"#visualization-tools","p":195},{"i":219,"t":"https://www.brendangregg.com/perf.html https://www.brendangregg.com/linuxperf.html https://www.brendangregg.com/blog/2014-09-17/node-flame-graphs-on-linux.html https://perf.wiki.kernel.org/index.php/Main_Page","s":"Collecting on Linux","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-linux","p":195},{"i":221,"t":"https://gist.github.com/zeusdeux/aac6f8500917319213c5 https://gist.github.com/loderunner/36724cc9ee8db66db305 https://keith.github.io/xcode-man-pages/xctrace.1.html","s":"Collecting on MacOS","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-macos","p":195},{"i":224,"t":"There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.","s":"Heap Dump Analysis","u":"/lodestar/contribution/tools/heap-dumps","h":"","p":223},{"i":226,"t":"Node has built in V8 heap dump access and its a very powerful tool for analyzing memory usage. Understanding how the dump is created will both help to understand how it is displayed and how to use the analysis more effectively. The V8 heap dump is a stop the world process because walking the entire heap graph is necessary to create one. This is similar to a full, major garbage collection event. The VM starts at the heap entrance node and walks the entire graph and makes note of every edge that connects each node along the way. Nodes are JSObjects and edges are references between those objects. By time the whole heap is walked the full size and values of all nodes are known and all of the connections between those nodes is well understood. The object that is returned is a set of three arrays, the nodes, the edges and the string values that are encountered (because strings are themselves arrays of characters in C so they are treated a bit differently by V8).","s":"JavaScript Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#javascript-heap-dump","p":223},{"i":228,"t":"There are two functions for creating a heap dump but both call the same functionality under the hood. One streams the result, require(\"v8\").getHeapSnapshot([options]), and is primarily intended for use by the Chrome devtools button to \"take a snapshot\". The second writes the heap dump to a file, require(\"v8\").writeHeapSnapshot(filename[,options]). The optional options argument, in both cases, is the same and contains two props.exposeInternals and exposeNumericValues to enrich the dump. In many cases its the application layer that one wants to debug so exposeInternals is not usually necessary. In V8 numbers are stored as 32bit integers and the size of pointers is also 32bits. So as an optimization, the pointer to the numeric value can be eliminated and the value itself can be stored in the Address of the Value instead. exposeNumericValues transcribes those \"pointers\" to the actual numeric value and appends them to the dump. Because heap analysis happens frequently during Lodestar development there is a helper api endpoint to capture a heap dump. It is IMPORTANT that this endpoint is not public facing as it will open the threat of DDOS attack. The endpoint accepts a POST request and you may include an optional dirpath query parameter to specify the directory where the heap dump will be written. If the dirpath is not specified then the heap dump will be written to the current working directory. To create a Lodestar heap dump you can use the following command: curl -X POST http://localhost:9596/eth/v1/lodestar/write_heapdump?dirpath=/some/directory/path","s":"Creating a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#creating-a-v8-heap-dump","p":223},{"i":230,"t":"It is best to analyze on a local development machine so if Lodestar is running on a cloud instance download the dump to the local environment. Open Chrome, or any Chromium based browser (the example photos were taken using Brave). In the url bar type chrome:://inspect to bring up the DevTools menu (in brave the url will be rewritten to brave://inspect). Click on the Open dedicated DevTools for Node link to open the node specific window and click on the Memory tab as shown below. Load the profile by either right clicking on the left pane or by clicking the Load button at the bottom.","s":"Viewing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#viewing-a-v8-heap-dump","p":223},{"i":232,"t":"Analysis is as much an art as it is a science and the best way to learn is to do it a few times. Generally the goal is looking for memory leaks but reducing memory overhead is also something that happens. This guide will focus on leaks. With memory leaks one is looking for why objects have references that prevent them from being garbage collected. To spot sources of leaks, focus on objects that have large quantities or very large retained size. Retained size is the amount of memory that would be freed if the object was garbage collected. As an example if there is an object that has lots and lots of instances, like 100,000, and they are all pushed into an array then the array will have a very large retained size. This is because the array is holding references to all of the objects that it contains. If it is not immediately apparent what objects are being leaked then another tool in your arsenal will be to take a second snapshot and compare it to the first. This will show what objects have been created/changed since the first snapshot. If there is an object that has a large retained size but is roughly the same, but not exactly the same, changes are that is NOT the leak. Some objects can get quite large during runtime but if its roughly the same size over time, but not exactly the same, it means that the application is modifying the object (why its not exactly identical in size) but if it hasn't grown significantly over time it can be assumed it is probably the working size of the instances. Try to focus on objects that are growing in size or in number over time. Growing in size means the object is holding references to other objects and growing in number means a function closure somewhere is retaining the small instances. That is the science part, but these clues are just breadcrumbs to follow. In order to actually resolve the leak, one needs to go into the code to figure out where those objects are being created, or more often, why the references to them are being retained. This is where the art comes in. Having a good understanding of the codebase will help to narrow down where to look. It is also common that the leak is not coming directly from Lodestar code, but rather one of the dependencies so be careful not to rule those out.","s":"Analyzing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#analyzing-a-v8-heap-dump","p":223},{"i":234,"t":"note: collecting a native heap dump is only supported on linux, analysis can be done from linux or Mac There are several tools that can be used to do native heap dump analysis. The most common are massif from the Valgrind suite, google's gperftools and heaptrack from KDE. Of the three, heaptrack is the most user friendly tool, and it is specifically designed for the task. It is much faster than Valgrind, easier to integrate than gperftools and also includes a gui for result analysis. Often times there are also memory allocations that are not related to memory leaks, and tools like Valgrind and gperftools become less useful. This is why heaptrack is the recommended tool for heap dump analysis on Lodestar. There are a few things that will make the results with heaptrack far better. The most important is using debug builds of all libraries included in a binary, including the application itself. This will make the results usable. Not to say that they will be useless without debug symbols but it will be kinda tough to optimize functions without knowing the function names nor the file and line numbers. This is the heart of what heaptrack will do for us. It hooks into the memory allocation and adds in stack traces for each malloc call site. That way every time memory is reserved there is a way to track back where it happened in the code. heaptrack also hooks into the free function and checks that versus the allocations to check for memory leaks and for temporary variables that can be optimized. This also allows for optimization of how many of each object is created by identifying high frequency allocations. Generally the .heapdump file will be created on a cloud server and then copied to a local machine for analysis, mostly because the gui is not available through ssh. The gui is not required for analysis but it is much easier to use than the command line tools. The first step will be to install heaptrack on the target server and to capture a profile.","s":"Native Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#native-heap-dump","p":223},{"i":236,"t":"Assume the following directory structure: ├── beacon-node │ ├── db │ ├── logs │ ├── start-lodestar.sh │ └── rc-config.yml ├── lodestar └── node # step below will clone this repo We will start from the directory that contains lodestar and the beacon-node files. # Install heaptrack $ sudo apt-get update $ sudo apt-get -y install heaptrack # Using a debug build of node is recommended and it can be build # from source. Clone the node repo to get started. $ git clone https://github.com/nodejs/node.git $ cd node # Use whichever version of node you prefer $ git checkout v22.1.0 $ ./configure --debug # This command only builds the debug version of node and assumes # that a release version of node is already installed on the system $ make -C out BUILDTYPE=Debug -j$(nproc --all) # Move the debug version of node the same folder that the release # version is installed in and name it `node_debug`. This will put the # debug binary on the path and allow you to run it with the # `node_debug` command $ cp out/Debug/node \"$(which node)_debug\" $ which node_debug /your/home/directory/.nvm/versions/node/v20.10.0/bin/node_debug # Return to the lodestar repo $ cd ../lodestar # Clean the build artifacts and node_modules $ yarn clean && yarn clean:nm # Install the dependencies $ yarn install # Ensure that all native modules are rebuilt with debug symbols. Some # modules are prebuilt, like classic-level, and the debug symbols may # not be included. If the debugging exercise is focussed around # one of these dependencies, then you will need to manually clone those # repos and manually build them with debug symbols. $ npm rebuild --debug","s":"Build collection tools","u":"/lodestar/contribution/tools/heap-dumps","h":"#build-collection-tools","p":223},{"i":238,"t":"# Move to th `beacon-node` directory $ cd ../beacon-node # Start lodestar with profiling enabled $ heaptrack \\ $ --output ./lodestar.heapdump \\ $ node_debug \\ $ --max-old-space-size=8192 \\ $ ../lodestar/packages/cli/bin/lodestar.js \\ $ beacon \\ $ --rcConfig ./rc-config.yml \\ $ > /dev/null 2>&1 & # Wait some period of time for the heap dump data to be collected # The data will not be persisted until the process is stopped. You can gracefully # stop the process with the following command and if you want to hard kill it # add `-9` to the end of the `kill` command although that should not be necessary $ ps aux | grep lodestar | grep -v grep | awk '{print $2}' | head -n 1 | xargs kill","s":"Collect a heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#collect-a-heap-dump","p":223},{"i":240,"t":"Collecting a heap dump can also be done on a running process. There are both advantages and disadvantages to this approach. The main advantage is that you can collect a heap dump without having to restart. The down side is that the dump will only include allocations/de-allocations while the tracker is running. This means that all the non-paired calls to malloc/free will register as leaks. It will also not give a true representation of how the heap is being used. On the upside, however the dump will be much smaller in size. It is important to note a warning that is in the heaptrack source code: WARNING: Runtime-attaching heaptrack is UNSTABLE and can lead to CRASHES in your application, especially after you detach heaptrack again. You are hereby warned, use it at your own risk! # Move to th `beacon-node` directory $ cd ../beacon-node # Start lodestar $ node_debug \\ $ --max-old-space-size=8192 \\ $ ../lodestar/packages/cli/bin/lodestar.js \\ $ beacon \\ $ --rcConfig ./rc-config.yml \\ $ > /dev/null 2>&1 & # Wait some period of time to start collecting the dump # GDB is required to inject heaptrack into a running process # so you may need to install it $ sudo apt-get update $ sudo apt-get install -y gdb # Elevated `perf` permissions are also required depending on your # system configuration. Change until the next reboot $ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope # Get the pid of the lodestar process $ export LODESTAR_PID=$(ps aux | grep lodestar | grep -v grep | awk '{print $2}' | head -n 1) # Inject heaptrack into the running process $ heaptrack --pid $LODESTAR_PID heaptrack output will be written to \"/home/user/beacon-node/heaptrack.node_debug.111868.zst\" /usr/lib/heaptrack/libheaptrack_preload.so injecting heaptrack into application via GDB, this might take some time... injection finished # Wait some period of time to collect the heap dump. See below # for the termination command that can be run from a separate # terminal when ready to stop collecting data Terminated removing heaptrack injection via GDB, this might take some time... Heaptrack finished! Now run the following to investigate the data: heaptrack --analyze \"/home/user/beacon-node/heaptrack.node_debug.111868.zst\" There is a trap in heaptrack but the process uses a nested shell to do the actual injection so it is not possible to just Ctrl+C out of the injected process without corrupting the output file. To properly kill the collection one needs to target the nested shell pid. Here is a helper command to target that process: ps -ef | grep '[h]eaptrack --pid' | awk '$3 == '$(ps -ef | grep '[h]eaptrack --pid' | awk '$3 != 1 {print $2}' | head -n 1)' {print $2}' | xargs -r kill After working with the injected process for a while, I cannot honestly recommend it. It can work in a pinch, and is best suited for when the profiled process can be exited gracefully without repercussions (not on mainnet for instance). The benefit, though, is that the heapdump will be much smaller and targeted to runtime (will not have the transient, startup allocations) which can make it easier to see what is happening.","s":"Collecting a heap dump on a running process","u":"/lodestar/contribution/tools/heap-dumps","h":"#collecting-a-heap-dump-on-a-running-process","p":223},{"i":242,"t":"# You can you apt, apt-get or aptitude to install the gui $ sudo apt-get update $ sudo apt-get install -y heaptrack-gui","s":"Installing heaptrack-gui on Linux","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-linux","p":223},{"i":244,"t":"At the time of writing this there is no official pre-built binary for OSX. This was a bit of a challenge but it was WELL worth the effort as the tool works very well. There were a number of bugs along the way while \"using the docs\" so your mileage may vary, but this is what worked for me. Most of the dependencies can be installed via Homebrew and the tool itself needs to be built from source. There was one dependency that needed to be built from source. This process assumes a working folder that the repos can be cloned into. # Start in the root folder where the repos will be cloned $ brew install qt@5 # prepare tap of kde-mac/kde $ brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git $ \"$(brew --repo kde-mac/kde)/tools/do-caveats.sh\" # install the kde-mac and other required dependencies $ brew install kde-mac/kde/kf5-kcoreaddons \\ $ kde-mac/kde/kf5-kitemmodels \\ $ kde-mac/kde/kf5-kconfigwidgets \\ $ kde-mac/kde/kdiagram \\ $ extra-cmake-modules \\ $ ki18n \\ $ threadweaver \\ $ boost \\ $ zstd \\ $ gettext # There is a bug in the current version of kde-mac/kde and one dependency needs # to be built manually. This is the workaround to get it built. $ git clone https://invent.kde.org/frameworks/kio.git $ mkdir kio/build $ cd kio/build $ export CMAKE_PREFIX_PATH=$(brew --prefix qt@5) $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release .. $ ninja $ sudo ninja install $ cd ../.. # Now make sure that the dependencies are available to the system during runtime $ ln -sfv \"$(brew --prefix)/share/kf5\" \"$HOME/Library/Application Support\" $ ln -sfv \"$(brew --prefix)/share/knotifications5\" \"$HOME/Library/Application Support\" $ ln -sfv \"$(brew --prefix)/share/kservices5\" \"$HOME/Library/Application Support\" $ ln -sfv \"$(brew --prefix)/share/kservicetypes5\" \"$HOME/Library/Application Support\" # We are now ready to build the heaptrack_gui binaries for analysis on OSX $ git clone https://invent.kde.org/sdk/heaptrack.git $ cd heaptrack $ mkdir build $ cd build $ CMAKE_PREFIX_PATH=$(brew --prefix qt@5) PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake .. $ cmake -DCMAKE_BUILD_TYPE=Release .. $ make heaptrack_gui $ sudo make install # You can now find heaptrack_gui with your gui Applications. It is default # placed as /Applications/KDE/heaptrack_gui.app","s":"Installing heaptrack-gui on OSX","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-osx","p":223},{"i":246,"t":"This section of the documentation will cover common questions and encounters often asked by users and developers.","s":"Frequently Asked Questions","u":"/lodestar/faqs","h":"","p":245},{"i":248,"t":"\"Package manager issues\" Lodestar relies on Corepack and associated packageManager value to manage its package manager version. Make sure corepack is correctly enabled if you encounter some package manager related issues: corepack enable","s":"Tooling","u":"/lodestar/faqs","h":"#tooling","p":245},{"i":251,"t":"\"Heap memory limit\" Lodestar beacon node requires at least 8GB of heap space. While the lodestar script and the official docker image correctly sets the appropriate value, it might be necessary to manually set it for some specific scenario. The simplest way to achieve this is via the NODE_OPTIONS environment variable or by passing --max-old-space-size directly to the node binary NODE_OPTIONS: --max-old-space-size=8192","s":"Running a beacon node","u":"/lodestar/faqs","h":"#running-a-beacon-node","p":245},{"i":253,"t":"\"Unknown arguments error\" Lodestar reads all environment variables prefixed with LODESTAR and will try to parse them similar to command line arguments, meaning any unknown argument will cause an error. ✖ Unknown arguments: servicePort, servicePortEthConsensusP2p, port9000Tcp, port9000TcpPort, port9000TcpProto, port9000TcpAddr, serviceHost The extra arguments are present because Kubernetes automatically adds environment variables to the Pod based on the name (metadata.name) defined in the associated Service. To resolve the issue, this name has to be changed to something that does not start with lodestar. Reference Issue: #6045","s":"Using Kubernetes","u":"/lodestar/faqs","h":"#using-kubernetes","p":245},{"i":256,"t":"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the most actively used blockchain. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards and has been actively working in the Ethereum space ever since. We are proud to develop Lodestar and to present this documentation as a resource for the Ethereum community.","s":"Introduction","u":"/lodestar/introduction","h":"","p":255},{"i":258,"t":"In Ethereum's Proof of Stake (PoS) model, validators replace miners from the Proof of Work (PoW) system. Validators are Ethereum stakeholders who lock up a portion of their Ether as a stake. The protocol randomly selects these validators to propose new blocks. The chance of being chosen is tied to the size of their stake: the more Ether staked, the higher the probability of being selected to propose the block. Proposers receive transaction fees and block rewards as incentives. Validators are also responsible for voting on the validity of blocks proposed by other validators. However, they face penalties, known as slashing, for actions like double-signing, votes on a block that is not in the majority or going offline, ensuring network integrity and reliability. The PoS mechanism significantly reduces energy consumption compared to PoW, because it does not require extensive computational power. Moreover, PoS tends to facilitate faster transaction validations and block creations, enhancing the overall performance and scalability of the network.","s":"Proof of Stake","u":"/lodestar/introduction","h":"#proof-of-stake","p":255},{"i":260,"t":"In an effort to promote client diversity there are several beacon-nodes being developed. Each is programmed in a different language and by a different team. The following is a list of the current beacon-node clients: Lodestar Prysm Lighthouse Teku Nimbus Grandine","s":"Consensus Clients","u":"/lodestar/introduction","h":"#consensus-clients","p":255},{"i":262,"t":"The Ethereum network's robustness is significantly enhanced by its client diversity, whereby multiple, independently-developed clients conforming to a common specification facilitate seamless interaction and function equivalently across nodes. This client variety not only fosters a rich ecosystem but also provides a buffer against network-wide issues stemming from bugs or malicious attacks targeted at particular clients. For instance, during the Shanghai denial-of-service attack in 2016, the diversified client structure enabled the network to withstand the assault, underscoring the resilience afforded by multiple client configurations. On the consensus layer, client distribution is crucial for maintaining network integrity and finality, ensuring transactions are irreversible once validated. A balanced spread of nodes across various clients helps mitigate risks associated with potential bugs or attacks that could, in extreme cases, derail the consensus process or lead to incorrect chain splits, thereby jeopardizing the network's stability and trust. While the data suggests a dominance of Prysm client on the consensus layer, efforts are ongoing to promote a more even distribution among others like Lighthouse, Teku, Nimbus and Grandine. Encouraging the adoption of minority clients, bolstering their documentation, and leveraging real-time client diversity dashboards are among the strategies being employed to enhance client diversity, which in turn fortifies the Ethereum consensus layer against adversities and fosters a healthier decentralized network ecosystem. The non-finality event in May 2023 on the Ethereum network posed a significant challenge. The issue arose from attestations for a fork, which necessitated state replays to validate the attestations, causing a notable strain on system resources. As a result, nodes fell out of sync, which deterred the accurate tracking of the actual head of the chain. This situation was exacerbated by a decline in attestations during specific epochs, further hampering the consensus mechanism. The Lodestar team noticed late attestations several weeks prior to the event and implemented a feature that attempted to address such challenges by not processing untimely attestations, and thus not requiring expensive state replays​. While it was done for slightly different reasons, the result was the same. Lodestar was able to follow the chain correctly and helped to stabilize the network. This example underscored the importance of client diversity and network resilience against potential forks and replay attacks. These are considered realistic threats, especially in the context of system complexity like in Ethereum's consensus mechanism.","s":"Why Client Diversity?","u":"/lodestar/introduction","h":"#why-client-diversity","p":255},{"i":264,"t":"Ethereum Docs Upgrading Ethereum by Ben Edgington Ethereum Book by Andreas M. Antonopoulos and Gavin Wood Ethereum Consensus Specification Casper the Friendly Finality Gadget by Vitalik Buterin and Virgil Griffith LMD Ghost by protolambda","s":"Ethereum Reading List","u":"/lodestar/introduction","h":"#ethereum-reading-list","p":255},{"i":266,"t":"Run lightclient","s":"lightclient CLI Command","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"","p":265},{"i":268,"t":"Run lightclient with holesky network ./lodestar lightclient --network holesky","s":"Examples","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#examples","p":265},{"i":270,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --beaconApiUrl​ Url to a beacon node that support lightclient API required: true type: string --checkpointRoot​ Checkpoint root hex string to sync the lightclient from, start with 0x required: true type: string","s":"lightclient Options","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#lightclient-options","p":265},{"i":272,"t":"Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state. Unlike full nodes, light clients do not download and store the entire blockchain. Instead, they download only the headers of each block and employ Merkle proofs to verify transactions. This enables a quick synchronization with the network and access the latest information without using significant system resources​. This streamlined approach to accessing Ethereum is crucial, especially in scenarios where full-scale network participation is infeasible or undesired. The evolution of light clients is emblematic of the broader trajectory of Ethereum towards becoming more accessible and resource-efficient, making blockchain technology more inclusive and adaptable to a wide array of use cases and environments. The Altair hard fork introduced sync committees to allow light-clients to synchronize to the network.","s":"Lodestar Light Client","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"","p":271},{"i":274,"t":"This package is part of ChainSafe's Lodestar project","s":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#prerequisites","p":271},{"i":276,"t":"Access to an beacon node that supports the light client specification is necessary. The client must support the following routes from the consensus API spec: GET /eth/v1/beacon/light_client/updates GET /eth/v1/beacon/light_client/optimistic_update GET /eth/v1/beacon/light_client/finality_update GET /eth/v1/beacon/light_client/bootstrap/{block_root} System requirements are quite low so its possible to run a light client in the browser as part of a website. There are a few examples of this on github that you can use as reference, our prover being one of them. You can find more information about the light-client protocol in the specification.","s":"Requirements for Running a Light-Client","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#requirements-for-running-a-light-client","p":271},{"i":278,"t":"Follow the installation guide or Docker install to install Lodestar. Quickly try out the whole stack by starting a local testnet.","s":"Getting started","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#getting-started","p":271},{"i":280,"t":"It is possible to start up the light-client as a standalone process. lodestar lightclient \\ --network sepolia \\ --beaconApiUrl https://lodestar-sepolia.chainsafe.io \\ --checkpointRoot \"0xccaff4b99986a7b05e06738f1828a32e40799b277fd9f9ff069be55341fe0229\"","s":"Light-Client CLI Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-cli-example","p":271},{"i":282,"t":"For this example we will assume there is a running beacon node at https://lodestar-sepolia.chainsafe.io import {Lightclient, LightclientEvent} from \"@lodestar/light-client\"; import {LightClientRestTransport} from \"@lodestar/light-client/transport\"; import { getFinalizedSyncCheckpoint, getGenesisData, getConsoleLogger, getApiFromUrl, getChainForkConfigFromNetwork, } from \"@lodestar/light-client/utils\"; const config = getChainForkConfigFromNetwork(\"sepolia\"); const logger = getConsoleLogger({logDebug: Boolean(process.env.DEBUG)}); const api = getApiFromUrl(\"https://lodestar-sepolia.chainsafe.io\", \"sepolia\"); const lightclient = await Lightclient.initializeFromCheckpointRoot({ config, logger, transport: new LightClientRestTransport(api), genesisData: await getGenesisData(api), checkpointRoot: await getFinalizedSyncCheckpoint(api), opts: { allowForcedUpdates: true, updateHeadersOnForcedUpdate: true, }, }); // Wait for the lightclient to start await lightclient.start(); logger.info(\"Lightclient synced\"); lightclient.emitter.on(LightclientEvent.lightClientFinalityHeader, async (finalityUpdate) => { logger.info(\"Received finality update\", {slot: finalityUpdate.beacon.slot}); }); lightclient.emitter.on(LightclientEvent.lightClientOptimisticHeader, async (optimisticUpdate) => { logger.info(\"Received optimistic update\", {slot: optimisticUpdate.beacon.slot}); });","s":"Light-Client Programmatic Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-programmatic-example","p":271},{"i":284,"t":"If you want to use Lightclient in browser and facing some issues in building it with bundlers like webpack, vite. We suggest to use our distribution build. The support for single distribution build is started from 1.20.0 version. Directly link the dist build with the **Typescript support** The web bundle comes with the types support. Unfortunately due to following [issue](https://github.com/microsoft/rushstack/issues/1128#issuecomment-2066257538) we can't bundle all types. A workaround would be to add `@chainsafe/as-sha256` as a devDependency to your project.","s":"Browser Integration","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#browser-integration","p":271},{"i":286,"t":"Read our contribution documentation, submit an issue or talk to us on our discord!","s":"Contributors","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#contributors","p":271},{"i":288,"t":"Apache-2.0 ChainSafe Systems","s":"License","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#license","p":271},{"i":290,"t":"This package is part of ChainSafe's Lodestar project A set of tools allowing to verify EL client JSON-RPC calls.","s":"Lodestar Prover","u":"/lodestar/libraries/lightclient-prover/prover","h":"","p":289},{"i":292,"t":"You can use the @lodestar/prover in two ways, as a Web3 Provider and as proxy. For prover use case see below example. import Web3 from \"web3\"; import {createVerifiedExecutionProvider, LCTransport} from \"@lodestar/prover\"; const httpProvider = new Web3.providers.HttpProvider(\"https://lodestar-sepoliarpc.chainsafe.io\"); const {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, { transport: LCTransport.Rest, urls: [\"https://lodestar-sepolia.chainsafe.io\"], network: \"sepolia\", wsCheckpoint: \"trusted-checkpoint\", }); const web3 = new Web3(provider); const address = \"0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134\"; const balance = await web3.eth.getBalance(address, \"latest\"); console.log({balance, address}); In this scenario the actual provider is mutated to handle the RPC requests and verify those. So here if you use provider or httpProvider both are the same objects. This behavior is useful when you already have an application and usage of any provider across the code space and don't want to change the code. So you mutate the provider during startup. For some scenarios when you don't want to mutate the provider you can pass an option mutateProvider as false. In this scenario the object httpProvider is not mutated and you get a new object provider. This is useful when your provider object does not allow mutation, e.g. Metamask provider accessible through window.ethereum. If not provided mutateProvider is considered as true by default. In coming releases we will switch its default behavior to false. import Web3 from \"web3\"; import {createVerifiedExecutionProvider, LCTransport} from \"@lodestar/prover\"; const httpProvider = new Web3.providers.HttpProvider(\"https://lodestar-sepoliarpc.chainsafe.io\"); const {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, { transport: LCTransport.Rest, urls: [\"https://lodestar-sepolia.chainsafe.io\"], network: \"sepolia\", wsCheckpoint: \"trusted-checkpoint\", mutateProvider: false, }); const web3 = new Web3(provider); const address = \"0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134\"; const balance = await web3.eth.getBalance(address, \"latest\"); console.log({balance, address}); You can also invoke the package as binary. npm i -g @lodestar/prover lodestar-prover proxy \\ --network sepolia \\ --executionRpcUrl https://lodestar-sepoliarpc.chainsafe.io \\ --beaconUrls https://lodestar-sepolia.chainsafe.io \\ --port 8080","s":"Usage","u":"/lodestar/libraries/lightclient-prover/prover","h":"#usage","p":289},{"i":294,"t":"There can be different implementations of the web3 providers and each can handle the RPC request differently. We call those different provider types. We had provided builtin support for common providers e.g. web3.js, ethers or any eip1193 compatible providers. We inspect given provider instance at runtime to detect the correct provider type. If your project is using some provider type which is not among above list, you have the option to register a custom provider type with the createVerifiedExecutionProvider with the option providerTypes which will be an array of your supported provider types. Your custom provider types will have higher priority than default provider types. Please see existing provide types implementations to know how to implement your own if needed.","s":"How to detect a web3 provider","u":"/lodestar/libraries/lightclient-prover/prover","h":"#how-to-detect-a-web3-provider","p":289},{"i":296,"t":"✅ - Completed ⌛ - Todo ➡️ - Request will be forward to EL without any intermediary manipulations. You can limit these by providing unverifiedWhitelist option for provider or --unverifiedWhitelist from the cli. If not set then all methods will be forwarded. ❇️ - Always forwarded to EL. Group Method Status Version Block eth_getBlockByHash ✅ v0 eth_getBlockByNumber ✅ v0 eth_getBlockTransactionCountByHash ⌛ v2 eth_getBlockTransactionCountByNumber ⌛ v2 eth_getUncleCountByBlockHash ⌛ v2 eth_getUncleCountByBlockNumber ⌛ v2 Chain/Network eth_chainId ➡️ eth_syncing ⌛ v1 eth_coinbase ⌛ v2 eth_accounts ➡️ eth_blockNumber ➡️ Call and Estimate eth_call ✅ v0 eth_estimateGas ✅ v0 eth_createAccessList ⌛ v2 eth_gasPrice ⌛ v1 eth_maxPriorityFeePerGas ⌛ v1 eth_feeHistory ⌛ v2 Filters eth_newFilter ⌛ v2 eth_newBlockFilter ⌛ v2 eth_newPendingTransactionFilter ⌛ v2 eth_uninstallFilter ⌛ v2 eth_getFilterChanges ⌛ v2 eth_getFilterLogs ⌛ v2 eth_getLogs ⌛ v1 Mining eth_mining ➡️ eth_hashrate ➡️ eth_getWork ➡️ eth_submitWork ➡️ eth_submitHashrate ➡️ Signing eth_sign ➡️ eth_signTransaction ➡️ State eth_getBalance ✅ v0 eth_getStorageAt ⌛ v1 eth_getTransactionCount ⌛ v2 eth_getCode ✅ v0 eth_getProof ❇️ v0 Transactions eth_sendTransaction ➡️ eth_sendRawTransaction ➡️ eth_getTransactionByHash ⌛ v2 eth_getTransactionByBlockHashAndIndex ⌛ v2 eth_getTransactionByBlockNumberAndIndex ⌛ v2 eth_getTransactionReceipt ⌛ v2 Events eth_subscribe ❇️ v0 eth_unsubscribe ❇️ v0","s":"Supported Web3 Methods","u":"/lodestar/libraries/lightclient-prover/prover","h":"#supported-web3-methods","p":289},{"i":298,"t":"Currently does not support batch requests.","s":"Non-supported features","u":"/lodestar/libraries/lightclient-prover/prover","h":"#non-supported-features","p":289},{"i":300,"t":"To use this prover the ethereum provider must support the eth_getProof method. Unfortunately, Infura does not currently support this endpoint. As an alternative, we suggest using Alchemy.","s":"Warnings","u":"/lodestar/libraries/lightclient-prover/prover","h":"#warnings","p":289},{"i":302,"t":"NodeJS (LTS) Yarn","s":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/prover","h":"#prerequisites","p":289},{"i":304,"t":"You will need to go over the specification. You will also need to have a basic understanding of lightclient.","s":"What you need","u":"/lodestar/libraries/lightclient-prover/prover","h":"#what-you-need","p":289},{"i":306,"t":"Follow the installation guide to install Lodestar. Quickly try out the whole stack by starting a local testnet.","s":"Getting started","u":"/lodestar/libraries/lightclient-prover/prover","h":"#getting-started","p":289},{"i":308,"t":"Read our contributors document, submit an issue or talk to us on our discord!","s":"Contributors","u":"/lodestar/libraries/lightclient-prover/prover","h":"#contributors","p":289},{"i":310,"t":"Apache-2.0 ChainSafe Systems","s":"License","u":"/lodestar/libraries/lightclient-prover/prover","h":"#license","p":289},{"i":312,"t":"Welcome! This page has been moved. Please checkout our new docs layout from the Table of Contents! Below are some helpful links to the CLI pages that were split out from this original document Beacon Node CLI Validator CLI Bootnode CLI Light Client CLI Dev CLI","s":"Page relocated","u":"/lodestar/reference/cli","h":"","p":311},{"i":314,"t":"Run a beacon chain node","s":"beacon CLI Command","u":"/lodestar/run/beacon-management/beacon-cli","h":"","p":313},{"i":316,"t":"Run a beacon chain node and connect to the holesky testnet ./lodestar beacon --network holesky","s":"Examples","u":"/lodestar/run/beacon-management/beacon-cli","h":"#examples","p":313},{"i":318,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --checkpointSyncUrl​ Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint type: string --checkpointState​ Set a checkpoint state to start syncing from type: string --wssCheckpoint​ Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234. type: string --forceCheckpointSync​ Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while. type: boolean --private​ Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests type: boolean --validatorMonitorLogs​ Log validator monitor events as info. This requires metrics to be enabled. type: boolean --disableLightClientServer​ Disable light client server. type: boolean --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --rest​ Enable/disable HTTP API type: boolean default: true --rest.namespace​ Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces type: string[] choices: \"beacon\", \"config\", \"debug\", \"events\", \"lightclient\", \"lodestar\", \"node\", \"proof\", \"validator\", \"*\" default: [\"beacon\",\"config\",\"debug\",\"events\",\"node\",\"validator\",\"lightclient\"] --rest.cors​ Configures the Access-Control-Allow-Origin CORS header for HTTP API type: string default: \"*\" --rest.address​ Set host for HTTP API type: string default: \"127.0.0.1\" --rest.port​ Set port for HTTP API type: number default: 9596 --rest.swaggerUI​ Enable Swagger UI for API exploration at http://{address}:{port}/documentation type: boolean --suggestedFeeRecipient​ Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$) in case validator fails to update for a validator index before calling produceBlock. type: string default: \"0x0000000000000000000000000000000000000000\" --emitPayloadAttributes​ Flag to SSE emit execution payloadAttributes before every slot type: boolean default: false --chain.archiveBlobEpochs​ Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS) type: number --eth1​ Whether to follow the eth1 chain type: boolean default: true --eth1.providerUrls​ Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s) type: string[] default: [ \"http://localhost:8545\" ] --execution.urls​ Urls to execution client engine API type: string[] default: [ \"http://localhost:8551\" ] --execution.timeout​ Timeout in milliseconds for execution engine API HTTP client type: number default: 12000 --execution.retries​ Number of retries when calling execution engine API type: number default: 2 --execution.retryDelay​ Delay time in milliseconds between retries when retrying calls to the execution engine API type: number default: 2000 --execution.engineMock​ Set the execution engine to mock mode (development only) type: boolean --jwtSecret​ File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client. type: string --jwtId​ An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis type: string --builder​ Enable builder interface type: boolean --builder.url​ Url hosting the builder API type: string default: \"http://localhost:8661\" --builder.timeout​ Timeout in milliseconds for builder API HTTP client type: number default: 12000 --builder.faultInspectionWindow​ Window to inspect missed slots for enabling/disabling builder circuit breaker type: number --builder.allowedFaults​ Number of missed slots allowed in the faultInspectionWindow for builder circuit type: number --metrics​ Enable the Prometheus metrics HTTP server type: boolean --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 8008 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\" --monitoring.endpoint​ Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in) type: string --monitoring.interval​ Interval in milliseconds between sending client stats to the remote service type: number default: 60000 --discv5​ Enable discv5 type: boolean default: true --listenAddress​ The IPv4 address to listen for p2p UDP and TCP connections type: string default: \"0.0.0.0\" --port​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag. type: number default: 9000 --discoveryPort​ The UDP port that discovery will listen on. Defaults to port type: number default: port --listenAddress6​ The IPv6 address to listen for p2p UDP and TCP connections type: string --port6​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag. type: number default: 9090 --discoveryPort6​ The UDP port that discovery will listen on. Defaults to port6 type: number default: port6 --bootnodes​ Bootnodes for discv5 discovery type: string[] default: [ \"[]\" ] --targetPeers​ The target connected peers. Above this number peers will be disconnected type: number default: 100 --subscribeAllSubnets​ Subscribe to all subnets regardless of validator count type: boolean default: false --disablePeerScoring​ Disable peer scoring, used for testing on devnets type: boolean default: false --mdns​ Enable mdns local peer discovery type: boolean default: false --enr.ip​ Override ENR IP entry type: string --enr.tcp​ Override ENR TCP entry type: number --enr.udp​ Override ENR UDP entry type: number --enr.ip6​ Override ENR IPv6 entry type: string --enr.tcp6​ Override ENR (IPv6-specific) TCP entry type: number --enr.udp6​ Override ENR (IPv6-specific) UDP entry type: number --nat​ Allow configuration of non-local addresses type: boolean","s":"beacon Options","u":"/lodestar/run/beacon-management/beacon-cli","h":"#beacon-options","p":313},{"i":320,"t":"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information. There are several processes that need to store data for Lodestar. These data sets can grow quite large over time so it is important to understand how to manage them so the host machine can support operations effectively. $executionDir # this changes depending on the execution client └── execution-db $dataDir # specified by --dataDir on the beacon command ├── .log_rotate_audit.json ├── beacon.log # there can be many of these ├── enr ├── peer-id.json ├── chain-db # default if --dbDir not specified │ └── (db files) └── peerstore # default if --peerStoreDir not specified └── (peerstore files) $dataDir # specified by --dataDir on the validator command ├── .log_rotate_audit.json ├── validator.log # there can be many of these ├── validator-db # default if --validatorsDbDir not specified │ └── (db files) ├── proposerConfigs # default if --proposerDir not specified │ └── (config files) ├── cache # default if --cacheDir not specified │ └── (cache files) ├── secrets # default if --secretsDir not specified │ ├── 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037... │ └── 0xa329f988c16993768299643d918a2694892c012765d896a16f... ├── keystores # default if --keystoresDir not specified │ ├── 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037... │ │ └── voting-keystore.json │ └── 0xa329f988c16993768299643d918a2694892c012765d896a16f... │ └── voting-keystore.json └── remoteKeys # default if --remoteKeysDir not specified └── 0xa329f988c16993768299643d918a2694892c012765d896a16f.json","s":"Data Retention","u":"/lodestar/run/beacon-management/data-retention","h":"","p":319},{"i":322,"t":"Configuring your node to store and prune data is key to success. On average you can expect for the database to grow by the follow amounts: execution-db grows at 2-30GB per week chain-db grows at 1GB per month validator-db grows at less than 2MB per year, per key (2000 keys = 4GB per year) keystores, keystore-cache and peerstore are not usually very large and are not expected to grow much during normal operation. Logs can also become quite large so please check out the section on log management for more information. There is really only one flag that is needed to manage the data for Lodestar, --dataDir. Other than that handling log management is really the heart of the data management story. Beacon node data is what it is. Depending on the execution client that is chosen, there may be flags to help with data storage growth but that is outside the scope of this document.","s":"Data Management","u":"/lodestar/run/beacon-management/data-retention","h":"#data-management","p":319},{"i":324,"t":"MEV is a term that refers to the bundling of transactions in one particular order to extract (mostly) arbitrage opportunities on the dApps and decentralized exchanges. And the ones who gets to include these execution payloads (miners before the merge, validators after the merge) in the canonical chain get paid a per-block reward which essentially should be higher than the normal payload inclusion reward (including transactions tips). Currently these happen with miners running forked versions of their favorite execution client, integrating with these \"builders\" but in the post-merge world they get a more native and standard integration with the CL. This is what we in CL land refer to as Builder Api.","s":"MEV & Merge","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"","p":323},{"i":326,"t":"Lodestar offers builder integration through the spec-ed builder API. This sits in parallel with the execution engine so when enabled, lodestar validator run both flows in parallel when its time to propose for a validator key and currently (naively) picks the builder block in preference to execution if a builder block is fetched (else just proceeds with the execution block).","s":"Lodestar and Builder API","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#lodestar-and-builder-api","p":323},{"i":328,"t":"All you have to do is: Provide lodestar beacon node with a Builder endpoint (which corresponds to the network you are running) via these additional flags: --builder --builder.url Run lodestar validator client with these additional flags --builder --suggestedFeeRecipient There are some more builder flags available in lodestar cli (for both beacon and validator) which you may inspect and use. Even though its possible to directly hook lodestar with an external Builder/Relay, its recommended to interface it with the MEV world via local MEV-BOOST multiplexer which can integrate multiple builder/relays for you and provide some payload verification on top, as currently Lodestar assumes this to be a trusted endpoint.","s":"Configure Lodestar setup for MEV","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#configure-lodestar-setup-for-mev","p":323},{"i":330,"t":"Lodestar will automatically connect to peers on the network. Peers are found through the discv5 protocol and once peers are established communications happen via gossipsub over libp2p. While not necessary, having a basic understanding of how the various protocols and transports work will help with debugging and troubleshooting as some of the more common challenges come up with firewalls and NAT traversal.","s":"Networking","u":"/lodestar/run/beacon-management/networking","h":"","p":329},{"i":332,"t":"Some of the important Lodestar flags related to networking are: --discv5 --listenAddress --port --discoveryPort --listenAddress6 --port6 --discoveryPort6 --bootnodes --subscribeAllSubnets --disablePeerScoring --enr.ip --enr.tcp --enr.udp --enr.ip6 --enr.tcp6 --enr.udp6 --nat --private","s":"Networking Flags","u":"/lodestar/run/beacon-management/networking","h":"#networking-flags","p":329},{"i":334,"t":"In Ethereum, discv5 plays a pivotal role in the peer discovery process, facilitating nodes to find and locate each other in order to form the peer-to-peer network​. The process begins with an interaction between new nodes and bootnodes at start-up. Bootnodes are nodes with hard-coded addresses, or can be overridden via the cli flag --bootnodes, to bootstrap the discovery process​. Through a method called FINDNODE-NODES, a new node establishes a bond with each bootnode, and it returns a list of peers for the new node to connect to. Following this trail, the new node engages through FINDNODE-NODES with the provided peers to further establish a web of connections​. Discv5 operates as a peer advertisement medium in this network, where nodes can act as both providers and consumers of data. Every participating node in the Discv5 protocol discovers peer data from other nodes and later relays it, making the discovery process dynamic and efficient​. Discv5 is designed to be a standalone protocol running via UDP on a dedicated port solely for peer discovery. Peer data is exchanged via self-certified, flexible peer records (ENRs). These key features cater to the Ethereum network​ and being a good peer often means running a discv5 worker​. Lodestar offers simple configuration to setup and run a bootnode independently of a beacon node. See the bootnode cli page for more information and configuration options.","s":"Peer Discovery (Discv5)","u":"/lodestar/run/beacon-management/networking","h":"#peer-discovery-discv5","p":329},{"i":336,"t":"Ethereum Node Records (ENRs) are a standardized format utilized for peer discovery - see EIP-778 for the specification. An ENR consists of a set of key-value pairs. These pairs include crucial information such as the node's ID, IP address, the port on which it's listening, and the protocols it supports. This information helps other nodes in the network locate and connect to the node. The primary purpose of ENRs is to facilitate node discovery and connectivity in the Ethereum network. Nodes use ENRs to announce their presence and capabilities to other nodes, making it easier to establish and maintain a robust, interconnected network. Note that bootnodes are announced via ENR. Lodestar prints out its own ENR on startup, the logs will show something similar to the following info: discv5 worker started peerId=16Uiu...t9LQ3, initialENR=enr:-Iu4QGE...WRwgiMo, bindAddr4=/ip4/0.0.0.0/udp/9000 Alternatively, the ENR can also be retrieved from the beacon node API by querying the getNetworkIdentity endpoint. ENR Viewer provides a simple and convenient option to decode and inspect ENRs.","s":"ENR","u":"/lodestar/run/beacon-management/networking","h":"#enr","p":329},{"i":338,"t":"Gossipsub and Req/Resp are the two mechanisms that beacon nodes use to exchange chain data. Gossipsub is used disseminate the most recent relevant data proactively throughout the network. Req/Resp is used to directly ask specific peers for specific information (eg: during syncing).","s":"Peer Communication (gossipsub and Req/Resp)","u":"/lodestar/run/beacon-management/networking","h":"#peer-communication-gossipsub-and-reqresp","p":329},{"i":340,"t":"GossipSub is a foundational protocol in peer-to-peer (P2P) communication, particularly decentralized networks like Ethereum and IPFS. At its core, GossipSub efficiently propagates data, filtered by topic, through a P2P network. It organizes peers into a collection of overlay networks, each associated with a distinct topic. By routing data through relevant overlay networks based on topics of interest, large amounts of data can be efficiently disseminated without excessive bandwidth, latency, etc. In GossipSub, nodes can subscribe to topics, effectively joining the corresponding overlay to receive messages published to a specific topic. This topic-based structure enables nodes to congregate around shared interests, ensuring that relevant messages are delivered to all interested parties. Each message published to a topic gets disseminated and relayed to all subscribed peers, similar to a chat room. Messages are propagated through a blend of eager-push and lazy-pull models. Specifically, the protocol employs \"mesh links\" to carry full messages actively and \"gossip links\" to carry only message identifiers (lazy-pull propagation model). This hybrid approach allows for both active message propagation and reactive message retrieval​ which is an extension of the traditional hub-and-spoke pub/sub model.","s":"Gossipsub","u":"/lodestar/run/beacon-management/networking","h":"#gossipsub","p":329},{"i":342,"t":"Req/Resp is the domain of protocols that establish a flexible, on-demand mechanism to retrieve historical data and data missed by gossip. This family of methods, implemented as separate libp2p protocols, operate between a single requester and responder. A method is initiated via a libp2p protocol ID, with the initiator sending a request message and the responder sending a response message. Every method defines a specific request and response message type, and a specific protocol ID. This framework also facilitates streaming responses and robust error handling.","s":"Req/Resp","u":"/lodestar/run/beacon-management/networking","h":"#reqresp","p":329},{"i":344,"t":"Libp2p is a modular and extensible network stack that serves as the data transport layer below both gossipsub and Req/Resp and facilitates the lower-level peer-to-peer communications. It provides a suite of protocols for various networking functionalities including network transports, connection encryption and protocol multiplexing. Its modular design allows for the easy addition, replacement, or upgrading of protocols, ensuring an adaptable and evolving networking stack. Libp2p operates at the lower levels of the OSI model, particularly at the Transport and Network layers. Libp2p supports both TCP and UDP protocols for establishing connections and data transmission. Combined with libp2p's modular design it can integrate with various networking technologies to facilitating both routing and addressing.","s":"Data Transport (libp2p)","u":"/lodestar/run/beacon-management/networking","h":"#data-transport-libp2p","p":329},{"i":346,"t":"If your setup is behind a firewall there are a few ports that will need to be opened to allow for P2P discovery and communication. There are also some ports that need to be protected to prevent unwanted access or DDOS attacks on your node. Ports that must be opened: 30303/TCP+UDP - Execution layer P2P communication port 9000/TCP+UDP - Beacon node IPv4 P2P communication port 9090/TCP+UDP - Beacon node IPv6 P2P communication port Ports that must be protected: 9596/TCP - Beacon node REST API port 5062/TCP - Validator key manager API port 18550/TCP - MEV-Boost/Builder port 8008/TCP - Beacon node metrics port 5064/TCP - Validator metrics port 8545/TCP - Execution client JSON RPC port 8551/TCP - Execution engine port for Lodestar to communicate with the execution client","s":"Firewall Management","u":"/lodestar/run/beacon-management/networking","h":"#firewall-management","p":329},{"i":348,"t":"Lodestar does not support UPnP. If you are behind a NAT you will need to manually forward the ports listed above.","s":"NAT Traversal","u":"/lodestar/run/beacon-management/networking","h":"#nat-traversal","p":329},{"i":350,"t":"The following instructions are required to setup and run a Lodestar beacon node.","s":"Beacon management","u":"/lodestar/run/beacon-management/starting-a-node","h":"","p":349},{"i":352,"t":"Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal. Make sure Lodestar is installed in your local environment, following the chosen install method. The following command should return a non error message. ./lodestar --help For a complete list of beacon node CLI commands and options, see the beacon CLI Command section. To select a known testnet or mainnet, use the --network flag. mainnet is selected by default, and a list of available networks is listed with the --help flag. Setting the --network flag will conveniently configure the beacon node or validator client for the selected network. For power users, any configuration option should be able to be overridden.","s":"Connect to mainnet or a public testnet","u":"/lodestar/run/beacon-management/starting-a-node","h":"#connect-to-mainnet-or-a-public-testnet","p":349},{"i":354,"t":"Post-Merge Ethereum will require secure authentication with the Engine API connection on your chosen Execution node. info Post-Merge Ethereum requires a secure, authenticated connection to the Execution client on port 8551. We recommend setting this up now to ensure a proper configuration before the Merge.","s":"Configure the Lodestar JWT authentication token","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-the-lodestar-jwt-authentication-token","p":349},{"i":356,"t":"You must generate a secret 32-byte (64 characters) hexadecimal string that will be used to authenticate with an execution node. You can use the following command in most terminals to generate a random secret: openssl rand -hex 32. Or you can use an online generator. Save this secret key into a text file and note where you store this file.","s":"Generate a secret key","u":"/lodestar/run/beacon-management/starting-a-node","h":"#generate-a-secret-key","p":349},{"i":358,"t":"When starting up a Lodestar beacon node in any configuration, ensure you add the --jwtSecret $JWT_SECRET_PATH flag to point to the saved secret key file.","s":"Configure Lodestar to locate the JWT secret","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-lodestar-to-locate-the-jwt-secret","p":349},{"i":360,"t":"For Go Ethereum: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Nethermind: Use the --JsonRpc.JwtSecretFile /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Besu: Use the --engine-jwt-secret=/path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Erigon: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Reth: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here.","s":"Ensure JWT is configured with your execution node","u":"/lodestar/run/beacon-management/starting-a-node","h":"#ensure-jwt-is-configured-with-your-execution-node","p":349},{"i":362,"t":"To start a Lodestar beacon run the command: ./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH This will assume an execution-layer client is available at the default location of https://localhost:8545. In case execution-layer clients are available at different locations, use --execution.urls to specify these locations in the command: ./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH --execution.urls $EL_URL1 $EL_URL2 Immediately you should see confirmation that the node has started Apr-20 15:12:45.274[] info: Lodestar network=mainnet, version=v1.7.2, commit= Apr-20 15:12:45.327[] info: Connected to LevelDB database path=/data/mt1/chain-db Apr-20 15:12:57.747[] info: Initializing beacon from a valid db state slot=6264480, epoch=195765, stateRoot=0x8133cd4d0be59c3e94405f902fe0ad68ffaa5013b525dddb6285b91ad79716f6, isWithinWeakSubjectivityPeriod=true Apr-20 15:13:18.077[network] info: PeerId 16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ, Multiaddrs /ip4/127.0.0.1/tcp/9000/p2p/16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ,/ip4/10.244.0.199/tcp/9000/p2p/16Uiu2HAmDsGet67va6VCnaW2Tu1Ae2yujiDMnmURMMWNvssER7ZQ Apr-20 15:13:18.270[rest] info: Started REST API server address=http://127.0.0.1:9596 Apr-20 15:13:18.271[] warn: Low peer count peers=0 Apr-20 15:13:18.280[] info: Searching peers - peers: 0 - slot: 6264964 - head: (slot - 484) 0x7ee6…2a15 - exec-block: syncing(17088043 0x9442…) - finalized: 0xe359…4d7e:195763 Apr-20 15:13:23.009[chain] info: Validated transition configuration with execution client terminalTotalDifficulty=0xc70d808a128d7380000, terminalBlockHash=0x0000000000000000000000000000000000000000000000000000000000000000, terminalBlockNumber=0x0 Apr-20 15:13:29.287[] info: Syncing - ? left - 0.00 slots/s - slot: 6264965 - head: (slot - 485) 0x7ee6…2a15 - exec-block: syncing(17088043 0x9442…) - finalized: 0xe359…4d7e:195763 - peers: 1 Apr-20 15:14:41.003[] info: Syncing - 22 seconds left - 4.92 slots/s - slot: 6264971 - head: (slot - 108) 0xd15f…b605 - exec-block: valid(17088414 0x3dba…) - finalized: 0x70fd…5157:195775 - peers: 4 Apr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot - 45) 0x44e4…20a4 - exec-block: valid(17088475 0xca61…) - finalized: 0x9cbd…ba83:195776 - peers: 8 Apr-20 15:15:01.443[network] info: Subscribed gossip core topics Apr-20 15:15:01.446[sync] info: Subscribed gossip core topics Apr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea…c655 - exec-block: valid(17088521 0xca9b…) - finalized: 0x6981…682f:195778 - peers: 6 info If your node is stuck with Searching for peers review your network configuration to make sure your ports are open. By default, Lodestar stores all configuration and chain data at the path $XDG_DATA_HOME/lodestar/$NETWORK_NAME. A young testnet should take a few hours to sync. If you see multiple or consistent errors in the logs, please open a Github issue or reach out to us in Discord. Just by reporting anomalies you are helping accelerate the progress of Ethereum Consensus, thanks for contributing! warning It is dangerous to expose your Beacon APIs publicly as there is no default authentication mechanism provided. Ensure your beacon node host is not exposing ports 8545 or 9596 outside of your internal network.","s":"Run a beacon node","u":"/lodestar/run/beacon-management/starting-a-node","h":"#run-a-beacon-node","p":349},{"i":364,"t":"If you are starting your node from a blank db, like starting from genesis, or from the last saved state in db and the network is now far ahead, your node will be susceptible to \"long range attacks.\" Ethereum's solution to this is via something called weak subjectivity. Read Vitalik's illuminating post explaining weak subjectivity.. If you have a synced beacon node available (e.g., your friend's node or an infrastructure provider) and a trusted checkpoint you can rely on, you can start off your beacon node in under a minute! And at the same time kicking the \"long range attack\" in its butt! Just supply these extra arguments to your beacon node command: --checkpointSyncUrl [--wssCheckpoint ] In case you really trust checkpointSyncUrl then you may skip providing wssCheckpoint, which will then result into your beacon node syncing and starting off the recently finalized state from the trusted URL. warning Please use this option very carefully (and at your own risk), a malicious server URL can put you on the wrong chain with a danger of you losing your funds by social engineering. If possible, validate your wssCheckpoint from multiple places (e.g. different client distributions) or from other trusted sources. This will highly reduce the risk of starting off on a malicious chain. This list of public endpoints maintained by the Ethereum community may be used for reference. Taking too long to sync? After your node has been offline for a while, it might be the case that it takes a long time to sync even though a checkpointSyncUrl is specified. This is due to the fact that the last db state is still within the weak subjectivity period (~15 days on mainnet) which causes the node to sync from the db state instead of the checkpoint state. It is possible to force syncing from checkpoint state by supplying the --forceCheckpointSync flag. This option is only recommended if it is absolutely necessary for the node to be synced right away to fulfill its duties as there is an inherent risk each time the state is obtained from an external source.","s":"Checkpoint Sync","u":"/lodestar/run/beacon-management/starting-a-node","h":"#checkpoint-sync","p":349},{"i":366,"t":"Lodestar beacon sync log aims to provide information of utmost importance about your node and yet be succinct at the same time. You may see the sync logs in the following format: [Sync status] - [ Slot info ] - [Head info] - [Exec block info] - [Finalized info] - [Peers info] See the following example of different kinds of sync log: Apr-20 15:24:08.034[] info: Searching peers - peers: 0 - slot: 6265018 - head: 6264018 0xed93…7b0a - exec-block: syncing(17088476 0x9649…) - finalized: 0xbf30…7e7c:195777 Apr-20 15:24:17.000[] info: Searching peers - peers: 0 - slot: 6265019 - head: 6264018 0xed93…7b0a - exec-block: syncing(17088476 0x9649…) - finalized: 0xbf30…7e7c:195777 Apr-20 15:13:41.298[] info: Syncing - 2.5 minutes left - 2.78 slots/s - slot: 6264966 - head: 6262966 0x5cec…f5b8 - exec-block: valid(17088105 0x6f74…) - finalized: 0x5cc0…3874:195764 - peers: 1 Apr-20 15:13:41.298[] info: Syncing - 2 minutes left - 2.78 slots/s - slot: 6264967 - head: 6263965 0x5cec…f5b8 - exec-block: valid(17088105 0x6f74…) - finalized: 0x5cc0…3874:195764 - peers: 1 Apr-20 15:13:53.151[] info: Syncing - 1.6 minutes left - 3.82 slots/s - slot: 6264967 - head: (slot -360) 0xe0cf…9f3c - exec-block: valid(17088167 0x2d6a…) - finalized: 0x8f3f…2f81:195766 - peers: 5 Apr-20 15:14:05.425[] info: Syncing - 1.1 minutes left - 4.33 slots/s - slot: 6264968 - head: (slot -297) 0x3655…1658 - exec-block: valid(17088231 0xdafd…) - finalized: 0x9475…425a:195769 - peers: 2 Apr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot -45) 0x44e4…20a4 - exec-block: valid(17088475 0xca61…) - finalized: 0x9cbd…ba83:195776 - peers: 8 Apr-20 15:15:01.443[network] info: Subscribed gossip core topics Apr-20 15:15:01.446[sync] info: Subscribed gossip core topics Apr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea…c655 - exec-block: valid(17088521 0xca9b…) - finalized: 0x6981…682f:195778 - peers: 6 Apr-20 15:15:17.003[] info: Synced - slot: 6264974 - head: 0x4f7e…0e3a - exec-block: valid(17088522 0x08b1…) - finalized: 0x6981…682f:195778 - peers: 6 Apr-20 15:15:41.001[] info: Synced - slot: 6264976 - head: (slot -1) 0x17c6…71a7 - exec-block: valid(17088524 0x5bc1…) - finalized: 0x6981…682f:195778 - peers: 8 Apr-20 15:15:53.001[] info: Synced - slot: 6264977 - head: (slot -2) 0x17c6…71a7 - exec-block: valid(17088524 0x5bc1…) - finalized: 0x6981…682f:195778 - peers: 8 Apr-20 15:16:05.000[] info: Synced - slot: 6264978 - head: 0xc9fd…28c5 - exec-block: valid(17088526 0xb5bf…) - finalized: 0x6981…682f:195778 - peers: 8 Apr-20 15:16:17.017[] info: Synced - slot: 6264979 - head: 0xde91…d4cb - exec-block: valid(17088527 0xa488…) - finalized: 0x6981…682f:195778 - peers: 7 Sync status: Takes three values : Synced or Syncing (along with sync speed info) or Searching if node is is still looking for viable peers from where it can download blocks. Slot (clock) info: What is the current ongoing slot as per the chain genesis Head info: It specifies where the local chain head hash is. In case its far behind the Slot (clock) then it independently shows the head slot else it show how far behind from the Slot it is if difference < 1000. Execution block info: It provides the execution information about the head whether its confirmed valid or execution layer is still syncing to it, as well as its number and a short hash to easy identification. Finalized info: What is the current local finalized checkpoint in the format of [checkpoint root]:[checkpoint epoch], for e.g.: 0xd7ba…8386:189636 Peer info: Current total number of outbound or inbound peers, for e.g.: peers: 27 For more insight into how a Lodestar beacon node is functioning, you may setup lodestar metrics and use the prepared Grafana dashboards that are found in the repository. Check out our section on Prometheus and Grafana for more details.","s":"Guide to the sync logs","u":"/lodestar/run/beacon-management/starting-a-node","h":"#guide-to-the-sync-logs","p":349},{"i":368,"t":"Run a discv5 bootnode. This will NOT perform any beacon node functions, rather, it will run a discv5 service that allows nodes on the network to discover one another.","s":"bootnode CLI Command","u":"/lodestar/run/bootnode/bootnode-cli","h":"","p":367},{"i":370,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --listenAddress​ The IPv4 address to listen for discv5 connections type: string default: \"0.0.0.0\" --port​ The UDP port to listen on type: number default: 9000 --listenAddress6​ The IPv6 address to listen for discv5 connections type: string --port6​ The UDP port to listen on type: number default: 9090 --bootnodes​ Additional bootnodes for discv5 discovery type: string[] default: [ \"[]\" ] --bootnodesFile​ Additional bootnodes for discv5 discovery file path type: string --persistNetworkIdentity​ Whether to reuse the same peer-id across restarts type: boolean default: true --enr.ip​ Override ENR IP entry type: string --enr.udp​ Override ENR UDP entry type: number --enr.ip6​ Override ENR IPv6 entry type: string --enr.udp6​ Override ENR (IPv6-specific) UDP entry type: number --nat​ Allow ENR configuration of non-local addresses type: boolean --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --metrics​ Enable the Prometheus metrics HTTP server type: boolean --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 8008 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\"","s":"bootnode Options","u":"/lodestar/run/bootnode/bootnode-cli","h":"#bootnode-options","p":367},{"i":372,"t":"Syncing an Ethereum node involves obtaining a copy of the blockchain data from other peers in the network to reach a consistent state. This process is crucial for new nodes or nodes that have been offline and need to catch up with the network's current state. Syncing can be performed for both the execution layer and the beacon chain, although the focus here will be primarily on the beacon chain. Lodestar allows for several methods of syncing however the recommended method is checkpoint sync as it is the fastest and least resource intensive. It is generally a good idea to sync via a --checkpointSyncUrl. If starting at a specific point is necessary specify the --checkpointState that should be where the sync begins.","s":"Syncing","u":"/lodestar/run/beacon-management/syncing","h":"","p":371},{"i":374,"t":"Weak subjectivity is a concept specific to Proof of Stake (PoS) systems, addressing how new nodes can safely join the network and synchronize with the correct blockchain history. Unlike in Proof of Work (PoW) systems, where a node can trust the longest chain due to the significant computational effort required to forge it, PoS systems present different challenges. In PoS, the cost of creating or altering blockchain history is lower, as it is not based on computational work but on the stake held by validators. This difference raises the possibility that an attacker, if possessing sufficient stake, could feasibly create a misleading version of the blockchain history. The concept of weak subjectivity becomes particularly crucial in two scenarios: when new nodes join the network and when existing nodes reconnect after a significant period of being offline. During these times, the 'weak subjectivity period' defines a time frame within which a client, upon rejoining, can reliably process blocks to reach the consensus chain head. This approach is essential for mitigating the risks associated with long-range attacks, which could occur if nodes relied solely on the longest chain principle without any initial trust in a specific network state. To counter these risks, weak subjectivity requires new nodes to obtain a recent, trusted state of the blockchain from a reliable source upon joining the network. This state includes vital information about the current set of validators and their stakes. Starting from this trusted state helps new nodes avoid being misled by false histories, as any attempt to rewrite history beyond this point would require an unrealistically large portion of the total stake.","s":"Weak Subjectivity","u":"/lodestar/run/beacon-management/syncing","h":"#weak-subjectivity","p":371},{"i":377,"t":"Checkpoint sync, also known as state sync, allows a node to sync to a specific state checkpoint without having to process all historical data leading up to that point. In the context of a beacon node, this involves syncing to a recent finalized checkpoint, allowing the node to quickly join the network and participate in consensus activities. This is especially beneficial for new nodes or nodes that have been offline for a considerable duration.","s":"Checkpoint Sync","u":"/lodestar/run/beacon-management/syncing","h":"#checkpoint-sync","p":371},{"i":379,"t":"Historical sync involves processing all blocks from the genesis block or from a specified starting point to the current block. This is the most comprehensive sync method but also the most resource and time-intensive. For beacon nodes, historical sync is crucial for nodes that aim to maintain a complete history of the beacon chain, facilitating a deeper understanding and analysis of the network's history. In the execution layer, it ensures a complete historical record of the execution layer data.","s":"Historical Sync","u":"/lodestar/run/beacon-management/syncing","h":"#historical-sync","p":371},{"i":381,"t":"Range sync involves syncing blocks within a specified range, beneficial when a node is only temporarily offline and needs to catch up over a short range. In the beacon node context, this entails requesting and processing blocks within a defined range, ensuring the node quickly gets updated to the current network state.","s":"Range Sync","u":"/lodestar/run/beacon-management/syncing","h":"#range-sync","p":371},{"i":383,"t":"This is another version of checkpoint sync that allows a node that has not been historically synchronized to verify data prior to the checkpoint. It is done via downloading a checkpoint and then fetch blocks backwards from that point until the desired data can be verified. It is a relatively inexpensive sync from a cpu perspective because it only checks the block hashes and verifies the proposer signatures along the way.","s":"Backfill Sync","u":"/lodestar/run/beacon-management/syncing","h":"#backfill-sync","p":371},{"i":385,"t":"The implementation of the different syncing styles in Lodestar are actually one of two types under the hood, range sync and unknown-parent sync. Range sync is used when the start point of syncing is known. In the case of historical and checkpoint sync the starting points are well defined, genesis and the last finalized epoch boundary. Snapshot sync is not supported by Lodestar. If the starting point for sync is not known Lodestar must first determine where the starting point is. While the discussion about how that happens is out of scope for this document, the gist is that the beacon node will listen to gossipsub for blocks being broadcast on the network. It will also request MetaData from its peers and use that to start requesting the correct blocks from the network. There are several flags that can be used to configure the sync process. --checkpointSyncUrl --checkpointState --wssCheckpoint --forceCheckpointSync","s":"Syncing Lodestar","u":"/lodestar/run/beacon-management/syncing","h":"#syncing-lodestar","p":371},{"i":388,"t":"In order to make things easy for users to onboard and try the Ethereum Proof of Stake we have come up with Lodestar quick start scripts! ✅ Zero Configuration ✅ All testnets supported along with mainnet ✅ All mainstream Execution Clients integrated With just single command you can run lodestar with various execution engines, switch them up to see the Optimistic sync work its magic and eventually brings lodestar and the execution engine in sync","s":"Lodestar Quickstart","u":"/lodestar/run/getting-started/quick-start","h":"#lodestar-quickstart","p":386},{"i":390,"t":"You can adapt them to your production setups with ease! Here is a simple guide for you to follow along: 👉 Lodestar Quick Setup Guide","s":"Customizations","u":"/lodestar/run/getting-started/quick-start","h":"#customizations","p":386},{"i":392,"t":"We actively maintain and update the configurations of running lodestar with the top of the line execution engines for various PoS networks so you have the minimum possible figuring out to do. In case you are facing any issues with the quick start guide, do reach us out on lodestar discord! Happy to help! 🙏🙏🙏","s":"Support","u":"/lodestar/run/getting-started/quick-start","h":"#support","p":386},{"i":395,"t":"Binaries can be downloaded from the release page under the Assets section.","s":"Binaries","u":"/lodestar/run/getting-started/installation","h":"#binaries","p":393},{"i":397,"t":"The chainsafe/lodestar Docker Hub repository is maintained actively. It contains the lodestar CLI preinstalled. info The Docker Hub image tagged as chainsafe/lodestar:next is run on CI every commit on our unstable branch. For stable releases, the image is tagged as chainsafe/lodestar:latest. Ensure you have Docker installed by issuing the command: docker -v It should return a non error message such as Docker version xxxx, build xxxx. Pull, run the image and Lodestar should now be ready to use docker pull chainsafe/lodestar docker run chainsafe/lodestar --help info Docker is the recommended setup for Lodestar. Use our Lodestar Quickstart scripts with Docker for detailed instructions.","s":"Docker Installation","u":"/lodestar/run/getting-started/installation","h":"#docker-installation","p":393},{"i":400,"t":"Make sure to have Yarn installed. It is also recommended to install NVM (Node Version Manager) and use the LTS version (currently v22) of NodeJS. info NodeJS versions older than the current LTS are not supported by Lodestar. We recommend running the latest Node LTS. It is important to make sure the NodeJS version is not changed after reboot by setting a default nvm alias default && nvm use default. note Node Version Manager (NVM) will only install NodeJS for use with the active user. If you intend on setting up Lodestar to run under another user, we recommend using NodeSource's source for NodeJS so you can install NodeJS globally.","s":"Prerequisites","u":"/lodestar/run/getting-started/installation","h":"#prerequisites","p":393},{"i":402,"t":"Clone the repository locally and build from the stable release branch. git clone -b stable https://github.com/chainsafe/lodestar.git Switch to created directory. cd lodestar","s":"Clone repository","u":"/lodestar/run/getting-started/installation","h":"#clone-repository","p":393},{"i":404,"t":"Install across all packages. Lodestar follows a monorepo structure, so all commands below must be run in the project root. yarn install","s":"Install packages","u":"/lodestar/run/getting-started/installation","h":"#install-packages","p":393},{"i":406,"t":"Build across all packages. yarn run build","s":"Build source code","u":"/lodestar/run/getting-started/installation","h":"#build-source-code","p":393},{"i":408,"t":"Lodestar should now be ready for use. ./lodestar --help See Command Line Reference for further information.","s":"Lodestar CLI","u":"/lodestar/run/getting-started/installation","h":"#lodestar-cli","p":393},{"i":410,"t":"ModuleNotFoundError: No module named 'distutils' If you stump upon this issue while running Yarn, it's because Python 3.12 had removed distutils package. That package is required for node build tool. You can install it with following command. pip3 install setuptools --force-reinstall --user","s":"Known Issues","u":"/lodestar/run/getting-started/installation","h":"#known-issues","p":393},{"i":412,"t":"danger For mainnet (production) usage, we only recommend installing with docker due to NPM supply chain attacks. Until a safer installation method has been found, do not use this install method except for experimental purposes only.","s":"Install from NPM [not recommended]","u":"/lodestar/run/getting-started/installation","h":"#install-from-npm-not-recommended","p":393},{"i":414,"t":"Lodestar has the ability to send client stats to a remote service for collection. At the moment, the main service offering remote monitoring is beaconcha.in. Instructions for setting up client monitoring with beaconcha.in can be found in their docs about Mobile App <> Node Monitoring and in your account settings.","s":"Client monitoring","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"","p":413},{"i":416,"t":"Lodestar provides CLI options to configure monitoring on both the beacon node and validator client.","s":"Configuration","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#configuration","p":413},{"i":418,"t":"Client monitoring can be enabled by setting the --monitoring.endpoint flag to a remote service endpoint URL. --monitoring.endpoint \"https://beaconcha.in/api/v1/client/metrics?apikey={apikey}&machine={machineName}\" In case of beaconcha.in, the API key can be found in your account settings. Setting the machine is optional but it is especially useful if you are monitoring multiple nodes. note When sending data to a remote service you should be conscious about security: Only use a service that you trust as this will send information which may identify you and associate your validators, IP address and other personal information. Always use a HTTPS connection (i.e. a URL starting with https://) to prevent the traffic from being intercepted in transit and leaking information. More details about the data sent to the remote service can be found in the specification. It is also possible to print out the data sent to the remote service by enabling debug logs which can be done by supplying the --logLevel debug flag.","s":"Remote endpoint URL","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#remote-endpoint-url","p":413},{"i":420,"t":"It is possible to adjust the interval between sending client stats to the remote service by setting the --monitoring.interval flag. It takes an integer value in milliseconds, the default is 60000 which means data is sent once a minute. For example, setting an interval of 300000 would mean the data is only sent every 5 minutes. --monitoring.interval 300000 Increasing the monitoring interval can be useful if you are running into rate limit errors when posting large amounts of data for multiple nodes.","s":"Monitoring interval","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#monitoring-interval","p":413},{"i":424,"t":"Check back soon for more information!!","s":"Log Management","u":"/lodestar/run/logging-and-metrics/log-management","h":"","p":423},{"i":426,"t":"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly.","s":"Prometheus and Grafana","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"","p":425},{"i":428,"t":"To start, download Prometheus from https://prometheus.io/download/. Unzip the downloaded .zip file and run Prometheus from its installed location with the lodestar prometheus.yml passed in as the configuration file ./prometheus --config.file=$dataDir/prometheus.yml info 8008 is also the default port specified in the prometheus.yml in the lodestar repository Then run the Lodestar beacon node with lodestar --metrics=true --metrics.port=8008 Navigate to http://localhost:9090/ in your browser to verify that Prometheus is monitoring Lodestar","s":"Prometheus","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#prometheus","p":425},{"i":430,"t":"Download and install Grafana from its official repository https://grafana.com/docs/grafana/latest/installation/debian/ Add Prometheus as a data source to Grafana https://prometheus.io/docs/visualization/grafana/#installing An example of relevant metrics of interest to monitor are: nodejs_heap_space_size_used_bytes nodejs_eventloop_lag_seconds beaconchain_peers beaconchain_current_slot beaconchain_current_finalized_epoch","s":"Grafana","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#grafana","p":425},{"i":434,"t":"Lodestar supports connecting an external signing server like Web3Signer, Diva, or any other service implementing the remote signing specification. This allows the validator client to operate without storing any validator private keys locally by delegating the signing of messages (e.g. attestations, beacon blocks) to the external signer which is accessed through a REST API via HTTP(S). This API should not be exposed directly to the public Internet and appropriate firewall rules should be in place to restrict access only from the validator client.","s":"External Signer","u":"/lodestar/run/validator-management/external-signer","h":"","p":433},{"i":436,"t":"Lodestar provides CLI options to connect an external signer. ./lodestar validator --externalSigner.url \"http://localhost:9000\" --externalSigner.fetch The validator client will fetch the list of public keys from the external signer and automatically keep them in sync with signers in local validator store by adding newly discovered public keys and removing no longer present public keys on external signer. By default, the list of public keys will be fetched from the external signer once per epoch (6.4 minutes). This interval can be configured by setting --externalSigner.fetchInterval flag which takes a number in milliseconds. Alternatively, if it is not desired to use all public keys imported on the external signer, it is also possible to explicitly specify a list of public keys to use by setting the --externalSigner.pubkeys flag instead of --externalSigner.fetch.","s":"Configuration","u":"/lodestar/run/validator-management/external-signer","h":"#configuration","p":433},{"i":440,"t":"⏳ Lodestar currently undergoes a quick release cycle with regular minor releases published roughly fortnightly. 🌐 We encourage using the most recently released version before reporting an issue.","s":"Supported Versions","u":"/lodestar/security","h":"#supported-versions","p":438},{"i":442,"t":"🚨 Please, send vulnerability reports to security@chainsafe.io. ⚠️ Please do not file a public ticket mentioning the vulnerability, as doing so could increase the likelihood of the vulnerability being used before a fix has been created, released and installed on the network.","s":"Reporting a Vulnerability","u":"/lodestar/security","h":"#reporting-a-vulnerability","p":438},{"i":444,"t":"Run one or multiple validator clients","s":"validator CLI Command","u":"/lodestar/run/validator-management/validator-cli","h":"","p":443},{"i":446,"t":"The following sub-commands are available with the validator command: validator slashing-protection import validator slashing-protection export validator import validator list validator voluntary-exit validator bls-to-execution-change","s":"Available Sub-Commands","u":"/lodestar/run/validator-management/validator-cli","h":"#available-sub-commands","p":443},{"i":449,"t":"Run one validator client with all the keystores available in the directory .holesky/keystores ./lodestar validator --network holesky","s":"Base validator command","u":"/lodestar/run/validator-management/validator-cli","h":"#base-validator-command","p":443},{"i":451,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --keymanager​ Enable key manager API server type: boolean --keymanager.auth​ Enable token bearer authentication for key manager API server type: boolean default: true --keymanager.tokenFile​ Path to file containing bearer token used for key manager API authentication type: string --keymanager.port​ Set port for key manager API type: number default: 5062 --keymanager.address​ Set host for key manager API type: string default: \"127.0.0.1\" --keymanager.cors​ Configures the Access-Control-Allow-Origin CORS header for key manager API type: string default: \"*\" --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ Open validators even if there's a lockfile. Use with caution type: boolean --graffiti​ Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max) type: string --proposerSettingsFile​ A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change type: string --suggestedFeeRecipient​ Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge. type: string default: \"0x0000000000000000000000000000000000000000\" --strictFeeRecipientCheck​ Enable strict checking of the validator's feeRecipient with the one returned by engine type: boolean --defaultGasLimit​ Suggested gas limit to the engine/builder for building execution payloads. Only used post merge. type: number default: 30000000 --builder​ An alias for --builder.selection default for the builder flow, ignored if --builder.selection is explicitly provided type: boolean --builder.selection​ Builder block selection strategy default, maxprofit, builderalways, builderonly, executionalways, or executiononly type: string default: \"executiononly\" --builder.boostFactor​ Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit type: string default: \"100\" --useProduceBlockV3​ Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks type: boolean --broadcastValidation​ Validations to be run by beacon node for the signed block prior to publishing type: string default: \"gossip\" --blindedLocal​ Request fetching local block in blinded format for produceBlockV3 type: boolean default: false --importKeystores​ Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators type: string[] default: [ \"./keystores/*.json\" ] --importKeystoresPassword​ Path to a file with password to decrypt all keystores from importKeystores option type: string default: \"./password.txt\" --doppelgangerProtection​ Enables Doppelganger protection type: boolean --http.requestWireFormat​ Wire format to use in HTTP requests to beacon node. Can be one of json or ssz type: string default: \"json\" --http.responseWireFormat​ Preferred wire format for HTTP responses from beacon node. Can be one of json or ssz type: string default: \"ssz\" --externalSigner.url​ URL to connect to an external signing server type: string --externalSigner.pubkeys​ List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys type: string[] --externalSigner.fetch​ Fetch the list of public keys to validate from an external signer. Cannot be used in combination with --externalSigner.pubkeys type: boolean --externalSigner.fetchInterval​ Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default type: number --distributed​ Enables specific features required to run as part of a distributed validator cluster type: boolean --metrics​ Enable the Prometheus metrics HTTP server type: boolean default: false --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 5064 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\" --monitoring.endpoint​ Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in) type: string --monitoring.interval​ Interval in milliseconds between sending client stats to the remote service type: number default: 60000","s":"validator Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-options","p":443},{"i":453,"t":"Import an interchange file.","s":"validator slashing-protection import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import","p":443},{"i":455,"t":"Supports all parent command options plus the following: --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ If genesisValidatorsRoot can't be fetched from the Beacon node, use a zero hash type: boolean --file​ The slashing protection interchange file to import (.json). required: true type: string","s":"validator slashing-protection import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import-options","p":443},{"i":457,"t":"Export an interchange file.","s":"validator slashing-protection export","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export","p":443},{"i":459,"t":"Supports all parent command options plus the following: --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ If genesisValidatorsRoot can't be fetched from the Beacon node, use a zero hash type: boolean --file​ The slashing protection interchange file to export to (.json). required: true type: string --pubkeys​ Export slashing protection data only for a given subset of public keys type: string[]","s":"validator slashing-protection export Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export-options","p":443},{"i":461,"t":"Imports one or more EIP-2335 keystores into a Lodestar validator client directory, requesting passwords interactively. The directory flag provides a convenient method for importing a directory of keys generated by the eth2-deposit-cli Ethereum Foundation utility.","s":"validator import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import","p":443},{"i":463,"t":"Import validator keystores generated with the Ethereum Foundation Staking Launchpad ./lodestar validator import --network holesky --importKeystores $HOME/staking-deposit-cli/validator_keys","s":"validator import Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-examples","p":443},{"i":465,"t":"Supports all parent command options plus the following: --importKeystores​ Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators type: string[] default: [ \"./keystores/*.json\" ] --importKeystoresPassword​ Path to a file with password to decrypt all keystores from importKeystores option type: string default: \"./password.txt\"","s":"validator import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-options","p":443},{"i":467,"t":"Lists the public keys of all validators","s":"validator list","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list","p":443},{"i":469,"t":"List all validator public keys previously imported ./lodestar validator list","s":"validator list Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list-examples","p":443},{"i":471,"t":"Performs a voluntary exit for a given set of validators as identified via pubkeys. If no pubkeys are provided, it will exit all validators that have been imported.","s":"validator voluntary-exit","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit","p":443},{"i":473,"t":"Perform a voluntary exit for the validator who has a public key 0xF00 ./lodestar validator voluntary-exit --network holesky --pubkeys 0xF00 Perform a voluntary exit for the validator who has a public key 0xF00 and its secret key is on an external signer ./lodestar validator voluntary-exit --network holesky --externalSigner.url http://signer:9000 --externalSigner.fetch --pubkeys 0xF00","s":"validator voluntary-exit Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-examples","p":443},{"i":475,"t":"Supports all parent command options plus the following: --exitEpoch​ The epoch upon which to submit the voluntary exit. If no value is provided, then we default to the current epoch. type: number --pubkeys​ Public keys to exit type: string[] --yes​ Skip confirmation prompt type: boolean","s":"validator voluntary-exit Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-options","p":443},{"i":477,"t":"Performs BLS To Execution Change for a given validator (as identified via publicKey. If no publicKey is provided, a prompt will ask the user which validator they would like to choose for BLS To Execution Change.","s":"validator bls-to-execution-change","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change","p":443},{"i":479,"t":"Perform BLS To Execution Change for the validator who has a public key 0xF00 ./lodestar validator bls-to-execution-change --publicKey 0xF00 --fromBlsPrivkey ... --toExecutionAddress ...","s":"validator bls-to-execution-change Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-examples","p":443},{"i":481,"t":"Supports all parent command options plus the following: --publicKey​ Validator public key for which to set withdrawal address hence enabling withdrawals required: true type: string --fromBlsPrivkey​ Bls withdrawals private key to sign the message required: true type: string --toExecutionAddress​ Address to which the validator's balances will be set to be withdrawn. required: true type: string","s":"validator bls-to-execution-change Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-options","p":443},{"i":483,"t":"The Lodestar project is divided into Typescript packages that can be used independently of the CLI. These packages span the breadth of the Ethereum Consensus layer, and are perfect for Typescript developers looking to build around Ethereum.","s":"Lodestar libraries","u":"/lodestar/supporting-libraries/libraries","h":"","p":482},{"i":485,"t":"Several useful Ethereum consensus libraries are developed as part of the Lodestar monorepo and may be useful when used individually. params - Ethereum consensus constants and fork names types - Ethereum consensus types, Typescript interfaces and SSZ type objects config - Ethereum consensus run-time network configuration api - Ethereum consensus REST API client flare - Beacon chain multi-purpose and debugging tool light-client - Ethereum light client prover - A set of tools allowing to verify EL client JSON-RPC calls","s":"Monorepo libraries","u":"/lodestar/supporting-libraries/libraries","h":"#monorepo-libraries","p":482},{"i":488,"t":"bls - Ethereum Consensus BLS sign / verify / aggregate bls-keystore - store / retrieve a BLS secret key from an EIP-2335 JSON keystore bls-keygen - utility functions to generate BLS secret keys, following EIP-2333 and EIP-2334 bls-hd-key - low level EIP-2333 and EIP-2334 functionality","s":"BLS Utilities","u":"/lodestar/supporting-libraries/libraries","h":"#bls-utilities","p":482},{"i":490,"t":"ssz - Simple Serialize (SSZ) persistent-merkle-tree - binary merkle tree implemented as a persistent data structure as-sha256 - Small AssemblyScript implementation of SHA256","s":"Hashing","u":"/lodestar/supporting-libraries/libraries","h":"#hashing","p":482},{"i":492,"t":"discv5 - Discv5 protocol js-libp2p-gossipsub - Gossipsub protocol for js-libp2p js-libp2p-noise - Noise handshake for js-libp2p","s":"Networking","u":"/lodestar/supporting-libraries/libraries","h":"#networking","p":482},{"i":496,"t":"@chainsafe/js-libp2p-noise - Noise handshake for js-libp2p @chainsafe/js-libp2p-gossipsub - Gossipsub protocol for js-libp2p @chainsafe/libp2p-yamux","s":"LibP2P","u":"/lodestar/supporting-libraries/","h":"#libp2p","p":493},{"i":498,"t":"discv5 - Discv5 protocol","s":"Discv5","u":"/lodestar/supporting-libraries/","h":"#discv5","p":493},{"i":500,"t":"@chainsafe/ssz - Simple Serialize (SSZ) @chainsafe/persistent-merkle-tree - binary merkle tree implemented as a persistent data structure @chainsafe/as-sha256 - Small AssemblyScript implementation of SHA256","s":"Serialization and Hashing","u":"/lodestar/supporting-libraries/","h":"#serialization-and-hashing","p":493},{"i":502,"t":"@chainsafe/bls - Isomorphic Ethereum Consensus BLS sign / verify / aggregate @chainsafe/blst-ts - Node specific Ethereum Consensus BLS sign / verify / aggregate @chainsafe/bls-keystore - store / retrieve a BLS secret key from an EIP-2335 JSON keystore @chainsafe/bls-keygen - utility functions to generate BLS secret keys, following EIP-2333 and EIP-2334 @chainsafe/bls-hd-key - low level EIP-2333 and EIP-2334 functionality","s":"BLS","u":"/lodestar/supporting-libraries/","h":"#bls","p":493},{"i":505,"t":"The following instructions are for stakers utilizing the Lodestar validator client.","s":"Validator Configuration","u":"/lodestar/run/validator-management/vc-configuration","h":"","p":504},{"i":507,"t":"Validators are represented by a BLS keypair. Use your generated mnemonic from one of the tools above to generate the keystore files required for validator duties on Ethereum using the Lodestar validator client.","s":"Setup your validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#setup-your-validator","p":504},{"i":509,"t":"To create a keystore, we recommend using the official Staking Deposit CLI from the Ethereum Foundation for users comfortable with command line interfaces. Alternatively, for a graphical user interface, you can use the Stakehouse Wagyu Key Generator developed by members of the EthStaker community. warning These tools will generate keystore files for staking validators as well as the important mnemonic. This mnemonic must be handled and stored securely.","s":"Create a keystore","u":"/lodestar/run/validator-management/vc-configuration","h":"#create-a-keystore","p":504},{"i":511,"t":"To import a validator JSON keystore that was created via one of the methods described above, you must locate the file for import (ex. keystore-m_12381_3600_0_0_0-1654128694.json). Inside the keystore JSON file, you should have an EIP-2335 keystore file. You will also need the passphrase used the encrypt the keystore. This can be specified interactively, or provided in a plaintext file. Option 1: Import Keys To Lodestar's Keystores Folder​ You can load the keys into the keystore folder using the validator import command. There are two methods for importing keystores: Interactive passphrase import ./lodestar validator import --importKeystores ./validator_keys Plaintext passphrase file import ./lodestar validator import --importKeystores ./validator_keys --importKeystoresPassword ./password.txt info The interactive passphrase import method will prompt every keystore in the validator_keys folder for import and will ask for the individual password for each keystore. This method will allow you to import multiple keystores with different passwords. The plaintext passphrase file import method will allow you to import all keystores in the validator_keys folder encrypted with the same password contained in password.txt for efficiency. Once imported with either method, these keystores will be automatically loaded when you start the validator. To list the imported keystores, use the validator list command. Option 2: Import Keys When Starting the Validator​ To import keys when you start the validator specify the --importKeystores and --importKeystoresPassword flags with the validator command: ./lodestar validator --importKeystores ./validator_keys --importKeystoresPassword ./password.txt warning If you import keys using --importKeystores at runtime (Option 2) any keys loaded to the keystores folder from Option 1 will be ignored.","s":"Import a validator keystore to Lodestar","u":"/lodestar/run/validator-management/vc-configuration","h":"#import-a-validator-keystore-to-lodestar","p":504},{"i":513,"t":"Post-Merge Ethereum requires validators to set a Fee Recipient which allows you to receive priority fees when proposing blocks. If you do not set this address, your priority fees will be sent to the burn address. Configure your validator client's fee recipient address by using the --suggestedFeeRecipient flag. Ensure you specify an Ethereum address you control. An example of a fee recipient set with the address 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d would add the following flag to their configuration: --suggestedFeeRecipient 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d. You may choose to use the --strictFeeRecipientCheck flag to enable a strict check of the fee recipient address with the one returned by the beacon node for added reassurance.","s":"Configuring the fee recipient address","u":"/lodestar/run/validator-management/vc-configuration","h":"#configuring-the-fee-recipient-address","p":504},{"i":515,"t":"If you are running a beacon node with connected builder relays, you may use these validator configurations to signal which block (builder vs. local execution) the beacon node should produce. With produceBlockV3 (enabled automatically after the Deneb hard fork), the --builder.boostFactor is a percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit. Even though this is set on the validator client, the calculation is requested and applied on the beacon node itself. For more information, see the produceBlockV3 Beacon API. With Lodestar's --builder.selection validator options, you can select: default: Default setting for Lodestar set at --builder.boostFactor=90. This default setting will have a local block boost of ~10%. Note that this value might change in the future depending on what we think is the most appropriate value to help improve censorship resistance of Ethereum. maxprofit: An alias of --builder.boostFactor=100, which will always choose the more profitable block. Using this option, you may customize your --builder.boostFactor to your preference. Examples of its usage are below. executionalways: An alias of --builder.boostFactor=0, which will select the local execution block, unless it fails to produce due to an error or a delay in the response from the execution client. executiononly: Beacon node will be requested to produce local execution block even if builder relays are configured. This option will always select the local execution block and will error if it couldn't produce one. builderalways: An alias of --builder.boostFactor=18446744073709551615 (2**64 - 1), which will select the builder block, unless the builder block fails to produce. The builder block may fail to produce if it's not available, not timely or there is an indication of censorship via shouldOverrideBuilder from the execution payload response. builderonly: Generally used for distributed validators (DVs). No execution block production will be triggered. Therefore, if a builder block is not produced, the API will fail and no block will be produced. Calculating builder boost factor with examples​ To calculate the builder boost factor setting, you need to know what percentage you will accept a builder block for against a local execution block using the following formula: 100*100/(100+percentage). The value passed to --builder.boostFactor must be a valid number without decimals. Example 1: I will only accept a builder block with 25% more value than the local execution block. 10000/(100+25) = 80 Therefore, --builder.boostFactor=80. Example 2: Setting a --builder.boostFactor=0 will always prefer the local execution block, but will produce an available builder block if the local execution block fails. Example 3: Setting a --builder.boostFactor=100 is the same as signaling --builder.selection maxprofit where the validator will always select the most profitable block between the local execution engine and the builder block from the relay.","s":"Configure your builder selection and/or builder boost factor","u":"/lodestar/run/validator-management/vc-configuration","h":"#configure-your-builder-selection-andor-builder-boost-factor","p":504},{"i":517,"t":"Please use the official Ethereum Launchpad to perform your deposits. Ensure your deposits are sent to the proper beacon chain deposit address on the correct network. Mainnet​ Ethereum Mainnet Launchpad Beacon Chain Deposit Contract 0x00000000219ab540356cBB839Cbe05303d7705Fa Holesky Testnet​ Ethereum Holesky Testnet Launchpad Holesky Beacon Chain Deposit Contract 0x4242424242424242424242424242424242424242 Ephemery Testnet​ Ethereum Ephemery Testnet Launchpad Ephemeral Testnet Resources","s":"Submit a validator deposit","u":"/lodestar/run/validator-management/vc-configuration","h":"#submit-a-validator-deposit","p":504},{"i":519,"t":"To start a Lodestar validator run the command: ./lodestar validator --network $NETWORK_NAME You should see confirmation that modules have started. Mar-01 03:06:35.048[] info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264 Mar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky Mar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m Mar-01 03:06:35.698[] info: 2 local keystores Mar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea Mar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e Mar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596 Mar-01 03:09:23.813[] info: Genesis fetched from the beacon node Mar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config Mar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot Mar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e Mar-01 03:09:23.830[] info: Validator statuses active=2, total=2 Mar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1 Mar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1","s":"Run the validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#run-the-validator","p":504}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/4",[0,1.279,1,4.291,2,4.095,3,2.522,4,3.319,5,2.397,6,4.516,7,6.448,8,4.933,9,5.762,10,4.291]],["t/6",[0,1.533,2,2.899,3,1.785,6,3.197,11,1.74,12,3.9,13,2.899,14,3.114,15,3.384,16,2.519,17,1.47,18,4.926,19,3.197,20,4.079,21,4.295,22,3.611,23,1.417,24,2.068,25,1.07,26,3.037,27,2.835,28,4.082,29,3.611,30,3.746,31,3.114,32,1.988,33,2.35,34,4.926,35,2.835,36,1.988,37,2.431,38,5.475,39,4.295,40,3.611,41,3.492,42,3.287,43,3.492,44,2.565,45,2.138,46,4.565,47,4.079,48,2.565,49,3.287,50,3.611,51,3.197,52,2.835,53,4.295,54,5.475]],["t/8",[0,0.977,5,1.83,23,1.529,55,5.906,56,2.272,57,6.069,58,1.785,59,4.191,60,5.314,61,7.737,62,5.293,63,5.906,64,7.737,65,7.737,66,3.896,67,5.906,68,5.906,69,5.314,70,5.906,71,3.651,72,5.906,73,7.737,74,5.906,75,5.314,76,5.906,77,4.007,78,5.103,79,7.737,80,5.906,81,5.314,82,7.737,83,3.559]],["t/10",[0,1.316,1,4.415,2,4.213,41,5.075,84,4.415,85,5.249,86,4.919,87,4.919]],["t/12",[1,4.173,9,5.604,46,6.272,48,3.525,50,4.962,84,4.173,88,6.272,89,5.901,90,6.272,91,6.768,92,6.272,93,4.798,94,6.768,95,7.522]],["t/17",[0,0.917,3,1.605,11,1.564,12,1.306,17,1.108,19,1.071,23,0.816,24,1.558,25,1.706,28,1.749,32,2.484,33,1.779,36,1.145,37,0.814,44,0.859,45,1.619,51,1.071,52,1.633,58,2.881,59,1.708,83,3.289,96,1.306,97,1.17,98,1.213,99,1.892,100,1.071,101,1.785,102,2.563,103,1.834,104,0.95,105,0.727,106,1.572,107,1.65,108,0.876,109,0.93,110,1.21,111,0.911,112,1.922,113,1.425,114,1.255,115,1.529,116,1.306,117,2.349,118,1.529,119,1.439,120,1.134,121,1.65,122,1.834,123,0.844,124,1.306,125,1.21,126,0.583,127,2.473,128,2.489,129,3.042,130,3.139,131,2.953,132,4.622,133,4.428,134,3.153,135,2.837,136,1.65,137,2.349,138,1.367,139,2.349,140,1.439,141,2.735,142,1.834,143,3.457,144,2.245,145,1.17,146,2.549,147,1.353,148,1.101,149,1.018,150,4.892,151,1.306,152,1.439,153,1.529,154,3.139,155,2.044,156,1.306,157,1.071,158,2.079,159,1.018,160,1.21,161,0.911,162,1.834,163,1.834,164,1.943,165,0.911,166,1.529,167,0.994,168,1.306,169,1.749,170,1.841,171,2.018,172,2.837,173,1.834,174,2.245,175,3.279,176,1.65,177,1.306,178,1.101,179,1.834,180,1.255,181,0.716,182,1.566,183,1.269,184,1.306,185,1.65,186,1.071,187,1.018,188,2.606,189,3.505,190,1.834,191,1.749,192,1.834,193,2.628,194,1.834,195,3.153,196,1.841,197,1.45,198,1.17,199,0.876,200,1.949,201,1.529,202,1.949,203,1.834,204,1.255,205,1.17,206,1.566,207,0.706,208,1.439,209,1.45,210,0.787,211,1.834,212,1.439,213,1.071,214,2.157,215,1.65,216,1.834,217,1.834,218,1.529,219,2.147,220,1.134,221,3.153,222,1.529,223,1.21,224,1.101,225,1.834,226,1.071,227,1.834,228,1.367,229,1.367,230,0.893,231,1.834,232,1.101,233,0.859,234,1.834,235,1.834,236,1.529,237,1.21,238,0.695,239,1.834,240,1.834,241,1.834,242,1.65,243,1.529,244,1.21]],["t/19",[0,1.112,11,2.138,28,3.731,33,2.886,36,2.442,98,2.587,102,4.157,112,2.626,113,3.039,128,4.037,209,3.094,224,5.506,245,4.157,246,4.289,247,3.643,248,6.594,249,4.601,250,5.275,251,4.157,252,6.725,253,6.725,254,4.436,255,4.79,256,4.601]],["t/22",[0,1.291,3,2.546,7,6.509,41,4.979,257,7.025,258,6.509,259,5.15,260,7.025,261,5.817,262,6.124]],["t/24",[58,2.862,263,6.428,264,6.833,265,3.99]],["t/26",[16,3.492,17,1.517,155,3.154,266,7.592,267,6.329,268,5.955,269,7.592,270,3.056,271,6.831,272,9.053,273,4.212,274,6.329]],["t/28",[0,1.362,2,3.448,13,4.362,14,3.704,16,2.996,23,2.459,36,2.365,58,2.962,77,3.373,161,4.092,265,4.011,275,7.413,276,3.302,277,6.513,278,4.852,279,6.513,280,2.75,281,3.052,282,4.852]],["t/30",[6,2.213,15,2.342,17,0.757,19,3.307,23,2.586,25,0.741,32,1.376,33,1.626,41,2.417,44,1.776,45,3.763,52,1.963,58,2.555,85,3.736,117,2.823,126,1.204,165,1.882,180,2.593,188,2.006,238,1.437,265,4.385,270,1.525,276,2.872,283,3.159,284,3.159,285,5.664,286,4.22,287,5.664,288,3.736,289,2.559,290,2.391,291,3.159,292,3.41,293,2.933,294,2.593,295,2.275,296,3.789,297,2.213,298,3.789,299,3.789,300,2.275,301,2.053,302,3.4,303,2.5,304,2.417,305,4.034,306,5.096,307,3.613,308,1.683,309,1.525,310,2.006,311,2.342,312,2.342,313,3.41,314,1.963,315,3.41,316,2.823,317,2.973,318,2.823,319,2.973,320,2.417,321,1.549,322,3.159,323,2.417,324,3.159,325,2.699,326,2.973,327,2.699,328,2.823,329,2.5]],["t/32",[17,1.401,33,3.009,44,3.285,85,4.624,98,2.697,105,2.779,113,3.168,155,2.912,280,2.96,293,3.631,295,4.208,330,7.011,331,5.845,332,4.993,333,4.334,334,7.011,335,4.797,336,5.845,337,5.223,338,3.554,339,3.712,340,5.499]],["t/34",[11,1.632,23,2.24,25,1.003,33,2.204,36,2.558,45,2.75,58,1.552,123,2.362,188,2.718,200,4.353,204,3.513,208,4.027,251,3.174,265,2.5,276,2.603,301,2.781,326,4.027,341,4.502,342,6.786,343,5.919,344,5.134,345,4.645,346,5.134,347,7.043,348,4.28,349,3.174,350,5.134,351,4.28,352,3.657,353,3.594,354,3.082,355,4.353,356,3.657,357,3.174,358,4.027,359,3.513,360,5.134,361,3.429,362,3.513,363,3.274]],["t/36",[17,1.297,23,2.336,25,0.892,26,2.533,37,2.881,45,3.768,56,1.756,113,2.063,123,2.1,129,4.011,146,2.365,170,2.027,178,2.741,187,2.533,188,3.435,198,2.912,202,2.822,207,1.756,265,2.223,273,2.533,288,4.28,301,2.473,309,1.838,310,2.417,321,1.867,331,3.807,337,3.402,341,3.223,342,3.581,354,2.741,361,1.81,364,3.402,365,3.402,366,5.41,367,3.581,368,3.402,369,2.822,370,3.402,371,4.011,372,4.108,373,3.124,374,5.624,375,6.489,376,6.489,377,3.581,378,3.124,379,3.402,380,5.838,381,4.566,382,2.597,383,2.597,384,3.402,385,2.315,386,4.108,387,4.566,388,2.822,389,4.566,390,4.566,391,4.566]],["t/38",[15,5.777,23,1.816,24,2.425,25,1.566,32,1.853,33,3.439,58,2.12,77,2.642,101,1.505,105,2.023,113,3.169,161,2.534,174,3.634,188,2.701,270,2.054,345,3.366,361,3.176,385,2.587,392,8.013,393,6.681,394,3.491,395,7.013,396,5.102,397,4.591,398,7.013,399,3.799,400,4.21,401,3.801,402,5.847,403,5.102,404,5.102,405,4.473,406,3.154,407,3.801,408,5.225,409,3.491,410,5.102,411,5.102]],["t/40",[0,1.005,41,5.029,48,4.1,49,3.65,50,4.011,58,2.645,85,4.011,160,4.011,170,3.501,183,3.174,188,3.219,280,2.567,339,3.219,412,6.08,413,4.77,414,3.65,415,5.471,416,6.08,417,6.08,418,3.149,419,2.96,420,4.331,421,4.53,422,4.77,423,4.331,424,5.201,425,6.08,426,6.08,427,6.08,428,5.471,429,4.331,430,5.069]],["t/42",[48,4.219,51,4.392,58,2.274,181,2.937,290,3.176,431,3.592,432,4.173,433,5.358,434,5.147,435,6.768,436,7.522,437,3.662,438,5.358]],["t/44",[1,3.037,33,2.35,39,4.295,41,3.492,45,2.138,84,3.037,86,3.384,106,2.075,170,4.115,171,3.582,181,2.138,183,2.204,265,3.582,283,4.565,291,6.134,307,4.692,338,2.776,383,4.185,418,4.303,431,2.614,439,7.357,440,4.926,441,4.926,442,4.185,443,5.475,444,4.926,445,3.492,446,6.134,447,4.079,448,4.565,449,4.926,450,4.926,451,4.079,452,3.492,453,5.475,454,5.475,455,7.357,456,4.926,457,5.475,458,5.475]],["t/46",[0,0.68,1,2.281,8,3.837,41,2.622,48,2.819,85,2.711,86,2.541,101,1.212,116,4.284,171,4.654,209,1.891,233,1.926,247,2.227,249,2.812,259,3.968,286,3.062,288,2.711,305,4.284,307,6.097,308,1.825,309,1.655,312,2.541,318,4.482,321,1.681,333,2.541,364,4.482,384,3.062,394,2.812,418,2.129,431,1.963,432,2.281,445,4.537,446,5.015,450,3.699,459,3.685,460,3.224,461,4.111,462,2.928,463,4.111,464,5.015,465,4.111,466,3.699,467,3.699,468,3.224,469,3.427,470,4.111,471,4.111,472,3.718,473,4.111,474,3.062,475,3.062,476,2.928,477,2.671,478,2.812,479,3.427,480,3.224,481,4.111,482,1.825,483,2.928,484,4.111,485,3.699,486,6.015,487,3.427,488,3.062,489,2.541,490,5.412,491,4.111,492,2.711,493,3.062,494,3.224]],["t/48",[0,1.159,17,1.401,86,5.333,123,4.606,183,2.822,281,3.285,482,3.113,495,8.627,496,3.482,497,5.845,498,5.69,499,5.223,500,4.471,501,7.011,502,4.208]],["t/50",[0,0.753,6,1.668,11,1.447,17,1.641,23,1.47,27,1.48,36,2.062,37,1.269,40,1.885,44,1.339,45,1.778,51,1.668,58,2.139,78,1.885,84,2.527,109,1.449,125,3.745,154,1.822,160,1.885,170,3.141,175,1.548,178,2.734,183,1.15,198,1.822,202,1.766,207,1.099,209,1.314,247,2.467,248,2.241,259,1.885,260,2.571,265,2.764,273,3.15,276,1.449,280,1.206,283,2.382,284,4.734,289,2.058,290,2.987,291,3.797,292,2.571,312,1.766,320,1.822,321,1.168,323,1.822,325,2.035,333,1.766,338,3.822,341,1.419,353,1.187,355,4.004,372,2.571,383,4.024,405,4.807,406,1.766,434,1.955,459,1.48,460,2.241,462,2.035,503,2.857,504,2.857,505,4.23,506,2.857,507,2.382,508,2.857,509,2.857,510,1.766,511,2.382,512,2.857,513,2.382,514,1.885,515,2.035,516,2.857,517,3.797,518,3.885,519,3.393,520,2.857,521,3.745,522,1.668,523,2.382,524,2.134,525,3.116,526,2.857,527,2.857,528,2.571,529,2.857,530,2.857,531,1.822,532,2.857,533,2.857,534,2.857,535,2.857,536,2.857,537,1.955,538,7.074,539,2.129,540,2.857,541,2.571,542,2.129,543,2.382,544,2.571,545,2.382,546,2.382,547,2.857,548,2.857,549,2.241,550,2.857,551,2.241,552,1.885,553,2.571,554,2.129,555,1.766,556,1.885,557,1.885,558,2.571,559,5.678,560,2.857,561,2.857,562,2.857,563,2.857,564,2.857]],["t/52",[2,2.352,17,0.888,23,1.647,25,0.868,31,2.527,33,1.907,44,2.082,45,3.355,58,1.924,85,4.197,100,2.594,109,2.252,117,3.31,126,1.412,180,3.04,206,2.206,233,2.082,237,2.93,238,1.684,247,3.447,276,3.226,293,2.301,302,3.82,303,2.93,304,2.833,305,4.532,306,5.726,307,4.059,308,1.973,309,1.788,310,2.352,311,2.746,312,2.746,313,3.997,314,2.301,315,3.997,316,3.31,317,3.485,318,3.31,319,3.485,320,2.833,321,2.602,322,3.704,323,2.833,324,3.704,325,3.164,326,3.485,327,3.164,328,3.31,329,2.93,336,3.704,341,2.206,349,4.596,351,3.704,364,3.31,374,3.31,477,1.973,565,6.049,566,2.206,567,3.997,568,2.352,569,2.594,570,3.997,571,3.997,572,3.04,573,3.704,574,4.443,575,4.443,576,4.443,577,4.443,578,3.31]],["t/55",[39,3.485,44,2.082,48,3.804,56,1.709,83,2.044,98,1.709,109,4.116,110,2.93,126,2.363,146,2.301,165,2.206,171,2.163,181,2.485,182,2.206,233,3.804,238,1.684,280,1.876,290,1.876,294,3.04,308,1.973,319,3.485,341,2.206,349,2.746,373,3.04,374,3.31,418,2.301,419,2.163,472,2.746,489,3.934,497,3.704,524,2.982,554,4.741,557,2.93,578,4.741,579,3.485,580,3.53,581,3.369,582,3.31,583,4.229,584,4.741,585,3.485,586,6.364,587,3.31,588,3.997,589,2.594,590,3.997,591,3.485,592,2.121,593,4.443,594,3.997,595,2.206,596,4.443,597,3.997,598,3.164,599,4.443,600,3.485,601,3.997,602,3.164,603,2.206,604,4.443,605,3.997,606,3.704,607,2.833,608,2.667,609,3.997,610,3.485,611,3.31,612,3.164]],["t/57",[17,1.059,43,3.38,48,3.372,105,2.101,109,2.687,120,3.276,125,3.495,126,1.684,166,6,178,4.32,181,2.81,182,2.632,220,3.276,238,2.728,304,3.38,310,2.806,312,3.276,322,4.418,349,4.448,525,3.625,580,5.245,581,2.806,583,3.014,603,2.632,613,4.157,614,4.768,615,7.197,616,5.299,617,5.645,618,3.38,619,2.353,620,5.299,621,4.768,622,5.299,623,5.299,624,4.418,625,4.157,626,5.299,627,4.418,628,3.774,629,5.299,630,4.157,631,5.299,632,5.299,633,4.157,634,4.768,635,3.948]],["t/59",[1,2.921,17,1.052,19,3.074,23,1.363,104,2.727,155,2.187,169,2.921,170,2.338,183,2.119,187,2.921,206,3.559,212,4.13,261,3.923,289,2.379,300,3.161,301,2.852,305,3.75,310,2.788,321,2.153,353,2.187,361,2.84,367,4.13,383,2.995,407,5.338,408,7.029,419,2.563,447,3.923,496,2.615,543,4.39,636,7.165,637,4.737,638,4.39,639,7.165,640,5.265,641,4.39,642,4.39,643,4.39,644,5.265,645,3.75,646,5.265,647,7.165,648,3.75,649,5.265,650,5.265,651,3.602,652,3.602,653,4.39,654,3.923,655,5.265,656,3.923]],["t/61",[19,4.392,23,1.947,25,1.47,300,4.516,361,2.982,393,6.272,408,6.708,431,3.592,657,7.522,658,7.522,659,7.522,660,5.358,661,7.522]],["t/63",[13,3.895,17,1.47,23,1.417,33,3.566,35,2.835,47,4.079,51,3.197,84,5.295,165,2.719,170,2.431,188,2.899,202,3.384,265,3.582,281,3.893,289,3.755,301,2.966,383,3.114,419,2.665,447,4.079,524,2.565,555,3.384,595,2.719,637,4.926,662,5.475,663,5.475,664,6.62,665,5.475,666,3.197,667,5.475,668,5.475,669,8.309,670,5.475,671,5.475,672,7.357,673,5.475,674,5.475,675,5.475]],["t/65",[3,2.052,4,2.7,11,1.39,48,4.394,56,1.682,97,2.788,104,2.264,171,3.924,210,1.876,228,3.257,230,2.128,246,2.788,288,4.86,290,1.846,304,2.788,307,5.14,314,3.258,316,4.687,328,3.257,355,2.703,368,3.257,428,8.001,441,3.934,447,4.687,464,3.645,477,1.941,541,5.66,578,6.625,610,3.429,676,3.114,677,7.683,678,4.687,679,2.532,680,6.719,681,6.291,682,3.645,683,4.372,684,4.372,685,3.934,686,2.703,687,5.49,688,3.429,689,4.372,690,6.291,691,4.372,692,4.012,693,4.372,694,4.372]],["t/67",[27,4.121,49,4.777,50,5.249,430,6.635,695,4.777,696,7.958,697,7.958,698,7.958]],["t/70",[0,1.159,17,1.401,45,2.737,52,3.631,123,3.969,167,3.798,276,4.738,302,4.208,435,6.308,499,5.223,500,4.471,608,4.208,660,4.993,687,5.223,699,7.011,700,3.89,701,5.223,702,5.499,703,7.011]],["t/72",[104,3.896,123,4.142,167,4.877,200,4.65,281,3.525,414,4.516,464,6.272,468,5.901,500,4.798,704,6.768,705,6.768,706,6.768]],["t/74",[24,2.194,25,1.526,35,4.043,98,3.003,101,2.303,701,5.817,707,5.561,708,5.817,709,7.807,710,4.826]],["t/76",[3,2.595,4,3.415,5,2.466,6,4.647,308,3.533,607,5.075,711,7.958,712,3.874]],["t/78",[0,1.169,24,2.437,25,1.833,117,5.268,123,3.99,147,3.035,251,4.371,354,4.245,355,4.371,362,4.838,514,4.664,679,2.846,712,3.442,713,5.547,714,5.895,715,7.071,716,3.442]],["t/80",[0,1.279,17,1.545,123,3.558,371,4.781,388,4.781,701,5.762,708,5.762,717,7.734,718,6.959,719,6.959,720,4.643]],["t/82",[24,2.503,25,1.741,40,4.873,123,3.399,149,4.099,209,3.399,238,3.376,276,3.745,721,8.906,722,5.505,723,5.795]],["t/84",[17,1.789,36,2.707,44,3.493,542,5.554,603,3.702,635,5.554,724,7.454,725,3.947,726,7.454,727,6.707,728,4.917,729,7.454,730,7.454,731,6.707]],["t/86",[3,1.94,4,2.553,24,1.672,25,1.519,108,2.841,123,3.576,183,2.395,288,5.127,314,3.081,333,3.677,362,5.318,419,2.896,429,4.237,442,5.418,713,4.666,732,6.994,733,6.81,734,4.96,735,3.384,736,5.949,737,7.773,738,4.666,739,4.96,740,4.07,741,5.949,742,7.773]],["t/88",[3,2.388,5,2.952,155,3.042,320,4.67,367,5.744,608,4.395,743,6.588,744,5.65,745,5.455,746,4.83,747,7.322,748,3.431,749,6.105,750,3.712]],["t/90",[0,1.244,14,4.279,112,2.937,263,5.901,270,3.028,432,4.173,511,7.506,522,4.392,582,5.604,751,7.522,752,5.604,753,5.901,754,7.522]],["t/92",[3,2.546,4,3.351,26,4.331,98,3.003,126,2.482,233,3.658,248,6.124,712,3.801,718,7.025,755,7.025]],["t/94",[5,2.775,17,1.49,105,2.955,161,3.702,309,3.001,310,3.947,311,4.608,568,3.947,744,4.754,750,3.779,756,6.707,757,6.215,758,6.707,759,6.707]],["t/96",[3,2.595,4,3.415,6,4.647,712,3.874,716,3.874,750,4.035,760,7.958,761,6.242]],["t/98",[3,2.476,4,3.258,17,1.517,29,5.971,45,3.777,56,2.92,342,5.955,466,6.831,762,7.592,763,7.592]],["t/100",[0,1.068,17,1.799,24,2.531,25,1.263,123,2.973,146,4.246,147,2.773,182,3.209,304,4.121,354,3.879,524,3.841,700,3.585,712,3.991,713,5.069,716,3.146,732,5.814,733,4.421,764,6.462,765,6.709,766,3.346,767,5.814,768,6.462,769,5.814]],["t/102",[3,2.595,4,3.415,238,3.017,290,3.36,712,3.874,719,7.16,770,5.668,771,5.445]],["t/104",[0,1.303,29,5.199,123,3.626,500,5.027,522,4.602,700,5.135,712,3.837,772,7.882]],["t/106",[5,2.822,23,1.713,25,1.293,35,3.427,56,2.546,93,4.22,98,2.546,101,2.818,105,2.623,123,3.044,308,3.695,355,4.09,607,4.22,666,3.864,707,4.713,712,4.052,713,5.191,738,5.191,739,5.517,766,3.427,769,5.954,773,5.517]],["t/108",[104,3.968,167,4.151,276,3.885,281,3.59,302,5.464,468,6.01,500,4.887,502,4.599,705,6.894,706,6.894,774,6.01]],["t/110",[6,4.433,20,5.656,507,6.329,766,3.932,775,6.831,776,6.831,777,6.831,778,7.592,779,5.194,780,7.592,781,6.831,782,7.592,783,7.592]],["t/112",[6,4.559,25,1.526,157,4.559,158,5.15,500,4.979,712,3.801,716,3.801,750,3.958,784,7.807,785,7.807]],["t/114",[333,4.781,716,3.765,786,6.067,787,4.933,788,5.101,789,7.734,790,7.734,791,7.734,792,4.095,793,5.101,794,7.734]],["t/116",[6,4.474,17,1.531,712,3.73,716,3.73,750,4.615,786,6.01,787,4.887,795,7.14,796,6.388,797,7.662]],["t/118",[320,4.842,710,4.693,712,3.696,716,3.696,786,5.955,787,5.774,798,8.145,799,5.656,800,6.329,801,7.592,802,5.656]],["t/120",[97,5.125,123,3.697,500,5.125,712,3.912,803,7.23,804,5.498,805,6.699]],["t/122",[17,1.545,31,5.207,126,2.909,716,3.765,787,5.838,799,5.762,806,7.734,807,6.067]],["t/124",[17,1.575,24,2.215,25,1.54,44,3.693,45,3.078,96,5.614,100,4.602,101,2.325,808,7.092]],["t/126",[0,1.267,24,2.154,25,1.497,32,2.783,101,2.26,102,4.736,131,6.483,132,6.388,143,6.388,371,4.736,809,6.894]],["t/128",[0,0.194,1,0.343,3,0.201,4,0.265,5,1.007,11,0.196,13,0.327,17,1.007,23,0.303,24,0.913,25,0.754,26,0.649,27,1.31,28,0.343,32,0.919,33,0.716,37,0.52,44,0.289,45,0.241,49,0.371,56,0.642,57,0.484,58,1.581,66,0.407,83,1.336,98,0.815,101,1.543,102,0.382,105,1.003,109,0.593,110,0.772,112,1.802,124,0.44,125,0.407,126,0.53,127,0.484,128,1.95,130,0.747,131,0.44,132,0.515,133,0.556,135,0.556,136,0.556,137,0.46,138,1.243,139,0.46,140,0.484,141,0.407,143,0.515,145,1.064,146,1.682,147,0.91,148,1.519,150,1.987,151,0.44,152,2.279,155,0.257,156,0.44,157,0.974,158,1.398,159,0.926,161,2.502,164,0.782,169,0.343,171,0.812,175,0.334,178,1.519,180,1.142,182,1.053,186,0.361,189,0.44,191,2.56,193,0.515,196,1.238,197,3.98,199,3.363,206,0.307,207,0.815,210,0.91,213,0.361,219,1.098,220,1.031,224,0.371,226,0.683,232,0.703,233,0.289,238,0.234,244,0.772,245,0.724,246,0.747,251,0.382,254,0.407,255,0.44,256,3.306,270,0.471,273,0.343,278,0.46,280,0.261,281,0.782,289,0.279,290,4.022,297,2.252,301,0.334,302,1.272,308,2.797,309,1.662,310,0.883,311,1.031,321,0.479,323,0.747,341,0.581,343,0.422,356,0.44,361,1.736,363,0.394,371,0.724,378,0.422,385,0.846,388,1.031,394,0.801,399,0.634,400,0.703,401,0.46,405,1.614,406,1.031,418,0.32,431,0.559,433,0.834,452,0.747,459,0.32,462,0.44,472,0.382,475,0.872,477,2.402,478,0.422,479,0.515,480,0.484,483,0.44,492,0.407,494,0.484,498,1.916,502,1.95,510,0.382,518,0.422,531,0.394,555,0.382,557,0.772,566,0.307,568,0.62,569,0.683,580,1.978,581,0.62,589,0.683,592,1.387,595,0.307,598,0.44,603,1.053,607,0.394,611,0.46,612,1.51,613,0.484,619,2.146,624,0.515,628,0.44,630,0.484,643,0.515,645,0.834,651,0.801,652,0.422,666,0.683,676,1.802,687,0.46,688,0.484,692,0.394,708,0.46,710,0.382,712,0.301,716,0.301,722,0.382,728,0.407,733,1.45,740,0.801,744,0.394,748,0.993,750,0.313,770,1.188,792,1.339,809,1.501,810,0.747,811,4.823,812,0.46,813,0.407,814,0.361,815,0.46,816,0.44,817,0.46,818,0.46,819,1.142,820,0.46,821,1.564,822,1.439,823,0.371,824,0.46,825,2.723,826,1.614,827,1.614,828,1.663,829,0.46,830,0.918,831,0.484,832,1.31,833,0.556,834,0.556,835,1.885,836,0.556,837,0.484,838,0.801,839,0.772,840,0.407,841,4.621,842,1.064,843,0.394,844,0.772,845,2.639,846,2.276,847,0.556,848,0.683,849,0.556,850,1.579,851,0.44,852,1.243,853,0.46,854,0.46,855,0.46,856,0.46,857,0.46,858,0.872,859,0.422,860,0.747,861,0.407,862,0.976,863,3.157,864,0.556,865,0.515,866,1.053,867,0.394,868,0.44,869,0.556,870,0.556,871,0.872,872,0.976,873,0.918,874,0.556,875,0.515,876,0.556,877,0.556,878,0.556,879,0.556,880,0.46,881,0.872,882,0.484,883,0.361,884,1.45,885,0.46,886,0.872,887,0.484,888,0.46,889,0.515,890,0.515,891,0.515,892,0.515,893,0.556,894,1.101,895,0.515,896,0.556,897,0.556,898,0.556,899,2.164,900,0.556,901,0.515,902,0.556,903,0.556,904,0.484,905,0.556,906,0.918,907,1.391,908,0.556,909,0.556,910,0.556,911,0.556,912,1.053,913,1.885,914,1.053,915,0.556,916,1.501,917,0.556,918,0.484,919,1.101,920,0.515,921,0.556,922,0.515,923,0.484,924,0.515,925,1.053,926,1.391,927,0.556,928,1.663,929,1.51,930,0.976,931,0.484,932,0.484,933,0.556,934,0.556,935,0.556,936,1.767,937,0.515,938,0.556,939,0.556,940,0.556,941,0.484,942,0.44,943,0.976,944,0.556,945,1.053,946,0.556,947,0.556,948,0.556,949,0.484,950,2.539,951,1.885,952,0.556,953,0.484,954,0.484,955,0.872,956,0.772,957,0.46,958,0.484,959,0.484,960,0.484,961,0.484,962,2.656,963,0.515,964,1.053,965,0.976,966,0.484,967,1.663,968,1.309,969,0.976,970,0.515,971,0.556,972,0.556,973,0.515,974,0.46,975,0.556,976,0.556,977,0.515,978,0.556,979,1.053,980,0.515,981,0.484,982,0.515,983,0.484,984,0.44,985,0.556,986,0.556,987,1.053,988,0.556,989,0.556,990,0.556,991,0.556,992,0.556,993,0.918,994,0.484,995,0.556,996,0.556,997,0.556,998,1.053,999,0.834,1000,0.556,1001,0.515,1002,0.484,1003,0.44,1004,0.556,1005,0.556,1006,0.422,1007,0.484,1008,0.556,1009,0.515,1010,0.515,1011,0.556,1012,0.556,1013,0.556,1014,0.556,1015,0.46,1016,0.556,1017,0.515,1018,0.976,1019,0.515,1020,0.515,1021,0.515,1022,0.976,1023,0.515,1024,0.484,1025,0.976,1026,0.515,1027,0.46,1028,0.515,1029,0.515,1030,0.556,1031,0.976,1032,0.382,1033,0.556,1034,0.484,1035,0.556,1036,0.484,1037,0.44,1038,0.556,1039,0.872,1040,0.515,1041,0.46,1042,0.515,1043,0.484,1044,0.46,1045,0.515,1046,0.556,1047,0.556,1048,0.44,1049,0.556,1050,1.053,1051,0.556,1052,0.422,1053,0.484,1054,0.976,1055,1.243,1056,0.515,1057,0.46,1058,0.484,1059,0.515,1060,0.834,1061,0.556,1062,0.617,1063,0.484,1064,0.617,1065,0.617,1066,0.407,1067,0.556,1068,0.617,1069,0.371,1070,0.44]],["t/132",[87,4.919,106,3.017,181,3.107,289,3.596,419,3.874,679,3.203,1071,5.075,1072,5.668]],["t/134",[0,1.14,13,2.636,17,1.378,22,3.284,23,1.785,45,3.622,111,3.425,112,1.944,164,2.333,198,3.176,213,4.027,230,2.424,256,3.407,259,3.284,280,2.102,290,2.911,339,2.636,342,3.906,348,4.151,357,3.078,359,3.407,393,5.749,468,3.906,525,4.718,554,3.71,556,3.284,602,3.546,720,4.139,1032,3.078,1073,5.409,1074,3.546,1075,2.907,1076,4.979,1077,6.595,1078,3.906,1079,3.284,1080,4.48,1081,4.979,1082,4.979,1083,6.204,1084,4.151,1085,2.989,1086,4.979,1087,4.979,1088,6.204,1089,3.71,1090,4.979,1091,4.979,1092,4.48,1093,4.979,1094,3.546]],["t/136",[17,1.401,45,3.649,106,2.658,181,2.737,183,2.822,284,7.192,290,2.96,333,4.334,338,4.374,343,4.797,524,3.285,551,5.499,581,3.712,1075,4.094,1095,7.011,1096,4.094,1097,5.845,1098,5.223]],["t/138",[3,2.346,4,3.762,5,2.23,45,2.809,56,2.768,106,2.727,108,3.435,126,2.287,165,3.573,181,2.809,183,2.896,288,4.745,554,5.36,700,3.991,1075,4.201,1099,7.194,1100,5.998,1101,7.194]],["t/140",[0,1.06,45,3.185,106,2.43,113,2.897,147,2.752,165,3.184,181,2.503,183,2.581,200,3.963,261,4.777,489,3.963,566,3.184,584,4.777,600,5.029,695,3.849,753,5.029,766,4.647,1075,3.744,1102,5.345,1103,6.411,1104,5.029,1105,3.963,1106,5.345,1107,5.769,1108,5.345,1109,4.777,1110,6.411,1111,5.769,1112,6.411,1113,6.411]],["t/142",[0,1.355,10,4.548,23,1.673,30,4.421,35,3.346,45,3.516,106,2.449,108,3.085,115,5.387,126,2.054,181,2.523,183,2.601,286,6.108,289,2.92,324,5.387,338,3.276,369,3.994,370,4.814,583,3.675,608,4.921,1075,3.773,1097,5.387,1098,4.814,1114,5.069,1115,5.069,1116,5.387]],["t/144",[0,1.323,5,1.927,17,1.242,45,3.123,108,2.969,115,5.184,170,3.552,171,3.027,178,3.733,233,2.914,270,2.503,289,2.81,308,3.552,325,4.429,343,4.254,369,3.844,494,4.877,505,5.96,517,5.184,551,4.877,568,4.235,608,3.733,679,2.503,863,4.254,1096,3.631,1098,4.633,1108,5.184,1117,3.966,1118,4.101,1119,6.218,1120,4.429]],["t/146",[0,1.211,45,3.719,106,2.776,118,6.105,127,5.744,181,2.859,183,2.947,290,3.091,293,3.792,524,3.431,1075,4.276,1118,4.83,1121,6.105,1122,6.105,1123,6.588]],["t/148",[11,2.529,25,1.555,45,3.107,265,3.874,386,7.16,686,4.919,1124,7.958,1125,7.958]],["t/150",[87,4.919,106,3.017,181,3.107,289,3.596,419,3.874,679,3.203,1071,5.075,1072,5.668]],["t/152",[0,1.358,4,2.297,5,2.009,11,1.117,23,1.386,25,1.267,28,4.019,42,3.213,44,1.647,45,3.207,56,1.352,100,2.052,108,3.459,112,1.372,113,1.588,145,2.242,183,1.415,198,3.413,210,1.509,250,2.757,270,1.415,280,1.484,286,3.987,289,2.418,293,2.772,295,3.213,309,2.154,338,2.713,339,1.861,357,3.308,369,3.308,420,2.503,424,2.318,448,2.93,490,4.815,497,2.93,502,2.11,505,2.619,549,4.198,555,2.173,565,3.987,581,1.861,583,1.999,600,4.198,610,2.757,635,2.619,678,2.619,686,2.173,700,1.95,701,3.987,740,2.405,766,1.82,793,2.318,804,2.405,843,2.242,931,2.757,1032,2.173,1052,2.405,1096,2.052,1109,2.619,1114,2.757,1118,4.275,1121,2.93,1123,3.163,1126,2.757,1127,4.815,1128,3.163,1129,2.969,1130,3.515,1131,2.318,1132,3.163,1133,3.515,1134,2.93,1135,2.405,1136,3.163,1137,3.515,1138,5.352,1139,2.318,1140,3.515,1141,2.318,1142,2.503,1143,3.163,1144,3.163,1145,3.515,1146,3.515,1147,2.757,1148,2.93,1149,2.757,1150,2.757,1151,3.515,1152,2.619,1153,4.198,1154,3.515,1155,2.052,1156,3.163,1157,3.515]],["t/154",[23,1.846,45,3.404,77,3.694,101,2.104,111,3.542,112,2.785,167,3.864,199,3.406,202,4.409,246,4.549,267,5.946,270,2.871,293,3.694,447,5.314,525,4.88,1126,5.594,1158,6.417,1159,5.314,1160,5.946]],["t/156",[15,5.733,17,1.853,175,3.734,183,2.775,289,3.115,361,2.733,385,3.495,437,3.356,810,4.397,1120,4.91,1150,5.407,1161,6.894,1162,6.894,1163,6.894,1164,7.733,1165,6.894,1166,5.747,1167,6.894]],["t/158",[0,1.457,5,2.467,17,1.233,25,1.206,28,3.424,45,3.108,105,2.446,219,3.196,230,3.005,265,3.005,289,3.597,293,3.196,309,2.484,339,3.267,442,4.528,524,2.892,700,3.424,707,4.396,735,3.51,748,2.892,1106,5.145,1120,4.396,1126,4.841,1135,4.222,1166,5.145,1168,3.815,1169,5.553,1170,6.171,1171,6.171,1172,5.145,1173,5.145,1174,6.171]],["t/160",[5,2.353,24,2.134,25,1.484,45,2.964,101,2.239,108,3.625,232,4.557,265,3.696,370,5.656,700,4.212,707,5.407,1173,6.329,1175,7.592]],["t/162",[0,1.304,5,1.884,17,1.215,21,4.77,45,3.615,109,3.083,169,3.373,188,3.219,214,4.16,270,3.174,301,3.294,343,4.16,353,2.526,431,2.903,432,3.373,442,4.485,445,3.878,482,2.7,488,4.53,537,4.16,552,4.011,557,5.201,695,3.65,716,2.96,1034,4.77,1096,3.55,1120,5.616,1139,4.011,1160,5.069,1176,5.069,1177,4.77,1178,6.08]],["t/164",[0,1.233,4,3.199,17,1.49,45,2.911,101,2.199,265,3.629,289,3.368,707,5.309,884,5.1,1120,5.309,1172,6.215,1173,6.215,1179,7.454,1180,7.454,1181,7.454]],["t/166",[0,0.899,23,2.144,25,1.618,45,3.611,77,2.817,106,2.062,112,2.124,113,2.458,155,2.259,171,2.648,176,4.894,181,2.124,183,2.189,207,2.092,209,2.502,290,2.296,293,2.817,309,2.189,338,2.757,339,2.88,343,3.721,449,4.894,478,3.721,505,5.457,524,2.549,537,3.721,566,2.701,608,3.265,740,3.721,848,3.176,863,3.721,1032,3.362,1075,3.176,1118,4.831,1128,4.894,1129,3.017,1144,4.894,1182,5.439,1183,5.439,1184,5.439,1185,5.439,1186,4.894,1187,4.052,1188,5.439,1189,5.439,1190,5.439]],["t/168",[5,1.464,15,4.108,23,1.223,25,1.299,28,2.62,32,1.715,42,2.835,45,1.844,98,1.817,104,2.446,106,1.79,145,3.012,155,1.962,181,1.844,183,1.901,198,3.012,200,2.919,220,2.919,280,1.994,293,2.446,309,1.901,321,1.931,326,3.704,338,3.369,339,2.5,442,3.78,505,3.518,524,3.603,565,4.951,679,1.901,700,4.879,712,3.235,765,3.518,804,3.231,822,2.686,848,2.758,1085,2.835,1102,5.541,1114,3.704,1118,5.072,1155,2.758,1156,4.249,1191,6.646,1192,6.646,1193,4.723,1194,4.723,1195,4.723,1196,4.249,1197,4.723,1198,4.249,1199,3.704,1200,3.704,1201,4.723,1202,3.937,1203,4.723,1204,3.937,1205,4.723,1206,4.723,1207,4.723,1208,2.758,1209,4.249,1210,4.723]],["t/170",[11,1.307,17,0.821,23,1.064,25,1.176,42,2.467,45,1.605,56,2.314,101,1.774,104,2.129,106,1.558,149,3.337,155,2.499,170,2.671,181,1.605,182,2.042,183,1.655,197,1.891,199,1.963,207,1.581,220,2.541,243,3.427,247,2.227,289,1.857,293,3.115,308,3.159,321,2.46,352,2.928,383,2.338,400,2.467,431,2.872,442,2.338,549,3.224,565,7.301,568,3.767,618,2.622,651,2.812,692,3.837,700,2.281,716,2.001,735,2.338,822,2.338,839,2.711,894,5.164,999,5.067,1118,4.693,1141,5.742,1143,5.412,1196,3.699,1199,3.224,1211,4.111,1212,4.111,1213,4.111,1214,5.412,1215,3.224,1216,3.427,1217,4.111,1218,2.928,1219,4.111,1220,4.111,1221,4.111,1222,4.111,1223,4.111,1224,4.111,1225,4.111,1226,4.111,1227,3.427]],["t/172",[106,3.017,181,3.107,289,3.596,431,3.8,565,5.929,999,5.668,1071,5.075,1072,5.668]],["t/174",[0,0.309,2,0.991,5,0.994,17,0.641,23,0.485,25,1.279,45,1.644,58,3.222,83,0.861,106,0.71,111,1.593,126,0.595,131,1.333,146,0.969,167,2.28,175,1.738,181,1.644,186,1.093,188,0.991,199,3.571,206,2.477,207,0.72,213,1.093,215,2.886,219,2.583,220,4.767,223,4.037,224,3.929,226,1.093,233,0.877,244,1.235,267,1.56,281,0.877,295,1.124,341,2.091,371,1.157,380,2.886,414,1.124,442,2.394,477,1.869,483,1.333,492,1.235,496,2.091,519,2.39,602,2.285,679,0.753,692,1.194,748,0.877,749,1.56,765,3.136,821,1.157,822,3.723,894,1.235,918,1.468,1024,3.302,1056,1.56,1057,1.394,1063,1.468,1078,1.468,1085,1.926,1088,1.684,1118,2.116,1126,1.468,1200,1.468,1228,1.684,1229,3.787,1230,1.872,1231,1.872,1232,3.208,1233,3.208,1234,3.208,1235,6.904,1236,1.872,1237,1.684,1238,1.872,1239,6.904,1240,4.678,1241,6.904,1242,6.904,1243,1.872,1244,1.872,1245,1.872,1246,1.872,1247,1.872,1248,1.872,1249,1.872,1250,1.872,1251,1.872,1252,1.872,1253,1.872,1254,1.872,1255,1.872,1256,1.872,1257,1.872,1258,4.209,1259,1.872,1260,1.872,1261,1.872,1262,1.872,1263,1.872,1264,1.872,1265,1.872,1266,1.872,1267,3.913,1268,3.208,1269,3.208,1270,2.886,1271,3.208,1272,1.873,1273,3.787,1274,1.872,1275,1.56,1276,3.302,1277,1.684,1278,1.684,1279,1.872,1280,1.872,1281,1.468,1282,1.394,1283,3.51,1284,1.684]],["t/176",[0,0.956,4,2.482,5,2.364,11,1.838,23,2.21,25,1.774,45,2.258,101,1.705,129,3.574,188,3.061,233,2.709,293,2.994,307,3.688,309,3.071,385,2.931,459,2.994,467,5.202,580,5.037,652,5.22,686,3.574,748,3.575,922,4.821,1118,5.032,1120,4.118,1141,3.814,1159,4.308,1285,4.308,1286,5.782,1287,5.782,1288,5.782,1289,4.716,1290,5.782,1291,4.535]],["t/178",[87,4.919,106,3.017,181,3.107,289,3.596,419,3.874,679,3.203,1071,5.075,1072,5.668]],["t/180",[87,4.919,106,3.017,181,3.107,289,3.596,419,3.874,679,3.203,1071,5.075,1072,5.668]],["t/182",[0,1.342,111,4.03,250,6.365,552,5.352,603,4.03,1075,4.738]],["t/184",[17,1.606,23,1.622,24,1.761,42,3.761,77,3.245,98,3.414,105,2.484,121,5.637,174,4.462,209,3.698,249,4.286,273,3.476,282,4.668,337,5.989,338,4.075,348,5.223,437,3.05,444,5.637,482,2.782,603,4.408,752,4.668,1129,3.476,1141,4.133,1155,3.658,1292,5.637,1293,6.265,1294,6.265,1295,4.914]],["t/186",[0,1.267,11,2.436,17,1.164,24,1.637,25,1.498,35,3.969,56,2.24,210,2.499,247,3.154,273,3.23,337,4.338,338,3.886,353,2.419,603,4.522,679,3.085,752,5.71,753,4.568,774,4.568,942,6.103,956,3.841,1141,3.841,1142,4.147,1155,4.476,1296,5.239,1297,7.665,1298,5.239,1299,4.338,1300,5.823,1301,5.823,1302,5.823,1303,4.855,1304,4.855]],["t/188",[13,1.728,14,4.289,17,1.237,23,1.952,25,1.21,30,2.233,31,1.857,40,2.153,48,2.9,52,2.619,56,1.256,62,3.46,71,2.018,88,2.722,108,1.559,111,1.621,113,1.475,169,1.811,181,1.974,199,1.559,209,2.326,212,3.966,243,2.722,245,2.018,280,1.378,300,1.96,301,1.768,314,3.205,329,3.335,332,4.408,338,3.138,341,1.621,345,4.597,353,2.101,354,1.96,357,2.018,361,2.004,365,2.432,370,2.432,431,2.414,432,1.811,437,1.589,459,1.691,485,2.937,514,2.153,521,2.153,524,1.53,543,2.722,558,2.937,566,1.621,581,2.677,587,3.767,592,1.559,603,3.961,627,2.722,653,2.722,720,1.96,722,2.018,725,2.677,779,2.233,804,2.233,844,3.335,1069,4.993,1083,2.937,1109,3.767,1147,2.561,1202,2.722,1305,4.93,1306,2.937,1307,3.264,1308,3.264,1309,3.264,1310,3.264,1311,2.937,1312,3.264,1313,3.264,1314,2.722,1315,2.937,1316,2.937,1317,2.432,1318,2.561,1319,5.16,1320,3.264,1321,3.264,1322,2.937,1323,7.54,1324,2.722,1325,3.264,1326,3.264,1327,3.264,1328,3.264,1329,3.264,1330,2.325,1331,4.855,1332,2.722,1333,3.264]],["t/190",[16,4.117,23,1.048,25,0.792,48,1.898,52,2.097,58,2.954,97,2.583,108,1.934,112,2.323,113,1.83,148,2.431,155,1.682,168,2.885,170,1.798,183,1.63,262,3.177,274,3.377,301,2.194,321,2.433,329,2.671,345,3.925,383,2.304,388,3.678,419,1.972,546,3.377,587,3.017,679,2.395,695,2.431,723,3.177,725,2.144,1096,2.365,1102,4.961,1129,2.247,1208,2.365,1305,2.503,1331,5.533,1332,7.462,1334,6.347,1335,7.452,1336,4.05,1337,2.885,1338,4.05,1339,4.05,1340,4.05,1341,4.05,1342,7.054,1343,4.05,1344,4.05,1345,4.668,1346,4.668,1347,4.05,1348,3.377,1349,3.644,1350,5.95,1351,3.644,1352,2.671,1353,4.05,1354,5.95,1355,4.05,1356,3.377,1357,4.05,1358,4.05,1359,3.644,1360,3.644,1361,3.017]],["t/192",[10,2.697,17,1.355,23,1.259,36,2.463,42,2.918,62,5.782,108,2.321,128,2.918,160,3.207,161,2.415,183,1.957,187,2.697,207,1.87,281,2.278,301,2.634,332,3.463,369,3.005,373,3.326,414,2.918,431,4.036,487,7.411,522,2.839,542,3.622,554,3.622,635,3.622,678,3.622,679,3.402,793,3.207,842,3.101,1069,5.672,1282,3.622,1299,3.622,1318,3.814,1362,4.862,1363,3.622,1364,4.862,1365,4.862,1366,6.102,1367,4.862,1368,7.811,1369,3.622,1370,4.862,1371,4.862,1372,4.374,1373,4.862,1374,5.655,1375,4.374,1376,4.862,1377,4.374]],["t/194",[14,1.999,17,0.702,23,1.386,25,1.046,31,4.435,32,1.944,36,3.196,58,1.959,60,3.163,62,4.957,71,4.006,99,3.213,108,1.678,111,1.746,112,2.09,169,2.969,188,1.861,206,1.746,207,1.352,212,2.757,230,1.711,247,1.904,280,1.484,281,2.508,290,1.484,307,4.972,314,1.82,339,1.861,345,4.779,361,1.393,402,2.93,409,2.405,424,2.318,429,2.503,431,2.555,437,1.711,537,2.405,566,1.746,569,3.784,587,2.619,603,1.746,692,2.242,720,3.89,753,2.757,779,3.662,799,5.398,883,2.052,1069,3.213,1071,3.413,1079,2.318,1096,2.052,1104,2.757,1105,2.173,1299,2.619,1314,5.403,1318,2.757,1330,2.503,1332,6.848,1334,4.815,1335,5.831,1360,3.163,1361,2.619,1363,2.619,1378,3.515,1379,3.515,1380,5.352,1381,2.757,1382,3.515,1383,3.515,1384,2.93,1385,3.515,1386,3.163,1387,2.405,1388,7.245,1389,4.434,1390,3.515,1391,3.515,1392,3.515,1393,3.515,1394,2.619]],["t/196",[0,1.526,11,1.919,15,3.731,16,2.777,17,1.206,23,2.477,59,3.27,87,3.731,114,4.13,159,4.353,199,2.882,332,5.589,339,3.196,414,3.623,434,4.13,445,3.85,566,2.998,595,3.897,679,2.43,695,3.623,716,2.939,766,3.126,1071,3.85,1096,3.525,1105,3.731,1129,3.349,1395,4.13,1396,5.431,1397,6.155,1398,4.299]],["t/198",[0,1.064,11,2.046,16,3.452,17,1.286,19,3.759,21,3.542,23,1.169,25,0.883,31,4.268,32,2.338,36,1.64,58,1.365,99,2.711,105,1.79,159,2.505,164,2.116,168,4.586,200,2.791,206,2.243,209,3.452,210,2.763,247,2.446,251,2.791,280,1.906,320,2.88,332,5.344,419,3.134,437,2.198,498,2.979,521,2.979,522,2.637,524,2.116,569,4.381,589,2.637,595,3.726,645,3.216,725,3.972,799,3.364,1094,3.216,1104,3.542,1105,2.791,1208,2.637,1285,4.797,1366,4.063,1389,3.089,1399,5.885,1400,3.765,1401,3.216,1402,4.516,1403,4.516,1404,4.516,1405,4.516,1406,4.405,1407,5.05,1408,4.516,1409,3.364,1410,4.516,1411,4.516,1412,4.063,1413,4.516]],["t/200",[19,1.844,23,1.276,24,1.56,25,0.617,31,2.362,32,1.147,36,1.508,52,0.952,58,1.832,71,1.136,78,1.213,104,0.952,111,0.913,116,1.309,120,1.136,129,5.4,147,0.789,159,1.752,164,1.48,168,2.958,169,1.02,186,1.073,213,2.425,214,1.258,249,1.258,276,0.932,281,0.861,295,1.103,327,1.309,357,1.136,361,0.729,385,0.932,419,0.895,424,1.213,445,1.172,459,0.952,488,1.37,498,1.213,510,1.136,524,1.48,537,1.258,569,2.425,592,0.878,595,1.569,679,1.271,720,1.103,766,0.952,810,2.015,883,1.073,1003,1.309,1032,1.136,1066,1.213,1079,1.213,1089,1.37,1094,1.309,1098,6.334,1104,1.442,1105,1.136,1135,2.161,1141,1.213,1153,1.442,1208,1.073,1389,2.161,1399,3.258,1400,1.533,1406,1.258,1409,7.263,1412,1.654,1414,1.442,1415,1.442,1416,1.654,1417,1.533,1418,1.838,1419,1.654,1420,1.838,1421,1.838,1422,3.737,1423,1.654,1424,1.442,1425,2.842,1426,1.37,1427,1.654,1428,1.37,1429,1.838,1430,8.624,1431,9.82,1432,1.838,1433,7.86,1434,8.367,1435,1.654,1436,1.838,1437,1.838,1438,1.838,1439,2.842,1440,1.838,1441,1.838,1442,1.838,1443,1.838,1444,1.838,1445,1.838,1446,3.159,1447,1.838,1448,1.838,1449,8.367,1450,8.502,1451,1.838,1452,1.838,1453,1.838,1454,1.838,1455,1.838,1456,1.838,1457,1.838,1458,1.838,1459,1.838,1460,1.838,1461,1.838,1462,1.838,1463,1.838,1464,1.838,1465,1.838,1466,1.838,1467,1.838,1468,1.838,1469,1.838,1470,1.838,1471,1.838,1472,1.838,1473,1.838,1474,1.838,1475,1.838,1476,1.838,1477,1.838,1478,1.838,1479,1.838,1480,1.838,1481,1.838,1482,1.838]],["t/202",[17,0.995,19,1.869,23,1.785,24,0.9,30,2.19,31,1.821,33,2.137,36,2.22,45,1.25,58,0.968,88,2.669,89,2.511,104,1.658,106,1.213,111,2.473,116,2.28,148,1.922,154,4.765,155,1.33,164,1.5,169,1.776,174,3.547,177,2.28,188,1.695,199,2.919,202,1.979,207,1.231,210,1.374,213,3.569,230,1.558,233,1.5,237,2.111,238,1.213,246,2.042,309,1.289,312,1.979,321,1.309,359,2.19,361,2.962,363,2.042,369,1.979,373,2.19,378,2.19,402,5.75,418,2.579,419,1.558,459,1.658,472,3.778,518,3.407,569,1.869,572,2.19,645,2.28,654,3.71,660,2.28,679,2.005,710,1.979,928,2.511,1084,4.152,1098,3.71,1105,3.078,1134,2.669,1285,4.554,1311,2.88,1330,2.28,1346,2.511,1352,2.111,1397,2.511,1399,5.41,1406,4.182,1416,2.88,1419,5.5,1422,4.481,1483,6.113,1484,6.113,1485,2.511,1486,3.201,1487,3.201,1488,2.88,1489,4.98,1490,2.88,1491,4.98,1492,3.201,1493,2.88,1494,3.201,1495,3.201,1496,4.98,1497,4.98,1498,3.201,1499,3.201,1500,3.201,1501,3.201,1502,2.669,1503,4.481,1504,4.98,1505,2.88,1506,4.98,1507,4.98,1508,3.201,1509,3.201,1510,3.201,1511,3.201,1512,2.19,1513,3.201,1514,2.669,1515,3.201,1516,3.201,1517,2.88]],["t/204",[34,6.362,56,2.72,210,3.035,236,5.895,321,3.546,421,5.268,434,4.838,472,4.371,679,2.846,725,3.744,766,3.662,843,4.51,1084,5.895,1305,4.371,1397,5.547,1518,5.547,1519,5.547,1520,7.071,1521,7.071,1522,7.071]],["t/206",[8,4.397,16,3.928,48,3.23,86,4.261,98,2.652,265,3.356,270,2.775,276,3.495,364,5.136,442,3.921,488,5.136,656,5.136,871,5.136,1409,5.136,1519,5.407,1523,6.894,1524,6.697,1525,5.747,1526,6.894,1527,4.91,1528,6.203,1529,6.894]],["t/208",[102,4.781,238,2.932,265,3.765,413,6.067,423,5.509,1517,6.959,1530,7.734,1531,7.734,1532,6.959,1533,7.734,1534,5.762]],["t/210",[11,1.8,17,1.132,25,1.107,31,4.28,36,2.057,52,2.933,58,2.555,106,2.147,170,2.514,230,2.757,237,4.963,379,5.606,424,3.735,551,4.442,566,2.813,568,2.998,569,4.394,702,4.442,795,5.903,1109,4.219,1142,4.033,1270,5.095,1389,3.874,1409,4.219,1485,4.442,1535,5.663,1536,5.663,1537,5.663,1538,5.663,1539,4.721,1540,7.525,1541,7.525,1542,5.663,1543,5.663,1544,7.525,1545,5.663,1546,5.663,1547,5.095,1548,5.663,1549,5.663]],["t/215",[187,3.825,207,2.652,321,2.819,379,5.136,802,5.136,1032,4.261,1209,6.203,1305,4.261,1397,6.697,1398,4.91,1502,5.747,1519,5.407,1550,6.894,1551,6.894,1552,6.894,1553,6.894,1554,6.894,1555,6.894,1556,6.894,1557,6.894,1558,6.203,1559,6.894,1560,6.894]],["t/217",[1519,6.694]],["t/219",[702,6.183,1561,7.882,1562,7.882,1563,7.882,1564,7.882,1565,7.882,1566,7.882,1567,7.882,1568,7.882]],["t/221",[1569,8.195,1570,8.195,1571,8.195,1572,8.195,1573,8.195]],["t/224",[17,1.136,25,1.111,43,2.428,44,1.784,56,1.465,71,4.204,77,1.972,89,4.458,99,2.285,106,1.443,109,3.824,154,2.428,155,1.581,160,2.511,188,2.016,197,1.751,199,1.818,207,2.187,230,1.853,280,1.607,290,2.4,338,1.93,353,1.581,355,2.353,359,2.605,431,2.714,432,2.112,438,2.712,489,2.353,492,2.511,499,4.235,502,2.285,522,2.223,545,3.174,595,3.378,679,1.532,695,2.285,710,2.353,720,4.845,725,2.016,777,3.425,779,6.002,799,2.836,802,5.62,860,3.625,1067,3.425,1069,5.719,1075,2.223,1115,2.986,1155,2.223,1322,3.425,1363,4.235,1387,3.889,1389,2.605,1394,2.836,1426,2.836,1534,4.235,1574,6.518,1575,3.174,1576,2.605,1577,2.836,1578,3.807,1579,2.986,1580,4.739,1581,3.807,1582,5.114,1583,3.807,1584,3.425]],["t/226",[17,0.847,25,1.774,30,2.899,32,1.539,43,3.922,52,2.194,71,2.619,83,2.829,106,1.606,111,2.104,112,1.654,120,2.619,167,2.295,170,1.881,175,3.332,207,1.63,214,2.899,230,2.063,280,1.789,321,1.733,323,2.702,329,2.795,357,2.619,369,3.802,377,3.324,431,2.937,476,3.018,499,3.157,514,2.795,531,2.702,666,2.474,679,1.706,702,4.824,710,2.619,720,3.692,725,2.243,811,3.591,883,2.474,919,4.057,1002,3.324,1069,4.346,1073,3.324,1092,3.813,1115,4.824,1129,2.351,1139,2.795,1153,3.324,1155,3.591,1208,2.474,1282,3.157,1305,2.619,1363,3.157,1389,4.953,1396,6.514,1400,3.533,1512,2.899,1534,3.157,1574,5.771,1585,3.813,1586,3.533,1587,3.813,1588,4.237,1589,7.239,1590,4.237,1591,4.237,1592,3.533,1593,4.824,1594,4.237,1595,4.237]],["t/228",[0,0.905,1,2.01,11,1.152,17,1.094,27,1.876,36,1.316,37,2.931,44,1.698,99,3.287,108,1.73,109,1.837,119,2.842,149,3.038,154,2.311,171,1.764,172,3.26,175,3.986,198,2.311,199,1.73,205,2.311,206,2.72,207,2.107,230,2.666,232,3.963,237,2.39,245,3.385,248,2.842,282,2.699,308,1.609,312,2.24,353,1.505,354,2.175,361,1.436,362,2.479,382,3.115,385,2.776,431,2.615,469,4.566,489,2.24,496,1.799,524,2.566,568,1.918,592,1.73,603,1.799,712,1.764,723,2.842,792,2.899,793,2.39,859,2.479,1069,5.333,1085,2.175,1131,2.39,1147,2.842,1155,2.116,1204,3.021,1208,2.116,1285,2.699,1289,2.24,1303,3.021,1304,3.021,1305,2.24,1324,3.021,1389,2.479,1439,3.26,1512,2.479,1574,5.904,1579,2.842,1596,3.26,1597,3.26,1598,3.623,1599,3.26,1600,3.26,1601,3.623,1602,3.623,1603,5.476,1604,3.623,1605,3.623,1606,5.476,1607,6.602,1608,5.476,1609,3.623,1610,3.623,1611,3.623,1612,3.623,1613,2.842,1614,3.26,1615,3.26,1616,2.58,1617,3.26,1618,5.476,1619,3.26,1620,3.623]],["t/230",[0,0.876,1,4.534,17,1.059,23,1.372,25,1.406,33,3.089,44,2.483,56,2.039,71,3.276,104,2.744,113,2.394,233,2.483,290,2.237,293,2.744,300,3.181,333,3.276,345,4.747,422,4.157,423,3.774,434,3.625,704,7.887,826,4.59,941,4.157,1069,3.181,1096,3.094,1105,3.276,1177,4.157,1273,4.768,1303,4.418,1304,6,1316,4.768,1398,3.774,1534,3.948,1600,4.768,1621,4.768,1622,5.299,1623,5.299,1624,7.197,1625,5.299,1626,5.299,1627,4.768,1628,5.299,1629,5.299,1630,5.299,1631,4.768,1632,4.157,1633,5.299,1634,5.299,1635,5.299]],["t/232",[0,0.469,2,1.502,11,0.902,43,1.81,71,3.988,106,1.076,108,1.355,114,1.941,120,3.988,154,1.81,188,2.398,199,2.163,200,1.754,204,3.867,205,1.81,206,3.204,207,2.174,209,1.305,233,1.33,261,2.114,276,1.439,280,1.198,321,2.638,327,2.021,335,1.941,338,2.296,354,1.703,357,2.8,363,1.81,366,4.712,368,2.114,418,1.47,420,2.021,424,3.728,429,2.021,431,1.355,434,1.941,437,2.205,438,2.021,489,1.754,519,2.114,522,1.657,523,2.366,524,1.33,539,2.114,555,1.754,556,4.65,584,2.114,595,1.409,645,2.021,695,2.719,712,1.381,720,5.558,725,1.502,731,2.553,734,3.776,843,3.605,883,2.645,901,6.265,931,4.433,1077,2.366,1079,1.872,1085,1.703,1089,2.114,1096,3.3,1109,3.374,1127,2.553,1129,1.574,1131,1.872,1152,2.114,1155,2.645,1272,3.767,1305,1.754,1356,2.366,1384,2.366,1387,1.941,1395,1.941,1424,2.226,1425,2.553,1512,5.776,1514,3.776,1577,6.102,1579,3.553,1587,4.075,1593,4.433,1636,4.529,1637,4.529,1638,2.838,1639,2.838,1640,2.838,1641,2.226,1642,2.838,1643,2.838,1644,2.553,1645,2.838,1646,2.226,1647,2.838,1648,2.838,1649,2.838,1650,2.838,1651,2.838,1652,2.553,1653,4.712,1654,2.838,1655,2.838,1656,2.838,1657,2.838,1658,2.226,1659,2.838,1660,2.838]],["t/234",[0,0.506,13,1.619,14,1.74,16,1.407,17,1.344,20,2.279,31,1.74,33,1.313,36,1.111,52,1.584,56,1.177,59,1.657,71,4.52,77,1.584,89,2.399,109,3.01,167,2.603,170,2.134,174,2.179,187,2.666,188,1.619,198,1.951,199,1.46,210,1.313,237,3.916,247,1.657,270,1.231,289,2.172,320,1.951,321,1.965,328,2.279,332,3.423,338,1.551,339,1.619,353,1.271,361,1.905,362,2.093,431,2.295,438,3.423,459,1.584,482,1.358,489,1.891,513,2.55,521,3.17,522,1.786,524,2.782,525,2.093,568,1.619,569,1.786,583,1.74,594,2.752,595,1.519,600,2.399,603,2.387,618,1.951,648,2.179,692,1.951,720,1.836,725,3.872,779,3.288,804,2.093,825,3.17,844,2.018,883,1.786,1069,3.564,1071,1.951,1079,2.018,1105,1.891,1117,1.951,1129,2.666,1131,2.018,1134,2.55,1200,2.399,1285,2.279,1299,2.279,1305,4.798,1319,2.55,1324,4.949,1330,2.179,1331,2.399,1398,2.179,1490,2.752,1518,2.399,1574,4.062,1577,3.581,1580,5.609,1582,2.752,1592,2.55,1621,2.752,1661,3.059,1662,5.937,1663,2.55,1664,3.059,1665,5.937,1666,5.783,1667,2.752,1668,2.752,1669,2.752,1670,4.007,1671,4.949,1672,2.399,1673,3.059,1674,3.059,1675,3.059,1676,3.059,1677,3.059,1678,2.752,1679,4.324,1680,3.059,1681,3.059,1682,3.059,1683,2.752,1684,2.752,1685,3.059]],["t/236",[0,1.069,2,1.508,10,1.58,11,0.905,13,3.739,14,1.62,16,3.462,17,0.907,23,0.737,24,1.276,25,1.694,32,2.057,36,1.649,58,3.177,59,1.542,98,1.095,104,1.475,109,1.444,148,1.709,165,1.414,170,1.264,206,1.414,207,1.095,208,2.234,209,1.31,210,1.222,265,2.758,276,2.302,314,3.657,317,2.234,355,2.807,361,1.129,385,2.302,397,2.562,419,1.386,437,1.386,459,1.475,510,1.76,531,1.816,580,1.58,581,1.508,603,4.304,628,2.028,656,3.383,660,2.028,712,1.386,771,1.948,779,1.948,1078,5.071,1114,2.234,1135,1.948,1155,1.663,1299,2.121,1319,4.723,1345,2.234,1363,2.121,1381,4.443,1395,3.107,1406,3.107,1407,3.562,1426,2.121,1524,5.071,1527,3.235,1666,3.235,1686,2.847,1687,2.374,1688,2.374,1689,2.374,1690,2.847,1691,2.847,1692,2.847,1693,3.107,1694,2.847,1695,2.847,1696,2.562,1697,2.847,1698,2.847,1699,2.847,1700,4.541,1701,2.847,1702,2.847,1703,2.847,1704,2.847,1705,2.847,1706,2.847,1707,2.847,1708,3.562,1709,2.847]],["t/238",[0,1.013,11,1.34,24,2.029,25,1.197,32,1.531,36,2.225,58,3.217,78,2.781,129,2.606,160,2.781,161,2.094,186,2.462,213,2.462,223,2.781,238,2.323,247,2.284,286,3.141,321,1.724,377,4.806,385,2.137,472,2.606,493,3.141,679,2.466,722,2.606,883,2.462,1003,3.003,1007,3.307,1069,2.531,1135,2.884,1208,2.462,1317,3.141,1374,6.018,1381,3.307,1398,3.003,1414,3.307,1415,3.307,1417,3.515,1527,3.003,1574,2.884,1666,3.003,1687,3.515,1688,3.515,1710,3.793,1711,4.216,1712,3.793,1713,3.793,1714,3.793,1715,3.515,1716,3.793,1717,3.515,1718,3.793,1719,3.793,1720,6.495,1721,3.515,1722,3.793,1723,3.307,1724,3.793,1725,3.793]],["t/240",[0,0.712,2,1.021,10,1.07,11,0.613,16,1.514,17,0.86,21,1.513,23,1.61,24,1.21,25,0.643,26,1.07,32,1.195,36,1.195,52,0.999,58,3.055,59,1.045,78,1.272,98,0.742,104,0.999,108,1.571,109,0.978,128,2.584,129,2.661,155,1.367,168,1.374,170,0.856,183,1.325,186,2.514,187,2.388,196,1.126,204,1.319,205,2.099,207,0.742,209,1.514,213,1.922,223,2.171,224,1.158,230,0.939,236,1.608,238,1.248,270,1.325,276,0.978,321,2.08,338,0.978,353,0.801,354,1.158,361,0.765,377,1.513,385,0.978,414,1.158,418,0.999,419,0.939,434,1.319,437,0.939,438,2.344,445,1.23,469,1.608,472,2.034,489,2.034,493,1.437,517,1.608,552,1.272,566,0.958,568,1.021,587,1.437,588,1.735,589,2.514,591,1.513,641,1.608,648,1.374,679,2.94,692,2.745,728,1.272,774,1.513,883,3.632,1003,1.374,1007,2.581,1057,1.437,1066,1.272,1069,3.734,1070,1.374,1077,1.608,1096,1.126,1131,1.272,1135,1.319,1142,1.374,1148,1.608,1199,1.513,1204,1.608,1214,1.735,1240,2.744,1272,1.126,1351,1.735,1352,1.272,1359,2.961,1374,2.744,1377,5.14,1381,1.513,1387,2.252,1398,1.374,1399,1.513,1406,2.945,1407,2.581,1409,1.437,1414,1.513,1415,1.513,1417,1.608,1488,1.735,1512,1.319,1527,1.374,1534,1.437,1574,3.481,1577,1.437,1580,2.744,1658,1.513,1663,1.608,1666,5.699,1670,1.608,1683,1.735,1687,1.608,1688,1.608,1689,1.608,1710,1.735,1712,1.735,1713,1.735,1714,1.735,1715,2.744,1716,1.735,1719,1.735,1720,5.14,1721,1.608,1722,3.873,1723,3.377,1724,2.961,1725,1.735,1726,3.291,1727,1.929,1728,1.929,1729,1.929,1730,1.929,1731,1.929,1732,1.929,1733,3.291,1734,1.929,1735,1.437,1736,1.929,1737,1.929,1738,1.929,1739,1.513,1740,5.088,1741,7,1742,1.929,1743,1.735,1744,1.929,1745,1.929,1746,1.929,1747,1.929,1748,3.291,1749,3.291,1750,1.929,1751,3.291,1752,1.929,1753,1.929,1754,3.291,1755,1.929,1756,3.291,1757,3.291,1758,1.929,1759,1.929,1760,1.929,1761,1.929,1762,1.513,1763,1.929,1764,1.608]],["t/242",[16,4.075,58,2.879,419,3.565,1406,6.061,1407,7.763,1666,5.215,1671,7.386,1689,6.105,1765,7.322]],["t/244",[2,2.088,10,1.328,13,2.664,14,2.243,16,3.195,17,0.478,32,0.869,58,3.176,77,1.239,87,1.479,108,2.402,155,0.994,170,2.234,197,1.101,199,1.143,207,1.517,209,2.315,268,1.877,270,0.963,274,6.399,276,3.272,314,1.239,321,0.978,355,1.479,357,1.479,359,1.637,362,1.637,383,1.361,445,1.526,460,3.094,482,2.591,489,1.479,496,1.189,514,2.602,656,2.939,660,2.809,679,0.963,723,1.877,725,2.088,810,1.526,1027,1.783,1066,3.319,1078,3.947,1085,1.436,1129,1.328,1139,1.578,1149,1.877,1153,1.877,1305,1.479,1306,4.527,1331,1.877,1337,1.704,1346,1.877,1348,1.995,1349,2.153,1352,1.578,1387,1.637,1395,1.637,1406,2.698,1524,4.577,1525,3.288,1527,4.156,1585,5.807,1666,1.704,1667,7.157,1671,1.995,1708,1.877,1766,2.393,1767,3.944,1768,1.877,1769,2.393,1770,1.877,1771,2.393,1772,2.393,1773,5.031,1774,2.153,1775,3.944,1776,5.031,1777,2.393,1778,2.393,1779,2.393,1780,2.393,1781,5.031,1782,2.393,1783,2.393,1784,2.393,1785,2.393,1786,5.835,1787,2.393,1788,2.393,1789,2.393,1790,2.393,1791,2.393,1792,3.944,1793,3.944,1794,3.944,1795,3.944,1796,5.835,1797,5.835,1798,2.393,1799,5.835,1800,2.393,1801,2.393,1802,2.393,1803,5.031,1804,2.393,1805,2.393,1806,2.393]],["t/246",[42,4.731,44,3.693,46,6.571,84,4.373,451,5.872,522,4.602,583,4.483,1282,5.872,1584,7.092]],["t/248",[0,1.13,48,3.98,123,4.251,161,4.218,170,3.035,175,3.703,275,8.314,294,4.677,314,3.541,383,3.889,502,5.802,804,4.677,1282,5.093,1807,5.7,1808,4.869,1809,6.837]],["t/251",[0,1.279,14,3.36,15,3.651,19,3.449,24,1.66,25,1.512,56,2.272,71,3.651,78,5.691,112,3.021,155,2.454,175,3.199,202,3.651,270,2.378,293,3.059,294,4.041,335,4.041,525,4.041,860,3.767,1003,5.51,1129,3.277,1164,4.924,1186,5.314,1208,3.449,1215,4.633,1292,5.314,1298,6.961,1337,4.207,1414,6.069,1415,4.633,1512,4.041,1574,5.293,1708,4.633,1810,5.906,1811,4.633]],["t/253",[0,1.374,32,1.988,36,1.988,40,3.611,48,3.447,58,1.655,120,3.384,144,3.9,159,3.037,204,3.746,214,3.746,247,2.966,268,4.295,282,6.905,293,3.81,333,3.384,341,3.654,363,3.492,373,3.746,394,3.746,409,3.746,418,2.835,459,3.81,460,4.295,521,3.611,525,5.033,539,4.079,1356,4.565,1485,6.518,1808,3.9,1812,5.475,1813,5.475,1814,5.475,1815,5.475,1816,5.475,1817,5.475,1818,5.475,1819,5.475,1820,5.475,1821,5.475,1822,5.475,1823,5.475]],["t/256",[0,0.882,1,2.959,2,2.824,3,2.866,9,3.974,17,1.066,44,3.387,78,3.518,84,2.959,93,3.401,108,2.547,117,3.974,124,3.799,126,1.695,154,3.401,207,2.052,303,3.518,353,2.216,394,3.649,524,2.499,557,3.518,686,3.297,745,5.385,823,4.339,1006,3.649,1237,4.799,1291,4.184,1824,5.333,1825,5.333,1826,3.799,1827,4.184,1828,4.799,1829,4.447,1830,5.333,1831,5.333,1832,5.333,1833,5.333,1834,5.333,1835,5.333,1836,5.333,1837,4.799,1838,4.799,1839,5.333,1840,5.333,1841,5.333,1842,5.333,1843,5.333,1844,5.333,1845,5.333,1846,5.333,1847,5.333,1848,5.333,1849,5.333]],["t/258",[3,1.389,10,2.363,101,2.681,106,1.615,108,2.034,113,1.925,126,1.962,165,2.115,270,1.714,327,3.034,329,2.809,340,3.341,368,3.173,420,3.034,432,2.363,433,4.397,452,2.716,476,3.034,477,3.913,499,3.173,625,3.341,635,3.173,750,2.159,766,2.206,807,3.341,819,4.223,840,2.809,868,4.397,881,3.173,885,3.173,1006,5.447,1052,2.914,1089,3.173,1100,3.551,1117,2.716,1272,3.605,1283,5.147,1512,2.914,1613,3.341,1652,3.832,1669,3.832,1850,5.932,1851,6.053,1852,3.551,1853,3.832,1854,3.832,1855,4.259,1856,4.259,1857,3.832,1858,5.554,1859,4.259,1860,4.259,1861,3.341,1862,4.259,1863,3.551,1864,4.397,1865,4.259,1866,4.259,1867,3.341,1868,4.259,1869,3.832,1870,3.173,1871,4.259,1872,4.259,1873,4.259,1874,4.259,1875,2.914,1876,4.259,1877,3.832,1878,4.259,1879,4.259]],["t/260",[0,1.112,5,2.605,11,2.138,24,2.363,25,1.643,44,3.151,92,5.607,111,4.175,167,3.643,281,3.151,496,3.34,618,4.289,627,5.607,1111,6.051,1150,5.275,1272,3.927,1770,5.275,1880,6.051,1881,6.051,1882,6.051,1883,6.051,1884,6.051,1885,6.051]],["t/262",[0,0.651,3,1.637,4,2.977,5,2.705,7,3.281,8,1.522,10,2.183,11,0.758,25,0.981,44,1.118,48,1.844,56,1.514,84,1.324,92,1.989,98,0.918,100,2.298,101,1.161,105,0.946,106,0.905,111,1.185,126,2.332,146,2.038,147,2.155,159,1.324,161,1.185,165,1.185,169,1.324,206,1.185,223,1.574,226,2.298,228,1.778,233,1.118,237,2.595,238,0.905,270,0.961,280,1.661,294,1.632,303,1.574,304,1.522,321,0.976,323,2.509,325,1.699,327,1.699,353,0.991,354,1.432,356,1.699,373,1.632,378,3.435,382,1.357,408,1.778,437,1.162,442,2.238,522,1.393,524,1.118,545,1.989,549,1.872,557,1.574,585,1.872,590,2.147,591,1.872,592,1.139,608,1.432,617,1.872,618,1.522,648,1.699,679,1.584,692,1.522,700,1.324,716,1.162,728,1.574,746,1.574,748,1.118,771,1.632,807,1.872,822,1.357,839,1.574,1017,1.989,1036,1.872,1060,2.803,1085,2.362,1096,1.393,1117,1.522,1132,2.147,1150,1.872,1158,2.147,1200,1.872,1272,1.393,1276,5.055,1289,3.104,1296,2.147,1394,1.778,1435,2.147,1525,3.281,1558,2.147,1614,2.147,1616,4.149,1735,1.778,1739,1.872,1768,3.086,1770,1.872,1808,1.699,1827,1.872,1864,1.699,1870,2.931,1875,1.632,1877,3.54,1880,2.147,1881,5.241,1882,2.147,1883,2.147,1884,2.147,1885,2.147,1886,3.281,1887,1.989,1888,2.386,1889,1.872,1890,2.386,1891,2.386,1892,2.386,1893,2.386,1894,3.935,1895,2.386,1896,2.386,1897,2.147,1898,2.386,1899,2.147,1900,2.386,1901,2.386,1902,2.386,1903,2.386,1904,2.386,1905,2.386,1906,3.935,1907,3.935,1908,2.386,1909,1.699,1910,2.386,1911,1.989,1912,2.386,1913,2.147,1914,3.935,1915,2.386,1916,2.386,1917,2.386,1918,2.147,1919,2.386,1920,2.386,1921,3.935,1922,2.386,1923,2.147,1924,2.386,1925,2.147,1926,2.386,1927,2.147,1928,2.386,1929,1.989,1930,2.386,1931,2.386,1932,2.386,1933,2.386,1934,2.386,1935,2.386,1936,5.021,1937,2.386,1938,2.386,1939,2.386,1940,2.386,1941,2.386,1942,2.386,1943,2.386,1944,2.386,1945,2.386,1946,2.386,1947,2.147,1948,2.147,1949,2.386,1950,2.386,1951,2.386,1952,2.386]],["t/264",[3,3.133,4,2.886,56,2.587,87,4.157,226,3.927,1176,5.607,1668,6.051,1837,6.051,1838,6.051,1953,6.725,1954,6.725,1955,6.725,1956,6.725,1957,6.725,1958,6.725,1959,6.725,1960,6.725,1961,6.725,1962,6.725,1963,6.725,1964,6.725,1965,6.725,1966,6.725,1967,6.725]],["t/266",[23,2.187,867,5.387]],["t/268",[0,1.316,23,2.06,126,2.959,814,5.435,867,5.937]],["t/270",[0,0.533,3,1.052,4,1.385,17,0.645,24,0.907,25,0.631,26,2.78,32,1.172,49,1.937,66,2.128,98,1.241,102,1.994,112,1.956,126,1.953,128,4.972,141,2.128,147,1.385,148,1.937,182,3.051,196,2.926,197,3.186,199,1.54,213,1.884,224,1.937,238,1.223,244,2.128,254,2.128,255,2.298,256,5.43,270,2.017,290,3.924,308,1.432,341,2.488,361,2.973,385,1.636,459,1.671,477,3.33,482,1.432,569,2.926,580,4.595,581,2.653,589,2.926,603,3.051,612,4.933,722,1.994,733,4.203,748,1.512,810,3.196,811,5.427,812,2.404,813,2.128,814,1.884,815,2.404,816,2.298,817,2.404,818,2.404,819,4.203,820,2.404,821,4.281,822,2.85,823,1.937,826,2.058,832,1.994,850,3.733,851,2.298,852,3.733,853,2.404,854,2.404,855,2.404,856,2.404,857,2.404,858,3.733,859,2.207,860,2.058,861,2.128,867,3.196,886,2.404,1968,2.903,1969,2.69,1970,3.226]],["t/272",[3,2.443,5,2.487,10,2.083,17,1.124,25,0.734,101,1.108,105,2.674,106,2.133,126,2.144,146,1.945,149,2.083,161,1.865,167,2.034,170,1.667,181,1.466,187,2.083,210,1.612,270,1.512,293,1.945,300,3.377,303,3.711,312,2.321,329,2.477,367,2.945,368,2.798,369,3.477,378,2.569,382,2.136,442,2.136,477,1.667,552,2.477,581,1.988,583,2.136,585,2.945,608,2.254,666,3.939,744,5.118,745,5.582,746,4.45,748,1.759,749,3.131,829,2.798,868,2.674,873,2.945,1063,2.945,1074,2.674,1115,2.945,1129,2.083,1155,2.193,1168,2.321,1267,2.945,1295,2.945,1317,2.798,1593,2.945,1672,2.945,1735,2.798,1811,2.945,1864,4.007,1897,3.379,1909,2.674,1929,3.131,1971,3.755,1972,3.755,1973,3.379,1974,3.755,1975,3.379,1976,3.379,1977,3.755,1978,3.755,1979,3.755,1980,3.755,1981,3.755,1982,3.755,1983,2.798,1984,3.755,1985,3.755,1986,3.755,1987,3.379,1988,3.379,1989,3.379,1990,3.131,1991,2.798,1992,4.69,1993,3.755,1994,3.755,1995,3.755,1996,3.755,1997,3.755,1998,3.755,1999,3.755,2000,3.755,2001,3.755,2002,3.379,2003,3.755,2004,3.755]],["t/274",[0,1.355,22,5.406,123,3.77,555,5.066,2005,7.374]],["t/276",[4,2.517,5,2.83,10,3.253,11,1.864,17,1.172,23,1.518,24,1.648,25,1.146,56,2.962,85,3.868,106,2.223,120,3.625,181,2.29,207,2.256,233,2.748,270,2.361,288,3.868,308,2.604,359,4.012,423,4.177,474,4.369,482,3.419,555,3.625,566,2.913,666,3.424,744,5.483,750,2.973,1079,3.868,1152,4.369,1208,3.424,1272,3.424,1983,4.369,2006,4.889,2007,5.864,2008,5.864,2009,5.864,2010,5.864,2011,5.864]],["t/278",[0,1.233,11,2.369,15,4.608,16,4.416,28,4.136,30,5.1,31,4.24,32,2.707,33,3.199,96,5.309,114,5.1,363,4.754,437,3.629]],["t/280",[0,1.19,5,2.23,32,2.613,58,2.857,113,3.251,126,2.287,566,3.573,679,2.896,744,4.588,813,4.745,867,4.588,1968,6.473,1969,5.998,2012,6.473,2013,5.998,2014,5.998,2015,7.194]],["t/282",[5,1.341,23,1.12,24,1.216,25,0.845,32,1.571,58,3.082,196,3.646,220,3.859,226,2.526,233,2.027,308,1.921,353,3.043,388,3.859,419,3.039,432,2.4,511,5.205,573,6.687,743,6.591,748,2.027,813,2.854,867,4.672,1395,2.96,1715,3.607,1969,3.607,2013,3.607,2014,5.205,2016,4.326,2017,4.326,2018,4.326,2019,4.326,2020,4.326,2021,4.326,2022,4.326,2023,4.326,2024,4.326,2025,4.326,2026,4.326,2027,4.326,2028,4.326,2029,6.687,2030,4.326,2031,3.394,2032,4.326,2033,4.326,2034,4.326,2035,4.326,2036,4.326,2037,4.326,2038,4.326,2039,4.326,2040,4.326,2041,4.326,2042,6.243,2043,4.326,2044,6.243,2045,4.326,2046,4.326,2047,4.326,2048,3.893,2049,4.326]],["t/284",[6,2.331,11,1.269,13,4.087,17,1.543,19,4.508,20,2.974,22,2.633,32,1.449,48,1.87,52,2.067,58,2.87,77,3.049,113,1.803,123,3.217,156,2.843,160,2.633,166,3.328,207,1.535,247,2.162,273,3.266,276,2.023,278,4.386,290,2.485,293,2.067,314,2.067,316,2.974,323,2.545,335,2.731,345,2.633,356,2.843,358,3.131,371,2.467,382,2.27,414,2.396,422,3.131,423,4.193,459,2.067,482,3.105,515,2.843,570,3.591,581,2.113,642,3.328,666,3.437,695,2.396,725,2.113,867,4.46,941,3.131,1060,4.193,1348,3.328,1352,2.633,1401,4.193,1613,3.131,1632,3.131,2029,4.908,2050,3.991,2051,3.991,2052,3.991,2053,3.991,2054,3.991,2055,3.991,2056,3.991,2057,3.991,2058,3.991,2059,3.991,2060,5.887,2061,3.991,2062,3.991,2063,3.991,2064,3.991,2065,3.991,2066,3.591,2067,3.991,2068,3.991,2069,3.328,2070,3.591,2071,3.328,2072,3.991]],["t/286",[40,5.3,41,5.125,47,5.987,48,3.765,50,5.3,84,4.458,90,6.699]],["t/288",[9,6.167,10,4.592,2073,7.448,2074,7.448]],["t/290",[0,1.244,5,2.331,22,4.962,112,2.937,123,3.461,210,3.229,310,3.983,311,4.65,555,4.65,568,3.983,725,3.983,884,5.147,1168,4.65,2005,6.768]],["t/292",[0,0.458,14,1.576,17,1.392,37,1.23,58,2.899,78,1.828,99,1.663,104,1.435,105,3.544,123,1.275,126,1.768,160,2.931,171,1.349,183,1.115,191,1.537,196,1.618,197,2.044,202,1.713,206,1.376,208,2.174,210,1.189,230,1.349,233,1.298,273,1.537,311,1.713,325,1.974,338,2.253,339,1.467,353,2.644,354,1.663,382,1.576,384,2.064,414,1.663,418,1.435,432,3.865,474,3.311,489,1.713,573,7.164,592,3.039,666,1.618,695,1.663,710,1.713,720,3.82,746,2.931,756,5.726,757,6.513,758,3.998,813,3.669,826,2.834,829,3.311,832,2.747,899,4.144,1080,3.998,1085,1.663,1129,1.537,1155,1.618,1168,1.713,1345,2.174,1346,2.174,1375,3.998,1693,1.896,1764,2.31,1811,4.364,1911,3.705,2013,5.306,2014,4.638,2029,3.705,2031,3.486,2075,3.998,2076,4.444,2077,6.364,2078,4.444,2079,5.563,2080,4.444,2081,4.444,2082,4.444,2083,4.444,2084,4.444,2085,4.444,2086,4.444,2087,4.444,2088,6.967,2089,2.064,2090,5.563,2091,2.771,2092,2.771,2093,2.771,2094,2.771,2095,2.771,2096,2.771]],["t/294",[17,1.001,22,3.304,37,3.075,51,2.925,105,4.058,111,3.941,167,2.714,171,2.439,183,2.016,197,2.305,209,2.305,251,3.096,273,2.779,281,2.347,290,4.099,311,3.096,352,3.568,482,3.075,522,2.925,568,2.652,625,3.929,638,4.176,682,4.176,716,3.864,757,4.176,942,3.568,999,4.932,1096,2.925,1155,2.925,1172,4.176,1199,3.929,1330,3.568,1387,3.427,1547,4.507,1593,3.929,1858,4.507,2075,4.507,2089,3.732,2097,5.009,2098,5.009,2099,3.929,2100,5.009,2101,5.009]],["t/296",[35,1.677,37,1.438,58,3.224,105,1.992,112,1.265,146,1.677,171,1.577,187,1.797,262,4.831,314,1.677,323,2.066,365,2.413,379,2.413,452,2.066,477,1.438,568,1.715,578,2.413,735,2.859,860,2.066,884,3.438,1864,2.307,2102,2.7,2103,3.239,2104,3.239,2105,3.239,2106,5.026,2107,3.239,2108,3.239,2109,8.803,2110,3.239,2111,3.239,2112,9.862,2113,3.239,2114,3.239,2115,3.239,2116,3.239,2117,3.239,2118,3.239,2119,7.513,2120,3.239,2121,3.239,2122,3.239,2123,3.239,2124,3.239,2125,3.239,2126,3.239,2127,3.239,2128,3.239,2129,3.239,2130,3.239,2131,3.239,2132,3.239,2133,3.239,2134,3.239,2135,3.239,2136,3.239,2137,3.239,2138,3.239,2139,3.239,2140,3.239,2141,3.239,2142,3.239,2143,3.239,2144,3.239,2145,3.239,2146,3.239,2147,3.239,2148,3.239,2149,2.914,2150,3.239,2151,3.239,2152,3.239,2153,3.239,2154,3.239,2155,3.239,2156,3.239,2157,3.239]],["t/298",[171,4.03,482,3.675,496,4.111,2158,8.277]],["t/300",[3,2.409,17,1.78,105,2.929,232,4.435,356,5.262,474,5.504,482,3.954,496,3.669,735,4.202,1976,6.647,2066,6.647,2149,6.647,2159,5.795,2160,7.388]],["t/302",[263,6.559,264,6.971,265,4.071]],["t/304",[43,5.075,56,3.061,209,4.282,420,5.668,843,5.075,867,5.075,1094,5.668]],["t/306",[0,1.255,11,2.413,16,4.165,28,4.212,30,5.194,31,4.318,32,2.757,33,3.258,96,5.407,114,5.194,363,4.842,437,3.696]],["t/308",[39,6.303,40,5.3,47,5.987,48,3.765,50,5.3,84,4.458,90,6.699]],["t/310",[9,6.167,10,4.592,2073,7.448,2074,7.448]],["t/312",[5,2.018,24,1.83,25,1.273,35,5.183,51,3.803,84,3.613,87,4.026,101,1.921,102,4.026,104,3.373,130,4.154,280,2.75,317,5.109,432,3.613,437,3.171,744,4.154,871,4.852,1075,4.811,1135,4.456,1229,5.86,1632,5.109,1918,5.86,2161,6.513,2162,6.513,2163,6.513]],["t/314",[23,2.143,24,2.326,25,1.618,147,3.553]],["t/316",[0,1.279,23,2.002,24,2.573,25,1.512,28,4.291,83,3.558,126,2.458,147,3.319,814,5.345]],["t/318",[0,0.278,3,0.297,4,0.39,5,1.327,11,0.289,17,0.776,24,0.66,25,0.671,26,0.934,32,0.853,33,0.722,37,0.404,44,0.426,45,0.355,49,0.546,56,0.647,57,0.714,58,1.589,66,0.6,83,1.346,98,0.903,101,1.013,102,0.562,105,0.931,109,0.461,110,0.6,112,1.938,124,0.648,125,0.6,126,0.746,127,0.714,128,2.571,130,1.073,137,0.678,138,1.254,139,0.678,140,0.714,141,0.6,146,2.011,147,0.722,148,1.01,150,2.656,151,0.648,152,3.046,155,0.378,156,0.648,157,1.371,158,1.93,159,1.303,161,2.466,164,1.1,171,0.443,178,0.546,180,1.606,182,1.453,186,0.531,189,0.648,191,3.065,193,0.758,196,1.371,197,3.949,199,3.637,206,0.452,207,0.35,210,1.008,213,0.531,219,1.515,220,1.451,224,0.546,226,0.983,232,1.01,233,0.426,238,0.345,244,1.11,251,0.562,254,0.6,255,0.648,256,3.946,270,0.366,273,0.505,278,0.678,280,0.384,290,4.021,297,2.71,301,0.912,308,2.836,309,1.868,311,1.451,321,0.688,323,1.073,341,0.836,343,0.622,361,1.539,363,0.58,374,0.678,382,0.517,385,0.461,388,0.562,400,1.01,405,2.19,406,1.451,419,0.443,459,0.471,472,0.562,477,1.902,483,0.648,492,0.6,494,0.714,498,2.265,510,0.562,515,0.648,518,0.622,568,1.243,569,0.983,580,2.575,581,0.891,589,0.983,592,1.64,595,0.452,603,1.453,607,0.58,612,2.084,613,0.714,643,0.758,645,1.199,651,0.622,666,0.531,676,2.084,692,0.58,716,0.443,722,0.562,728,0.6,733,2.002,740,0.622,744,0.58,748,1.371,750,0.461,792,1.243,810,1.073,811,4.708,812,0.678,813,0.6,814,0.531,815,0.678,816,0.648,817,0.678,818,0.678,819,1.606,820,0.678,821,1.809,822,1.665,823,0.546,824,0.678,825,2.825,826,1.866,827,1.073,828,2.295,829,0.678,830,1.32,831,0.714,832,1.809,833,0.818,834,0.818,835,1.254,836,0.818,837,0.714,838,0.622,839,0.6,840,0.6,841,4.491,842,1.497,843,0.58,844,1.11,845,2.93,846,2.633,847,0.818,848,0.983,849,0.818,850,2.18,851,0.648,852,1.749,853,0.678,854,0.678,855,0.678,856,0.678,857,0.678,858,1.254,859,0.622,860,0.58,861,0.6,862,0.758,863,3.597,864,0.818,865,0.758,866,1.514,867,0.58,868,0.648,869,0.818,870,0.818,871,0.678,872,0.758,873,0.714,874,0.818,875,0.758,876,0.818,877,0.818,878,0.818,879,0.818,880,0.678,881,1.254,882,0.714,883,0.531,884,2.002,885,0.678,886,1.254,887,0.714,888,0.678,889,0.758,890,0.758,891,0.758,892,0.758,895,0.758,896,0.818,897,0.818,898,0.818,899,2.18,900,0.818,901,0.758,902,0.818,903,0.818,904,0.714,905,0.818,906,0.714,907,1.958,908,0.818,909,0.818,910,0.818,911,0.818,912,1.514,913,2.18,914,1.514,915,0.818,916,2.113,917,0.818,918,0.714,919,1.11,920,0.758,921,0.818,922,0.758,923,0.714,924,0.758,925,1.514,926,1.958,927,0.818,928,1.32,929,1.199,930,1.403,931,0.714,932,0.714,933,0.818,934,0.818,935,0.818,937,0.758,938,0.818,939,0.818,940,0.818,941,0.714,942,0.648,943,1.403,944,0.818,945,1.514,946,0.818,947,0.818,948,0.818,949,0.714,950,3.306,951,2.558,953,0.714,954,0.714,955,1.254,956,1.11,957,0.678,958,0.714,959,0.714,960,0.714,961,0.714,962,3.458,963,0.758,964,1.514,965,1.403,966,0.714,967,2.295,968,1.842,969,1.403,970,0.758,971,0.818,972,0.818,973,0.758,974,0.678,975,0.818,976,0.818,977,0.758,978,0.818,979,1.514,980,0.758,981,0.714,982,0.758,983,0.714,984,0.648,2164,0.91,2165,0.91,2166,0.758]],["t/320",[0,0.464,3,0.916,5,1.392,24,1.971,25,1.462,36,1.631,43,1.791,58,3.201,99,1.686,101,1.656,108,1.341,112,1.097,119,2.203,141,4.231,146,2.907,147,1.205,149,1.558,150,1.922,177,2,181,1.754,197,3.754,198,2.865,209,2.066,219,1.455,230,1.367,238,2.128,276,1.424,294,1.922,304,1.791,309,2.824,321,1.148,338,1.424,353,1.167,361,2.78,369,1.736,388,1.736,399,1.521,400,1.686,418,1.455,477,1.994,482,1.247,498,1.853,502,1.686,510,4.336,556,1.853,610,2.203,618,1.791,679,1.131,734,5.347,792,4.569,843,1.791,1052,3.073,1073,2.203,1105,1.736,1152,2.093,1283,3.745,1394,2.093,1576,1.922,1653,2.342,1828,2.527,1829,2.342,1864,2,2167,2.093,2168,2.809,2169,2.809,2170,4.492,2171,2.809,2172,2.809,2173,2.809,2174,4.042,2175,2.809,2176,2.809,2177,2.809,2178,2.809,2179,2.809,2180,4.042,2181,2.809,2182,2.809,2183,4.492,2184,4.492,2185,2.809,2186,4.492,2187,2.809,2188,2.809,2189,2.809]],["t/322",[0,0.708,5,1.327,11,1.361,24,1.203,25,1.211,42,2.57,51,2.5,58,1.294,75,3.852,84,2.375,98,1.647,101,1.263,106,1.623,141,2.824,147,1.837,149,2.375,164,2.903,181,1.672,186,2.5,207,1.647,209,1.97,238,3.211,276,2.171,280,1.807,289,1.935,309,2.494,328,3.19,357,2.646,370,4.616,399,3.357,437,2.084,438,3.049,502,4.791,510,4.501,556,4.087,580,4.04,619,3.233,678,3.19,680,3.569,894,5.586,920,3.569,1085,2.57,1116,3.569,1147,3.358,1152,3.19,1278,3.852,1576,2.929,1641,3.358,1653,7.061,1672,3.358,1678,3.852,1861,3.358,1947,3.852,2089,3.19,2167,3.19,2174,3.852,2180,3.852,2190,4.281,2191,4.281,2192,4.281,2193,4.281,2194,4.281,2195,4.281,2196,6.196,2197,4.281,2198,5.575,2199,4.281,2200,4.281]],["t/324",[5,1.601,23,1.337,101,1.524,106,1.958,109,3.586,120,4.372,147,2.217,153,4.307,200,3.193,207,2.721,245,3.193,246,5.144,278,3.849,301,2.799,308,2.294,309,2.847,314,2.676,442,2.939,477,2.294,496,2.566,542,3.849,625,4.052,678,3.849,779,3.535,845,4.839,885,5.27,894,3.408,1015,5.27,1063,4.052,1117,4.511,1131,3.408,1394,3.849,1586,4.307,1684,4.648,1827,4.052,1854,6.364,1864,5.038,1988,4.648,2201,4.307,2202,5.166,2203,5.166,2204,5.166,2205,5.166,2206,4.307,2207,4.307,2208,5.166,2209,5.166,2210,5.166,2211,5.166,2212,7.073,2213,5.166]],["t/326",[0,1.323,23,1.61,101,2.359,161,3.088,230,3.027,288,4.101,297,3.631,308,2.761,309,3.56,321,2.542,339,3.292,477,3.927,480,4.877,496,3.088,619,2.761,628,4.429,827,3.966,845,6.388,865,5.184,1006,4.254,1117,3.966,1136,5.595,2214,5.184,2215,6.218,2216,6.218,2217,7.999,2218,6.218]],["t/328",[0,1.496,3,1.664,5,1.581,17,1.02,23,1.816,24,1.971,25,0.997,33,2.19,35,2.642,59,2.764,77,2.642,100,2.979,101,2.069,105,2.78,106,1.934,126,1.622,155,2.913,164,3.755,230,2.484,232,4.21,249,4.798,302,3.063,335,3.491,358,4.002,496,2.534,515,3.634,566,2.534,592,2.436,746,3.366,759,4.591,800,4.254,826,3.254,839,3.366,845,5.903,880,3.801,932,4.002,937,4.254,942,3.634,1015,3.801,1027,3.801,1117,3.254,1395,3.491,1586,4.254,1679,4.591,1762,4.002,2201,5.847,2219,5.102,2220,7.013]],["t/330",[0,1.02,43,3.936,83,2.839,93,3.936,106,2.339,108,2.947,113,2.789,126,1.962,155,2.564,157,3.604,169,3.424,219,4.564,280,2.605,339,3.267,409,4.222,522,3.604,603,3.065,605,5.553,686,3.815,695,3.705,700,3.424,750,4.036,787,3.936,788,4.071,843,3.936,984,4.396,1094,4.396,1131,4.071,1208,3.604,1658,4.841,1768,4.841,2031,4.841,2221,4.598,2222,5.145,2223,6.171]],["t/332",[0,1.149,125,4.585,126,2.21,130,4.434,137,5.179,139,5.179,157,4.059,164,3.257,191,3.857,353,2.888,804,4.756,960,5.453,965,5.796,966,5.453,968,5.453,969,5.796,973,5.796,977,5.796,980,5.796,981,5.453,982,5.796,983,5.453,984,4.951]],["t/334",[0,0.555,3,1.685,11,1.067,23,1.631,24,0.944,25,1.834,32,1.219,35,2.676,37,1.491,83,2.377,97,2.141,98,1.988,105,2.048,106,1.273,113,1.517,126,2.002,130,5.144,150,2.297,155,2.617,157,4.46,158,4.666,164,1.573,167,2.799,170,1.491,177,2.391,181,1.311,183,1.352,191,1.863,200,2.075,201,2.799,204,2.297,219,4.788,228,2.501,230,1.635,238,2.388,281,1.573,295,2.015,320,2.141,338,1.702,339,2.736,359,2.297,413,2.634,429,2.391,432,3.925,531,2.141,557,2.215,568,1.778,572,2.297,592,1.603,608,2.015,619,1.491,642,2.799,679,2.848,735,1.91,738,2.634,739,2.799,750,2.62,752,2.501,808,3.021,919,2.215,962,2.501,1074,2.391,1075,1.961,1097,2.799,1227,2.799,1267,2.634,1272,1.961,1317,2.501,1576,2.297,1631,3.021,1875,2.297,1889,2.634,1973,3.021,1987,3.021,2012,3.021,2206,2.799,2214,2.799,2221,3.85,2224,3.358,2225,3.358,2226,3.358,2227,5.167,2228,3.358,2229,3.358,2230,3.358,2231,3.358,2232,3.358,2233,2.799,2234,3.358,2235,2.799,2236,3.358,2237,3.358,2238,3.358]],["t/336",[0,0.683,3,1.969,8,2.635,11,1.313,17,0.825,24,1.161,25,1.76,29,2.725,32,1.5,37,1.834,52,2.139,56,1.589,83,2.777,97,2.635,105,1.638,109,2.094,112,1.613,126,2.268,130,2.635,150,6.443,151,2.942,155,1.716,157,2.412,158,3.982,170,1.834,175,2.238,177,2.942,178,2.48,181,2.357,182,2.052,183,1.663,184,2.942,185,3.717,191,2.292,214,2.826,219,2.139,232,2.48,259,2.725,280,1.744,304,2.635,308,1.834,437,2.011,482,1.834,518,2.826,519,3.078,539,3.078,542,3.078,572,2.826,580,2.292,582,3.078,592,1.973,597,3.717,619,1.834,750,2.094,752,3.078,942,2.942,950,2.942,1148,5.034,1159,3.078,1169,3.717,1198,3.717,1218,2.942,1619,3.717,1670,3.444,1723,3.241,1764,3.444,1875,2.826,1887,3.444,1909,2.942,2159,3.241,2221,3.078,2239,6.037,2240,4.131,2241,4.131,2242,4.131,2243,4.131,2244,4.131,2245,4.131,2246,4.131,2247,4.131,2248,3.444,2249,4.131]],["t/338",[17,1.813,24,1.845,25,1.283,56,3.185,99,3.941,126,2.087,147,2.817,181,2.563,219,3.4,238,3.139,335,4.491,451,4.891,633,5.149,748,3.076,761,6.495,788,5.462,1085,3.941,1826,4.675,1870,4.891,2206,5.473,2250,5.906,2251,6.564,2252,6.564,2253,6.564]],["t/340",[3,1.176,25,1.067,49,2.165,56,2.1,62,2.468,93,2.301,126,2.334,161,1.792,165,1.792,167,2.957,180,3.734,187,2.001,210,1.548,214,2.468,219,3.802,230,1.756,238,2.496,258,5.49,261,2.687,307,3.481,333,3.374,339,3.486,340,2.829,349,5.485,369,2.23,379,2.687,430,3.007,478,3.734,552,2.379,556,2.379,614,3.246,633,4.281,653,3.007,685,3.246,750,2.767,771,2.468,788,4.343,823,3.276,844,2.379,883,2.106,924,3.007,932,2.829,974,4.066,1037,2.569,1073,2.829,1074,3.888,1218,2.569,1386,3.246,1423,3.246,1426,2.687,1632,4.281,1641,2.829,1808,2.569,1827,2.829,1852,5.49,1863,3.007,1929,3.007,1975,3.246,2006,3.007,2207,3.007,2235,3.007,2250,4.911,2254,2.829,2255,3.007,2256,3.607,2257,7.342,2258,7.184,2259,6.584,2260,3.607,2261,3.607,2262,3.607,2263,3.607,2264,3.607,2265,3.607,2266,3.607,2267,5.458,2268,3.607,2269,5.458,2270,3.607,2271,3.607,2272,3.246,2273,3.607,2274,3.607]],["t/342",[56,2.83,144,3.9,155,2.274,171,4.045,238,2.789,290,2.311,341,2.719,349,5.136,371,3.384,518,5.033,598,5.24,716,2.665,735,4.726,750,4.504,761,4.295,787,4.692,842,4.692,919,3.611,943,4.565,1037,3.9,1052,5.685,1057,4.079,1218,3.9,1227,4.565,1228,4.926,1372,4.926,1576,3.746,1597,4.926,1870,4.079,1875,3.746,1887,4.565,2089,4.079,2221,4.079,2275,5.475,2276,4.079,2277,5.475,2278,7.357]],["t/344",[31,3.811,83,3.082,93,3.047,104,2.474,105,1.894,109,2.422,126,2.91,165,2.373,210,2.05,219,3.47,230,3.767,238,2.54,249,3.268,320,4.273,340,3.747,421,3.559,482,2.121,524,2.238,581,3.547,592,2.281,664,4.298,700,3.717,708,3.559,750,4.252,761,3.747,787,4.935,788,3.151,796,3.983,800,3.983,951,3.559,962,3.559,1117,3.047,1176,3.983,1289,4.141,1295,3.747,1576,3.268,1663,3.983,1852,3.983,1853,4.298,1875,4.584,2002,4.298,2006,3.983,2031,6.069,2221,3.559,2255,3.983,2279,7.737,2280,6.028,2281,4.777,2282,4.777,2283,4.777,2284,4.777]],["t/346",[0,0.763,1,3.628,5,2.027,24,2.322,25,1.704,93,5.561,101,1.929,158,3.045,180,5.652,191,5.644,209,3.009,210,1.981,295,2.771,297,2.696,308,2.904,309,3.325,310,2.444,311,2.854,405,4.171,502,2.771,584,3.44,607,2.944,619,2.05,666,2.696,961,3.621,967,3.621,1048,4.658,1079,3.045,1281,3.621,1289,2.854,1615,4.154,1616,3.288,2201,3.849,2222,3.849,2285,4.617,2286,4.617,2287,4.617,2288,4.617,2289,4.617,2290,4.617,2291,4.617,2292,4.617,2293,4.617,2294,4.617,2295,4.617,2296,4.617]],["t/348",[0,1.279,191,4.291,209,3.558,251,4.781,262,6.067,281,3.624,482,3.434,984,5.509,1281,6.067,1708,6.067,2297,7.734]],["t/350",[0,1.316,11,2.529,12,5.668,23,2.06,24,2.237,25,1.555,270,3.203,295,4.777]],["t/352",[0,1.304,5,1.534,11,2.183,16,3.159,17,0.989,23,1.281,24,2.216,25,1.541,26,4.375,28,3.81,33,2.124,35,3.556,36,2.864,37,3.049,42,2.971,77,2.563,98,2.642,101,1.46,112,1.933,126,2.707,128,2.971,164,3.695,170,2.198,183,1.992,197,2.277,201,4.126,270,1.992,280,2.899,281,3.695,293,2.563,329,3.265,341,2.458,349,3.059,383,2.815,433,5.616,440,4.453,476,3.525,531,3.157,583,2.815,728,3.265,735,2.815,1094,3.525,1861,3.882,2102,4.126,2248,4.126]],["t/354",[3,2.66,5,1.987,25,1.253,53,6.399,59,3.473,83,3.753,98,2.466,112,2.503,113,2.897,165,3.184,182,3.184,191,3.557,245,5.042,246,5.722,270,3.284,297,3.744,301,3.473,308,2.847,309,3.284,929,5.81,1066,4.229,1861,5.029,2298,6.411,2299,5.769]],["t/356",[11,2.022,17,1.786,25,1.243,36,2.31,52,3.295,128,3.819,149,3.53,309,2.561,361,3.218,400,5.366,483,4.531,595,4.44,619,2.825,630,4.99,654,4.74,811,3.715,886,4.74,929,4.531,1001,6.768,1002,4.99,2300,6.362,2301,6.362,2302,6.362,2303,6.362,2304,6.362,2305,6.362]],["t/358",[0,1.221,24,2.076,25,1.444,32,2.683,98,2.842,113,3.338,164,3.462,165,3.669,247,4.002,361,2.929,400,4.435,619,3.28,654,5.504,923,5.795,2306,6.647,2307,5.054]],["t/360",[3,1.822,17,2.035,84,5.177,98,3.59,164,4.373,297,3.262,400,5.602,414,5.602,420,3.979,926,4.657,1166,4.657,2308,8.394,2309,8.956,2310,5.586,2311,5.586,2312,5.586,2313,5.586,2314,5.586]],["t/362",[0,0.983,1,1.934,3,0.673,4,0.886,5,1.402,17,0.412,23,0.534,24,1.812,25,0.884,28,1.145,32,1.643,36,1.266,41,1.316,48,0.967,50,1.361,51,1.205,58,0.624,62,2.385,77,1.805,83,0.949,85,1.361,98,1.741,100,1.205,101,1.028,105,0.818,111,1.025,126,1.69,129,1.276,131,1.47,146,1.069,147,0.886,148,1.239,149,1.145,154,2.223,156,2.483,165,1.025,170,0.916,182,4.229,183,1.403,191,1.934,197,2.082,205,1.316,218,2.906,219,3.736,220,4.643,223,3.92,224,1.239,226,3.47,229,1.538,238,0.782,244,1.361,257,1.857,280,0.871,305,1.47,308,1.548,309,1.822,341,1.025,382,1.174,383,1.174,437,1.005,446,1.721,477,2.639,498,1.361,510,2.155,572,3.096,580,1.145,582,1.538,589,2.035,598,1.47,601,1.857,602,1.47,607,1.316,609,1.857,748,2.785,765,1.538,792,1.093,825,1.361,875,1.721,888,6.344,907,2.906,923,2.734,929,1.47,974,2.597,1037,2.483,1079,1.361,1116,1.721,1177,3.55,1289,2.155,1395,1.412,1433,1.857,1644,1.857,1717,1.721,1870,1.538,1983,1.538,2167,1.538,2258,2.906,2306,3.136,2315,3.136,2316,2.064,2317,2.064,2318,2.064,2319,7.661,2320,2.064,2321,2.064,2322,2.064,2323,2.064,2324,1.857,2325,2.064,2326,2.064,2327,2.064,2328,2.064,2329,2.064,2330,2.064,2331,2.064,2332,2.064,2333,2.064,2334,2.064,2335,2.064,2336,2.064,2337,2.064,2338,2.064,2339,2.064,2340,2.064,2341,2.064,2342,2.064,2343,3.486,2344,5.347,2345,3.486,2346,3.486,2347,3.486,2348,2.064,2349,2.064,2350,2.064,2351,2.064,2352,2.064,2353,2.064,2354,4.071,2355,2.064,2356,2.064,2357,2.064,2358,2.064,2359,2.064,2360,2.064,2361,2.064,2362,2.064,2363,2.064,2364,2.064,2365,2.064,2366,1.857,2367,1.857,2368,1.857,2369,1.857,2370,1.857,2371,1.857,2372,1.857,2373,1.857,2374,1.857,2375,1.857,2376,1.857,2377,1.857,2378,1.857,2379,1.857,2380,1.857,2381,1.857,2382,1.857,2383,2.064,2384,2.064,2385,2.064,2386,2.064,2387,1.619,2388,2.064,2389,2.064,2390,1.721,2391,2.064,2392,2.064]],["t/364",[2,2.404,3,0.929,5,0.882,8,1.816,17,0.907,24,1.817,25,1.729,26,1.58,27,1.475,32,2.565,36,1.034,37,2.016,40,1.878,51,1.663,58,0.861,59,1.542,77,1.475,93,1.816,100,1.663,101,0.84,105,1.8,111,1.414,120,1.76,124,4.604,126,0.905,145,1.816,146,4.09,147,1.949,155,1.183,164,1.334,167,1.542,178,1.709,189,3.235,205,2.896,206,1.414,222,2.374,226,1.663,232,1.709,237,1.878,245,1.76,268,2.234,273,2.52,281,1.334,282,2.121,297,1.663,302,1.709,312,1.76,319,2.234,321,2.316,351,2.374,357,1.76,373,1.948,382,2.583,422,2.234,472,1.76,492,1.878,510,3.996,537,1.948,539,2.121,544,2.562,566,2.256,568,1.508,589,1.663,652,3.107,654,2.121,676,4.035,746,4.658,748,3.842,773,2.374,781,2.562,792,1.508,793,1.878,807,2.234,824,4.22,825,1.878,826,3.613,828,4.443,830,4.443,832,3.996,837,2.234,838,1.948,839,1.878,840,1.878,1060,2.028,1066,1.878,1089,2.121,1149,2.234,1208,1.663,1275,3.786,1401,2.028,1428,2.121,1493,2.562,1518,2.234,1616,3.235,1696,2.562,1739,4.443,1762,2.234,1807,2.374,1826,2.028,1899,4.086,2198,2.562,2390,2.374,2393,2.847,2394,2.847,2395,2.847,2396,2.847,2397,2.847,2398,2.847,2399,2.847,2400,2.847,2401,2.847,2402,2.847,2403,2.847,2404,2.847,2405,2.847,2406,2.847,2407,2.847,2408,2.847,2409,2.847,2410,2.847,2411,2.847,2412,2.847,2413,2.374]],["t/366",[0,0.604,11,0.868,17,0.311,24,0.767,25,0.713,33,1.172,42,0.933,58,1.327,62,1.868,66,1.025,69,1.398,86,0.961,101,0.458,105,1.082,106,1.035,107,1.398,110,1.025,111,1.356,116,1.107,129,2.256,131,3.127,145,0.991,147,1.172,154,0.991,175,0.842,178,1.639,181,1.066,182,4.494,183,1.099,186,2.132,199,1.304,205,0.991,206,0.772,218,3.044,219,4.43,220,5.505,223,5.497,224,1.639,226,4.715,229,1.158,233,0.728,242,1.398,254,1.025,273,1.515,289,0.702,295,0.933,300,0.933,309,1.469,321,0.635,331,1.296,353,0.646,382,0.884,405,0.991,406,0.961,407,2.034,408,1.158,421,1.158,424,1.025,437,0.757,477,3.585,496,1.813,514,1.025,519,2.034,524,0.728,537,1.868,578,2.034,580,2.025,686,0.961,748,4.008,792,0.823,821,1.687,822,0.884,832,1.687,888,5.906,894,1.025,904,1.219,974,2.034,1037,1.944,1122,1.296,1139,1.025,1177,3.921,1281,2.141,1289,0.961,1428,3.271,1518,2.141,1592,1.296,1717,1.296,1774,1.398,1889,1.219,1923,1.398,2258,2.276,2319,7.133,2344,6.986,2354,4.498,2366,1.398,2367,1.398,2368,1.398,2369,1.398,2370,1.398,2371,1.398,2372,1.398,2373,1.398,2374,1.398,2375,1.398,2376,1.398,2377,1.398,2378,1.398,2379,1.398,2380,1.398,2381,4.955,2382,2.456,2414,1.554,2415,1.554,2416,1.554,2417,1.554,2418,1.554,2419,2.73,2420,2.73,2421,2.73,2422,2.73,2423,2.73,2424,1.554,2425,1.554,2426,2.73,2427,1.554,2428,2.73,2429,1.554,2430,1.554,2431,2.73,2432,2.73,2433,2.73,2434,2.73,2435,2.73,2436,1.554,2437,1.554,2438,1.554,2439,1.554,2440,1.554,2441,1.554,2442,1.554,2443,1.554,2444,1.554,2445,1.554,2446,1.554,2447,1.554,2448,1.554,2449,1.554,2450,1.554,2451,1.554,2452,1.554,2453,1.554,2454,1.554,2455,1.554,2456,1.554,2457,1.554,2458,1.554,2459,1.554,2460,1.554,2461,2.73,2462,2.73,2463,2.73,2464,1.554,2465,1.554,2466,1.554,2467,1.554,2468,1.554,2469,1.554,2470,1.554,2471,1.554,2472,1.554,2473,1.554,2474,1.554,2475,1.554,2476,1.554,2477,2.73,2478,1.554,2479,1.554,2480,1.554,2481,1.554,2482,1.554,2483,1.554]],["t/368",[23,2.306,24,2.076,25,1.741,126,2.348,130,4.712,157,5.201,159,4.099,207,2.842,210,3.171,524,3.462,766,3.826,1646,5.795,2233,6.159]],["t/370",[0,0.372,3,0.734,4,0.965,17,0.449,26,2.079,33,0.965,49,1.35,56,0.865,58,1.456,66,1.484,83,1.724,98,1.441,102,1.39,112,1.463,126,1.531,128,4.289,130,3.071,137,1.676,138,1.676,139,1.676,140,1.764,141,1.484,147,0.965,148,2.249,150,4.269,151,1.602,152,4.406,157,3.28,158,2.472,161,1.117,168,1.602,182,2.392,191,3.116,196,1.313,197,3.786,199,3.217,206,1.117,210,0.965,213,1.313,219,1.165,224,1.35,238,0.853,244,1.484,249,2.564,254,1.484,255,1.602,256,5.485,290,4.082,341,1.861,361,2.671,385,1.14,405,3.582,406,2.977,459,1.165,477,2.77,518,1.539,569,2.188,580,3.964,581,1.984,589,2.188,592,2.682,603,2.392,612,4.001,722,1.39,728,1.484,733,3.295,810,1.435,811,5.241,812,1.676,813,1.484,814,1.313,815,1.676,816,1.602,817,1.676,818,1.676,819,3.295,820,1.676,821,3.472,822,2.131,823,1.35,825,3.176,841,3.295,850,2.792,851,1.602,852,2.792,853,1.676,854,1.676,855,1.676,856,1.676,857,1.676,858,2.792,859,1.539,860,1.435,861,1.484,863,3.295,904,1.764,949,1.764,950,4.799,951,1.676,953,1.764,960,1.764,961,1.764,962,4.185,963,1.875,966,1.764,967,3.778,968,1.764,970,1.875,981,1.764,983,1.764,984,1.602,2166,1.875,2484,2.249,2485,2.249,2486,2.249]],["t/372",[0,0.854,3,1.685,24,1.988,25,1.576,32,1.876,56,1.987,59,2.799,113,2.334,119,4.052,126,1.642,146,3.663,147,3.036,155,2.146,174,3.68,209,2.377,210,2.217,219,2.676,230,2.515,238,1.958,303,3.408,309,2.08,366,4.307,413,4.052,414,3.101,415,4.648,429,3.68,432,2.866,496,2.566,582,3.849,595,2.566,618,3.295,679,2.08,735,4.023,745,3.849,748,4.396,766,2.676,792,2.735,824,3.849,831,4.052,832,3.193,840,3.408,1187,3.849,1208,3.017,1289,3.193,1575,4.307,1718,4.648,1886,4.307,1909,3.68,2307,3.535,2387,4.052,2413,4.307,2487,4.648,2488,5.166]],["t/374",[2,1.644,4,1.333,5,0.962,10,3.325,25,1.596,32,1.128,49,3.598,56,1.871,99,1.864,101,1.434,108,2.322,109,1.574,111,2.415,112,1.212,124,2.211,126,2.156,144,2.211,146,3.513,147,2.573,153,2.588,181,1.212,187,1.722,223,2.048,254,2.048,270,2.413,280,1.311,314,1.608,321,1.988,333,1.919,352,2.211,394,2.124,431,2.322,432,3.763,472,3.006,477,1.379,492,2.048,496,1.542,552,2.048,553,2.793,556,2.048,566,1.542,585,3.814,592,1.482,598,2.211,613,2.435,634,2.793,638,2.588,652,2.124,676,4.831,679,1.25,738,2.435,745,5.054,746,4.474,819,2.124,828,5.321,840,2.048,868,3.463,899,2.313,1085,1.864,1100,4.054,1272,2.839,1291,5.777,1314,2.588,1318,2.435,1401,2.211,1427,2.793,1616,3.463,1672,2.435,1739,3.814,1768,2.435,1770,2.435,1807,2.588,1808,2.211,1811,2.435,1826,2.211,1850,5.487,1851,4.997,1857,2.793,1869,4.375,1909,2.211,1913,2.793,1948,2.793,1989,2.793,1992,2.588,2255,2.588,2280,2.793,2307,2.124,2387,2.435,2413,2.588,2489,4.863,2490,4.863,2491,3.105,2492,3.105,2493,3.105,2494,3.105,2495,3.105,2496,3.105,2497,3.105,2498,3.105,2499,4.054,2500,3.105,2501,3.105,2502,3.105,2503,3.105,2504,3.105,2505,3.105,2506,3.105,2507,3.105]],["t/377",[4,2.553,24,1.672,25,1.862,49,3.571,56,2.288,96,4.237,113,2.688,126,1.891,146,4.026,187,3.3,210,3.336,226,3.474,238,2.255,432,3.3,476,4.237,591,4.666,617,4.666,679,2.395,748,4.302,823,3.571,832,5.352,840,3.924,1187,4.432,1267,4.666,1505,5.353,1539,4.96,1658,4.666,1735,4.432,1826,4.237,2276,4.432,2307,4.07,2508,5.949]],["t/379",[8,3.74,24,2.164,25,1.505,32,2.13,43,3.74,145,3.74,147,2.517,165,2.913,177,4.177,238,2.223,303,3.868,309,3.1,321,2.398,477,3.818,496,2.913,679,2.361,735,3.336,748,4.029,792,3.105,1121,4.889,1122,4.889,1187,4.369,1289,4.76,1291,6.04,1305,3.625,1575,4.889,1875,4.012,1886,4.889,1909,4.177,2102,6.42,2276,6.406,2307,4.012,2509,5.864]],["t/381",[24,1.761,25,1.735,96,4.462,113,2.831,116,4.462,126,1.991,144,4.462,146,3.245,165,3.112,171,3.05,209,2.882,419,3.05,477,3.569,492,5.302,496,3.112,617,4.914,652,6.406,679,2.522,748,3.766,792,3.317,840,4.133,843,3.996,1187,4.668,1539,5.223,2207,5.223,2487,5.637,2510,6.265,2511,6.265]],["t/383",[25,1.215,155,2.583,210,2.669,238,3.032,289,2.81,300,3.733,314,3.22,456,5.595,477,3.552,493,4.633,507,5.184,648,4.429,748,3.748,821,3.844,827,3.966,832,5.467,1006,4.254,1036,4.877,1129,3.45,1139,4.101,1168,5.467,1216,5.184,1502,5.184,1646,4.877,1992,5.184,2276,4.633,2307,4.254,2512,6.218,2513,6.218,2514,6.218]],["t/385",[0,1.26,17,1.522,24,1.305,25,0.907,32,3.173,84,2.576,98,1.786,99,2.787,111,2.306,126,2.087,144,3.307,145,2.961,164,2.175,171,3.197,188,2.458,207,1.786,219,2.404,226,2.711,290,1.96,352,3.307,354,2.787,382,2.641,437,2.26,476,4.677,477,2.915,482,2.061,514,3.062,571,4.177,618,2.961,652,4.492,679,1.869,680,3.871,716,2.26,748,4.539,788,3.062,793,3.062,822,2.641,824,3.459,830,3.642,831,3.642,832,2.87,837,3.642,950,3.307,1108,3.871,1131,3.062,1272,2.711,1275,3.871,1485,3.642,1579,3.642,1596,4.177,2276,3.459,2307,5.666,2515,4.643,2516,3.307,2517,4.643,2518,4.643,2519,4.643,2520,4.643]],["t/388",[0,1.402,3,1.86,5,1.767,19,3.33,23,1.476,26,3.163,28,3.163,32,2.071,36,2.071,58,2.563,98,2.194,108,2.723,113,3.416,170,2.532,183,2.295,200,3.525,297,4.414,309,3.414,363,3.637,371,3.525,384,4.248,421,4.248,482,2.532,513,4.754,583,3.243,695,3.423,700,3.163,748,3.542,861,3.761,868,4.061,1117,3.637,1139,3.761,1627,5.13,1850,4.248,1991,4.248,2048,5.13,2521,5.702,2522,5.702,2523,5.702,2524,5.702]],["t/390",[0,1.244,11,2.391,58,2.274,97,4.798,114,6.16,295,5.405,414,4.516,567,6.768,1032,4.65,1139,4.962,1295,5.901,1991,5.604]],["t/392",[0,1.369,8,4.187,23,1.699,32,2.384,48,3.076,50,4.33,57,5.149,58,1.984,94,5.906,98,2.525,114,4.491,126,2.087,280,2.771,297,3.833,309,2.642,358,5.149,382,3.734,419,3.196,437,4.031,521,4.33,566,3.26,700,3.642,823,3.941,1384,5.473,1613,5.149,1851,5.473,1991,4.891,2387,5.149]],["t/395",[14,4.571,42,4.824,300,4.824,793,5.3,1075,4.692,1693,5.498,2525,8.035]],["t/397",[0,1.416,8,3.195,12,3.568,13,2.652,15,6.092,16,2.305,17,1.384,18,4.507,19,2.925,23,2.054,35,2.594,36,1.819,48,2.347,59,2.714,86,3.096,110,3.304,165,2.488,182,3.439,280,2.115,295,3.007,304,3.195,305,3.568,307,4.416,314,2.594,316,5.159,318,3.732,341,2.488,349,3.096,445,3.195,531,3.195,641,4.176,707,5.652,712,2.439,728,3.304,823,3.007,1066,3.304,1160,4.176,1164,6.616,1693,3.427,1721,4.176,2272,6.23,2526,5.009,2527,5.009,2528,4.507,2529,5.009,2530,6.925]],["t/400",[0,1.131,2,2.605,16,3.908,17,1.698,23,1.77,25,1.536,52,2.548,58,1.487,59,4.258,112,2.67,113,2.223,170,3.036,182,2.443,197,3.616,263,7.249,264,6.553,265,2.395,314,4.786,353,2.044,383,3.89,418,2.548,482,2.184,496,3.396,502,4.105,583,3.89,611,3.665,793,3.245,823,2.953,829,3.665,1599,4.427,1646,3.859,1743,4.427,2531,8.495,2532,4.92,2533,4.92,2534,4.92,2535,4.92]],["t/402",[0,1.211,13,3.877,33,3.143,86,4.526,318,5.455,384,5.455,385,3.712,431,3.496,656,5.455,1524,6.949,1527,5.215,1693,5.01,2528,7.97,2536,7.322,2537,7.322]],["t/404",[0,1.255,11,2.413,16,4.165,22,5.007,23,1.965,36,2.757,104,3.932,123,3.492,265,3.696,500,4.842,771,5.194,810,4.842]],["t/406",[13,5.013,23,2.122,123,3.77,265,3.99]],["t/408",[0,1.505,17,1.531,36,2.783,120,4.736,181,2.992,183,3.084,228,5.709,280,3.235,445,4.887,521,5.054,1066,5.054]],["t/410",[11,2.103,13,3.503,16,3.828,23,1.713,25,1.293,36,2.403,48,3.101,123,3.828,259,4.365,265,3.221,270,2.664,271,5.954,355,4.09,459,3.427,583,3.764,725,3.503,838,4.527,1142,4.713,1528,5.954,2499,5.517,2538,6.617,2539,8.322,2540,6.617,2541,6.617,2542,6.617,2543,6.617]],["t/412",[15,4.297,16,4.283,17,1.389,26,3.857,59,3.766,147,2.984,189,4.951,493,5.179,686,4.297,710,4.297,735,4.882,1032,4.297,1159,5.179,1345,5.453,1401,4.951,1616,4.951,2390,5.796,2544,6.952,2545,6.952,2546,6.952]],["t/414",[0,1.085,5,2.566,12,4.675,25,1.283,58,1.984,87,4.058,112,3.233,113,2.966,159,4.594,686,4.058,774,5.149,842,4.187,848,5.297,883,3.833,955,4.891,956,5.462,957,6.169,1315,5.906,2214,5.473,2547,6.564,2548,6.564,2549,6.564,2550,5.906]],["t/416",[0,1.279,5,2.397,24,2.174,25,1.512,35,4.005,37,3.434,98,2.975,101,2.281,105,3.066,230,3.765,848,4.516]],["t/418",[5,1.423,17,1.513,25,0.897,32,1.667,37,2.038,52,2.378,53,3.601,56,1.766,83,2.112,100,2.681,101,1.354,106,1.74,110,3.028,112,2.956,151,3.27,159,4.828,161,3.235,164,3.052,181,2.956,189,3.27,232,2.756,238,2.87,308,2.038,365,3.421,382,2.611,437,2.235,462,3.27,566,2.28,580,2.547,584,3.421,592,2.192,603,3.235,619,2.038,621,4.131,648,3.27,686,4.027,746,3.028,765,3.421,826,4.155,842,4.155,844,3.028,848,3.804,851,3.27,863,4.457,954,5.11,956,5.435,957,3.421,1105,2.838,1272,2.681,1369,4.853,1577,3.421,1723,3.601,1735,3.421,1808,3.27,2550,4.131,2551,4.591,2552,4.591,2553,4.591,2554,4.591]],["t/420",[5,1.779,17,1.147,23,1.486,25,1.122,66,3.787,100,3.353,112,2.965,159,3.186,164,2.69,169,3.186,175,3.11,197,2.641,204,5.196,205,3.662,233,2.69,238,3.226,245,3.549,341,2.852,556,3.787,566,2.852,651,5.822,842,3.662,848,3.353,859,3.928,860,3.662,913,4.278,919,3.787,955,4.278,956,3.787,958,5.957,959,4.504,1284,5.166,1369,5.658,1428,5.658,1503,5.166,1641,4.504,2555,7.594,2556,5.166]],["t/424",[106,3.107,181,3.2,289,3.703,1071,5.227,1072,5.837]],["t/426",[1,3.857,2,3.681,10,3.857,25,1.359,59,3.766,170,3.087,259,4.585,294,4.756,321,2.842,383,3.954,406,4.297,407,5.179,552,4.585,701,5.179,766,3.6,848,4.059,1074,4.951,1129,3.857,2167,5.179,2557,6.952,2558,6.952,2559,6.952,2560,6.952]],["t/428",[0,1.582,16,2.777,23,2.031,24,1.696,25,1.18,32,2.192,86,3.731,98,2.322,182,2.998,191,3.349,197,2.777,202,3.731,300,4.71,361,3.111,406,5.707,423,4.299,572,4.13,792,3.196,848,3.525,1168,3.731,1532,5.431,2166,5.032,2561,6.036,2562,6.036,2563,6.036,2564,7.847,2565,6.036,2566,6.036,2567,6.036,2568,6.036]],["t/430",[2,3.712,16,3.225,86,4.334,233,3.285,238,2.658,247,3.798,258,5.845,300,4.208,405,4.471,406,4.334,407,6.427,633,5.499,848,4.094,1337,4.993,2569,7.011,2570,7.011,2571,7.011,2572,7.011,2573,7.011,2574,7.011,2575,7.011]],["t/434",[0,0.93,5,2.322,24,1.581,27,2.913,33,2.414,56,2.164,81,5.061,83,2.587,101,2.484,125,3.71,149,3.12,155,2.336,156,4.006,159,3.12,187,3.12,210,2.414,273,3.12,302,4.497,308,3.326,335,3.848,339,2.978,349,3.477,452,5.371,477,2.497,482,2.497,523,4.689,607,3.587,619,2.497,666,4.374,716,2.738,825,3.71,956,3.71,1055,4.19,1149,4.412,1215,4.412,1276,4.412,1576,3.848,2222,4.689,2576,5.624,2577,5.624,2578,5.624,2579,5.624,2580,5.624]],["t/436",[0,1.099,5,1.464,17,1.328,27,4.724,33,2.027,35,2.446,37,2.097,83,2.173,98,1.817,101,2.268,105,1.872,112,2.595,149,2.62,164,3.114,169,2.62,197,2.173,199,2.255,205,3.012,281,3.603,302,5.279,312,2.919,353,1.962,394,3.231,409,3.231,488,3.518,566,2.345,619,4.05,651,3.231,748,2.213,792,2.5,822,2.686,827,4.238,894,3.115,906,3.704,913,3.518,1053,3.704,1054,3.937,1055,6.796,1058,5.213,1059,3.937,1107,4.249,1141,3.115,1142,3.364,1216,3.937,1428,3.518,2159,3.704,2233,3.937,2581,4.723,2582,4.723,2583,4.723]],["t/440",[0,1.159,17,1.401,48,3.285,58,2.608,301,3.798,314,3.631,448,5.845,478,4.797,496,3.482,602,4.993,1514,5.845,1693,6.393,1826,4.993,1925,6.308,1927,6.308,1991,5.223,2584,7.011,2585,7.011,2586,7.011]],["t/442",[16,3.145,17,1.366,27,3.541,51,4.96,58,2.568,126,2.173,301,3.703,361,2.71,364,5.093,431,3.264,602,4.869,842,4.36,1202,5.7,1272,3.992,1693,4.677,2556,6.151,2587,9.24,2588,6.837,2589,6.837,2590,6.837,2591,6.837]],["t/444",[5,2.54,23,2.122,100,4.785,101,2.417,207,3.153]],["t/446",[11,2.173,36,3.085,77,3.541,101,3.03,281,3.203,309,2.752,353,3.528,418,3.541,1048,6.049,1070,4.869,1352,4.509,1867,6.662,2592,6.837,2593,5.363,2594,4.677]],["t/449",[0,1.267,5,2.375,23,1.984,77,3.968,101,2.685,126,2.435,207,2.948,385,3.885,399,4.151,814,4.474,2595,7.662]],["t/451",[0,0.194,1,0.649,3,0.382,4,0.502,5,0.657,13,0.62,17,1.147,23,0.549,24,1.002,25,0.697,26,1.176,27,2.138,33,0.502,37,0.52,49,0.703,56,0.45,58,1.248,66,0.772,83,0.975,98,0.815,101,1.693,102,0.723,105,0.84,109,0.593,110,0.772,112,1.612,126,0.923,128,3.024,138,1.579,141,0.772,147,0.502,148,2.14,159,1.612,161,2.687,169,0.649,171,1.032,175,0.634,178,2.14,182,1.443,191,1.176,196,0.683,197,3.948,199,2.203,207,1.117,210,0.502,213,0.683,224,0.703,232,0.703,238,0.444,244,0.772,245,1.31,246,1.352,254,0.772,255,0.834,256,3.446,270,0.471,273,0.649,281,1.361,289,0.529,290,3.961,297,0.683,302,2.14,308,2.237,309,0.853,310,1.538,341,1.053,356,0.834,361,2.275,371,1.31,378,0.801,385,1.075,388,1.31,399,1.148,401,0.872,405,2.274,406,1.796,418,0.606,433,1.51,452,1.352,459,0.606,462,0.834,475,1.579,477,3.167,478,0.801,479,0.976,480,0.918,483,0.834,498,0.772,502,3.024,531,0.746,555,0.723,557,1.398,566,0.581,569,1.238,580,2.795,581,1.122,589,1.238,592,1.387,603,1.443,611,0.872,612,2.539,619,2.999,624,0.976,628,0.834,630,0.918,651,1.45,666,0.683,676,0.834,687,0.872,688,0.918,708,0.872,710,0.723,712,0.57,722,0.723,733,1.987,740,0.801,770,2.069,792,1.887,810,0.746,811,5.052,812,0.872,813,0.772,814,0.683,815,0.872,816,0.834,817,0.872,818,0.872,819,1.987,820,0.872,821,2.204,822,1.652,823,0.703,825,3.043,826,0.746,827,1.853,835,2.164,838,0.801,839,0.772,841,4.309,842,1.352,845,2.439,848,0.683,850,1.579,851,0.834,852,1.579,853,0.872,854,0.872,855,0.872,856,0.872,857,0.872,858,1.579,859,0.801,860,1.352,861,0.772,862,0.976,863,2.824,871,0.872,872,0.976,873,0.918,880,0.872,881,1.579,882,0.918,883,0.683,884,0.801,885,0.872,886,0.872,887,0.918,888,0.872,889,0.976,890,0.976,891,0.976,892,0.976,893,1.053,894,1.916,895,0.976,899,1.579,906,0.918,913,1.579,919,1.398,928,1.663,929,1.51,936,2.972,949,0.918,950,1.51,951,0.872,952,1.053,953,0.918,954,0.918,955,1.579,956,1.398,957,0.872,958,0.918,959,0.918,985,1.053,986,1.053,987,1.907,988,1.053,989,1.053,990,1.053,991,1.053,992,1.053,993,1.663,994,0.918,995,1.053,996,1.053,997,1.053,998,1.907,999,1.51,1000,1.053,1001,0.976,1002,0.918,1003,0.834,1004,1.053,1005,1.053,1006,0.801,1007,0.918,1008,1.053,1009,0.976,1010,0.976,1011,1.053,1012,1.053,1013,1.053,1014,1.053,1015,0.872,1016,1.053,1017,0.976,1018,1.767,1019,0.976,1020,0.976,1021,0.976,1022,1.767,1023,0.976,1024,0.918,1025,1.767,1026,0.976,1027,0.872,1028,0.976,1029,0.976,1030,1.053,1031,1.767,1032,0.723,1033,1.053,1034,0.918,1035,1.053,1036,0.918,1037,0.834,1038,1.053,1039,1.579,1040,0.976,1041,0.872,1042,0.976,1043,0.918,1044,0.872,1045,0.976,1046,1.053,1047,1.053,1048,0.834,1049,1.053,1050,1.907,1051,1.053,1052,0.801,1053,0.918,1054,1.767,1055,2.164,1056,0.976,1057,0.872,1058,0.918,1059,0.976,1060,1.51,1061,1.053]],["t/453",[353,3.473,361,3.315,2596,6.559]],["t/455",[11,1.962,17,1.233,24,1.735,25,1.206,36,2.241,37,2.74,58,2.406,83,2.839,196,3.604,197,2.839,270,2.484,290,3.72,310,3.267,353,2.564,361,3.156,482,2.74,592,2.947,811,4.648,821,3.815,827,3.936,838,4.222,841,4.222,861,4.071,993,6.244,994,4.841,1048,4.396,1867,4.841,2069,5.145,2516,4.396,2596,4.841,2597,4.598,2598,5.553]],["t/457",[361,3.315,1352,5.515,2596,6.559]],["t/459",[11,1.812,17,1.139,24,1.603,25,1.114,27,2.953,36,2.071,37,2.532,58,2.285,83,2.623,196,3.33,197,2.623,238,2.162,270,2.295,290,3.812,310,3.019,361,2.997,482,2.532,592,2.723,619,2.532,811,4.952,821,3.525,827,3.637,838,3.901,841,3.901,861,3.761,993,5.93,994,4.473,1048,5.384,1352,4.986,1867,5.93,2069,4.754,2099,4.473,2516,4.061,2596,4.473,2597,4.248,2598,5.13,2599,4.473,2600,5.702]],["t/461",[0,1.103,3,2.175,5,2.067,29,4.4,35,3.455,101,1.968,105,2.644,106,2.529,164,3.126,171,3.248,184,4.751,207,2.566,353,3.475,385,4.633,399,3.614,595,3.313,608,4.004,619,2.962,735,3.794,1044,4.97,2248,5.561,2254,5.232,2601,5.232,2602,6.671,2603,5.232]],["t/463",[0,1.211,3,2.388,101,2.613,126,2.327,353,3.68,399,3.966,595,3.637,814,4.276,1039,5.455,1041,5.455,1850,5.455,2254,5.744,2603,5.744,2604,7.322,2605,7.322]],["t/465",[11,2.007,36,2.293,37,3.587,58,2.442,101,2.383,148,4.849,197,3.716,290,3.41,361,3.202,371,3.902,385,3.201,399,4.376,401,4.704,462,4.497,482,2.803,811,4.717,1039,6.018,1040,5.263,1041,4.704,1042,5.263,1043,4.952,1044,4.704,1045,5.263,2516,4.497,2597,4.704]],["t/467",[27,4.287,101,2.442,281,3.879,619,3.675]],["t/469",[0,1.303,27,4.082,101,2.73,281,4.337,353,3.274,619,3.5,2606,7.882]],["t/471",[101,2.656,105,2.982,112,2.937,155,3.125,353,3.125,766,3.896,844,4.962,1070,6.413,2099,5.901,2593,5.901,2599,7.062]],["t/473",[0,1.323,27,4.143,101,2.754,126,2.543,302,3.733,400,3.733,619,3.927,766,4.143,814,4.671,1053,4.877,1055,4.633,1058,4.877,1070,6.65,2593,7.324,2599,6.275,2607,8.401,2608,6.218]],["t/475",[11,2.07,27,3.373,36,2.365,37,2.892,47,4.852,105,2.582,175,3.528,197,2.996,199,3.11,222,5.43,229,4.852,290,3.815,482,2.892,496,3.235,619,2.892,811,3.803,822,4.686,841,4.456,1070,5.868,1361,4.852,2499,5.43,2516,4.639,2593,5.109,2597,4.852,2599,5.109,2609,6.513,2610,6.513]],["t/477",[101,2.585,105,2.852,155,2.989,309,3.528,418,4.539,451,5.36,579,5.643,583,4.092,766,3.726,844,4.745,1361,5.36,2099,5.643,2594,5.996,2611,7.307]],["t/479",[0,1.19,27,3.726,58,2.649,101,2.585,309,3.528,418,4.539,619,3.194,766,3.726,2594,5.996,2607,7.886,2611,5.998,2612,6.473,2613,6.473]],["t/481",[11,1.919,27,3.126,36,2.192,37,2.68,101,1.78,112,3.064,125,3.981,161,2.998,196,5.091,270,3.51,290,3.681,349,3.731,452,3.85,482,2.68,592,3.747,619,3.484,811,5.091,1010,5.032,1911,5.032,2516,4.299,2594,4.13,2597,4.497,2611,5.032,2612,5.431,2613,5.431,2614,8.719,2615,6.036,2616,6.036]],["t/483",[0,1.169,3,2.828,4,3.035,6,5.064,13,3.744,17,1.413,22,4.664,35,3.662,44,3.313,123,3.99,424,4.664,1289,4.371,1426,5.268,1889,5.547,2617,7.071,2618,7.071,2619,7.071,2620,7.071]],["t/485",[0,0.865,3,3.071,4,3.916,5,2.702,6,3.055,17,1.622,20,3.898,23,1.354,24,1.47,44,2.451,98,2.013,112,2.043,126,1.663,147,2.245,210,2.245,290,3.427,308,3.168,310,2.77,311,3.234,321,2.139,388,3.234,442,2.976,459,2.71,474,3.898,500,3.337,515,3.726,528,4.707,555,3.234,568,2.77,603,2.598,606,4.362,607,3.337,618,3.337,720,3.141,725,3.777,744,4.55,755,4.707,770,3.726,884,3.579,1106,4.362,1159,3.898,1168,3.234,2621,5.232]],["t/488",[3,1.926,4,2.535,11,1.877,29,3.896,58,2.608,149,3.277,184,6.769,310,3.127,399,4.191,400,4.644,452,3.767,524,3.625,581,3.127,595,2.933,619,3.831,714,4.924,1168,3.651,1218,4.207,1983,4.4,2594,6.798,2601,4.633,2622,5.314,2623,6.961,2624,6.961,2625,5.314]],["t/490",[14,4.092,97,4.588,238,2.727,716,4.267,722,5.418,770,6.242,771,4.922,805,5.998,1424,5.643,1990,7.307,2071,7.307,2626,7.886,2627,6.473]],["t/492",[157,5.173,750,4.491,787,6.312,788,5.843,795,6.949,802,7.373,2628,6.588]],["t/496",[750,3.745,786,6.986,787,6.331,788,5.875,795,6.986,798,6.647,802,6.635,2628,6.647,2629,7.388]],["t/498",[157,5.593,750,4.239]],["t/500",[14,4.057,97,4.549,238,2.704,716,4.244,722,4.409,770,5.08,771,4.88,803,6.417,805,5.946,1424,5.594,1990,7.268,2070,6.417,2071,7.268,2626,7.844,2627,6.417,2630,7.132]],["t/502",[3,2.378,4,3.13,11,1.717,25,1.056,29,3.564,56,2.079,58,2.789,149,2.998,184,6.572,310,2.861,399,3.95,400,4.377,452,4.651,524,3.417,581,2.861,595,2.684,619,3.665,714,6.08,775,4.862,776,4.862,1168,4.507,1218,3.848,1983,4.026,2594,6.046,2601,4.238,2622,4.862,2623,6.561,2624,6.561,2625,4.862,2631,8.836,2632,5.403]],["t/505",[0,1.329,5,2.49,11,2.554,12,5.723,29,5.3,101,2.37,2633,8.035]],["t/507",[0,1.169,3,2.306,5,2.191,17,1.733,101,2.767,207,2.72,251,4.371,270,2.846,361,2.803,399,3.83,595,4.307,725,3.744,773,5.895,887,5.547,2594,4.838,2634,7.071,2635,6.362]],["t/509",[3,1.954,17,1.561,35,3.103,36,2.176,44,2.808,53,4.7,59,3.246,91,5.391,93,3.822,101,1.767,149,3.324,353,2.489,361,2.375,399,4.231,431,2.861,514,3.952,515,5.563,521,3.952,583,4.442,589,3.499,595,3.879,619,2.661,725,3.172,1337,4.268,1850,5.819,2089,4.464,2159,4.7,2254,4.7,2603,4.7,2635,7.027,2636,5.992,2637,5.992,2638,5.992,2639,5.992,2640,5.992]],["t/511",[0,1.008,17,1.375,32,2.214,36,2.214,37,3.056,99,1.914,100,1.862,101,2.642,105,1.264,111,1.584,129,3.069,155,1.325,164,1.494,167,1.727,169,1.769,182,1.584,184,2.271,186,2.899,206,1.584,207,1.227,209,1.467,210,2.131,250,2.501,251,1.971,281,2.327,310,2.629,336,2.659,345,4.022,353,4.113,361,3.131,399,5.201,401,4.543,409,2.182,431,1.523,451,2.376,475,2.376,572,2.182,589,1.862,606,2.659,608,3.66,619,3.507,660,5.312,712,1.552,735,4.493,792,2.629,796,4.14,1039,5.557,1043,4.783,1044,4.543,1074,2.271,1361,2.376,1387,2.182,2601,2.501,2641,3.189,2642,3.189,2643,3.189,2644,7.458,2645,6.098,2646,2.869,2647,7.458]],["t/513",[3,2.317,11,1.652,17,1.419,24,1.461,25,1.016,98,2.733,101,2.095,112,3.16,161,2.582,164,3.792,165,2.582,207,2,210,2.231,233,2.436,245,3.214,246,3.316,247,2.816,270,2.093,289,2.349,477,2.308,531,3.316,579,4.078,592,4.488,682,5.922,688,4.078,740,3.557,792,2.752,880,5.292,881,7.003,882,6.822,930,4.334,1006,3.557,1009,4.334,1141,3.429,1369,3.873,1863,4.334,2648,5.199,2649,7.104,2650,5.199]],["t/515",[0,0.364,3,0.718,5,1.141,11,0.7,17,1.107,23,0.57,24,1.873,25,1.205,33,3.414,37,2.105,52,1.14,58,0.665,77,1.906,83,1.013,98,1.416,101,1.966,104,1.14,106,1.798,112,2.896,129,2.275,155,0.914,161,1.093,171,1.792,175,3.34,181,0.86,183,0.886,186,1.285,187,1.221,197,2.181,199,1.051,202,1.361,206,1.093,207,0.847,209,1.013,233,2.889,259,1.452,276,1.116,280,0.929,297,1.285,308,1.634,309,3.432,321,0.9,337,1.64,341,1.828,362,1.506,365,4.128,374,4.593,378,2.518,409,1.506,418,1.14,433,4.747,442,1.252,475,1.64,477,4.253,487,3.068,546,3.068,579,1.727,595,1.093,611,3.533,628,2.621,677,1.981,687,2.742,710,1.361,727,1.981,767,4.267,835,2.742,839,2.427,845,5.935,918,1.727,919,1.452,936,3.953,999,1.568,1015,1.64,1018,3.953,1019,1.835,1020,1.835,1021,1.835,1022,1.835,1023,3.953,1024,2.887,1025,3.068,1026,6.632,1027,4.128,1028,1.835,1029,1.835,1031,3.068,1032,1.361,1034,1.727,1052,2.518,1060,1.568,1215,1.727,1240,1.835,1317,1.64,1330,1.568,1401,1.568,1617,3.311,1762,1.727,2235,3.953,2646,1.981,2651,2.201,2652,2.201,2653,2.201,2654,2.201,2655,2.201,2656,3.68,2657,2.201,2658,3.68,2659,3.68,2660,3.68,2661,2.201,2662,2.201,2663,2.201,2664,2.201,2665,2.201,2666,3.68,2667,3.68,2668,2.201,2669,2.201,2670,2.201,2671,2.201,2672,2.201,2673,2.201,2674,2.201]],["t/517",[3,2.961,17,1.155,24,2.4,26,4.233,28,5.236,51,3.376,118,4.821,126,1.838,147,3.665,165,2.872,303,3.814,352,4.118,592,2.761,766,2.994,814,4.986,816,5.434,1041,6.765,1337,4.118,1369,4.308,1829,6.361,2299,5.202,2603,7.404,2675,5.782,2676,5.782]],["t/519",[0,1.042,23,0.869,24,2.267,25,1.383,32,1.877,33,1.441,36,1.219,83,2.898,101,2.559,126,1.067,145,2.141,147,2.218,182,4.858,183,1.352,186,1.961,206,2.566,229,2.501,353,1.395,355,2.075,388,2.075,399,2.799,478,3.535,510,2.075,598,2.391,814,1.961,827,2.141,835,2.501,1168,3.194,1276,4.053,1277,4.649,2167,2.501,2315,3.021,2324,3.021,2677,9.781,2678,9.781,2679,3.358,2680,3.358,2681,3.358,2682,3.358,2683,3.358,2684,3.358,2685,3.358,2686,3.358,2687,5.167,2688,3.358,2689,6.299,2690,3.358,2691,3.358,2692,3.358,2693,3.358,2694,3.358,2695,3.358,2696,5.167,2697,3.358,2698,3.358,2699,3.358,2700,3.358,2701,3.358,2702,3.358,2703,6.299,2704,3.358,2705,3.358,2706,3.358,2707,3.358,2708,3.358,2709,3.358,2710,3.358,2711,3.358,2712,5.167,2713,3.358,2714,3.358]]],"invertedIndex":[["",{"_index":58,"t":{"8":{"position":[[32,1]]},"17":{"position":[[372,1],[660,1],[684,1],[711,1],[736,1],[757,1],[774,1],[803,1],[1769,1],[1793,1],[1820,1],[1849,1],[1863,1],[1882,1],[1924,1],[1950,1],[2841,2],[3198,1],[3248,1],[3258,1],[3260,1],[3273,6],[3287,3],[3316,7],[3369,1],[3371,2],[3382,1],[3395,1],[3397,1]]},"24":{"position":[[0,1],[15,2]]},"28":{"position":[[0,1],[42,1],[78,1],[121,2],[181,2]]},"30":{"position":[[14,2],[52,2],[95,2],[133,2],[168,2],[219,2]]},"34":{"position":[[391,1]]},"38":{"position":[[442,1],[528,1]]},"40":{"position":[[69,2],[217,2],[333,2]]},"42":{"position":[[0,2]]},"50":{"position":[[617,1],[630,1],[1234,2],[1318,3],[1322,2]]},"52":{"position":[[832,1],[929,1]]},"128":{"position":[[2290,3],[2439,3],[2625,3],[3791,1],[3817,1],[3897,1],[3923,1],[6755,1],[6757,4],[6762,1],[8092,3],[8170,1],[8196,1],[9853,1],[9876,1]]},"174":{"position":[[238,99],[338,1],[345,1],[351,1],[358,1],[365,1],[374,1],[382,1],[393,1],[404,1],[413,1],[415,99],[515,1],[525,1],[531,1],[536,1],[547,1],[552,1],[556,1],[561,1],[568,1],[572,1],[574,1],[584,1],[590,1],[595,1],[606,1],[611,1],[615,1],[620,1],[627,1],[631,1],[633,1],[643,1],[649,1],[654,1],[665,1],[670,1],[674,1],[679,1],[686,1],[690,1],[692,1],[702,1],[708,1],[713,1],[724,1],[729,1],[733,1],[738,1],[745,1],[749,1],[751,1],[761,1],[767,1],[772,1],[783,1],[788,1],[792,1],[797,1],[804,1],[808,1],[810,1],[820,1],[826,1],[831,1],[842,1],[847,1],[857,1],[862,1],[869,1],[873,1],[875,1],[885,1],[891,1],[896,1],[907,1],[912,1],[922,1],[927,1],[934,1],[938,1],[940,1],[950,1],[956,1],[961,1],[973,1],[978,1],[988,1],[993,1],[1000,1],[1004,1],[1006,99],[1106,1],[1178,1],[1180,99]]},"190":{"position":[[502,1],[559,1],[579,1],[635,2],[647,1],[649,1],[712,1],[727,1],[786,1],[835,1],[859,1],[1008,1]]},"194":{"position":[[74,1],[176,1],[525,1]]},"198":{"position":[[343,1]]},"200":{"position":[[5,1],[25,1],[53,1],[99,1],[108,1],[2531,1]]},"202":{"position":[[1261,1]]},"210":{"position":[[329,3],[364,1],[491,2]]},"236":{"position":[[42,3],[58,1],[60,3],[67,1],[69,3],[78,1],[80,3],[102,1],[104,3],[122,3],[135,3],[144,1],[261,1],[281,1],[303,1],[339,1],[404,1],[455,1],[502,1],[512,1],[555,1],[578,1],[600,1],[665,1],[733,1],[780,1],[846,1],[916,1],[976,1],[999,1],[1041,1],[1124,1],[1154,1],[1171,1],[1216,1],[1229,2],[1246,1],[1273,1],[1288,1],[1358,1],[1428,1],[1492,1],[1564,1],[1616,1]]},"238":{"position":[[0,1],[37,1],[57,1],[97,1],[109,1],[111,1],[142,1],[144,1],[157,1],[159,1],[187,1],[189,1],[232,1],[234,1],[243,1],[245,1],[274,1],[276,1],[278,1],[295,1],[297,1],[363,1],[445,1],[523,1],[529,1],[605,1],[614,1],[630,1],[645,1],[664,1],[676,1]]},"240":{"position":[[788,1],[825,1],[845,1],[862,1],[875,1],[877,1],[905,1],[907,1],[950,1],[952,1],[961,1],[963,1],[992,1],[994,1],[996,1],[1013,1],[1015,1],[1071,1],[1132,1],[1164,1],[1186,1],[1216,1],[1282,1],[1335,1],[1344,1],[1390,1],[1428,1],[1459,1],[1475,1],[1490,1],[1509,1],[1522,1],[1566,1],[1828,1],[1891,1],[1953,1],[2544,1],[2571,1],[2581,2],[2594,1],[2621,1],[2631,2],[2648,1],[2674,1]]},"242":{"position":[[0,1],[58,1],[80,1]]},"244":{"position":[[531,1],[589,1],[609,1],[638,1],[711,1],[762,1],[816,1],[859,1],[861,1],[891,1],[893,1],[926,1],[928,1],[951,1],[953,1],[975,1],[977,1],[985,1],[987,1],[1002,1],[1004,1],[1012,1],[1014,1],[1021,1],[1023,1],[1033,1],[1113,1],[1177,1],[1231,1],[1249,1],[1264,1],[1313,1],[1357,2],[1360,1],[1368,1],[1389,1],[1394,5],[1400,1],[1481,1],[1556,1],[1643,1],[1725,1],[1811,1],[1886,1],[1939,1],[1954,1],[1968,1],[1979,1],[2068,2],[2071,1],[2106,2],[2109,1],[2130,1],[2150,1],[2225,1]]},"253":{"position":[[202,1]]},"280":{"position":[[90,1],[110,1],[165,1]]},"282":{"position":[[256,1],[366,1],[418,1],[475,1],[545,1],[632,1],[846,1],[909,2],[912,3],[916,2],[1105,2],[1108,1],[1187,3],[1285,2],[1288,1],[1371,3]]},"284":{"position":[[276,2],[942,2],[945,2],[948,1],[970,2],[973,1],[975,2],[1014,2],[1045,2],[1053,3]]},"292":{"position":[[241,1],[352,1],[400,1],[536,3],[551,1],[587,1],[649,1],[1660,1],[1771,1],[1819,1],[1978,3],[1993,1],[2029,1],[2091,1],[2263,1],[2283,1],[2344,1],[2397,1]]},"296":{"position":[[0,1],[14,1],[23,2],[257,2],[339,1],[365,1],[405,1],[447,1],[481,1],[517,1],[548,2],[563,1],[581,1],[599,2],[618,2],[648,1],[669,1],[695,1],[713,1],[743,1],[763,1],[790,1],[814,1],[851,1],[876,1],[902,1],[925,1],[942,1],[965,2],[981,2],[996,2],[1014,2],[1036,2],[1056,2],[1079,2],[1103,1],[1125,1],[1154,1],[1171,1],[1189,2],[1228,2],[1254,2],[1282,1],[1325,1],[1370,1],[1401,1],[1427,2],[1449,2]]},"318":{"position":[[2290,3],[2439,3],[2625,3],[3758,1],[3784,1],[3864,1],[3890,1],[6615,1],[6617,4],[6622,1]]},"320":{"position":[[698,1],[747,3],[773,1],[820,3],[847,3],[862,1],[891,3],[899,3],[916,3],[929,1],[964,1],[966,3],[981,3],[995,1],[1037,3],[1068,1],[1118,3],[1145,3],[1163,1],[1192,3],[1209,1],[1254,1],[1256,3],[1271,3],[1291,1],[1332,1],[1334,3],[1353,3],[1363,1],[1401,1],[1403,3],[1421,3],[1433,1],[1473,1],[1475,3],[1535,1],[1537,3],[1597,3],[1611,1],[1653,1],[1655,3],[1715,1],[1717,1],[1719,3],[1744,1],[1746,3],[1806,1],[1808,3],[1833,3],[1848,1],[1891,3]]},"322":{"position":[[274,1]]},"362":{"position":[[1773,1]]},"364":{"position":[[697,1]]},"366":{"position":[[195,1],[207,1],[2750,1],[3173,1]]},"370":{"position":[[937,1],[939,4],[944,1]]},"388":{"position":[[137,1],[158,1],[202,1]]},"390":{"position":[[104,2]]},"392":{"position":[[306,6]]},"400":{"position":[[392,2]]},"414":{"position":[[266,2]]},"440":{"position":[[0,1],[112,2]]},"442":{"position":[[0,2],[64,2]]},"451":{"position":[[1672,3],[1750,1],[1776,1],[3926,1],[3949,1]]},"455":{"position":[[130,1],[156,1]]},"459":{"position":[[130,1],[156,1]]},"465":{"position":[[192,1],[215,1]]},"479":{"position":[[157,3],[182,3]]},"488":{"position":[[34,1],[43,1],[76,1]]},"502":{"position":[[56,1],[65,1],[140,1],[149,1],[193,1]]},"515":{"position":[[2696,1]]}}}],["0",{"_index":224,"t":{"17":{"position":[[2919,1]]},"19":{"position":[[209,1],[241,1],[280,1]]},"128":{"position":[[2112,1]]},"174":{"position":[[570,1],[629,1],[688,1],[747,1],[806,1],[871,1],[936,1]]},"240":{"position":[[1342,1]]},"270":{"position":[[1062,1]]},"318":{"position":[[2112,1]]},"362":{"position":[[1365,1]]},"366":{"position":[[388,1],[559,1]]},"370":{"position":[[1911,1]]},"451":{"position":[[1062,1]]}}}],["0..0",{"_index":203,"t":{"17":{"position":[[2162,4]]}}}],["0..7",{"_index":136,"t":{"17":{"position":[[731,4]]},"128":{"position":[[11336,6]]}}}],["0.0.0.0",{"_index":963,"t":{"128":{"position":[[6124,9]]},"318":{"position":[[5984,9]]},"370":{"position":[[644,9]]}}}],["0.00",{"_index":2353,"t":{"362":{"position":[[1782,4]]}}}],["0.75",{"_index":1269,"t":{"174":{"position":[[1130,5],[1148,4]]}}}],["00:31",{"_index":1441,"t":{"200":{"position":[[1152,5]]}}}],["00:35",{"_index":1446,"t":{"200":{"position":[[1211,5],[1674,5]]}}}],["00:36",{"_index":1434,"t":{"200":{"position":[[1089,5],[1266,5],[1344,5],[1426,5],[1509,5],[1592,5],[1757,5],[1840,5],[1923,5],[2006,5],[2089,5],[2172,5],[2255,5],[2338,5],[2421,5]]}}}],["01",{"_index":2678,"t":{"519":{"position":[[151,2],[278,2],[377,2],[470,2],[516,2],[643,2],[770,2],[837,2],[902,2],[996,2],[1104,2],[1344,2],[1533,2],[1722,2],[1787,2],[1860,2]]}}}],["03:06:35.048",{"_index":2679,"t":{"519":{"position":[[154,14]]}}}],["03:06:35.050",{"_index":2683,"t":{"519":{"position":[[281,14]]}}}],["03:06:35.697",{"_index":2685,"t":{"519":{"position":[[380,14]]}}}],["03:06:35.698",{"_index":2689,"t":{"519":{"position":[[473,14],[519,14],[646,14]]}}}],["03:06:35.732",{"_index":2692,"t":{"519":{"position":[[773,14]]}}}],["03:09:23.813",{"_index":2694,"t":{"519":{"position":[[840,14]]}}}],["03:09:23.816",{"_index":2695,"t":{"519":{"position":[[905,14]]}}}],["03:09:23.818",{"_index":2696,"t":{"519":{"position":[[999,14],[1107,14]]}}}],["03:09:23.830",{"_index":2703,"t":{"519":{"position":[[1347,14],[1536,14],[1725,14]]}}}],["03:15:50.191",{"_index":2710,"t":{"519":{"position":[[1790,14]]}}}],["03:16:02.728",{"_index":2713,"t":{"519":{"position":[[1863,14]]}}}],["05",{"_index":1436,"t":{"200":{"position":[[1107,2]]}}}],["09",{"_index":1564,"t":{"219":{"position":[[122,2]]}}}],["0x",{"_index":1970,"t":{"270":{"position":[[1295,2]]}}}],["0x0000000000000000000000000000000000000000",{"_index":895,"t":{"128":{"position":[[3194,44]]},"318":{"position":[[3147,44]]},"451":{"position":[[2485,44]]}}}],["0x00000000219ab540356cbb839cbe05303d7705fa",{"_index":2675,"t":{"517":{"position":[[232,42]]}}}],["0x0000…0000:0",{"_index":227,"t":{"17":{"position":[[2946,13]]}}}],["0x08b1",{"_index":2458,"t":{"366":{"position":[[2038,8]]}}}],["0x1234",{"_index":836,"t":{"128":{"position":[[1059,7]]},"318":{"position":[[1059,7]]}}}],["0x1234:100",{"_index":834,"t":{"128":{"position":[[948,10]]},"318":{"position":[[948,10]]}}}],["0x15fa",{"_index":1254,"t":{"174":{"position":[[774,8]]}}}],["0x17c6…71a7",{"_index":2461,"t":{"366":{"position":[[2159,11],[2321,11]]}}}],["0x2d6a",{"_index":2443,"t":{"366":{"position":[[1212,8]]}}}],["0x3655…1658",{"_index":2450,"t":{"366":{"position":[[1370,11]]}}}],["0x3dba",{"_index":2363,"t":{"362":{"position":[[2074,8]]}}}],["0x4242424242424242424242424242424242424242",{"_index":2676,"t":{"517":{"position":[[365,42]]}}}],["0x44e4…20a4",{"_index":2370,"t":{"362":{"position":[[2230,11]]},"366":{"position":[[1566,11]]}}}],["0x4f7e…0e3a",{"_index":2456,"t":{"366":{"position":[[1997,11]]}}}],["0x5bc1",{"_index":2463,"t":{"366":{"position":[[2200,8],[2362,8]]}}}],["0x5cc0…3874:195764",{"_index":2434,"t":{"366":{"position":[[842,18],[1035,18]]}}}],["0x5cec…f5b8",{"_index":2431,"t":{"366":{"position":[[779,11],[972,11]]}}}],["0x6761520",{"_index":1448,"t":{"200":{"position":[[1280,9]]}}}],["0x6981…682f:195778",{"_index":2381,"t":{"362":{"position":[[2572,18]]},"366":{"position":[[1908,18],[2060,18],[2222,18],[2384,18],[2536,18],[2688,18]]}}}],["0x6f74",{"_index":2433,"t":{"366":{"position":[[820,8],[1013,8]]}}}],["0x70fd…5157:195775",{"_index":2364,"t":{"362":{"position":[[2096,18]]}}}],["0x7ee6…2a15",{"_index":2343,"t":{"362":{"position":[[1404,11],[1832,11]]}}}],["0x7fa2f0001060",{"_index":1452,"t":{"200":{"position":[[1358,14]]}}}],["0x7fcd80001060",{"_index":1454,"t":{"200":{"position":[[1440,14]]}}}],["0x7fcd84001060",{"_index":1456,"t":{"200":{"position":[[1523,14]]}}}],["0x7fcd88001060",{"_index":1458,"t":{"200":{"position":[[1606,14]]}}}],["0x7fcd8c001060",{"_index":1460,"t":{"200":{"position":[[1688,14]]}}}],["0x7fcd90000e60",{"_index":1462,"t":{"200":{"position":[[1771,14]]}}}],["0x7fcd94000e60",{"_index":1464,"t":{"200":{"position":[[1854,14]]}}}],["0x7fcd98000e60",{"_index":1466,"t":{"200":{"position":[[1937,14]]}}}],["0x7fcd9c000e60",{"_index":1468,"t":{"200":{"position":[[2020,14]]}}}],["0x7fcda0000e60",{"_index":1470,"t":{"200":{"position":[[2103,14]]}}}],["0x7fcda4000e60",{"_index":1472,"t":{"200":{"position":[[2186,14]]}}}],["0x7fcda8000e60",{"_index":1474,"t":{"200":{"position":[[2269,14]]}}}],["0x7fcdac000e60",{"_index":1476,"t":{"200":{"position":[[2352,14]]}}}],["0x7fcdb8000d60",{"_index":1478,"t":{"200":{"position":[[2435,14]]}}}],["0x8199",{"_index":1261,"t":{"174":{"position":[[898,8]]}}}],["0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037",{"_index":2183,"t":{"320":{"position":[[1479,55],[1659,55]]}}}],["0x8f3f…2f81:195766",{"_index":2444,"t":{"366":{"position":[[1234,18]]}}}],["0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7",{"_index":2691,"t":{"519":{"position":[[667,98]]}}}],["0x90ea…c655",{"_index":2378,"t":{"362":{"position":[[2509,11]]},"366":{"position":[[1845,11]]}}}],["0x9442",{"_index":2346,"t":{"362":{"position":[[1447,8],[1875,8]]}}}],["0x9475…425a:195769",{"_index":2453,"t":{"366":{"position":[[1433,18]]}}}],["0x95c4",{"_index":1238,"t":{"174":{"position":[[538,8]]}}}],["0x9649",{"_index":2422,"t":{"366":{"position":[[465,8],[636,8]]}}}],["0x9cbd…ba83:195776",{"_index":2373,"t":{"362":{"position":[[2293,18]]},"366":{"position":[[1629,18]]}}}],["0x9dfc",{"_index":1245,"t":{"174":{"position":[[597,8]]}}}],["0x[a",{"_index":889,"t":{"128":{"position":[[3033,5]]},"318":{"position":[[3019,5]]},"451":{"position":[[2324,5]]}}}],["0xa329f988c16993768299643d918a2694892c012765d896a16f",{"_index":2184,"t":{"320":{"position":[[1541,55],[1750,55]]}}}],["0xa329f988c16993768299643d918a2694892c012765d896a16f.json",{"_index":2189,"t":{"320":{"position":[[1895,57]]}}}],["0xa488",{"_index":2475,"t":{"366":{"position":[[2666,8]]}}}],["0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea",{"_index":2690,"t":{"519":{"position":[[540,98]]}}}],["0xb5bf",{"_index":2470,"t":{"366":{"position":[[2514,8]]}}}],["0xb7576e9d314df41ec5506494293afb1bd5d3f65d",{"_index":2649,"t":{"513":{"position":[[415,42],[535,43]]}}}],["0xbeae",{"_index":1251,"t":{"174":{"position":[[715,8]]}}}],["0xbf30…7e7c:195777",{"_index":2423,"t":{"366":{"position":[[487,18],[658,18]]}}}],["0xc9fd…28c5",{"_index":2468,"t":{"366":{"position":[[2473,11]]}}}],["0xca61",{"_index":2372,"t":{"362":{"position":[[2271,8]]},"366":{"position":[[1607,8]]}}}],["0xca9b",{"_index":2380,"t":{"362":{"position":[[2550,8]]},"366":{"position":[[1886,8]]}}}],["0xcc67…3345",{"_index":225,"t":{"17":{"position":[[2921,11]]}}}],["0xccaff4b99986a7b05e06738f1828a32e40799b277fd9f9ff069be55341fe0229",{"_index":2015,"t":{"280":{"position":[[184,68]]}}}],["0xd15f…b605",{"_index":2361,"t":{"362":{"position":[[2033,11]]}}}],["0xd7ba…8386:189636",{"_index":2481,"t":{"366":{"position":[[3518,18]]}}}],["0xdafd",{"_index":2452,"t":{"366":{"position":[[1411,8]]}}}],["0xde91…d4cb",{"_index":2473,"t":{"366":{"position":[[2625,11]]}}}],["0xdf3f",{"_index":1248,"t":{"174":{"position":[[656,8]]}}}],["0xe0cf…9f3c",{"_index":2441,"t":{"366":{"position":[[1171,11]]}}}],["0xe359…4d7e:195763",{"_index":2347,"t":{"362":{"position":[[1469,18],[1897,18]]}}}],["0xed93…7b0a",{"_index":2420,"t":{"366":{"position":[[422,11],[593,11]]}}}],["0xf00",{"_index":2607,"t":{"473":{"position":[[64,5],[134,5],[204,5],[381,5]]},"479":{"position":[[71,5],[134,5]]}}}],["0xf8ff",{"_index":1257,"t":{"174":{"position":[[833,8]]}}}],["0xf97e180c050e5ab072211ad2c213eb5aee4df134",{"_index":2085,"t":{"292":{"position":[[589,45],[2031,45]]}}}],["1",{"_index":129,"t":{"17":{"position":[[564,1],[1144,1],[2875,1],[3393,1]]},"36":{"position":[[294,1],[639,1]]},"176":{"position":[[256,1]]},"200":{"position":[[1060,1],[1128,1],[1237,1],[1316,1],[1399,1],[1481,1],[1564,1],[1647,1],[1729,1],[1812,1],[1895,1],[1978,1],[2061,1],[2144,1],[2227,1],[2310,1],[2393,1],[2476,1]]},"238":{"position":[[674,1]]},"240":{"position":[[1519,2],[2634,1],[2658,3]]},"362":{"position":[[1925,1]]},"366":{"position":[[870,1],[1063,1],[2156,2]]},"511":{"position":[[396,2],[1829,1]]},"515":{"position":[[1783,3],[2591,2]]}}}],["1.00",{"_index":1242,"t":{"174":{"position":[[563,4],[622,4],[681,4],[740,4],[799,4],[864,4],[1139,5],[1173,4]]}}}],["1.1",{"_index":2446,"t":{"366":{"position":[[1302,3]]}}}],["1.20",{"_index":1262,"t":{"174":{"position":[[929,4]]}}}],["1.20.0",{"_index":2053,"t":{"284":{"position":[[214,6]]}}}],["1.50",{"_index":1265,"t":{"174":{"position":[[995,4]]}}}],["1.6",{"_index":2438,"t":{"366":{"position":[[1103,3]]}}}],["10",{"_index":2652,"t":{"515":{"position":[[910,5]]}}}],["100",{"_index":835,"t":{"128":{"position":[[1039,3],[6874,3],[9145,6],[9162,6],[9339,5]]},"318":{"position":[[1039,3],[6734,3]]},"451":{"position":[[3218,6],[3235,6],[3412,5]]},"515":{"position":[[367,6],[384,6]]},"519":{"position":[[401,4]]}}}],["100*100/(100+percentag",{"_index":2669,"t":{"515":{"position":[[2474,25]]}}}],["100,000",{"_index":1643,"t":{"232":{"position":[[622,8]]}}}],["1000",{"_index":2478,"t":{"366":{"position":[[3175,5]]}}}],["10000/(100+25",{"_index":2672,"t":{"515":{"position":[[2681,14]]}}}],["1000hz",{"_index":1499,"t":{"202":{"position":[[693,7]]}}}],["100gb",{"_index":76,"t":{"8":{"position":[[216,5]]}}}],["100hz",{"_index":1498,"t":{"202":{"position":[[684,5]]}}}],["108",{"_index":2360,"t":{"362":{"position":[[2028,4]]}}}],["12000",{"_index":914,"t":{"128":{"position":[[4029,5],[5157,5]]},"318":{"position":[[3996,5],[5032,5]]}}}],["123919",{"_index":1457,"t":{"200":{"position":[[1578,6]]}}}],["127.0.0.1",{"_index":138,"t":{"17":{"position":[[747,9]]},"128":{"position":[[2689,11],[5680,11],[7964,11]]},"318":{"position":[[2689,11],[5540,11]]},"370":{"position":[[2224,11]]},"451":{"position":[[1544,11],[5400,11]]}}}],["14:17",{"_index":1481,"t":{"200":{"position":[[2500,5]]}}}],["15",{"_index":2408,"t":{"364":{"position":[[1710,4]]}}}],["152786",{"_index":1463,"t":{"200":{"position":[[1826,6]]}}}],["15:12:45.274",{"_index":2320,"t":{"362":{"position":[[535,14]]}}}],["15:12:45.327",{"_index":2323,"t":{"362":{"position":[[613,14]]}}}],["15:12:57.747",{"_index":2326,"t":{"362":{"position":[[695,14]]}}}],["15:13:18.077[network",{"_index":2331,"t":{"362":{"position":[[907,21]]}}}],["15:13:18.270[rest",{"_index":2336,"t":{"362":{"position":[[1182,18]]}}}],["15:13:18.271",{"_index":2338,"t":{"362":{"position":[[1268,14]]}}}],["15:13:18.280",{"_index":2340,"t":{"362":{"position":[[1319,14]]}}}],["15:13:23.009[chain",{"_index":2348,"t":{"362":{"position":[[1495,19]]}}}],["15:13:29.287",{"_index":2352,"t":{"362":{"position":[[1742,14]]}}}],["15:13:41.298",{"_index":2426,"t":{"366":{"position":[[684,14],[879,14]]}}}],["15:13:53.151",{"_index":2437,"t":{"366":{"position":[[1072,14]]}}}],["15:14:05.425",{"_index":2445,"t":{"366":{"position":[[1271,14]]}}}],["15:14:41.003",{"_index":2357,"t":{"362":{"position":[[1934,14]]}}}],["15:14:53.001",{"_index":2366,"t":{"362":{"position":[[2133,14]]},"366":{"position":[[1470,14]]}}}],["15:15:01.443[network",{"_index":2374,"t":{"362":{"position":[[2330,21]]},"366":{"position":[[1666,21]]}}}],["15:15:01.446[sync",{"_index":2375,"t":{"362":{"position":[[2395,18]]},"366":{"position":[[1731,18]]}}}],["15:15:05.000",{"_index":2376,"t":{"362":{"position":[[2457,14]]},"366":{"position":[[1793,14]]}}}],["15:15:17.003",{"_index":2454,"t":{"366":{"position":[[1945,14]]}}}],["15:15:41.001",{"_index":2459,"t":{"366":{"position":[[2097,14]]}}}],["15:15:53.001",{"_index":2464,"t":{"366":{"position":[[2259,14]]}}}],["15:16:05.000",{"_index":2466,"t":{"366":{"position":[[2421,14]]}}}],["15:16:17.017",{"_index":2471,"t":{"366":{"position":[[2573,14]]}}}],["15:24:08.034",{"_index":2417,"t":{"366":{"position":[[342,14]]}}}],["15:24:17.000",{"_index":2424,"t":{"366":{"position":[[513,14]]}}}],["16",{"_index":1241,"t":{"174":{"position":[[558,2],[617,2],[676,2],[735,2],[794,2],[859,2],[924,2],[990,2]]}}}],["1654128694.json",{"_index":2643,"t":{"511":{"position":[[162,17]]}}}],["1669713528",{"_index":134,"t":{"17":{"position":[[700,10],[1809,10]]}}}],["167991/6",{"_index":216,"t":{"17":{"position":[[2826,8]]}}}],["16gb",{"_index":72,"t":{"8":{"position":[[190,4]]}}}],["16uiu2hamdsget67va6vcnaw2tu1ae2yujidmnmurmmwnvsser7zq",{"_index":2333,"t":{"362":{"position":[[942,54]]}}}],["17/node",{"_index":1565,"t":{"219":{"position":[[125,7]]}}}],["180",{"_index":1511,"t":{"202":{"position":[[1424,3]]}}}],["183831",{"_index":1461,"t":{"200":{"position":[[1743,6]]}}}],["18550/tcp",{"_index":2291,"t":{"346":{"position":[[541,9]]}}}],["1gb",{"_index":2193,"t":{"322":{"position":[[195,3]]}}}],["1tb",{"_index":80,"t":{"8":{"position":[[242,3]]}}}],["2",{"_index":186,"t":{"17":{"position":[[1633,1]]},"128":{"position":[[4130,1]]},"174":{"position":[[1002,1]]},"200":{"position":[[1183,1]]},"238":{"position":[[659,4]]},"240":{"position":[[1504,4],[2643,4],[2669,4]]},"318":{"position":[[4097,1]]},"322":{"position":[[161,1]]},"366":{"position":[[910,1],[1461,1],[2318,2]]},"511":{"position":[[1425,2],[1774,2]]},"515":{"position":[[2746,2]]},"519":{"position":[[494,1]]}}}],["2**64",{"_index":2663,"t":{"515":{"position":[[1774,6]]}}}],["2,3,3,2",{"_index":1258,"t":{"174":{"position":[[849,7],[914,7],[980,7]]}}}],["2.0",{"_index":2074,"t":{"288":{"position":[[7,3]]},"310":{"position":[[7,3]]}}}],["2.5",{"_index":2427,"t":{"366":{"position":[[715,3]]}}}],["2.78",{"_index":2428,"t":{"366":{"position":[[734,4],[927,4]]}}}],["20",{"_index":888,"t":{"128":{"position":[[3015,2]]},"318":{"position":[[3001,2]]},"362":{"position":[[532,2],[610,2],[692,2],[904,2],[1179,2],[1265,2],[1316,2],[1492,2],[1739,2],[1931,2],[2130,2],[2327,2],[2392,2],[2454,2]]},"366":{"position":[[339,2],[510,2],[681,2],[876,2],[1069,2],[1268,2],[1467,2],[1663,2],[1728,2],[1790,2],[1942,2],[2094,2],[2256,2],[2418,2],[2570,2]]},"451":{"position":[[2306,2]]}}}],["2000",{"_index":920,"t":{"128":{"position":[[4269,4]]},"318":{"position":[[4236,4]]},"322":{"position":[[263,5]]}}}],["2013",{"_index":1835,"t":{"256":{"position":[[313,4]]}}}],["2014",{"_index":1840,"t":{"256":{"position":[[380,5]]}}}],["2015",{"_index":1844,"t":{"256":{"position":[[423,5]]}}}],["2016",{"_index":1902,"t":{"262":{"position":[[487,5]]}}}],["2023",{"_index":1435,"t":{"200":{"position":[[1102,4]]},"262":{"position":[[1614,4]]}}}],["203172",{"_index":1451,"t":{"200":{"position":[[1330,6]]}}}],["2066257538",{"_index":2068,"t":{"284":{"position":[[1238,11]]}}}],["2085004",{"_index":1449,"t":{"200":{"position":[[1290,7],[1373,7],[1455,7],[1538,7],[1621,7],[1703,7],[1786,7],[1869,7],[1952,7],[2035,7],[2118,7],[2201,7],[2284,7],[2367,7],[2450,7]]}}}],["21",{"_index":1480,"t":{"200":{"position":[[2497,2]]}}}],["218473",{"_index":1467,"t":{"200":{"position":[[1992,6]]}}}],["22",{"_index":1433,"t":{"200":{"position":[[1086,2],[1149,2],[1208,2],[1263,2],[1341,2],[1423,2],[1506,2],[1589,2],[1671,2],[1754,2],[1837,2],[1920,2],[2003,2],[2086,2],[2169,2],[2252,2],[2335,2],[2418,2]]},"362":{"position":[[1965,2]]}}}],["22.log",{"_index":1437,"t":{"200":{"position":[[1110,6]]}}}],["2333",{"_index":2623,"t":{"488":{"position":[[209,4],[254,4]]},"502":{"position":[[337,4],[393,4]]}}}],["2334",{"_index":2624,"t":{"488":{"position":[[222,4],[267,4]]},"502":{"position":[[350,4],[406,4]]}}}],["2335",{"_index":2601,"t":{"461":{"position":[[24,4]]},"488":{"position":[[116,4]]},"502":{"position":[[233,4]]},"511":{"position":[[234,4]]}}}],["25",{"_index":2671,"t":{"515":{"position":[[2634,3]]}}}],["262333",{"_index":1465,"t":{"200":{"position":[[1909,6]]}}}],["27",{"_index":2483,"t":{"366":{"position":[[3616,2]]}}}],["2861242",{"_index":1447,"t":{"200":{"position":[[1251,7]]}}}],["297",{"_index":2449,"t":{"366":{"position":[[1365,4]]}}}],["2>&1",{"_index":1714,"t":{"238":{"position":[[290,4]]},"240":{"position":[[1008,4]]}}}],["2mb",{"_index":2195,"t":{"322":{"position":[[241,3]]}}}],["3",{"_index":1240,"t":{"174":{"position":[[554,1],[613,1],[672,1],[731,1],[790,1]]},"240":{"position":[[2577,3],[2627,3]]},"515":{"position":[[2917,2]]}}}],["3.12",{"_index":2541,"t":{"410":{"position":[[118,4]]}}}],["3.5mb",{"_index":1513,"t":{"202":{"position":[[1468,5]]}}}],["3.82",{"_index":2439,"t":{"366":{"position":[[1122,4]]}}}],["30",{"_index":1842,"t":{"256":{"position":[[415,2]]}}}],["300000",{"_index":2555,"t":{"420":{"position":[[272,6],[351,6]]}}}],["30000000",{"_index":1016,"t":{"128":{"position":[[8865,8]]},"451":{"position":[[2796,8]]}}}],["30303/tcp+udp",{"_index":2286,"t":{"346":{"position":[[267,13]]}}}],["304917",{"_index":1471,"t":{"200":{"position":[[2158,6]]}}}],["30gb",{"_index":2192,"t":{"322":{"position":[[163,4]]}}}],["32",{"_index":1001,"t":{"128":{"position":[[8366,2]]},"356":{"position":[[27,2],[227,3]]},"451":{"position":[[1946,2]]}}}],["32bit",{"_index":1606,"t":{"228":{"position":[[628,5],[676,7]]}}}],["32gb",{"_index":74,"t":{"8":{"position":[[199,4]]}}}],["3450",{"_index":67,"t":{"8":{"position":[[139,4]]}}}],["360",{"_index":2440,"t":{"366":{"position":[[1166,4]]}}}],["366788",{"_index":1469,"t":{"200":{"position":[[2075,6]]}}}],["381",{"_index":783,"t":{"110":{"position":[[113,3]]}}}],["4",{"_index":2365,"t":{"362":{"position":[[2124,1]]}}}],["4.33",{"_index":2447,"t":{"366":{"position":[[1321,4]]}}}],["4.4mb",{"_index":1515,"t":{"202":{"position":[[1510,6]]}}}],["4.92",{"_index":2358,"t":{"362":{"position":[[1983,4]]}}}],["420809",{"_index":1455,"t":{"200":{"position":[[1495,6]]}}}],["421",{"_index":1440,"t":{"200":{"position":[[1141,3]]}}}],["45",{"_index":2369,"t":{"362":{"position":[[2226,3]]},"366":{"position":[[1562,3]]}}}],["450675",{"_index":1475,"t":{"200":{"position":[[2324,6]]}}}],["4700",{"_index":70,"t":{"8":{"position":[[178,4]]}}}],["484",{"_index":2342,"t":{"362":{"position":[[1399,4]]}}}],["485",{"_index":2356,"t":{"362":{"position":[[1827,4]]}}}],["4gb",{"_index":2197,"t":{"322":{"position":[[276,3]]}}}],["5",{"_index":66,"t":{"8":{"position":[[137,1]]},"128":{"position":[[2163,1]]},"270":{"position":[[1113,1]]},"318":{"position":[[2163,1]]},"366":{"position":[[1262,1]]},"370":{"position":[[1962,1]]},"420":{"position":[[318,1]]},"451":{"position":[[1113,1]]}}}],["5.00",{"_index":2367,"t":{"362":{"position":[[2181,4]]},"366":{"position":[[1518,4]]}}}],["50",{"_index":2065,"t":{"284":{"position":[[1048,4]]}}}],["5062",{"_index":990,"t":{"128":{"position":[[7886,4]]},"451":{"position":[[1466,4]]}}}],["5062/tcp",{"_index":2290,"t":{"346":{"position":[[499,8]]}}}],["5064",{"_index":952,"t":{"128":{"position":[[5580,4]]},"451":{"position":[[5300,4]]}}}],["5064/tcp",{"_index":2294,"t":{"346":{"position":[[612,8]]}}}],["5375718",{"_index":221,"t":{"17":{"position":[[2885,7],[2902,8]]}}}],["559",{"_index":1479,"t":{"200":{"position":[[2489,3]]}}}],["56",{"_index":1239,"t":{"174":{"position":[[549,2],[608,2],[667,2],[726,2],[785,2],[844,2],[909,2],[975,2]]}}}],["586238",{"_index":1473,"t":{"200":{"position":[[2241,6]]}}}],["6",{"_index":2382,"t":{"362":{"position":[[2600,1]]},"366":{"position":[[1936,1],[2088,1]]}}}],["6.007",{"_index":217,"t":{"17":{"position":[[2835,5]]}}}],["6.4",{"_index":2583,"t":{"436":{"position":[[499,4]]}}}],["60",{"_index":1483,"t":{"202":{"position":[[42,2],[1219,2],[1488,2]]}}}],["60000",{"_index":959,"t":{"128":{"position":[[5968,5]]},"318":{"position":[[5828,5]]},"420":{"position":[[190,5]]},"451":{"position":[[5688,5]]}}}],["6045",{"_index":1823,"t":{"253":{"position":[[628,5]]}}}],["6262966",{"_index":2430,"t":{"366":{"position":[[771,7]]}}}],["6263965",{"_index":2436,"t":{"366":{"position":[[964,7]]}}}],["6264018",{"_index":2419,"t":{"366":{"position":[[414,7],[585,7]]}}}],["6264964",{"_index":2341,"t":{"362":{"position":[[1375,7]]}}}],["6264965",{"_index":2355,"t":{"362":{"position":[[1803,7]]}}}],["6264966",{"_index":2429,"t":{"366":{"position":[[755,7]]}}}],["6264967",{"_index":2435,"t":{"366":{"position":[[948,7],[1143,7]]}}}],["6264968",{"_index":2448,"t":{"366":{"position":[[1342,7]]}}}],["6264971",{"_index":2359,"t":{"362":{"position":[[2004,7]]}}}],["6264972",{"_index":2368,"t":{"362":{"position":[[2202,7]]},"366":{"position":[[1539,7]]}}}],["6264973",{"_index":2377,"t":{"362":{"position":[[2493,7]]},"366":{"position":[[1829,7]]}}}],["6264974",{"_index":2455,"t":{"366":{"position":[[1981,7]]}}}],["6264976",{"_index":2460,"t":{"366":{"position":[[2133,7]]}}}],["6264977",{"_index":2465,"t":{"366":{"position":[[2295,7]]}}}],["6264978",{"_index":2467,"t":{"366":{"position":[[2457,7]]}}}],["6264979",{"_index":2472,"t":{"366":{"position":[[2609,7]]}}}],["6265018",{"_index":2418,"t":{"366":{"position":[[398,7]]}}}],["6265019",{"_index":2425,"t":{"366":{"position":[[569,7]]}}}],["64",{"_index":2300,"t":{"356":{"position":[[35,3]]}}}],["68044",{"_index":1453,"t":{"200":{"position":[[1413,5]]}}}],["7",{"_index":69,"t":{"8":{"position":[[176,1]]},"366":{"position":[[2716,1]]}}}],["72",{"_index":1237,"t":{"174":{"position":[[533,2]]},"256":{"position":[[434,2]]}}}],["73",{"_index":1244,"t":{"174":{"position":[[592,2]]}}}],["74",{"_index":1247,"t":{"174":{"position":[[651,2]]}}}],["75",{"_index":1250,"t":{"174":{"position":[[710,2]]}}}],["76",{"_index":1253,"t":{"174":{"position":[[769,2]]}}}],["768470",{"_index":1477,"t":{"200":{"position":[[2407,6]]}}}],["77",{"_index":1256,"t":{"174":{"position":[[828,2]]}}}],["777",{"_index":1509,"t":{"202":{"position":[[1302,3]]}}}],["778",{"_index":185,"t":{"17":{"position":[[1619,4]]},"336":{"position":[[93,3]]}}}],["78",{"_index":1260,"t":{"174":{"position":[[893,2]]}}}],["79",{"_index":1264,"t":{"174":{"position":[[958,2]]}}}],["8",{"_index":131,"t":{"17":{"position":[[604,1],[682,1],[1791,1]]},"126":{"position":[[32,1],[88,1]]},"128":{"position":[[11257,1]]},"174":{"position":[[1409,1]]},"362":{"position":[[2321,1]]},"366":{"position":[[1657,1],[2250,1],[2412,1],[2564,1]]}}}],["80",{"_index":2673,"t":{"515":{"position":[[2698,2]]}}}],["8008",{"_index":2166,"t":{"318":{"position":[[5440,4]]},"370":{"position":[[2124,4]]},"428":{"position":[[271,4]]}}}],["8008/tcp",{"_index":2293,"t":{"346":{"position":[[576,8]]}}}],["8080",{"_index":2096,"t":{"292":{"position":[[2406,4]]}}}],["8545",{"_index":2392,"t":{"362":{"position":[[3280,4]]}}}],["8545/tcp",{"_index":2295,"t":{"346":{"position":[[646,8]]}}}],["8551",{"_index":2298,"t":{"354":{"position":[[218,5]]}}}],["8551/tcp",{"_index":2296,"t":{"346":{"position":[[688,8]]}}}],["8gb",{"_index":1810,"t":{"251":{"position":[[59,3]]}}}],["9",{"_index":1717,"t":{"238":{"position":[[531,2]]},"362":{"position":[[2164,1]]},"366":{"position":[[1501,1]]}}}],["9/0",{"_index":1236,"t":{"174":{"position":[[527,3]]}}}],["9/1",{"_index":1243,"t":{"174":{"position":[[586,3]]}}}],["9/2",{"_index":1246,"t":{"174":{"position":[[645,3]]}}}],["9/3",{"_index":1249,"t":{"174":{"position":[[704,3]]}}}],["9/4",{"_index":1252,"t":{"174":{"position":[[763,3]]}}}],["9/5",{"_index":1255,"t":{"174":{"position":[[822,3]]}}}],["9/6",{"_index":1259,"t":{"174":{"position":[[887,3]]}}}],["9/7",{"_index":1263,"t":{"174":{"position":[[952,3]]}}}],["9000",{"_index":140,"t":{"17":{"position":[[769,4]]},"128":{"position":[[6253,4]]},"318":{"position":[[6113,4]]},"370":{"position":[[710,4]]}}}],["9000/tcp+udp",{"_index":2287,"t":{"346":{"position":[[322,12]]}}}],["9001",{"_index":192,"t":{"17":{"position":[[1858,4]]}}}],["9090",{"_index":970,"t":{"128":{"position":[[6574,4]]},"318":{"position":[[6434,4]]},"370":{"position":[[853,4]]}}}],["9090/tcp+udp",{"_index":2288,"t":{"346":{"position":[[377,12]]}}}],["917504",{"_index":1445,"t":{"200":{"position":[[1197,6]]}}}],["94391",{"_index":1459,"t":{"200":{"position":[[1661,5]]}}}],["9596",{"_index":875,"t":{"128":{"position":[[2758,4]]},"318":{"position":[[2758,4]]},"362":{"position":[[3288,4]]}}}],["9596/tcp",{"_index":2289,"t":{"346":{"position":[[462,8]]}}}],["9597",{"_index":194,"t":{"17":{"position":[[1877,4]]}}}],["9701529",{"_index":1432,"t":{"200":{"position":[[1074,7]]}}}],["99",{"_index":1491,"t":{"202":{"position":[[498,2],[1136,2]]}}}],["997hz",{"_index":1497,"t":{"202":{"position":[[667,5],[1478,5]]}}}],["99hz",{"_index":1496,"t":{"202":{"position":[[659,4],[1415,4]]}}}],["9]{40",{"_index":892,"t":{"128":{"position":[[3045,9]]},"318":{"position":[[3031,8]]},"451":{"position":[[2336,9]]}}}],["_",{"_index":534,"t":{"50":{"position":[[807,1]]}}}],["__libc_start",{"_index":1542,"t":{"210":{"position":[[333,13]]}}}],["_byte",{"_index":561,"t":{"50":{"position":[[1753,6]]}}}],["_dirti",{"_index":536,"t":{"50":{"position":[[843,7]]}}}],["_second",{"_index":560,"t":{"50":{"position":[[1741,8]]}}}],["a57ca19d47bb",{"_index":1553,"t":{"215":{"position":[[150,12]]}}}],["abbrevi",{"_index":671,"t":{"63":{"position":[[453,14]]}}}],["abil",{"_index":2547,"t":{"414":{"position":[[17,7]]}}}],["abov",{"_index":251,"t":{"19":{"position":[[145,6]]},"34":{"position":[[167,5]]},"78":{"position":[[104,5]]},"128":{"position":[[6807,5]]},"198":{"position":[[393,5]]},"294":{"position":[[407,5]]},"318":{"position":[[6667,5]]},"348":{"position":[[107,6]]},"507":{"position":[[95,5]]},"511":{"position":[[86,6]]}}}],["absolut",{"_index":2410,"t":{"364":{"position":[[1953,10]]}}}],["acceler",{"_index":2389,"t":{"362":{"position":[[3039,10]]}}}],["accept",{"_index":1617,"t":{"228":{"position":[[1173,7]]},"515":{"position":[[2386,6],[2606,6]]}}}],["access",{"_index":666,"t":{"63":{"position":[[305,10]]},"106":{"position":[[128,6]]},"128":{"position":[[2550,6],[8010,6]]},"226":{"position":[[31,6]]},"272":{"position":[[705,6],[809,9],[1036,10]]},"276":{"position":[[0,6]]},"284":{"position":[[546,6],[991,6]]},"292":{"position":[[1371,10]]},"318":{"position":[[2550,6]]},"346":{"position":[[203,6]]},"434":{"position":[[347,8],[513,6]]},"451":{"position":[[1590,6]]}}}],["accordingli",{"_index":694,"t":{"65":{"position":[[916,12]]}}}],["account",{"_index":2550,"t":{"414":{"position":[[297,7]]},"418":{"position":[[272,7]]}}}],["accur",{"_index":1941,"t":{"262":{"position":[[1885,8]]}}}],["achiev",{"_index":1186,"t":{"166":{"position":[[294,7]]},"251":{"position":[[261,7]]}}}],["act",{"_index":2232,"t":{"334":{"position":[[751,3]]}}}],["action",{"_index":635,"t":{"57":{"position":[[582,6]]},"84":{"position":[[74,7]]},"152":{"position":[[861,10]]},"192":{"position":[[537,8]]},"258":{"position":[[634,7]]}}}],["activ",{"_index":823,"t":{"128":{"position":[[525,10]]},"256":{"position":[[262,8],[520,8]]},"270":{"position":[[525,10]]},"318":{"position":[[525,10]]},"340":{"position":[[1056,8],[1186,6]]},"370":{"position":[[525,10]]},"377":{"position":[[332,11]]},"392":{"position":[[3,8]]},"397":{"position":[[59,9]]},"400":{"position":[[486,6]]},"451":{"position":[[525,10]]}}}],["active=2",{"_index":2709,"t":{"519":{"position":[[1765,9]]}}}],["actual",{"_index":354,"t":{"34":{"position":[[307,6]]},"36":{"position":[[135,6]]},"78":{"position":[[35,6]]},"100":{"position":[[159,6]]},"188":{"position":[[1789,8]]},"228":{"position":[[886,6]]},"232":{"position":[[1838,8]]},"240":{"position":[[2296,6]]},"262":{"position":[[1910,6]]},"292":{"position":[[751,6]]},"385":{"position":[[67,8]]}}}],["actuat",{"_index":1128,"t":{"152":{"position":[[135,7]]},"166":{"position":[[131,8]]}}}],["ad",{"_index":1141,"t":{"152":{"position":[[707,5]]},"170":{"position":[[123,5],[246,5],[312,5],[367,5],[771,5],[929,5]]},"176":{"position":[[449,5]]},"184":{"position":[[217,6]]},"186":{"position":[[77,6]]},"200":{"position":[[429,5]]},"436":{"position":[[308,6]]},"513":{"position":[[735,5]]}}}],["adapt",{"_index":1295,"t":{"184":{"position":[[192,5]]},"272":{"position":[[1119,9]]},"344":{"position":[[436,9]]},"390":{"position":[[8,5]]}}}],["add",{"_index":247,"t":{"19":{"position":[[75,3]]},"46":{"position":[[342,3]]},"50":{"position":[[1445,3],[1712,3]]},"52":{"position":[[492,3],[735,3]]},"170":{"position":[[199,3]]},"186":{"position":[[270,3]]},"194":{"position":[[1170,3]]},"198":{"position":[[485,3]]},"234":{"position":[[1206,4]]},"238":{"position":[[525,3]]},"253":{"position":[[406,4]]},"284":{"position":[[1302,3]]},"358":{"position":[[73,3]]},"430":{"position":[[119,3]]},"513":{"position":[[464,3]]}}}],["addit",{"_index":249,"t":{"19":{"position":[[108,8]]},"46":{"position":[[809,10]]},"184":{"position":[[224,10]]},"200":{"position":[[580,8]]},"328":{"position":[[137,10],[246,10]]},"344":{"position":[[374,9]]},"370":{"position":[[871,10],[963,10]]}}}],["address",{"_index":592,"t":{"55":{"position":[[359,9]]},"128":{"position":[[3024,8],[5611,7],[6052,7],[6390,7],[7511,9],[8111,9]]},"188":{"position":[[733,10]]},"200":{"position":[[486,10]]},"228":{"position":[[800,7]]},"262":{"position":[[2184,7]]},"292":{"position":[[579,7],[719,10],[2021,7],[2161,10]]},"318":{"position":[[3010,8],[5471,7],[5912,7],[6250,7],[7371,9]]},"328":{"position":[[312,8]]},"334":{"position":[[285,10]]},"336":{"position":[[231,8]]},"344":{"position":[[801,11]]},"370":{"position":[[581,7],[742,7],[1380,9],[2155,7]]},"374":{"position":[[73,10]]},"418":{"position":[[592,7]]},"451":{"position":[[1691,9],[2315,8],[5331,7]]},"455":{"position":[[71,9]]},"459":{"position":[[71,9]]},"481":{"position":[[118,7],[297,7]]},"513":{"position":[[151,8],[204,8],[261,7],[343,7],[407,7],[682,7]]},"517":{"position":[[134,7]]}}}],["address=http://127.0.0.1:9596",{"_index":2337,"t":{"362":{"position":[[1231,29]]}}}],["adher",{"_index":466,"t":{"46":{"position":[[193,8]]},"98":{"position":[[67,8]]}}}],["adjust",{"_index":1503,"t":{"202":{"position":[[839,6],[1030,6]]},"420":{"position":[[18,6]]}}}],["admin",{"_index":1431,"t":{"200":{"position":[[1062,5],[1068,5],[1130,5],[1185,5],[1191,5],[1239,5],[1245,5],[1318,5],[1324,5],[1401,5],[1407,5],[1483,5],[1489,5],[1566,5],[1572,5],[1649,5],[1655,5],[1731,5],[1737,5],[1814,5],[1820,5],[1897,5],[1903,5],[1980,5],[1986,5],[2063,5],[2069,5],[2146,5],[2152,5],[2229,5],[2235,5],[2312,5],[2318,5],[2395,5],[2401,5],[2478,5]]}}}],["admin@12.34.56.78",{"_index":1419,"t":{"200":{"position":[[362,18]]},"202":{"position":[[1097,18],[1222,18],[1272,18]]}}}],["admin@12.34.56.78:/home/devops/beacon/out.perf",{"_index":1516,"t":{"202":{"position":[[1521,46]]}}}],["adopt",{"_index":1926,"t":{"262":{"position":[[1270,8]]}}}],["advantag",{"_index":1726,"t":{"240":{"position":[[77,10],[133,9]]}}}],["advers",{"_index":1931,"t":{"262":{"position":[[1515,11]]}}}],["advertis",{"_index":2230,"t":{"334":{"position":[[697,13]]}}}],["affect",{"_index":1501,"t":{"202":{"position":[[750,6]]}}}],["afford",{"_index":1908,"t":{"262":{"position":[[600,8]]}}}],["afterward",{"_index":1848,"t":{"256":{"position":[[496,10]]}}}],["again",{"_index":1737,"t":{"240":{"position":[[733,6]]}}}],["against",{"_index":378,"t":{"36":{"position":[[375,7]]},"128":{"position":[[9203,7]]},"202":{"position":[[948,8]]},"262":{"position":[[325,7],[1507,7],[2541,7]]},"272":{"position":[[308,7]]},"451":{"position":[[3276,7]]},"515":{"position":[[425,7],[2413,7]]}}}],["aggreg",{"_index":714,"t":{"78":{"position":[[83,9]]},"488":{"position":[[45,9]]},"502":{"position":[[67,9],[151,9]]}}}],["agreement",{"_index":454,"t":{"44":{"position":[[454,9]]}}}],["ahead",{"_index":2394,"t":{"364":{"position":[[137,6]]}}}],["aid",{"_index":1321,"t":{"188":{"position":[[522,3]]}}}],["aim",{"_index":1122,"t":{"146":{"position":[[54,3]]},"366":{"position":[[25,4]]},"379":{"position":[[277,3]]}}}],["alchemi",{"_index":2160,"t":{"300":{"position":[[179,8]]}}}],["alert",{"_index":2559,"t":{"426":{"position":[[96,8]]}}}],["alia",{"_index":611,"t":{"55":{"position":[[915,5]]},"128":{"position":[[4847,5]]},"400":{"position":[[368,5]]},"451":{"position":[[2819,5]]},"515":{"position":[[1086,5],[1311,5],[1722,5]]}}}],["alloc",{"_index":1580,"t":{"224":{"position":[[737,9],[905,9]]},"234":{"position":[[523,11],[1191,10],[1424,11],[1615,12]]},"240":{"position":[[270,11],[3051,12]]}}}],["allocations/d",{"_index":1729,"t":{"240":{"position":[[255,14]]}}}],["allow",{"_index":210,"t":{"17":{"position":[[2589,5]]},"65":{"position":[[306,5]]},"128":{"position":[[2565,5],[5335,7],[7478,5],[8025,5]]},"152":{"position":[[736,5]]},"186":{"position":[[158,6]]},"198":{"position":[[527,5],[653,5]]},"202":{"position":[[296,5]]},"204":{"position":[[74,6]]},"234":{"position":[[1523,6]]},"236":{"position":[[947,5]]},"272":{"position":[[1227,5]]},"290":{"position":[[68,8]]},"292":{"position":[[1332,5]]},"318":{"position":[[2565,5],[5210,7],[7338,5]]},"340":{"position":[[1170,6]]},"344":{"position":[[354,6]]},"346":{"position":[[88,5]]},"368":{"position":[[114,6]]},"370":{"position":[[1343,5]]},"372":{"position":[[408,6]]},"377":{"position":[[43,6],[257,8]]},"383":{"position":[[48,6]]},"434":{"position":[[152,6]]},"451":{"position":[[1605,5]]},"485":{"position":[[478,8]]},"511":{"position":[[993,5],[1107,5]]},"513":{"position":[[69,6]]}}}],["allowforcedupd",{"_index":2037,"t":{"282":{"position":[[848,19]]}}}],["alon",{"_index":1184,"t":{"166":{"position":[[230,5]]}}}],["along",{"_index":1139,"t":{"152":{"position":[[623,5]]},"162":{"position":[[377,5]]},"226":{"position":[[518,5]]},"244":{"position":[[195,5]]},"366":{"position":[[2770,6]]},"383":{"position":[[410,5]]},"388":{"position":[[183,5]]},"390":{"position":[[97,6]]}}}],["alpha",{"_index":1008,"t":{"128":{"position":[[8558,5]]},"451":{"position":[[2138,5]]}}}],["alphabet",{"_index":706,"t":{"72":{"position":[[131,12]]},"108":{"position":[[33,15]]}}}],["alreadi",{"_index":208,"t":{"17":{"position":[[2462,7]]},"34":{"position":[[79,7]]},"236":{"position":[[701,7]]},"292":{"position":[[927,7]]}}}],["altair",{"_index":2003,"t":{"272":{"position":[[1180,6]]}}}],["alter",{"_index":2493,"t":{"374":{"position":[[399,8]]}}}],["altern",{"_index":2159,"t":{"300":{"position":[[149,12]]},"336":{"position":[[898,14]]},"436":{"position":[[631,14]]},"509":{"position":[[155,14]]}}}],["although",{"_index":1718,"t":{"238":{"position":[[567,8]]},"372":{"position":[[336,8]]}}}],["alway",{"_index":365,"t":{"36":{"position":[[14,6]]},"188":{"position":[[861,6]]},"296":{"position":[[262,6]]},"418":{"position":[[632,6]]},"515":{"position":[[1133,6],[1621,6],[2788,6],[3036,6]]}}}],["amd",{"_index":64,"t":{"8":{"position":[[127,3],[166,3]]}}}],["amongst",{"_index":162,"t":{"17":{"position":[[1172,7]]}}}],["amount",{"_index":1641,"t":{"232":{"position":[[470,6]]},"322":{"position":[[130,8]]},"340":{"position":[[410,7]]},"420":{"position":[[468,7]]}}}],["analysi",{"_index":1305,"t":{"188":{"position":[[10,8],[241,8],[1033,9],[1158,9],[1356,8],[1768,9]]},"190":{"position":[[131,8]]},"204":{"position":[[90,8]]},"215":{"position":[[205,9]]},"226":{"position":[[201,8]]},"228":{"position":[[950,8]]},"232":{"position":[[0,8]]},"234":{"position":[[64,8],[167,9],[479,9],[692,8],[1730,9],[1821,8]]},"244":{"position":[[1870,8]]},"379":{"position":[[373,8]]}}}],["analyz",{"_index":1534,"t":{"208":{"position":[[127,9]]},"224":{"position":[[415,9],[1217,7]]},"226":{"position":[[71,9]]},"230":{"position":[[14,7]]},"240":{"position":[[2156,7]]}}}],["andrea",{"_index":1956,"t":{"264":{"position":[[67,7]]}}}],["annot",{"_index":742,"t":{"86":{"position":[[305,9],[344,9]]}}}],["announc",{"_index":2239,"t":{"336":{"position":[[507,8],[665,9]]}}}],["anomali",{"_index":2388,"t":{"362":{"position":[[3013,9]]}}}],["anoth",{"_index":1646,"t":{"232":{"position":[[879,7]]},"368":{"position":[[158,8]]},"383":{"position":[[8,7]]},"400":{"position":[[549,7]]}}}],["antonopoulo",{"_index":1958,"t":{"264":{"position":[[78,12]]}}}],["anyth",{"_index":1029,"t":{"128":{"position":[[9287,8]]},"451":{"position":[[3360,8]]},"515":{"position":[[509,8]]}}}],["apach",{"_index":2073,"t":{"288":{"position":[[0,6]]},"310":{"position":[[0,6]]}}}],["api",{"_index":308,"t":{"30":{"position":[[684,4]]},"46":{"position":[[376,3]]},"52":{"position":[[140,4]]},"55":{"position":[[846,4]]},"76":{"position":[[75,4]]},"106":{"position":[[231,3],[299,3]]},"128":{"position":[[607,4],[2193,3],[2278,4],[2599,3],[2663,3],[2732,3],[2803,3],[3145,4],[3869,3],[3991,3],[4104,3],[4243,3],[4560,5],[4815,4],[5014,3],[5119,3],[7568,3],[7663,3],[7784,3],[7860,3],[7938,3],[8066,3]]},"144":{"position":[[152,3],[332,3]]},"170":{"position":[[585,3],[636,3],[755,3]]},"228":{"position":[[1024,3]]},"270":{"position":[[1177,3]]},"276":{"position":[[148,3]]},"282":{"position":[[541,3]]},"318":{"position":[[607,4],[2193,3],[2278,4],[2599,3],[2663,3],[2732,3],[2803,3],[3836,3],[3958,3],[4071,3],[4210,3],[4527,5],[4782,4],[4889,3],[4994,3]]},"324":{"position":[[703,4]]},"326":{"position":[[64,4]]},"336":{"position":[[964,3]]},"346":{"position":[[490,3],[532,3]]},"354":{"position":[[71,3]]},"362":{"position":[[1220,3],[3157,4]]},"418":{"position":[[243,3]]},"434":{"position":[[371,3],[393,3]]},"451":{"position":[[1148,3],[1243,3],[1364,3],[1440,3],[1518,3],[1646,3],[2436,4]]},"485":{"position":[[322,3],[352,3]]},"515":{"position":[[709,4],[2204,3]]}}}],["api'",{"_index":1182,"t":{"166":{"position":[[103,6]]}}}],["app",{"_index":2549,"t":{"414":{"position":[[262,3]]}}}],["appar",{"_index":1645,"t":{"232":{"position":[[835,8]]}}}],["append",{"_index":1611,"t":{"228":{"position":[[911,7]]}}}],["appli",{"_index":687,"t":{"65":{"position":[[447,5],[634,7],[764,7]]},"70":{"position":[[169,7]]},"128":{"position":[[9130,5]]},"451":{"position":[[3203,5]]},"515":{"position":[[352,5],[622,7]]}}}],["applic",{"_index":489,"t":{"46":{"position":[[701,10]]},"55":{"position":[[147,11],[392,11]]},"140":{"position":[[92,13]]},"224":{"position":[[801,12]]},"228":{"position":[[513,11]]},"232":{"position":[[1325,11]]},"234":{"position":[[885,11]]},"240":{"position":[[682,12],[1759,11]]},"244":{"position":[[2197,13]]},"292":{"position":[[943,11]]}}}],["applications/kde/heaptrack_gui.app",{"_index":1806,"t":{"244":{"position":[[2237,35]]}}}],["appreci",{"_index":1500,"t":{"202":{"position":[[738,11]]}}}],["approach",{"_index":552,"t":{"50":{"position":[[1508,10]]},"162":{"position":[[407,9]]},"182":{"position":[[30,10]]},"240":{"position":[[114,9]]},"272":{"position":[[797,8]]},"340":{"position":[[1161,8]]},"374":{"position":[[1044,8]]},"426":{"position":[[105,9]]}}}],["appropri",{"_index":1215,"t":{"170":{"position":[[507,11]]},"251":{"position":[[153,11]]},"434":{"position":[[455,11]]},"515":{"position":[[1003,11]]}}}],["apr",{"_index":2319,"t":{"362":{"position":[[528,3],[606,3],[688,3],[900,3],[1175,3],[1261,3],[1312,3],[1488,3],[1735,3],[1927,3],[2126,3],[2323,3],[2388,3],[2450,3]]},"366":{"position":[[335,3],[506,3],[677,3],[872,3],[1065,3],[1264,3],[1463,3],[1659,3],[1724,3],[1786,3],[1938,3],[2090,3],[2252,3],[2414,3],[2566,3]]}}}],["apt",{"_index":1407,"t":{"198":{"position":[[244,3],[304,3]]},"236":{"position":[[288,3],[310,3]]},"240":{"position":[[1171,3],[1193,3]]},"242":{"position":[[14,4],[19,3],[65,3],[87,3]]}}}],["aptitud",{"_index":1765,"t":{"242":{"position":[[30,8]]}}}],["arbitrag",{"_index":2204,"t":{"324":{"position":[[102,9]]}}}],["arbitrari",{"_index":622,"t":{"57":{"position":[[252,9]]}}}],["argument",{"_index":282,"t":{"28":{"position":[[246,10]]},"184":{"position":[[235,9]]},"228":{"position":[[371,9]]},"253":{"position":[[9,9],[141,10],[172,8],[212,10],[351,9]]},"364":{"position":[[620,9]]}}}],["aros",{"_index":1934,"t":{"262":{"position":[[1684,5]]}}}],["around",{"_index":1426,"t":{"200":{"position":[[877,6]]},"224":{"position":[[1144,6]]},"236":{"position":[[1485,6]]},"340":{"position":[[698,6]]},"483":{"position":[[224,6]]}}}],["array",{"_index":1593,"t":{"226":{"position":[[795,7],[899,6]]},"232":{"position":[[663,5],[678,5],[742,5]]},"272":{"position":[[1139,5]]},"294":{"position":[[562,5]]}}}],["arriv",{"_index":1280,"t":{"174":{"position":[[2194,6]]}}}],["arsen",{"_index":1647,"t":{"232":{"position":[[900,7]]}}}],["art",{"_index":1636,"t":{"232":{"position":[[23,3],[2028,3]]}}}],["artifact",{"_index":1701,"t":{"236":{"position":[[1189,9]]}}}],["ascii",{"_index":623,"t":{"57":{"position":[[287,5]]}}}],["ask",{"_index":451,"t":{"44":{"position":[[418,5]]},"246":{"position":[[83,5]]},"338":{"position":[[217,3]]},"477":{"position":[[128,3]]},"511":{"position":[[925,3]]}}}],["aspect",{"_index":649,"t":{"59":{"position":[[304,6]]}}}],["ass",{"_index":1140,"t":{"152":{"position":[[640,5]]}}}],["assault",{"_index":1905,"t":{"262":{"position":[[563,8]]}}}],["assemblyscript",{"_index":2627,"t":{"490":{"position":[[134,14]]},"500":{"position":[[167,14]]}}}],["assert",{"_index":565,"t":{"52":{"position":[[496,9],[571,9],[666,9],[704,9]]},"152":{"position":[[687,12],[1479,11]]},"168":{"position":[[321,10],[435,10]]},"170":{"position":[[100,10],[184,10],[228,10],[352,10],[481,10],[554,10],[668,6],[784,9],[840,8],[909,10],[1277,10],[1306,10]]},"172":{"position":[[61,11]]}}}],["asset",{"_index":2525,"t":{"395":{"position":[[59,6]]}}}],["assist",{"_index":95,"t":{"12":{"position":[[173,6]]}}}],["associ",{"_index":1808,"t":{"248":{"position":[[57,10]]},"253":{"position":[[493,10]]},"262":{"position":[[873,10]]},"340":{"position":[[291,10]]},"374":{"position":[[1091,10]]},"418":{"position":[[562,9]]}}}],["assum",{"_index":1395,"t":{"196":{"position":[[11,7]]},"232":{"position":[[1458,7]]},"236":{"position":[[0,6],[657,7]]},"244":{"position":[[471,7]]},"282":{"position":[[25,6]]},"328":{"position":[[730,7]]},"362":{"position":[[125,6]]}}}],["async",{"_index":2042,"t":{"282":{"position":[[1082,5],[1260,5]]}}}],["async_hook",{"_index":360,"t":{"34":{"position":[[420,13]]}}}],["att",{"_index":1266,"t":{"174":{"position":[[1108,3]]}}}],["attach",{"_index":1734,"t":{"240":{"position":[[618,9]]}}}],["attack",{"_index":1616,"t":{"228":{"position":[[1152,7]]},"262":{"position":[[385,7],[477,6],[907,7],[2576,8]]},"346":{"position":[[218,7]]},"364":{"position":[[189,9],[575,7]]},"374":{"position":[[562,9],[1118,8]]},"412":{"position":[[104,8]]}}}],["attcount",{"_index":1233,"t":{"174":{"position":[[384,8],[2001,9]]}}}],["attempt",{"_index":1948,"t":{"262":{"position":[[2171,9]]},"374":{"position":[[1603,7]]}}}],["attest",{"_index":1276,"t":{"174":{"position":[[2025,12],[2140,13],[2160,12]]},"262":{"position":[[1695,12],[1769,13],[1983,12],[2094,12],[2235,13]]},"434":{"position":[[286,13]]},"519":{"position":[[1821,12],[1894,12]]}}}],["attestationparticipationassert",{"_index":1221,"t":{"170":{"position":[[1023,33]]}}}],["attestationscountassert",{"_index":1220,"t":{"170":{"position":[[996,26]]}}}],["attester_slash",{"_index":391,"t":{"36":{"position":[[708,17]]}}}],["authent",{"_index":929,"t":{"128":{"position":[[4498,14],[4757,14],[7632,14],[7788,14]]},"318":{"position":[[4465,14],[4724,14]]},"354":{"position":[[40,14],[161,13]]},"356":{"position":[[91,12]]},"362":{"position":[[3194,14]]},"451":{"position":[[1212,14],[1368,14]]}}}],["authrpc.jwtsecret",{"_index":2308,"t":{"360":{"position":[[27,17],[402,17],[523,17]]}}}],["auto",{"_index":1033,"t":{"128":{"position":[[9430,4]]},"451":{"position":[[3503,4]]}}}],["automat",{"_index":409,"t":{"38":{"position":[[574,13]]},"194":{"position":[[1028,13]]},"253":{"position":[[392,13]]},"330":{"position":[[14,13]]},"436":{"position":[[235,13]]},"511":{"position":[[1303,13]]},"515":{"position":[[220,13]]}}}],["aux",{"_index":1719,"t":{"238":{"position":[[610,3]]},"240":{"position":[[1455,3]]}}}],["avail",{"_index":77,"t":{"8":{"position":[[222,9],[246,9]]},"28":{"position":[[223,9]]},"38":{"position":[[280,9]]},"154":{"position":[[41,9]]},"166":{"position":[[607,9]]},"184":{"position":[[141,9]]},"224":{"position":[[199,9]]},"234":{"position":[[1770,9]]},"244":{"position":[[1442,9]]},"284":{"position":[[628,9],[790,9]]},"328":{"position":[[355,9]]},"352":{"position":[[475,9]]},"362":{"position":[[161,9],[258,9]]},"364":{"position":[[367,9]]},"446":{"position":[[31,9]]},"449":{"position":[[48,9]]},"515":{"position":[[1917,10],[2849,9]]}}}],["averag",{"_index":1278,"t":{"174":{"position":[[2076,7]]},"322":{"position":[[68,7]]}}}],["avoid",{"_index":613,"t":{"57":{"position":[[0,5]]},"128":{"position":[[1206,5]]},"318":{"position":[[1206,5]]},"374":{"position":[[1557,5]]}}}],["await",{"_index":2029,"t":{"282":{"position":[[634,5],[758,5],[801,5],[953,5]]},"284":{"position":[[726,5],[862,5]]},"292":{"position":[[651,5],[2093,5]]}}}],["away",{"_index":1493,"t":{"202":{"position":[[536,4]]},"364":{"position":[[2006,4]]}}}],["awk",{"_index":1722,"t":{"238":{"position":[[647,3]]},"240":{"position":[[1492,3],[2573,3],[2623,3]]}}}],["b",{"_index":2536,"t":{"402":{"position":[[82,1]]}}}],["back",{"_index":1071,"t":{"132":{"position":[[6,4]]},"150":{"position":[[6,4]]},"172":{"position":[[6,4]]},"178":{"position":[[6,4]]},"180":{"position":[[6,4]]},"194":{"position":[[858,4],[1226,4]]},"196":{"position":[[419,4]]},"234":{"position":[[1317,4]]},"424":{"position":[[6,4]]}}}],["backward",{"_index":2512,"t":{"383":{"position":[[208,9]]}}}],["bad",{"_index":1979,"t":{"272":{"position":[[260,4]]}}}],["bail",{"_index":376,"t":{"36":{"position":[[289,4],[634,4]]}}}],["balanc",{"_index":1911,"t":{"262":{"position":[[804,8]]},"292":{"position":[[641,7],[2083,7]]},"481":{"position":[[330,8]]}}}],["bandwidth",{"_index":2260,"t":{"340":{"position":[[476,10]]}}}],["bar",{"_index":1625,"t":{"230":{"position":[[242,3]]}}}],["bare",{"_index":1194,"t":{"168":{"position":[[174,4]]}}}],["base",{"_index":333,"t":{"32":{"position":[[64,5]]},"46":{"position":[[467,5]]},"50":{"position":[[1863,5]]},"86":{"position":[[436,5]]},"114":{"position":[[62,5]]},"136":{"position":[[55,6]]},"230":{"position":[[172,5]]},"253":{"position":[[444,5]]},"340":{"position":[[375,5],[654,5]]},"374":{"position":[[450,5]]}}}],["basi",{"_index":449,"t":{"44":{"position":[[351,6]]},"166":{"position":[[401,5]]}}}],["basic",{"_index":1094,"t":{"134":{"position":[[666,5]]},"198":{"position":[[513,5]]},"200":{"position":[[14,5]]},"304":{"position":[[73,5]]},"330":{"position":[[215,5]]},"352":{"position":[[62,5]]}}}],["batch",{"_index":2158,"t":{"298":{"position":[[27,5]]}}}],["be",{"_index":1272,"t":{"174":{"position":[[1333,5],[1555,5]]},"232":{"position":[[325,5],[861,5],[1933,5],[1994,5]]},"240":{"position":[[455,5]]},"258":{"position":[[275,5],[377,5]]},"260":{"position":[[72,5]]},"262":{"position":[[1410,5]]},"276":{"position":[[545,5]]},"334":{"position":[[1192,5]]},"374":{"position":[[850,5],[1563,5]]},"385":{"position":[[632,5]]},"418":{"position":[[726,5]]},"442":{"position":[[195,5]]}}}],["beacon",{"_index":24,"t":{"6":{"position":[[199,6],[314,6]]},"17":{"position":[[115,6],[572,6],[883,6],[954,6],[2377,6]]},"38":{"position":[[165,6],[204,6],[450,6],[475,6]]},"74":{"position":[[88,6]]},"78":{"position":[[42,6],[151,6]]},"82":{"position":[[52,6],[126,6]]},"86":{"position":[[164,6]]},"100":{"position":[[71,6],[166,6],[269,6]]},"124":{"position":[[20,6]]},"126":{"position":[[15,6]]},"128":{"position":[[595,6],[819,6],[2343,9],[9113,6],[9522,6],[10163,6],[10304,6]]},"160":{"position":[[41,6]]},"184":{"position":[[252,6]]},"186":{"position":[[150,7]]},"200":{"position":[[101,6],[224,6],[276,6],[404,6],[1095,6]]},"202":{"position":[[1198,8]]},"236":{"position":[[46,6],[242,6]]},"238":{"position":[[13,7],[42,9],[236,6]]},"240":{"position":[[801,7],[830,9],[954,6]]},"251":{"position":[[29,6]]},"260":{"position":[[59,6],[196,6]]},"270":{"position":[[1140,6]]},"276":{"position":[[13,6]]},"282":{"position":[[51,6]]},"312":{"position":[[193,6]]},"314":{"position":[[6,6]]},"316":{"position":[[6,6],[70,6]]},"318":{"position":[[595,6],[819,6],[2343,9]]},"320":{"position":[[85,6],[321,6],[360,6],[394,6],[805,6]]},"322":{"position":[[700,6]]},"328":{"position":[[40,6],[391,6]]},"334":{"position":[[1332,6]]},"336":{"position":[[952,6]]},"338":{"position":[[51,6]]},"346":{"position":[[337,6],[392,6],[473,6],[587,6]]},"350":{"position":[[68,6]]},"352":{"position":[[293,6],[339,6],[585,6]]},"358":{"position":[[28,6]]},"362":{"position":[[20,6],[55,6],[367,6],[729,6],[3150,6],[3241,6]]},"364":{"position":[[355,6],[499,6],[638,6],[876,6]]},"366":{"position":[[9,6],[3656,6]]},"368":{"position":[[49,6]]},"372":{"position":[[322,6],[385,6]]},"377":{"position":[[188,6]]},"379":{"position":[[221,6],[319,6]]},"381":{"position":[[161,6]]},"385":{"position":[[584,6]]},"416":{"position":[[66,6]]},"428":{"position":[[382,6]]},"434":{"position":[[300,6]]},"451":{"position":[[3186,6],[3595,6],[4236,6],[4377,6]]},"455":{"position":[[218,6]]},"459":{"position":[[218,6]]},"485":{"position":[[371,6]]},"513":{"position":[[719,6]]},"515":{"position":[[21,6],[163,6],[335,6],[637,6],[702,6],[1502,6]]},"517":{"position":[[113,6],[202,6],[335,6]]},"519":{"position":[[794,6],[886,6],[945,6],[1039,6],[1386,6],[1575,6]]}}}],["beacon\",\"config\",\"debug\",\"events\",\"node\",\"validator\",\"lightcli",{"_index":869,"t":{"128":{"position":[[2452,69]]},"318":{"position":[[2452,69]]}}}],["beacon.log",{"_index":2171,"t":{"320":{"position":[[851,10]]}}}],["beacon/perf.out",{"_index":1510,"t":{"202":{"position":[[1306,17]]}}}],["beacon_lodestar.log",{"_index":1288,"t":{"176":{"position":[[258,20]]}}}],["beacon_run.sh",{"_index":1442,"t":{"200":{"position":[[1158,13]]}}}],["beaconapiurl",{"_index":1968,"t":{"270":{"position":[[1117,13]]},"280":{"position":[[114,12]]}}}],["beaconcha.in",{"_index":957,"t":{"128":{"position":[[5820,13]]},"318":{"position":[[5680,13]]},"414":{"position":[[144,13],[209,12]]},"418":{"position":[[225,13]]},"451":{"position":[[5540,13]]}}}],["beaconchain_current_finalized_epoch",{"_index":2575,"t":{"430":{"position":[[388,35]]}}}],["beaconchain_current_slot",{"_index":2574,"t":{"430":{"position":[[363,24]]}}}],["beaconchain_p",{"_index":2573,"t":{"430":{"position":[[345,17]]}}}],["beaconnod",{"_index":993,"t":{"128":{"position":[[8098,12],[8135,10]]},"451":{"position":[[1678,12],[1715,10]]},"455":{"position":[[58,12],[95,10]]},"459":{"position":[[58,12],[95,10]]}}}],["beaconurl",{"_index":2095,"t":{"292":{"position":[[2348,10]]}}}],["bearer",{"_index":987,"t":{"128":{"position":[[7625,6],[7750,6]]},"451":{"position":[[1205,6],[1330,6]]}}}],["becom",{"_index":1672,"t":{"234":{"position":[[612,6]]},"272":{"position":[[1022,8]]},"322":{"position":[[430,6]]},"374":{"position":[[707,7]]}}}],["befor",{"_index":301,"t":{"30":{"position":[[490,6]]},"34":{"position":[[365,6]]},"36":{"position":[[464,6]]},"59":{"position":[[314,7]]},"63":{"position":[[111,6]]},"128":{"position":[[3309,6]]},"162":{"position":[[171,6]]},"188":{"position":[[222,7]]},"190":{"position":[[665,6]]},"192":{"position":[[0,6]]},"318":{"position":[[3096,6],[3262,6]]},"324":{"position":[[234,6]]},"354":{"position":[[290,6]]},"440":{"position":[[169,6]]},"442":{"position":[[206,6]]}}}],["begin",{"_index":413,"t":{"40":{"position":[[16,5]]},"208":{"position":[[121,5]]},"334":{"position":[[177,6]]},"372":{"position":[[715,7]]}}}],["behavior",{"_index":1080,"t":{"134":{"position":[[313,8]]},"292":{"position":[[899,8],[1518,8]]}}}],["behind",{"_index":1281,"t":{"174":{"position":[[2220,6]]},"346":{"position":[[17,6]]},"348":{"position":[[43,6]]},"366":{"position":[[3045,6],[3132,6]]}}}],["below",{"_index":104,"t":{"17":{"position":[[198,5]]},"59":{"position":[[415,5]]},"65":{"position":[[385,6]]},"72":{"position":[[87,5]]},"108":{"position":[[0,5]]},"168":{"position":[[446,5]]},"170":{"position":[[1288,6]]},"200":{"position":[[260,6]]},"202":{"position":[[18,5]]},"230":{"position":[[477,6]]},"236":{"position":[[151,5]]},"240":{"position":[[1885,5]]},"292":{"position":[[103,5]]},"312":{"position":[[99,5]]},"344":{"position":[[89,5]]},"404":{"position":[[84,5]]},"515":{"position":[[1284,6]]}}}],["belt",{"_index":1313,"t":{"188":{"position":[[295,5]]}}}],["ben",{"_index":1953,"t":{"264":{"position":[[36,3]]}}}],["benchmark",{"_index":1110,"t":{"140":{"position":[[263,9]]}}}],["benefici",{"_index":1539,"t":{"210":{"position":[[236,11]]},"377":{"position":[[363,10]]},"381":{"position":[[61,10]]}}}],["benefit",{"_index":1761,"t":{"240":{"position":[[2930,8]]}}}],["best",{"_index":434,"t":{"42":{"position":[[53,4]]},"50":{"position":[[1666,4]]},"196":{"position":[[288,4]]},"204":{"position":[[11,4]]},"230":{"position":[[6,4]]},"232":{"position":[[54,4]]},"240":{"position":[[2806,4]]}}}],["besu",{"_index":2311,"t":{"360":{"position":[[263,5]]}}}],["better",{"_index":1673,"t":{"234":{"position":[[783,7]]}}}],["between",{"_index":919,"t":{"128":{"position":[[4183,7],[5895,7],[10836,7]]},"226":{"position":[[578,7],[709,7]]},"318":{"position":[[4150,7],[5755,7]]},"334":{"position":[[204,7]]},"342":{"position":[[212,7]]},"420":{"position":[[38,7]]},"451":{"position":[[4909,7],[5615,7]]},"515":{"position":[[3076,7]]}}}],["beyond",{"_index":2506,"t":{"374":{"position":[[1630,6]]}}}],["binari",{"_index":14,"t":{"6":{"position":[[47,9]]},"28":{"position":[[135,6]]},"90":{"position":[[56,9]]},"188":{"position":[[1082,6],[1234,6],[1312,6],[1581,6],[1742,6]]},"194":{"position":[[99,6]]},"234":{"position":[[863,7]]},"236":{"position":[[924,6]]},"244":{"position":[[59,6],[1857,8]]},"251":{"position":[[375,6]]},"292":{"position":[[2207,7]]},"395":{"position":[[0,8]]},"490":{"position":[[54,6]]},"500":{"position":[[76,6]]}}}],["bind",{"_index":780,"t":{"110":{"position":[[77,9]]}}}],["bindaddr4=/ip4/0.0.0.0/udp/9000",{"_index":2245,"t":{"336":{"position":[[866,31]]}}}],["bit",{"_index":1153,"t":{"152":{"position":[[1394,3],[1531,4]]},"200":{"position":[[740,3]]},"226":{"position":[[947,3]]},"244":{"position":[[86,3]]}}}],["bitcoin",{"_index":1834,"t":{"256":{"position":[[237,8]]}}}],["bl",{"_index":2594,"t":{"446":{"position":[[210,3]]},"477":{"position":[[9,3],[187,3]]},"479":{"position":[[8,3],[98,3]]},"481":{"position":[[199,3]]},"488":{"position":[[0,3],[25,3],[55,3],[89,3],[135,3],[178,3],[227,3]]},"502":{"position":[[47,3],[131,3],[206,3],[306,3]]},"507":{"position":[[32,3]]}}}],["blank",{"_index":2393,"t":{"364":{"position":[[37,5]]}}}],["blend",{"_index":2265,"t":{"340":{"position":[[943,5]]}}}],["blind",{"_index":479,"t":{"46":{"position":[[415,7]]},"128":{"position":[[9654,7]]},"451":{"position":[[3727,7]]}}}],["blindedloc",{"_index":1038,"t":{"128":{"position":[[9608,13]]},"451":{"position":[[3681,13]]}}}],["blob",{"_index":902,"t":{"128":{"position":[[3420,5]]},"318":{"position":[[3373,5]]}}}],["block",{"_index":477,"t":{"46":{"position":[[398,5],[423,5]]},"52":{"position":[[888,5]]},"65":{"position":[[164,7]]},"128":{"position":[[344,5],[387,5],[421,5],[465,5],[505,5],[1048,5],[2965,5],[8341,6],[8903,5],[9097,5],[9177,5],[9221,6],[9409,5],[9453,6],[9549,5],[9645,5]]},"174":{"position":[[2413,5],[2494,5],[2575,5]]},"258":{"position":[[253,7],[407,6],[453,5],[544,6],[674,5],[974,5]]},"270":{"position":[[344,5],[387,5],[421,5],[465,5],[505,5]]},"272":{"position":[[592,5]]},"296":{"position":[[314,5]]},"318":{"position":[[344,5],[387,5],[421,5],[465,5],[505,5],[1048,5],[2951,5]]},"320":{"position":[[281,6],[372,6]]},"324":{"position":[[318,5]]},"326":{"position":[[267,5],[313,5],[369,7]]},"362":{"position":[[1423,6],[1851,6],[2052,6],[2249,6],[2528,6]]},"366":{"position":[[231,5],[441,6],[612,6],[798,6],[991,6],[1190,6],[1389,6],[1585,6],[1864,6],[2016,6],[2178,6],[2340,6],[2492,6],[2644,6],[2884,7],[3191,5]]},"370":{"position":[[344,5],[387,5],[421,5],[465,5],[505,5]]},"374":{"position":[[997,6]]},"379":{"position":[[40,6],[64,5],[120,6]]},"381":{"position":[[28,6],[221,6]]},"383":{"position":[[201,6],[360,5]]},"385":{"position":[[625,6],[754,6]]},"434":{"position":[[307,7]]},"451":{"position":[[344,5],[387,5],[421,5],[465,5],[505,5],[1921,6],[2256,5],[2976,5],[3170,5],[3250,5],[3294,6],[3482,5],[3526,6],[3622,5],[3718,5]]},"513":{"position":[[120,7]]},"515":{"position":[[123,5],[319,5],[399,5],[443,6],[895,5],[1167,6],[1383,6],[1559,5],[1655,5],[1817,6],[1843,5],[1879,5],[2117,5],[2177,5],[2225,5],[2403,5],[2439,5],[2623,5],[2674,6],[2822,6],[2867,5],[2896,5],[3070,5],[3127,5]]}}}],["blockchain",{"_index":745,"t":{"88":{"position":[[82,10]]},"256":{"position":[[114,10],[276,11]]},"272":{"position":[[81,10],[329,11],[532,11],[1078,10]]},"372":{"position":[[58,10]]},"374":{"position":[[159,10],[408,10],[654,10],[1356,10]]}}}],["blockresult",{"_index":574,"t":{"52":{"position":[[803,11]]}}}],["blockresult.id",{"_index":577,"t":{"52":{"position":[[894,17]]}}}],["blockroot>:_.log",{"_index":1287,"t":{"176":{"position":[[212,19]]}}}],["typescript",{"_index":6,"t":{"4":{"position":[[57,10]]},"6":{"position":[[173,10]]},"30":{"position":[[201,10]]},"50":{"position":[[732,10]]},"76":{"position":[[25,10]]},"96":{"position":[[31,10]]},"110":{"position":[[27,10]]},"112":{"position":[[49,10]]},"116":{"position":[[40,10]]},"284":{"position":[[1067,12]]},"483":{"position":[[37,10],[185,10]]},"485":{"position":[[220,10]]}}}],["typic",{"_index":1161,"t":{"156":{"position":[[12,7]]}}}],["typo",{"_index":416,"t":{"40":{"position":[[80,6]]}}}],["udp",{"_index":962,"t":{"128":{"position":[[6078,3],[6177,3],[6279,3],[6416,3],[6497,3],[6601,3],[7272,3],[7448,3]]},"318":{"position":[[5938,3],[6037,3],[6139,3],[6276,3],[6357,3],[6461,3],[7132,3],[7308,3]]},"334":{"position":[[1014,3]]},"344":{"position":[[610,3]]},"370":{"position":[[666,3],[809,3],[1201,3],[1313,3]]}}}],["ui",{"_index":643,"t":{"59":{"position":[[158,2]]},"128":{"position":[[2796,2]]},"318":{"position":[[2796,2]]}}}],["uid",{"_index":646,"t":{"59":{"position":[[204,3]]}}}],["ulimit",{"_index":1362,"t":{"192":{"position":[[62,6]]}}}],["unam",{"_index":1408,"t":{"198":{"position":[[332,6]]}}}],["unassign",{"_index":426,"t":{"40":{"position":[[249,10]]}}}],["under",{"_index":793,"t":{"114":{"position":[[104,5]]},"152":{"position":[[550,5]]},"192":{"position":[[463,5]]},"228":{"position":[[86,5]]},"364":{"position":[[514,5]]},"385":{"position":[[93,5]]},"395":{"position":[[49,5]]},"400":{"position":[[543,5]]}}}],["undergo",{"_index":2584,"t":{"440":{"position":[[21,9]]}}}],["underscor",{"_index":1906,"t":{"262":{"position":[[572,12],[2471,11]]}}}],["understand",{"_index":43,"t":{"6":{"position":[[408,10]]},"57":{"position":[[99,10]]},"224":{"position":[[1199,10]]},"226":{"position":[[95,13],[151,10]]},"232":{"position":[[2056,13]]},"304":{"position":[[79,13]]},"320":{"position":[[598,10]]},"330":{"position":[[221,13]]},"379":{"position":[[355,13]]}}}],["understood",{"_index":1591,"t":{"226":{"position":[[737,11]]}}}],["undesir",{"_index":1996,"t":{"272":{"position":[[920,10]]}}}],["unfilt",{"_index":1538,"t":{"210":{"position":[[218,10]]}}}],["unforgiv",{"_index":1103,"t":{"140":{"position":[[14,11]]}}}],["unfortun",{"_index":2066,"t":{"284":{"position":[[1135,13]]},"300":{"position":[[79,14]]}}}],["unit",{"_index":284,"t":{"30":{"position":[[40,4]]},"50":{"position":[[1459,4],[1720,4],[1901,4]]},"136":{"position":[[160,4],[180,4]]}}}],["unknown",{"_index":1485,"t":{"202":{"position":[[145,8]]},"210":{"position":[[427,14]]},"253":{"position":[[0,8],[164,7],[204,7]]},"385":{"position":[[124,7]]}}}],["unless",{"_index":546,"t":{"50":{"position":[[1255,6]]},"190":{"position":[[213,6]]},"515":{"position":[[1390,6],[1824,6]]}}}],["unlik",{"_index":1989,"t":{"272":{"position":[[462,6]]},"374":{"position":[[179,6]]}}}],["unlimit",{"_index":1364,"t":{"192":{"position":[[72,9]]}}}],["unpin",{"_index":313,"t":{"30":{"position":[[753,8]]},"52":{"position":[[209,8]]}}}],["unpkg",{"_index":2055,"t":{"284":{"position":[[299,5]]}}}],["unrealist",{"_index":2507,"t":{"374":{"position":[[1665,15]]}}}],["unrecogn",{"_index":670,"t":{"63":{"position":[[431,12]]}}}],["unstabl",{"_index":641,"t":{"59":{"position":[[110,8]]},"240":{"position":[[641,8]]},"397":{"position":[[205,8]]}}}],["unsur",{"_index":412,"t":{"40":{"position":[[0,6]]}}}],["until",{"_index":493,"t":{"46":{"position":[[908,5]]},"238":{"position":[[396,5]]},"240":{"position":[[1313,5]]},"383":{"position":[[234,5]]},"412":{"position":[[113,5]]}}}],["untim",{"_index":1949,"t":{"262":{"position":[[2226,8]]}}}],["unverifiedwhitelist",{"_index":2106,"t":{"296":{"position":[[131,19],[176,19]]}}}],["unwant",{"_index":2285,"t":{"346":{"position":[[194,8]]}}}],["unzip",{"_index":2562,"t":{"428":{"position":[[68,5]]}}}],["up",{"_index":113,"t":{"17":{"position":[[328,2],[512,2]]},"19":{"position":[[7,2]]},"32":{"position":[[55,2]]},"36":{"position":[[572,2]]},"38":{"position":[[198,2],[417,2]]},"140":{"position":[[157,2]]},"152":{"position":[[1443,2]]},"166":{"position":[[13,2]]},"188":{"position":[[124,2]]},"190":{"position":[[814,2]]},"230":{"position":[[278,2]]},"258":{"position":[[151,2]]},"280":{"position":[[24,2]]},"284":{"position":[[854,2]]},"330":{"position":[[372,2]]},"334":{"position":[[245,3]]},"354":{"position":[[250,2]]},"358":{"position":[[14,2]]},"372":{"position":[[223,2]]},"377":{"position":[[150,2]]},"381":{"position":[[131,2]]},"388":{"position":[[99,2],[338,2]]},"400":{"position":[[524,2]]},"414":{"position":[[183,2]]}}}],["updat",{"_index":419,"t":{"40":{"position":[[130,8]]},"55":{"position":[[646,8]]},"59":{"position":[[456,7]]},"63":{"position":[[38,8]]},"86":{"position":[[228,8]]},"132":{"position":[[64,8]]},"150":{"position":[[64,8]]},"178":{"position":[[64,8]]},"180":{"position":[[64,8]]},"190":{"position":[[445,8]]},"198":{"position":[[148,8],[415,6]]},"200":{"position":[[160,8]]},"202":{"position":[[363,6]]},"236":{"position":[[296,6]]},"240":{"position":[[1179,6]]},"242":{"position":[[73,6]]},"282":{"position":[[1141,8],[1323,8]]},"318":{"position":[[3067,6]]},"381":{"position":[[283,7]]},"392":{"position":[[25,6]]}}}],["updateheadersonforcedupd",{"_index":2038,"t":{"282":{"position":[[874,28]]}}}],["upgrad",{"_index":1176,"t":{"162":{"position":[[187,8]]},"264":{"position":[[14,9]]},"344":{"position":[[400,9]]}}}],["upnp",{"_index":2297,"t":{"348":{"position":[[26,5]]}}}],["upon",{"_index":2499,"t":{"374":{"position":[[960,4],[1390,4]]},"410":{"position":[[62,4]]},"475":{"position":[[79,4]]}}}],["uppercase_with_underscor",{"_index":529,"t":{"50":{"position":[[585,27]]}}}],["upsid",{"_index":1732,"t":{"240":{"position":[[474,7]]}}}],["url",{"_index":826,"t":{"128":{"position":[[583,3],[3566,4],[3837,4],[4990,3],[10393,3]]},"230":{"position":[[238,3],[313,3]]},"270":{"position":[[1131,3]]},"292":{"position":[[431,5],[1850,5]]},"318":{"position":[[583,3],[3533,4],[3804,4],[4865,3]]},"328":{"position":[[200,4]]},"364":{"position":[[692,4],[959,4],[1053,3]]},"418":{"position":[[104,4],[670,3]]},"451":{"position":[[4466,3]]}}}],["urls=http://127.0.0.1:9596",{"_index":2693,"t":{"519":{"position":[[806,26]]}}}],["us",{"_index":17,"t":{"6":{"position":[[91,3],[128,3]]},"17":{"position":[[174,4],[408,4],[1280,6],[1440,4],[2476,3]]},"26":{"position":[[5,5]]},"30":{"position":[[786,4]]},"32":{"position":[[112,4]]},"36":{"position":[[267,3],[402,3]]},"48":{"position":[[138,5]]},"50":{"position":[[25,5],[391,3],[613,3],[726,5],[902,3],[1230,3],[1314,3],[1882,3]]},"52":{"position":[[242,4]]},"57":{"position":[[336,3]]},"59":{"position":[[431,3]]},"63":{"position":[[360,3],[425,5]]},"70":{"position":[[205,4]]},"80":{"position":[[78,4]]},"84":{"position":[[34,4],[137,3]]},"94":{"position":[[113,5]]},"98":{"position":[[58,4]]},"100":{"position":[[114,4],[236,4],[321,4]]},"116":{"position":[[112,4]]},"122":{"position":[[82,4]]},"124":{"position":[[57,3]]},"128":{"position":[[1823,3],[3117,5],[3155,4],[3689,3],[4441,4],[4603,4],[4748,4],[7029,4],[7763,4],[8251,3],[8826,4],[10139,3],[10507,4],[10715,4]]},"134":{"position":[[473,6],[655,3]]},"136":{"position":[[125,4]]},"144":{"position":[[292,5]]},"156":{"position":[[147,4],[211,4],[275,4]]},"158":{"position":[[161,5]]},"162":{"position":[[292,4]]},"164":{"position":[[93,3]]},"170":{"position":[[660,4]]},"174":{"position":[[23,5],[1405,3]]},"184":{"position":[[32,3],[349,5]]},"186":{"position":[[390,3]]},"188":{"position":[[1020,3],[1377,6],[1471,5]]},"192":{"position":[[602,3],[736,3]]},"194":{"position":[[939,3]]},"196":{"position":[[250,3]]},"198":{"position":[[0,3],[556,7]]},"202":{"position":[[655,3],[909,4]]},"210":{"position":[[134,7]]},"224":{"position":[[403,6],[790,3]]},"226":{"position":[[193,3]]},"228":{"position":[[198,3],[1454,3]]},"230":{"position":[[217,5]]},"234":{"position":[[139,4],[624,7],[813,5],[1855,3]]},"236":{"position":[[341,5],[514,3]]},"240":{"position":[[461,5],[763,3],[2266,4]]},"244":{"position":[[215,6]]},"256":{"position":[[271,4]]},"270":{"position":[[773,3]]},"272":{"position":[[743,5],[1148,3]]},"276":{"position":[[516,3]]},"284":{"position":[[15,3],[128,3],[732,4],[834,3]]},"292":{"position":[[8,3],[90,3],[838,3],[911,6],[1290,6]]},"294":{"position":[[363,5]]},"300":{"position":[[3,3],[173,5]]},"318":{"position":[[1823,3],[3656,3],[4408,4],[4570,4],[4715,4],[6889,4]]},"328":{"position":[[439,4]]},"336":{"position":[[495,3]]},"338":{"position":[[64,3],[105,4],[200,4]]},"352":{"position":[[405,3]]},"356":{"position":[[83,4],[136,3],[242,3]]},"360":{"position":[[17,3],[98,3],[144,3],[229,3],[269,3],[350,3],[392,3],[473,3],[513,3],[594,3]]},"362":{"position":[[292,3]]},"364":{"position":[[979,3],[1426,4]]},"366":{"position":[[3719,3]]},"370":{"position":[[1622,3]]},"385":{"position":[[159,4],[713,3],[815,4]]},"397":{"position":[[494,3],[617,3]]},"400":{"position":[[99,3],[399,3],[473,3],[576,5]]},"408":{"position":[[33,4]]},"412":{"position":[[170,3]]},"418":{"position":[[343,6],[476,3],[639,3]]},"420":{"position":[[400,6]]},"436":{"position":[[670,3],[790,3]]},"440":{"position":[[128,5]]},"442":{"position":[[201,4]]},"451":{"position":[[773,3],[1343,4],[1831,3],[2408,5],[2446,4],[2757,4],[4212,3],[4580,4],[4788,4]]},"455":{"position":[[231,3]]},"459":{"position":[[231,3]]},"483":{"position":[[69,4]]},"485":{"position":[[8,6],[102,6],[114,4]]},"507":{"position":[[45,3],[174,5]]},"509":{"position":[[35,5],[210,3]]},"511":{"position":[[288,4],[490,5],[1386,3],[1731,5]]},"513":{"position":[[272,5],[597,3]]},"515":{"position":[[72,3],[1174,5],[2065,4],[2445,5]]},"517":{"position":[[7,3]]}}}],["usabl",{"_index":1674,"t":{"234":{"position":[[932,7]]}}}],["usag",{"_index":710,"t":{"74":{"position":[[57,5]]},"118":{"position":[[119,5]]},"128":{"position":[[9381,5]]},"202":{"position":[[764,5]]},"224":{"position":[[1246,6]]},"226":{"position":[[88,6]]},"292":{"position":[[959,5]]},"412":{"position":[[32,6]]},"451":{"position":[[3454,5]]},"515":{"position":[[1274,5]]}}}],["useless",{"_index":1675,"t":{"234":{"position":[[969,7]]}}}],["useproduceblockv3",{"_index":1030,"t":{"128":{"position":[[9347,18]]},"451":{"position":[[3420,18]]}}}],["useproduceblockv3=deneb",{"_index":2698,"t":{"519":{"position":[[1151,25]]}}}],["user",{"_index":583,"t":{"55":{"position":[[101,5],[221,6],[754,5]]},"57":{"position":[[198,4]]},"142":{"position":[[77,4]]},"152":{"position":[[1021,4]]},"234":{"position":[[309,4]]},"246":{"position":[[92,5]]},"272":{"position":[[45,5]]},"352":{"position":[[653,6]]},"388":{"position":[[33,5]]},"400":{"position":[[493,5],[557,5]]},"410":{"position":[[287,4]]},"477":{"position":[[136,4]]},"509":{"position":[[107,5],[186,4]]}}}],["usernam",{"_index":461,"t":{"46":{"position":[[99,8]]}}}],["users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib",{"_index":1360,"t":{"190":{"position":[[887,83]]},"194":{"position":[[404,83]]}}}],["users/ninja_user/coredumps/node.coredump",{"_index":1380,"t":{"194":{"position":[[211,41],[320,43]]}}}],["usr/lib/heaptrack/libheaptrack_preload.so",{"_index":1750,"t":{"240":{"position":[[1691,42]]}}}],["usr/src/lodestar/packages/cli/bin/lodestar",{"_index":1416,"t":{"200":{"position":[[55,43]]},"202":{"position":[[1153,44]]}}}],["usual",{"_index":1147,"t":{"152":{"position":[[1056,7]]},"188":{"position":[[432,7]]},"228":{"position":[[581,7]]},"322":{"position":[[338,7]]}}}],["utf8",{"_index":624,"t":{"57":{"position":[[296,4]]},"128":{"position":[[8355,4]]},"451":{"position":[[1935,4]]}}}],["util",{"_index":29,"t":{"6":{"position":[[243,7]]},"98":{"position":[[20,4],[42,7]]},"104":{"position":[[33,9]]},"336":{"position":[[55,8]]},"461":{"position":[[255,8]]},"488":{"position":[[148,7]]},"502":{"position":[[276,7]]},"505":{"position":[[43,9]]}}}],["utmost",{"_index":2414,"t":{"366":{"position":[[56,6]]}}}],["uv_",{"_index":1543,"t":{"210":{"position":[[347,4]]}}}],["v",{"_index":1721,"t":{"238":{"position":[[638,1]]},"240":{"position":[[1483,1]]},"397":{"position":[[358,1]]}}}],["v0",{"_index":2109,"t":{"296":{"position":[[341,2],[367,2],[650,2],[671,2],[1105,2],[1173,2],[1192,2],[1430,2],[1452,2]]}}}],["v1",{"_index":2119,"t":{"296":{"position":[[565,2],[715,2],[745,2],[944,2],[1127,2]]}}}],["v2",{"_index":2112,"t":{"296":{"position":[[407,2],[449,2],[483,2],[519,2],[583,2],[697,2],[765,2],[792,2],[816,2],[853,2],[878,2],[904,2],[927,2],[1156,2],[1284,2],[1327,2],[1372,2],[1403,2]]}}}],["v22",{"_index":2532,"t":{"400":{"position":[[130,4]]}}}],["v22.1.0",{"_index":1692,"t":{"236":{"position":[[570,7]]}}}],["v5",{"_index":785,"t":{"112":{"position":[[113,3]]}}}],["v8",{"_index":1389,"t":{"194":{"position":[[920,2],[1331,2],[1411,2]]},"198":{"position":[[713,2]]},"200":{"position":[[444,2],[2564,2]]},"210":{"position":[[61,2]]},"224":{"position":[[922,2]]},"226":{"position":[[18,2],[232,2],[966,4]]},"228":{"position":[[603,2]]}}}],["v8.log",{"_index":1450,"t":{"200":{"position":[[1298,6],[1381,6],[1463,6],[1546,6],[1629,6],[1711,6],[1794,6],[1877,6],[1960,6],[2043,6],[2126,6],[2209,6],[2292,6],[2375,6],[2458,6],[2533,6]]}}}],["v8::intern",{"_index":1545,"t":{"210":{"position":[[366,15]]}}}],["valgrind",{"_index":1662,"t":{"234":{"position":[[213,8],[398,9],[588,8]]}}}],["valid",{"_index":101,"t":{"17":{"position":[[142,11],[606,10],[1678,10],[1996,10],[2080,10],[2176,10]]},"38":{"position":[[220,10]]},"46":{"position":[[715,9]]},"74":{"position":[[104,10]]},"106":{"position":[[33,9],[160,9],[191,9],[326,9]]},"124":{"position":[[45,11]]},"126":{"position":[[42,10]]},"128":{"position":[[1449,9],[2426,12],[3103,9],[6940,9],[8212,10],[8470,9],[9497,11],[9782,9],[9818,10],[10485,9],[10671,8],[11020,9],[11207,10],[11292,10],[11475,9]]},"154":{"position":[[141,5]]},"160":{"position":[[57,9]]},"164":{"position":[[56,10]]},"170":{"position":[[805,11],[821,11]]},"176":{"position":[[374,9]]},"258":{"position":[[42,10],[105,10],[227,10],[482,10],[532,8],[569,11],[958,11]]},"262":{"position":[[791,10],[1756,8]]},"272":{"position":[[419,10]]},"312":{"position":[[209,9]]},"318":{"position":[[1449,9],[2426,12],[3048,9],[3080,9],[6800,9]]},"320":{"position":[[440,9],[1100,9],[1196,9]]},"322":{"position":[[209,9]]},"324":{"position":[[252,10]]},"326":{"position":[[143,9],[211,9]]},"328":{"position":[[218,9],[402,10]]},"346":{"position":[[510,9],[623,9]]},"352":{"position":[[600,9]]},"362":{"position":[[743,5],[1521,9]]},"364":{"position":[[1163,8]]},"366":{"position":[[3278,5]]},"374":{"position":[[503,11],[1479,10]]},"416":{"position":[[82,9]]},"418":{"position":[[577,11]]},"434":{"position":[[163,9],[211,9],[534,9]]},"436":{"position":[[72,9],[154,9],[289,9]]},"444":{"position":[[20,9]]},"446":{"position":[[50,9],[69,9],[106,9],[143,9],[160,9],[175,9],[200,9]]},"449":{"position":[[8,9],[105,9]]},"451":{"position":[[1792,10],[2050,9],[2394,9],[3570,11],[3855,9],[3891,10],[4558,9],[4744,8],[5093,9]]},"461":{"position":[[55,9]]},"463":{"position":[[7,9],[95,9]]},"465":{"position":[[121,9],[157,10]]},"467":{"position":[[29,10]]},"469":{"position":[[9,9],[62,9]]},"471":{"position":[[45,10],[128,10]]},"473":{"position":[[33,9],[81,9],[173,9],[265,9]]},"477":{"position":[[45,9],[147,9]]},"479":{"position":[[40,9],[88,9]]},"481":{"position":[[69,9]]},"505":{"position":[[66,9]]},"507":{"position":[[0,10],[145,9],[193,9]]},"509":{"position":[[359,10]]},"511":{"position":[[12,9],[500,9],[614,9],[710,9],[1343,10],[1394,9],[1458,10],[1503,9],[1588,9],[1618,9]]},"513":{"position":[[29,10],[228,9]]},"515":{"position":[[82,9],[571,9],[750,9],[2086,10],[2552,5],[3021,9]]},"519":{"position":[[20,9],[58,9],[961,9],[1055,9],[1141,9],[1368,9],[1557,9],[1746,9]]}}}],["valid(17088105",{"_index":2432,"t":{"366":{"position":[[805,14],[998,14]]}}}],["valid(17088167",{"_index":2442,"t":{"366":{"position":[[1197,14]]}}}],["valid(17088231",{"_index":2451,"t":{"366":{"position":[[1396,14]]}}}],["valid(17088414",{"_index":2362,"t":{"362":{"position":[[2059,14]]}}}],["valid(17088475",{"_index":2371,"t":{"362":{"position":[[2256,14]]},"366":{"position":[[1592,14]]}}}],["valid(17088521",{"_index":2379,"t":{"362":{"position":[[2535,14]]},"366":{"position":[[1871,14]]}}}],["valid(17088522",{"_index":2457,"t":{"366":{"position":[[2023,14]]}}}],["valid(17088524",{"_index":2462,"t":{"366":{"position":[[2185,14],[2347,14]]}}}],["valid(17088526",{"_index":2469,"t":{"366":{"position":[[2499,14]]}}}],["valid(17088527",{"_index":2474,"t":{"366":{"position":[[2651,14]]}}}],["validator'",{"_index":1010,"t":{"128":{"position":[[8656,11]]},"451":{"position":[[2587,11]]},"481":{"position":[[318,11]]}}}],["validator(",{"_index":2560,"t":{"426":{"position":[[194,12]]}}}],["validator.log",{"_index":2176,"t":{"320":{"position":[[1149,13]]}}}],["validator_key",{"_index":2647,"t":{"511":{"position":[[649,16],[745,16],[883,14],[1148,14],[1646,16]]}}}],["validatorindex=1234567",{"_index":2704,"t":{"519":{"position":[[1399,23]]}}}],["validatorindex=1234568",{"_index":2706,"t":{"519":{"position":[[1588,23]]}}}],["validatormonitorlog",{"_index":847,"t":{"128":{"position":[[1423,21]]},"318":{"position":[[1423,21]]}}}],["validatorsdbdir",{"_index":2177,"t":{"320":{"position":[[1224,15]]}}}],["valu",{"_index":175,"t":{"17":{"position":[[1419,6],[1747,6],[1943,6],[2153,5],[2231,6],[2450,6]]},"50":{"position":[[703,5]]},"128":{"position":[[9183,5]]},"156":{"position":[[20,6]]},"174":{"position":[[1882,5],[2236,5]]},"226":{"position":[[652,6],[839,6]]},"228":{"position":[[734,5],[766,5],[815,5],[901,5]]},"248":{"position":[[83,5]]},"251":{"position":[[165,6]]},"336":{"position":[[152,5]]},"366":{"position":[[2743,6]]},"420":{"position":[[152,5]]},"451":{"position":[[3256,5]]},"475":{"position":[[126,5]]},"515":{"position":[[405,5],[931,5],[1015,5],[2504,5],[2643,5]]}}}],["vari",{"_index":1772,"t":{"244":{"position":[[252,5]]}}}],["variabl",{"_index":525,"t":{"50":{"position":[[504,9],[1772,9]]},"57":{"position":[[382,9]]},"134":{"position":[[291,9],[354,8]]},"154":{"position":[[203,9]]},"234":{"position":[[1480,9]]},"251":{"position":[[310,8]]},"253":{"position":[[57,9],[423,9]]}}}],["varieti",{"_index":1893,"t":{"262":{"position":[[256,7]]}}}],["variou",{"_index":700,"t":{"70":{"position":[[25,7]]},"100":{"position":[[218,7]]},"104":{"position":[[25,7],[69,7]]},"138":{"position":[[63,7]]},"152":{"position":[[358,7]]},"158":{"position":[[167,7]]},"160":{"position":[[16,7]]},"168":{"position":[[237,7],[629,7],[764,7],[850,7],[904,7]]},"170":{"position":[[602,7]]},"262":{"position":[[836,7]]},"330":{"position":[[246,7]]},"344":{"position":[[221,7],[736,7]]},"388":{"position":[[299,7]]},"392":{"position":[[118,7]]}}}],["verb",{"_index":1391,"t":{"194":{"position":[[1182,4]]}}}],["verbiag",{"_index":417,"t":{"40":{"position":[[95,8]]}}}],["verbos",{"_index":612,"t":{"55":{"position":[[924,8]]},"128":{"position":[[1625,9],[1718,10],[1882,9],[1971,10]]},"270":{"position":[[575,9],[668,10],[832,9],[921,10]]},"318":{"position":[[1625,9],[1718,10],[1882,9],[1971,10]]},"370":{"position":[[1424,9],[1517,10],[1681,9],[1770,10]]},"451":{"position":[[575,9],[668,10],[832,9],[921,10]]}}}],["veri",{"_index":357,"t":{"34":{"position":[[356,4]]},"134":{"position":[[468,4]]},"152":{"position":[[246,4],[410,4]]},"188":{"position":[[255,4]]},"200":{"position":[[638,4]]},"226":{"position":[[48,4]]},"232":{"position":[[423,4],[696,4]]},"244":{"position":[[156,4]]},"322":{"position":[[346,4]]},"364":{"position":[[995,4]]}}}],["verif",{"_index":759,"t":{"94":{"position":[[58,12]]},"328":{"position":[[687,12]]}}}],["verifi",{"_index":1168,"t":{"158":{"position":[[79,8]]},"272":{"position":[[626,6]]},"290":{"position":[[80,6]]},"292":{"position":[[809,6]]},"383":{"position":[[109,6],[264,9],[377,8]]},"428":{"position":[[497,6]]},"485":{"position":[[490,6]]},"488":{"position":[[36,6]]},"502":{"position":[[58,6],[142,6]]},"519":{"position":[[926,8],[1020,8]]}}}],["versa",{"_index":1180,"t":{"164":{"position":[[76,6]]}}}],["version",{"_index":314,"t":{"30":{"position":[[762,8]]},"52":{"position":[[218,8]]},"65":{"position":[[814,7],[860,7]]},"86":{"position":[[354,7]]},"188":{"position":[[908,7],[1494,7],[1662,7]]},"194":{"position":[[1004,8]]},"236":{"position":[[528,7],[637,7],[682,7],[797,7],[848,7]]},"244":{"position":[[1065,7]]},"248":{"position":[[119,8]]},"284":{"position":[[221,8]]},"296":{"position":[[306,7]]},"324":{"position":[[488,8]]},"374":{"position":[[639,7]]},"383":{"position":[[16,7]]},"397":{"position":[[412,7]]},"400":{"position":[[78,7],[111,7],[158,8],[307,7],[382,9],[422,7]]},"440":{"position":[[161,7]]}}}],["version=v1.16.0/6ad9740",{"_index":2681,"t":{"519":{"position":[[201,24]]}}}],["version=v1.7.2",{"_index":2322,"t":{"362":{"position":[[582,15]]}}}],["versu",{"_index":1682,"t":{"234":{"position":[[1413,6]]}}}],["via",{"_index":155,"t":{"17":{"position":[[1050,3],[1185,3],[2689,3],[3126,3]]},"26":{"position":[[102,3]]},"32":{"position":[[165,3]]},"59":{"position":[[146,3]]},"88":{"position":[[121,3]]},"128":{"position":[[3661,3]]},"166":{"position":[[140,3]]},"168":{"position":[[200,3]]},"170":{"position":[[581,3],[751,3]]},"190":{"position":[[488,3]]},"202":{"position":[[434,3]]},"224":{"position":[[1083,3]]},"240":{"position":[[1771,3],[2039,3]]},"244":{"position":[[332,3]]},"251":{"position":[[277,3]]},"318":{"position":[[3628,3]]},"328":{"position":[[127,3],[578,3]]},"330":{"position":[[158,3]]},"334":{"position":[[317,3],[1010,3],[1088,3]]},"336":{"position":[[675,3]]},"342":{"position":[[276,3]]},"364":{"position":[[230,3]]},"372":{"position":[[583,3]]},"383":{"position":[[157,3]]},"434":{"position":[[375,3]]},"471":{"position":[[70,3]]},"477":{"position":[[70,3]]},"511":{"position":[[53,3]]},"515":{"position":[[1979,3]]}}}],["viabl",{"_index":2476,"t":{"366":{"position":[[2844,6]]}}}],["vice",{"_index":1179,"t":{"164":{"position":[[71,4]]}}}],["view",{"_index":34,"t":{"6":{"position":[[296,4]]},"204":{"position":[[163,4]]}}}],["viewer",{"_index":2247,"t":{"336":{"position":[[1017,6]]}}}],["virgil",{"_index":1963,"t":{"264":{"position":[[198,6]]}}}],["virtual",{"_index":1104,"t":{"140":{"position":[[26,7]]},"194":{"position":[[833,7]]},"198":{"position":[[574,7]]},"200":{"position":[[561,7]]}}}],["visual",{"_index":647,"t":{"59":{"position":[[225,8],[297,6]]}}}],["vital",{"_index":2503,"t":{"374":{"position":[[1436,5]]}}}],["vitalik",{"_index":1837,"t":{"256":{"position":[[332,7]]},"264":{"position":[[178,7]]}}}],["vitalik'",{"_index":2397,"t":{"364":{"position":[[275,9]]}}}],["vite",{"_index":2052,"t":{"284":{"position":[[108,5]]}}}],["vitest",{"_index":342,"t":{"34":{"position":[[7,8],[595,7],[642,6],[682,6]]},"36":{"position":[[619,6]]},"98":{"position":[[30,6]]},"134":{"position":[[659,6]]}}}],["vitest'",{"_index":375,"t":{"36":{"position":[[271,8],[406,8]]}}}],["vitest.spec.config.t",{"_index":389,"t":{"36":{"position":[[650,21]]}}}],["vm",{"_index":1400,"t":{"198":{"position":[[131,2]]},"200":{"position":[[845,2]]},"226":{"position":[[402,2]]}}}],["voluntari",{"_index":2593,"t":{"446":{"position":[[185,9]]},"471":{"position":[[11,9]]},"473":{"position":[[10,9],[91,9],[150,9],[275,9]]},"475":{"position":[[104,9]]}}}],["vote",{"_index":1283,"t":{"174":{"position":[[2394,5],[2473,5],[2554,5]]},"258":{"position":[[518,6],[663,5]]},"320":{"position":[[1723,6],[1812,6]]}}}],["vs",{"_index":337,"t":{"32":{"position":[[157,2]]},"36":{"position":[[132,2]]},"184":{"position":[[183,2],[294,2]]},"186":{"position":[[394,2]]},"515":{"position":[[138,3]]}}}],["vscode/launch.json",{"_index":1294,"t":{"184":{"position":[[99,19]]}}}],["vulner",{"_index":2587,"t":{"442":{"position":[[16,13],[117,14],[181,13]]}}}],["wagyu",{"_index":2639,"t":{"509":{"position":[[229,5]]}}}],["wait",{"_index":1715,"t":{"238":{"position":[[299,4]]},"240":{"position":[[1017,4],[1830,4]]},"282":{"position":[[919,4]]}}}],["walk",{"_index":1396,"t":{"196":{"position":[[59,4]]},"226":{"position":[[281,7],[442,5],[627,6]]}}}],["wallet",{"_index":2168,"t":{"320":{"position":[[209,6]]}}}],["want",{"_index":160,"t":{"17":{"position":[[1118,4]]},"40":{"position":[[324,8]]},"50":{"position":[[1281,4]]},"192":{"position":[[562,4]]},"224":{"position":[[43,4]]},"238":{"position":[[502,4]]},"284":{"position":[[7,4]]},"292":{"position":[[1013,4],[1115,4]]}}}],["warn",{"_index":589,"t":{"55":{"position":[[302,5]]},"128":{"position":[[1702,7],[1955,7]]},"198":{"position":[[94,7]]},"240":{"position":[[555,7],[601,8],[755,7]]},"270":{"position":[[652,7],[905,7]]},"318":{"position":[[1702,7],[1955,7]]},"362":{"position":[[1283,5],[3111,7]]},"364":{"position":[[964,7]]},"370":{"position":[[1501,7],[1754,7]]},"451":{"position":[[652,7],[905,7]]},"509":{"position":[[298,7]]},"511":{"position":[[1704,7]]}}}],["way",{"_index":1129,"t":{"152":{"position":[[157,3],[633,3]]},"166":{"position":[[183,3]]},"184":{"position":[[13,3]]},"190":{"position":[[110,3]]},"196":{"position":[[193,5]]},"226":{"position":[[528,4]]},"232":{"position":[[59,3]]},"234":{"position":[[1259,3],[1304,3]]},"244":{"position":[[205,3]]},"251":{"position":[[254,3]]},"272":{"position":[[361,3]]},"292":{"position":[[40,5]]},"383":{"position":[[420,4]]},"426":{"position":[[158,3]]}}}],["we'r",{"_index":495,"t":{"48":{"position":[[0,5],[132,5]]}}}],["weak",{"_index":828,"t":{"128":{"position":[[621,4],[859,4],[992,4],[1166,4]]},"318":{"position":[[621,4],[859,4],[992,4],[1166,4]]},"364":{"position":[[251,4],[314,4],[1685,4]]},"374":{"position":[[0,4],[689,4],[889,5],[1278,4]]}}}],["web",{"_index":642,"t":{"59":{"position":[[154,3]]},"284":{"position":[[1094,3]]},"334":{"position":[[650,3]]}}}],["web3",{"_index":757,"t":{"94":{"position":[[22,4]]},"292":{"position":[[51,4],[125,4],[135,7],[546,4],[1544,4],[1554,7],[1988,4]]},"294":{"position":[[46,4]]}}}],["web3(provid",{"_index":2084,"t":{"292":{"position":[[557,15],[1999,15]]}}}],["web3.eth.getbalance(address",{"_index":2086,"t":{"292":{"position":[[657,28],[2099,28]]}}}],["web3.j",{"_index":2097,"t":{"294":{"position":[[208,8]]}}}],["web3.providers.httpprovider(\"https://lodestar",{"_index":2078,"t":{"292":{"position":[[247,45],[1666,45]]}}}],["web3sign",{"_index":2576,"t":{"434":{"position":[[61,11]]}}}],["webpack",{"_index":2051,"t":{"284":{"position":[[99,8]]}}}],["websit",{"_index":2011,"t":{"276":{"position":[[451,8]]}}}],["week",{"_index":1947,"t":{"262":{"position":[[2115,5]]},"322":{"position":[[172,4]]}}}],["weekli",{"_index":696,"t":{"67":{"position":[[49,6]]}}}],["welcom",{"_index":2161,"t":{"312":{"position":[[0,8]]}}}],["well",{"_index":514,"t":{"50":{"position":[[261,6]]},"78":{"position":[[228,5]]},"188":{"position":[[349,4]]},"226":{"position":[[732,4]]},"244":{"position":[[116,4],[161,5]]},"366":{"position":[[3330,4]]},"385":{"position":[[276,4]]},"509":{"position":[[373,4]]}}}],["went",{"_index":1841,"t":{"256":{"position":[[402,4]]}}}],["wherebi",{"_index":1888,"t":{"262":{"position":[[85,7]]}}}],["whether",{"_index":904,"t":{"128":{"position":[[3498,7]]},"318":{"position":[[3451,7]]},"366":{"position":[[3256,7]]},"370":{"position":[[1054,7]]}}}],["whichev",{"_index":1691,"t":{"236":{"position":[[518,9]]}}}],["white",{"_index":548,"t":{"50":{"position":[[1385,5]]}}}],["whole",{"_index":30,"t":{"6":{"position":[[255,5]]},"142":{"position":[[118,5]]},"188":{"position":[[142,5]]},"202":{"position":[[546,5]]},"226":{"position":[[613,5]]},"278":{"position":[[89,5]]},"306":{"position":[[71,5]]}}}],["wide",{"_index":1897,"t":{"262":{"position":[[341,4]]},"272":{"position":[[1134,4]]}}}],["wild",{"_index":1133,"t":{"152":{"position":[[230,5]]}}}],["window",{"_index":941,"t":{"128":{"position":[[5196,6]]},"230":{"position":[[433,6]]},"284":{"position":[[530,7]]},"318":{"position":[[5071,6]]}}}],["window.addeventlistener(\"domcontentload",{"_index":2063,"t":{"284":{"position":[[898,43]]}}}],["window.ethereum",{"_index":2092,"t":{"292":{"position":[[1390,16]]}}}],["window.lodestar.lightcli",{"_index":2060,"t":{"284":{"position":[[568,28],[1017,27]]}}}],["window.lodestar.lightclient.transport",{"_index":2061,"t":{"284":{"position":[[664,38]]}}}],["wip",{"_index":893,"t":{"128":{"position":[[3076,5]]},"451":{"position":[[2367,5]]}}}],["wire",{"_index":1050,"t":{"128":{"position":[[10124,4],[10268,4]]},"451":{"position":[[4197,4],[4341,4]]}}}],["withdraw",{"_index":2614,"t":{"481":{"position":[[107,10],[141,11],[203,11]]}}}],["withdrawn",{"_index":2616,"t":{"481":{"position":[[357,10]]}}}],["within",{"_index":492,"t":{"46":{"position":[[839,6]]},"128":{"position":[[1159,6]]},"174":{"position":[[1483,6]]},"224":{"position":[[962,6]]},"318":{"position":[[1159,6]]},"364":{"position":[[1674,6]]},"374":{"position":[[937,6]]},"381":{"position":[[35,6],[228,6]]}}}],["without",{"_index":187,"t":{"17":{"position":[[1657,7]]},"36":{"position":[[62,7]]},"59":{"position":[[182,7]]},"192":{"position":[[673,7]]},"215":{"position":[[357,7]]},"234":{"position":[[977,7],[1048,7]]},"240":{"position":[[179,7],[2378,7],[2873,7]]},"272":{"position":[[735,7]]},"296":{"position":[[58,7]]},"340":{"position":[[458,7]]},"374":{"position":[[1199,7]]},"377":{"position":[[96,7]]},"434":{"position":[[191,7]]},"515":{"position":[[2565,7]]}}}],["withstand",{"_index":1904,"t":{"262":{"position":[[549,9]]}}}],["wood",{"_index":1960,"t":{"264":{"position":[[101,4]]}}}],["word",{"_index":669,"t":{"63":{"position":[[375,4],[444,5],[486,4]]}}}],["work",{"_index":108,"t":{"17":{"position":[[249,5]]},"86":{"position":[[290,6]]},"138":{"position":[[138,4]]},"142":{"position":[[124,5]]},"144":{"position":[[175,4]]},"152":{"position":[[302,4],[390,4],[672,8],[1290,5]]},"160":{"position":[[78,7]]},"188":{"position":[[1693,4]]},"190":{"position":[[376,4]]},"192":{"position":[[422,5]]},"194":{"position":[[666,7]]},"228":{"position":[[1396,7]]},"232":{"position":[[1485,7]]},"240":{"position":[[2696,7],[2782,4]]},"244":{"position":[[150,5],[275,6],[481,7]]},"256":{"position":[[529,7]]},"258":{"position":[[86,4]]},"320":{"position":[[140,4]]},"330":{"position":[[279,4]]},"374":{"position":[[198,4],[473,4]]},"388":{"position":[[368,4]]}}}],["workaround",{"_index":1348,"t":{"190":{"position":[[458,10]]},"244":{"position":[[1149,10]]},"284":{"position":[[1279,10]]}}}],["worker",{"_index":752,"t":{"90":{"position":[[88,6]]},"184":{"position":[[321,7]]},"186":{"position":[[211,7],[296,6]]},"334":{"position":[[1239,8]]},"336":{"position":[[795,6]]}}}],["workspac",{"_index":1173,"t":{"158":{"position":[[363,9]]},"160":{"position":[[104,9]]},"164":{"position":[[118,9]]}}}],["world",{"_index":1586,"t":{"226":{"position":[[259,5]]},"324":{"position":[[589,5]]},"328":{"position":[[572,5]]}}}],["worth",{"_index":1769,"t":{"244":{"position":[[121,5]]}}}],["wrapper",{"_index":777,"t":{"110":{"position":[[38,7]]},"224":{"position":[[1135,8]]}}}],["write",{"_index":723,"t":{"82":{"position":[[109,5]]},"190":{"position":[[551,7]]},"228":{"position":[[265,6]]},"244":{"position":[[15,7]]}}}],["written",{"_index":469,"t":{"46":{"position":[[265,7]]},"228":{"position":[[1305,8],[1373,7]]},"240":{"position":[[1623,7]]}}}],["wrong",{"_index":351,"t":{"34":{"position":[[234,5]]},"52":{"position":[[881,6]]},"364":{"position":[[1076,5]]}}}],["wscheckpoint",{"_index":2083,"t":{"292":{"position":[[500,13],[1919,13]]}}}],["wsscheckpoint",{"_index":830,"t":{"128":{"position":[[692,13],[798,14]]},"318":{"position":[[692,13],[798,14]]},"364":{"position":[[700,13],[828,14],[1177,13]]},"385":{"position":[[891,13]]}}}],["x",{"_index":1439,"t":{"200":{"position":[[1126,1],[1181,1]]},"228":{"position":[[1487,1]]}}}],["x86_64",{"_index":1383,"t":{"194":{"position":[[364,8]]}}}],["xarg",{"_index":1725,"t":{"238":{"position":[[678,5]]},"240":{"position":[[2676,5]]}}}],["xcode",{"_index":1343,"t":{"190":{"position":[[240,5]]}}}],["xdg_data_home/lodestar/$network_nam",{"_index":2384,"t":{"362":{"position":[[2795,38]]}}}],["xr",{"_index":1444,"t":{"200":{"position":[[1178,2]]}}}],["xxxx",{"_index":2530,"t":{"397":{"position":[[420,5],[432,5]]}}}],["y",{"_index":1689,"t":{"236":{"position":[[319,1]]},"240":{"position":[[1210,1]]},"242":{"position":[[104,1]]}}}],["yaml",{"_index":1005,"t":{"128":{"position":[[8424,4]]},"451":{"position":[[2004,4]]}}}],["yamux",{"_index":798,"t":{"118":{"position":[[21,5],[73,5]]},"496":{"position":[[143,5]]}}}],["yarn",{"_index":265,"t":{"24":{"position":[[18,4]]},"28":{"position":[[48,4],[84,4]]},"30":{"position":[[21,4],[59,4],[102,4],[140,4],[175,4],[226,4],[465,4],[505,4]]},"34":{"position":[[677,4]]},"36":{"position":[[614,4]]},"44":{"position":[[225,5],[240,4]]},"50":{"position":[[444,4],[944,4],[1031,4]]},"63":{"position":[[172,4],[241,4]]},"148":{"position":[[74,4]]},"158":{"position":[[358,4]]},"160":{"position":[[99,4]]},"164":{"position":[[113,4]]},"206":{"position":[[274,4]]},"208":{"position":[[56,4]]},"236":{"position":[[1218,4],[1232,4],[1275,4]]},"302":{"position":[[13,4]]},"400":{"position":[[18,4]]},"404":{"position":[[123,4]]},"406":{"position":[[27,4]]},"410":{"position":[[92,5]]}}}],["ye",{"_index":2610,"t":{"475":{"position":[[244,4]]}}}],["year",{"_index":2196,"t":{"322":{"position":[[249,5],[284,5]]}}}],["you'r",{"_index":439,"t":{"44":{"position":[[10,6],[288,6]]}}}],["you'v",{"_index":443,"t":{"44":{"position":[[158,6]]}}}],["young",{"_index":2385,"t":{"362":{"position":[[2836,5]]}}}],["your/home/directory/.nvm/versions/node/v20.10.0/bin/node_debug",{"_index":1699,"t":{"236":{"position":[[1060,63]]}}}],["yourself",{"_index":631,"t":{"57":{"position":[[466,8]]}}}],["zero",{"_index":861,"t":{"128":{"position":[[2114,6]]},"270":{"position":[[1064,6]]},"318":{"position":[[2114,6]]},"370":{"position":[[1913,6]]},"388":{"position":[[139,4]]},"451":{"position":[[1064,6]]},"455":{"position":[[237,4]]},"459":{"position":[[237,4]]}}}],["zip",{"_index":2563,"t":{"428":{"position":[[89,4]]}}}],["zoom",{"_index":1521,"t":{"204":{"position":[[103,7]]}}}],["zsh",{"_index":1357,"t":{"190":{"position":[[714,3]]}}}],["zshrc",{"_index":1354,"t":{"190":{"position":[[638,8],[718,8]]}}}],["zstd",{"_index":1789,"t":{"244":{"position":[[1016,4]]}}}]],"pipeline":["stemmer"]}}] \ No newline at end of file +[{"documents":[{"i":1,"t":"Home","u":"/lodestar/","b":[]},{"i":14,"t":"Doppelganger Detection","u":"/lodestar/contribution/advanced-topics/doppelganger-detection","b":[]},{"i":15,"t":"Setting-Up a Testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","b":["Contributing","Advanced Topics"]},{"i":19,"t":"Block Exploration","u":"/lodestar/contribution/advanced-topics/block-exploration","b":[]},{"i":20,"t":"Slashing Protection","u":"/lodestar/contribution/advanced-topics/slashing-protection","b":[]},{"i":21,"t":"Migration From Other Clients","u":"/lodestar/contribution/advanced-topics/migrating-from-other-clients","b":[]},{"i":22,"t":"Dependency Graph","u":"/lodestar/contribution/depgraph","b":["Contributing"]},{"i":77,"t":"bug-reports","u":"/lodestar/contribution/bug-reports","b":[]},{"i":78,"t":"dev CLI Command","u":"/lodestar/contribution/dev-cli","b":["Contributing","Development Tools"]},{"i":84,"t":"repo","u":"/lodestar/contribution/repo","b":[]},{"i":85,"t":"pr-submission","u":"/lodestar/contribution/pr-submission","b":[]},{"i":86,"t":"End-To-End Tests","u":"/lodestar/contribution/testing/end-to-end-tests","b":["Contributing","Testing"]},{"i":88,"t":"Integration Tests","u":"/lodestar/contribution/testing/integration-tests","b":["Contributing","Testing"]},{"i":90,"t":"Contribution Guidelines","u":"/lodestar/contribution/getting-started","b":["Contributing"]},{"i":137,"t":"Performance Tests","u":"/lodestar/contribution/testing/performance-tests","b":["Contributing","Testing"]},{"i":139,"t":"Testing","u":"/lodestar/contribution/testing/","b":["Contributing","Testing"]},{"i":153,"t":"Simulation Tests","u":"/lodestar/contribution/testing/simulation-tests","b":["Contributing","Testing"]},{"i":179,"t":"Specification Tests","u":"/lodestar/contribution/testing/spec-tests","b":["Contributing","Testing"]},{"i":181,"t":"Debugging","u":"/lodestar/contribution/tools/debugging","b":["Contributing","Development Tools"]},{"i":187,"t":"Core Dump Analysis","u":"/lodestar/contribution/tools/core-dumps","b":["Contributing","Development Tools"]},{"i":195,"t":"perf","u":"/lodestar/contribution/tools/perf","b":[]},{"i":196,"t":"Generating Flamegraphs for a Running Node Service on Linux","u":"/lodestar/contribution/tools/flamegraphs","b":["Contributing","Development Tools"]},{"i":223,"t":"Heap Dump Analysis","u":"/lodestar/contribution/tools/heap-dumps","b":["Contributing","Development Tools"]},{"i":245,"t":"Unit Tests","u":"/lodestar/contribution/testing/unit-tests","b":[]},{"i":247,"t":"Frequently Asked Questions","u":"/lodestar/faqs","b":[]},{"i":256,"t":"Lodestar Light Client","u":"/lodestar/libraries/lightclient-prover/lightclient","b":["Developer Tools","Light Client"]},{"i":274,"t":"Introduction","u":"/lodestar/introduction","b":[]},{"i":284,"t":"lightclient CLI Command","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","b":["Developer Tools","Light Client"]},{"i":290,"t":"Page relocated","u":"/lodestar/reference/cli","b":[]},{"i":292,"t":"Lodestar Prover","u":"/lodestar/libraries/lightclient-prover/prover","b":["Developer Tools","Prover"]},{"i":314,"t":"using-the-api","u":"/lodestar/libraries/api/using-the-api","b":[]},{"i":315,"t":"beacon CLI Command","u":"/lodestar/run/beacon-management/beacon-cli","b":["Run A Node","Beacon Node"]},{"i":321,"t":"MEV & Merge","u":"/lodestar/run/beacon-management/mev-and-builder-integration","b":["Run A Node","Beacon Node"]},{"i":327,"t":"Networking","u":"/lodestar/run/beacon-management/networking","b":["Run A Node","Beacon Node"]},{"i":347,"t":"Syncing","u":"/lodestar/run/beacon-management/syncing","b":["Run A Node","Beacon Node"]},{"i":362,"t":"Data Retention","u":"/lodestar/run/beacon-management/data-retention","b":["Run A Node","Beacon Node"]},{"i":366,"t":"Beacon Management","u":"/lodestar/run/beacon-management/starting-a-node","b":["Run A Node","Beacon Node"]},{"i":384,"t":"bootnode CLI Command","u":"/lodestar/run/bootnode/bootnode-cli","b":["Run A Node","Discv5 Bootnode"]},{"i":388,"t":"Install Options","u":"/lodestar/run/getting-started/installation","b":["Run A Node"]},{"i":408,"t":"Lodestar Quick Start Scripts","u":"/lodestar/run/getting-started/quick-start","b":["Run A Node","Quick Start"]},{"i":414,"t":"Client Monitoring","u":"/lodestar/run/logging-and-metrics/client-monitoring","b":["Run A Node","Logging and Metrics"]},{"i":422,"t":"Quick Start Custom Setup Guide","u":"/lodestar/run/getting-started/quick-start-custom-guide","b":["Run A Node","Quick Start"]},{"i":489,"t":"Prometheus and Grafana Setup","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","b":["Run A Node","Logging and Metrics"]},{"i":497,"t":"External Signer","u":"/lodestar/run/validator-management/external-signer","b":["Run A Node","Validator Client"]},{"i":501,"t":"key-management","u":"/lodestar/run/validator-management/key-management","b":[]},{"i":502,"t":"Proposer Configuration","u":"/lodestar/run/validator-management/proposer-config","b":["Run A Node","Validator Client"]},{"i":508,"t":"validator CLI Command","u":"/lodestar/run/validator-management/validator-cli","b":["Run A Node","Validator Client"]},{"i":547,"t":"multiple-and-fallback-validation","u":"/lodestar/run/validator-management/multiple-and-fallback-validation","b":[]},{"i":548,"t":"Validator Configuration","u":"/lodestar/run/validator-management/vc-configuration","b":["Run A Node","Validator Client"]},{"i":564,"t":"Security Policy","u":"/lodestar/security","b":[]},{"i":569,"t":"withdrawals","u":"/lodestar/run/validator-management/withdrawals","b":[]},{"i":570,"t":"Supporting Libraries","u":"/lodestar/supporting-libraries/","b":[]},{"i":580,"t":"Lodestar libraries","u":"/lodestar/supporting-libraries/libraries","b":[]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,4.644]],["t/14",[1,3.763,2,3.763]],["t/15",[3,3.163,4,3.163,5,3.163]],["t/19",[6,3.763,7,3.763]],["t/20",[8,3.763,9,3.763]],["t/21",[10,3.763,11,2.873]],["t/22",[12,3.763,13,3.763]],["t/77",[14,3.763,15,3.763]],["t/78",[16,3.163,17,2.016,18,2.016]],["t/84",[19,4.644]],["t/85",[20,3.763,21,3.763]],["t/86",[22,4.515,23,1.742]],["t/88",[23,2.073,24,3.763]],["t/90",[25,3.763,26,3.763]],["t/137",[23,2.073,27,3.763]],["t/139",[23,2.558]],["t/153",[23,2.073,28,3.763]],["t/179",[23,2.073,29,3.763]],["t/181",[30,4.644]],["t/187",[31,3.163,32,2.712,33,2.712]],["t/195",[34,4.644]],["t/196",[35,2.139,36,2.139,37,2.139,38,2.139,39,2.139,40,2.139]],["t/223",[32,2.712,33,2.712,41,3.163]],["t/245",[23,2.073,42,3.763]],["t/247",[43,3.163,44,3.163,45,3.163]],["t/256",[11,2.415,46,2.193,47,3.163]],["t/274",[48,4.644]],["t/284",[17,2.016,18,2.016,49,3.163]],["t/290",[50,3.763,51,3.763]],["t/292",[46,2.609,52,3.763]],["t/314",[53,3.763,54,3.763]],["t/315",[17,2.016,18,2.016,55,2.712]],["t/321",[56,3.163,57,3.163,58,3.163]],["t/327",[59,4.644]],["t/347",[60,4.644]],["t/362",[61,3.763,62,3.763]],["t/366",[55,3.227,63,3.227]],["t/384",[17,2.016,18,2.016,64,3.163]],["t/388",[65,3.763,66,3.763]],["t/408",[46,1.892,67,2.339,68,2.339,69,2.728]],["t/414",[11,2.873,70,3.763]],["t/422",[67,2.056,68,2.056,71,2.398,72,2.056,73,2.398]],["t/489",[72,2.712,74,3.163,75,3.163]],["t/497",[76,3.763,77,3.763]],["t/501",[63,3.227,78,3.763]],["t/502",[79,3.763,80,3.227]],["t/508",[17,2.016,18,2.016,81,2.415]],["t/547",[81,2.415,82,3.163,83,3.163]],["t/548",[80,3.227,81,2.873]],["t/564",[84,3.763,85,3.763]],["t/569",[86,4.644]],["t/570",[87,3.763,88,3.227]],["t/580",[46,2.609,88,3.227]]],"invertedIndex":[["",{"_index":57,"t":{"321":{"position":[[4,1]]}}}],["analysi",{"_index":33,"t":{"187":{"position":[[10,8]]},"223":{"position":[[10,8]]}}}],["api",{"_index":54,"t":{"314":{"position":[[10,3]]}}}],["ask",{"_index":44,"t":{"247":{"position":[[11,5]]}}}],["beacon",{"_index":55,"t":{"315":{"position":[[0,6]]},"366":{"position":[[0,6]]}}}],["block",{"_index":6,"t":{"19":{"position":[[0,5]]}}}],["bootnod",{"_index":64,"t":{"384":{"position":[[0,8]]}}}],["bug",{"_index":14,"t":{"77":{"position":[[0,3]]}}}],["cli",{"_index":17,"t":{"78":{"position":[[4,3]]},"284":{"position":[[12,3]]},"315":{"position":[[7,3]]},"384":{"position":[[9,3]]},"508":{"position":[[10,3]]}}}],["client",{"_index":11,"t":{"21":{"position":[[21,7]]},"256":{"position":[[15,6]]},"414":{"position":[[0,6]]}}}],["command",{"_index":18,"t":{"78":{"position":[[8,7]]},"284":{"position":[[16,7]]},"315":{"position":[[11,7]]},"384":{"position":[[13,7]]},"508":{"position":[[14,7]]}}}],["configur",{"_index":80,"t":{"502":{"position":[[9,13]]},"548":{"position":[[10,13]]}}}],["contribut",{"_index":25,"t":{"90":{"position":[[0,12]]}}}],["core",{"_index":31,"t":{"187":{"position":[[0,4]]}}}],["custom",{"_index":71,"t":{"422":{"position":[[12,6]]}}}],["data",{"_index":61,"t":{"362":{"position":[[0,4]]}}}],["debug",{"_index":30,"t":{"181":{"position":[[0,9]]}}}],["depend",{"_index":12,"t":{"22":{"position":[[0,10]]}}}],["detect",{"_index":2,"t":{"14":{"position":[[13,9]]}}}],["dev",{"_index":16,"t":{"78":{"position":[[0,3]]}}}],["doppelgang",{"_index":1,"t":{"14":{"position":[[0,12]]}}}],["dump",{"_index":32,"t":{"187":{"position":[[5,4]]},"223":{"position":[[5,4]]}}}],["end",{"_index":22,"t":{"86":{"position":[[0,3],[7,3]]}}}],["explor",{"_index":7,"t":{"19":{"position":[[6,11]]}}}],["extern",{"_index":76,"t":{"497":{"position":[[0,8]]}}}],["fallback",{"_index":83,"t":{"547":{"position":[[13,8]]}}}],["flamegraph",{"_index":36,"t":{"196":{"position":[[11,11]]}}}],["frequent",{"_index":43,"t":{"247":{"position":[[0,10]]}}}],["gener",{"_index":35,"t":{"196":{"position":[[0,10]]}}}],["grafana",{"_index":75,"t":{"489":{"position":[[15,7]]}}}],["graph",{"_index":13,"t":{"22":{"position":[[11,5]]}}}],["guid",{"_index":73,"t":{"422":{"position":[[25,5]]}}}],["guidelin",{"_index":26,"t":{"90":{"position":[[13,10]]}}}],["heap",{"_index":41,"t":{"223":{"position":[[0,4]]}}}],["home",{"_index":0,"t":{"1":{"position":[[0,4]]}}}],["instal",{"_index":65,"t":{"388":{"position":[[0,7]]}}}],["integr",{"_index":24,"t":{"88":{"position":[[0,11]]}}}],["introduct",{"_index":48,"t":{"274":{"position":[[0,12]]}}}],["key",{"_index":78,"t":{"501":{"position":[[0,3]]}}}],["librari",{"_index":88,"t":{"570":{"position":[[11,9]]},"580":{"position":[[9,9]]}}}],["light",{"_index":47,"t":{"256":{"position":[[9,5]]}}}],["lightclient",{"_index":49,"t":{"284":{"position":[[0,11]]}}}],["linux",{"_index":40,"t":{"196":{"position":[[53,5]]}}}],["lodestar",{"_index":46,"t":{"256":{"position":[[0,8]]},"292":{"position":[[0,8]]},"408":{"position":[[0,8]]},"580":{"position":[[0,8]]}}}],["manag",{"_index":63,"t":{"366":{"position":[[7,10]]},"501":{"position":[[4,10]]}}}],["merg",{"_index":58,"t":{"321":{"position":[[6,5]]}}}],["mev",{"_index":56,"t":{"321":{"position":[[0,3]]}}}],["migrat",{"_index":10,"t":{"21":{"position":[[0,9]]}}}],["monitor",{"_index":70,"t":{"414":{"position":[[7,10]]}}}],["multipl",{"_index":82,"t":{"547":{"position":[[0,8]]}}}],["network",{"_index":59,"t":{"327":{"position":[[0,10]]}}}],["node",{"_index":38,"t":{"196":{"position":[[37,4]]}}}],["option",{"_index":66,"t":{"388":{"position":[[8,7]]}}}],["page",{"_index":50,"t":{"290":{"position":[[0,4]]}}}],["perf",{"_index":34,"t":{"195":{"position":[[0,4]]}}}],["perform",{"_index":27,"t":{"137":{"position":[[0,11]]}}}],["polici",{"_index":85,"t":{"564":{"position":[[9,6]]}}}],["pr",{"_index":20,"t":{"85":{"position":[[0,2]]}}}],["prometheu",{"_index":74,"t":{"489":{"position":[[0,10]]}}}],["propos",{"_index":79,"t":{"502":{"position":[[0,8]]}}}],["protect",{"_index":9,"t":{"20":{"position":[[9,10]]}}}],["prover",{"_index":52,"t":{"292":{"position":[[9,6]]}}}],["question",{"_index":45,"t":{"247":{"position":[[17,9]]}}}],["quick",{"_index":67,"t":{"408":{"position":[[9,5]]},"422":{"position":[[0,5]]}}}],["reloc",{"_index":51,"t":{"290":{"position":[[5,9]]}}}],["repo",{"_index":19,"t":{"84":{"position":[[0,4]]}}}],["report",{"_index":15,"t":{"77":{"position":[[4,7]]}}}],["retent",{"_index":62,"t":{"362":{"position":[[5,9]]}}}],["run",{"_index":37,"t":{"196":{"position":[[29,7]]}}}],["script",{"_index":69,"t":{"408":{"position":[[21,7]]}}}],["secur",{"_index":84,"t":{"564":{"position":[[0,8]]}}}],["servic",{"_index":39,"t":{"196":{"position":[[42,7]]}}}],["set",{"_index":3,"t":{"15":{"position":[[0,7]]}}}],["setup",{"_index":72,"t":{"422":{"position":[[19,5]]},"489":{"position":[[23,5]]}}}],["signer",{"_index":77,"t":{"497":{"position":[[9,6]]}}}],["simul",{"_index":28,"t":{"153":{"position":[[0,10]]}}}],["slash",{"_index":8,"t":{"20":{"position":[[0,8]]}}}],["specif",{"_index":29,"t":{"179":{"position":[[0,13]]}}}],["start",{"_index":68,"t":{"408":{"position":[[15,5]]},"422":{"position":[[6,5]]}}}],["submiss",{"_index":21,"t":{"85":{"position":[[3,10]]}}}],["support",{"_index":87,"t":{"570":{"position":[[0,10]]}}}],["sync",{"_index":60,"t":{"347":{"position":[[0,7]]}}}],["test",{"_index":23,"t":{"86":{"position":[[11,5]]},"88":{"position":[[12,5]]},"137":{"position":[[12,5]]},"139":{"position":[[0,7]]},"153":{"position":[[11,5]]},"179":{"position":[[14,5]]},"245":{"position":[[5,5]]}}}],["testnet",{"_index":5,"t":{"15":{"position":[[13,7]]}}}],["unit",{"_index":42,"t":{"245":{"position":[[0,4]]}}}],["up",{"_index":4,"t":{"15":{"position":[[8,2]]}}}],["us",{"_index":53,"t":{"314":{"position":[[0,5]]}}}],["valid",{"_index":81,"t":{"508":{"position":[[0,9]]},"547":{"position":[[22,10]]},"548":{"position":[[0,9]]}}}],["withdraw",{"_index":86,"t":{"569":{"position":[[0,11]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":2,"t":"Welcome to the Lodestar Documentation","u":"/lodestar/","h":"#welcome-to-the-lodestar-documentation","p":1},{"i":4,"t":"Getting Started","u":"/lodestar/","h":"#getting-started","p":1},{"i":6,"t":"Specifications","u":"/lodestar/","h":"#specifications","p":1},{"i":8,"t":"Execution Client","u":"/lodestar/","h":"#execution-client","p":1},{"i":10,"t":"About These Docs","u":"/lodestar/","h":"#about-these-docs","p":1},{"i":12,"t":"Need Assistance?","u":"/lodestar/","h":"#need-assistance","p":1},{"i":17,"t":"Post-Merge local testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","h":"#post-merge-local-testnet","p":15},{"i":23,"t":"Lodestar Dependency Graph","u":"/lodestar/contribution/depgraph","h":"#lodestar-dependency-graph","p":22},{"i":25,"t":"Lodestar Monorepo","u":"/lodestar/contribution/depgraph","h":"#lodestar-monorepo","p":22},{"i":27,"t":"@chainsafe/lodestar","u":"/lodestar/contribution/depgraph","h":"#chainsafelodestar","p":22},{"i":29,"t":"@lodestar/api","u":"/lodestar/contribution/depgraph","h":"#lodestarapi","p":22},{"i":31,"t":"@lodestar/beacon-node","u":"/lodestar/contribution/depgraph","h":"#lodestarbeacon-node","p":22},{"i":33,"t":"@lodestar/config","u":"/lodestar/contribution/depgraph","h":"#lodestarconfig","p":22},{"i":35,"t":"@lodestar/db","u":"/lodestar/contribution/depgraph","h":"#lodestardb","p":22},{"i":37,"t":"@lodestar/flare","u":"/lodestar/contribution/depgraph","h":"#lodestarflare","p":22},{"i":39,"t":"@lodestar/fork-choice","u":"/lodestar/contribution/depgraph","h":"#lodestarfork-choice","p":22},{"i":41,"t":"@lodestar/light-client","u":"/lodestar/contribution/depgraph","h":"#lodestarlight-client","p":22},{"i":43,"t":"@lodestar/logger","u":"/lodestar/contribution/depgraph","h":"#lodestarlogger","p":22},{"i":45,"t":"@lodestar/params","u":"/lodestar/contribution/depgraph","h":"#lodestarparams","p":22},{"i":47,"t":"@lodestar/prover","u":"/lodestar/contribution/depgraph","h":"#lodestarprover","p":22},{"i":49,"t":"@lodestar/reqresp","u":"/lodestar/contribution/depgraph","h":"#lodestarreqresp","p":22},{"i":51,"t":"@lodestar/spec-test-util","u":"/lodestar/contribution/depgraph","h":"#lodestarspec-test-util","p":22},{"i":53,"t":"@lodestar/state-transition","u":"/lodestar/contribution/depgraph","h":"#lodestarstate-transition","p":22},{"i":55,"t":"@lodestar/types","u":"/lodestar/contribution/depgraph","h":"#lodestartypes","p":22},{"i":57,"t":"@lodestar/utils","u":"/lodestar/contribution/depgraph","h":"#lodestarutils","p":22},{"i":59,"t":"@lodestar/validator","u":"/lodestar/contribution/depgraph","h":"#lodestarvalidator","p":22},{"i":61,"t":"External Dependencies","u":"/lodestar/contribution/depgraph","h":"#external-dependencies","p":22},{"i":63,"t":"@chainsafe/blst-ts","u":"/lodestar/contribution/depgraph","h":"#chainsafeblst-ts","p":22},{"i":65,"t":"@chainsafe/discv5","u":"/lodestar/contribution/depgraph","h":"#chainsafediscv5","p":22},{"i":67,"t":"@chainsafe/js-libp2p-gossipsub","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-gossipsub","p":22},{"i":69,"t":"@chainsafe/js-libp2p-noise","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-noise","p":22},{"i":71,"t":"@chainsafe/js-libp2p-yamux","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-yamux","p":22},{"i":73,"t":"@chainsafe/ssz","u":"/lodestar/contribution/depgraph","h":"#chainsafessz","p":22},{"i":75,"t":"@libp2p/js-libp2p","u":"/lodestar/contribution/depgraph","h":"#libp2pjs-libp2p","p":22},{"i":80,"t":"Examples","u":"/lodestar/contribution/dev-cli","h":"#examples","p":78},{"i":82,"t":"dev Options","u":"/lodestar/contribution/dev-cli","h":"#dev-options","p":78},{"i":92,"t":"Prerequisites","u":"/lodestar/contribution/getting-started","h":"#prerequisites","p":90},{"i":94,"t":"MacOS Specifics","u":"/lodestar/contribution/getting-started","h":"#macos-specifics","p":90},{"i":96,"t":"Getting Started","u":"/lodestar/contribution/getting-started","h":"#getting-started","p":90},{"i":98,"t":"Tests","u":"/lodestar/contribution/getting-started","h":"#tests","p":90},{"i":100,"t":"Devcontainer","u":"/lodestar/contribution/getting-started","h":"#devcontainer","p":90},{"i":102,"t":"Common Issues","u":"/lodestar/contribution/getting-started","h":"#common-issues","p":90},{"i":104,"t":"Debugging Spec Tests","u":"/lodestar/contribution/getting-started","h":"#debugging-spec-tests","p":90},{"i":106,"t":"Docker","u":"/lodestar/contribution/getting-started","h":"#docker","p":90},{"i":108,"t":"First Time Contributor?","u":"/lodestar/contribution/getting-started","h":"#first-time-contributor","p":90},{"i":110,"t":"Reporting A Bug?","u":"/lodestar/contribution/getting-started","h":"#reporting-a-bug","p":90},{"i":112,"t":"Contribution Process","u":"/lodestar/contribution/getting-started","h":"#contribution-process","p":90},{"i":114,"t":"Github Style Guide","u":"/lodestar/contribution/getting-started","h":"#github-style-guide","p":90},{"i":116,"t":"Lodestar Monorepo","u":"/lodestar/contribution/getting-started","h":"#lodestar-monorepo","p":90},{"i":118,"t":"Style Guide","u":"/lodestar/contribution/getting-started","h":"#style-guide","p":90},{"i":120,"t":"Tests style guide","u":"/lodestar/contribution/getting-started","h":"#tests-style-guide","p":90},{"i":122,"t":"Logging policy","u":"/lodestar/contribution/getting-started","h":"#logging-policy","p":90},{"i":123,"t":"Logging Levels","u":"/lodestar/contribution/getting-started","h":"#logging-levels","p":90},{"i":125,"t":"Logging guidelines","u":"/lodestar/contribution/getting-started","h":"#logging-guidelines","p":90},{"i":127,"t":"Contributing to Grafana dashboards","u":"/lodestar/contribution/getting-started","h":"#contributing-to-grafana-dashboards","p":90},{"i":129,"t":"Using Download Script","u":"/lodestar/contribution/getting-started","h":"#using-download-script","p":90},{"i":131,"t":"Contributing to Documentation","u":"/lodestar/contribution/getting-started","h":"#contributing-to-documentation","p":90},{"i":133,"t":"Label Guide","u":"/lodestar/contribution/getting-started","h":"#label-guide","p":90},{"i":135,"t":"Community","u":"/lodestar/contribution/getting-started","h":"#community","p":90},{"i":141,"t":"Unit Tests","u":"/lodestar/contribution/testing/","h":"#unit-tests","p":139},{"i":143,"t":"Spec Tests","u":"/lodestar/contribution/testing/","h":"#spec-tests","p":139},{"i":145,"t":"Performance Tests","u":"/lodestar/contribution/testing/","h":"#performance-tests","p":139},{"i":147,"t":"End-To-End Tests","u":"/lodestar/contribution/testing/","h":"#end-to-end-tests","p":139},{"i":149,"t":"Integration Tests","u":"/lodestar/contribution/testing/","h":"#integration-tests","p":139},{"i":151,"t":"Simulation Tests","u":"/lodestar/contribution/testing/","h":"#simulation-tests","p":139},{"i":155,"t":"Running Sim Tests","u":"/lodestar/contribution/testing/simulation-tests","h":"#running-sim-tests","p":153},{"i":157,"t":"Environment Variables","u":"/lodestar/contribution/testing/simulation-tests","h":"#environment-variables","p":153},{"i":159,"t":"test:sim:multifork","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmultifork","p":153},{"i":161,"t":"test:sim:endpoints","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimendpoints","p":153},{"i":163,"t":"test:sim:deneb","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimdeneb","p":153},{"i":165,"t":"test:sim:mixedcleint","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmixedcleint","p":153},{"i":167,"t":"Sim Test Infrastructure","u":"/lodestar/contribution/testing/simulation-tests","h":"#sim-test-infrastructure","p":153},{"i":169,"t":"Simulation Environment","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-environment","p":153},{"i":171,"t":"Simulation Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-assertions","p":153},{"i":173,"t":"Custom Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#custom-assertions","p":153},{"i":175,"t":"Simulation Reports","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-reports","p":153},{"i":177,"t":"Simulation Logging","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-logging","p":153},{"i":183,"t":"VS Code launch config","u":"/lodestar/contribution/tools/debugging","h":"#vs-code-launch-config","p":181},{"i":185,"t":"Attach to running process","u":"/lodestar/contribution/tools/debugging","h":"#attach-to-running-process","p":181},{"i":189,"t":"Installing llnode","u":"/lodestar/contribution/tools/core-dumps","h":"#installing-llnode","p":187},{"i":191,"t":"Collecting a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#collecting-a-core-dump","p":187},{"i":193,"t":"Analyzing a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#analyzing-a-core-dump","p":187},{"i":198,"t":"Modifying Linux and Lodestar","u":"/lodestar/contribution/tools/flamegraphs","h":"#modifying-linux-and-lodestar","p":196},{"i":200,"t":"Example start_lodestar.sh","u":"/lodestar/contribution/tools/flamegraphs","h":"#example-start_lodestarsh","p":196},{"i":202,"t":"Capturing Stack Traces","u":"/lodestar/contribution/tools/flamegraphs","h":"#capturing-stack-traces","p":196},{"i":204,"t":"Rendering a Flamegraph","u":"/lodestar/contribution/tools/flamegraphs","h":"#rendering-a-flamegraph","p":196},{"i":206,"t":"Installation","u":"/lodestar/contribution/tools/flamegraphs","h":"#installation","p":196},{"i":208,"t":"Usage","u":"/lodestar/contribution/tools/flamegraphs","h":"#usage","p":196},{"i":210,"t":"Filtering Results","u":"/lodestar/contribution/tools/flamegraphs","h":"#filtering-results","p":196},{"i":212,"t":"Unfiltered","u":"/lodestar/contribution/tools/flamegraphs","h":"#unfiltered","p":196},{"i":213,"t":"Filtered","u":"/lodestar/contribution/tools/flamegraphs","h":"#filtered","p":196},{"i":214,"t":"References","u":"/lodestar/contribution/tools/flamegraphs","h":"#references","p":196},{"i":215,"t":"List of Web References","u":"/lodestar/contribution/tools/flamegraphs","h":"#list-of-web-references","p":196},{"i":217,"t":"Visualization Tools","u":"/lodestar/contribution/tools/flamegraphs","h":"#visualization-tools","p":196},{"i":219,"t":"Collecting on Linux","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-linux","p":196},{"i":221,"t":"Collecting on MacOS","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-macos","p":196},{"i":225,"t":"JavaScript Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#javascript-heap-dump","p":223},{"i":227,"t":"Creating a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#creating-a-v8-heap-dump","p":223},{"i":229,"t":"Viewing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#viewing-a-v8-heap-dump","p":223},{"i":231,"t":"Analyzing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#analyzing-a-v8-heap-dump","p":223},{"i":233,"t":"Native Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#native-heap-dump","p":223},{"i":235,"t":"Build collection tools","u":"/lodestar/contribution/tools/heap-dumps","h":"#build-collection-tools","p":223},{"i":237,"t":"Collect a heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#collect-a-heap-dump","p":223},{"i":239,"t":"Collecting a heap dump on a running process","u":"/lodestar/contribution/tools/heap-dumps","h":"#collecting-a-heap-dump-on-a-running-process","p":223},{"i":241,"t":"Installing heaptrack-gui on Linux","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-linux","p":223},{"i":243,"t":"Installing heaptrack-gui on OSX","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-osx","p":223},{"i":249,"t":"Tooling","u":"/lodestar/faqs","h":"#tooling","p":247},{"i":251,"t":"Troubleshooting Lodestar","u":"/lodestar/faqs","h":"#troubleshooting-lodestar","p":247},{"i":252,"t":"Running a beacon node","u":"/lodestar/faqs","h":"#running-a-beacon-node","p":247},{"i":254,"t":"Using Kubernetes","u":"/lodestar/faqs","h":"#using-kubernetes","p":247},{"i":258,"t":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#prerequisites","p":256},{"i":260,"t":"Requirements for Running a Light-Client","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#requirements-for-running-a-light-client","p":256},{"i":262,"t":"Getting started","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#getting-started","p":256},{"i":264,"t":"Light-Client CLI Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-cli-example","p":256},{"i":266,"t":"Light-Client Programmatic Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-programmatic-example","p":256},{"i":268,"t":"Browser Integration","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#browser-integration","p":256},{"i":270,"t":"Contributors","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#contributors","p":256},{"i":272,"t":"License","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#license","p":256},{"i":276,"t":"Proof of Stake","u":"/lodestar/introduction","h":"#proof-of-stake","p":274},{"i":278,"t":"Consensus Clients","u":"/lodestar/introduction","h":"#consensus-clients","p":274},{"i":280,"t":"Why Client Diversity?","u":"/lodestar/introduction","h":"#why-client-diversity","p":274},{"i":282,"t":"Ethereum Reading List","u":"/lodestar/introduction","h":"#ethereum-reading-list","p":274},{"i":286,"t":"Examples","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#examples","p":284},{"i":288,"t":"lightclient Options","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#lightclient-options","p":284},{"i":294,"t":"Usage","u":"/lodestar/libraries/lightclient-prover/prover","h":"#usage","p":292},{"i":296,"t":"How to detect a web3 provider","u":"/lodestar/libraries/lightclient-prover/prover","h":"#how-to-detect-a-web3-provider","p":292},{"i":298,"t":"Supported Web3 Methods","u":"/lodestar/libraries/lightclient-prover/prover","h":"#supported-web3-methods","p":292},{"i":300,"t":"Non-supported features","u":"/lodestar/libraries/lightclient-prover/prover","h":"#non-supported-features","p":292},{"i":302,"t":"Warnings","u":"/lodestar/libraries/lightclient-prover/prover","h":"#warnings","p":292},{"i":304,"t":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/prover","h":"#prerequisites","p":292},{"i":306,"t":"What you need","u":"/lodestar/libraries/lightclient-prover/prover","h":"#what-you-need","p":292},{"i":308,"t":"Getting started","u":"/lodestar/libraries/lightclient-prover/prover","h":"#getting-started","p":292},{"i":310,"t":"Contributors","u":"/lodestar/libraries/lightclient-prover/prover","h":"#contributors","p":292},{"i":312,"t":"License","u":"/lodestar/libraries/lightclient-prover/prover","h":"#license","p":292},{"i":317,"t":"Examples","u":"/lodestar/run/beacon-management/beacon-cli","h":"#examples","p":315},{"i":319,"t":"beacon Options","u":"/lodestar/run/beacon-management/beacon-cli","h":"#beacon-options","p":315},{"i":323,"t":"Lodestar and Builder API","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#lodestar-and-builder-api","p":321},{"i":325,"t":"Configure Lodestar setup for MEV","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#configure-lodestar-setup-for-mev","p":321},{"i":329,"t":"Networking Flags","u":"/lodestar/run/beacon-management/networking","h":"#networking-flags","p":327},{"i":331,"t":"Peer Discovery (Discv5)","u":"/lodestar/run/beacon-management/networking","h":"#peer-discovery-discv5","p":327},{"i":333,"t":"ENR","u":"/lodestar/run/beacon-management/networking","h":"#enr","p":327},{"i":335,"t":"Peer Communication (gossipsub and Req/Resp)","u":"/lodestar/run/beacon-management/networking","h":"#peer-communication-gossipsub-and-reqresp","p":327},{"i":337,"t":"Gossipsub","u":"/lodestar/run/beacon-management/networking","h":"#gossipsub","p":327},{"i":339,"t":"Req/Resp","u":"/lodestar/run/beacon-management/networking","h":"#reqresp","p":327},{"i":341,"t":"Data Transport (libp2p)","u":"/lodestar/run/beacon-management/networking","h":"#data-transport-libp2p","p":327},{"i":343,"t":"Firewall Management","u":"/lodestar/run/beacon-management/networking","h":"#firewall-management","p":327},{"i":345,"t":"NAT Traversal","u":"/lodestar/run/beacon-management/networking","h":"#nat-traversal","p":327},{"i":349,"t":"Weak Subjectivity","u":"/lodestar/run/beacon-management/syncing","h":"#weak-subjectivity","p":347},{"i":351,"t":"Syncing Methods","u":"/lodestar/run/beacon-management/syncing","h":"#syncing-methods","p":347},{"i":352,"t":"Checkpoint Sync","u":"/lodestar/run/beacon-management/syncing","h":"#checkpoint-sync","p":347},{"i":354,"t":"Historical Sync","u":"/lodestar/run/beacon-management/syncing","h":"#historical-sync","p":347},{"i":356,"t":"Range Sync","u":"/lodestar/run/beacon-management/syncing","h":"#range-sync","p":347},{"i":358,"t":"Backfill Sync","u":"/lodestar/run/beacon-management/syncing","h":"#backfill-sync","p":347},{"i":360,"t":"Syncing Lodestar","u":"/lodestar/run/beacon-management/syncing","h":"#syncing-lodestar","p":347},{"i":364,"t":"Data Management","u":"/lodestar/run/beacon-management/data-retention","h":"#data-management","p":362},{"i":368,"t":"Connect to Mainnet or a Public Testnet","u":"/lodestar/run/beacon-management/starting-a-node","h":"#connect-to-mainnet-or-a-public-testnet","p":366},{"i":370,"t":"Configure the Lodestar JWT Authentication Token","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-the-lodestar-jwt-authentication-token","p":366},{"i":372,"t":"Generate a Secret Key","u":"/lodestar/run/beacon-management/starting-a-node","h":"#generate-a-secret-key","p":366},{"i":374,"t":"Configure Lodestar to Locate the JWT Secret","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-lodestar-to-locate-the-jwt-secret","p":366},{"i":376,"t":"Configure the Execution Client with the JWT Secret","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-the-execution-client-with-the-jwt-secret","p":366},{"i":378,"t":"Run the Beacon Node","u":"/lodestar/run/beacon-management/starting-a-node","h":"#run-the-beacon-node","p":366},{"i":380,"t":"Checkpoint Sync","u":"/lodestar/run/beacon-management/starting-a-node","h":"#checkpoint-sync","p":366},{"i":382,"t":"Sync Log Guide","u":"/lodestar/run/beacon-management/starting-a-node","h":"#sync-log-guide","p":366},{"i":386,"t":"bootnode Options","u":"/lodestar/run/bootnode/bootnode-cli","h":"#bootnode-options","p":384},{"i":389,"t":"Binaries","u":"/lodestar/run/getting-started/installation","h":"#binaries","p":388},{"i":391,"t":"Docker Installation","u":"/lodestar/run/getting-started/installation","h":"#docker-installation","p":388},{"i":393,"t":"Build from Source","u":"/lodestar/run/getting-started/installation","h":"#build-from-source","p":388},{"i":394,"t":"Prerequisites","u":"/lodestar/run/getting-started/installation","h":"#prerequisites","p":388},{"i":396,"t":"Clone repository","u":"/lodestar/run/getting-started/installation","h":"#clone-repository","p":388},{"i":398,"t":"Install packages","u":"/lodestar/run/getting-started/installation","h":"#install-packages","p":388},{"i":400,"t":"Build source code","u":"/lodestar/run/getting-started/installation","h":"#build-source-code","p":388},{"i":402,"t":"Lodestar CLI","u":"/lodestar/run/getting-started/installation","h":"#lodestar-cli","p":388},{"i":404,"t":"Known Issues","u":"/lodestar/run/getting-started/installation","h":"#known-issues","p":388},{"i":406,"t":"Install from NPM [not recommended]","u":"/lodestar/run/getting-started/installation","h":"#install-from-npm-not-recommended","p":388},{"i":410,"t":"Support","u":"/lodestar/run/getting-started/quick-start","h":"#support","p":408},{"i":412,"t":"Customizations (Optional)","u":"/lodestar/run/getting-started/quick-start","h":"#customizations-optional","p":408},{"i":416,"t":"Configuration","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#configuration","p":414},{"i":418,"t":"Remote endpoint URL","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#remote-endpoint-url","p":414},{"i":420,"t":"Monitoring interval","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#monitoring-interval","p":414},{"i":424,"t":"Support","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#support","p":422},{"i":426,"t":"Prerequisites","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#prerequisites","p":422},{"i":428,"t":"Testnet to Mainnet","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#testnet-to-mainnet","p":422},{"i":430,"t":"Hardware Requirements","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#hardware-requirements","p":422},{"i":432,"t":"Setup Machine & Repository","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#setup-machine--repository","p":422},{"i":433,"t":"Install Docker Engine & Docker Compose","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#install-docker-engine--docker-compose","p":422},{"i":435,"t":"Configure Lodestar Quick Scripts","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-lodestar-quick-scripts","p":422},{"i":436,"t":"Navigate to the root directory","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#navigate-to-the-root-directory","p":422},{"i":438,"t":"Create your own JWT Secret","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#create-your-own-jwt-secret","p":422},{"i":440,"t":"Input your JWT Secret into the import-args.sh script","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#input-your-jwt-secret-into-the-import-argssh-script","p":422},{"i":442,"t":"Configure feeRecipient","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-feerecipient","p":422},{"i":444,"t":"Set minimum bid for MEV-Boost validators","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#set-minimum-bid-for-mev-boost-validators","p":422},{"i":446,"t":"Configuring your Network","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configuring-your-network","p":422},{"i":448,"t":"Select your Network","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#select-your-network","p":422},{"i":450,"t":"Configure MEV-boost relays","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-mev-boost-relays","p":422},{"i":452,"t":"Configure Lodestar version","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-lodestar-version","p":422},{"i":454,"t":"Modify your weak subjectivity (checkpoint sync) provider","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#modify-your-weak-subjectivity-checkpoint-sync-provider","p":422},{"i":456,"t":"Modify other client parameters (For advanced users)","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#modify-other-client-parameters-for-advanced-users","p":422},{"i":458,"t":"Setup Validators","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#setup-validators","p":422},{"i":460,"t":"Create validator keystore password","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#create-validator-keystore-password","p":422},{"i":462,"t":"Option 1: Setup validators with keystores","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#option-1-setup-validators-with-keystores","p":422},{"i":464,"t":"Option 2: Setup multiple validator sets with keystores encrypted under different passwords","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#option-2-setup-multiple-validator-sets-with-keystores-encrypted-under-different-passwords","p":422},{"i":466,"t":"Option 3: Setup validators with mnemonic","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#option-3-setup-validators-with-mnemonic","p":422},{"i":468,"t":"Startup Quickstart Script","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#startup-quickstart-script","p":422},{"i":470,"t":"Quickstart Script Help","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#quickstart-script-help","p":422},{"i":472,"t":"Check Containers","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-containers","p":422},{"i":474,"t":"Check Container Logs","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-container-logs","p":422},{"i":476,"t":"Check beacon node is progressing","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-beacon-node-is-progressing","p":422},{"i":478,"t":"Check validators are detected and decrypted","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-validators-are-detected-and-decrypted","p":422},{"i":480,"t":"Stop Containers","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#stop-containers","p":422},{"i":482,"t":"Appendix","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"","p":422},{"i":483,"t":"Appendix A - Expanding the Logical Volume","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#appendix-a---expanding-the-logical-volume","p":422},{"i":485,"t":"Appendix B - Update client images","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#appendix-b---update-client-images","p":422},{"i":487,"t":"Full Disclaimer","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#full-disclaimer","p":422},{"i":491,"t":"Localized Docker Metrics Script","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#localized-docker-metrics-script","p":489},{"i":493,"t":"Prometheus Setup","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#prometheus-setup","p":489},{"i":495,"t":"Grafana Setup","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#grafana-setup","p":489},{"i":499,"t":"Configuration","u":"/lodestar/run/validator-management/external-signer","h":"#configuration","p":497},{"i":504,"t":"Example proposer_config.yaml","u":"/lodestar/run/validator-management/proposer-config","h":"#example-proposer_configyaml","p":502},{"i":506,"t":"Enable Proposer Configuration","u":"/lodestar/run/validator-management/proposer-config","h":"#enable-proposer-configuration","p":502},{"i":510,"t":"Available Sub-Commands","u":"/lodestar/run/validator-management/validator-cli","h":"#available-sub-commands","p":508},{"i":512,"t":"Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#examples","p":508},{"i":513,"t":"Base validator command","u":"/lodestar/run/validator-management/validator-cli","h":"#base-validator-command","p":508},{"i":515,"t":"validator Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-options","p":508},{"i":517,"t":"validator slashing-protection import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import","p":508},{"i":519,"t":"validator slashing-protection import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import-options","p":508},{"i":521,"t":"validator slashing-protection export","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export","p":508},{"i":523,"t":"validator slashing-protection export Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export-options","p":508},{"i":525,"t":"validator import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import","p":508},{"i":527,"t":"validator import Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-examples","p":508},{"i":529,"t":"validator import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-options","p":508},{"i":531,"t":"validator list","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list","p":508},{"i":533,"t":"validator list Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list-examples","p":508},{"i":535,"t":"validator voluntary-exit","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit","p":508},{"i":537,"t":"validator voluntary-exit Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-examples","p":508},{"i":539,"t":"validator voluntary-exit Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-options","p":508},{"i":541,"t":"validator bls-to-execution-change","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change","p":508},{"i":543,"t":"validator bls-to-execution-change Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-examples","p":508},{"i":545,"t":"validator bls-to-execution-change Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-options","p":508},{"i":550,"t":"Setup your validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#setup-your-validator","p":548},{"i":552,"t":"Create a keystore","u":"/lodestar/run/validator-management/vc-configuration","h":"#create-a-keystore","p":548},{"i":554,"t":"Import a validator keystore to Lodestar","u":"/lodestar/run/validator-management/vc-configuration","h":"#import-a-validator-keystore-to-lodestar","p":548},{"i":556,"t":"Configuring the fee recipient address","u":"/lodestar/run/validator-management/vc-configuration","h":"#configuring-the-fee-recipient-address","p":548},{"i":558,"t":"Configure your builder selection and/or builder boost factor","u":"/lodestar/run/validator-management/vc-configuration","h":"#configure-your-builder-selection-andor-builder-boost-factor","p":548},{"i":560,"t":"Submit a validator deposit","u":"/lodestar/run/validator-management/vc-configuration","h":"#submit-a-validator-deposit","p":548},{"i":562,"t":"Run the validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#run-the-validator","p":548},{"i":565,"t":"Supported Versions","u":"/lodestar/security","h":"#supported-versions","p":564},{"i":567,"t":"Reporting a Vulnerability","u":"/lodestar/security","h":"#reporting-a-vulnerability","p":564},{"i":571,"t":"Networking","u":"/lodestar/supporting-libraries/","h":"#networking","p":570},{"i":572,"t":"LibP2P","u":"/lodestar/supporting-libraries/","h":"#libp2p","p":570},{"i":574,"t":"Discv5","u":"/lodestar/supporting-libraries/","h":"#discv5","p":570},{"i":576,"t":"Serialization and Hashing","u":"/lodestar/supporting-libraries/","h":"#serialization-and-hashing","p":570},{"i":578,"t":"BLS","u":"/lodestar/supporting-libraries/","h":"#bls","p":570},{"i":582,"t":"Monorepo libraries","u":"/lodestar/supporting-libraries/libraries","h":"#monorepo-libraries","p":580},{"i":584,"t":"Other libraries","u":"/lodestar/supporting-libraries/libraries","h":"#other-libraries","p":580},{"i":585,"t":"BLS Utilities","u":"/lodestar/supporting-libraries/libraries","h":"#bls-utilities","p":580},{"i":587,"t":"Hashing","u":"/lodestar/supporting-libraries/libraries","h":"#hashing","p":580},{"i":589,"t":"Networking","u":"/lodestar/supporting-libraries/libraries","h":"#networking","p":580}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,4.705,1,2.571,2,4.238]],["t/4",[3,4.371,4,4.371]],["t/6",[5,6.112]],["t/8",[6,4.155,7,3.456]],["t/10",[8,6.786]],["t/12",[9,5.006,10,5.557]],["t/17",[11,4.08,12,4.08,13,3.675,14,3.408]],["t/23",[1,2.571,15,4.238,16,4.705]],["t/25",[1,3.036,17,4.642]],["t/27",[18,6.786]],["t/29",[19,6.786]],["t/31",[20,5.557,21,4.371]],["t/33",[22,6.786]],["t/35",[23,6.786]],["t/37",[24,6.786]],["t/39",[25,5.557,26,5.557]],["t/41",[7,3.456,27,5.557]],["t/43",[28,6.786]],["t/45",[29,6.786]],["t/47",[30,6.786]],["t/49",[31,6.786]],["t/51",[32,4.705,33,2.767,34,4.238]],["t/53",[35,5.557,36,5.557]],["t/55",[37,6.786]],["t/57",[38,6.786]],["t/59",[39,6.786]],["t/61",[15,5.006,40,5.557]],["t/63",[41,5.557,42,5.557]],["t/65",[43,6.786]],["t/67",[44,3.931,45,3.365,46,3.931]],["t/69",[44,3.931,45,3.365,47,4.705]],["t/71",[44,3.931,45,3.365,48,4.705]],["t/73",[49,6.786]],["t/75",[45,3.974,50,5.557]],["t/80",[51,3.991]],["t/82",[52,5.557,53,3.108]],["t/92",[54,5.073]],["t/94",[5,5.006,55,5.006]],["t/96",[3,4.371,4,4.371]],["t/98",[33,3.991]],["t/100",[56,6.786]],["t/102",[57,5.557,58,5.006]],["t/104",[33,2.767,59,4.705,60,4.238]],["t/106",[61,5.337]],["t/108",[62,4.705,63,4.705,64,3.931]],["t/110",[65,4.642,66,5.557]],["t/112",[67,4.642,68,4.642]],["t/114",[69,4.705,70,3.931,71,3.518]],["t/116",[1,3.036,17,4.642]],["t/118",[70,4.642,71,4.155]],["t/120",[33,2.767,70,3.931,71,3.518]],["t/122",[72,3.974,73,5.557]],["t/123",[72,3.974,74,5.557]],["t/125",[72,3.974,75,5.557]],["t/127",[67,3.931,76,4.238,77,4.705]],["t/129",[78,4.238,79,4.705,80,3.365]],["t/131",[2,5.006,67,4.642]],["t/133",[71,4.155,81,5.557]],["t/135",[82,6.112]],["t/141",[33,3.268,83,5.557]],["t/143",[33,3.268,60,5.006]],["t/145",[33,3.268,84,5.557]],["t/147",[33,2.767,85,6.648]],["t/149",[33,3.268,86,5.006]],["t/151",[33,3.268,87,4.155]],["t/155",[33,2.767,88,3.234,89,4.238]],["t/157",[90,5.006,91,5.557]],["t/159",[92,6.786]],["t/161",[93,6.786]],["t/163",[94,6.786]],["t/165",[95,6.786]],["t/167",[33,2.767,89,4.238,96,4.705]],["t/169",[87,4.155,90,5.006]],["t/171",[87,4.155,97,5.006]],["t/173",[97,5.006,98,5.006]],["t/175",[65,4.642,87,4.155]],["t/177",[72,3.974,87,4.155]],["t/183",[99,4.08,100,3.675,101,4.08,102,4.08]],["t/185",[68,3.931,88,3.234,103,4.705]],["t/189",[104,3.685,105,5.557]],["t/191",[106,3.365,107,4.238,108,3.018]],["t/193",[107,4.238,108,3.018,109,4.238]],["t/198",[1,2.571,110,3.931,111,3.931]],["t/200",[51,3.268,112,5.557]],["t/202",[113,4.705,114,4.705,115,4.705]],["t/204",[116,5.557,117,5.557]],["t/206",[104,4.499]],["t/208",[118,6.112]],["t/210",[119,5.006,120,5.557]],["t/212",[121,6.786]],["t/213",[119,6.112]],["t/214",[122,6.112]],["t/215",[122,4.238,123,3.701,124,4.705]],["t/217",[125,5.557,126,4.642]],["t/219",[106,3.974,111,4.642]],["t/221",[55,5.006,106,3.974]],["t/225",[108,3.018,127,4.705,128,3.234]],["t/227",[108,2.617,128,2.804,129,3.209,130,3.408]],["t/229",[108,2.617,128,2.804,130,3.408,131,4.08]],["t/231",[108,2.617,109,3.675,128,2.804,130,3.408]],["t/233",[108,3.018,128,3.234,132,4.705]],["t/235",[106,3.365,126,3.931,133,3.931]],["t/237",[106,3.365,108,3.018,128,3.234]],["t/239",[68,3.009,88,2.475,106,2.575,108,2.31,128,2.475]],["t/241",[104,2.705,111,3.408,134,3.675,135,3.675]],["t/243",[104,2.705,134,3.675,135,3.675,136,4.08]],["t/249",[126,5.669]],["t/251",[1,3.036,137,5.557]],["t/252",[21,3.701,88,3.234,138,3.701]],["t/254",[78,5.006,139,5.557]],["t/258",[54,5.073]],["t/260",[7,2.538,88,2.804,140,3.675,141,3.408]],["t/262",[3,4.371,4,4.371]],["t/264",[7,2.538,51,2.399,141,3.408,142,3.675]],["t/266",[7,2.538,51,2.399,141,3.408,143,4.08]],["t/268",[86,5.006,144,5.557]],["t/270",[64,5.669]],["t/272",[145,6.112]],["t/276",[146,5.557,147,5.557]],["t/278",[7,3.456,148,5.557]],["t/280",[7,3.456,149,5.557]],["t/282",[123,3.701,150,4.705,151,4.705]],["t/286",[51,3.991]],["t/288",[53,3.108,152,5.557]],["t/294",[118,6.112]],["t/296",[153,4.238,154,4.238,155,4.238]],["t/298",[154,4.238,156,3.518,157,4.238]],["t/300",[156,3.518,158,4.705,159,4.705]],["t/302",[160,6.786]],["t/304",[54,5.073]],["t/306",[9,6.112]],["t/308",[3,4.371,4,4.371]],["t/310",[64,5.669]],["t/312",[145,6.112]],["t/317",[51,3.991]],["t/319",[53,3.108,138,4.371]],["t/323",[1,2.571,161,4.238,162,4.705]],["t/325",[1,2.229,163,2.282,164,2.617,165,3.408]],["t/329",[166,4.155,167,5.557]],["t/331",[168,4.238,169,4.705,170,4.238]],["t/333",[171,6.786]],["t/335",[46,3.408,82,3.675,168,3.675,172,3.675]],["t/337",[46,5.669]],["t/339",[172,6.112]],["t/341",[45,3.365,173,4.238,174,4.705]],["t/343",[175,5.557,176,5.006]],["t/345",[177,5.557,178,5.557]],["t/349",[179,5.006,180,5.006]],["t/351",[157,5.006,181,3.564]],["t/352",[181,3.564,182,4.642]],["t/354",[181,3.564,183,5.557]],["t/356",[181,3.564,184,5.557]],["t/358",[181,3.564,185,5.557]],["t/360",[1,3.036,181,3.564]],["t/364",[173,5.006,176,5.006]],["t/368",[14,3.408,186,4.08,187,3.675,188,4.08]],["t/370",[1,1.967,163,2.014,189,2.692,190,3.601,191,3.601]],["t/372",[192,4.705,193,3.518,194,4.705]],["t/374",[1,1.967,163,2.014,189,2.692,193,2.692,195,3.601]],["t/376",[6,2.692,7,2.24,163,2.014,189,2.692,193,2.692]],["t/378",[21,3.701,88,3.234,138,3.701]],["t/380",[181,3.564,182,4.642]],["t/382",[71,3.518,72,3.365,181,3.018]],["t/386",[53,3.108,196,5.557]],["t/389",[197,6.786]],["t/391",[61,4.371,104,3.685]],["t/393",[133,4.642,198,5.006]],["t/394",[54,5.073]],["t/396",[199,5.557,200,5.006]],["t/398",[104,3.685,201,5.557]],["t/400",[100,4.238,133,3.931,198,4.238]],["t/402",[1,3.036,142,5.006]],["t/404",[58,5.006,202,5.557]],["t/406",[104,3.12,203,4.705,204,4.705]],["t/410",[156,5.073]],["t/412",[53,3.108,98,5.006]],["t/416",[163,3.795]],["t/418",[205,4.705,206,4.705,207,4.705]],["t/420",[208,5.557,209,5.557]],["t/424",[156,5.073]],["t/426",[54,5.073]],["t/428",[14,4.642,187,5.006]],["t/430",[140,5.006,210,5.557]],["t/432",[164,2.617,200,3.675,211,4.08,212,3.675]],["t/433",[61,3.947,104,2.137,212,2.903,213,3.223,214,3.223]],["t/435",[1,2.229,80,2.918,163,2.282,215,4.08]],["t/436",[216,4.705,217,4.705,218,4.705]],["t/438",[129,3.701,189,3.518,193,3.518]],["t/440",[80,2.305,189,2.41,193,2.41,219,3.223,220,2.215,221,3.223]],["t/442",[163,3.108,222,5.557]],["t/444",[165,2.693,223,2.903,224,3.223,225,3.223,226,2.693,227,1.379]],["t/446",[163,3.108,166,4.155]],["t/448",[166,4.155,228,5.006]],["t/450",[163,2.282,165,3.408,226,3.408,229,4.08]],["t/452",[1,2.571,163,2.632,230,4.238]],["t/454",[110,2.693,155,2.903,179,2.903,180,2.903,181,2.067,182,2.693]],["t/456",[7,2.24,110,3.009,231,3.601,232,3.601,233,3.601]],["t/458",[164,3.564,227,2.378]],["t/460",[129,3.209,227,1.746,234,3.05,235,3.675]],["t/462",[53,2.014,164,2.31,227,1.541,234,2.692,236,3.601]],["t/464",[53,1.182,164,1.356,223,1.904,227,0.905,234,1.58,235,1.904,237,2.114,238,2.114,239,2.114,240,2.114,241,2.114]],["t/466",[53,2.014,164,2.31,227,1.541,242,3.601,243,3.601]],["t/468",[80,3.365,244,4.705,245,4.238]],["t/470",[80,3.365,245,4.238,246,4.705]],["t/472",[247,4.371,248,4.642]],["t/474",[72,3.365,247,3.701,248,3.931]],["t/476",[21,3.209,138,3.209,247,3.209,249,4.08]],["t/478",[153,3.675,227,1.746,247,3.209,250,4.08]],["t/480",[248,4.642,251,5.557]],["t/482",[252,5.669]],["t/483",[252,3.408,253,4.08,254,4.08,255,4.08]],["t/485",[7,2.24,252,3.009,256,3.601,257,3.601,258,3.601]],["t/487",[259,5.557,260,5.557]],["t/491",[13,3.675,61,3.209,80,2.918,261,4.08]],["t/493",[164,3.564,262,5.557]],["t/495",[76,5.006,164,3.564]],["t/499",[163,3.795]],["t/504",[51,3.268,263,5.557]],["t/506",[163,2.632,264,4.705,265,4.705]],["t/510",[266,4.705,267,4.705,268,4.238]],["t/512",[51,3.991]],["t/513",[227,2.014,268,4.238,269,4.705]],["t/515",[53,3.108,227,2.378]],["t/517",[220,2.804,227,1.746,270,3.209,271,3.209]],["t/519",[53,2.014,220,2.475,227,1.541,270,2.833,271,2.833]],["t/521",[227,1.746,270,3.209,271,3.209,272,3.675]],["t/523",[53,2.014,227,1.541,270,2.833,271,2.833,272,3.244]],["t/525",[220,3.82,227,2.378]],["t/527",[51,2.767,220,3.234,227,2.014]],["t/529",[53,2.632,220,3.234,227,2.014]],["t/531",[123,4.371,227,2.378]],["t/533",[51,2.767,123,3.701,227,2.014]],["t/535",[227,2.014,273,3.931,274,3.931]],["t/537",[51,2.399,227,1.746,273,3.408,274,3.408]],["t/539",[53,2.282,227,1.746,273,3.408,274,3.408]],["t/541",[6,3.05,227,1.746,275,3.05,276,3.408]],["t/543",[6,2.692,51,2.118,227,1.541,275,2.692,276,3.009]],["t/545",[6,2.692,53,2.014,227,1.541,275,2.692,276,3.009]],["t/550",[164,3.564,227,2.378]],["t/552",[129,4.371,234,4.155]],["t/554",[1,2.229,220,2.804,227,1.746,234,3.05]],["t/556",[163,2.282,277,4.08,278,4.08,279,4.08]],["t/558",[161,4.179,163,1.631,226,2.437,228,2.627,280,2.917,281,2.917]],["t/560",[227,2.014,282,4.705,283,4.705]],["t/562",[88,3.82,227,2.378]],["t/565",[156,4.155,230,5.006]],["t/567",[65,4.642,284,5.557]],["t/571",[166,5.073]],["t/572",[45,4.853]],["t/574",[170,6.112]],["t/576",[285,5.557,286,5.006]],["t/578",[275,5.073]],["t/582",[17,4.642,287,5.006]],["t/584",[287,6.112]],["t/585",[34,5.006,275,4.155]],["t/587",[286,6.112]],["t/589",[166,5.073]]],"invertedIndex":[["",{"_index":212,"t":{"432":{"position":[[14,1]]},"433":{"position":[[22,1]]}}}],["1",{"_index":236,"t":{"462":{"position":[[7,2]]}}}],["2",{"_index":237,"t":{"464":{"position":[[7,2]]}}}],["3",{"_index":242,"t":{"466":{"position":[[7,2]]}}}],["address",{"_index":279,"t":{"556":{"position":[[30,7]]}}}],["advanc",{"_index":232,"t":{"456":{"position":[[36,8]]}}}],["analyz",{"_index":109,"t":{"193":{"position":[[0,9]]},"231":{"position":[[0,9]]}}}],["and/or",{"_index":280,"t":{"558":{"position":[[33,6]]}}}],["api",{"_index":162,"t":{"323":{"position":[[21,3]]}}}],["appendix",{"_index":252,"t":{"482":{"position":[[0,8]]},"483":{"position":[[0,8]]},"485":{"position":[[0,8]]}}}],["args.sh",{"_index":221,"t":{"440":{"position":[[38,7]]}}}],["assert",{"_index":97,"t":{"171":{"position":[[11,10]]},"173":{"position":[[7,10]]}}}],["assist",{"_index":10,"t":{"12":{"position":[[5,11]]}}}],["attach",{"_index":103,"t":{"185":{"position":[[0,6]]}}}],["authent",{"_index":190,"t":{"370":{"position":[[27,14]]}}}],["avail",{"_index":266,"t":{"510":{"position":[[0,9]]}}}],["b",{"_index":256,"t":{"485":{"position":[[9,1]]}}}],["backfil",{"_index":185,"t":{"358":{"position":[[0,8]]}}}],["base",{"_index":269,"t":{"513":{"position":[[0,4]]}}}],["beacon",{"_index":138,"t":{"252":{"position":[[10,6]]},"319":{"position":[[0,6]]},"378":{"position":[[8,6]]},"476":{"position":[[6,6]]}}}],["bid",{"_index":225,"t":{"444":{"position":[[12,3]]}}}],["binari",{"_index":197,"t":{"389":{"position":[[0,8]]}}}],["bl",{"_index":275,"t":{"541":{"position":[[10,3]]},"543":{"position":[[10,3]]},"545":{"position":[[10,3]]},"578":{"position":[[0,3]]},"585":{"position":[[0,3]]}}}],["boost",{"_index":226,"t":{"444":{"position":[[24,5]]},"450":{"position":[[14,5]]},"558":{"position":[[48,5]]}}}],["bootnod",{"_index":196,"t":{"386":{"position":[[0,8]]}}}],["browser",{"_index":144,"t":{"268":{"position":[[0,7]]}}}],["bug",{"_index":66,"t":{"110":{"position":[[12,4]]}}}],["build",{"_index":133,"t":{"235":{"position":[[0,5]]},"393":{"position":[[0,5]]},"400":{"position":[[0,5]]}}}],["builder",{"_index":161,"t":{"323":{"position":[[13,7]]},"558":{"position":[[15,7],[40,7]]}}}],["captur",{"_index":113,"t":{"202":{"position":[[0,9]]}}}],["chainsafe/blst",{"_index":41,"t":{"63":{"position":[[0,15]]}}}],["chainsafe/discv5",{"_index":43,"t":{"65":{"position":[[0,17]]}}}],["chainsafe/j",{"_index":44,"t":{"67":{"position":[[0,13]]},"69":{"position":[[0,13]]},"71":{"position":[[0,13]]}}}],["chainsafe/lodestar",{"_index":18,"t":{"27":{"position":[[0,19]]}}}],["chainsafe/ssz",{"_index":49,"t":{"73":{"position":[[0,14]]}}}],["chang",{"_index":276,"t":{"541":{"position":[[27,6]]},"543":{"position":[[27,6]]},"545":{"position":[[27,6]]}}}],["check",{"_index":247,"t":{"472":{"position":[[0,5]]},"474":{"position":[[0,5]]},"476":{"position":[[0,5]]},"478":{"position":[[0,5]]}}}],["checkpoint",{"_index":182,"t":{"352":{"position":[[0,10]]},"380":{"position":[[0,10]]},"454":{"position":[[30,11]]}}}],["choic",{"_index":26,"t":{"39":{"position":[[15,6]]}}}],["cli",{"_index":142,"t":{"264":{"position":[[13,3]]},"402":{"position":[[9,3]]}}}],["client",{"_index":7,"t":{"8":{"position":[[10,6]]},"41":{"position":[[16,6]]},"260":{"position":[[33,6]]},"264":{"position":[[6,6]]},"266":{"position":[[6,6]]},"278":{"position":[[10,7]]},"280":{"position":[[4,6]]},"376":{"position":[[24,6]]},"456":{"position":[[13,6]]},"485":{"position":[[20,6]]}}}],["clone",{"_index":199,"t":{"396":{"position":[[0,5]]}}}],["code",{"_index":100,"t":{"183":{"position":[[3,4]]},"400":{"position":[[13,4]]}}}],["collect",{"_index":106,"t":{"191":{"position":[[0,10]]},"219":{"position":[[0,10]]},"221":{"position":[[0,10]]},"235":{"position":[[6,10]]},"237":{"position":[[0,7]]},"239":{"position":[[0,10]]}}}],["command",{"_index":268,"t":{"510":{"position":[[14,8]]},"513":{"position":[[15,7]]}}}],["common",{"_index":57,"t":{"102":{"position":[[0,6]]}}}],["commun",{"_index":82,"t":{"135":{"position":[[0,9]]},"335":{"position":[[5,13]]}}}],["compos",{"_index":214,"t":{"433":{"position":[[31,7]]}}}],["config",{"_index":102,"t":{"183":{"position":[[15,6]]}}}],["configur",{"_index":163,"t":{"325":{"position":[[0,9]]},"370":{"position":[[0,9]]},"374":{"position":[[0,9]]},"376":{"position":[[0,9]]},"416":{"position":[[0,13]]},"435":{"position":[[0,9]]},"442":{"position":[[0,9]]},"446":{"position":[[0,11]]},"450":{"position":[[0,9]]},"452":{"position":[[0,9]]},"499":{"position":[[0,13]]},"506":{"position":[[16,13]]},"556":{"position":[[0,11]]},"558":{"position":[[0,9]]}}}],["connect",{"_index":186,"t":{"368":{"position":[[0,7]]}}}],["consensu",{"_index":148,"t":{"278":{"position":[[0,9]]}}}],["contain",{"_index":248,"t":{"472":{"position":[[6,10]]},"474":{"position":[[6,9]]},"480":{"position":[[5,10]]}}}],["contribut",{"_index":67,"t":{"112":{"position":[[0,12]]},"127":{"position":[[0,12]]},"131":{"position":[[0,12]]}}}],["contributor",{"_index":64,"t":{"108":{"position":[[11,12]]},"270":{"position":[[0,12]]},"310":{"position":[[0,12]]}}}],["core",{"_index":107,"t":{"191":{"position":[[13,4]]},"193":{"position":[[12,4]]}}}],["creat",{"_index":129,"t":{"227":{"position":[[0,8]]},"438":{"position":[[0,6]]},"460":{"position":[[0,6]]},"552":{"position":[[0,6]]}}}],["custom",{"_index":98,"t":{"173":{"position":[[0,6]]},"412":{"position":[[0,14]]}}}],["dashboard",{"_index":77,"t":{"127":{"position":[[24,10]]}}}],["data",{"_index":173,"t":{"341":{"position":[[0,4]]},"364":{"position":[[0,4]]}}}],["debug",{"_index":59,"t":{"104":{"position":[[0,9]]}}}],["decrypt",{"_index":250,"t":{"478":{"position":[[34,9]]}}}],["depend",{"_index":15,"t":{"23":{"position":[[9,10]]},"61":{"position":[[9,12]]}}}],["deposit",{"_index":283,"t":{"560":{"position":[[19,7]]}}}],["detect",{"_index":153,"t":{"296":{"position":[[7,6]]},"478":{"position":[[21,8]]}}}],["dev",{"_index":52,"t":{"82":{"position":[[0,3]]}}}],["devcontain",{"_index":56,"t":{"100":{"position":[[0,12]]}}}],["differ",{"_index":241,"t":{"464":{"position":[[71,9]]}}}],["directori",{"_index":218,"t":{"436":{"position":[[21,9]]}}}],["disclaim",{"_index":260,"t":{"487":{"position":[[5,10]]}}}],["discoveri",{"_index":169,"t":{"331":{"position":[[5,9]]}}}],["discv5",{"_index":170,"t":{"331":{"position":[[15,8]]},"574":{"position":[[0,6]]}}}],["divers",{"_index":149,"t":{"280":{"position":[[11,10]]}}}],["doc",{"_index":8,"t":{"10":{"position":[[12,4]]}}}],["docker",{"_index":61,"t":{"106":{"position":[[0,6]]},"391":{"position":[[0,6]]},"433":{"position":[[8,6],[24,6]]},"491":{"position":[[10,6]]}}}],["document",{"_index":2,"t":{"2":{"position":[[24,13]]},"131":{"position":[[16,13]]}}}],["download",{"_index":79,"t":{"129":{"position":[[6,8]]}}}],["dump",{"_index":108,"t":{"191":{"position":[[18,4]]},"193":{"position":[[17,4]]},"225":{"position":[[16,4]]},"227":{"position":[[19,4]]},"229":{"position":[[18,4]]},"231":{"position":[[20,4]]},"233":{"position":[[12,4]]},"237":{"position":[[15,4]]},"239":{"position":[[18,4]]}}}],["enabl",{"_index":264,"t":{"506":{"position":[[0,6]]}}}],["encrypt",{"_index":239,"t":{"464":{"position":[[55,9]]}}}],["end",{"_index":85,"t":{"147":{"position":[[0,3],[7,3]]}}}],["endpoint",{"_index":206,"t":{"418":{"position":[[7,8]]}}}],["engin",{"_index":213,"t":{"433":{"position":[[15,6]]}}}],["enr",{"_index":171,"t":{"333":{"position":[[0,3]]}}}],["environ",{"_index":90,"t":{"157":{"position":[[0,11]]},"169":{"position":[[11,11]]}}}],["ethereum",{"_index":150,"t":{"282":{"position":[[0,8]]}}}],["exampl",{"_index":51,"t":{"80":{"position":[[0,8]]},"200":{"position":[[0,7]]},"264":{"position":[[17,7]]},"266":{"position":[[26,7]]},"286":{"position":[[0,8]]},"317":{"position":[[0,8]]},"504":{"position":[[0,7]]},"512":{"position":[[0,8]]},"527":{"position":[[17,8]]},"533":{"position":[[15,8]]},"537":{"position":[[25,8]]},"543":{"position":[[34,8]]}}}],["execut",{"_index":6,"t":{"8":{"position":[[0,9]]},"376":{"position":[[14,9]]},"541":{"position":[[17,9]]},"543":{"position":[[17,9]]},"545":{"position":[[17,9]]}}}],["exit",{"_index":274,"t":{"535":{"position":[[20,4]]},"537":{"position":[[20,4]]},"539":{"position":[[20,4]]}}}],["expand",{"_index":253,"t":{"483":{"position":[[13,9]]}}}],["export",{"_index":272,"t":{"521":{"position":[[30,6]]},"523":{"position":[[30,6]]}}}],["extern",{"_index":40,"t":{"61":{"position":[[0,8]]}}}],["factor",{"_index":281,"t":{"558":{"position":[[54,6]]}}}],["featur",{"_index":159,"t":{"300":{"position":[[14,8]]}}}],["fee",{"_index":277,"t":{"556":{"position":[[16,3]]}}}],["feerecipi",{"_index":222,"t":{"442":{"position":[[10,12]]}}}],["filter",{"_index":119,"t":{"210":{"position":[[0,9]]},"213":{"position":[[0,8]]}}}],["firewal",{"_index":175,"t":{"343":{"position":[[0,8]]}}}],["first",{"_index":62,"t":{"108":{"position":[[0,5]]}}}],["flag",{"_index":167,"t":{"329":{"position":[[11,5]]}}}],["flamegraph",{"_index":117,"t":{"204":{"position":[[12,10]]}}}],["full",{"_index":259,"t":{"487":{"position":[[0,4]]}}}],["gener",{"_index":192,"t":{"372":{"position":[[0,8]]}}}],["get",{"_index":3,"t":{"4":{"position":[[0,7]]},"96":{"position":[[0,7]]},"262":{"position":[[0,7]]},"308":{"position":[[0,7]]}}}],["github",{"_index":69,"t":{"114":{"position":[[0,6]]}}}],["gossipsub",{"_index":46,"t":{"67":{"position":[[21,9]]},"335":{"position":[[19,10]]},"337":{"position":[[0,9]]}}}],["grafana",{"_index":76,"t":{"127":{"position":[[16,7]]},"495":{"position":[[0,7]]}}}],["graph",{"_index":16,"t":{"23":{"position":[[20,5]]}}}],["gui",{"_index":135,"t":{"241":{"position":[[21,3]]},"243":{"position":[[21,3]]}}}],["guid",{"_index":71,"t":{"114":{"position":[[13,5]]},"118":{"position":[[6,5]]},"120":{"position":[[12,5]]},"133":{"position":[[6,5]]},"382":{"position":[[9,5]]}}}],["guidelin",{"_index":75,"t":{"125":{"position":[[8,10]]}}}],["hardwar",{"_index":210,"t":{"430":{"position":[[0,8]]}}}],["hash",{"_index":286,"t":{"576":{"position":[[18,7]]},"587":{"position":[[0,7]]}}}],["heap",{"_index":128,"t":{"225":{"position":[[11,4]]},"227":{"position":[[14,4]]},"229":{"position":[[13,4]]},"231":{"position":[[15,4]]},"233":{"position":[[7,4]]},"237":{"position":[[10,4]]},"239":{"position":[[13,4]]}}}],["heaptrack",{"_index":134,"t":{"241":{"position":[[11,9]]},"243":{"position":[[11,9]]}}}],["help",{"_index":246,"t":{"470":{"position":[[18,4]]}}}],["histor",{"_index":183,"t":{"354":{"position":[[0,10]]}}}],["imag",{"_index":258,"t":{"485":{"position":[[27,6]]}}}],["import",{"_index":220,"t":{"440":{"position":[[31,6]]},"517":{"position":[[30,6]]},"519":{"position":[[30,6]]},"525":{"position":[[10,6]]},"527":{"position":[[10,6]]},"529":{"position":[[10,6]]},"554":{"position":[[0,6]]}}}],["infrastructur",{"_index":96,"t":{"167":{"position":[[9,14]]}}}],["input",{"_index":219,"t":{"440":{"position":[[0,5]]}}}],["instal",{"_index":104,"t":{"189":{"position":[[0,10]]},"206":{"position":[[0,12]]},"241":{"position":[[0,10]]},"243":{"position":[[0,10]]},"391":{"position":[[7,12]]},"398":{"position":[[0,7]]},"406":{"position":[[0,7]]},"433":{"position":[[0,7]]}}}],["integr",{"_index":86,"t":{"149":{"position":[[0,11]]},"268":{"position":[[8,11]]}}}],["interv",{"_index":209,"t":{"420":{"position":[[11,8]]}}}],["issu",{"_index":58,"t":{"102":{"position":[[7,6]]},"404":{"position":[[6,6]]}}}],["javascript",{"_index":127,"t":{"225":{"position":[[0,10]]}}}],["jwt",{"_index":189,"t":{"370":{"position":[[23,3]]},"374":{"position":[[33,3]]},"376":{"position":[[40,3]]},"438":{"position":[[16,3]]},"440":{"position":[[11,3]]}}}],["key",{"_index":194,"t":{"372":{"position":[[18,3]]}}}],["keystor",{"_index":234,"t":{"460":{"position":[[17,8]]},"462":{"position":[[32,9]]},"464":{"position":[[45,9]]},"552":{"position":[[9,8]]},"554":{"position":[[19,8]]}}}],["known",{"_index":202,"t":{"404":{"position":[[0,5]]}}}],["kubernet",{"_index":139,"t":{"254":{"position":[[6,10]]}}}],["label",{"_index":81,"t":{"133":{"position":[[0,5]]}}}],["launch",{"_index":101,"t":{"183":{"position":[[8,6]]}}}],["level",{"_index":74,"t":{"123":{"position":[[8,6]]}}}],["libp2p",{"_index":45,"t":{"67":{"position":[[14,6]]},"69":{"position":[[14,6]]},"71":{"position":[[14,6]]},"75":{"position":[[11,6]]},"341":{"position":[[15,8]]},"572":{"position":[[0,6]]}}}],["libp2p/j",{"_index":50,"t":{"75":{"position":[[0,10]]}}}],["librari",{"_index":287,"t":{"582":{"position":[[9,9]]},"584":{"position":[[6,9]]}}}],["licens",{"_index":145,"t":{"272":{"position":[[0,7]]},"312":{"position":[[0,7]]}}}],["light",{"_index":141,"t":{"260":{"position":[[27,5]]},"264":{"position":[[0,5]]},"266":{"position":[[0,5]]}}}],["lightclient",{"_index":152,"t":{"288":{"position":[[0,11]]}}}],["linux",{"_index":111,"t":{"198":{"position":[[10,5]]},"219":{"position":[[14,5]]},"241":{"position":[[28,5]]}}}],["list",{"_index":123,"t":{"215":{"position":[[0,4]]},"282":{"position":[[17,4]]},"531":{"position":[[10,4]]},"533":{"position":[[10,4]]}}}],["llnode",{"_index":105,"t":{"189":{"position":[[11,6]]}}}],["local",{"_index":13,"t":{"17":{"position":[[11,5]]},"491":{"position":[[0,9]]}}}],["locat",{"_index":195,"t":{"374":{"position":[[22,6]]}}}],["lodestar",{"_index":1,"t":{"2":{"position":[[15,8]]},"23":{"position":[[0,8]]},"25":{"position":[[0,8]]},"116":{"position":[[0,8]]},"198":{"position":[[20,8]]},"251":{"position":[[16,8]]},"323":{"position":[[0,8]]},"325":{"position":[[10,8]]},"360":{"position":[[8,8]]},"370":{"position":[[14,8]]},"374":{"position":[[10,8]]},"402":{"position":[[0,8]]},"435":{"position":[[10,8]]},"452":{"position":[[10,8]]},"554":{"position":[[31,8]]}}}],["lodestar/api",{"_index":19,"t":{"29":{"position":[[0,13]]}}}],["lodestar/beacon",{"_index":20,"t":{"31":{"position":[[0,16]]}}}],["lodestar/config",{"_index":22,"t":{"33":{"position":[[0,16]]}}}],["lodestar/db",{"_index":23,"t":{"35":{"position":[[0,12]]}}}],["lodestar/flar",{"_index":24,"t":{"37":{"position":[[0,15]]}}}],["lodestar/fork",{"_index":25,"t":{"39":{"position":[[0,14]]}}}],["lodestar/light",{"_index":27,"t":{"41":{"position":[[0,15]]}}}],["lodestar/logg",{"_index":28,"t":{"43":{"position":[[0,16]]}}}],["lodestar/param",{"_index":29,"t":{"45":{"position":[[0,16]]}}}],["lodestar/prov",{"_index":30,"t":{"47":{"position":[[0,16]]}}}],["lodestar/reqresp",{"_index":31,"t":{"49":{"position":[[0,17]]}}}],["lodestar/spec",{"_index":32,"t":{"51":{"position":[[0,14]]}}}],["lodestar/st",{"_index":35,"t":{"53":{"position":[[0,15]]}}}],["lodestar/typ",{"_index":37,"t":{"55":{"position":[[0,15]]}}}],["lodestar/util",{"_index":38,"t":{"57":{"position":[[0,15]]}}}],["lodestar/valid",{"_index":39,"t":{"59":{"position":[[0,19]]}}}],["log",{"_index":72,"t":{"122":{"position":[[0,7]]},"123":{"position":[[0,7]]},"125":{"position":[[0,7]]},"177":{"position":[[11,7]]},"382":{"position":[[5,3]]},"474":{"position":[[16,4]]}}}],["logic",{"_index":254,"t":{"483":{"position":[[27,7]]}}}],["machin",{"_index":211,"t":{"432":{"position":[[6,7]]}}}],["maco",{"_index":55,"t":{"94":{"position":[[0,5]]},"221":{"position":[[14,5]]}}}],["mainnet",{"_index":187,"t":{"368":{"position":[[11,7]]},"428":{"position":[[11,7]]}}}],["manag",{"_index":176,"t":{"343":{"position":[[9,10]]},"364":{"position":[[5,10]]}}}],["merg",{"_index":12,"t":{"17":{"position":[[5,5]]}}}],["method",{"_index":157,"t":{"298":{"position":[[15,7]]},"351":{"position":[[8,7]]}}}],["metric",{"_index":261,"t":{"491":{"position":[[17,7]]}}}],["mev",{"_index":165,"t":{"325":{"position":[[29,3]]},"444":{"position":[[20,3]]},"450":{"position":[[10,3]]}}}],["minimum",{"_index":224,"t":{"444":{"position":[[4,7]]}}}],["mnemon",{"_index":243,"t":{"466":{"position":[[32,8]]}}}],["modifi",{"_index":110,"t":{"198":{"position":[[0,9]]},"454":{"position":[[0,6]]},"456":{"position":[[0,6]]}}}],["monitor",{"_index":208,"t":{"420":{"position":[[0,10]]}}}],["monorepo",{"_index":17,"t":{"25":{"position":[[9,8]]},"116":{"position":[[9,8]]},"582":{"position":[[0,8]]}}}],["multipl",{"_index":238,"t":{"464":{"position":[[16,8]]}}}],["nat",{"_index":177,"t":{"345":{"position":[[0,3]]}}}],["nativ",{"_index":132,"t":{"233":{"position":[[0,6]]}}}],["navig",{"_index":216,"t":{"436":{"position":[[0,8]]}}}],["need",{"_index":9,"t":{"12":{"position":[[0,4]]},"306":{"position":[[9,4]]}}}],["network",{"_index":166,"t":{"329":{"position":[[0,10]]},"446":{"position":[[17,7]]},"448":{"position":[[12,7]]},"571":{"position":[[0,10]]},"589":{"position":[[0,10]]}}}],["node",{"_index":21,"t":{"31":{"position":[[17,4]]},"252":{"position":[[17,4]]},"378":{"position":[[15,4]]},"476":{"position":[[13,4]]}}}],["nois",{"_index":47,"t":{"69":{"position":[[21,5]]}}}],["non",{"_index":158,"t":{"300":{"position":[[0,3]]}}}],["npm",{"_index":203,"t":{"406":{"position":[[13,3]]}}}],["option",{"_index":53,"t":{"82":{"position":[[4,7]]},"288":{"position":[[12,7]]},"319":{"position":[[7,7]]},"386":{"position":[[9,7]]},"412":{"position":[[15,10]]},"462":{"position":[[0,6]]},"464":{"position":[[0,6]]},"466":{"position":[[0,6]]},"515":{"position":[[10,7]]},"519":{"position":[[37,7]]},"523":{"position":[[37,7]]},"529":{"position":[[17,7]]},"539":{"position":[[25,7]]},"545":{"position":[[34,7]]}}}],["osx",{"_index":136,"t":{"243":{"position":[[28,3]]}}}],["packag",{"_index":201,"t":{"398":{"position":[[8,8]]}}}],["paramet",{"_index":231,"t":{"456":{"position":[[20,10]]}}}],["password",{"_index":235,"t":{"460":{"position":[[26,8]]},"464":{"position":[[81,9]]}}}],["peer",{"_index":168,"t":{"331":{"position":[[0,4]]},"335":{"position":[[0,4]]}}}],["perform",{"_index":84,"t":{"145":{"position":[[0,11]]}}}],["polici",{"_index":73,"t":{"122":{"position":[[8,6]]}}}],["post",{"_index":11,"t":{"17":{"position":[[0,4]]}}}],["prerequisit",{"_index":54,"t":{"92":{"position":[[0,13]]},"258":{"position":[[0,13]]},"304":{"position":[[0,13]]},"394":{"position":[[0,13]]},"426":{"position":[[0,13]]}}}],["process",{"_index":68,"t":{"112":{"position":[[13,7]]},"185":{"position":[[18,7]]},"239":{"position":[[36,7]]}}}],["programmat",{"_index":143,"t":{"266":{"position":[[13,12]]}}}],["progress",{"_index":249,"t":{"476":{"position":[[21,11]]}}}],["prometheu",{"_index":262,"t":{"493":{"position":[[0,10]]}}}],["proof",{"_index":146,"t":{"276":{"position":[[0,5]]}}}],["propos",{"_index":265,"t":{"506":{"position":[[7,8]]}}}],["proposer_config.yaml",{"_index":263,"t":{"504":{"position":[[8,20]]}}}],["protect",{"_index":271,"t":{"517":{"position":[[19,10]]},"519":{"position":[[19,10]]},"521":{"position":[[19,10]]},"523":{"position":[[19,10]]}}}],["provid",{"_index":155,"t":{"296":{"position":[[21,8]]},"454":{"position":[[48,8]]}}}],["public",{"_index":188,"t":{"368":{"position":[[24,6]]}}}],["quick",{"_index":215,"t":{"435":{"position":[[19,5]]}}}],["quickstart",{"_index":245,"t":{"468":{"position":[[8,10]]},"470":{"position":[[0,10]]}}}],["rang",{"_index":184,"t":{"356":{"position":[[0,5]]}}}],["read",{"_index":151,"t":{"282":{"position":[[9,7]]}}}],["recipi",{"_index":278,"t":{"556":{"position":[[20,9]]}}}],["recommend",{"_index":204,"t":{"406":{"position":[[22,12]]}}}],["refer",{"_index":122,"t":{"214":{"position":[[0,10]]},"215":{"position":[[12,10]]}}}],["relay",{"_index":229,"t":{"450":{"position":[[20,6]]}}}],["remot",{"_index":205,"t":{"418":{"position":[[0,6]]}}}],["render",{"_index":116,"t":{"204":{"position":[[0,9]]}}}],["report",{"_index":65,"t":{"110":{"position":[[0,9]]},"175":{"position":[[11,7]]},"567":{"position":[[0,9]]}}}],["repositori",{"_index":200,"t":{"396":{"position":[[6,10]]},"432":{"position":[[16,10]]}}}],["req/resp",{"_index":172,"t":{"335":{"position":[[34,9]]},"339":{"position":[[0,8]]}}}],["requir",{"_index":140,"t":{"260":{"position":[[0,12]]},"430":{"position":[[9,12]]}}}],["result",{"_index":120,"t":{"210":{"position":[[10,7]]}}}],["root",{"_index":217,"t":{"436":{"position":[[16,4]]}}}],["run",{"_index":88,"t":{"155":{"position":[[0,7]]},"185":{"position":[[10,7]]},"239":{"position":[[28,7]]},"252":{"position":[[0,7]]},"260":{"position":[[17,7]]},"378":{"position":[[0,3]]},"562":{"position":[[0,3]]}}}],["script",{"_index":80,"t":{"129":{"position":[[15,6]]},"435":{"position":[[25,7]]},"440":{"position":[[46,6]]},"468":{"position":[[19,6]]},"470":{"position":[[11,6]]},"491":{"position":[[25,6]]}}}],["secret",{"_index":193,"t":{"372":{"position":[[11,6]]},"374":{"position":[[37,6]]},"376":{"position":[[44,6]]},"438":{"position":[[20,6]]},"440":{"position":[[15,6]]}}}],["select",{"_index":228,"t":{"448":{"position":[[0,6]]},"558":{"position":[[23,9]]}}}],["serial",{"_index":285,"t":{"576":{"position":[[0,13]]}}}],["set",{"_index":223,"t":{"444":{"position":[[0,3]]},"464":{"position":[[35,4]]}}}],["setup",{"_index":164,"t":{"325":{"position":[[19,5]]},"432":{"position":[[0,5]]},"458":{"position":[[0,5]]},"462":{"position":[[10,5]]},"464":{"position":[[10,5]]},"466":{"position":[[10,5]]},"493":{"position":[[11,5]]},"495":{"position":[[8,5]]},"550":{"position":[[0,5]]}}}],["sim",{"_index":89,"t":{"155":{"position":[[8,3]]},"167":{"position":[[0,3]]}}}],["simul",{"_index":87,"t":{"151":{"position":[[0,10]]},"169":{"position":[[0,10]]},"171":{"position":[[0,10]]},"175":{"position":[[0,10]]},"177":{"position":[[0,10]]}}}],["slash",{"_index":270,"t":{"517":{"position":[[10,8]]},"519":{"position":[[10,8]]},"521":{"position":[[10,8]]},"523":{"position":[[10,8]]}}}],["sourc",{"_index":198,"t":{"393":{"position":[[11,6]]},"400":{"position":[[6,6]]}}}],["spec",{"_index":60,"t":{"104":{"position":[[10,4]]},"143":{"position":[[0,4]]}}}],["specif",{"_index":5,"t":{"6":{"position":[[0,14]]},"94":{"position":[[6,9]]}}}],["stack",{"_index":114,"t":{"202":{"position":[[10,5]]}}}],["stake",{"_index":147,"t":{"276":{"position":[[9,5]]}}}],["start",{"_index":4,"t":{"4":{"position":[[8,7]]},"96":{"position":[[8,7]]},"262":{"position":[[8,7]]},"308":{"position":[[8,7]]}}}],["start_lodestar.sh",{"_index":112,"t":{"200":{"position":[[8,17]]}}}],["startup",{"_index":244,"t":{"468":{"position":[[0,7]]}}}],["stop",{"_index":251,"t":{"480":{"position":[[0,4]]}}}],["style",{"_index":70,"t":{"114":{"position":[[7,5]]},"118":{"position":[[0,5]]},"120":{"position":[[6,5]]}}}],["sub",{"_index":267,"t":{"510":{"position":[[10,3]]}}}],["subject",{"_index":180,"t":{"349":{"position":[[5,12]]},"454":{"position":[[17,12]]}}}],["submit",{"_index":282,"t":{"560":{"position":[[0,6]]}}}],["support",{"_index":156,"t":{"298":{"position":[[0,9]]},"300":{"position":[[4,9]]},"410":{"position":[[0,7]]},"424":{"position":[[0,7]]},"565":{"position":[[0,9]]}}}],["sync",{"_index":181,"t":{"351":{"position":[[0,7]]},"352":{"position":[[11,4]]},"354":{"position":[[11,4]]},"356":{"position":[[6,4]]},"358":{"position":[[9,4]]},"360":{"position":[[0,7]]},"380":{"position":[[11,4]]},"382":{"position":[[0,4]]},"454":{"position":[[42,5]]}}}],["test",{"_index":33,"t":{"51":{"position":[[15,4]]},"98":{"position":[[0,5]]},"104":{"position":[[15,5]]},"120":{"position":[[0,5]]},"141":{"position":[[5,5]]},"143":{"position":[[5,5]]},"145":{"position":[[12,5]]},"147":{"position":[[11,5]]},"149":{"position":[[12,5]]},"151":{"position":[[11,5]]},"155":{"position":[[12,5]]},"167":{"position":[[4,4]]}}}],["test:sim:deneb",{"_index":94,"t":{"163":{"position":[[0,14]]}}}],["test:sim:endpoint",{"_index":93,"t":{"161":{"position":[[0,18]]}}}],["test:sim:mixedcleint",{"_index":95,"t":{"165":{"position":[[0,20]]}}}],["test:sim:multifork",{"_index":92,"t":{"159":{"position":[[0,18]]}}}],["testnet",{"_index":14,"t":{"17":{"position":[[17,7]]},"368":{"position":[[31,7]]},"428":{"position":[[0,7]]}}}],["time",{"_index":63,"t":{"108":{"position":[[6,4]]}}}],["token",{"_index":191,"t":{"370":{"position":[[42,5]]}}}],["tool",{"_index":126,"t":{"217":{"position":[[14,5]]},"235":{"position":[[17,5]]},"249":{"position":[[0,7]]}}}],["trace",{"_index":115,"t":{"202":{"position":[[16,6]]}}}],["transit",{"_index":36,"t":{"53":{"position":[[16,10]]}}}],["transport",{"_index":174,"t":{"341":{"position":[[5,9]]}}}],["travers",{"_index":178,"t":{"345":{"position":[[4,9]]}}}],["troubleshoot",{"_index":137,"t":{"251":{"position":[[0,15]]}}}],["ts",{"_index":42,"t":{"63":{"position":[[16,2]]}}}],["under",{"_index":240,"t":{"464":{"position":[[65,5]]}}}],["unfilt",{"_index":121,"t":{"212":{"position":[[0,10]]}}}],["unit",{"_index":83,"t":{"141":{"position":[[0,4]]}}}],["updat",{"_index":257,"t":{"485":{"position":[[13,6]]}}}],["url",{"_index":207,"t":{"418":{"position":[[16,3]]}}}],["us",{"_index":78,"t":{"129":{"position":[[0,5]]},"254":{"position":[[0,5]]}}}],["usag",{"_index":118,"t":{"208":{"position":[[0,5]]},"294":{"position":[[0,5]]}}}],["user",{"_index":233,"t":{"456":{"position":[[45,6]]}}}],["util",{"_index":34,"t":{"51":{"position":[[20,4]]},"585":{"position":[[4,9]]}}}],["v8",{"_index":130,"t":{"227":{"position":[[11,2]]},"229":{"position":[[10,2]]},"231":{"position":[[12,2]]}}}],["valid",{"_index":227,"t":{"444":{"position":[[30,10]]},"458":{"position":[[6,10]]},"460":{"position":[[7,9]]},"462":{"position":[[16,10]]},"464":{"position":[[25,9]]},"466":{"position":[[16,10]]},"478":{"position":[[6,10]]},"513":{"position":[[5,9]]},"515":{"position":[[0,9]]},"517":{"position":[[0,9]]},"519":{"position":[[0,9]]},"521":{"position":[[0,9]]},"523":{"position":[[0,9]]},"525":{"position":[[0,9]]},"527":{"position":[[0,9]]},"529":{"position":[[0,9]]},"531":{"position":[[0,9]]},"533":{"position":[[0,9]]},"535":{"position":[[0,9]]},"537":{"position":[[0,9]]},"539":{"position":[[0,9]]},"541":{"position":[[0,9]]},"543":{"position":[[0,9]]},"545":{"position":[[0,9]]},"550":{"position":[[11,9]]},"554":{"position":[[9,9]]},"560":{"position":[[9,9]]},"562":{"position":[[8,9]]}}}],["variabl",{"_index":91,"t":{"157":{"position":[[12,9]]}}}],["version",{"_index":230,"t":{"452":{"position":[[19,7]]},"565":{"position":[[10,8]]}}}],["view",{"_index":131,"t":{"229":{"position":[[0,7]]}}}],["visual",{"_index":125,"t":{"217":{"position":[[0,13]]}}}],["volum",{"_index":255,"t":{"483":{"position":[[35,6]]}}}],["voluntari",{"_index":273,"t":{"535":{"position":[[10,9]]},"537":{"position":[[10,9]]},"539":{"position":[[10,9]]}}}],["vs",{"_index":99,"t":{"183":{"position":[[0,2]]}}}],["vulner",{"_index":284,"t":{"567":{"position":[[12,13]]}}}],["warn",{"_index":160,"t":{"302":{"position":[[0,8]]}}}],["weak",{"_index":179,"t":{"349":{"position":[[0,4]]},"454":{"position":[[12,4]]}}}],["web",{"_index":124,"t":{"215":{"position":[[8,3]]}}}],["web3",{"_index":154,"t":{"296":{"position":[[16,4]]},"298":{"position":[[10,4]]}}}],["welcom",{"_index":0,"t":{"2":{"position":[[0,7]]}}}],["yamux",{"_index":48,"t":{"71":{"position":[[21,5]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Lodestar is an open-source Ethereum Consensus client and TypeScript ecosystem, maintained by ChainSafe Systems","s":"Welcome to the Lodestar Documentation","u":"/lodestar/","h":"#welcome-to-the-lodestar-documentation","p":1},{"i":5,"t":"Follow the instructions for build from source, binaries, or Docker to install Lodestar. Or use our Lodestar Quickstart scripts. Use Lodestar libraries in your next Ethereum TypeScript project. Run a beacon node on mainnet or a public testnet. Utilize the whole stack by starting a local testnet. View the Lodestar Beacon CLI commands and options Prospective contributors can read the contributing section to understand how we develop and test on Lodestar. If you have questions submit an issue or join us on Discord! Please note our security policy.","s":"Getting Started","u":"/lodestar/","h":"#getting-started","p":1},{"i":7,"t":"Hardware specifications minimum / recommended, to run the Lodestar client. Minimum Recommended Processor Intel Core i3–9100 or AMD Ryzen 5 3450 Intel Core i7–9700 or AMD Ryzen 7 4700 Memory 8 GB RAM 16 GB RAM Storage 130 GB available space SSD 200 GB available space SSD Internet Reliable broadband with 10mbps upload Reliable broadband with >10mbps upload","s":"Specifications","u":"/lodestar/","h":"#specifications","p":1},{"i":9,"t":"If you run the execution client on the same host, you will need to check their requirements and add them to the above requirements. Broadly, to run both an execution and a consensus client on the same machine, we recommend a 4 TB SSD and 32 GB RAM.","s":"Execution Client","u":"/lodestar/","h":"#execution-client","p":1},{"i":11,"t":"This documentation is open source, contribute on our Github Lodestar repository /docs.","s":"About These Docs","u":"/lodestar/","h":"#about-these-docs","p":1},{"i":13,"t":"If you have questions about this documentation, feel free to talk to us on our ChainSafe Discord or open an issue and a member of the team or our community will be happy to assist you.","s":"Need Assistance?","u":"/lodestar/","h":"#need-assistance","p":1},{"i":16,"t":"To quickly test and run Lodestar we recommend starting a local testnet. We recommend a simple configuration of two beacon nodes with multiple validators. The dev scripts can used for simplicity but below instructions provide more insights on how it works and include details about different configurations. note The testnet set up in this guide is meant to be short-lived / ephemeral and should primarily be used for development and testing. Please refer to Ethereum In a Box or Kurtosis ethereum package to set up a long-lived private network or devnet. Terminal 1 Run a beacon node as a bootnode, with 8 validators with the following command. ./lodestar dev \\ --genesisValidators 8 \\ --genesisTime 1669713528 \\ --startValidators 0..7 \\ --enr.ip 127.0.0.1 \\ --enr.udp 9000 \\ --dataDir \\ --reset --genesisValidators and --genesisTime define the genesis state of the beacon chain. --dataDir defines a path where Lodestar should store the beacon state. --enr.ip sets the ENR IP entry for the node (essential for second node to connect via enr) and --enr.udp exposes the Discv5 discovery service (if you want to connect more than 1 node and enable discovery amongst them via bootnode). Lastly the --reset flag ensures the state is cleared on each restart - which is useful when testing locally. Once the node has started, make a request to curl http://localhost:9596/eth/v1/node/identity and copy the enr value. This would be used to connect from the second node. ENR stands for Ethereum node records, which is a format for conveying p2p connectivity information for Ethereum nodes. For more info see EIP-778. Terminal 2 Start the second node without starting any validators and connect to the first node by supplying the copied enr value: ./lodestar dev \\ --genesisValidators 8 \\ --genesisTime 1669713528 \\ --dataDir \\ --port 9001 \\ --rest.port 9597 \\ --network.connectToDiscv5Bootnodes true \\ --bootnodes \\ --reset By default, Lodestar starts as many validators as the number supplied by --genesisValidators. In order to not start any validator, this is overridden by the --startValidators option. Passing a value of 0..0 means no validators should be started. Also, take note that the values of --genesisValidators and --genesisTime must be the same as the ones passed to the first node in order for the two nodes to have the same beacon chain. Also --port and --rest.port are supplied since the default values will already be in use by the first node. The --network.connectToDiscv5Bootnodes flags needs to be set to true as this is needed to allow connection to boot ENRs on local devnet. The exact ENR of node to connect to is then supplied via the --bootnodes flag. Once the second node starts, you should see an output similar to the following in either of the terminals: Eph 167991/6 6.007 [] info: Searching peers - peers: 1 - slot: 5375718 (skipped 5375718) - head: 0 0xcc67…3345 - finalized: 0x0000…0000:0 For further confirmation that both nodes are connected as peers, make a request to the /eth/v1/node/peers endpoint. For example, making the request on the first node via the following command: curl http://localhost:9596/eth/v1/node/peers | jq will give a result similar to the following: { \"data\": [ { \"peer_id\": \"...\", \"enr\": \"\", \"last_seen_p2p_address\": \"....\", \"direction\": \"inbound\", \"state\": \"connected\" } ], \"meta\": { \"count\": 1 } }","s":"Setting-Up a Testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","h":"","p":15},{"i":18,"t":"To set up a local testnet with a Post-Merge configuration, you may need to add the following parameters (in addition to the parameters described above) to your lodestar dev command: --params.ALTAIR_FORK_EPOCH 0 --params.BELLATRIX_FORK_EPOCH 0 --terminal-total-difficulty-override 0","s":"Post-Merge local testnet","u":"/lodestar/contribution/advanced-topics/setting-up-a-testnet","h":"#post-merge-local-testnet","p":15},{"i":24,"t":"This is a diagram of the various Lodestar packages in the monorepo, how they fit together and interact with major external dependencies: note This dependency graph only applies to dependencies as they are used in the src/ folders of each package, not in test/","s":"Lodestar Dependency Graph","u":"/lodestar/contribution/depgraph","h":"#lodestar-dependency-graph","p":22},{"i":26,"t":"For a list of all the packages in the monorepo and a description for each, click here. Below is a brief summary of each package in alphabetical order.","s":"Lodestar Monorepo","u":"/lodestar/contribution/depgraph","h":"#lodestar-monorepo","p":22},{"i":28,"t":"@chainsafe/lodestar combines everything together for CLI usage and configuration of the beacon node and validator.","s":"@chainsafe/lodestar","u":"/lodestar/contribution/depgraph","h":"#chainsafelodestar","p":22},{"i":30,"t":"@lodestar/api contains a TypeScript REST client for the Ethereum Consensus API.","s":"@lodestar/api","u":"/lodestar/contribution/depgraph","h":"#lodestarapi","p":22},{"i":32,"t":"@lodestar/beacon-node contains the actual beacon node process itself, which is the aggregate of all the above packages and the \"brain\" of the Lodestar beacon chain implementation. All of the node modules live in this package as well.","s":"@lodestar/beacon-node","u":"/lodestar/contribution/depgraph","h":"#lodestarbeacon-node","p":22},{"i":34,"t":"@lodestar/config combines @lodestar/params and @lodestar/types together to be used as a single config object across the other Lodestar packages.","s":"@lodestar/config","u":"/lodestar/contribution/depgraph","h":"#lodestarconfig","p":22},{"i":36,"t":"@lodestar/db is where all persistent data about the beacon node is stored. Any package that needs to read or write persistent beacon node data depends on @lodestar/db.","s":"@lodestar/db","u":"/lodestar/contribution/depgraph","h":"#lodestardb","p":22},{"i":38,"t":"@lodestar/flare is a command tool used for easily triggering non-standard actions and debugging for researchers, developers and testers. Use with care.","s":"@lodestar/flare","u":"/lodestar/contribution/depgraph","h":"#lodestarflare","p":22},{"i":40,"t":"@lodestar/fork-choice holds the methods for reading/writing the fork choice DAG. The @lodestar/beacon-node package is the sole consumer of this package because the beacon node itself is what controls when the fork choice DAG is updated. For a good explanation on how the fork choice itself works, see the annotated fork choice spec. This is an annotated version of the Ethereum Consensus fork choice spec which @lodestar/fork-choice is based on.","s":"@lodestar/fork-choice","u":"/lodestar/contribution/depgraph","h":"#lodestarfork-choice","p":22},{"i":42,"t":"@lodestar/light-client is our light client designed to interact with the Ethereum blockchain in a trust-minimized matter via the sync committee and the light-client protocol.","s":"@lodestar/light-client","u":"/lodestar/contribution/depgraph","h":"#lodestarlight-client","p":22},{"i":44,"t":"@lodestar/logger is a common NodeJS logger for Lodestar binaries, which is required for worker threads to instantiate new loggers with consistent settings.","s":"@lodestar/logger","u":"/lodestar/contribution/depgraph","h":"#lodestarlogger","p":22},{"i":46,"t":"@lodestar/params contains the parameters for configuring an Ethereum Consensus network. For example, the mainnet params.","s":"@lodestar/params","u":"/lodestar/contribution/depgraph","h":"#lodestarparams","p":22},{"i":48,"t":"@lodestar/prover is a web3 provider and a proxy to enable verification of JSON-RPC calls to the execution client using the light-client protocol.","s":"@lodestar/prover","u":"/lodestar/contribution/depgraph","h":"#lodestarprover","p":22},{"i":50,"t":"@lodestar/reqresp contains the TypeScript implementation of the Ethereum Consensus Req/Resp protocol.","s":"@lodestar/reqresp","u":"/lodestar/contribution/depgraph","h":"#lodestarreqresp","p":22},{"i":52,"t":"@lodestar/spec-test-util is a Vitest test utility harness used for adhering to the Ethereum Consensus specification tests.","s":"@lodestar/spec-test-util","u":"/lodestar/contribution/depgraph","h":"#lodestarspec-test-util","p":22},{"i":54,"t":"@lodestar/state-transition contains the Lodestar implementation of the beacon state transition function, which is used by @lodestar/beacon-node to perform the actual beacon state transition. This package also contains various functions used to calculate info about the beacon chain (such as computeEpochAtSlot) which are used by @lodestar/fork-choice and @lodestar/validator","s":"@lodestar/state-transition","u":"/lodestar/contribution/depgraph","h":"#lodestarstate-transition","p":22},{"i":56,"t":"@lodestar/types contains Ethereum Consensus ssz types and data structures.","s":"@lodestar/types","u":"/lodestar/contribution/depgraph","h":"#lodestartypes","p":22},{"i":58,"t":"@lodestar/utils contains various utilities that are common among the various Lodestar monorepo packages.","s":"@lodestar/utils","u":"/lodestar/contribution/depgraph","h":"#lodestarutils","p":22},{"i":60,"t":"@lodestar/validator contains the validator client. The sole consumer of this package is @chainsafe/lodestar, which provides CLI access to run and configure the validator client. However, the validator client communicates to a REST API that is contained in @lodestar/beacon-node (specifically in the api module) to perform the validator duties.","s":"@lodestar/validator","u":"/lodestar/contribution/depgraph","h":"#lodestarvalidator","p":22},{"i":62,"t":"Below is a brief summary, listed alphabetically, of each of our main external dependencies managed externally from our monorepo.","s":"External Dependencies","u":"/lodestar/contribution/depgraph","h":"#external-dependencies","p":22},{"i":64,"t":"@chainsafe/blst-ts` is our TypeScript wrapper for @supranational/blst native bindings, a highly performant BLS12-381 signature library.","s":"@chainsafe/blst-ts","u":"/lodestar/contribution/depgraph","h":"#chainsafeblst-ts","p":22},{"i":66,"t":"@chainsafe/discv5 is our monorepo containing our TypeScript implementation of the discv5 Node Discovery Protocol v5.","s":"@chainsafe/discv5","u":"/lodestar/contribution/depgraph","h":"#chainsafediscv5","p":22},{"i":68,"t":"@chainsafe/js-libp2p-gossipsub is an implementation of pubsub based on mmeshsub and floodsub. Specified under @libp2p/specs/pubsub/gossipsub.","s":"@chainsafe/js-libp2p-gossipsub","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-gossipsub","p":22},{"i":70,"t":"@chainsafe/js-libp2p-noise contains the TypeScript implementation of the Noise protocol, an encryption protocol used in @libp2p/specs/noise.","s":"@chainsafe/js-libp2p-noise","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-noise","p":22},{"i":72,"t":"@chainsafe/js-libp2p-yamux contains the JavaScript implementation of the Yamux multiplexer from Hashicorp designed for usage with js-libp2p.","s":"@chainsafe/js-libp2p-yamux","u":"/lodestar/contribution/depgraph","h":"#chainsafejs-libp2p-yamux","p":22},{"i":74,"t":"@chainsafe/ssz contains the packages as a monorepo related to the Simple Serialize.","s":"@chainsafe/ssz","u":"/lodestar/contribution/depgraph","h":"#chainsafessz","p":22},{"i":76,"t":"@libp2p/js-libp2p is the JavaScript implementation of the libp2p networking stack used in Ethereum's networking stack.","s":"@libp2p/js-libp2p","u":"/lodestar/contribution/depgraph","h":"#libp2pjs-libp2p","p":22},{"i":79,"t":"Quickly bootstrap a beacon node and multiple validators. Use for development and testing","s":"dev CLI Command","u":"/lodestar/contribution/dev-cli","h":"","p":78},{"i":81,"t":"Start a single beacon node with 8 interop validators ./lodestar dev --genesisValidators 8 --reset","s":"Examples","u":"/lodestar/contribution/dev-cli","h":"#examples","p":78},{"i":83,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --rcConfig​ RC file to supplement command line args, accepted formats: .yml, .yaml, .json type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --genesisStateFile​ Path or URL to download a genesis state file in ssz-encoded format type: string --checkpointSyncUrl​ Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint type: string --checkpointState​ Set a checkpoint state to start syncing from type: string --wssCheckpoint​ Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234. type: string --forceCheckpointSync​ Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while. type: boolean --ignoreWeakSubjectivityCheck​ Ignore the checkpoint sync state failing the weak subjectivity check. This is relevant in testnets where the weak subjectivity period is too small for even few epochs of non finalization causing last finalized to be out of range. This flag is not recommended for mainnet use. type: boolean --persistNetworkIdentity​ Whether to reuse the same peer-id across restarts type: boolean --private​ Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests type: boolean --validatorMonitorLogs​ Log validator monitor events as info. This requires metrics to be enabled. type: boolean --disableLightClientServer​ Disable light client server. type: boolean --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --rest​ Enable/disable HTTP API type: boolean default: true --rest.namespace​ Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces type: string[] choices: \"beacon\", \"config\", \"debug\", \"events\", \"lightclient\", \"lodestar\", \"node\", \"proof\", \"validator\", \"*\" default: [\"beacon\",\"config\",\"debug\",\"events\",\"node\",\"validator\",\"lightclient\"] --rest.cors​ Configures the Access-Control-Allow-Origin CORS header for HTTP API type: string default: \"*\" --rest.address​ Set host for HTTP API type: string default: \"127.0.0.1\" --rest.port​ Set port for HTTP API type: number default: 9596 --rest.swaggerUI​ Enable Swagger UI for API exploration at http://{address}:{port}/documentation type: boolean default: true --suggestedFeeRecipient​ Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge. type: string default: \"0x0000000000000000000000000000000000000000\" --emitPayloadAttributes​ Flag to SSE emit execution payloadAttributes before every slot type: boolean default: false --chain.archiveBlobEpochs​ Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS) type: number --eth1​ Whether to follow the eth1 chain type: boolean --eth1.providerUrls​ Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s) type: string[] default: [ \"http://localhost:8545\" ] --execution.urls​ Urls to execution client engine API type: string[] default: [ \"http://localhost:8551\" ] --execution.timeout​ Timeout in milliseconds for execution engine API HTTP client type: number default: 12000 --execution.retries​ Number of retries when calling execution engine API type: number default: 2 --execution.retryDelay​ Delay time in milliseconds between retries when retrying calls to the execution engine API type: number default: 2000 --execution.engineMock​ Set the execution engine to mock mode (development only) type: boolean --jwtSecret​ File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client. type: string --jwtId​ An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis type: string --builder​ An alias for --builder.selection default for the builder flow, ignored if --builder.selection is explicitly provided type: boolean --builder.url​ Url hosting the builder API type: string default: \"http://localhost:8661\" --builder.timeout​ Timeout in milliseconds for builder API HTTP client type: number default: 12000 --builder.faultInspectionWindow​ Window to inspect missed slots for enabling/disabling builder circuit breaker type: number --builder.allowedFaults​ Number of missed slots allowed in the faultInspectionWindow for builder circuit type: number --metrics​ Enable the Prometheus metrics HTTP server type: boolean default: false --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 5064 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\" --monitoring.endpoint​ Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in) type: string --monitoring.interval​ Interval in milliseconds between sending client stats to the remote service type: number default: 60000 --discv5​ Enable discv5 type: boolean default: true --listenAddress​ The IPv4 address to listen for p2p UDP and TCP connections type: string default: \"0.0.0.0\" --port​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag. type: number default: 9000 --discoveryPort​ The UDP port that discovery will listen on. Defaults to port type: number default: port --listenAddress6​ The IPv6 address to listen for p2p UDP and TCP connections type: string --port6​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag. type: number default: 9090 --discoveryPort6​ The UDP port that discovery will listen on. Defaults to port6 type: number default: port6 --bootnodes​ Bootnodes for discv5 discovery type: string[] default: [ \"[]\" ] --targetPeers​ The target connected peers. Above this number peers will be disconnected type: number default: 100 --subscribeAllSubnets​ Subscribe to all subnets regardless of validator count type: boolean default: false --disablePeerScoring​ Disable peer scoring, used for testing on devnets type: boolean default: false --mdns​ Enable mdns local peer discovery type: boolean default: false --enr.ip​ Override ENR IP entry type: string --enr.tcp​ Override ENR TCP entry type: number --enr.udp​ Override ENR UDP entry type: number --enr.ip6​ Override ENR IPv6 entry type: string --enr.tcp6​ Override ENR (IPv6-specific) TCP entry type: number --enr.udp6​ Override ENR (IPv6-specific) UDP entry type: number --nat​ Allow configuration of non-local addresses type: boolean --keymanager​ Enable key manager API server type: boolean --keymanager.auth​ Enable token bearer authentication for key manager API server type: boolean default: true --keymanager.tokenFile​ Path to file containing bearer token used for key manager API authentication type: string --keymanager.port​ Set port for key manager API type: number default: 5062 --keymanager.address​ Set host for key manager API type: string default: \"127.0.0.1\" --keymanager.cors​ Configures the Access-Control-Allow-Origin CORS header for key manager API type: string default: \"*\" --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ Open validators even if there's a lockfile. Use with caution type: boolean --graffiti​ Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max) type: string --proposerSettingsFile​ A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change type: string --strictFeeRecipientCheck​ Enable strict checking of the validator's feeRecipient with the one returned by engine type: boolean --defaultGasLimit​ Suggested gas limit to the engine/builder for building execution payloads. Only used post merge. type: number default: 30000000 --builder.selection​ Builder block selection strategy default, maxprofit, builderalways, builderonly, executionalways, or executiononly type: string default: \"executiononly\" --builder.boostFactor​ Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit type: string default: \"100\" --useProduceBlockV3​ Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks type: boolean --broadcastValidation​ Validations to be run by beacon node for the signed block prior to publishing type: string default: \"gossip\" --blindedLocal​ Request fetching local block in blinded format for produceBlockV3 type: boolean default: false --importKeystores​ Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators type: string[] default: [ \"./keystores/*.json\" ] --importKeystoresPassword​ Path to a file with password to decrypt all keystores from importKeystores option type: string default: \"./password.txt\" --doppelgangerProtection​ Enables Doppelganger protection type: boolean --http.requestWireFormat​ Wire format to use in HTTP requests to beacon node. Can be one of json or ssz type: string default: \"json\" --http.responseWireFormat​ Preferred wire format for HTTP responses from beacon node. Can be one of json or ssz type: string default: \"ssz\" --externalSigner.url​ URL to connect to an external signing server type: string --externalSigner.pubkeys​ List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys type: string[] --externalSigner.fetch​ Fetch the list of public keys to validate from an external signer. Cannot be used in combination with --externalSigner.pubkeys type: boolean --externalSigner.fetchInterval​ Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default type: number --distributed​ Enables specific features required to run as part of a distributed validator cluster type: boolean --genesisEth1Hash​ If present it will create genesis with this eth1 hash. type: string --genesisValidators​ If present it will create genesis with interop validators and start chain. type: number default: 8 --startValidators​ Start interop validators in inclusive range with notation '0..7' type: string --genesisTime​ genesis_time to initialize interop genesis state type: number default: now --reset​ To delete chain and validator directories type: boolean --dumpTestnetFiles​ Dump testnet files and exit type: string","s":"dev Options","u":"/lodestar/contribution/dev-cli","h":"#dev-options","p":78},{"i":87,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"End-To-End Tests","u":"/lodestar/contribution/testing/end-to-end-tests","h":"","p":86},{"i":89,"t":"The following tests are found in packages/beacon-node test:sim:mergemock​ yarn test:sim:blobs​","s":"Integration Tests","u":"/lodestar/contribution/testing/integration-tests","h":"","p":88},{"i":91,"t":"Thanks for your interest in contributing to Lodestar. It's people like you that push the Ethereum ecosystem forward.","s":"Contribution Guidelines","u":"/lodestar/contribution/getting-started","h":"","p":90},{"i":93,"t":"⚙ NodeJS (LTS) 🧰 Yarn","s":"Prerequisites","u":"/lodestar/contribution/getting-started","h":"#prerequisites","p":90},{"i":95,"t":"When using MacOS, there are a couple of extra prerequisites that are required. python coreutils (e.g. via brew install coreutils)","s":"MacOS Specifics","u":"/lodestar/contribution/getting-started","h":"#macos-specifics","p":90},{"i":97,"t":"⚙ Run corepack enable to enable Corepack. ⚙ Run yarn to install dependencies. ⚙ Run yarn build to build lib from source. 📦 A lodestar binary will be bundled in ./packages/cli/bin. 💻 Run ./lodestar --help to get a list of available commands and arguments.","s":"Getting Started","u":"/lodestar/contribution/getting-started","h":"#getting-started","p":90},{"i":99,"t":"To run tests: 🧪 Run yarn test:unit for unit tests. 🧪 Run yarn test:e2e for end-to-end tests. 🧪 Run yarn test:spec for spec tests. 🧪 Run yarn test to run all tests. 🧪 Run yarn check-types to check TypeScript types. 🧪 Run yarn lint to run the linter. Note that to run test:e2e, first ensure that the environment is correctly setup by running the run_e2e_env.sh script. This script requires a running docker engine. ./scripts/run_e2e_env.sh start Similarly, run yarn download-spec-tests before running yarn test:spec. Contributing to tests: Test must not depend on external live resources, such that running tests for a commit must be deterministic: Do not pull data from external APIs like execution JSON RPC (instead run a local node). Do not pull unpinned versions from DockerHub (use deterministic tag) or Github (checkout commit not branch). Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment.","s":"Tests","u":"/lodestar/contribution/getting-started","h":"#tests","p":90},{"i":101,"t":"A devcontainer configuration is provided to help speed up linux based development environment setup. It will be used by GitHub Codespaces or directly inside VS Code via your local through this extension.","s":"Devcontainer","u":"/lodestar/contribution/getting-started","h":"#devcontainer","p":90},{"i":103,"t":"Error: [vitest] Cannot mock \"../../src/db/repositories/index.js\" because it is already loaded by \"src/db/beacon.ts\" If you observe any error in tests with matching to above error message, that implies you are loading the mocks in the wrong order. The correct order is to import the mocks first and then the actual module. We suggest to import the mocks on very top before any local modules. ✖ Error: Cannot find package 'async_hooks' imported from If you observe following error running any of the test files that means you are running a file which itself or any dependency of that file imports vitest, but you are not running that file with vitest runner. Try running it with yarn vitest command, not with node command.","s":"Common Issues","u":"/lodestar/contribution/getting-started","h":"#common-issues","p":90},{"i":105,"t":"To fix errors always focus on passing all minimal tests first without running mainnet tests. Spec tests often compare full expected vs actual states in JSON format. A single logical error can cause many spec tests to fail. To focus on a single test at a time you can use vitest's option --bail 1 to stop at the first failed test To then run only that failed test you can run against a specific file as use vitest's filters option -t to run only one case Before running the tests, make sure to switch to the package directory (e.g. packages/beacon-node) to speed up test execution LODESTAR_PRESET=minimal yarn vitest --run --bail 1 --config vitest.spec.config.ts test/spec/presets/sanity.test.ts -t attester_slashing","s":"Debugging Spec Tests","u":"/lodestar/contribution/getting-started","h":"#debugging-spec-tests","p":90},{"i":107,"t":"The docker-compose file requires that a .env file be present in this directory. The default.env file provides a template and can be copied .env: cp default.env .env Beacon node only​ docker-compose up -d Beacon node and validator​ First, you must have keystores and their secrets available locally at ./keystores and your password.txt in ./secrets docker-compose -f docker-compose.yml -f docker-compose.validator.yml up -d Dockerized metrics + local beacon node​ Run a local beacon with --metrics enabled. Then start Prometheus + Grafana with all dashboards in ./dashboards automatically loaded running: ./docker/docker-compose.local_dev.sh","s":"Docker","u":"/lodestar/contribution/getting-started","h":"#docker","p":90},{"i":109,"t":"Unsure where to begin contributing to Lodestar? Here are some ideas! ✏️ See any typos? See any verbiage that should be changed or updated? Go for it! Github makes it easy to make contributions right from the browser. 🔎 Look through our outstanding unassigned issues. (Hint: look for issues labeled good first issue or help-wanted!) 💬 Join our Discord chat!","s":"First Time Contributor?","u":"/lodestar/contribution/getting-started","h":"#first-time-contributor","p":90},{"i":111,"t":"🗒 Create a new issue! Select the type of issue that best fits, and please fill out as much of the information as you can.","s":"Reporting A Bug?","u":"/lodestar/contribution/getting-started","h":"#reporting-a-bug","p":90},{"i":113,"t":"Make sure you're familiar with our contribution guidelines (this document)! Create your own fork of this repository. Make your changes in your local fork. If you've made a code change, make sure to lint and test your changes (yarn lint and yarn test:unit). Make an open pull request when you're ready for it to be reviewed. We review PRs on a regular basis. See Pull request etiquette for more information. You may be asked to sign a Contributor License Agreement (CLA). We make it relatively painless with CLA-bot. Please note that trivial, non-code contributions such as spelling, grammar, typos, corrections, comments and link fixes are not acceptable pull requests. Although we appreciate the effort to fix these valid concerns, it is not practical for us to run our CI systems to accommodate minor external contributions which generate minimal value for the purpose of contribution/airdrop farming. It would be appreciated for you to open up an issue instead for our team to aggregate these types of contributions into a batch commit.","s":"Contribution Process","u":"/lodestar/contribution/getting-started","h":"#contribution-process","p":90},{"i":115,"t":"Branch Naming If you are contributing from this repository prefix the branch name with your Github username (i.e. myusername/short-description) Pull Request Naming Pull request titles must be: Adhering to the conventional commits spec Short and descriptive summary Written in imperative present tense Not end with a period For example: feat: add lodestar prover for execution api fix: ignore known block in publish blinded block flow refactor(reqresp)!: support byte based handlers Pull Request Etiquette Pull requests should remain as drafts when they are not ready for review by maintainers. Open pull requests signal to the maintainers that it's ready for review. If your pull request is no longer applicable or validated to fix an issue, close your pull request. If your pull request is fixable and needs additional changes or commits within a short period of time, switch your pull request into a draft until it's ready. Otherwise, close your pull request and create a new issue instead.","s":"Github Style Guide","u":"/lodestar/contribution/getting-started","h":"#github-style-guide","p":90},{"i":117,"t":"We're currently experimenting with hosting the majority of lodestar packages and support packages in this repository as a monorepo. We're using Lerna to manage the packages. See packages/ for a list of packages hosted in this repository.","s":"Lodestar Monorepo","u":"/lodestar/contribution/getting-started","h":"#lodestar-monorepo","p":90},{"i":119,"t":"Lodestar has migrated to using ES modules. Many module class constructors have the following signature: (options, dependencies) e.g.: public constructor(opts: IExampleOptions, {db, logger}: IExampleModules) Modules should be designed to \"do one thing and do it well!\" Consider the interface of a module -- events included, and make sure it is coherent Make sure your code is properly linted use an IDE that will show linter errors/warnings run yarn lint from the command line common rules: Functions and variables should be camelCase, classes should be PascalCase, constants should be UPPERCASE_WITH_UNDERSCORES. Use \" instead of ' All functions should have types declared for all parameters and return value You shouldn't be using TypeScript type any Private class properties should not be prefixed with a _ e.g.: private dirty;, not private _dirty; Make sure that your code is properly type checked: use an IDE that will show type errors run yarn check-types from the command line Make sure that the tests are still passing: run yarn test:unit from the command line Commenting: If your code does something that is not obvious or deviates from standards, leave a comment for other developers to explain your logic and reasoning. Use // commenting format unless it's a comment you want people to see in their IDE. Use /** */ commenting format for documenting a function/variable. Code white space can be helpful for reading complex code, please add some. For unit tests, we forbid import stubbing when other approaches are feasible. Metrics are a critical part of Lodestar, every large feature should be documented with metrics Metrics need to follow the Prometheus Best Practices For metric names, make sure to add the unit as suffix, e.g. _seconds or _bytes Metric code variables on the other hand should not be suffixed, i.e. Sec-suffix should be omitted Time-based metrics must use seconds as the unit","s":"Style Guide","u":"/lodestar/contribution/getting-started","h":"#style-guide","p":90},{"i":121,"t":"Test must not depend on external live resources, such that running tests for a commit must be deterministic: Do not pull data from external APIs like execution JSON RPC (instead run a local node). Do not pull unpinned versions from dockerhub (use deterministic tag) or Github (checkout commit not branch). Carefully design tests that depend on timing sensitive events like p2p network e2e tests. Consider that Github runners are significantly less powerful than your development environment. Add assertion messages where possible to ease fixing tests if they fail. If an assertion message is called from multiple times with the same stack trace, you MUST include an assertion message. For example, if an assertion is inside a for loop add some metadata to be able to locate the error source: for (const blockResult of blocksResult) { expect(blockResult.status).equals(\"processed\", `wrong block ${blockResult.id} result status`); }","s":"Tests style guide","u":"/lodestar/contribution/getting-started","h":"#tests-style-guide","p":90},{"i":124,"t":"Contributors must choose the log level carefully to ensure a consistent experience for every type of user: error: Critical issues that prevent the application from functioning correctly or cause significant disruption to users. Examples include failed network connections, crashes, or data corruption. warn: Situations that may lead to critical issues if not addressed but do not prevent the application from functioning. Examples include configuration issues, deprecated features, or temporary network disruptions. info: General sporadic informational about the node's state. Examples include initialization messages, infrequent periodic status updates, or high-level progress reports. debug: Detailed diagnostic information that can help developers or users troubleshoot specific issues. Examples include individual request logs for every REST API, networking interactions, or internal components status changes. Alias to verbose.","s":"Logging Levels","u":"/lodestar/contribution/getting-started","h":"#logging-levels","p":90},{"i":126,"t":"Avoid excessive logging. Log messages should be clear and concise, providing enough information to understand the context and severity of the issue. Do not log sensitive data, such as private keys, user credentials, or personal information. Do not log arbitrary data from the network as ASCII or UTF8 at levels higher or equal to info. Use clear and concise language. Prefer to log variables in JSON format log.debug(\"Action\", {slot}) instead of formatting the text yourself log.debug('slot=${slot}'). Include only relevant context in log messages, sufficient to debug the issue or action it refers to.","s":"Logging guidelines","u":"/lodestar/contribution/getting-started","h":"#logging-guidelines","p":90},{"i":128,"t":"To edit or extend an existing Grafana dashboard with minimal diff: Grab the .json dashboard file from current unstable Import the file to Grafana via the web UI at /dashboard/import without modifying the UID of the dashboard Visually edit the dashboard Once done make sure to leave the exact same visual aspect as before: same refresh interval, time range, etc. Save the dashboard (CTRL+S) Run download script, see below on how to use it Check git diff of updated dashboards, commit, push and open your PR","s":"Contributing to Grafana dashboards","u":"/lodestar/contribution/getting-started","h":"#contributing-to-grafana-dashboards","p":90},{"i":130,"t":"Create a file .secrets.env with envs GRAFANA_API_KEY=$token GRAFANA_URL=https://yourgrafanaapi.io Run script to download dashboards to ./dashboards folder node scripts/download_dashboards.mjs","s":"Using Download Script","u":"/lodestar/contribution/getting-started","h":"#using-download-script","p":90},{"i":132,"t":"When submitting PRs for documentation updates, build and run the documentation locally to ensure functionality before submission. First generate the CLI documentation with yarn docs:build. Then build and serve the documentation locally with yarn docs:serve. Your locally served documentation will then be accessible at http://localhost:3000/lodestar/. We also use a spelling word list as part of our documentation checks. If using unrecognized words or abbreviations, please extend the word list to pass checks. Make sure the list is sorted with ./scripts/wordlist_sort.sh and checked with ./scripts/wordlist_sort_check.sh for sorting and duplicates.","s":"Contributing to Documentation","u":"/lodestar/contribution/getting-started","h":"#contributing-to-documentation","p":90},{"i":134,"t":"Issues and pull requests are subject to the following labeling guidelines. PRs may have a status label to indicate deviation from the normal process such as status-blocked or status-do-not-merge Issues and PRs will be tagged with a scope and prio to indicate type and priority for triage. All other labels allow for further evaluation and organization. Label descriptions can be found below. status.* Issues and Pull Request Status​ Status labels apply to issues and pull requests which deviate from normal processes. scope.* Scope Indicator​ Scope is comparable to Module labels but less strict with the definition of components. It applies to both, issues and pull requests. prio.* Prioritization Indicator​ A simple indicator of issue prioritization. It mainly applies to issues. spec.* Ethereum Consensus Spec Version Target​ Issues that target a specific version of the Ethereum consensus spec, shall be tagged accordingly.","s":"Label Guide","u":"/lodestar/contribution/getting-started","h":"#label-guide","p":90},{"i":136,"t":"Come chat with us on Discord and join our public weekly planning meetings!","s":"Community","u":"/lodestar/contribution/getting-started","h":"#community","p":90},{"i":138,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"Performance Tests","u":"/lodestar/contribution/testing/performance-tests","h":"","p":137},{"i":140,"t":"Testing is critical to the Lodestar project and there are many types of tests that are run to build a product that is both effective AND efficient. This page will help to break down the different types of tests you will find in the Lodestar repo. There are a few flags you can set through env variables to override behavior of testing and its output. ENV variable Effect Impact TEST_COMPACT_DIFF All Will strip down the object difference rendered during test failures. Very useful for large object matching. TEST_QUIET_CONSOLE All Will strip down console output. Reduce console flickering. TEST_COMPACT_OUTPUT All Display a condensed summary of tests run. Use vitest basic reporter.","s":"Testing","u":"/lodestar/contribution/testing/","h":"","p":139},{"i":142,"t":"This is the most fundamental type of test in most code bases. In all instances mocks, stubs and other forms of isolation are used to test code on a functional, unit level. See the Unit Tests page for more information.","s":"Unit Tests","u":"/lodestar/contribution/testing/","h":"#unit-tests","p":139},{"i":144,"t":"The Ethereum Consensus Specifications are what ensure that the various consensus clients do not diverge on critical computations and will work harmoniously on the network. See the Spec Tests page for more information.","s":"Spec Tests","u":"/lodestar/contribution/testing/","h":"#spec-tests","p":139},{"i":146,"t":"Node.js is an unforgiving virtual machine when it comes to high performance, multi-threaded applications. In order to ensure that Lodestar can not only keep up with the chain, but to push the boundary of what is possible, there are lots of performance tests that benchmark programming paradigms and prevent regression. See the Performance Testing page for more information.","s":"Performance Tests","u":"/lodestar/contribution/testing/","h":"#performance-tests","p":139},{"i":148,"t":"E2E tests are where Lodestar is run in its full form, often from the CLI as a user would to check that the system as a whole works as expected. These tests are meant to exercise the entire system in isolation and there is no network interaction, nor interaction with any other code outside of Lodestar. See the End-To-End Testing page for more information.","s":"End-To-End Tests","u":"/lodestar/contribution/testing/","h":"#end-to-end-tests","p":139},{"i":150,"t":"Integration tests are meant to test how Lodestar interacts with other clients, but are not considered full simulations. This is where Lodestar may make API calls or otherwise work across the process boundary, but there is required mocking, stubbing, or class isolation. An example of this is using the ExecutionEngine class to make API calls to a Geth instance to check that the http requests are properly formatted.","s":"Integration Tests","u":"/lodestar/contribution/testing/","h":"#integration-tests","p":139},{"i":152,"t":"These are the most comprehensive types of tests. They aim to test Lodestar in a fully functioning ephemeral devnet environment. See the Simulation Testing page for more information.","s":"Simulation Tests","u":"/lodestar/contribution/testing/","h":"#simulation-tests","p":139},{"i":154,"t":"\"Sim\" testing for Lodestar is the most comprehensive, and complex, testing that is run. The goal is to fully simulate a testnet and to actuate the code in a way that closely mimics what will happen when turning on Lodestar in the wild. This is a very complex task and requires a lot of moving parts to work together. The following sections will describe the various components and how they work together. At a very high level, simulation testing will setup a testnet from genesis and let proceed through \"normal\" execution exactly as the nodes would under production circumstances. To get feedback there are regular checks along the way to asses how the testnet nodes are working. These \"assertions\" can be added and removed at will to allow developers to check for specific conditions in a tightly controlled, reproducible, environment to get high quality and actionable feedback on how Lodestar performs. The end goal of these tests is to to run a full Lodestar client in an environment that is as close to what an end user would experience. These tests usually setup full testnets with multiple consensus clients and their paired execution node. In many instance we are looking to just exercise the Lodestar code but there are some places where there is also testing to see how Lodestar works in relation to the other consensus clients, like Lighthouse. As you can imagine, there is quite a bit of machinery that is responsible for setting up and managing the simulations and assertions. This section will help to go over those bits and pieces. Many, but not all, of these classes can be found in packages/cli/test/utils/simulation.","s":"Simulation Tests","u":"/lodestar/contribution/testing/simulation-tests","h":"","p":153},{"i":156,"t":"There are a number of sim tests that are available and each has a slightly different purpose. All are run by CI and must pass for a PR to be valid for merging. Most tests require a couple of environment variables to be set.","s":"Running Sim Tests","u":"/lodestar/contribution/testing/simulation-tests","h":"#running-sim-tests","p":153},{"i":158,"t":"To see what typical values for these are check out the .env.test file in the root directory. GETH_DOCKER_IMAGE: The geth docker image that will be used NETHERMIND_IMAGE: The nethermind docker image that will be used LIGHTHOUSE_IMAGE: The lighthouse docker image that will be used","s":"Environment Variables","u":"/lodestar/contribution/testing/simulation-tests","h":"#environment-variables","p":153},{"i":160,"t":"The multi-fork sim test checks most of the functionality Lodestar provides. Is verifies that Lodestar is capable of peering, moving through all of the forks and using various sync methods in a testnet environment. Lodestar is tested with both Geth and Nethermind as the execution client. It also checks a Lighthouse/Geth node for cross client compatibility. yarn workspace @chainsafe/lodestar test:sim:multifork","s":"test:sim:multifork","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmultifork","p":153},{"i":162,"t":"This tests that various endpoints of the beacon node and validator client are working as expected. yarn workspace @chainsafe/lodestar test:sim:endpoints","s":"test:sim:endpoints","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimendpoints","p":153},{"i":164,"t":"This test is still included in our CI but is no longer as important as it once was. Lodestar is often the first client to implement new features and this test was created before geth was upgraded with the features required to support the Deneb fork. To test that Lodestar was ready this test uses mocked geth instances. It is left as a placeholder for when the next fork comes along that requires a similar approach.","s":"test:sim:deneb","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimdeneb","p":153},{"i":166,"t":"Checks that Lodestar is compatible with other consensus validators and vice-versa. All tests use Geth as the EL. yarn workspace @chainsafe/lodestar test:sim:mixedclient","s":"test:sim:mixedcleint","u":"/lodestar/contribution/testing/simulation-tests","h":"#testsimmixedcleint","p":153},{"i":168,"t":"When setting up and running the simulations, interactions with the nodes is through the published node API's. All functionality is actuated via http request and by \"plugging in\" this way it is possible to run the nodes in a stand-alone fashion, as they would be run in production, but to still achieve a tightly monitored and controlled environment. If code needs to be executed on a \"class by class\" basis or with mocking involved then the test is not a simulation test and would fall into one of the other testing categories. See the Testing Overview page for more information on the other types of tests available for Lodestar.","s":"Sim Test Infrastructure","u":"/lodestar/contribution/testing/simulation-tests","h":"#sim-test-infrastructure","p":153},{"i":170,"t":"The simulation environment has many pieces and those are orchestrated by the SimulationEnvironment class. The testnet nodes will be run as a mixture of Docker containers and bare metal code execution via Node.js. In order to monitor the various clients there is a SimulationTracker that's primary function is to register assertions that will track and gauge how the nodes are doing during the simulation. See the section on Simulation Assertions below for more information on them. There is an EpochClock that has helper functions related to timing of slots and epochs and there is also a Runner that will help to start/stop the various Docker container and spawn the Node.js child processes as necessary. The SimulationEnvironment is the orchestrator for all the various functions to great the test net and start it from genesis. It is also how the various forks are configured to exercise code through various fork transitions.","s":"Simulation Environment","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-environment","p":153},{"i":172,"t":"These are the secret sauce for making the simulation tests meaningful. There are several predefined assertions that can be added to a simulation tracker and one can also create custom assertions and add them to the environment. Assertions can be added per slot, per epoch, per fork or per node. They can even be added to check conditions across nodes. Assertions are added to the SimulationTracker with the register method and the tracker follows the environment to make sure that assertions are run at the appropriate times, and on the correct targets. Assertions are implemented via API calls to the various targets and meta from the API calls is stored and used to assert that the desired conditions were met. Any information that can be retrieved via API call can be added to the assertion stores for validation, and validations can be asserted at a specific time or on an interval. There are a number of assertions that are added to simulations by default. They are: inclusionDelayAssertion attestationsCountAssertion attestationParticipationAssertion connectedPeerCountAssertion finalizedAssertion headAssertion missedBlocksAssertion syncCommitteeParticipationAssertion Because of the flexibility, and complexity, there is a section specifically for how to create custom assertions below. See custom assertions for more info.","s":"Simulation Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-assertions","p":153},{"i":174,"t":"Check back soon for more information on how to create custom assertions.","s":"Custom Assertions","u":"/lodestar/contribution/testing/simulation-tests","h":"#custom-assertions","p":153},{"i":176,"t":"Sim tests that are run using the simulation framework output a table of information to the console. The table summarizes the state of all of the nodes and the network at each slot. Here is an example of the table and how to interpret it: ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ │ fork │ eph │ slot │ head │ finzed │ peers │ attCount │ incDelay │ errors │ ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ │ capella │ 9/0 │ 72 │ 0x95c4.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/1 │ 73 │ 0x9dfc.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/2 │ 74 │ 0xdf3f.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/3 │ 75 │ 0xbeae.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/4 │ 76 │ 0x15fa.. │ 56 │ 3 │ 16 │ 1.00 │ 0 │ │ capella │ 9/5 │ 77 │ 0xf8ff.. │ 56 │ 2,3,3,2 │ 16 │ 1.00 │ 0 │ │ capella │ 9/6 │ 78 │ 0x8199.. │ 56 │ 2,3,3,2 │ 16 │ 1.20 │ 0 │ │ capella │ 9/7 │ 79 │ different │ 56 │ 2,3,3,2 │ 16 │ 1.50 │ 2 │ ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ │ Att Participation: H: 0.75, S: 1.00, T: 0.75 - SC Participation: 1.00 │ ┼─────────────────────────────────────────────────────────────────────────────────────────────────┼ Slot Information​ fork: shows what fork is currently being tested eph: During simulation tests the Lodestar repo is setup to use 8 slot per epoch so what is shown is the epoch number and the slot number within that epoch as epoch/slot slot: The slot number that is currently being processed head: If all clients have the same head the first couple of bytes of the hash are shown. If all clients do not have the same head different is reported. finzed: Shows the number of the last finalized slot peers: The number of peers that each node is connected to. If all have the same number then only a single value is shown. If they do not have the same number of peers count for each node is reported in a comma-separated list attCount: The number of attestations that the node has seen. incDelay: The average number of slots inclusion delay was experienced for the attestations. Often attestations for the current head arrive more than one slot behind and this value tracks that errors: The number of errors that were encountered during the slot Epoch Information​ H: The percentage of nodes, at epoch transition, that voted for the head block S: The percentage of nodes, at epoch transition, that voted for the source block T: The percentage of nodes, at epoch transition, that voted for the target block SC Participation: The sync committee participation rate","s":"Simulation Reports","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-reports","p":153},{"i":178,"t":"The simulation environment will capture all of the logs from all nodes that are running. The logs can be found in the packages/cli/test-logs directory. The logs are named with the following convention: -_.log Some examples are: node-1-beacon_lodestar.log: The is the first node in the simulation. It is the consensus layer. It is running the lodestar validator client. range-sync-execution_geth.log: This is the node that was added to test pulling history in range sync mode. It was the execution layer and was running the geth execution client.","s":"Simulation Logging","u":"/lodestar/contribution/testing/simulation-tests","h":"#simulation-logging","p":153},{"i":180,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"Specification Tests","u":"/lodestar/contribution/testing/spec-tests","h":"","p":179},{"i":182,"t":"This page describes different approaches for debugging Lodestar.","s":"Debugging","u":"/lodestar/contribution/tools/debugging","h":"","p":181},{"i":184,"t":"The simplest way to debug is to use the provided launch.template.json configurations. Copy them as .vscode/launch.json and they will be made available in the Run and Debug section in VS Code. Adapt as needed, e.g. by adding additional arguments to the beacon configuration to match your needs. VS Code supports debugging Workers out of the box when using those configurations.","s":"VS Code launch config","u":"/lodestar/contribution/tools/debugging","h":"#vs-code-launch-config","p":181},{"i":186,"t":"Remote lodestar processes can also be debugged by leveraging node:inspector. Adding --inspect to the node CLI (e.g. NODE_OPTIONS=--inspect ./lodestar beacon) allows to debug the main thread. To debug a specific Worker, follow those steps: remove --inspect from node CLI add following code to the worker import inspector from \"node:inspector\"; inspector.open(); inspector.waitForDebugger(); Use VS Code or Chrome devtools to debug those processes.","s":"Attach to running process","u":"/lodestar/contribution/tools/debugging","h":"#attach-to-running-process","p":181},{"i":188,"t":"Core dump analysis is some ninja level stuff. Once you get the hang of it you will feel like you have super powers. It will up your game to a whole new level because you will be able to debug issues that seemed impossible before. Post-crash analysis is a very powerful tool to have in your tool belt. A core dump has all of the objects in memory as well as all of the stack frame information at the exact moment the dump was taken, usually when a hard crash occurs. It is important to note that debug symbols will greatly aid you in your debugging for issues related to native code like C/C++. When compiled languages are optimized the compiler will often strip out identifiers and all that will be remaining are mangled symbols and addresses. Compiling with debug symbols will leave all of the identifiers, file names and line numbers in-tact. While it is not always practical to be running code in a Debug version of node, if you run across a persistent issue it will be helpful to recreate it on a debug build and to use that for analysis. It is important to note that the EXACT binary that was running when the dump was created MUST be loaded when doing analysis. There is a lot of information in the dump that is specific to the binary that was running (like function offsets, etc). If you load a different binary you will get a lot of errors and the analysis will not be useful (if it loads at all). It is also a nice-to-know that you can create the dump on linux, using a linux compiled version of node, and then read it on a mac. All that is needed is to download the node binary and dump file to the mac. It is possible to load them into a mac compiled version of llnode and all will work as expected. Its just the meta in the linux binary that is needed for analysis, it doesn't actually run the code.","s":"Core Dump Analysis","u":"/lodestar/contribution/tools/core-dumps","h":"","p":187},{"i":190,"t":"llnode is a Node.js plugin for the LLDB debugger. It is the officially sanctioned tool from Node and powerful way to do postmortem analysis of Node.js processes. The process for install is pretty straight-forward unless you have an M1 mac. XCode ships with an instance of lldb and installing llnode is as simple as running npm install -g llnode. On an M1 mac the install will work fine but the plugin will crash at load time. See this issue for updates. The workaround is to install lldb via homebrew. # should only be necessary on M1 macs at time of writing $ brew install llvm $ echo 'export PATH=\"/opt/homebrew/opt/llvm/bin:$PATH\"' >> ~/.zshrc $ # note that its before recopying PATH to make sure it resolves $ zsh ~/.zshrc $ which llvm-config /opt/homebrew/opt/llvm/bin/llvm-config # if this is not what comes up restart the shell $ npm install -g llnode $ llnode (lldb) plugin load '/Users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib' (lldb) settings set prompt '(llnode) ' (llnode)","s":"Installing llnode","u":"/lodestar/contribution/tools/core-dumps","h":"#installing-llnode","p":187},{"i":192,"t":"Before a core dump can be created the system must be enabled. ulimit -c unlimited This is a critical step. If that command is not run the core will not be dumped to disk. Core dumps are normally created by the kernel when certain process signals are encountered. SIGSEGV is the most common signal that will cause a dump and its sent by the kernel to the process when a segfault occurs. SIGSEGV is not the only signal that works and you can see the full list here under the \"Standard Signals\" section (all the ones that say \"Core\" in the \"Action\" column). If you want to create a dump on demand you can use the gcore command on linux. This will create a dump of the process without killing it. If you don't mind termination you can also use kill -SIGSEGV to send the a dump signal to the process.","s":"Collecting a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#collecting-a-core-dump","p":187},{"i":194,"t":"Once you collect the core dump you can load it into llnode for debugging. # remember that the node binary must be the exact same one that was running when the core was created $ llnode -f /path/to/node_debug -c /Users/ninja_user/coredumps/node.coredump (lldb) target create \"node_debug\" --core \"node.coredump\" Core file '/Users/ninja_user/coredumps/node.coredump' (x86_64) was loaded. (lldb) plugin load '/Users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib' (lldb) settings set prompt '(llnode) ' (llnode) Once the dump is loaded the first few steps will be to figure out what types of objects were in memory and what was the processor working on when the crash occurred. Lets start with the stack trace. There are two distinct commands for pulling the stack because node is both a native runtime and a virtual machine. The bt, back trace, command will pull the native stack frames and the v8 bt command will use the llnode plugin to pull the JavaScript stack frames. Newer versions of llnode will automatically pull the JavaScript stack frames when the bt command is run but it is still good to know the difference. It is also possible to add the all verb to the bt command and it will pull the back trace for all threads. To start looking through memory there are two commands that are helpful. The v8 findjsobjects command will list all of the JavaScript objects in memory. The v8 findjsinstances command will list all of the instances of a particular JavaScript object.","s":"Analyzing a core dump","u":"/lodestar/contribution/tools/core-dumps","h":"#analyzing-a-core-dump","p":187},{"i":197,"t":"This guide assumes a running instance of Lodestar and will walk through how to generate a flamegraph for the process while running on Linux. While it is possible to run Lodestar in a number of ways, for performance profiling it is recommended to not use Dockerized implementations. It is best to run Lodestar as a service on a Linux machine. Follow the Lodestar docs to get the service installed and running. Then come back here when you are ready to generate the flamegraph.","s":"Generating Flamegraphs for a Running Node Service on Linux","u":"/lodestar/contribution/tools/flamegraphs","h":"","p":196},{"i":199,"t":"Use the following two commands to install perf for generating the stack traces. You may get a warning about needing to restart the VM due to kernel updates. This is nothing to be concerned with and if so, cancel out of the restart dialog. sudo apt-get install linux-tools-common linux-tools-generic sudo apt-get install linux-tools-`uname -r` # empirically this throws if run on the same line above Next we need to update the Lodestar service by modifying the start script. We need to add a necessary flag --perf-basic-prof to allow the stack traces to be useful. Node is a virtual machine and perf is designed to capture host stack traces. In order to allow the JavaScript functions to be captured meaningfully, v8 can provide some help. Generally Lodestar is started with a script like the following:","s":"Modifying Linux and Lodestar","u":"/lodestar/contribution/tools/flamegraphs","h":"#modifying-linux-and-lodestar","p":196},{"i":201,"t":"node \\ --perf-basic-prof \\ --max-old-space-size=8192 \\ /usr/src/lodestar/packages/cli/bin/lodestar \\ beacon \\ --rcConfig /home/devops/beacon/rcconfig.yml After updating the start script, restart the node process running the beacon service. Note in the command below, that the beacon service may have a different name or restart command, depending on your setup. admin@12.34.56.78: sudo systemctl restart beacon The flag that was added notifies V8 to output a map of functions and their addresses. This is necessary for perf to generate the stack traces for the virtual machine in addition to the traditional host stack traces. There is a very small, performance overhead to output the maps. After a short while, once the process runs for a bit the functions will no longer be moving in memory and the overhead will be significantly reduced. The VM will still be moving objects around but this flag is generally safe to run in production. After a few minutes of running, listing the directory with the start script (process.cwd()) will look similar: -rw-r--r-- 1 admin admin 9701529 May 22 00:36 beacon-2023-05-22.log -rwxrwxr-x 1 admin root 421 May 22 00:31 beacon_run.sh drwxr-xr-x 2 admin admin 917504 May 22 00:35 chain-db -rw-r--r-- 1 admin admin 2861242 May 22 00:36 isolate-0x6761520-2085004-v8.log -rw-r--r-- 1 admin admin 203172 May 22 00:36 isolate-0x7fa2f0001060-2085004-v8.log -rw-r--r-- 1 admin admin 68044 May 22 00:36 isolate-0x7fcd80001060-2085004-v8.log -rw-r--r-- 1 admin admin 420809 May 22 00:36 isolate-0x7fcd84001060-2085004-v8.log -rw-r--r-- 1 admin admin 123919 May 22 00:36 isolate-0x7fcd88001060-2085004-v8.log -rw-r--r-- 1 admin admin 94391 May 22 00:35 isolate-0x7fcd8c001060-2085004-v8.log -rw-r--r-- 1 admin admin 183831 May 22 00:36 isolate-0x7fcd90000e60-2085004-v8.log -rw-r--r-- 1 admin admin 152786 May 22 00:36 isolate-0x7fcd94000e60-2085004-v8.log -rw-r--r-- 1 admin admin 262333 May 22 00:36 isolate-0x7fcd98000e60-2085004-v8.log -rw-r--r-- 1 admin admin 218473 May 22 00:36 isolate-0x7fcd9c000e60-2085004-v8.log -rw-r--r-- 1 admin admin 366788 May 22 00:36 isolate-0x7fcda0000e60-2085004-v8.log -rw-r--r-- 1 admin admin 304917 May 22 00:36 isolate-0x7fcda4000e60-2085004-v8.log -rw-r--r-- 1 admin admin 586238 May 22 00:36 isolate-0x7fcda8000e60-2085004-v8.log -rw-r--r-- 1 admin admin 450675 May 22 00:36 isolate-0x7fcdac000e60-2085004-v8.log -rw-r--r-- 1 admin admin 768470 May 22 00:36 isolate-0x7fcdb8000d60-2085004-v8.log -rw-r--r-- 1 admin root 559 May 21 14:17 rcconfig.yml The isolate-*-v8.log files are the maps that v8 outputs for the perf command to reference. You are now ready to collect the stack traces.","s":"Example start_lodestar.sh","u":"/lodestar/contribution/tools/flamegraphs","h":"#example-start_lodestarsh","p":196},{"i":203,"t":"The first command below will run perf for 60 seconds, and then save the output to a file named perf.out. The second one will merge the exported, unknown, tokens with the isolate maps and output full stack traces for the render. Running both perf commands in the folder with the isolate maps will allow the data to be seamlessly spliced. Once the output is saved, update the permissions so the file can be copied to your local machine via scp. You can modify the frequency of capture by changing -F 99 to a different number. Try to stay away from whole numbers as they are more likely to cause interference with periodically scheduled tasks. As an example use 99Hz or 997Hz instead of 100Hz or 1000Hz. In testing neither seemed to have an appreciable affect on CPU usage when run for a short period of time. To change the period of capture adjust the sleep duration (which is in seconds). The pgrep command is used to find the process id to capture against. Feel free to pass a number to the -p flag if you know the process id, or adjust the file path if the executable is in a different location. admin@12.34.56.78: sudo perf record -F 99 -p $(pgrep -f '/usr/src/lodestar/packages/cli/bin/lodestar beacon') -g -- sleep 60 admin@12.34.56.78: sudo perf script -f > perf.out admin@12.34.56.78: sudo chmod 777 ~/beacon/perf.out And then copy the perf.out file to your local machine to render the flamegraph. Running at 99Hz for 180 seconds results in a file size of about 3.5MB and 997Hz for 60 seconds is roughly 4.4MB. scp admin@12.34.56.78:/home/devops/beacon/out.perf /some_temp_dir/perf.out","s":"Capturing Stack Traces","u":"/lodestar/contribution/tools/flamegraphs","h":"#capturing-stack-traces","p":196},{"i":205,"t":"By far the best tool to render flamegraphs is flamescope from Netflix. It allows for easy analysis and zooming into specific time periods. It also give a holistic view of how the process is performing over time.","s":"Rendering a Flamegraph","u":"/lodestar/contribution/tools/flamegraphs","h":"#rendering-a-flamegraph","p":196},{"i":207,"t":"Python3 is required. Clone the repository and install the dependencies: The original is no longer maintained and had a configuration bug. This is a fork that fixes the issue. git clone https://github.com/matthewkeil/flamescope cd flamescope pip3 install -r requirements.txt yarn","s":"Installation","u":"/lodestar/contribution/tools/flamegraphs","h":"#installation","p":196},{"i":209,"t":"mv /some_temp_dir/perf.out /path/to/flamescope/examples yarn dev Then navigate in a browser to http://localhost:8080 and begin analyzing the data.","s":"Usage","u":"/lodestar/contribution/tools/flamegraphs","h":"#usage","p":196},{"i":211,"t":"There can be a lot of \"noise\" in the stack traces with libc, v8 and libuv calls. It is possible to filter the results to make it more useful, but note this will skew the results. Looking at the graph both filtered and unfiltered can be beneficial. The following sed command will remove the noise from the stack traces. sed -r -e \"/( __libc_start| uv_| LazyCompile | v8::internal::| node::| Builtins_| Builtin:| Stub:| LoadIC:| \\\\[unknown\\\\]| LoadPolymorphicIC:)/d\" -e 's/ LazyCompile:[*~]?/ /'","s":"Filtering Results","u":"/lodestar/contribution/tools/flamegraphs","h":"#filtering-results","p":196},{"i":216,"t":"https://www.brendangregg.com/flamegraphs.html https://nodejs.org/en/docs/guides/diagnostics-flamegraph https://netflixtechblog.com/netflix-flamescope-a57ca19d47bb https://jaanhio.me/blog/nodejs-flamegraph-analysis/ (this was a great one about filtering methodology) https://medium.com/voodoo-engineering/node-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2","s":"List of Web References","u":"/lodestar/contribution/tools/flamegraphs","h":"#list-of-web-references","p":196},{"i":218,"t":"flamescope","s":"Visualization Tools","u":"/lodestar/contribution/tools/flamegraphs","h":"#visualization-tools","p":196},{"i":220,"t":"https://www.brendangregg.com/perf.html https://www.brendangregg.com/linuxperf.html https://www.brendangregg.com/blog/2014-09-17/node-flame-graphs-on-linux.html https://perf.wiki.kernel.org/index.php/Main_Page","s":"Collecting on Linux","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-linux","p":196},{"i":222,"t":"https://gist.github.com/zeusdeux/aac6f8500917319213c5 https://gist.github.com/loderunner/36724cc9ee8db66db305 https://keith.github.io/xcode-man-pages/xctrace.1.html","s":"Collecting on MacOS","u":"/lodestar/contribution/tools/flamegraphs","h":"#collecting-on-macos","p":196},{"i":224,"t":"There are a number of reason why one would want to do a heap dump but in particular, they are helpful for find memory intensive operations and leaks. There are two major types of heap dumps that are available to node developers. The first is a JavaScript heap dump, and the second is a native heap dump. The JS heap dump is much more common and is the default heap dump that is generated by node. It is useful when analyzing JS generated objects that are managed by the runtime. However there is one major limitation to the JS heap dump, and that is that it does not include native objects. This is where the native heap dump comes in handy. The native heap dump is a snapshot of the entire process memory, and includes objects that are allocated by C/C++ code, including native modules in use by the application. The limitation to the native heap dump is that it will not include any JS objects that are allocated by the V8 runtime. Those are generally created within mmap'ed pages and the native heap dump tools are specific to C objects that are created with malloc and destroyed via free. C++ is also covered as new and delete are wrappers around malloc and free. This is why it is important to understand how to analyze both types of memory usage.","s":"Heap Dump Analysis","u":"/lodestar/contribution/tools/heap-dumps","h":"","p":223},{"i":226,"t":"Node has built in V8 heap dump access and its a very powerful tool for analyzing memory usage. Understanding how the dump is created will both help to understand how it is displayed and how to use the analysis more effectively. The V8 heap dump is a stop the world process because walking the entire heap graph is necessary to create one. This is similar to a full, major garbage collection event. The VM starts at the heap entrance node and walks the entire graph and makes note of every edge that connects each node along the way. Nodes are JSObjects and edges are references between those objects. By time the whole heap is walked the full size and values of all nodes are known and all of the connections between those nodes is well understood. The object that is returned is a set of three arrays, the nodes, the edges and the string values that are encountered (because strings are themselves arrays of characters in C so they are treated a bit differently by V8).","s":"JavaScript Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#javascript-heap-dump","p":223},{"i":228,"t":"There are two functions for creating a heap dump but both call the same functionality under the hood. One streams the result, require(\"v8\").getHeapSnapshot([options]), and is primarily intended for use by the Chrome devtools button to \"take a snapshot\". The second writes the heap dump to a file, require(\"v8\").writeHeapSnapshot(filename[,options]). The optional options argument, in both cases, is the same and contains two props.exposeInternals and exposeNumericValues to enrich the dump. In many cases its the application layer that one wants to debug so exposeInternals is not usually necessary. In V8 numbers are stored as 32bit integers and the size of pointers is also 32bits. So as an optimization, the pointer to the numeric value can be eliminated and the value itself can be stored in the Address of the Value instead. exposeNumericValues transcribes those \"pointers\" to the actual numeric value and appends them to the dump. Because heap analysis happens frequently during Lodestar development there is a helper api endpoint to capture a heap dump. It is IMPORTANT that this endpoint is not public facing as it will open the threat of DDOS attack. The endpoint accepts a POST request and you may include an optional dirpath query parameter to specify the directory where the heap dump will be written. If the dirpath is not specified then the heap dump will be written to the current working directory. To create a Lodestar heap dump you can use the following command: curl -X POST http://localhost:9596/eth/v1/lodestar/write_heapdump?dirpath=/some/directory/path","s":"Creating a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#creating-a-v8-heap-dump","p":223},{"i":230,"t":"It is best to analyze on a local development machine so if Lodestar is running on a cloud instance download the dump to the local environment. Open Chrome, or any Chromium based browser (the example photos were taken using Brave). In the url bar type chrome:://inspect to bring up the DevTools menu (in brave the url will be rewritten to brave://inspect). Click on the Open dedicated DevTools for Node link to open the node specific window and click on the Memory tab as shown below. Load the profile by either right-clicking on the left pane or by clicking the Load button at the bottom.","s":"Viewing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#viewing-a-v8-heap-dump","p":223},{"i":232,"t":"Analysis is as much an art as it is a science and the best way to learn is to do it a few times. Generally the goal is looking for memory leaks but reducing memory overhead is also something that happens. This guide will focus on leaks. With memory leaks one is looking for why objects have references that prevent them from being garbage collected. To spot sources of leaks, focus on objects that have large quantities or very large retained size. Retained size is the amount of memory that would be freed if the object was garbage collected. As an example if there is an object that has lots and lots of instances, like 100,000, and they are all pushed into an array then the array will have a very large retained size. This is because the array is holding references to all of the objects that it contains. If it is not immediately apparent what objects are being leaked then another tool in your arsenal will be to take a second snapshot and compare it to the first. This will show what objects have been created/changed since the first snapshot. If there is an object that has a large retained size but is roughly the same, but not exactly the same, changes are that is NOT the leak. Some objects can get quite large during runtime but if its roughly the same size over time, but not exactly the same, it means that the application is modifying the object (why its not exactly identical in size) but if it hasn't grown significantly over time it can be assumed it is probably the working size of the instances. Try to focus on objects that are growing in size or in number over time. Growing in size means the object is holding references to other objects and growing in number means a function closure somewhere is retaining the small instances. That is the science part, but these clues are just breadcrumbs to follow. In order to actually resolve the leak, one needs to go into the code to figure out where those objects are being created, or more often, why the references to them are being retained. This is where the art comes in. Having a good understanding of the codebase will help to narrow down where to look. It is also common that the leak is not coming directly from Lodestar code, but rather one of the dependencies so be careful not to rule those out.","s":"Analyzing a V8 heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#analyzing-a-v8-heap-dump","p":223},{"i":234,"t":"note: collecting a native heap dump is only supported on linux, analysis can be done from linux or Mac There are several tools that can be used to do native heap dump analysis. The most common are massif from the Valgrind suite, google's gperftools and heaptrack from KDE. Of the three, heaptrack is the most user-friendly tool, and it is specifically designed for the task. It is much faster than Valgrind, easier to integrate than gperftools and also includes a gui for result analysis. Often times there are also memory allocations that are not related to memory leaks, and tools like Valgrind and gperftools become less useful. This is why heaptrack is the recommended tool for heap dump analysis on Lodestar. There are a few things that will make the results with heaptrack far better. The most important is using debug builds of all libraries included in a binary, including the application itself. This will make the results usable. Not to say that they will be useless without debug symbols but it will be kinda tough to optimize functions without knowing the function names nor the file and line numbers. This is the heart of what heaptrack will do for us. It hooks into the memory allocation and adds in stack traces for each malloc call site. That way every time memory is reserved there is a way to track back where it happened in the code. heaptrack also hooks into the free function and checks that versus the allocations to check for memory leaks and for temporary variables that can be optimized. This also allows for optimization of how many of each object is created by identifying high frequency allocations. Generally the .heapdump file will be created on a cloud server and then copied to a local machine for analysis, mostly because the gui is not available through ssh. The gui is not required for analysis but it is much easier to use than the command line tools. The first step will be to install heaptrack on the target server and to capture a profile.","s":"Native Heap Dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#native-heap-dump","p":223},{"i":236,"t":"Assume the following directory structure: ├── beacon-node │ ├── db │ ├── logs │ ├── start-lodestar.sh │ └── rc-config.yml ├── lodestar └── node # step below will clone this repo We will start from the directory that contains lodestar and the beacon-node files. # Install heaptrack $ sudo apt-get update $ sudo apt-get -y install heaptrack # Using a debug build of node is recommended and it can be build # from source. Clone the node repo to get started. $ git clone https://github.com/nodejs/node.git $ cd node # Use whichever version of node you prefer $ git checkout v22.1.0 $ ./configure --debug # This command only builds the debug version of node and assumes # that a release version of node is already installed on the system $ make -C out BUILDTYPE=Debug -j$(nproc --all) # Move the debug version of node the same folder that the release # version is installed in and name it `node_debug`. This will put the # debug binary on the path and allow you to run it with the # `node_debug` command $ cp out/Debug/node \"$(which node)_debug\" $ which node_debug /your/home/directory/.nvm/versions/node/v20.10.0/bin/node_debug # Return to the lodestar repo $ cd ../lodestar # Clean the build artifacts and node_modules $ yarn clean && yarn clean:nm # Install the dependencies $ yarn install # Ensure that all native modules are rebuilt with debug symbols. Some # modules are prebuilt, like classic-level, and the debug symbols may # not be included. If the debugging exercise is focussed around # one of these dependencies, then you will need to manually clone those # repos and manually build them with debug symbols. $ npm rebuild --debug","s":"Build collection tools","u":"/lodestar/contribution/tools/heap-dumps","h":"#build-collection-tools","p":223},{"i":238,"t":"# Move to th `beacon-node` directory $ cd ../beacon-node # Start lodestar with profiling enabled $ heaptrack \\ $ --output ./lodestar.heapdump \\ $ node_debug \\ $ --max-old-space-size=8192 \\ $ ../lodestar/packages/cli/bin/lodestar.js \\ $ beacon \\ $ --rcConfig ./rc-config.yml \\ $ > /dev/null 2>&1 & # Wait some period of time for the heap dump data to be collected # The data will not be persisted until the process is stopped. You can gracefully # stop the process with the following command and if you want to hard kill it # add `-9` to the end of the `kill` command although that should not be necessary $ ps aux | grep lodestar | grep -v grep | awk '{print $2}' | head -n 1 | xargs kill","s":"Collect a heap dump","u":"/lodestar/contribution/tools/heap-dumps","h":"#collect-a-heap-dump","p":223},{"i":240,"t":"Collecting a heap dump can also be done on a running process. There are both advantages and disadvantages to this approach. The main advantage is that you can collect a heap dump without having to restart. The down side is that the dump will only include allocations/de-allocations while the tracker is running. This means that all the non-paired calls to malloc/free will register as leaks. It will also not give a true representation of how the heap is being used. On the upside, however the dump will be much smaller in size. It is important to note a warning that is in the heaptrack source code: WARNING: Runtime-attaching heaptrack is UNSTABLE and can lead to CRASHES in your application, especially after you detach heaptrack again. You are hereby warned, use it at your own risk! # Move to th `beacon-node` directory $ cd ../beacon-node # Start lodestar $ node_debug \\ $ --max-old-space-size=8192 \\ $ ../lodestar/packages/cli/bin/lodestar.js \\ $ beacon \\ $ --rcConfig ./rc-config.yml \\ $ > /dev/null 2>&1 & # Wait some period of time to start collecting the dump # GDB is required to inject heaptrack into a running process # so you may need to install it $ sudo apt-get update $ sudo apt-get install -y gdb # Elevated `perf` permissions are also required depending on your # system configuration. Change until the next reboot $ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope # Get the pid of the lodestar process $ export LODESTAR_PID=$(ps aux | grep lodestar | grep -v grep | awk '{print $2}' | head -n 1) # Inject heaptrack into the running process $ heaptrack --pid $LODESTAR_PID heaptrack output will be written to \"/home/user/beacon-node/heaptrack.node_debug.111868.zst\" /usr/lib/heaptrack/libheaptrack_preload.so injecting heaptrack into application via GDB, this might take some time... injection finished # Wait some period of time to collect the heap dump. See below # for the termination command that can be run from a separate # terminal when ready to stop collecting data Terminated removing heaptrack injection via GDB, this might take some time... Heaptrack finished! Now run the following to investigate the data: heaptrack --analyze \"/home/user/beacon-node/heaptrack.node_debug.111868.zst\" There is a trap in heaptrack but the process uses a nested shell to do the actual injection so it is not possible to just Ctrl+C out of the injected process without corrupting the output file. To properly kill the collection one needs to target the nested shell pid. Here is a helper command to target that process: ps -ef | grep '[h]eaptrack --pid' | awk '$3 == '$(ps -ef | grep '[h]eaptrack --pid' | awk '$3 != 1 {print $2}' | head -n 1)' {print $2}' | xargs -r kill After working with the injected process for a while, I cannot honestly recommend it. It can work in a pinch, and is best suited for when the profiled process can be exited gracefully without repercussions (not on mainnet for instance). The benefit, though, is that the heapdump will be much smaller and targeted to runtime (will not have the transient, startup allocations) which can make it easier to see what is happening.","s":"Collecting a heap dump on a running process","u":"/lodestar/contribution/tools/heap-dumps","h":"#collecting-a-heap-dump-on-a-running-process","p":223},{"i":242,"t":"# You can you apt, apt-get or aptitude to install the gui $ sudo apt-get update $ sudo apt-get install -y heaptrack-gui","s":"Installing heaptrack-gui on Linux","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-linux","p":223},{"i":244,"t":"At the time of writing this there is no official pre-built binary for OSX. This was a bit of a challenge but it was WELL worth the effort as the tool works very well. There were a number of bugs along the way while \"using the docs\" so your mileage may vary, but this is what worked for me. Most of the dependencies can be installed via Homebrew and the tool itself needs to be built from source. There was one dependency that needed to be built from source. This process assumes a working folder that the repos can be cloned into. # Start in the root folder where the repos will be cloned $ brew install qt@5 # prepare tap of kde-mac/kde $ brew tap kde-mac/kde https://invent.kde.org/packaging/homebrew-kde.git $ \"$(brew --repo kde-mac/kde)/tools/do-caveats.sh\" # install the kde-mac and other required dependencies $ brew install kde-mac/kde/kf5-kcoreaddons \\ $ kde-mac/kde/kf5-kitemmodels \\ $ kde-mac/kde/kf5-kconfigwidgets \\ $ kde-mac/kde/kdiagram \\ $ extra-cmake-modules \\ $ ki18n \\ $ threadweaver \\ $ boost \\ $ zstd \\ $ gettext # There is a bug in the current version of kde-mac/kde and one dependency needs # to be built manually. This is the workaround to get it built. $ git clone https://invent.kde.org/frameworks/kio.git $ mkdir kio/build $ cd kio/build $ export CMAKE_PREFIX_PATH=$(brew --prefix qt@5) $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release .. $ ninja $ sudo ninja install $ cd ../.. # Now make sure that the dependencies are available to the system during runtime $ ln -sfv \"$(brew --prefix)/share/kf5\" \"$HOME/Library/Application Support\" $ ln -sfv \"$(brew --prefix)/share/knotifications5\" \"$HOME/Library/Application Support\" $ ln -sfv \"$(brew --prefix)/share/kservices5\" \"$HOME/Library/Application Support\" $ ln -sfv \"$(brew --prefix)/share/kservicetypes5\" \"$HOME/Library/Application Support\" # We are now ready to build the heaptrack_gui binaries for analysis on OSX $ git clone https://invent.kde.org/sdk/heaptrack.git $ cd heaptrack $ mkdir build $ cd build $ CMAKE_PREFIX_PATH=$(brew --prefix qt@5) PATH=$PATH:/opt/homebrew/opt/gettext/bin cmake .. $ cmake -DCMAKE_BUILD_TYPE=Release .. $ make heaptrack_gui $ sudo make install # You can now find heaptrack_gui with your gui Applications. It is default # placed as /Applications/KDE/heaptrack_gui.app","s":"Installing heaptrack-gui on OSX","u":"/lodestar/contribution/tools/heap-dumps","h":"#installing-heaptrack-gui-on-osx","p":223},{"i":246,"t":"Check back soon for more information!! We are in the process of updating our docs.","s":"Unit Tests","u":"/lodestar/contribution/testing/unit-tests","h":"","p":245},{"i":248,"t":"This section of the documentation will cover common questions and common encounters by users and developers.","s":"Frequently Asked Questions","u":"/lodestar/faqs","h":"","p":247},{"i":250,"t":"\"Package manager issues\" Lodestar relies on Corepack and associated packageManager value to manage its package manager version. Make sure corepack is correctly enabled if you encounter some package manager related issues: corepack enable","s":"Tooling","u":"/lodestar/faqs","h":"#tooling","p":247},{"i":253,"t":"\"Heap memory limit\" Lodestar beacon node requires at least 8GB of heap space. While the lodestar script and the official docker image correctly sets the appropriate value, it might be necessary to manually set it for some specific scenario. The simplest way to achieve this is via the NODE_OPTIONS environment variable or by passing --max-old-space-size directly to the node binary NODE_OPTIONS: --max-old-space-size=8192","s":"Running a beacon node","u":"/lodestar/faqs","h":"#running-a-beacon-node","p":247},{"i":255,"t":"\"Unknown arguments error\" Lodestar reads all environment variables prefixed with LODESTAR and will try to parse them similar to command line arguments, meaning any unknown argument will cause an error. ✖ Unknown arguments: servicePort, servicePortEthConsensusP2p, port9000Tcp, port9000TcpPort, port9000TcpProto, port9000TcpAddr, serviceHost The extra arguments are present because Kubernetes automatically adds environment variables to the Pod based on the name (metadata.name) defined in the associated Service. To resolve the issue, this name has to be changed to something that does not start with lodestar. Reference Issue: #6045","s":"Using Kubernetes","u":"/lodestar/faqs","h":"#using-kubernetes","p":247},{"i":257,"t":"Ethereum light clients provide a pathway for users to interact with the Ethereum blockchain in a trust-minimized manner, comparable to the level of trust required when engaging with a third-party provider like Infura or EtherScan. Not that those platforms are bad, but trust in any centralized provider goes against the ethos of blockchain. Light clients are a way that low-power devices, like cell phones, can do self validation of transactions and dApp state. Unlike full nodes, light clients do not download and store the entire blockchain. Instead, they download only the headers of each block and employ Merkle proofs to verify transactions. This enables a quick synchronization with the network and access the latest information without using significant system resources​. This streamlined approach to accessing Ethereum is crucial, especially in scenarios where full-scale network participation is infeasible or undesired. The evolution of light clients is emblematic of the broader trajectory of Ethereum towards becoming more accessible and resource-efficient, making blockchain technology more inclusive and adaptable to a wide array of use cases and environments. The Altair hard fork introduced sync committees to allow light-clients to synchronize to the network.","s":"Lodestar Light Client","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"","p":256},{"i":259,"t":"This package is part of ChainSafe's Lodestar project","s":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#prerequisites","p":256},{"i":261,"t":"Access to a beacon node that supports the light client specification is necessary. The client must support the following routes from the consensus API spec: GET /eth/v1/beacon/light_client/updates GET /eth/v1/beacon/light_client/optimistic_update GET /eth/v1/beacon/light_client/finality_update GET /eth/v1/beacon/light_client/bootstrap/{block_root} System requirements are quite low so its possible to run a light client in the browser as part of a website. There are a few examples of this on github that you can use as reference, our prover being one of them. You can find more information about the light-client protocol in the specification.","s":"Requirements for Running a Light-Client","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#requirements-for-running-a-light-client","p":256},{"i":263,"t":"Follow the installation guide to install Lodestar. Quickly try out the whole stack by starting a local testnet.","s":"Getting started","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#getting-started","p":256},{"i":265,"t":"It is possible to start up the light-client as a standalone process. lodestar lightclient \\ --network sepolia \\ --beaconApiUrl https://lodestar-sepolia.chainsafe.io \\ --checkpointRoot \"0xccaff4b99986a7b05e06738f1828a32e40799b277fd9f9ff069be55341fe0229\"","s":"Light-Client CLI Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-cli-example","p":256},{"i":267,"t":"For this example we will assume there is a running beacon node at https://lodestar-sepolia.chainsafe.io import {Lightclient, LightclientEvent} from \"@lodestar/light-client\"; import {LightClientRestTransport} from \"@lodestar/light-client/transport\"; import { getFinalizedSyncCheckpoint, getGenesisData, getConsoleLogger, getApiFromUrl, getChainForkConfigFromNetwork, } from \"@lodestar/light-client/utils\"; const config = getChainForkConfigFromNetwork(\"sepolia\"); const logger = getConsoleLogger({logDebug: Boolean(process.env.DEBUG)}); const api = getApiFromUrl(\"https://lodestar-sepolia.chainsafe.io\", \"sepolia\"); const lightclient = await Lightclient.initializeFromCheckpointRoot({ config, logger, transport: new LightClientRestTransport(api), genesisData: await getGenesisData(api), checkpointRoot: await getFinalizedSyncCheckpoint(api), opts: { allowForcedUpdates: true, updateHeadersOnForcedUpdate: true, }, }); // Wait for the lightclient to start await lightclient.start(); logger.info(\"Lightclient synced\"); lightclient.emitter.on(LightclientEvent.lightClientFinalityHeader, async (finalityUpdate) => { logger.info(\"Received finality update\", {slot: finalityUpdate.beacon.slot}); }); lightclient.emitter.on(LightclientEvent.lightClientOptimisticHeader, async (optimisticUpdate) => { logger.info(\"Received optimistic update\", {slot: optimisticUpdate.beacon.slot}); });","s":"Light-Client Programmatic Example","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#light-client-programmatic-example","p":256},{"i":269,"t":"If you want to use Lightclient in browser and are facing some issues in building it with bundlers like webpack, vite. We suggest using our distribution build. The support for single distribution build is started from 1.20.0 version. Directly link the dist build with the **Typescript support** The web bundle comes with the types support. Unfortunately due to following [issue](https://github.com/microsoft/rushstack/issues/1128#issuecomment-2066257538) we can't bundle all types. A workaround would be to add `@chainsafe/as-sha256` as a devDependency to your project.","s":"Browser Integration","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#browser-integration","p":256},{"i":271,"t":"Read our contribution documentation, submit an issue or talk to us on our discord!","s":"Contributors","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#contributors","p":256},{"i":273,"t":"Apache-2.0 ChainSafe Systems","s":"License","u":"/lodestar/libraries/lightclient-prover/lightclient","h":"#license","p":256},{"i":275,"t":"Ethereum is one of the most profoundly important inventions in recent history. It is a decentralized, open-source blockchain featuring smart contract functionality. It is the second-largest cryptocurrency by market capitalization, after Bitcoin, and is the second-largest blockchain by market capitalization. Ethereum was proposed in 2013 by programmer Vitalik Buterin. Development was crowdfunded in 2014, and the network went live on 30 July 2015, with 72 million coins premined. ChainSafe was founded not too long afterwards in 2017 and has been actively working in the Ethereum ecosystem ever since. We are proud to develop Lodestar, the only TypeScript based consensus client, and to present this documentation as a resource for the Ethereum community.","s":"Introduction","u":"/lodestar/introduction","h":"","p":274},{"i":277,"t":"In Ethereum's Proof of Stake (PoS) model, validators replace miners from the Proof of Work (PoW) system. Validators are Ethereum stakeholders who lock up a portion of their Ether as a stake. The protocol randomly selects these validators to propose new blocks. The chance of being chosen is tied to the size of their stake: the more Ether staked, the higher the probability of being selected to propose the block. Proposers receive transaction fees and block rewards as incentives. Validators are also responsible for voting on the validity of blocks proposed by other validators. However, they also face penalties, known as slashing, for actions like signing two different block proposals in the same slot or voting on two different attestations for the same target epoch, which creates conflicting states. The PoS mechanism significantly reduces energy consumption compared to PoW, because it does not require extensive computational power. Moreover, PoS tends to facilitate faster transaction validations and block creations, enhancing the overall performance and scalability of the network.","s":"Proof of Stake","u":"/lodestar/introduction","h":"#proof-of-stake","p":274},{"i":279,"t":"In an effort to promote client diversity there are several consensus beacon nodes being developed. Each is programmed in a different language and by a different team. The following is a list of the current open source consensus clients in alphabetical order: Grandine (Rust) Lighthouse (Rust) Lodestar (TypeScript) Nimbus (Nim) Prysm (Golang) Teku (Java)","s":"Consensus Clients","u":"/lodestar/introduction","h":"#consensus-clients","p":274},{"i":281,"t":"The Ethereum network's robustness is significantly enhanced by its client diversity, whereby multiple, independently-developed clients conforming to a common specification, facilitating seamless interaction and function equivalently across different nodes. This client variety not only fosters a rich ecosystem but also provides a buffer against network-wide issues stemming from bugs or malicious attacks targeted at particular clients. For instance, during the Shanghai denial-of-service attack in 2016, the diversified client structure enabled the network to withstand the assault, underscoring the resilience afforded by multiple client configurations. On the consensus layer, client distribution is crucial for maintaining network integrity and finality, ensuring transactions are irreversible once validated. A balanced spread of nodes across various clients help to mitigate risks associated with potential bugs or attacks that could, in extreme cases, derail the consensus process (liveness failure) or lead to incorrect chain splits (forking), thereby jeopardizing the network's stability and trust. While the data suggests a dominance of the Prysm and Lighthouse clients on the consensus layer, efforts are ongoing to promote a more even distribution among others clients. Encouraging the adoption of minority clients, bolstering their documentation, and leveraging real-time client diversity dashboards are among the strategies being employed to enhance client diversity, which in turn fortifies the Ethereum consensus layer against adversities and fosters a healthier decentralized network. The non-finality event of May 2023 on the Ethereum network posed a significant challenge. The issue arose from attestations for a fork, which necessitated state replays to validate the attestations, causing a notable strain on system resources. As a result, nodes fell out of sync, which deterred the accurate tracking of the actual head of the chain. This situation was exacerbated by a decline in attestations during specific epochs, further hampering the consensus mechanism from reaching finality. The Lodestar team noticed late attestations several weeks prior to the event and implemented a feature that attempted to address such challenges by not processing untimely attestations, and thus not requiring expensive state replays​. While it was done for slightly different reasons, the result was the same. Lodestar was able to follow the chain correctly and helped to stabilize the network. This example underscored the importance of client diversity and network resilience against potential forks and replay attacks. These are considered realistic threats, especially in the context of system complexity like in Ethereum's consensus mechanism.","s":"Why Client Diversity?","u":"/lodestar/introduction","h":"#why-client-diversity","p":274},{"i":283,"t":"Ethereum Docs Upgrading Ethereum by Ben Edgington Ethereum Book by Andreas M. Antonopoulos and Gavin Wood Ethereum Consensus Specification Casper the Friendly Finality Gadget by Vitalik Buterin and Virgil Griffith LMD Ghost by protolambda","s":"Ethereum Reading List","u":"/lodestar/introduction","h":"#ethereum-reading-list","p":274},{"i":285,"t":"Run lightclient","s":"lightclient CLI Command","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"","p":284},{"i":287,"t":"Run lightclient with holesky network ./lodestar lightclient --network holesky","s":"Examples","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#examples","p":284},{"i":289,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --rcConfig​ RC file to supplement command line args, accepted formats: .yml, .yaml, .json type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --beaconApiUrl​ Url to a beacon node that support lightclient API required: true type: string --checkpointRoot​ Checkpoint root hex string to sync the lightclient from, start with 0x required: true type: string","s":"lightclient Options","u":"/lodestar/libraries/lightclient-prover/lightclient-cli","h":"#lightclient-options","p":284},{"i":291,"t":"Welcome! This page has been moved. Please checkout our new docs layout from the Table of Contents! Below are some helpful links to the CLI pages that were split out from this original document Beacon Node CLI Validator CLI Bootnode CLI Light Client CLI Dev CLI","s":"Page relocated","u":"/lodestar/reference/cli","h":"","p":290},{"i":293,"t":"This package is part of ChainSafe's Lodestar project A set of tools allowing to verify EL client JSON-RPC calls.","s":"Lodestar Prover","u":"/lodestar/libraries/lightclient-prover/prover","h":"","p":292},{"i":295,"t":"You can use the @lodestar/prover in two ways, as a Web3 Provider and as proxy. For prover use case see below example. import Web3 from \"web3\"; import {createVerifiedExecutionProvider, LCTransport} from \"@lodestar/prover\"; const httpProvider = new Web3.providers.HttpProvider(\"https://lodestar-sepoliarpc.chainsafe.io\"); const {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, { transport: LCTransport.Rest, urls: [\"https://lodestar-sepolia.chainsafe.io\"], network: \"sepolia\", wsCheckpoint: \"trusted-checkpoint\", }); const web3 = new Web3(provider); const address = \"0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134\"; const balance = await web3.eth.getBalance(address, \"latest\"); console.log({balance, address}); In this scenario the actual provider is mutated to handle the RPC requests and verify those. So here if you use provider or httpProvider both are the same objects. This behavior is useful when you already have an application and usage of any provider across the code space and don't want to change the code. So you mutate the provider during startup. For some scenarios when you don't want to mutate the provider you can pass an option mutateProvider as false. In this scenario the object httpProvider is not mutated and you get a new object provider. This is useful when your provider object does not allow mutation, e.g. Metamask provider accessible through window.ethereum. If not provided mutateProvider is considered as true by default. In coming releases we will switch its default behavior to false. import Web3 from \"web3\"; import {createVerifiedExecutionProvider, LCTransport} from \"@lodestar/prover\"; const httpProvider = new Web3.providers.HttpProvider(\"https://lodestar-sepoliarpc.chainsafe.io\"); const {provider, proofProvider} = createVerifiedExecutionProvider(httpProvider, { transport: LCTransport.Rest, urls: [\"https://lodestar-sepolia.chainsafe.io\"], network: \"sepolia\", wsCheckpoint: \"trusted-checkpoint\", mutateProvider: false, }); const web3 = new Web3(provider); const address = \"0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134\"; const balance = await web3.eth.getBalance(address, \"latest\"); console.log({balance, address}); You can also invoke the package as binary. npm i -g @lodestar/prover lodestar-prover proxy \\ --network sepolia \\ --executionRpcUrl https://lodestar-sepoliarpc.chainsafe.io \\ --beaconUrls https://lodestar-sepolia.chainsafe.io \\ --port 8080","s":"Usage","u":"/lodestar/libraries/lightclient-prover/prover","h":"#usage","p":292},{"i":297,"t":"There can be different implementations of the web3 providers and each can handle the RPC request differently. We call those different provider types. We had provided builtin support for common providers e.g. web3.js, ethers or any eip1193 compatible providers. We inspect given provider instance at runtime to detect the correct provider type. If your project is using some provider type which is not among above list, you have the option to register a custom provider type with the createVerifiedExecutionProvider with the option providerTypes which will be an array of your supported provider types. Your custom provider types will have higher priority than default provider types. Please see existing provide types implementations to know how to implement your own if needed.","s":"How to detect a web3 provider","u":"/lodestar/libraries/lightclient-prover/prover","h":"#how-to-detect-a-web3-provider","p":292},{"i":299,"t":"✅ - Completed ⌛ - Todo ➡️ - Request will be forward to EL without any intermediary manipulations. You can limit these by providing unverifiedWhitelist option for provider or --unverifiedWhitelist from the cli. If not set then all methods will be forwarded. ❇️ - Always forwarded to EL. Group Method Status Version Block eth_getBlockByHash ✅ v0 eth_getBlockByNumber ✅ v0 eth_getBlockTransactionCountByHash ⌛ v2 eth_getBlockTransactionCountByNumber ⌛ v2 eth_getUncleCountByBlockHash ⌛ v2 eth_getUncleCountByBlockNumber ⌛ v2 Chain/Network eth_chainId ➡️ eth_syncing ⌛ v1 eth_coinbase ⌛ v2 eth_accounts ➡️ eth_blockNumber ➡️ Call and Estimate eth_call ✅ v0 eth_estimateGas ✅ v0 eth_createAccessList ⌛ v2 eth_gasPrice ⌛ v1 eth_maxPriorityFeePerGas ⌛ v1 eth_feeHistory ⌛ v2 Filters eth_newFilter ⌛ v2 eth_newBlockFilter ⌛ v2 eth_newPendingTransactionFilter ⌛ v2 eth_uninstallFilter ⌛ v2 eth_getFilterChanges ⌛ v2 eth_getFilterLogs ⌛ v2 eth_getLogs ⌛ v1 Mining eth_mining ➡️ eth_hashrate ➡️ eth_getWork ➡️ eth_submitWork ➡️ eth_submitHashrate ➡️ Signing eth_sign ➡️ eth_signTransaction ➡️ State eth_getBalance ✅ v0 eth_getStorageAt ⌛ v1 eth_getTransactionCount ⌛ v2 eth_getCode ✅ v0 eth_getProof ❇️ v0 Transactions eth_sendTransaction ➡️ eth_sendRawTransaction ➡️ eth_getTransactionByHash ⌛ v2 eth_getTransactionByBlockHashAndIndex ⌛ v2 eth_getTransactionByBlockNumberAndIndex ⌛ v2 eth_getTransactionReceipt ⌛ v2 Events eth_subscribe ❇️ v0 eth_unsubscribe ❇️ v0","s":"Supported Web3 Methods","u":"/lodestar/libraries/lightclient-prover/prover","h":"#supported-web3-methods","p":292},{"i":301,"t":"Currently does not support batch requests.","s":"Non-supported features","u":"/lodestar/libraries/lightclient-prover/prover","h":"#non-supported-features","p":292},{"i":303,"t":"To use this prover the ethereum provider must support the eth_getProof method. Unfortunately, Infura does not currently support this endpoint. As an alternative, we suggest using Alchemy.","s":"Warnings","u":"/lodestar/libraries/lightclient-prover/prover","h":"#warnings","p":292},{"i":305,"t":"NodeJS (LTS) Yarn","s":"Prerequisites","u":"/lodestar/libraries/lightclient-prover/prover","h":"#prerequisites","p":292},{"i":307,"t":"You will need to go over the specification. You will also need to have a basic understanding of lightclient.","s":"What you need","u":"/lodestar/libraries/lightclient-prover/prover","h":"#what-you-need","p":292},{"i":309,"t":"Follow the installation guide to install Lodestar. Quickly try out the whole stack by starting a local testnet.","s":"Getting started","u":"/lodestar/libraries/lightclient-prover/prover","h":"#getting-started","p":292},{"i":311,"t":"Read our contributors document, submit an issue or talk to us on our discord!","s":"Contributors","u":"/lodestar/libraries/lightclient-prover/prover","h":"#contributors","p":292},{"i":313,"t":"Apache-2.0 ChainSafe Systems","s":"License","u":"/lodestar/libraries/lightclient-prover/prover","h":"#license","p":292},{"i":316,"t":"Run a beacon chain node","s":"beacon CLI Command","u":"/lodestar/run/beacon-management/beacon-cli","h":"","p":315},{"i":318,"t":"Run a beacon chain node and connect to the holesky testnet ./lodestar beacon --network holesky","s":"Examples","u":"/lodestar/run/beacon-management/beacon-cli","h":"#examples","p":315},{"i":320,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --rcConfig​ RC file to supplement command line args, accepted formats: .yml, .yaml, .json type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --genesisStateFile​ Path or URL to download a genesis state file in ssz-encoded format type: string --checkpointSyncUrl​ Server url hosting Beacon Node APIs to fetch weak subjectivity state. Fetch latest finalized by default, else set --wssCheckpoint type: string --checkpointState​ Set a checkpoint state to start syncing from type: string --wssCheckpoint​ Start beacon node off a state at the provided weak subjectivity checkpoint, to be supplied in : format. For example, 0x1234:100 will sync and start off from the weak subjectivity state at checkpoint of epoch 100 with block root 0x1234. type: string --forceCheckpointSync​ Force syncing from checkpoint state even if db state is within weak subjectivity period. This helps to avoid long sync times after node has been offline for a while. type: boolean --ignoreWeakSubjectivityCheck​ Ignore the checkpoint sync state failing the weak subjectivity check. This is relevant in testnets where the weak subjectivity period is too small for even few epochs of non finalization causing last finalized to be out of range. This flag is not recommended for mainnet use. type: boolean --persistNetworkIdentity​ Whether to reuse the same peer-id across restarts type: boolean --private​ Do not send implementation details over p2p identify protocol and in builder, execution engine and eth1 requests type: boolean --validatorMonitorLogs​ Log validator monitor events as info. This requires metrics to be enabled. type: boolean --disableLightClientServer​ Disable light client server. type: boolean --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --rest​ Enable/disable HTTP API type: boolean default: true --rest.namespace​ Pick namespaces to expose for HTTP API. Set to '*' to enable all namespaces type: string[] choices: \"beacon\", \"config\", \"debug\", \"events\", \"lightclient\", \"lodestar\", \"node\", \"proof\", \"validator\", \"*\" default: [\"beacon\",\"config\",\"debug\",\"events\",\"node\",\"validator\",\"lightclient\"] --rest.cors​ Configures the Access-Control-Allow-Origin CORS header for HTTP API type: string default: \"*\" --rest.address​ Set host for HTTP API type: string default: \"127.0.0.1\" --rest.port​ Set port for HTTP API type: number default: 9596 --rest.swaggerUI​ Enable Swagger UI for API exploration at http://{address}:{port}/documentation type: boolean --suggestedFeeRecipient​ Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$) in case validator fails to update for a validator index before calling produceBlock. type: string default: \"0x0000000000000000000000000000000000000000\" --emitPayloadAttributes​ Flag to SSE emit execution payloadAttributes before every slot type: boolean default: false --chain.archiveBlobEpochs​ Number of epochs to retain finalized blobs (minimum of MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS) type: number --eth1​ Whether to follow the eth1 chain type: boolean default: true --eth1.providerUrls​ Urls to Eth1 node with enabled rpc. If not explicitly provided and execution endpoint provided via execution.urls, it will use execution.urls. Otherwise will try connecting on the specified default(s) type: string[] default: [ \"http://localhost:8545\" ] --execution.urls​ Urls to execution client engine API type: string[] default: [ \"http://localhost:8551\" ] --execution.timeout​ Timeout in milliseconds for execution engine API HTTP client type: number default: 12000 --execution.retries​ Number of retries when calling execution engine API type: number default: 2 --execution.retryDelay​ Delay time in milliseconds between retries when retrying calls to the execution engine API type: number default: 2000 --execution.engineMock​ Set the execution engine to mock mode (development only) type: boolean --jwtSecret​ File path to a shared hex-encoded jwt secret which will be used to generate and bundle HS256 encoded jwt tokens for authentication with the EL client's rpc server hosting engine apis. Secret to be exactly same as the one used by the corresponding EL client. type: string --jwtId​ An optional identifier to be set in the id field of the claims included in jwt tokens used for authentication with EL client's rpc server hosting engine apis type: string --builder​ Enable builder interface type: boolean --builder.url​ Url hosting the builder API type: string default: \"http://localhost:8661\" --builder.timeout​ Timeout in milliseconds for builder API HTTP client type: number default: 12000 --builder.faultInspectionWindow​ Window to inspect missed slots for enabling/disabling builder circuit breaker type: number --builder.allowedFaults​ Number of missed slots allowed in the faultInspectionWindow for builder circuit type: number --metrics​ Enable the Prometheus metrics HTTP server type: boolean --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 8008 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\" --monitoring.endpoint​ Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in) type: string --monitoring.interval​ Interval in milliseconds between sending client stats to the remote service type: number default: 60000 --discv5​ Enable discv5 type: boolean default: true --listenAddress​ The IPv4 address to listen for p2p UDP and TCP connections type: string default: \"0.0.0.0\" --port​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort flag. type: number default: 9000 --discoveryPort​ The UDP port that discovery will listen on. Defaults to port type: number default: port --listenAddress6​ The IPv6 address to listen for p2p UDP and TCP connections type: string --port6​ The TCP/UDP port to listen on. The UDP port can be modified by the --discoveryPort6 flag. type: number default: 9090 --discoveryPort6​ The UDP port that discovery will listen on. Defaults to port6 type: number default: port6 --bootnodes​ Bootnodes for discv5 discovery type: string[] default: [ \"[]\" ] --targetPeers​ The target connected peers. Above this number peers will be disconnected type: number default: 100 --subscribeAllSubnets​ Subscribe to all subnets regardless of validator count type: boolean default: false --disablePeerScoring​ Disable peer scoring, used for testing on devnets type: boolean default: false --mdns​ Enable mdns local peer discovery type: boolean default: false --enr.ip​ Override ENR IP entry type: string --enr.tcp​ Override ENR TCP entry type: number --enr.udp​ Override ENR UDP entry type: number --enr.ip6​ Override ENR IPv6 entry type: string --enr.tcp6​ Override ENR (IPv6-specific) TCP entry type: number --enr.udp6​ Override ENR (IPv6-specific) UDP entry type: number --nat​ Allow configuration of non-local addresses type: boolean","s":"beacon Options","u":"/lodestar/run/beacon-management/beacon-cli","h":"#beacon-options","p":315},{"i":322,"t":"MEV is a term that refers to the bundling of transactions in one particular order to extract (mostly) arbitrage opportunities on the dApps and decentralized exchanges. And the ones who gets to include these execution payloads (miners before the merge, validators after the merge) in the canonical chain get paid a per-block reward which essentially should be higher than the normal payload inclusion reward (including transactions tips). Currently these happen with miners running forked versions of their favorite execution client, integrating with these \"builders\" but in the post-merge world they get a more native and standard integration with the CL. This is what we in CL land refer to as Builder Api.","s":"MEV & Merge","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"","p":321},{"i":324,"t":"Lodestar offers builder integration through the spec-ed builder API. This sits in parallel with the execution engine so when enabled, lodestar validator run both flows in parallel when its time to propose for a validator key and currently (naively) picks the builder block in preference to execution if a builder block is fetched (else just proceeds with the execution block).","s":"Lodestar and Builder API","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#lodestar-and-builder-api","p":321},{"i":326,"t":"All you have to do is: Provide lodestar beacon node with a Builder endpoint (which corresponds to the network you are running) via these additional flags: --builder --builder.url Run lodestar validator client with these additional flags --builder --suggestedFeeRecipient There are some more builder flags available in lodestar cli (for both beacon and validator) which you may inspect and use. Even though its possible to directly hook lodestar with an external Builder/Relay, its recommended to interface it with the MEV world via local MEV-BOOST multiplexer which can integrate multiple builder/relays for you and provide some payload verification on top, as currently Lodestar assumes this to be a trusted endpoint.","s":"Configure Lodestar setup for MEV","u":"/lodestar/run/beacon-management/mev-and-builder-integration","h":"#configure-lodestar-setup-for-mev","p":321},{"i":328,"t":"Lodestar will automatically connect to peers on the network. Peers are found through the discv5 protocol and once peers are established communications happen via gossipsub over libp2p. While not necessary, having a basic understanding of how the various protocols and transports work will help with debugging and troubleshooting as some of the more common challenges come up with firewalls and NAT traversal.","s":"Networking","u":"/lodestar/run/beacon-management/networking","h":"","p":327},{"i":330,"t":"Some of the important Lodestar flags related to networking are: --discv5 --listenAddress --port --discoveryPort --listenAddress6 --port6 --discoveryPort6 --bootnodes --subscribeAllSubnets --disablePeerScoring --enr.ip --enr.tcp --enr.udp --enr.ip6 --enr.tcp6 --enr.udp6 --nat --private","s":"Networking Flags","u":"/lodestar/run/beacon-management/networking","h":"#networking-flags","p":327},{"i":332,"t":"In Ethereum, discv5 plays a pivotal role in the peer discovery process, facilitating nodes to find and locate each other in order to form the peer-to-peer network​. The process begins with an interaction between new nodes and bootnodes at start-up. Bootnodes are nodes with hard-coded addresses, or can be overridden via the cli flag --bootnodes, to bootstrap the discovery process​. Through a method called FINDNODE-NODES, a new node establishes a bond with each bootnode, and it returns a list of peers for the new node to connect to. Following this trail, the new node engages through FINDNODE-NODES with the provided peers to further establish a web of connections​. Discv5 operates as a peer advertisement medium in this network, where nodes can act as both providers and consumers of data. Every participating node in the Discv5 protocol discovers peer data from other nodes and later relays it, making the discovery process dynamic and efficient​. Discv5 is designed to be a standalone protocol running via UDP on a dedicated port solely for peer discovery. Peer data is exchanged via self-certified, flexible peer records (ENRs). These key features cater to the Ethereum network​ and being a good peer often means running a discv5 worker​. Lodestar offers simple configuration to setup and run a bootnode independently of a beacon node. See the bootnode cli page for more information and configuration options.","s":"Peer Discovery (Discv5)","u":"/lodestar/run/beacon-management/networking","h":"#peer-discovery-discv5","p":327},{"i":334,"t":"Ethereum Node Records (ENRs) are a standardized format utilized for peer discovery - see EIP-778 for the specification. An ENR consists of a set of key-value pairs. These pairs include crucial information such as the node's ID, IP address, the port on which it's listening, and the protocols it supports. This information helps other nodes in the network locate and connect to the node. The primary purpose of ENRs is to facilitate node discovery and connectivity in the Ethereum network. Nodes use ENRs to announce their presence and capabilities to other nodes, making it easier to establish and maintain a robust, interconnected network. Note that bootnodes are announced via ENR. Lodestar prints out its own ENR on startup, the logs will show something similar to the following info: discv5 worker started peerId=16Uiu...t9LQ3, initialENR=enr:-Iu4QGE...WRwgiMo, bindAddr4=/ip4/0.0.0.0/udp/9000 Alternatively, the ENR can also be retrieved from the beacon node API by querying the getNetworkIdentity endpoint. ENR Viewer provides a simple and convenient option to decode and inspect ENRs.","s":"ENR","u":"/lodestar/run/beacon-management/networking","h":"#enr","p":327},{"i":336,"t":"Gossipsub and Req/Resp are the two mechanisms that beacon nodes use to exchange chain data. Gossipsub is used disseminate the most recent relevant data proactively throughout the network. Req/Resp is used to directly ask specific peers for specific information (eg: during syncing).","s":"Peer Communication (gossipsub and Req/Resp)","u":"/lodestar/run/beacon-management/networking","h":"#peer-communication-gossipsub-and-reqresp","p":327},{"i":338,"t":"GossipSub is a foundational protocol in peer-to-peer (P2P) communication, particularly decentralized networks like Ethereum and IPFS. At its core, GossipSub efficiently propagates data, filtered by topic, through a P2P network. It organizes peers into a collection of overlay networks, each associated with a distinct topic. By routing data through relevant overlay networks based on topics of interest, large amounts of data can be efficiently disseminated without excessive bandwidth, latency, etc. In GossipSub, nodes can subscribe to topics, effectively joining the corresponding overlay to receive messages published to a specific topic. This topic-based structure enables nodes to congregate around shared interests, ensuring that relevant messages are delivered to all interested parties. Each message published to a topic gets disseminated and relayed to all subscribed peers, similar to a chat room. Messages are propagated through a blend of eager-push and lazy-pull models. Specifically, the protocol employs \"mesh links\" to carry full messages actively and \"gossip links\" to carry only message identifiers (lazy-pull propagation model). This hybrid approach allows for both active message propagation and reactive message retrieval​ which is an extension of the traditional hub-and-spoke pub/sub model.","s":"Gossipsub","u":"/lodestar/run/beacon-management/networking","h":"#gossipsub","p":327},{"i":340,"t":"Req/Resp is the domain of protocols that establish a flexible, on-demand mechanism to retrieve historical data and data missed by gossip. This family of methods, implemented as separate libp2p protocols, operate between a single requester and responder. A method is initiated via a libp2p protocol ID, with the initiator sending a request message and the responder sending a response message. Every method defines a specific request and response message type, and a specific protocol ID. This framework also facilitates streaming responses and robust error handling.","s":"Req/Resp","u":"/lodestar/run/beacon-management/networking","h":"#reqresp","p":327},{"i":342,"t":"Libp2p is a modular and extensible network stack that serves as the data transport layer below both gossipsub and Req/Resp and facilitates the lower-level peer-to-peer communications. It provides a suite of protocols for various networking functionalities including network transports, connection encryption and protocol multiplexing. Its modular design allows for the easy addition, replacement, or upgrading of protocols, ensuring an adaptable and evolving networking stack. Libp2p operates at the lower levels of the OSI model, particularly at the Transport and Network layers. Libp2p supports both TCP and UDP protocols for establishing connections and data transmission. Combined with libp2p's modular design it can integrate with various networking technologies to facilitating both routing and addressing.","s":"Data Transport (libp2p)","u":"/lodestar/run/beacon-management/networking","h":"#data-transport-libp2p","p":327},{"i":344,"t":"If your setup is behind a firewall there are a few ports that will need to be opened to allow for P2P discovery and communication. There are also some ports that need to be protected to prevent unwanted access or DDOS attacks on your node. Ports that must be opened: 30303/TCP+UDP - Execution layer P2P communication port 9000/TCP+UDP - Beacon node IPv4 P2P communication port 9090/TCP+UDP - Beacon node IPv6 P2P communication port Ports that must be protected: 9596/TCP - Beacon node REST API port 5062/TCP - Validator key manager API port 18550/TCP - MEV-Boost/Builder port 8008/TCP - Beacon node metrics port 5064/TCP - Validator metrics port 8545/TCP - Execution client JSON RPC port 8551/TCP - Execution engine port for Lodestar to communicate with the execution client","s":"Firewall Management","u":"/lodestar/run/beacon-management/networking","h":"#firewall-management","p":327},{"i":346,"t":"Lodestar does not support UPnP. If you are behind a NAT you will need to manually forward the ports listed above.","s":"NAT Traversal","u":"/lodestar/run/beacon-management/networking","h":"#nat-traversal","p":327},{"i":348,"t":"Syncing an Ethereum node involves obtaining a copy of the blockchain data from other peers in the network to reach a consistent state. This process is crucial for new nodes or nodes that have been offline and need to catch up with the network's current state. Syncing can be performed for both the execution layer and the beacon chain, although the focus here will be primarily on the beacon chain. Lodestar allows for several methods of syncing however the recommended method is checkpoint sync as it is the fastest and least resource intensive. It is generally a good idea to sync via a --checkpointSyncUrl. If starting at a specific point is necessary specify the --checkpointState that should be where the sync begins.","s":"Syncing","u":"/lodestar/run/beacon-management/syncing","h":"","p":347},{"i":350,"t":"Weak subjectivity is a concept specific to Proof of Stake (PoS) systems, addressing how new nodes can safely join the network and synchronize with the correct blockchain history. Unlike in Proof of Work (PoW) systems, where a node can trust the longest chain due to the significant computational effort required to forge it, PoS systems present different challenges. In PoS, the cost of creating or altering blockchain history is lower, as it is not based on computational work but on the stake held by validators. This difference raises the possibility that an attacker, if possessing sufficient stake, could feasibly create a misleading version of the blockchain history. The concept of weak subjectivity becomes particularly crucial in two scenarios: when new nodes join the network and when existing nodes reconnect after a significant period of being offline. During these times, the 'weak subjectivity period' defines a time frame within which a client, upon rejoining, can reliably process blocks to reach the consensus chain head. This approach is essential for mitigating the risks associated with long-range attacks, which could occur if nodes relied solely on the longest chain principle without any initial trust in a specific network state. To counter these risks, weak subjectivity requires new nodes to obtain a recent, trusted state of the blockchain from a reliable source upon joining the network. This state includes vital information about the current set of validators and their stakes. Starting from this trusted state helps new nodes avoid being misled by false histories, as any attempt to rewrite history beyond this point would require an unrealistically large portion of the total stake.","s":"Weak Subjectivity","u":"/lodestar/run/beacon-management/syncing","h":"#weak-subjectivity","p":347},{"i":353,"t":"Checkpoint sync, also known as state sync, allows a node to sync to a specific state checkpoint without having to process all historical data leading up to that point. In the context of a beacon node, this involves syncing to a recent finalized checkpoint, allowing the node to quickly join the network and participate in consensus activities. This is especially beneficial for new nodes or nodes that have been offline for a considerable duration.","s":"Checkpoint Sync","u":"/lodestar/run/beacon-management/syncing","h":"#checkpoint-sync","p":347},{"i":355,"t":"Historical sync involves processing all blocks from the genesis block or from a specified starting point to the current block. This is the most comprehensive sync method but also the most resource and time-intensive. For beacon nodes, historical sync is crucial for nodes that aim to maintain a complete history of the beacon chain, facilitating a deeper understanding and analysis of the network's history. In the execution layer, it ensures a complete historical record of the execution layer data.","s":"Historical Sync","u":"/lodestar/run/beacon-management/syncing","h":"#historical-sync","p":347},{"i":357,"t":"Range sync involves syncing blocks within a specified range, beneficial when a node is only temporarily offline and needs to catch up over a short range. In the beacon node context, this entails requesting and processing blocks within a defined range, ensuring the node quickly gets updated to the current network state.","s":"Range Sync","u":"/lodestar/run/beacon-management/syncing","h":"#range-sync","p":347},{"i":359,"t":"This is another version of checkpoint sync that allows a node that has not been historically synchronized to verify data prior to the checkpoint. It is done via downloading a checkpoint and then fetch blocks backwards from that point until the desired data can be verified. It is a relatively inexpensive sync from a cpu perspective because it only checks the block hashes and verifies the proposer signatures along the way.","s":"Backfill Sync","u":"/lodestar/run/beacon-management/syncing","h":"#backfill-sync","p":347},{"i":361,"t":"The implementation of the different syncing styles in Lodestar are actually one of two types under the hood, range sync and unknown-parent sync. Range sync is used when the start point of syncing is known. In the case of historical and checkpoint sync the starting points are well defined, genesis and the last finalized epoch boundary. Snapshot sync is not supported by Lodestar. If the starting point for sync is not known Lodestar must first determine where the starting point is. While the discussion about how that happens is out of scope for this document, the gist is that the beacon node will listen to gossipsub for blocks being broadcast on the network. It will also request MetaData from its peers and use that to start requesting the correct blocks from the network. There are several flags that can be used to configure the sync process. --checkpointSyncUrl --checkpointState --wssCheckpoint --forceCheckpointSync","s":"Syncing Lodestar","u":"/lodestar/run/beacon-management/syncing","h":"#syncing-lodestar","p":347},{"i":363,"t":"There are two components for an ethereum node database, the execution client and the beacon node. Both need to hold data for a full node to work correctly. In particular the execution node holds state such as wallet information and smart contract code. It also holds the execution blocks with the transaction record. The beacon node is responsible for holding beacon node blocks and state. The beacon state is responsible primarily for the validator information. There are several processes that need to store data for Lodestar. These data sets can grow quite large over time so it is important to understand how to manage them so the host machine can support operations effectively. $executionDir # this changes depending on the execution client └── execution-db $dataDir # specified by --dataDir on the beacon command ├── .log_rotate_audit.json ├── beacon.log # there can be many of these ├── enr ├── peer-id.json ├── chain-db # default if --dbDir not specified │ └── (db files) └── peerstore # default if --peerStoreDir not specified └── (peerstore files) $dataDir # specified by --dataDir on the validator command ├── .log_rotate_audit.json ├── validator.log # there can be many of these ├── validator-db # default if --validatorsDbDir not specified │ └── (db files) ├── proposerConfigs # default if --proposerDir not specified │ └── (config files) ├── cache # default if --cacheDir not specified │ └── (cache files) ├── secrets # default if --secretsDir not specified │ ├── 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037... │ └── 0xa329f988c16993768299643d918a2694892c012765d896a16f... ├── keystores # default if --keystoresDir not specified │ ├── 0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037... │ │ └── voting-keystore.json │ └── 0xa329f988c16993768299643d918a2694892c012765d896a16f... │ └── voting-keystore.json └── remoteKeys # default if --remoteKeysDir not specified └── 0xa329f988c16993768299643d918a2694892c012765d896a16f.json","s":"Data Retention","u":"/lodestar/run/beacon-management/data-retention","h":"","p":362},{"i":365,"t":"Configuring your node to store and prune data is key to success. On average you can expect for the database to grow by the follow amounts: execution-db grows at 2-30GB per week chain-db grows at 1GB per month validator-db grows at less than 2MB per year, per key (2000 keys = 4GB per year) keystores, keystore-cache and peerstore are not usually very large and are not expected to grow much during normal operation. Logs can also become quite large so please check out the section on log management for more information. There is really only one flag that is needed to manage the data for Lodestar, --dataDir. Other than that handling log management is really the heart of the data management story. Beacon node data is what it is. Depending on the execution client that is chosen, there may be flags to help with data storage growth but that is outside the scope of this document.","s":"Data Management","u":"/lodestar/run/beacon-management/data-retention","h":"#data-management","p":362},{"i":367,"t":"Running a Lodestar node on mainnet or a testnet only requires basic familiarity with the terminal. The following instructions are required to configure and run the Lodestar beacon node. This page assumes you have already setup an Ethereum execution client.","s":"Beacon Management","u":"/lodestar/run/beacon-management/starting-a-node","h":"","p":366},{"i":369,"t":"Make sure Lodestar is installed in your local environment, following the chosen Installation method. The following command should return a non-error message. ./lodestar --help For a complete list of beacon node CLI commands and options, see the beacon CLI Command section. To select a known testnet or mainnet, use the --network flag. The option mainnet is selected by default, and a list of available networks is listed with the --help flag. Setting the --network flag will conveniently configure the beacon node for the selected network. For power users, any configuration option should be able to be overridden.","s":"Connect to Mainnet or a Public Testnet","u":"/lodestar/run/beacon-management/starting-a-node","h":"#connect-to-mainnet-or-a-public-testnet","p":366},{"i":371,"t":"Ethereum requires a secure authentication with the Engine API for connecting to your chosen execution client on port 8551.","s":"Configure the Lodestar JWT Authentication Token","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-the-lodestar-jwt-authentication-token","p":366},{"i":373,"t":"You must generate a secret 32-byte (64 characters) hexadecimal string that will be used to authenticate with an execution node. You can use the following command in most terminals to generate a random secret: openssl rand -hex 32. Or you can use an online generator. Save this secret key into a text file and note where you store this file.","s":"Generate a Secret Key","u":"/lodestar/run/beacon-management/starting-a-node","h":"#generate-a-secret-key","p":366},{"i":375,"t":"When starting up a Lodestar beacon node in any configuration, ensure you add the --jwtSecret $JWT_SECRET_PATH flag to point to the saved secret key file.","s":"Configure Lodestar to Locate the JWT Secret","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-lodestar-to-locate-the-jwt-secret","p":366},{"i":377,"t":"For Go Ethereum: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Nethermind: Use the --JsonRpc.JwtSecretFile /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Besu: Use the --engine-jwt-secret=/path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Erigon: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here. For Reth: Use the --authrpc.jwtsecret /path/to/jwtsecret.hex flag to configure the secret. Use their documentation here.","s":"Configure the Execution Client with the JWT Secret","u":"/lodestar/run/beacon-management/starting-a-node","h":"#configure-the-execution-client-with-the-jwt-secret","p":366},{"i":379,"t":"To start the Lodestar beacon, run the command: ./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH This will assume an execution client is available at the default location of https://localhost:8545. If the execution clients are available at different locations, use the flag --execution.urls to specify these locations in the command: ./lodestar beacon --network $NETWORK_NAME --jwtSecret $JWT_SECRET_PATH --execution.urls $EL_URL1 $EL_URL2 Your initial logs should confirm that the node has started. Jul-31 13:35:27.967[] info: Lodestar network=mainnet, version=v1.21.0/ff35faa, commit=ff35faae4ad1697b86d708a0367a95a71648ab6e Jul-31 13:35:28.344[] info: Connected to LevelDB database path=/data/lodestar/chain-db Jul-31 13:35:49.828[] info: Initializing beacon from a valid db state slot=9633504, epoch=301047, stateRoot=0xfa2845a6877b98555906a1654941c97d9c05bdd41e61cc0870a967dc9030b156, isWithinWeakSubjectivityPeriod=true Jul-31 13:35:51.955[chain] info: Historical state worker started Jul-31 13:35:51.969[eth1] info: Eth1 provider urls=http://localhost:8551 Jul-31 13:35:51.975[execution] info: Execution client urls=http://localhost:8551 Jul-31 13:35:51.977[] info: External builder url=http://localhost:8661 Jul-31 13:36:21.128[network] info: running libp2p instance in worker thread Jul-31 13:36:21.727[network] info: libp2p worker started peer=15Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW Jul-31 13:36:27.677[network] info: discv5 worker started peerId=16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, initialENR=enr:-IO4QHGTUd1Zg8LAhUAioOz_ySTKoJLIOa6zltSP_AvvhTFVYw6M6YB35IxsiKxQG7nUgCpUB5SIsNxMntCNlTK9sMEBgmlkgnY0iXNlY3AyNTZrMaEC24cdmzuGnWqSwF-8Hw2gbkAZDzMWW3LsHJfp_kDhy-GDdGNwgiMog3VkcIIeWH, bindAddr4=/ip4/0.0.0.0/udp/9000 Jul-31 13:36:28.134[network] info: PeerId 16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, Multiaddrs /ip4/0.0.0.0/tcp/9000 Jul-31 13:36:28.137[metrics] info: Started metrics HTTP server address=http://127.0.0.1:8008 Jul-31 13:36:28.256[rest] info: Started REST API server address=http://0.0.0.0:9596 Jul-31 13:36:28.257[] info: Searching peers - peers: 0 - slot: 9634080 - head: (slot -576) 0x9d88…d02a - exec-block: syncing(20426302 0xcec4…) - finalized: 0x7feb…c130:301045 Jul-31 13:36:36.461[execution] info: Execution client is synced oldState=ONLINE, newState=SYNCED Jul-31 13:36:53.019[] info: Syncing - 3.7 minutes left - 2.32 slots/s - slot: 9634082 - head: (slot -515) 0x792f…f8aa - exec-block: valid(20426365 0x58b1…) - finalized: 0x9d88…d02a:301047 - peers: 11 Jul-31 13:38:53.168[] info: Syncing - 11 seconds left - 4.01 slots/s - slot: 9634092 - head: (slot -44) 0x7491…f63e - exec-block: valid(20426841 0xd4b2…) - finalized: 0x1e00…6e6b:301062 - peers: 59 Jul-31 13:38:58.051[network] info: Subscribed gossip core topics Jul-31 13:38:58.132[sync] info: Subscribed gossip core topics Jul-31 13:39:05.001[] info: Synced - slot: 9634093 - head: 0x35de…1f0e - exec-block: valid(20426886 0x10ff…) - finalized: 0x88f8…5375:301063 - peers: 70 Jul-31 13:39:17.000[] info: Synced - slot: 9634094 - head: 0x7844…3b3e - exec-block: valid(20426887 0x67d1…) - finalized: 0x88f8…5375:301063 - peers: 69 Jul-31 13:39:29.000[] info: Synced - slot: 9634095 - head: 0x5516…ba12 - exec-block: valid(20426888 0x4ceb…) - finalized: 0x88f8…5375:301063 - peers: 74 info If your node is stuck with Searching peers, review your network configuration to make sure your ports are open and forwarded to your host machine. By default, Lodestar stores all configuration and chain data at the path $XDG_DATA_HOME/lodestar/$NETWORK_NAME. A young testnet should take a few hours to sync. If you see multiple or consistent errors in the logs, please open a Github issue or reach out to us in Discord. By reporting anomalies, you are helping to accelerate the progress of Ethereum consensus and we thank you for contributing! warning It is dangerous to expose your Beacon or Execution APIs publicly as there is no default authentication mechanism provided. Ensure your beacon node host is not exposing ports 8545 or 9596 outside of your internal network.","s":"Run the Beacon Node","u":"/lodestar/run/beacon-management/starting-a-node","h":"#run-the-beacon-node","p":366},{"i":381,"t":"If you are starting your node from a blank database, or from a last saved database state that is too old (outside of the weak subjectivity period), your node will be susceptible to \"long range attacks.\" Ethereum's solution to this attack is via something called weak subjectivity. Read Vitalik's illuminating post explaining weak subjectivity.. If you have a synced beacon node available (e.g., your friend's node or a trusted infrastructure provider) to serve a trusted checkpoint you can rely on, you can start syncing your beacon node from that available checkpoint with the flag --checkpointSyncUrl and passing in the URL of the checkpoint provider. This will allow your beacon node to sync within minutes rather than several days. The Ethereum community has maintained a set of public beacon chain checkpoints that serve these sync endpoints to the larger community. You can correlate the state root and the block root with more than one provider to verify the checkpoints being served follow the same canonical chain. Just supply these extra arguments to your beacon node command: --checkpointSyncUrl [--wssCheckpoint ] In case you really trust the --checkpointSyncUrl provider, then you may skip providing --wssCheckpoint, which will then result into your beacon node syncing and starting off the recently finalized state from the trusted URL. warning Please be aware that a malicious checkpoint sync server URL can put you on the wrong chain with a danger of you losing your funds by social engineering. If possible, validate your wssCheckpoint state from multiple places (e.g. different client distributions) or from other trusted sources. This will highly reduce the risk of starting off on a malicious chain. This list of public endpoints maintained by the Ethereum community may be used for reference. Still Taking Long to Sync?​ After your node has been offline for a while, it might be the case that it takes a long time to sync even though a --checkpointSyncUrl is specified. This is due to the fact that the last database state is still within the weak subjectivity period (~15 days on mainnet) which causes the node to sync from the database state instead of the checkpoint state. It is possible to force syncing from a checkpoint state by supplying the --forceCheckpointSync flag. This option is only recommended if it is absolutely necessary for the node to be synced right away to fulfill its duties as there is an inherent risk each time the state is obtained from an external source.","s":"Checkpoint Sync","u":"/lodestar/run/beacon-management/starting-a-node","h":"#checkpoint-sync","p":366},{"i":383,"t":"The Lodestar beacon sync log aims to provide information of utmost importance about the state of your node and be succinct at the same time. You may see the sync logs in the following format: [Sync status] - [ Slot info ] - [Head info] - [Execution block info] - [Finalized info] - [Peers info] See the following example of different kinds of sync log: Apr-20 15:24:08.034[] info: Searching peers - peers: 0 - slot: 6265018 - head: 6264018 0xed93…7b0a - exec-block: syncing(17088476 0x9649…) - finalized: 0xbf30…7e7c:195777 Apr-20 15:24:17.000[] info: Searching peers - peers: 0 - slot: 6265019 - head: 6264018 0xed93…7b0a - exec-block: syncing(17088476 0x9649…) - finalized: 0xbf30…7e7c:195777 Apr-20 15:13:41.298[] info: Syncing - 2.5 minutes left - 2.78 slots/s - slot: 6264966 - head: 6262966 0x5cec…f5b8 - exec-block: valid(17088105 0x6f74…) - finalized: 0x5cc0…3874:195764 - peers: 1 Apr-20 15:13:41.298[] info: Syncing - 2 minutes left - 2.78 slots/s - slot: 6264967 - head: 6263965 0x5cec…f5b8 - exec-block: valid(17088105 0x6f74…) - finalized: 0x5cc0…3874:195764 - peers: 1 Apr-20 15:13:53.151[] info: Syncing - 1.6 minutes left - 3.82 slots/s - slot: 6264967 - head: (slot -360) 0xe0cf…9f3c - exec-block: valid(17088167 0x2d6a…) - finalized: 0x8f3f…2f81:195766 - peers: 5 Apr-20 15:14:05.425[] info: Syncing - 1.1 minutes left - 4.33 slots/s - slot: 6264968 - head: (slot -297) 0x3655…1658 - exec-block: valid(17088231 0xdafd…) - finalized: 0x9475…425a:195769 - peers: 2 Apr-20 15:14:53.001[] info: Syncing - 9 seconds left - 5.00 slots/s - slot: 6264972 - head: (slot -45) 0x44e4…20a4 - exec-block: valid(17088475 0xca61…) - finalized: 0x9cbd…ba83:195776 - peers: 8 Apr-20 15:15:01.443[network] info: Subscribed gossip core topics Apr-20 15:15:01.446[sync] info: Subscribed gossip core topics Apr-20 15:15:05.000[] info: Synced - slot: 6264973 - head: 0x90ea…c655 - exec-block: valid(17088521 0xca9b…) - finalized: 0x6981…682f:195778 - peers: 6 Apr-20 15:15:17.003[] info: Synced - slot: 6264974 - head: 0x4f7e…0e3a - exec-block: valid(17088522 0x08b1…) - finalized: 0x6981…682f:195778 - peers: 6 Apr-20 15:15:41.001[] info: Synced - slot: 6264976 - head: (slot -1) 0x17c6…71a7 - exec-block: valid(17088524 0x5bc1…) - finalized: 0x6981…682f:195778 - peers: 8 Apr-20 15:15:53.001[] info: Synced - slot: 6264977 - head: (slot -2) 0x17c6…71a7 - exec-block: valid(17088524 0x5bc1…) - finalized: 0x6981…682f:195778 - peers: 8 Apr-20 15:16:05.000[] info: Synced - slot: 6264978 - head: 0xc9fd…28c5 - exec-block: valid(17088526 0xb5bf…) - finalized: 0x6981…682f:195778 - peers: 8 Apr-20 15:16:17.017[] info: Synced - slot: 6264979 - head: 0xde91…d4cb - exec-block: valid(17088527 0xa488…) - finalized: 0x6981…682f:195778 - peers: 7 Sync status: This status takes three values: Synced: The node is currently synced Syncing The node is currently in the syncing process Searching: The node is is still looking for viable peers from where it can download blocks Slot (clock) info: The current ongoing slot as per the chain genesis Head info: Specifies where the local beacon chain head hash is. In case it's far behind the Slot (clock), then it independently shows the head slot. Else, it will show how far behind the node is from the Slot (if the difference is < 1000) Execution block info: Provides the information about the execution block head, whether its confirmed valid or still syncing to it. In parenthesis, it shows the current execution block number and a short hash for easy identification Finalized info: Shows the current local finalized checkpoint in the format of [checkpoint root]:[checkpoint epoch]. For example: 0xd7ba…8386:189636 shows a checkpoint root of 0xd7ba…8386 in epoch 189636 Peer info: Current total number of outbound and inbound peers For more insight into how a Lodestar beacon node is functioning, you may setup Lodestar metrics with the --metrics flag and use the prepared Grafana dashboards that are found in the repository. Check out our section on Prometheus and Grafana for more details.","s":"Sync Log Guide","u":"/lodestar/run/beacon-management/starting-a-node","h":"#sync-log-guide","p":366},{"i":385,"t":"Run a discv5 bootnode. This will NOT perform any beacon node functions, rather, it will run a discv5 service that allows nodes on the network to discover one another.","s":"bootnode CLI Command","u":"/lodestar/run/bootnode/bootnode-cli","h":"","p":384},{"i":387,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --rcConfig​ RC file to supplement command line args, accepted formats: .yml, .yaml, .json type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --listenAddress​ The IPv4 address to listen for discv5 connections type: string default: \"0.0.0.0\" --port​ The UDP port to listen on type: number default: 9000 --listenAddress6​ The IPv6 address to listen for discv5 connections type: string --port6​ The UDP port to listen on type: number default: 9090 --bootnodes​ Additional bootnodes for discv5 discovery type: string[] default: [ \"[]\" ] --bootnodesFile​ Additional bootnodes for discv5 discovery file path type: string --persistNetworkIdentity​ Whether to reuse the same peer-id across restarts type: boolean default: true --enr.ip​ Override ENR IP entry type: string --enr.udp​ Override ENR UDP entry type: number --enr.ip6​ Override ENR IPv6 entry type: string --enr.udp6​ Override ENR (IPv6-specific) UDP entry type: number --nat​ Allow ENR configuration of non-local addresses type: boolean --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --metrics​ Enable the Prometheus metrics HTTP server type: boolean --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 8008 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\"","s":"bootnode Options","u":"/lodestar/run/bootnode/bootnode-cli","h":"#bootnode-options","p":384},{"i":390,"t":"Binaries can be downloaded from the Lodestar release page under the Assets section. Run the following command to install the latest version curl -fsSL https://chainsafe.github.io/lodestar/install | bash","s":"Binaries","u":"/lodestar/run/getting-started/installation","h":"#binaries","p":388},{"i":392,"t":"The chainsafe/lodestar Docker Hub repository is maintained actively. It contains the lodestar CLI preinstalled. info The Docker Hub image tagged as chainsafe/lodestar:next is run on CI every commit on our unstable branch. For stable releases, the image is tagged as chainsafe/lodestar:latest. Ensure you have Docker installed by issuing the command: docker -v It should return a non error message such as Docker version xxxx, build xxxx. Pull, run the image and Lodestar should now be ready to use docker pull chainsafe/lodestar docker run chainsafe/lodestar --help info Docker is the recommended setup for Lodestar. Use our Lodestar Quickstart scripts with Docker for detailed instructions.","s":"Docker Installation","u":"/lodestar/run/getting-started/installation","h":"#docker-installation","p":388},{"i":395,"t":"Make sure to have Yarn installed. It is also recommended to install NVM (Node Version Manager) and use the LTS version (currently v22) of NodeJS. info NodeJS versions older than the current LTS are not supported by Lodestar. We recommend running the latest Node LTS. It is important to make sure the NodeJS version is not changed after reboot by setting a default nvm alias default && nvm use default. note Node Version Manager (NVM) will only install NodeJS for use with the active user. If you intend on setting up Lodestar to run under another user, we recommend using NodeSource's source for NodeJS so you can install NodeJS globally.","s":"Prerequisites","u":"/lodestar/run/getting-started/installation","h":"#prerequisites","p":388},{"i":397,"t":"Clone the repository locally and build from the stable release branch. git clone -b stable https://github.com/chainsafe/lodestar.git Switch to created directory. cd lodestar","s":"Clone repository","u":"/lodestar/run/getting-started/installation","h":"#clone-repository","p":388},{"i":399,"t":"Install across all packages. Lodestar follows a monorepo structure, so all commands below must be run in the project root. yarn install","s":"Install packages","u":"/lodestar/run/getting-started/installation","h":"#install-packages","p":388},{"i":401,"t":"Build across all packages. yarn run build","s":"Build source code","u":"/lodestar/run/getting-started/installation","h":"#build-source-code","p":388},{"i":403,"t":"Lodestar should now be ready for use. ./lodestar --help See Command Line Reference for further information.","s":"Lodestar CLI","u":"/lodestar/run/getting-started/installation","h":"#lodestar-cli","p":388},{"i":405,"t":"ModuleNotFoundError: No module named 'distutils' If you stump upon this issue while running Yarn, it's because Python 3.12 had removed distutils package. That package is required for node build tool. You can install it with following command. pip3 install setuptools --force-reinstall --user","s":"Known Issues","u":"/lodestar/run/getting-started/installation","h":"#known-issues","p":388},{"i":407,"t":"danger For mainnet (production) usage, we only recommend installing with Docker, using binaries or building from source due to NPM supply chain attacks. Until a safer installation method has been found, do not use this install method except for experimental purposes only.","s":"Install from NPM [not recommended]","u":"/lodestar/run/getting-started/installation","h":"#install-from-npm-not-recommended","p":388},{"i":409,"t":"In order to make things easier and quicker for all types of users to bootstrap the Lodestar consensus client with a variety of execution clients, we have come up with Lodestar Quickstart Docker scripts! ✅ Zero configuration ✅ Single command startup ✅ All testnets supported along with mainnet ✅ All mainstream execution clients integrated","s":"Lodestar Quick Start Scripts","u":"/lodestar/run/getting-started/quick-start","h":"","p":408},{"i":411,"t":"We actively maintain and update the configurations of running Lodestar with the most commonly used execution clients for various test/production networks so there is minimal configuration required for a standard setup. If you have questions about these scripts, documentation or repository, feel free to talk to us on our ChainSafe Discord or open an issue and a member of the team or our community will be happy to assist you.","s":"Support","u":"/lodestar/run/getting-started/quick-start","h":"#support","p":408},{"i":413,"t":"You can further adapt our Quickstart Docker scripts to your node setups with ease! Use our Quickstart Custom Setup Guide!","s":"Customizations (Optional)","u":"/lodestar/run/getting-started/quick-start","h":"#customizations-optional","p":408},{"i":415,"t":"Lodestar has the ability to send client stats to a remote service for collection. At the moment, the main service offering remote monitoring is beaconcha.in. Instructions for setting up client monitoring with beaconcha.in can be found in their docs about Mobile App <> Node Monitoring and in your account settings.","s":"Client Monitoring","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"","p":414},{"i":417,"t":"Lodestar provides CLI options to configure monitoring on both the beacon node and validator client.","s":"Configuration","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#configuration","p":414},{"i":419,"t":"Client monitoring can be enabled by setting the --monitoring.endpoint flag to a remote service endpoint URL. --monitoring.endpoint \"https://beaconcha.in/api/v1/client/metrics?apikey={apikey}&machine={machineName}\" In case of beaconcha.in, the API key can be found in your account settings. Setting the machine is optional but it is especially useful if you are monitoring multiple nodes. note When sending data to a remote service you should be conscious about security: Only use a service that you trust as this will send information which may identify you and associate your validators, IP address and other personal information. Always use an HTTPS connection (i.e. a URL starting with https://) to prevent the traffic from being intercepted in transit and leaking information. More details about the data sent to the remote service can be found in the specification. It is also possible to print out the data sent to the remote service by enabling debug logs which can be done by supplying the --logLevel debug flag.","s":"Remote endpoint URL","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#remote-endpoint-url","p":414},{"i":421,"t":"It is possible to adjust the interval between sending client stats to the remote service by setting the --monitoring.interval flag. It takes an integer value in milliseconds, the default is 60000 which means data is sent once a minute. For example, setting an interval of 300000 would mean the data is only sent every 5 minutes. --monitoring.interval 300000 Increasing the monitoring interval can be useful if you are running into rate limit errors when posting large amounts of data for multiple nodes.","s":"Monitoring interval","u":"/lodestar/run/logging-and-metrics/client-monitoring","h":"#monitoring-interval","p":414},{"i":423,"t":"This is a step-by-step guide to utilize @ChainSafe/lodestar-quickstart to setup a Ubuntu-based full Ethereum node using a local execution client and ChainSafe's Lodestar consensus client via Docker (the recommended method to use Lodestar for production environments). This is an adaptation of Somer Esat's guides for the Ethereum staking community. This guide will provide instructions which include running a local execution node. This guide uses Lodestar's stable release branch and supports Holesky testnet setups and Mainnet. info This guide specifically focuses on using Lodestar's Quickstart scripts which allows for near instant setup with the following technologies: Ubuntu v22.04 (LTS) x64 server Ethereum Execution (eth1) clients: Erigon | Github Go-Ethereum (Geth) | Github Hyperledger Besu | Github Nethermind | Github Rust | Github ChainSafe's Lodestar Ethereum Consensus Client | Github Docker Engine danger This guide does not assist with securing your server such as secure SSH logins or enabling firewalls. Ensure you have limited access to your server and blocked unused ports with guides such as CoinCashew's Security Best Practices for your ETH staking validator node before continuing with this guide. warning This guide is for informational purposes only and does not constitute professional advice. The author does not guarantee accuracy of the information in this article and the author is not responsible for any damages or losses incurred by following this article. A full disclaimer can be found at the bottom of this page — please read before continuing.","s":"Quick Start Custom Setup Guide","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"","p":422},{"i":425,"t":"For technical support please reach out to: The Lodestar team actively develops and collaborates on the ChainSafe Discord Server under #🌟-lodestar-general channel. Please subscribe to our Discord server announcements on the ChainSafe Discord Server under #lodestar-announcements channel.","s":"Support","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#support","p":422},{"i":427,"t":"This guide assumes knowledge of Ethereum (ETH), Docker, staking and Linux. You require the following before getting started: Ubuntu Server v22.04 (LTS) amd64 or newer, installed and running on a local machine or in the cloud. A locally running machine is encouraged for greater decentralization — if the cloud provider goes down then all nodes hosted with that provider go down. 32 ETH to run a solo validator with Lodestar. If running on testnet, contact us in our ChainSafe Discord Server for testnet Ether.","s":"Prerequisites","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#prerequisites","p":422},{"i":429,"t":"If moving from a testnet setup to a mainnet setup it is strongly recommended that you start on a fresh (newly installed) server instance. This guide has not been tested for migration scenarios and does not guarantee success if you are using an existing instance with previously installed testnet software.","s":"Testnet to Mainnet","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#testnet-to-mainnet","p":422},{"i":431,"t":"Minimum Recommended Processor Intel Core i3–9100 or AMD Ryzen 5 3450 Intel Core i7–9700 or AMD Ryzen 7 4700 Memory 8 GB RAM 16 GB RAM Storage 130 GB available space SSD 200 GB available space SSD Internet Reliable broadband with 10mbps upload Reliable broadband with >10mbps upload info Check your available disk space. Even you have a large SSD there are cases where Ubuntu is reporting only 100GB free. If this applies to you then take a look at Appendix A — Expanding the Logical Volume.","s":"Hardware Requirements","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#hardware-requirements","p":422},{"i":434,"t":"We must install Docker Engine to run the images on your local machine. Add Docker's GPG keyrings​ Run each line one at a time. sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg Add the repository to Apt sources​ Copy and paste the entire command below. echo \\ \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\ $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | \\ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null Update Ubuntu​ Ensure all updates to your Ubuntu Server are complete. sudo apt-get update sudo apt-get upgrade -y Hit Enter if required to restart services. Install Docker Engine​ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Test Docker​ sudo docker run hello-world If you see the message Hello from Docker! This message shows that your installation appears to be working correctly., you can move on to the next step. Clone lodestar-quickstart repository​ Clone the lodestar-quickstart from Github into your local server. cd ~ && git clone https://github.com/ChainSafe/lodestar-quickstart.git","s":"Install Docker Engine & Docker Compose","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#install-docker-engine--docker-compose","p":422},{"i":437,"t":"The script and required files are located within the lodestar-quickstart folder. cd lodestar-quickstart","s":"Navigate to the root directory","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#navigate-to-the-root-directory","p":422},{"i":439,"t":"We will generate a JWT secret that is shared by the Execution client and Lodestar in order to have a required secure connection for the Engine API on port 8551. openssl rand -hex 32 | tr -d \"\\n\" > \"jwtsecret\" Confirm that your JWT token created. cat jwtsecret ; echo Your terminal should display the secret. Copy the token for the next step. Be careful to only copy the 64 characters corresponding to the secret and nothing else. danger 🚨 WARNING: Do not share this secret as it protects your authenticated port 8551.","s":"Create your own JWT Secret","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#create-your-own-jwt-secret","p":422},{"i":441,"t":"Edit the import-args.sh file. nano import-args.sh Replace the 64 characters after 0x with your token. If you are not running validators, press CTRL + x then y then Enter to save and exit. Proceed to Configuring your Network.","s":"Input your JWT Secret into the import-args.sh script","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#input-your-jwt-secret-into-the-import-argssh-script","p":422},{"i":443,"t":"warning If you are running validators, Ethereum requires validators to set a Fee Recipient which allows you to receive priority fees and MEV rewards when proposing blocks. If you do not set this address, your rewards will be sent to the burn address by default. Configure your validator client's feeRecipient address by changing the FEE_RECIPIENT line. Ensure you specify an Ethereum address you control. An example of a fee recipient set with the address 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d, you would change the configuration to: FEE_RECIPIENT=\"0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d\" If you would like to run MEV-Boost with your validators, proceed to the next section. If you do not want to run MEV-Boost, press CTRL + x then y then Enter to save and exit. Proceed to Configuring your Network.","s":"Configure feeRecipient","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-feerecipient","p":422},{"i":445,"t":"info (Optional): If you are running validators and would like to use MEV-Boost, follow this section. Otherwise, skip this section. Validators running MEV-Boost maximize their staking reward by selling blockspace to an open market of builders. MEV-Boost v1.4+ allows you to set a minimum bid threshold to only use an externally built block if it meets or exceeds this parameter. The min-bid parameter is denominated in ETH. For example, if you want to set your threshold to 0.03 ETH, set your configuration to MIN_BUILDERBID=0.03 When complete, press CTRL + x then y then Enter to save and exit.","s":"Set minimum bid for MEV-Boost validators","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#set-minimum-bid-for-mev-boost-validators","p":422},{"i":447,"t":"When using the quick scripts, each supported network has a .vars file to define the parameters required for configuring the clients to the specified network. To view the available files, use the command: ls *.vars","s":"Configuring your Network","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configuring-your-network","p":422},{"i":449,"t":"Each network has specifics variables that you may want to setup for use. We will use Holesky to demonstrate connecting to a public testnet. Open the holesky.vars file. nano holesky.vars","s":"Select your Network","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#select-your-network","p":422},{"i":451,"t":"info (Optional): If you have validators you intend to use for MEV-boost, you can input the relays you want to connect here. Otherwise, skip this section. You can list multiple relays simply by pasting the relay URL as a variable in this file. RELAY_A=https://0xRelayPubKey@relay.com RELAY_B=https://0xRelayPubKey@relay2.com Make sure to identify the ones you want to use by editing the line: RELAYS=\"$RELAY_A,$RELAY_B\"","s":"Configure MEV-boost relays","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-mev-boost-relays","p":422},{"i":453,"t":"The lodestar-quickstart scripts currently defaults to using our stable release branch. To use our nightly unstable release instead, replace LODESTAR_IMAGE=chainsafe/lodestar:latest with LODESTAR_IMAGE=chainsafe/lodestar:next in the import-images.sh file. You may also choose to use a specific version release of Lodestar. To select a specific version, replace the image with LODESTAR_IMAGE=chainsafe/lodestar:v1.x.x warning ⚠️ We do not recommend using the unstable branch or @chainsafe/lodestar:next docker versions of Lodestar for production related tasks.","s":"Configure Lodestar version","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#configure-lodestar-version","p":422},{"i":455,"t":"note (Optional): We use ChainSafe's Lodestar checkpoints by default. You may choose to point your trusted checkpoint at another source or verify the checkpoints with other providers. If you would rather sync from genesis (not recommended), you can skip this step. Weak subjectivity (checkpoint sync) allows your beacon node to sync within minutes by utilizing a trusted checkpoint from a trusted provider. We highly recommend using this feature so you do not need to wait days to sync from genesis and will mitigate your susceptibility to long-range attacks. Minimize your risk of syncing a malicious chain from a malicious checkpoint by verifying the trusted checkpoint from multiple sources. View the community maintained list of Beacon Chain checkpoint sync endpoints Verify multiple endpoint links and ensure the latest finalized and latest justified block roots are the same Choose one of those endpoint URLs Replace the --checkpointSyncUrl address with your chosen provider. info NOTE: Ensure you use checkpoint URLs from the list above corresponding to the network you are trying to sync or you will receive errors. When complete, press CTRL + x then y then Enter to save and exit.","s":"Modify your weak subjectivity (checkpoint sync) provider","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#modify-your-weak-subjectivity-checkpoint-sync-provider","p":422},{"i":457,"t":"info (Optional): We have already set fixed parameters for a seamless setup. If you are looking to customize the default parameters of the clients you are using, follow this section. Otherwise, skip this section. Fixed parameters for clients can be modified under the fixed.vars configuration file. Under the selected client, modify or add the custom arguments on their corresponding line. note The following are links to client documentation for CLI commands: Lodestar CLI Commands Nethermind CLI Commands Besu CLI Commands Go Ethereum CLI commands Erigon CLI commands Reth CLI commands Once complete, press CTRL + x then y then Enter to save and exit.","s":"Modify other client parameters (For advanced users)","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#modify-other-client-parameters-for-advanced-users","p":422},{"i":459,"t":"info Optional: Skip this entire section if you do not intend to run validators.","s":"Setup Validators","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#setup-validators","p":422},{"i":461,"t":"Make sure you are in your main quickstart directory. Create the pass.txt file containing your validator's decryption password for use. cd ~/lodestar-quickstart nano pass.txt Enter the password for your validators. info Once the validator container is running, you can delete this file from your server. Note that every time you restart this container, you will need this password to decrypt your keystore.json files. Once complete, press CTRL + x then y then Enter to save and exit.","s":"Create validator keystore password","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#create-validator-keystore-password","p":422},{"i":463,"t":"If you want to setup validators with your keystores.json files follow this section. Otherwise, skip this step. Copy/Move keystores to lodestar-quickstart/keystores directory​ Your keystore.json file(s) generated from the staking-deposit-cli or similar generator for validator keys will be placed in the lodestar-quickstart/keystores directory using the cp command to copy or mv command to move the files. mkdir keystores info You may choose to use your own method (e.g. SFTP) for copying/uploading keys to your server. This is only a guide. The format of the command to use is below: cp An example usage of this command is: cp /home/user/validator_keys/keystore-x.json ~/lodestar-quickstart/keystores Ensure your keystore.json files are in the lodestar-quickstart/keystores directory using ls command. ls -lsah ~/lodestar-quickstart/keystores/ You should see the keystore files within the directory. info Ensure the /keystores directory only has the keystore-m_xxxxx.json files and nothing else. If you copied in the deposit_data-xxxxx.json files, you can remove them by using the sudo rm command. Example: sudo rm deposit_data-1552658472.json Continue to the Startup Quickstart Script section.","s":"Option 1: Setup validators with keystores","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#option-1-setup-validators-with-keystores","p":422},{"i":465,"t":"Optional: If you want to setup validators with your keystores.json files but they are not encrypted with the same password, follow this section. Otherwise, skip this step. This option will allow you to run multiple validator clients corresponding to each validator keystore set encrypted with the same password. Therefore, we will setup validatorset1 with one decryption password and validatorset2 with another decryption password. You can repeat these steps to create subsequent validator sets with different keystore decryption passwords. Create validator keystore set directory​ Ensure you are in the lodestar-quickstart directory and create a folder for your first validator keystore set. cd ~/lodestar-quickstart Make the new directory for set one. mkdir validatorset1 Navigate into the directory. cd validatorset1 Create validator keystore password​ Create the pass.txt file containing your validator's decryption password for use. nano pass.txt Enter the password for your validators. info Once the validator container is running, you can delete this file from your server. Note that every time you restart this container, you will need this password to decrypt your keystore.json files. Once complete, press CTRL + x then y then Enter to save and exit. Copy/Move keystores to lodestar-quickstart/validatorset1/keystores directory​ Your keystore.json file(s) generated from the staking-deposit-cli or similar generator for validator keys will be placed in the lodestar-quickstart/validatorset1/keystores directory using the sudo cp command to copy or sudo mv command to move the files. mkdir keystores The format of the command to use is below: cp An example usage of this command is: cp /home/user/validator_keys/keystore-x.json ~/lodestar-quickstart/validatorset1/keystores Ensure your keystore.json files are in the lodestar-quickstart/validatorset1/keystores directory using ls command. ls -lsah ~/lodestar-quickstart/validatorset1/keystores/ You should see the keystore files within the directory. info Ensure the /keystores directory only has the keystore-m_xxxxx.json files and nothing else. If you copied in the deposit_data-xxxxx.json files, you can remove them by using the sudo rm command. Example: sudo rm deposit_data-1552658472.json Repeat the same steps above for validatorset2 and any subsequent sets of validators you require. When complete you should have a similar looking directory tree such as the one below: Then, continue to the Startup Quickstart Script section. Pay particular attention to startup script example five (5) and (6).","s":"Option 2: Setup multiple validator sets with keystores encrypted under different passwords","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#option-2-setup-multiple-validator-sets-with-keystores-encrypted-under-different-passwords","p":422},{"i":467,"t":"warning TESTNET USE ONLY: Do not use this method unless you're validating on a testnet. Your mnemonic will be stored in plaintext on your server, which is unsafe. Optional: If you want to setup validators with your mnemonic. Otherwise, skip this step. Setup Mnemonic​ Select the .vars file corresponding to the network you want to run. For Holesky, select holesky.vars. Open the file with the nano text editor and edit the configuration: nano holesky.vars We will modify the LODESTAR_VALIDATOR_MNEMONIC_ARGS=. Specifically, the mnemonic located after the --fromMnemonic flag. Replace the default mnemonic with your mnemonic. Ensure it is between the quotations Indicate which indexes of the mnemonic you wish Lodestar to run. Specify a specific index number --mnemonicIndexes 0 or a range of numbers --mnemonicIndexes 0..5 info If you created your mnemonic with one key, it is likely located in index 0. If you've added to it, the generated keys are likely the subsequent indexes. Therefore, if you generated one key, it is likely in index 0, so you would use --mnemonicIndexes 0. If you generated five keys, it is likely in index 0 to 4, so you would use --mnemonicIndexes 0..4 Once complete, press CTRL + x then y then Enter to save and exit. Continue to the Startup Quickstart Script section.","s":"Option 3: Setup validators with mnemonic","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#option-3-setup-validators-with-mnemonic","p":422},{"i":469,"t":"Ensure you are in the `~/lodestar-quickstart folder. cd ~/lodestar-quickstart The following are example commands as a template for initiating the quickstart script: Startup a Sepolia beacon node with no validators and Go Ethereum (Geth) execution client with terminals attached: ./setup.sh --dataDir sepolia-data --elClient geth --network sepolia --dockerWithSudo --withTerminal \"gnome-terminal --disable-factory --\" Startup Mainnet beacon node with no validators and Nethermind execution client detached from containers (Recommended only when you've verified the setup has initiated properly with terminals attached): ./setup.sh --dataDir mainnet-data --elClient nethermind --network mainnet --dockerWithSudo --detached Startup Holesky beacon node with validator client (using mnemonic in /keystores) and Erigon execution client detached from containers: ./setup.sh --dataDir holesky-data --elClient erigon --network holesky --dockerWithSudo --detached --withValidatorMnemonic ~/lodestar-quickstart/ Startup Mainnet beacon node with validator client (using keystores) with MEV-Boost and Hyperledger Besu execution client detached from containers: ./setup.sh --dataDir mainnet-data --elClient besu --network mainnet --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/ --withMevBoost Startup Holesky beacon node with validator client set one (using keystores) and execution client Geth detached from containers: ./setup.sh --dataDir holesky-data --elClient geth --network holesky --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/validatorset1 warning You can only start up one set of validator keystores per validator client on the same command. Use the below command (#6) to startup another validator client for another set of validator keys. Startup validator client only with validator client set two (using keystores) and execution client Geth detached from containers: ./setup.sh --dataDir holesky-data --elClient geth --network holesky --dockerWithSudo --detached --withValidatorKeystore ~/lodestar-quickstart/validatorset2 --justVC info The script will standardize naming your containers so running the setup.sh twice, will not create two instances of the same containers. The script will standardize naming your containers so running the ./setup.sh a second time, will not create two instances of the same containers. Configure the above commands with what you intend to run using the Quickstart Script Help table below.","s":"Startup Quickstart Script","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#startup-quickstart-script","p":422},{"i":471,"t":"Command Required/Optional Description dataDir Required File location (volume) of the configuration & data for setup. This directory should be non-existent for the first run. If the directory exists, it will skip fetching the configuration, assuming it has been done previously. You can also clean individual directors of CL/EL between the re-runs. elClient Required The selected EL client you want to run with Lodestar. Options are nethermind, besu, erigon or geth. network Required The network/chain you want to load, reads the corresponding .vars (for e.g. holesky.vars) network configuration , like images, or urls for EL/CL to interact. Example: Default for Holesky is --network holesky using holesky.vars. dockerWithSudo Optional Provide this argument if your Docker needs a sudo prefix. --withTerminal Optional* Provide the terminal command prefix for CL and EL processes to run in your favourite terminal. You may use an alias or a terminal launching script as long as it waits for the command it runs till ends and then closes. If not provided, it will launch the docker processes in in-terminal mode. --detached Optional* By default the script will wait for processes and use user input (ctrl +c) to end the processes, however you can pass this option to skip this behavior and just return, for e.g. in case you just want to leave it running. --withValidatorKeystore Optional** Launch a validator client using LODESTAR_VALIDATOR_MNEMONIC_ARGS (--withValidatorMnemonic) or using a folder (--withValidatorKeystore --justVC connecting to same beacon node. --withValidatorMnemonic Optional** Launch a validator client using mnemonic method.(LODESTAR_VALIDATOR_MNEMONIC_ARGS) as set in the network vars file. --withMevBoost Optional Launch a MEV-Boost container to interface with multiple relays picked for the corresponding network vars file. When paired with --justCL or --justVC this only activates the builder arguments in the beacon/validator and use the builder url set in MEVBOOST_URL variable in fixed.vars --justEL Optional Launch only the Execution Layer client. --justCL Optional Launch only the Lodestar beacon node. --justVC Optional Launch only the Lodestar validator. --skipImagePull Optional Launch with only the local Docker images. Do not update them on this run. note * : Only one of the two options should be provided. ** : Only one of the two options should be provided.","s":"Quickstart Script Help","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#quickstart-script-help","p":422},{"i":473,"t":"You can check the status and get the name of your containers by using the docker ps command: sudo docker ps The containers should not constantly restart. If they restart, likely a misconfiguration occurred.","s":"Check Containers","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-containers","p":422},{"i":475,"t":"You can check the status of what your container is logging to diagnose a problem or follow along the status of your container output. Check the logs by using the docker logs command: sudo docker logs Follow along the logs by adding the -f flag: sudo docker logs -f Limit the fetched logs by indicating the latest container out puts by number of lines using the -n flag. For the last 10 lines: sudo docker logs -n 10 ","s":"Check Container Logs","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-container-logs","p":422},{"i":477,"t":"Your beacon node should initialize and you should see something similar to: Jul-31 13:35:27.967[] info: Lodestar network=mainnet, version=v1.21.0/ff35faa, commit=ff35faae4ad1697b86d708a0367a95a71648ab6e Jul-31 13:35:28.344[] info: Connected to LevelDB database path=/data/lodestar/chain-db Jul-31 13:35:49.828[] info: Initializing beacon from a valid db state slot=9633504, epoch=301047, stateRoot=0xfa2845a6877b98555906a1654941c97d9c05bdd41e61cc0870a967dc9030b156, isWithinWeakSubjectivityPeriod=true Jul-31 13:35:51.955[chain] info: Historical state worker started Jul-31 13:35:51.969[eth1] info: Eth1 provider urls=http://localhost:8551 Jul-31 13:35:51.975[execution] info: Execution client urls=http://localhost:8551 Jul-31 13:35:51.977[] info: External builder url=http://localhost:8661 Jul-31 13:36:21.128[network] info: running libp2p instance in worker thread Jul-31 13:36:21.727[network] info: libp2p worker started peer=15Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW Jul-31 13:36:27.677[network] info: discv5 worker started peerId=16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, initialENR=enr:-IO4QHGTUd1Zg8LAhUAioOz_ySTKoJLIOa6zltSP_AvvhTFVYw6M6YB35IxsiKxQG7nUgCpUB5SIsNxMntCNlTK9sMEBgmlkgnY0iXNlY3AyNTZrMaEC24cdmzuGnWqSwF-8Hw2gbkAZDzMWW3LsHJfp_kDhy-GDdGNwgiMog3VkcIIeWH, bindAddr4=/ip4/0.0.0.0/udp/9000 Jul-31 13:36:28.134[network] info: PeerId 16Uiu2HAmACcmCEXcgt3zCtJL2rqJZ2Mvdjh6U6fe26HgD2FoNRwW, Multiaddrs /ip4/0.0.0.0/tcp/9000 Jul-31 13:36:28.137[metrics] info: Started metrics HTTP server address=http://127.0.0.1:8008 Jul-31 13:36:28.256[rest] info: Started REST API server address=http://0.0.0.0:9596 Jul-31 13:36:28.257[] info: Searching peers - peers: 0 - slot: 9634080 - head: (slot -576) 0x9d88…d02a - exec-block: syncing(20426302 0xcec4…) - finalized: 0x7feb…c130:301045 Jul-31 13:36:36.461[execution] info: Execution client is synced oldState=ONLINE, newState=SYNCED Jul-31 13:36:53.019[] info: Syncing - 3.7 minutes left - 2.32 slots/s - slot: 9634082 - head: (slot -515) 0x792f…f8aa - exec-block: valid(20426365 0x58b1…) - finalized: 0x9d88…d02a:301047 - peers: 11 Jul-31 13:38:53.168[] info: Syncing - 11 seconds left - 4.01 slots/s - slot: 9634092 - head: (slot -44) 0x7491…f63e - exec-block: valid(20426841 0xd4b2…) - finalized: 0x1e00…6e6b:301062 - peers: 59 Jul-31 13:38:58.051[network] info: Subscribed gossip core topics Jul-31 13:38:58.132[sync] info: Subscribed gossip core topics Jul-31 13:39:05.001[] info: Synced - slot: 9634093 - head: 0x35de…1f0e - exec-block: valid(20426886 0x10ff…) - finalized: 0x88f8…5375:301063 - peers: 70 Jul-31 13:39:17.000[] info: Synced - slot: 9634094 - head: 0x7844…3b3e - exec-block: valid(20426887 0x67d1…) - finalized: 0x88f8…5375:301063 - peers: 69 Jul-31 13:39:29.000[] info: Synced - slot: 9634095 - head: 0x5516…ba12 - exec-block: valid(20426888 0x4ceb…) - finalized: 0x88f8…5375:301063 - peers: 74","s":"Check beacon node is progressing","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-beacon-node-is-progressing","p":422},{"i":479,"t":"OPTIONAL: If you are running validators, you can check the validator client logs to ensure the validator keys exist, has been detected and decrypted. Here is an example command if you are running validators on Goerli with the lodestar-quickstart script: sudo docker logs goerli-validator You should see something similar to: Mar-01 03:06:35.048[] info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264 Mar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky Mar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m Mar-01 03:06:35.698[] info: 2 local keystores Mar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea Mar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e Mar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596 Mar-01 03:09:23.813[] info: Genesis fetched from the beacon node Mar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config Mar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot Mar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e Mar-01 03:09:23.830[] info: Validator statuses active=2, total=2 Mar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1 Mar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1 info It is normal to see Error on getProposerDuties in your validator logs as your beacon node and execution node sync up. Give it time.","s":"Check validators are detected and decrypted","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#check-validators-are-detected-and-decrypted","p":422},{"i":481,"t":"You can stop the running containers by using the docker stop command and apply it to more than one container if necessary. sudo docker stop Ensure to remove the container if you don't plan to restart it with the same parameters. sudo docker rm ","s":"Stop Containers","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#stop-containers","p":422},{"i":484,"t":"There are cases where Ubuntu is provisioning only 200GB of a larger SSD causing users to run out of disk space when syncing their Eth1 node. The error message is similar to: Fatal: Failed to register the Ethereum service: write /var/lib/goethereum/geth/chaindata/383234.ldb: no space left on device To address this issue, assuming you have a SSD that is larger than 200GB, expand the space allocation for the LVM by following these steps: sudo lvdisplay <-- Check your logical volume size sudo lvm lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv lvextend -l +100%FREE -r /dev/ubuntu-vg/ubuntu-lv exit sudo resize2fs /dev/ubuntu-vg/ubuntu-lv df -h <-- Check results That should resize your disk to the maximum available space. If you need support, please check with the ChainSafe Discord under the #🌟-lodestar-general channel.","s":"Appendix A - Expanding the Logical Volume","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#appendix-a---expanding-the-logical-volume","p":422},{"i":486,"t":"To update client images, you just need to stop all the containers, remove them and restart the lodestar-quickstart script to automatically check for new images. You can stop the running containers by using the docker stop command with the container names. sudo docker stop Remove the containers by using the docker rm command. sudo docker rm Restart your containers using your Startup Quickstart Script command.","s":"Appendix B - Update client images","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#appendix-b---update-client-images","p":422},{"i":488,"t":"This article (the guide) is for informational purposes only and does not constitute professional advice. The author does not warrant or guarantee the accuracy, integrity, quality, completeness, currency, or validity of any information in this article. All information herein is provided “as is” without warranty of any kind and is subject to change at any time without notice. The author disclaims all express, implied, and statutory warranties of any kind, including warranties as to accuracy, timeliness, completeness, or fitness of the information in this article for any particular purpose. The author is not responsible for any direct, indirect, incidental, consequential or any other damages arising out of or in connection with the use of this article or in reliance on the information available on this article. This includes any personal injury, business interruption, loss of use, lost data, lost profits, or any other pecuniary loss, whether in an action of contract, negligence, or other misuse, even if the author has been informed of the possibility.","s":"Full Disclaimer","u":"/lodestar/run/getting-started/quick-start-custom-guide","h":"#full-disclaimer","p":422},{"i":490,"t":"Prometheus is an open-source monitoring system with efficient time series database and a modern alerting approach. Together with Grafana it's the recommended way to make sure that your node and validator(s) are performing correctly.","s":"Prometheus and Grafana Setup","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"","p":489},{"i":492,"t":"The Lodestar team has setup a script which will copy the latest dashboards compiled by our team for development purposes. By utilizing the script located in /docker/docker-compose.local_dev.sh, you can instantly setup the latest dockerized metrics alongside your local beacon node.","s":"Localized Docker Metrics Script","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#localized-docker-metrics-script","p":489},{"i":494,"t":"To start, download Prometheus from https://prometheus.io/download/. Unzip the downloaded .zip file and run Prometheus from its installed location with the lodestar prometheus.yml passed in as the configuration file ./prometheus --config.file=$dataDir/prometheus.yml info 8008 is also the default port specified in the prometheus.yml in the lodestar repository Then run the Lodestar beacon node with lodestar --metrics=true --metrics.port=8008 Navigate to http://localhost:9090/ in your browser to verify that Prometheus is monitoring Lodestar","s":"Prometheus Setup","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#prometheus-setup","p":489},{"i":496,"t":"Download and install Grafana from its official repository https://grafana.com/docs/grafana/latest/installation/debian/ Add Prometheus as a data source to Grafana https://prometheus.io/docs/visualization/grafana/#installing An example of relevant metrics of interest to monitor are: nodejs_heap_space_size_used_bytes nodejs_eventloop_lag_seconds beaconchain_peers beaconchain_current_slot beaconchain_current_finalized_epoch","s":"Grafana Setup","u":"/lodestar/run/logging-and-metrics/prometheus-grafana","h":"#grafana-setup","p":489},{"i":498,"t":"Lodestar supports connecting an external signing server like Web3Signer, Diva, or any other service implementing the remote signing specification. This allows the validator client to operate without storing any validator private keys locally by delegating the signing of messages (e.g. attestations, beacon blocks) to the external signer which is accessed through a REST API via HTTP(S). This API should not be exposed directly to the public Internet and appropriate firewall rules should be in place to restrict access only from the validator client.","s":"External Signer","u":"/lodestar/run/validator-management/external-signer","h":"","p":497},{"i":500,"t":"Lodestar provides CLI options to connect an external signer. ./lodestar validator --externalSigner.url \"http://localhost:9000\" --externalSigner.fetch The validator client will fetch the list of public keys from the external signer and automatically keep them in sync with signers in local validator store by adding newly discovered public keys and removing no longer present public keys on external signer. By default, the list of public keys will be fetched from the external signer once per epoch (6.4 minutes). This interval can be configured by setting --externalSigner.fetchInterval flag which takes a number in milliseconds. Alternatively, if it is not desired to use all public keys imported on the external signer, it is also possible to explicitly specify a list of public keys to use by setting the --externalSigner.pubkeys flag instead of --externalSigner.fetch.","s":"Configuration","u":"/lodestar/run/validator-management/external-signer","h":"#configuration","p":497},{"i":503,"t":"warning This is an alpha feature. The feature and its format are subject to change. With Lodestar's validator client, you can assign specific metadata for each proposer/public key using a proposer configuration file written in YAML file. This will allow you to set specific graffiti, fee recipients and builder settings per validator key.","s":"Proposer Configuration","u":"/lodestar/run/validator-management/proposer-config","h":"","p":502},{"i":505,"t":"proposer_config: \"0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c\": graffiti: \"graffiti\" strict_fee_recipient_check: false fee_recipient: \"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" builder: gas_limit: \"30000000\" selection: \"executionalways\" boost_factor: \"0\" \"0xa4855c83d868f772a579133d9f23818008417b743e8447e235d8eb78b1d8f8a9f63f98c551beb7de254400f89592314d\": fee_recipient: \"0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\" builder: gas_limit: \"3000000\" selection: \"maxprofit\" boost_factor: \"100\" default_config: graffiti: \"default graffiti\" strict_fee_recipient_check: true fee_recipient: \"0xcccccccccccccccccccccccccccccccccccccccc\" builder: gas_limit: \"30000000\" selection: \"default\" boost_factor: \"90\"","s":"Example proposer_config.yaml","u":"/lodestar/run/validator-management/proposer-config","h":"#example-proposer_configyaml","p":502},{"i":507,"t":"After you have configured your proposer configuration YAML file, you can start Lodestar with an additional CLI flag option pointing to the file: --proposerSettingsFile /path/to/proposer_config.yaml. info The proposer configuration can also be retrieved via the keymanager API endpoint: GET /eth/v0/validator/{pubkey}/proposer_config","s":"Enable Proposer Configuration","u":"/lodestar/run/validator-management/proposer-config","h":"#enable-proposer-configuration","p":502},{"i":509,"t":"Run one or multiple validator clients","s":"validator CLI Command","u":"/lodestar/run/validator-management/validator-cli","h":"","p":508},{"i":511,"t":"The following sub-commands are available with the validator command: validator slashing-protection import validator slashing-protection export validator import validator list validator voluntary-exit validator bls-to-execution-change","s":"Available Sub-Commands","u":"/lodestar/run/validator-management/validator-cli","h":"#available-sub-commands","p":508},{"i":514,"t":"Run one validator client with all the keystores available in the directory .holesky/keystores ./lodestar validator --network holesky","s":"Base validator command","u":"/lodestar/run/validator-management/validator-cli","h":"#base-validator-command","p":508},{"i":516,"t":"--dataDir​ Lodestar root data directory type: string --network​ Name of the Ethereum Consensus chain network to join type: string choices: \"mainnet\", \"gnosis\", \"sepolia\", \"holesky\", \"chiado\", \"ephemery\", \"mekong\", \"dev\" default: \"mainnet\" --paramsFile​ Network configuration file type: string --rcConfig​ RC file to supplement command line args, accepted formats: .yml, .yaml, .json type: string --terminal-total-difficulty-override​ Terminal PoW block TTD override type: string --terminal-block-hash-override​ Terminal PoW block hash override type: string --terminal-block-hash-epoch-override​ Terminal PoW block hash override activation epoch type: string --logLevel​ Logging verbosity level for emitting logs to terminal type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"info\" --logFile​ Path to output all logs to a persistent log file, use 'none' to disable type: string --logFileLevel​ Logging verbosity level for emitting logs to file type: string choices: \"error\", \"warn\", \"info\", \"verbose\", \"debug\", \"trace\" default: \"debug\" --logFileDailyRotate​ Daily rotate log files, set to an integer to limit the file count, set to 0 (zero) to disable rotation type: number default: 5 --keymanager​ Enable key manager API server type: boolean --keymanager.auth​ Enable token bearer authentication for key manager API server type: boolean default: true --keymanager.tokenFile​ Path to file containing bearer token used for key manager API authentication type: string --keymanager.port​ Set port for key manager API type: number default: 5062 --keymanager.address​ Set host for key manager API type: string default: \"127.0.0.1\" --keymanager.cors​ Configures the Access-Control-Allow-Origin CORS header for key manager API type: string default: \"*\" --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ Open validators even if there's a lockfile. Use with caution type: boolean --graffiti​ Specify your custom graffiti to be included in blocks (plain UTF8 text, 32 characters max) type: string --proposerSettingsFile​ A yaml file to specify detailed default and per validator public key customized proposer configs. PS: This feature and its format is in alpha and subject to change type: string --suggestedFeeRecipient​ Specify fee recipient default for collecting the EL block fees and rewards (a hex string representing 20 bytes address: ^0x[a-fA-F0-9]{40}$). It would be possible (WIP) to override this per validator key using config or key manager API. Only used post merge. type: string default: \"0x0000000000000000000000000000000000000000\" --strictFeeRecipientCheck​ Enable strict checking of the validator's feeRecipient with the one returned by engine type: boolean --defaultGasLimit​ Suggested gas limit to the engine/builder for building execution payloads. Only used post merge. type: number default: 30000000 --builder​ An alias for --builder.selection default for the builder flow, ignored if --builder.selection is explicitly provided type: boolean --builder.selection​ Builder block selection strategy default, maxprofit, builderalways, builderonly, executionalways, or executiononly type: string default: \"executiononly\" --builder.boostFactor​ Percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit type: string default: \"100\" --useProduceBlockV3​ Enable/disable usage of produceBlockV3 for block production, is auto enabled on deneb+ blocks type: boolean --broadcastValidation​ Validations to be run by beacon node for the signed block prior to publishing type: string default: \"gossip\" --blindedLocal​ Request fetching local block in blinded format for produceBlockV3 type: boolean default: false --importKeystores​ Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators type: string[] default: [ \"./keystores/*.json\" ] --importKeystoresPassword​ Path to a file with password to decrypt all keystores from importKeystores option type: string default: \"./password.txt\" --doppelgangerProtection​ Enables Doppelganger protection type: boolean --http.requestWireFormat​ Wire format to use in HTTP requests to beacon node. Can be one of json or ssz type: string default: \"json\" --http.responseWireFormat​ Preferred wire format for HTTP responses from beacon node. Can be one of json or ssz type: string default: \"ssz\" --externalSigner.url​ URL to connect to an external signing server type: string --externalSigner.pubkeys​ List of validator public keys used by an external signer. May also provide a single string of comma-separated public keys type: string[] --externalSigner.fetch​ Fetch the list of public keys to validate from an external signer. Cannot be used in combination with --externalSigner.pubkeys type: boolean --externalSigner.fetchInterval​ Interval in milliseconds between fetching the list of public keys from external signer, once per epoch by default type: number --distributed​ Enables specific features required to run as part of a distributed validator cluster type: boolean --metrics​ Enable the Prometheus metrics HTTP server type: boolean default: false --metrics.port​ Listen TCP port for the Prometheus metrics HTTP server type: number default: 5064 --metrics.address​ Listen address for the Prometheus metrics HTTP server type: string default: \"127.0.0.1\" --monitoring.endpoint​ Enables monitoring service for sending clients stats to the specified endpoint of a remote service (e.g. beaconcha.in) type: string --monitoring.interval​ Interval in milliseconds between sending client stats to the remote service type: number default: 60000","s":"validator Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-options","p":508},{"i":518,"t":"Import an interchange file.","s":"validator slashing-protection import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import","p":508},{"i":520,"t":"Supports all parent command options plus the following: --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ If genesisValidatorsRoot can't be fetched from the Beacon node, use a zero hash type: boolean --file​ The slashing protection interchange file to import (.json). required: true type: string","s":"validator slashing-protection import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-import-options","p":508},{"i":522,"t":"Export an interchange file.","s":"validator slashing-protection export","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export","p":508},{"i":524,"t":"Supports all parent command options plus the following: --beaconNodes​ Addresses to connect to BeaconNode type: string[] default: [ \"http://127.0.0.1:9596\" ] --force​ If genesisValidatorsRoot can't be fetched from the Beacon node, use a zero hash type: boolean --file​ The slashing protection interchange file to export to (.json). required: true type: string --pubkeys​ Export slashing protection data only for a given subset of public keys type: string[]","s":"validator slashing-protection export Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-slashing-protection-export-options","p":508},{"i":526,"t":"Imports one or more EIP-2335 keystores into a Lodestar validator client directory, requesting passwords interactively. The directory flag provides a convenient method for importing a directory of keys generated by the eth2-deposit-cli Ethereum Foundation utility.","s":"validator import","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import","p":508},{"i":528,"t":"Import validator keystores generated with the Ethereum Foundation Staking Launchpad ./lodestar validator import --network holesky --importKeystores $HOME/staking-deposit-cli/validator_keys","s":"validator import Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-examples","p":508},{"i":530,"t":"Supports all parent command options plus the following: --importKeystores​ Path(s) to a directory or single file path to validator keystores, i.e. Launchpad validators type: string[] default: [ \"./keystores/*.json\" ] --importKeystoresPassword​ Path to a file with password to decrypt all keystores from importKeystores option type: string default: \"./password.txt\"","s":"validator import Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-import-options","p":508},{"i":532,"t":"Lists the public keys of all validators","s":"validator list","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list","p":508},{"i":534,"t":"List all validator public keys previously imported ./lodestar validator list","s":"validator list Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-list-examples","p":508},{"i":536,"t":"Performs a voluntary exit for a given set of validators as identified via pubkeys. If no pubkeys are provided, it will exit all validators that have been imported.","s":"validator voluntary-exit","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit","p":508},{"i":538,"t":"Perform a voluntary exit for the validator who has a public key 0xF00 ./lodestar validator voluntary-exit --network holesky --pubkeys 0xF00 Perform a voluntary exit for the validator who has a public key 0xF00 and its secret key is on an external signer ./lodestar validator voluntary-exit --network holesky --externalSigner.url http://signer:9000 --externalSigner.fetch --pubkeys 0xF00","s":"validator voluntary-exit Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-examples","p":508},{"i":540,"t":"Supports all parent command options plus the following: --exitEpoch​ The epoch upon which to submit the voluntary exit. If no value is provided, then we default to the current epoch. type: number --pubkeys​ Public keys to exit type: string[] --yes​ Skip confirmation prompt type: boolean","s":"validator voluntary-exit Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-voluntary-exit-options","p":508},{"i":542,"t":"Performs BLS To Execution Change for a given validator (as identified via publicKey. If no publicKey is provided, a prompt will ask the user which validator they would like to choose for BLS To Execution Change.","s":"validator bls-to-execution-change","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change","p":508},{"i":544,"t":"Perform BLS To Execution Change for the validator who has a public key 0xF00 ./lodestar validator bls-to-execution-change --publicKey 0xF00 --fromBlsPrivkey ... --toExecutionAddress ...","s":"validator bls-to-execution-change Examples","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-examples","p":508},{"i":546,"t":"Supports all parent command options plus the following: --publicKey​ Validator public key for which to set withdrawal address hence enabling withdrawals required: true type: string --fromBlsPrivkey​ Bls withdrawals private key to sign the message required: true type: string --toExecutionAddress​ Address to which the validator's balances will be set to be withdrawn. required: true type: string","s":"validator bls-to-execution-change Options","u":"/lodestar/run/validator-management/validator-cli","h":"#validator-bls-to-execution-change-options","p":508},{"i":549,"t":"The following instructions are for stakers utilizing the Lodestar validator client.","s":"Validator Configuration","u":"/lodestar/run/validator-management/vc-configuration","h":"","p":548},{"i":551,"t":"Validators are represented by a BLS keypair. Use your generated mnemonic from one of the tools above to generate the keystore files required for validator duties on Ethereum using the Lodestar validator client.","s":"Setup your validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#setup-your-validator","p":548},{"i":553,"t":"To create a keystore, we recommend using the official Staking Deposit CLI from the Ethereum Foundation for users comfortable with command line interfaces. Alternatively, for a graphical user interface, you can use the Stakehouse Wagyu Key Generator developed by members of the EthStaker community. warning These tools will generate keystore files for staking validators as well as the important mnemonic. This mnemonic must be handled and stored securely.","s":"Create a keystore","u":"/lodestar/run/validator-management/vc-configuration","h":"#create-a-keystore","p":548},{"i":555,"t":"To import a validator JSON keystore that was created via one of the methods described above, you must locate the file for import (ex. keystore-m_12381_3600_0_0_0-1654128694.json). Inside the keystore JSON file, you should have an EIP-2335 keystore file. You will also need the passphrase used the encrypt the keystore. This can be specified interactively, or provided in a plaintext file. Option 1: Import Keys To Lodestar's Keystores Folder​ You can load the keys into the keystore folder using the validator import command. There are two methods for importing keystores: Interactive passphrase import ./lodestar validator import --importKeystores ./validator_keys Plaintext passphrase file import ./lodestar validator import --importKeystores ./validator_keys --importKeystoresPassword ./password.txt info The interactive passphrase import method will prompt every keystore in the validator_keys folder for import and will ask for the individual password for each keystore. This method will allow you to import multiple keystores with different passwords. The plaintext passphrase file import method will allow you to import all keystores in the validator_keys folder encrypted with the same password contained in password.txt for efficiency. Once imported with either method, these keystores will be automatically loaded when you start the validator. To list the imported keystores, use the validator list command. Option 2: Import Keys When Starting the Validator​ To import keys when you start the validator specify the --importKeystores and --importKeystoresPassword flags with the validator command: ./lodestar validator --importKeystores ./validator_keys --importKeystoresPassword ./password.txt warning If you import keys using --importKeystores at runtime (Option 2) any keys loaded to the keystores folder from Option 1 will be ignored.","s":"Import a validator keystore to Lodestar","u":"/lodestar/run/validator-management/vc-configuration","h":"#import-a-validator-keystore-to-lodestar","p":548},{"i":557,"t":"Post-Merge Ethereum requires validators to set a Fee Recipient which allows you to receive priority fees when proposing blocks. If you do not set this address, your priority fees will be sent to the burn address. Configure your validator client's fee recipient address by using the --suggestedFeeRecipient flag. Ensure you specify an Ethereum address you control. An example of a fee recipient set with the address 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d would add the following flag to their configuration: --suggestedFeeRecipient 0xB7576e9d314Df41EC5506494293Afb1bd5D3f65d. You may choose to use the --strictFeeRecipientCheck flag to enable a strict check of the fee recipient address with the one returned by the beacon node for added reassurance. note If you would like to set unique proposer metadata (e.g. fee recipient address) for each validator you are running, see the Proposer Configuration feature. This feature is also available via the keymanager API.","s":"Configuring the fee recipient address","u":"/lodestar/run/validator-management/vc-configuration","h":"#configuring-the-fee-recipient-address","p":548},{"i":559,"t":"If you are running a beacon node with connected builder relays, you may use these validator configurations to signal which block (builder vs. local execution) the beacon node should produce. With produceBlockV3 (enabled automatically after the Deneb hard fork), the --builder.boostFactor is a percentage multiplier the block producing beacon node must apply to boost (>100) or dampen (<100) builder block value for selection against execution block. The multiplier is ignored if --builder.selection is set to anything other than maxprofit. Even though this is set on the validator client, the calculation is requested and applied on the beacon node itself. For more information, see the produceBlockV3 Beacon API. With Lodestar's --builder.selection validator options, you can select: default: Default setting for Lodestar set at --builder.boostFactor=90. This default setting will have a local block boost of ~10%. Note that this value might change in the future depending on what we think is the most appropriate value to help improve censorship resistance of Ethereum. maxprofit: An alias of --builder.boostFactor=100, which will always choose the more profitable block. Using this option, you may customize your --builder.boostFactor to your preference. Examples of its usage are below. executionalways: An alias of --builder.boostFactor=0, which will select the local execution block, unless it fails to produce due to an error or a delay in the response from the execution client. executiononly: Beacon node will be requested to produce local execution block even if builder relays are configured. This option will always select the local execution block and will error if it couldn't produce one. builderalways: An alias of --builder.boostFactor=18446744073709551615 (2**64 - 1), which will select the builder block, unless the builder block fails to produce. The builder block may fail to produce if it's not available, not timely or there is an indication of censorship via shouldOverrideBuilder from the execution payload response. builderonly: Generally used for distributed validators (DVs). No execution block production will be triggered. Therefore, if a builder block is not produced, the API will fail and no block will be produced. Calculating builder boost factor with examples​ To calculate the builder boost factor setting, you need to know what percentage you will accept a builder block for against a local execution block using the following formula: 100*100/(100+percentage). The value passed to --builder.boostFactor must be a valid number without decimals. Example 1: I will only accept a builder block with 25% more value than the local execution block. 10000/(100+25) = 80 Therefore, --builder.boostFactor=80. Example 2: Setting a --builder.boostFactor=0 will always prefer the local execution block, but will produce an available builder block if the local execution block fails. Example 3: Setting a --builder.boostFactor=100 is the same as signaling --builder.selection maxprofit where the validator will always select the most profitable block between the local execution engine and the builder block from the relay.","s":"Configure your builder selection and/or builder boost factor","u":"/lodestar/run/validator-management/vc-configuration","h":"#configure-your-builder-selection-andor-builder-boost-factor","p":548},{"i":561,"t":"Please use the official Ethereum Launchpad to perform your deposits. Ensure your deposits are sent to the proper beacon chain deposit address on the correct network. Mainnet​ Ethereum Mainnet Launchpad Beacon Chain Deposit Contract 0x00000000219ab540356cBB839Cbe05303d7705Fa Holesky Testnet​ Ethereum Holesky Testnet Launchpad Holesky Beacon Chain Deposit Contract 0x4242424242424242424242424242424242424242 Ephemery Testnet​ Ethereum Ephemery Testnet Launchpad Ephemeral Testnet Resources","s":"Submit a validator deposit","u":"/lodestar/run/validator-management/vc-configuration","h":"#submit-a-validator-deposit","p":548},{"i":563,"t":"To start a Lodestar validator run the command: ./lodestar validator --network $NETWORK_NAME You should see confirmation that modules have started. Mar-01 03:06:35.048[] info: Lodestar network=holesky, version=v1.16.0/6ad9740, commit=6ad9740a085574306cf46c7642e749d6ec9a4264 Mar-01 03:06:35.050[] info: Connecting to LevelDB database path=/keystoresDir/validator-db-holesky Mar-01 03:06:35.697[] info: 100% of keystores imported. current=2 total=2 rate=1318.68keys/m Mar-01 03:06:35.698[] info: 2 local keystores Mar-01 03:06:35.698[] info: 0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea Mar-01 03:06:35.698[] info: 0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e Mar-01 03:06:35.732[] info: Beacon node urls=http://127.0.0.1:9596 Mar-01 03:09:23.813[] info: Genesis fetched from the beacon node Mar-01 03:09:23.816[] info: Verified connected beacon node and validator have same the config Mar-01 03:09:23.818[] info: Verified connected beacon node and validator have the same genesisValidatorRoot Mar-01 03:09:23.818[] info: Initializing validator useProduceBlockV3=deneb+, broadcastValidation=gossip, defaultBuilderSelection=executiononly, suggestedFeeRecipient=0xeeef273281fB83F56182eE960aA4bAfe7fE075DE, strictFeeRecipientCheck=false Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234567, pubKey=0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea Mar-01 03:09:23.830[] info: Validator seen on beacon chain validatorIndex=1234568, pubKey=0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7e Mar-01 03:09:23.830[] info: Validator statuses active=2, total=2 Mar-01 03:15:50.191[] info: Published attestations slot=1113379, count=1 Mar-01 03:16:02.728[] info: Published attestations slot=1113380, count=1","s":"Run the validator","u":"/lodestar/run/validator-management/vc-configuration","h":"#run-the-validator","p":548},{"i":566,"t":"⏳ Lodestar currently undergoes a quick release cycle with regular minor releases published roughly fortnightly. 🌐 We encourage using the most recently released version before reporting an issue.","s":"Supported Versions","u":"/lodestar/security","h":"#supported-versions","p":564},{"i":568,"t":"🚨 Please, send vulnerability reports to security@chainsafe.io. ⚠️ Please do not file a public ticket mentioning the vulnerability, as doing so could increase the likelihood of the vulnerability being used before a fix has been created, released and installed on the network.","s":"Reporting a Vulnerability","u":"/lodestar/security","h":"#reporting-a-vulnerability","p":564},{"i":573,"t":"@chainsafe/js-libp2p-noise - Noise handshake for js-libp2p @chainsafe/js-libp2p-gossipsub - Gossipsub protocol for js-libp2p @chainsafe/libp2p-yamux","s":"LibP2P","u":"/lodestar/supporting-libraries/","h":"#libp2p","p":570},{"i":575,"t":"discv5 - Discv5 protocol","s":"Discv5","u":"/lodestar/supporting-libraries/","h":"#discv5","p":570},{"i":577,"t":"@chainsafe/ssz - Simple Serialize (SSZ) @chainsafe/persistent-merkle-tree - binary merkle tree implemented as a persistent data structure @chainsafe/as-sha256 - Small AssemblyScript implementation of SHA256","s":"Serialization and Hashing","u":"/lodestar/supporting-libraries/","h":"#serialization-and-hashing","p":570},{"i":579,"t":"@chainsafe/bls - Isomorphic Ethereum Consensus BLS sign / verify / aggregate @chainsafe/blst-ts - Node specific Ethereum Consensus BLS sign / verify / aggregate @chainsafe/bls-keystore - store / retrieve a BLS secret key from an EIP-2335 JSON keystore @chainsafe/bls-keygen - utility functions to generate BLS secret keys, following EIP-2333 and EIP-2334 @chainsafe/bls-hd-key - low level EIP-2333 and EIP-2334 functionality","s":"BLS","u":"/lodestar/supporting-libraries/","h":"#bls","p":570},{"i":581,"t":"The Lodestar project is divided into TypeScript packages that can be used independently of the CLI. These packages span the breadth of the Ethereum Consensus layer, and are perfect for TypeScript developers looking to build around Ethereum.","s":"Lodestar libraries","u":"/lodestar/supporting-libraries/libraries","h":"","p":580},{"i":583,"t":"Several useful Ethereum consensus libraries are developed as part of the Lodestar monorepo and may be useful when used individually. params - Ethereum consensus constants and fork names types - Ethereum consensus types, TypeScript interfaces and SSZ type objects config - Ethereum consensus run-time network configuration api - Ethereum consensus REST API client flare - Beacon chain multi-purpose and debugging tool light-client - Ethereum light client prover - A set of tools allowing to verify EL client JSON-RPC calls","s":"Monorepo libraries","u":"/lodestar/supporting-libraries/libraries","h":"#monorepo-libraries","p":580},{"i":586,"t":"bls - Ethereum Consensus BLS sign / verify / aggregate bls-keystore - store / retrieve a BLS secret key from an EIP-2335 JSON keystore bls-keygen - utility functions to generate BLS secret keys, following EIP-2333 and EIP-2334 bls-hd-key - low level EIP-2333 and EIP-2334 functionality","s":"BLS Utilities","u":"/lodestar/supporting-libraries/libraries","h":"#bls-utilities","p":580},{"i":588,"t":"ssz - Simple Serialize (SSZ) persistent-merkle-tree - binary merkle tree implemented as a persistent data structure as-sha256 - Small AssemblyScript implementation of SHA256","s":"Hashing","u":"/lodestar/supporting-libraries/libraries","h":"#hashing","p":580},{"i":590,"t":"discv5 - Discv5 protocol js-libp2p-gossipsub - Gossipsub protocol for js-libp2p js-libp2p-noise - Noise handshake for js-libp2p","s":"Networking","u":"/lodestar/supporting-libraries/libraries","h":"#networking","p":580}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,1.218,1,4.07,2,3.994,3,2.559,4,3.291,5,2.245,6,4.522,7,6.308,8,5.015,9,5.168,10,4.421]],["t/5",[0,1.461,2,2.865,3,1.836,6,3.244,11,1.718,12,3.966,13,3.039,14,3.244,15,2.764,16,2.544,17,1.364,18,3.171,19,2.584,20,4.306,21,3.966,22,3.829,23,1.315,24,2.151,25,1.136,26,2.978,27,2.978,28,3.757,29,3.498,30,3.966,31,3.323,32,2.093,33,2.328,34,4.525,35,2.764,36,1.756,37,2.264,38,5.728,39,4.525,40,3.598,41,3.707,42,2.92,43,3.707,44,2.67,45,2.264,46,4.525,47,4.306,48,2.67,49,3.498,50,3.498,51,3.103,52,2.67,53,4.123,54,5.728]],["t/7",[0,0.891,5,1.642,23,1.341,55,5.84,56,2.19,57,5.825,58,1.575,59,3.675,60,4.895,61,6.993,62,5.016,63,5.27,64,6.993,65,6.993,66,3.668,67,5.27,68,5.27,69,4.895,70,5.27,71,3.567,72,4.044,73,7.763,74,6.494,75,4.895,76,4.895,77,5.27,78,3.739,79,5.016,80,6.122,81,5.27,82,4.895,83,6.494,84,6.993,85,6.993,86,6.993]],["t/9",[4,2.901,5,2.457,23,2.006,59,3.338,73,5.899,74,5.899,80,5.561,87,3.276,88,3.88,89,4.421,90,2.987,91,2.943,92,3.234,93,3.659,94,3.987,95,7.039,96,3.457,97,3.987,98,6.351,99,7.039,100,5.066]],["t/11",[0,1.251,1,4.183,2,4.104,41,5.31,101,4.445,102,5.153,103,4.88,104,5.153]],["t/13",[1,3.964,9,5.032,46,6.143,48,3.625,50,4.749,101,4.212,105,6.143,106,5.596,107,6.143,108,6.516,109,5.384,110,4.625,111,7.016,112,6.516]],["t/16",[0,0.89,3,1.664,11,1.557,12,1.358,17,1.04,19,0.885,23,0.77,24,1.64,25,1.798,28,1.646,32,2.616,33,1.784,36,1.027,37,0.775,44,0.914,45,1.735,51,1.063,52,1.563,58,2.659,59,1.589,72,3.039,88,1.489,90,1.422,96,0.963,113,1.412,114,1.311,115,1.18,116,1.899,117,1.063,118,1.662,119,2.757,120,1.961,121,0.963,122,0.745,123,1.712,124,1.77,125,0.963,126,0.981,127,1.311,128,0.963,129,1.922,130,1.489,131,1.198,132,1.644,133,1.412,134,2.412,135,1.644,136,1.55,137,1.232,138,1.77,139,1.961,140,0.93,141,1.311,142,1.311,143,0.608,144,2.648,145,2.486,146,3.261,147,3.36,148,4.888,149,4.685,150,3.352,151,3.024,152,1.77,153,2.519,154,1.474,155,2.519,156,1.55,157,2.757,158,1.961,159,3.678,160,2.321,161,1.198,162,2.597,163,1.444,164,1.167,165,1.086,166,5.173,167,1.412,168,1.55,169,1.644,170,3.171,171,3.218,172,2.14,173,1.412,174,1.111,175,2.241,176,1.063,177,1.063,178,0.981,179,1.961,180,1.961,181,1.949,182,0.871,183,1.644,184,0.963,185,1.111,186,1.743,187,1.919,188,2.196,189,2.648,190,1.961,191,2.047,192,3.443,193,1.77,194,1.412,195,1.063,196,1.961,197,1.358,198,0.786,199,1.362,200,1.307,201,1.412,202,1.77,203,1.086,204,1.086,205,2.699,206,3.737,207,1.961,208,1.816,209,1.961,210,2.809,211,1.961,212,3.352,213,1.944,214,1.422,215,1.27,216,0.93,217,1.994,218,1.644,219,1.994,220,1.961,221,1.358,222,1.232,223,0.699,224,1.412,225,0.786,226,1.961,227,1.55,228,1.138,229,1.994,230,1.77,231,1.961,232,1.961,233,1.55,234,2.282,235,1.167,236,3.352,237,1.167,238,1.27,239,1.111,240,1.961,241,1.111,242,1.961,243,1.412,244,1.412,245,1.961,246,1.138,247,0.845,248,1.961,249,1.961,250,1.55,251,1.27,252,0.745,253,1.961,254,1.961,255,1.77,256,1.77,257,1.644,258,1.358]],["t/18",[0,1.065,11,2.094,28,3.43,33,2.838,36,2.141,90,2.963,93,3.631,94,3.956,115,2.459,119,4.387,129,2.585,130,3.102,145,3.956,239,5.362,259,4.52,260,4.669,261,5.812,262,4.669,263,5.517,264,6.983,265,6.983,266,4.669,267,5.027,268,4.836]],["t/24",[0,1.108,17,1.296,45,2.873,52,3.388,140,4.225,184,3.57,269,7.268,270,4.216,271,4.704,272,6.091,273,5.463,274,4.323,275,5.742,276,4.024,277,5.01,278,5.742,279,5.033,280,7.268,281,4.565]],["t/26",[121,3.819,140,4.401,184,4.559,217,4.625,271,5.032,282,3.625,283,6.143,284,7.016,285,4.625,286,7.016,287,6.143,288,6.516]],["t/28",[24,2.266,25,1.598,35,3.887,115,2.837,118,2.107,273,6.056,289,5.578,290,6.056,291,8.056,292,4.792]],["t/30",[3,2.63,4,3.382,5,2.307,6,4.647,293,8.204,294,3.588,295,5.153,296,3.534]],["t/32",[0,1.118,24,2.519,25,1.919,94,4.151,134,5.274,140,4.246,163,3.156,294,3.205,297,5.789,298,4.475,299,2.978,300,5.074,301,5.789,302,7.328,303,3.666,304,4.603,305,5.074]],["t/34",[0,1.218,17,1.424,140,3.786,273,6.001,290,6.001,306,7.984,307,7.204,308,7.204,309,5.015,310,4.876,311,4.876]],["t/36",[24,2.583,25,1.822,40,4.8,90,3.243,140,3.624,165,4.231,252,3.489,277,3.973,312,9.186,313,5.77,314,5.744]],["t/38",[17,1.647,36,2.363,44,3.593,315,7.708,316,4.176,317,7.708,318,6.955,319,4.841,320,5.337,321,5.548,322,3.93,323,7.708,324,7.708,325,6.46]],["t/40",[3,1.989,4,2.558,24,1.745,25,1.6,125,3.048,140,3.824,200,2.421,297,4.903,300,5.584,326,7.277,327,7.104,328,5.201,329,3.362,330,6.206,331,5.703,332,8.065,333,4.903,334,5.201,335,4.149,336,2.943,337,4.467,338,6.206,339,8.065,340,5.391,341,3.164,342,3.691]],["t/42",[3,2.429,5,2.76,172,3.123,274,4.507,343,6.837,344,5.915,345,4.904,346,5.695,347,4.904,348,5.246,349,7.577,350,3.474,351,6.35,352,3.939]],["t/44",[0,1.186,14,4.404,92,2.878,129,2.878,353,7.775,354,4.625,355,6.143,356,7.779,357,5.384,358,5.596,359,7.775,360,4.212,361,5.844]],["t/46",[3,2.582,4,3.321,26,4.188,115,2.837,143,2.497,247,3.47,261,5.385,294,3.523,307,7.269,362,7.269]],["t/48",[5,2.597,17,1.375,87,2.89,122,2.928,178,3.856,344,4.989,352,4.007,363,6.955,364,6.46,365,6.955,366,6.955,367,3.93,368,4.841,369,4.176]],["t/50",[3,2.63,4,3.382,6,4.647,294,3.588,303,4.104,352,4.265,370,8.204,371,6.482]],["t/52",[3,2.514,4,3.233,17,1.399,29,5.698,45,3.937,56,2.941,372,7.843,373,6.197,374,7.843,375,7.078]],["t/54",[0,1.025,17,1.659,24,2.616,25,1.333,140,3.187,162,4.246,163,2.895,199,2.731,270,3.899,294,3.711,297,5.309,298,4.104,303,3.362,326,6.064,327,4.653,376,6.72,377,7.349,378,4.095,379,3.565,380,6.064,381,3.997,382,6.72,383,6.064]],["t/56",[3,2.63,4,3.382,252,3.116,294,3.588,308,7.403,384,5.681,385,3.481,386,5.681]],["t/58",[0,1.24,29,4.965,140,3.855,270,5.528,271,5.262,294,3.555,354,4.835,387,8.129]],["t/60",[5,2.644,23,1.579,25,1.364,35,3.318,56,2.578,110,4.09,115,2.421,118,2.577,122,2.612,140,3.26,289,4.761,294,3.765,295,4.319,296,3.708,297,5.432,304,4.319,333,5.432,334,5.762,379,3.648,383,6.205,388,3.989,389,5.762]],["t/62",[121,3.887,184,3.887,271,5.122,276,5.193,277,4.114,282,3.689,286,7.14,287,6.252,288,6.632,390,5.948,391,4.833]],["t/64",[6,4.443,20,5.896,379,4.161,392,7.078,393,7.078,394,7.078,395,7.843,396,5.431,397,7.843,398,6.573,399,7.843,400,7.843,401,6.573]],["t/66",[6,4.563,25,1.598,174,4.563,175,5.385,271,5.214,294,3.523,303,4.03,352,4.188,402,8.056,403,8.056]],["t/68",[303,3.994,342,4.749,404,6.308,405,4.876,406,5.337,407,7.984,408,7.984,409,7.984,410,4.07,411,5.015,412,7.984]],["t/70",[6,4.482,17,1.411,294,3.46,303,3.959,352,4.876,404,6.252,405,4.833,413,7.41,414,6.252,415,7.913]],["t/72",[292,4.665,294,3.43,303,3.924,345,5.077,404,6.197,405,5.698,416,8.419,417,5.896,418,6.573,419,7.843,420,5.896]],["t/74",[114,5.535,140,3.926,271,5.359,294,3.621,421,7.472,422,5.535,423,6.939]],["t/76",[17,1.424,31,5.47,143,2.922,303,3.994,405,5.759,417,6.001,424,7.984,425,6.308]],["t/79",[17,1.45,24,2.286,25,1.613,44,3.79,45,3.214,113,5.851,117,4.404,118,2.126,426,6.813]],["t/81",[0,1.207,24,2.225,25,1.57,32,2.892,72,6.494,118,2.07,119,4.97,148,6.632,159,6.632,309,4.97,427,7.14]],["t/83",[0,0.183,1,0.323,3,0.203,4,0.261,5,0.938,11,0.19,13,0.336,17,0.958,23,0.276,24,0.938,25,0.786,26,0.891,27,1.351,28,0.59,32,0.949,33,0.696,36,0.194,37,0.475,44,0.296,45,0.251,49,0.387,56,0.642,57,0.477,58,1.448,59,0.301,66,0.398,72,0.439,87,1.589,88,0.534,89,1.874,91,0.503,92,0.445,94,0.359,100,0.456,115,0.766,118,1.404,119,0.398,122,0.987,126,0.601,127,0.803,129,1.754,141,0.424,142,0.424,143,0.531,144,0.501,145,1.89,147,0.778,148,0.531,149,0.572,151,0.572,152,0.572,153,0.477,154,1.288,155,0.477,156,0.501,157,0.398,159,0.531,161,1.329,162,1.982,163,0.937,164,1.774,166,2.065,167,0.456,168,2.356,171,1.285,172,0.261,173,0.456,174,0.97,175,1.455,176,0.928,178,2.588,181,0.967,185,0.359,186,0.33,188,0.857,192,0.343,195,1.807,197,1.186,199,0.885,203,0.351,206,0.456,208,2.567,210,0.531,213,1.263,214,3.77,216,3.43,223,0.776,225,0.872,228,0.368,234,1.351,235,1.019,239,0.359,241,1.233,246,0.697,247,0.273,252,0.241,258,0.832,259,0.778,260,0.803,266,0.424,267,0.456,268,3.436,276,1.205,279,0.439,282,0.799,290,0.477,292,0.377,294,0.277,295,0.398,296,2.786,303,0.317,309,0.755,310,1.046,313,0.398,319,0.755,322,1.11,327,1.507,335,0.803,344,0.41,350,1.191,352,0.33,367,1.11,368,1.076,369,0.651,384,1.507,385,4.176,388,0.697,391,2.037,410,1.324,427,1.546,428,0.715,429,0.827,430,5.098,431,0.306,432,0.477,433,0.41,434,0.33,435,0.477,436,0.456,437,0.477,438,0.477,439,1.706,440,0.424,441,0.424,442,0.477,443,0.336,444,0.456,445,0.424,446,0.477,447,0.832,448,1.186,449,2.323,450,0.477,451,1.632,452,1.69,453,0.368,454,0.572,455,1.774,456,0.368,457,1.546,458,0.456,459,2.204,460,1.545,461,2.242,462,2.159,463,0.41,464,0.949,465,0.501,466,1.587,467,0.572,468,0.572,469,1.799,470,0.572,471,0.501,472,0.832,473,1.076,474,0.387,475,0.377,476,0.755,477,0.277,478,0.501,479,0.469,480,0.439,481,4.943,482,0.572,483,1.233,484,0.439,485,0.456,486,0.456,487,0.398,488,0.398,489,0.456,490,0.291,491,0.755,492,0.531,493,0.903,494,0.531,495,0.832,496,1.109,497,0.41,498,0.778,499,2.298,500,2.298,501,1.87,502,0.572,503,1.983,504,0.715,505,0.778,506,1.545,507,0.572,508,1.567,509,0.456,510,1.567,511,0.651,512,1.288,513,0.58,514,0.613,515,0.715,516,0.477,517,0.477,518,0.477,519,0.477,520,0.477,521,0.903,522,0.439,523,0.734,524,0.424,525,1.007,526,3.067,527,0.572,528,0.501,529,1.084,530,0.41,531,0.477,532,0.572,533,0.572,534,0.903,535,1.007,536,0.949,537,0.572,538,0.531,539,0.572,540,0.572,541,0.531,542,0.572,543,0.572,544,0.477,545,0.832,546,0.456,547,0.377,548,1.455,549,0.439,550,0.865,551,0.501,552,0.501,553,0.456,554,1.391,555,0.531,556,0.531,557,0.531,558,0.531,559,0.323,560,0.572,561,1.046,562,2.075,563,0.531,564,0.572,565,0.572,566,0.572,567,0.343,568,2.147,569,0.572,570,0.531,571,0.572,572,0.572,573,0.572,574,0.949,575,1.436,576,0.398,577,0.41,578,0.572,579,0.572,580,0.572,581,0.572,582,1.084,583,1.953,584,1.084,585,0.572,586,1.546,587,0.572,588,0.501,589,1.076,590,0.531,591,0.572,592,0.439,593,0.501,594,0.477,595,0.501,596,1.354,597,0.715,598,0.286,599,0.477,600,0.572,601,1.567,602,1.507,603,0.949,604,0.501,605,0.398,606,0.572,607,0.572,608,0.572,609,0.456,610,1.824,611,0.501,612,0.531,613,0.572,614,0.572,615,0.572,616,0.501,617,0.456,618,1.007,619,0.572,620,1.084,621,0.572,622,0.572,623,0.572,624,1.076,625,0.501,626,2.635,627,1.953,628,0.572,629,0.501,630,0.501,631,0.903,632,0.803,633,0.343,634,0.477,635,0.501,636,0.832,637,0.501,638,0.501,639,0.501,640,2.752,641,0.531,642,1.084,643,0.778,644,1.007,645,0.501,646,1.719,647,1.354,648,1.007,649,0.531,650,0.572,651,0.398,652,0.572,653,0.531,654,0.439,655,0.572,656,0.572,657,0.531,658,0.572,659,1.084,660,0.531,661,0.501,662,0.531,663,0.501,664,0.456,665,0.501,666,0.572,667,1.084,668,0.572,669,0.572,670,0.572,671,0.572,672,0.572,673,0.949,674,0.501,675,0.572,676,0.572,677,0.572,678,0.949,679,0.803,680,0.572,681,0.531,682,0.477,683,0.456,684,0.456,685,0.531,686,0.398,687,0.477,688,0.734,689,0.531,690,0.317,691,0.531,692,0.501,693,0.477,694,0.531,695,0.398,696,0.572,697,0.456,698,0.572,699,0.572,700,0.477,701,0.531,702,0.734,703,0.531,704,0.949,705,0.531,706,0.531,707,0.501,708,1.007,709,0.531,710,0.501,711,1.007,712,0.531,713,0.398,714,0.531,715,0.439,716,0.531,717,0.572,718,1.007,719,0.387,720,0.572,721,0.501,722,0.572,723,0.755,724,0.501,725,0.424,726,0.439,727,0.572,728,0.531,729,0.903,730,0.531,731,0.601,732,0.456,733,0.477,734,0.531,735,0.501,736,0.439,737,0.456,738,0.477,739,0.572,740,0.572,741,0.439,742,0.572,743,1.084,744,0.572,745,0.456,746,0.41,747,0.501,748,1.007,749,1.288,750,0.531,751,0.477,752,0.501,753,0.531,754,0.865,755,0.398,756,0.572,757,0.634,758,0.832,759,0.534,760,0.501,761,0.634,762,0.634,763,0.41,764,0.456,765,0.501,766,0.634,767,0.387,768,0.351]],["t/87",[91,3.431,104,5.153,123,3.2,198,3.288,299,3.334,336,3.89,769,5.485,770,6.167]],["t/89",[11,2.46,25,1.628,45,3.243,771,5.011,772,7.403,773,8.204,774,4.104,775,8.204]],["t/91",[0,1.229,3,2.582,7,6.364,41,5.214,776,7.269,777,6.751,778,5.385,779,7.269,780,6.056,781,6.056]],["t/93",[58,2.627,355,6.666,774,4.221,782,6.342]],["t/95",[16,3.484,17,1.399,92,2.903,172,3.233,633,4.249,783,7.843,784,6.573,785,6.197,786,7.843,787,7.078,788,9.33,789,6.573]],["t/97",[0,1.301,2,3.388,13,4.524,14,3.836,16,3.007,23,2.25,36,2.076,58,2.724,78,3.267,178,4.266,277,3.52,282,3.157,477,2.961,599,5.09,774,4.266,790,7.695,791,6.771,792,6.771,793,4.689]],["t/99",[6,2.268,15,1.932,17,0.714,19,2.681,23,2.366,25,0.794,32,1.464,33,1.628,41,2.592,44,1.867,45,3.936,52,1.867,58,2.366,87,1.501,91,2.485,92,1.482,102,3.732,134,2.882,143,1.241,182,1.779,197,2.773,205,2.082,252,1.521,276,3.29,277,3.089,296,1.725,340,3.972,341,2.042,345,2.592,367,2.042,368,2.515,381,2.382,385,2.522,456,2.323,479,1.562,500,2.323,505,2.592,567,2.17,774,4.666,794,3.356,795,3.356,796,5.942,797,4.277,798,5.942,799,3.356,800,3.614,801,3.089,802,2.677,803,1.932,804,4.005,805,4.005,806,4.005,807,2.677,808,4.277,809,5.362,810,3.846,811,2.382,812,3.614,813,3.614,814,3.01,815,3.164,816,2.773,817,3.356,818,3.356,819,3.356,820,2.882,821,3.164,822,2.882,823,3.01,824,2.677]],["t/101",[17,1.296,33,2.954,44,3.388,102,4.565,115,2.56,122,2.761,130,3.228,172,2.996,342,4.323,477,3.178,801,3.779,803,3.507,825,7.268,826,6.558,827,5.033,828,7.268,829,5.033,830,6.091,831,5.463,832,3.779,833,3.938,834,5.742]],["t/103",[11,1.614,23,2.058,25,1.068,33,2.187,36,2.248,45,2.9,58,1.452,94,3.049,140,2.552,205,2.798,217,4.363,221,3.727,224,3.874,277,2.798,298,3.287,300,3.727,304,4.607,373,7.079,439,3.08,513,4.524,567,2.916,577,3.484,592,6.205,697,3.874,774,2.693,821,4.252,835,5.382,836,4.748,837,5.382,838,7.335,839,4.511,840,3.201,841,4.857,842,4.511,843,3.727,844,3.694,845,3.484,846,4.511,847,3.727,848,5.382]],["t/105",[17,1.209,23,2.144,25,0.953,26,2.497,37,2.679,45,3.94,56,1.801,87,1.801,130,2.133,140,2.277,146,4.257,162,2.403,187,2.1,195,2.602,204,2.659,205,3.524,215,3.108,219,2.857,223,1.712,298,2.933,309,4.257,310,2.933,340,4.531,348,3.325,367,2.448,373,3.794,429,2.317,439,1.651,479,1.873,484,5.439,488,3.017,513,3.27,567,2.602,633,2.602,715,3.325,772,4.334,774,2.403,826,4.334,831,3.61,849,3.325,850,3.61,851,5.68,852,3.61,853,2.933,854,3.61,855,3.794,856,6.778,857,6.778,858,3.457,859,3.61,860,6.116,861,4.802,862,2.72,863,2.659,864,3.794,865,4.802,866,4.802,867,4.802,868,4.802]],["t/107",[15,4.66,23,1.677,24,2.514,25,1.65,32,1.955,33,3.381,58,1.97,78,2.581,92,1.98,118,1.399,122,2.032,130,3.244,178,2.676,191,3.267,205,2.781,429,2.581,439,2.86,506,4.345,597,4.345,624,3.36,731,3.655,738,4.021,758,3.704,836,3.463,869,7.506,870,6.971,871,7.305,872,4.827,873,4.227,874,6.122,875,5.771,876,5.35,877,5.35,878,4.021,879,5.258,880,3.576,881,4.827,882,4.827]],["t/109",[0,0.967,41,5.292,48,4.219,49,3.871,50,3.871,58,2.441,102,3.981,177,3.434,187,3.575,200,3.189,205,3.295,285,3.77,336,3.005,337,4.562,477,2.772,690,3.171,833,3.434,883,6.338,884,5.008,885,5.719,886,5.719,887,6.338,888,4.103,889,5.008,890,5.008,891,4.562,892,4.993,893,6.338,894,6.338,895,6.338,896,5.719,897,5.312]],["t/111",[48,4.327,51,4.212,58,2.097,198,3.116,272,6.516,360,4.212,385,3.299,490,3.565,702,4.749,759,3.453,898,5.198,899,7.775,900,5.596]],["t/113",[1,3.234,10,2.424,23,1.005,33,1.779,39,3.459,41,5.295,45,1.731,48,2.041,51,2.372,52,2.041,101,2.372,103,2.604,109,3.032,118,1.145,123,1.708,130,1.944,187,3.797,188,3.732,192,2.372,198,1.755,200,1.708,276,2.424,301,3.459,319,2.75,331,3.68,348,3.032,381,2.604,385,1.858,445,2.927,598,1.975,690,3.732,723,2.75,759,1.944,774,3.174,794,3.669,799,5.316,808,3.151,810,4.829,811,2.604,832,3.298,843,3.032,849,4.393,863,3.513,886,3.951,901,5.724,902,3.951,903,3.951,904,3.669,905,3.951,906,2.834,907,5.316,908,3.291,909,3.669,910,3.951,911,3.951,912,3.459,913,4.378,914,4.378,915,6.344,916,3.951,917,4.378,918,4.378,919,4.378,920,3.951,921,4.378,922,3.951,923,3.032,924,3.669,925,5.724,926,3.291,927,3.951,928,3.459,929,3.459,930,4.378,931,3.669,932,2.834,933,4.378,934,4.378,935,3.951]],["t/115",[0,0.661,1,2.21,8,3.957,41,2.806,48,2.937,87,1.626,90,1.84,93,2.254,102,2.723,103,2.579,118,1.134,133,4.534,188,4.941,247,1.867,262,2.898,283,4.976,287,3.425,296,1.867,340,2.898,342,2.579,360,2.349,375,3.912,431,3.579,449,2.634,475,2.579,476,3.957,479,1.691,483,3.121,553,3.121,576,2.723,611,3.425,690,2.169,725,2.898,728,3.633,732,3.121,758,3.002,759,1.926,778,4.211,797,3.121,808,4.534,810,6.393,811,2.579,816,4.362,849,4.362,864,3.425,906,4.802,907,5.279,911,3.912,936,3.259,937,4.335,938,4.335,939,4.335,940,3.912,941,3.425,942,4.335,943,4.335,944,4.335,945,3.259,946,3.121,947,4.335,948,1.867,949,4.335,950,3.912,951,6.299,952,3.633,953,3.259,954,2.723,955,5.279,956,4.335,957,3.259]],["t/117",[0,1.108,17,1.296,89,5.597,103,5.3,140,4.888,200,2.835,271,4.704,275,5.742,282,3.388,391,4.439,948,3.131,958,8.911,959,3.636,960,6.091,961,7.268]],["t/119",[0,0.733,6,1.72,11,1.441,17,1.522,23,1.369,27,1.579,36,1.828,37,1.2,40,1.907,44,1.416,45,1.9,51,1.645,58,1.993,79,1.965,90,1.289,91,2.01,93,2.498,101,2.603,126,1.519,142,3.987,170,1.855,177,1.645,187,3.231,192,1.645,195,2.603,200,1.184,215,1.965,219,1.806,223,1.083,261,2.03,277,1.579,304,4.259,305,2.103,320,2.103,342,1.806,345,1.965,354,1.806,356,2.545,378,2.319,385,3.135,401,2.545,431,1.465,443,3.164,474,1.855,477,1.328,479,1.184,495,4.129,505,1.965,506,4.674,513,1.465,624,1.907,633,3.231,688,1.855,695,1.907,732,2.186,755,1.907,774,2.983,778,2.03,779,2.74,794,2.545,795,4.998,799,4.027,800,2.74,811,1.806,820,2.186,832,4.085,844,1.252,855,2.399,863,4.091,898,2.03,922,6.667,928,2.399,936,2.283,962,2.74,963,3.036,964,4.483,965,3.036,966,3.036,967,3.036,968,3.036,969,2.545,970,2.103,971,3.036,972,3.797,973,3.459,974,3.036,975,2.545,976,3.019,977,3.036,978,3.036,979,2.74,980,3.036,981,3.036,982,3.036,983,3.036,984,3.036,985,3.036,986,3.036,987,2.103,988,2.103,989,3.036,990,2.74,991,2.399,992,2.74,993,2.545,994,2.399,995,3.036,996,3.036,997,2.399,998,3.036,999,2.399,1000,2.03,1001,2.74,1002,2.283,1003,1.965,1004,5.964,1005,3.036,1006,3.036,1007,3.036,1008,3.036,1009,3.036]],["t/121",[2,2.34,17,0.834,23,1.527,25,0.928,31,2.713,33,1.901,44,2.18,45,3.522,58,1.794,87,1.753,88,2.077,93,3.458,102,4.178,117,2.534,126,2.34,134,3.366,143,1.45,197,3.238,247,2.014,251,3.027,252,1.776,276,3.683,277,3.458,296,2.014,341,2.384,345,3.027,367,2.384,368,2.937,369,2.534,381,2.782,449,1.956,479,2.594,484,3.238,505,3.027,513,2.256,515,2.782,559,2.384,801,2.431,807,3.126,808,4.787,809,6.002,810,4.305,811,2.782,812,4.22,813,4.22,814,3.515,815,3.695,816,3.238,817,3.919,818,3.919,819,3.919,820,3.366,821,3.695,822,3.366,823,3.515,824,3.126,830,3.919,840,4.604,842,3.919,849,3.238,1010,6.338,1011,4.22,1012,4.22,1013,3.695,1014,2.856,1015,3.919,1016,4.676,1017,4.676,1018,4.676,1019,4.676,1020,3.238]],["t/124",[39,3.695,44,2.18,48,3.931,56,1.753,115,1.647,126,4.218,127,3.126,143,2.399,162,2.34,171,2.014,182,2.077,188,2.34,198,2.666,199,1.901,247,3.632,252,1.776,274,2.782,295,2.937,296,2.014,322,2.384,336,2.218,361,3.515,378,3.209,385,1.985,476,2.937,477,2.045,484,3.238,488,2.937,503,3.603,510,3.366,511,3.603,513,2.256,514,2.384,554,2.18,598,2.11,609,3.366,688,2.856,690,2.34,763,3.027,802,3.126,817,3.919,840,2.782,954,4.178,960,3.919,1002,5,1020,4.606,1021,3.238,1022,4.286,1023,5,1024,3.695,1025,6.651,1026,3.515,1027,4.22,1028,4.22,1029,3.695,1030,4.676,1031,4.22,1032,4.676,1033,4.22,1034,4.676,1035,3.695,1036,4.22,1037,3.238,1038,4.676,1039,4.22,1040,3.695,1041,4.22,1042,3.695]],["t/126",[17,0.99,43,3.592,48,3.491,122,2.108,126,2.776,137,3.486,142,3.71,143,1.72,183,6.276,195,4.057,198,3.002,199,2.255,235,3.301,252,2.845,321,3.994,322,2.829,367,2.829,381,3.301,478,4.384,485,3.994,503,5.29,511,3.006,562,2.321,681,4.651,682,4.172,745,3.994,811,3.301,818,4.651,840,4.455,976,3.486,1022,3.073,1043,5.008,1044,7.489,1045,5.549,1046,5.917,1047,3.486,1048,5.549,1049,4.651,1050,5.549,1051,5.549,1052,4.384,1053,5.549,1054,4.651,1055,5.549,1056,5.549,1057,5.549,1058,5.008]],["t/128",[1,2.812,17,0.984,19,2.489,23,1.266,88,3.312,91,2.306,121,2.709,172,2.273,186,2.867,187,2.412,200,2.151,204,3.054,227,4.357,336,2.615,348,3.819,367,2.812,439,2.564,456,3.199,479,2.151,491,3.464,541,4.622,567,2.988,636,3.819,643,3.57,780,4.146,808,3.97,844,2.273,863,3.054,878,5.606,879,7.015,908,4.146,959,2.759,991,4.357,1059,5.892,1060,4.977,1061,3.97,1062,7.458,1063,5.515,1064,4.357,1065,4.622,1066,5.515,1067,5.515,1068,7.458,1069,3.819,1070,5.515,1071,5.515,1072,4.622,1073,3.199,1074,5.515,1075,3.97]],["t/130",[19,3.508,23,1.785,25,1.543,281,4.884,439,2.673,456,4.51,759,3.453,870,6.516,879,6.681,1076,7.775,1077,7.775,1078,7.775,1079,7.775]],["t/132",[13,4.058,17,1.364,23,1.315,33,3.501,35,2.764,47,4.306,51,3.103,91,3.602,101,5.338,182,2.544,187,2.505,205,2.978,219,3.407,282,4.015,336,2.716,378,2.764,388,3.323,567,3.103,598,2.584,755,3.598,774,3.827,863,3.171,908,4.306,920,5.169,1060,5.169,1080,5.728,1081,5.728,1082,6.411,1083,5.728,1084,5.728,1085,8.613,1086,5.728,1087,5.728,1088,7.649,1089,5.728,1090,5.728,1091,5.728]],["t/134",[3,2.109,4,2.711,11,1.381,48,4.52,56,1.726,96,2.261,114,3.078,121,2.261,188,4.188,225,1.845,243,3.314,260,3.078,279,5.314,283,3.637,299,2.673,304,2.892,340,5.13,341,3.354,381,2.739,385,1.954,449,1.925,462,2.98,651,4.132,692,3.637,771,2.812,810,5.419,814,4.944,823,3.461,852,3.461,896,8.31,903,4.155,908,4.944,990,5.935,1020,6.377,1042,3.637,1092,6.996,1093,4.734,1094,7.016,1095,6.578,1096,3.637,1097,4.604,1098,4.604,1099,4.155,1100,4.604,1101,6.578,1102,4.604,1103,4.604,1104,4.604]],["t/136",[27,4.265,49,5.011,50,5.011,897,6.876,1105,5.011,1106,8.204,1107,7.403,1108,7.403]],["t/138",[91,3.431,104,5.153,123,3.2,198,3.288,299,3.334,336,3.89,769,5.485,770,6.167]],["t/140",[0,1.101,13,2.788,17,1.287,22,3.513,23,1.657,45,3.798,96,2.581,128,3.544,129,1.945,181,2.334,215,3.401,228,4.186,268,3.639,287,4.152,311,4.407,373,4.152,385,3.062,477,2.298,487,3.301,719,3.21,833,2.847,839,4.404,845,3.401,847,3.639,870,6.048,976,4.533,1002,3.95,1003,3.401,1037,3.639,1109,5.701,1110,3.783,1111,2.977,1112,5.255,1113,6.511,1114,4.152,1115,4.404,1116,5.255,1117,5.255,1118,6.512,1119,4.404,1120,3.21,1121,4.742,1122,5.255,1123,6.512,1124,3.95,1125,5.255,1126,5.255,1127,4.404,1128,5.255,1129,3.783]],["t/142",[17,1.296,45,3.81,123,2.835,198,2.913,200,2.835,342,4.323,378,3.507,385,3.084,511,3.938,592,5.033,795,7.468,832,4.633,999,5.742,1111,4.117,1130,7.268,1131,3.938,1132,6.091,1133,5.463]],["t/144",[3,2.388,4,3.729,5,2.095,45,2.945,56,2.793,123,2.906,125,3.659,143,2.309,182,3.309,198,2.986,200,2.906,270,4.322,340,4.981,1002,5.6,1111,4.22,1134,7.45,1135,6.244,1136,7.45]],["t/146",[0,1.017,45,3.339,97,3.778,123,2.602,130,2.962,163,2.873,182,2.962,198,2.673,200,2.602,217,3.967,358,4.801,379,4.918,559,3.401,780,5.014,954,4.19,1023,5.014,1035,5.27,1105,4.074,1111,3.778,1137,5.59,1138,6.67,1139,5.27,1140,5.59,1141,6.019,1142,5.59,1143,5.014,1144,6.67,1145,6.019,1146,6.67,1147,6.67]],["t/148",[0,1.294,10,4.699,23,1.543,30,4.653,35,3.243,45,3.677,91,2.81,123,2.621,125,3.301,132,5.632,143,2.083,198,2.694,200,2.621,274,5.048,797,6.109,819,5.632,832,3.494,853,4.104,854,5.052,1022,3.721,1111,3.807,1132,5.632,1133,5.052,1148,5.309,1149,4.837,1150,5.309]],["t/150",[0,1.264,5,1.821,17,1.155,45,3.277,91,2.708,92,2.397,125,3.181,132,5.428,187,3.625,188,3.24,195,3.509,247,2.79,274,3.852,296,3.57,299,2.632,369,4.491,526,4.192,576,4.068,592,4.484,820,4.662,853,3.955,964,6.231,972,5.117,999,5.117,1131,3.509,1133,4.868,1142,5.428,1151,4.192,1152,4.33,1153,6.476,1154,4.192]],["t/152",[0,1.156,45,3.88,123,2.955,135,6.35,144,5.986,198,3.037,200,2.955,378,3.656,385,3.215,801,3.939,1111,4.292,1152,5.065,1155,6.35,1156,6.35,1157,6.837]],["t/154",[0,1.302,4,2.318,5,1.907,11,1.116,23,1.291,25,1.345,28,3.711,42,2.867,44,1.735,45,3.374,56,1.395,87,2.109,91,2.352,92,1.377,117,2.016,125,3.711,129,1.377,130,1.652,161,2.272,200,1.451,215,3.64,225,1.491,263,2.939,270,2.158,273,4.227,321,2.678,335,2.487,379,1.974,391,2.272,411,2.337,422,2.487,477,1.627,497,2.408,511,2.016,604,2.939,719,2.272,746,2.408,755,2.337,771,2.272,797,4.048,801,2.924,803,2.713,832,2.924,833,2.016,845,3.64,853,3.435,888,2.408,892,2.272,909,3.118,955,4.713,960,3.118,964,2.797,997,4.443,1010,4.227,1022,2.06,1035,4.443,1042,2.939,1093,2.678,1131,2.016,1143,2.797,1148,2.939,1152,4.532,1155,3.118,1157,3.357,1158,2.939,1159,5.075,1160,3.357,1161,3.186,1162,3.721,1163,2.487,1164,3.357,1165,3.721,1166,2.939,1167,2.272,1168,2.939,1169,3.721,1170,5.624,1171,2.576,1172,3.721,1173,2.337,1174,2.337,1175,3.357,1176,3.357,1177,3.721,1178,3.357,1179,2.939,1180,2.939,1181,2.678,1182,2.939,1183,3.721,1184,2.797,1185,4.443,1186,3.721,1187,2.158,1188,3.357,1189,3.721]],["t/156",[23,1.697,45,3.558,78,3.565,92,2.735,118,1.932,128,3.629,129,2.735,184,3.629,216,3.503,219,4.395,260,4.939,784,6.192,801,3.841,908,5.554,929,5.837,932,4.782,976,4.641,1158,5.837,1190,6.667]],["t/158",[15,4.616,17,1.706,91,2.991,192,3.874,200,2.789,428,4.254,429,3.451,439,2.458,490,3.279,1154,4.629,1182,5.65,1191,7.151,1192,7.151,1193,7.151,1194,6.625,1195,7.151,1196,4.952,1197,7.151]],["t/160",[0,1.39,5,2.321,17,1.147,25,1.276,28,3.158,45,3.262,87,2.411,91,3.451,96,3.158,122,2.442,234,3.343,270,3.73,289,4.452,329,3.483,331,4.787,350,2.948,378,3.102,774,3.217,801,3.343,833,3.483,1140,5.389,1154,4.162,1158,5.08,1167,3.927,1196,4.452,1198,3.642,1199,5.802,1200,6.43,1201,6.43,1202,5.389,1203,5.389,1204,6.43]],["t/162",[5,2.206,24,2.206,25,1.556,45,3.101,118,2.051,125,3.852,246,4.55,270,4.55,289,5.431,774,3.924,854,5.896,1203,6.573,1205,7.843]],["t/164",[0,1.247,5,1.783,17,1.13,21,4.389,45,3.78,92,3.026,126,3.171,186,3.295,205,3.295,229,3.77,303,3.171,331,4.743,360,3.434,567,3.434,592,4.389,688,4.993,721,5.008,759,2.815,844,2.613,906,4.103,929,5.008,948,2.73,953,4.764,987,4.389,1000,4.237,1105,3.871,1131,3.434,1154,5.292,1171,4.389,1206,5.008,1207,4.562,1208,6.338]],["t/166",[0,1.176,4,3.177,17,1.375,45,3.047,91,3.223,118,2.016,289,5.337,548,5.153,774,3.856,1154,4.989,1202,6.46,1203,6.46,1209,7.708,1210,7.708,1211,7.708]],["t/168",[0,0.868,23,1.971,25,1.703,45,3.778,78,2.746,87,2.134,90,2.415,123,2.22,129,2.107,130,2.528,172,2.346,188,2.847,193,5.136,198,2.281,200,2.22,223,2.029,274,3.385,335,3.805,378,2.746,385,2.415,504,3.385,526,3.684,559,2.902,592,3.941,719,3.476,725,3.805,801,2.959,832,2.959,833,3.083,910,5.136,964,5.726,987,3.941,1111,3.224,1152,5.092,1160,5.136,1161,3.224,1176,5.136,1212,5.691,1213,5.691,1214,5.691,1215,5.691,1216,5.136,1217,4.278,1218,5.691,1219,5.691,1220,5.691]],["t/170",[5,1.396,15,3.346,23,1.14,25,1.376,28,2.438,32,1.814,42,2.53,45,1.962,87,1.861,115,1.748,121,2.438,123,1.936,161,3.031,172,2.046,198,1.989,200,1.936,215,3.212,217,2.952,235,2.952,270,5.284,294,3.033,299,2.017,331,4.023,377,3.921,378,3.858,422,3.318,452,2.811,477,2.17,479,1.936,504,2.952,801,2.58,821,3.921,832,3.606,833,2.689,964,3.731,1010,5.214,1120,3.031,1137,5.813,1148,3.921,1152,5.345,1187,2.879,1188,4.478,1221,6.936,1222,6.936,1223,4.963,1224,4.963,1225,4.963,1226,4.478,1227,4.963,1228,4.478,1229,3.731,1230,3.921,1231,4.963,1232,4.159,1233,4.963,1234,4.159,1235,4.963,1236,4.963,1237,4.963,1238,2.879,1239,4.478,1240,4.963]],["t/172",[11,1.3,17,0.773,23,0.996,25,1.25,42,2.21,45,1.714,56,2.362,91,1.813,93,2.254,118,1.647,121,2.13,123,1.691,165,3.488,172,2.597,187,2.755,198,1.738,199,1.762,200,1.691,214,1.84,216,2.056,223,1.546,235,2.579,257,3.633,270,2.515,296,3.195,303,2.169,329,2.349,331,2.515,369,4.019,452,2.456,473,2.723,479,2.457,561,4.973,597,2.579,636,3.002,651,3.957,679,4.96,759,2.798,801,3.275,843,3.002,863,2.401,997,3.425,1010,7.605,1047,2.723,1152,4.96,1173,5.668,1175,5.684,1226,3.912,1229,3.259,1241,4.335,1242,4.335,1243,4.335,1244,5.684,1245,3.425,1246,3.633,1247,4.335,1248,3.002,1249,4.335,1250,4.335,1251,4.335,1252,4.335,1253,4.335,1254,4.335,1255,4.335,1256,4.335,1257,3.633]],["t/174",[91,3.431,123,3.2,198,3.288,679,5.485,759,3.644,769,5.485,770,6.167,1010,6.167]],["t/176",[0,0.305,2,1.001,5,0.959,17,0.608,23,0.459,25,1.36,45,1.761,58,2.959,72,1.386,75,6.052,88,2.337,123,0.78,128,1.675,143,0.62,162,1.001,171,0.862,184,2.188,192,1.847,198,1.785,203,1.108,205,1.04,216,3.7,223,0.713,228,1.161,230,3.077,234,2.735,235,4.782,238,4.158,239,3.884,241,1.133,247,0.862,258,1.386,282,0.933,285,1.19,299,0.813,309,1.257,331,2.584,350,0.918,351,1.677,377,3.519,449,1.863,451,1.257,452,3.884,475,1.19,489,1.44,513,2.149,553,1.44,561,1.222,588,1.581,651,1.257,710,3.519,750,1.677,751,1.504,760,1.581,784,1.677,803,0.965,860,3.077,959,2.228,973,2.454,1037,2.361,1114,1.581,1120,2.082,1123,1.806,1152,2.279,1158,1.581,1230,1.581,1258,1.806,1259,3.733,1260,2.001,1261,2.001,1262,3.409,1263,3.409,1264,3.409,1265,7.221,1266,2.001,1267,1.806,1268,2.001,1269,7.221,1270,4.663,1271,7.221,1272,2.001,1273,2.001,1274,2.001,1275,2.001,1276,1.677,1277,2.001,1278,2.001,1279,2.001,1280,2.001,1281,2.001,1282,2.001,1283,2.001,1284,2.001,1285,2.001,1286,2.001,1287,4.454,1288,2.001,1289,2.001,1290,2.001,1291,2.001,1292,2.001,1293,2.001,1294,2.001,1295,2.001,1296,4.156,1297,3.077,1298,3.409,1299,3.077,1300,3.409,1301,1.978,1302,4.02,1303,2.001,1304,3.206,1305,1.677,1306,1.806,1307,2.001,1308,2.001,1309,1.581,1310,1.504,1311,3.733,1312,1.806]],["t/178",[0,0.921,4,2.489,5,2.228,11,1.811,23,2.03,25,1.862,45,2.387,87,2.97,118,1.579,146,3.793,205,3.139,247,2.601,350,3.632,429,2.913,431,2.913,491,4.976,503,5.084,593,4.77,771,3.688,801,3.139,810,3.908,932,3.908,940,5.448,1152,5.296,1154,3.908,1173,3.793,1313,4.539,1314,6.038,1315,6.038,1316,6.038,1317,5.127,1318,6.038,1319,4.77]],["t/180",[91,3.431,104,5.153,123,3.2,198,3.288,299,3.334,336,3.89,769,5.485,770,6.167]],["t/182",[0,1.275,128,4.105,263,6.603,322,4.261,1000,5.587,1111,4.734]],["t/184",[17,1.485,23,1.498,24,1.835,42,3.326,78,3.148,90,3.534,115,3.231,122,2.478,138,5.887,191,3.984,262,4.361,322,4.677,357,4.517,490,2.992,633,3.534,793,4.517,831,6.26,832,4.33,839,5.467,905,5.887,948,2.81,1161,3.695,1173,4.098,1187,3.784,1320,5.887,1321,6.524,1322,6.524,1323,4.904]],["t/186",[0,1.214,11,2.386,17,1.084,24,1.71,25,1.579,35,3.839,56,2.279,93,3.16,225,2.437,299,3.234,322,4.797,357,5.509,358,4.376,390,4.57,617,6.384,632,4.064,633,3.293,831,4.57,832,4.137,844,2.506,1173,3.818,1174,3.818,1187,4.616,1324,5.486,1325,7.957,1326,5.486,1327,3.527,1328,6.079,1329,6.079,1330,6.079,1331,5.095,1332,5.095]],["t/188",[13,1.836,14,4.45,17,1.156,23,1.804,25,1.286,30,2.396,31,2.008,40,2.174,48,3.023,52,2.481,56,1.298,62,3.444,71,2.114,90,2.258,105,2.734,125,1.7,128,1.7,130,1.537,186,1.799,198,2.133,216,1.641,227,4.204,257,2.9,259,2.24,298,2.114,305,2.396,311,2.114,313,2.174,316,2.883,322,4.229,341,3.306,360,1.875,378,1.67,396,2.396,422,2.314,431,1.67,439,1.829,443,1.836,456,2.008,477,1.513,490,1.587,498,3.444,511,2.883,513,1.67,554,1.613,559,1.764,567,1.875,759,2.364,767,5.277,824,3.558,827,4.49,832,3.371,836,4.711,844,2.194,845,2.24,850,2.601,854,2.601,928,2.734,950,3.123,991,2.734,1026,4,1054,2.9,1072,2.9,1118,3.123,1143,4,1179,2.734,1232,2.9,1333,5.211,1334,3.123,1335,3.461,1336,3.461,1337,3.461,1338,3.461,1339,3.123,1340,3.461,1341,3.461,1342,2.9,1343,3.123,1344,3.123,1345,2.601,1346,2.601,1347,5.434,1348,3.461,1349,3.461,1350,3.123,1351,7.09,1352,2.9,1353,3.461,1354,3.461,1355,3.461,1356,3.461,1357,3.461,1358,2.491,1359,5.123,1360,2.9,1361,3.461]],["t/190",[16,4.117,23,0.981,25,0.848,48,1.992,52,1.992,58,2.721,114,2.857,125,2.099,129,2.307,130,1.898,164,2.542,172,1.761,185,2.421,187,1.869,200,1.667,299,2.533,310,3.807,314,3.212,316,2.315,336,2.026,479,2.431,567,2.315,781,3.212,789,3.581,824,2.857,836,4.034,863,2.366,994,3.376,1026,3.212,1105,2.61,1131,2.315,1137,5.224,1161,2.421,1238,2.479,1333,2.684,1359,5.813,1360,7.768,1362,6.166,1363,7.759,1364,4.273,1365,3.076,1366,4.273,1367,4.273,1368,4.273,1369,4.273,1370,7.358,1371,4.273,1372,4.273,1373,4.924,1374,4.924,1375,4.273,1376,3.581,1377,3.856,1378,6.233,1379,3.376,1380,2.857,1381,4.273,1382,6.233,1383,4.273,1384,3.581,1385,4.273,1386,4.273,1387,3.856,1388,3.856,1389,3.212]],["t/192",[10,2.827,17,1.262,23,1.172,36,2.168,42,2.603,62,5.672,125,2.507,145,2.892,177,2.766,178,2.554,200,1.991,204,2.827,223,1.82,282,2.38,285,3.036,299,3.561,320,3.535,321,3.674,354,3.036,411,3.206,488,3.206,496,3.304,567,2.766,759,3.892,767,5.962,827,3.535,853,3.118,952,7.712,1002,3.837,1093,3.674,1310,3.837,1327,2.961,1346,3.837,1390,5.105,1391,3.674,1392,5.105,1393,4.278,1394,6.383,1395,5.105,1396,8.116,1397,3.674,1398,5.105,1399,5.105,1400,4.606,1401,5.105,1402,5.928,1403,4.278,1404,5.105,1405,4.606]],["t/194",[14,2.108,17,0.664,23,1.291,25,1.116,31,4.707,32,2.055,36,2.797,58,1.829,60,3.118,62,4.891,71,4.141,88,1.652,93,1.934,96,1.827,97,2.108,116,3.186,125,1.827,128,1.827,129,2.082,186,2.924,205,1.934,223,1.326,227,2.939,282,2.622,311,4.141,322,1.897,337,2.678,341,1.897,358,2.678,385,1.579,396,3.894,417,5.68,439,1.279,477,1.627,487,2.337,490,1.706,515,4.033,547,2.213,559,1.897,651,2.337,759,2.498,767,3.435,769,3.76,810,5.252,833,2.016,836,4.891,875,2.939,880,2.487,892,2.272,987,2.576,1026,2.797,1131,2.016,1139,2.939,1327,2.158,1342,5.682,1346,2.797,1358,2.678,1360,7.152,1362,4.713,1363,6.118,1388,3.357,1389,2.797,1391,2.678,1406,3.721,1407,3.721,1408,5.624,1409,2.939,1410,3.721,1411,3.721,1412,3.357,1413,3.721,1414,3.357,1415,2.576,1416,7.556,1417,4.694,1418,3.357,1419,3.721,1420,3.721,1421,3.721,1422,2.576]],["t/197",[0,1.454,11,1.887,15,3.037,16,2.795,17,1.123,23,2.267,59,2.984,97,3.565,104,3.953,131,3.844,176,4.409,216,2.984,285,3.743,299,2.558,303,3.149,379,3.339,559,3.209,598,3.672,769,4.207,827,5.635,833,3.41,898,4.207,906,4.074,1105,3.844,1131,3.41,1161,3.565,1423,3.844,1424,5.679,1425,6.43,1426,4.53]],["t/199",[0,1.026,11,2.017,16,3.468,17,1.2,19,3.035,21,3.29,23,1.091,25,0.943,31,4.53,32,2.459,36,1.456,58,1.282,88,2.11,89,2.984,90,3.314,93,2.47,94,2.691,97,2.691,116,2.691,122,1.805,176,2.574,181,2.11,185,3.81,217,2.826,225,2.696,316,4.23,336,3.19,345,3.075,354,2.826,378,2.292,417,3.572,443,2.521,477,2.078,490,2.179,514,2.422,515,4.645,598,3.523,643,3.075,827,5.407,927,4.287,1129,3.42,1139,3.754,1238,2.756,1313,5.056,1394,4.287,1417,3.29,1427,6.169,1428,3.982,1429,3.42,1430,3.754,1431,4.751,1432,4.751,1433,3.568,1434,5.056,1435,4.751,1436,3.42,1437,4.751,1438,4.751,1439,4.287,1440,4.751]],["t/201",[19,1.515,23,1.194,24,1.642,25,0.666,31,2.55,32,1.227,36,1.348,52,0.916,58,1.716,71,1.201,79,1.272,89,1.235,97,1.113,121,0.966,128,0.966,133,1.415,137,1.235,146,5.695,163,0.847,176,1.819,181,1.491,185,2.49,186,1.022,203,1.088,228,2.55,229,1.169,262,1.314,277,1.022,282,0.916,299,1.365,311,1.201,336,0.932,378,1.62,379,1.043,428,1.997,429,0.948,431,0.948,439,0.676,440,1.314,474,1.201,486,1.415,487,1.235,515,2.615,547,1.169,554,0.916,598,1.515,684,1.415,719,1.201,764,1.415,803,0.948,822,1.415,845,1.272,892,1.201,906,1.272,953,1.478,987,1.361,1124,1.478,1129,1.415,1133,6.639,1139,1.553,1167,2.051,1173,1.235,1185,1.553,1238,1.14,1417,2.325,1427,3.473,1428,1.647,1433,1.043,1436,7.251,1439,1.774,1441,1.478,1442,1.553,1443,1.774,1444,1.966,1445,1.774,1446,1.966,1447,1.966,1448,3.967,1449,1.774,1450,3.03,1451,1.478,1452,1.774,1453,1.314,1454,1.966,1455,8.954,1456,10.144,1457,1.966,1458,9.066,1459,8.697,1460,1.774,1461,1.966,1462,1.966,1463,1.966,1464,2.109,1465,1.966,1466,1.966,1467,1.966,1468,1.966,1469,1.966,1470,1.966,1471,3.358,1472,1.966,1473,1.966,1474,8.697,1475,8.832,1476,1.966,1477,1.966,1478,1.966,1479,1.966,1480,1.966,1481,1.966,1482,1.966,1483,1.966,1484,1.966,1485,1.966,1486,1.966,1487,1.966,1488,1.966,1489,1.966,1490,1.966,1491,1.966,1492,1.966,1493,1.966,1494,1.966,1495,1.966,1496,1.966,1497,1.966,1498,1.966,1499,1.966,1500,1.966,1501,1.966,1502,1.966,1503,1.966,1504,1.966,1505,1.966,1506,1.966,1507,1.966]],["t/203",[17,0.935,19,1.532,23,1.654,24,0.955,30,2.351,31,1.969,33,2.131,36,1.964,45,1.342,58,0.916,87,1.273,96,1.667,97,2.97,105,2.682,106,2.444,121,1.667,123,1.324,128,2.575,133,2.444,164,2.019,170,4.756,172,1.399,181,1.508,186,1.765,191,3.202,194,2.444,205,1.765,216,3.038,219,2.019,223,1.21,225,1.361,228,3.716,247,1.462,251,2.197,252,1.29,260,2.269,281,2.132,292,2.019,299,2.131,336,1.61,431,1.638,439,2.677,476,4.024,479,1.324,488,2.132,495,3.631,515,2.019,577,2.197,601,2.444,643,2.197,690,2.623,715,2.351,811,2.019,847,2.351,853,2.073,875,5.692,925,3.063,1014,2.073,1073,3.042,1119,4.394,1133,3.942,1166,2.682,1313,4.816,1339,3.063,1358,2.444,1374,2.682,1380,2.269,1425,2.682,1427,5.692,1433,3.399,1443,3.063,1445,5.781,1448,4.732,1508,6.406,1509,6.406,1510,2.682,1511,3.395,1512,3.395,1513,3.063,1514,5.243,1515,3.063,1516,5.243,1517,3.395,1518,3.063,1519,3.395,1520,3.395,1521,5.243,1522,5.243,1523,3.395,1524,3.395,1525,3.395,1526,2.845,1527,4.732,1528,5.243,1529,3.063,1530,5.243,1531,5.243,1532,3.063,1533,3.395,1534,3.395,1535,3.395,1536,2.269,1537,3.395,1538,2.845,1539,3.395,1540,3.395,1541,3.063]],["t/205",[34,5.789,56,2.747,225,2.937,250,5.789,299,2.978,316,3.97,379,3.887,476,4.603,479,3.493,497,4.743,889,5.789,898,4.899,1119,6.141,1333,4.603,1425,5.789,1542,6.141,1543,5.789,1544,7.328,1545,7.328,1546,7.328]],["t/207",[8,4.492,16,3.918,48,3.334,92,2.647,103,4.254,115,2.519,277,3.718,331,4.149,534,5.376,774,3.578,849,4.952,953,5.376,1075,5.147,1436,5.147,1543,5.65,1547,7.151,1548,6.632,1549,5.993,1550,7.151,1551,4.368,1552,6.453,1553,7.151]],["t/209",[119,5.015,252,3.033,774,3.994,884,6.308,891,5.746,1541,7.204,1554,6.691,1555,7.984,1556,6.691,1557,7.984,1558,6.001]],["t/211",[11,1.775,17,1.055,25,1.174,31,4.535,36,1.814,52,2.759,58,2.361,96,2.907,123,2.308,187,2.588,251,5.06,278,4.675,369,3.206,413,6.176,515,4.65,559,3.017,859,5.876,892,3.614,999,4.675,1143,4.448,1174,3.717,1299,5.34,1417,4.098,1436,4.259,1510,4.675,1559,5.918,1560,5.918,1561,5.918,1562,5.918,1563,4.959,1564,7.817,1565,7.817,1566,5.918,1567,5.918,1568,7.817,1569,5.918,1570,5.918,1571,5.34,1572,5.918,1573,5.918]],["t/216",[204,3.96,223,2.55,420,5.376,479,2.789,719,4.368,859,5.376,1239,6.453,1333,4.492,1425,6.97,1426,5.147,1526,5.993,1543,5.65,1574,7.151,1575,7.151,1576,7.151,1577,7.151,1578,7.151,1579,7.151,1580,7.151,1581,7.151,1582,6.453,1583,7.151,1584,7.151]],["t/218",[1543,6.928]],["t/220",[278,6.423,1585,8.129,1586,8.129,1587,8.129,1588,8.129,1589,8.129,1590,8.129,1591,8.129,1592,8.129]],["t/222",[1593,8.437,1594,8.437,1595,8.437,1596,8.437,1597,8.437]],["t/224",[17,1.063,25,1.183,43,2.604,44,1.875,56,1.508,71,4.339,78,1.941,96,1.976,106,4.291,116,2.279,123,1.569,126,3.93,170,2.457,172,1.658,177,2.179,205,2.091,214,1.707,216,1.907,223,2.126,275,4.71,292,2.393,299,1.635,304,2.527,311,5.123,316,2.179,354,2.393,360,2.179,385,2.53,391,2.457,394,3.63,396,6.297,417,3.024,420,5.905,475,2.393,477,1.759,523,3.641,598,3.205,759,2.648,765,3.178,767,6.013,832,2.091,844,1.658,847,2.785,900,2.895,954,2.527,993,3.371,1105,2.457,1111,2.279,1149,2.895,1187,2.334,1350,3.63,1391,4.291,1415,4.128,1417,2.785,1422,2.785,1451,3.024,1558,4.482,1598,6.818,1599,3.371,1600,2.785,1601,3.024,1602,4.023,1603,3.178,1604,4.71,1605,4.023,1606,5.38,1607,4.023,1608,3.63]],["t/226",[17,0.797,25,1.864,30,3.092,32,1.632,43,4.165,52,2.082,71,2.727,96,2.193,123,1.742,128,2.193,129,1.653,137,2.805,171,2.772,184,2.193,187,1.953,192,3.486,223,1.592,229,2.656,275,3.528,278,5.084,292,2.656,299,1.815,305,3.092,311,3.93,316,2.419,388,2.591,430,3.828,477,1.953,479,1.742,505,2.89,547,2.656,589,4.042,683,3.214,695,2.805,759,2.858,767,4.608,824,2.985,845,2.89,853,3.93,858,3.214,946,3.214,1109,3.528,1127,3.743,1149,4.632,1161,2.53,1171,3.092,1185,3.528,1187,3.733,1238,2.591,1310,3.357,1333,2.805,1391,3.214,1417,5.224,1424,6.808,1428,3.743,1536,2.985,1558,3.357,1598,6.059,1609,3.743,1610,3.528,1611,4.03,1612,4.466,1613,7.544,1614,4.466,1615,4.466,1616,3.743,1617,5.084,1618,4.466,1619,4.466]],["t/228",[0,0.877,1,1.954,11,1.149,17,1.026,27,1.992,36,1.175,37,2.729,44,1.787,88,2.554,96,2.825,116,3.257,125,1.882,126,1.917,136,3.028,165,3.184,170,2.341,188,1.917,189,3.028,192,4.155,215,2.481,216,1.817,222,2.407,223,2.05,246,4.004,251,2.481,259,3.722,261,2.562,294,1.676,296,1.651,298,2.341,300,2.654,314,2.881,322,1.954,369,2.076,378,2.775,410,2.932,411,2.407,429,2.775,439,1.317,445,2.562,522,2.654,554,1.787,759,2.554,767,5.623,793,2.654,811,2.28,844,1.58,862,3.257,941,4.543,954,2.407,959,1.917,1120,2.341,1163,2.562,1179,3.028,1187,2.223,1234,3.212,1238,2.223,1313,2.881,1317,2.481,1331,3.212,1332,3.212,1333,2.407,1352,3.212,1417,2.654,1464,2.407,1536,2.562,1598,6.197,1603,3.028,1620,3.458,1621,3.458,1622,3.832,1623,2.881,1624,3.458,1625,3.832,1626,3.832,1627,5.751,1628,3.832,1629,3.832,1630,5.751,1631,6.902,1632,5.751,1633,3.832,1634,3.832,1635,3.832,1636,3.832,1637,3.212,1638,3.458,1639,3.458,1640,2.654,1641,5.751,1642,3.458,1643,3.832]],["t/230",[0,0.846,1,4.322,17,0.99,23,1.274,25,1.486,33,3.044,44,2.587,56,2.081,71,3.389,97,3.144,121,2.726,130,2.465,247,2.39,284,8.189,342,3.301,385,2.355,455,4.455,456,3.219,616,4.384,767,3.389,801,2.885,836,4.847,890,4.384,891,3.994,898,3.71,923,3.843,1131,3.006,1207,3.994,1302,5.008,1331,4.651,1332,6.276,1344,5.008,1426,3.994,1558,4.172,1624,5.008,1644,4.651,1645,5.549,1646,5.549,1647,7.489,1648,5.549,1649,5.549,1650,5.549,1651,5.549,1652,5.549,1653,5.549,1654,5.008,1655,5.549,1656,5.549,1657,5.008]],["t/232",[0,0.46,2,1.509,11,0.904,43,1.952,71,4.126,88,3,90,1.28,123,1.176,125,1.481,131,1.842,137,4.243,170,1.842,205,2.485,216,2.266,217,1.794,221,4.111,222,1.894,223,2.117,247,1.299,277,1.568,294,1.319,298,1.842,311,5.853,316,1.634,325,2.528,328,4.006,337,2.171,354,1.794,378,1.455,477,1.319,479,2.635,486,2.171,487,1.894,490,2.192,497,3.843,547,2.843,570,6.566,577,1.952,598,1.361,604,4.691,643,1.952,690,1.509,755,1.894,759,1.34,780,2.267,822,2.171,829,2.088,832,2.485,845,3.094,851,4.976,852,2.267,888,1.952,892,3.626,898,2.016,900,2.171,954,1.894,973,2.171,975,2.528,988,2.088,1003,4.766,1023,2.267,1105,2.919,1113,2.383,1120,1.842,1124,2.267,1131,3.217,1143,3.593,1159,2.722,1161,1.708,1163,2.016,1184,2.267,1187,2.773,1301,3.919,1333,1.894,1384,2.528,1412,2.722,1415,2.088,1423,1.842,1450,2.722,1536,5.861,1538,4.006,1601,6.4,1603,3.776,1611,4.313,1617,4.691,1658,4.78,1659,4.78,1660,3.016,1661,3.016,1662,3.016,1663,2.383,1664,3.016,1665,3.016,1666,3.016,1667,3.016,1668,2.088,1669,3.016,1670,3.016,1671,3.016,1672,3.016,1673,3.016,1674,2.722,1675,4.976,1676,3.016,1677,3.016,1678,3.016,1679,3.016,1680,2.267,1681,3.016,1682,3.016]],["t/234",[0,0.495,13,1.722,14,1.839,16,1.442,17,1.255,20,2.44,31,1.883,33,1.319,36,0.995,52,1.514,56,1.217,59,1.539,71,4.659,78,1.566,91,2.118,92,1.202,93,1.688,97,1.839,106,2.337,126,3.115,184,2.488,187,2.215,191,1.983,204,2.804,205,1.688,215,2.101,216,1.539,225,1.301,251,4.031,300,2.248,311,1.983,316,4.133,322,2.582,345,2.101,354,1.931,369,1.759,378,3.005,396,3.507,422,2.17,431,1.566,439,1.741,443,2.687,459,2.633,479,1.975,487,2.039,498,2.101,515,1.931,547,1.931,598,1.465,651,2.039,759,2.249,767,3.803,769,2.17,823,2.44,827,3.507,832,1.688,833,1.759,844,1.338,900,3.646,948,1.398,954,2.039,969,2.721,976,2.039,1022,1.798,1031,2.93,1035,2.565,1047,2.039,1069,2.248,1151,2.101,1161,2.869,1163,2.17,1166,2.565,1230,2.565,1313,2.44,1327,1.883,1333,5.077,1347,2.721,1352,5.219,1358,2.337,1359,2.565,1426,2.337,1515,2.93,1542,2.721,1598,4.312,1601,3.807,1604,5.558,1606,2.93,1616,2.721,1644,2.721,1683,3.247,1684,6.227,1685,2.721,1686,3.247,1687,6.227,1688,6.076,1689,2.93,1690,2.93,1691,2.93,1692,4.001,1693,5.219,1694,2.565,1695,3.247,1696,3.247,1697,3.247,1698,3.247,1699,3.247,1700,2.93,1701,4.57,1702,3.247,1703,3.247,1704,3.247,1705,2.93,1706,2.93,1707,2.93]],["t/236",[0,1.032,2,1.514,10,1.676,11,0.908,13,3.913,14,1.714,16,3.485,17,0.855,23,0.695,24,1.348,25,1.784,32,2.175,36,1.469,58,2.919,59,1.435,88,1.344,90,1.284,115,1.066,121,1.486,126,1.514,164,1.8,182,1.344,187,1.323,223,1.079,224,2.178,225,1.213,277,2.492,281,1.901,294,1.323,304,3.01,322,4.584,336,1.435,341,3.76,386,2.095,396,2.095,429,2.312,431,1.46,439,1.04,441,2.023,474,1.848,490,1.388,503,1.639,511,1.639,695,1.901,745,2.178,774,2.977,815,2.391,873,2.391,1075,3.45,1114,5.347,1148,2.391,1167,1.848,1187,1.756,1327,1.756,1347,4.987,1373,2.391,1391,2.178,1409,4.701,1423,2.927,1433,2.543,1434,3.603,1451,2.275,1548,5.087,1551,2.927,1688,3.45,1708,3.026,1709,2.536,1710,1.8,1711,3.026,1712,3.026,1713,3.026,1714,3.01,1715,3.026,1716,3.026,1717,2.536,1718,3.026,1719,3.026,1720,3.026,1721,4.325,1722,3.026,1723,3.026,1724,3.026,1725,3.026,1726,3.026,1727,3.026,1728,3.026,1729,3.786,1730,3.026]],["t/238",[0,0.978,11,1.333,24,2.116,25,1.272,32,1.624,36,1.966,58,2.954,79,2.876,93,2.31,146,2.791,177,2.407,178,2.223,203,2.46,228,2.578,238,2.876,252,2.436,299,2.606,313,2.791,429,2.144,440,2.971,441,2.971,476,2.791,479,1.733,547,2.643,684,3.198,687,3.34,767,2.714,797,3.198,858,4.615,924,3.724,957,3.34,1167,2.714,1238,2.578,1345,3.34,1402,6.305,1409,3.511,1426,3.198,1441,3.34,1442,3.511,1551,2.714,1598,3.077,1688,3.198,1709,3.724,1731,4.01,1732,4.443,1733,4.01,1734,3.724,1735,4.01,1736,3.34,1737,4.01,1738,4.01,1739,4.01,1740,6.789,1741,3.724,1742,4.01,1743,3.34,1744,3.511,1745,4.01]],["t/240",[0,0.694,2,1.031,10,1.141,11,0.618,16,1.553,17,0.812,21,1.427,23,1.498,24,1.28,25,0.694,26,1.072,32,1.278,36,1.072,52,0.961,58,2.812,59,0.977,79,1.334,90,1.484,92,1.294,96,1.012,115,0.726,121,1.012,125,1.717,126,1.031,145,2.579,146,2.86,172,1.441,185,1.168,187,0.901,200,1.364,203,2.521,204,2.521,213,1.196,221,1.427,222,2.196,223,0.735,228,2.028,238,2.263,239,1.168,250,1.628,252,1.328,277,1.072,285,1.226,298,1.259,299,3.1,319,1.295,336,0.977,369,1.117,390,1.549,429,0.994,439,0.709,440,1.378,441,1.378,476,2.196,479,2.092,490,0.945,514,2.321,547,3.881,559,1.051,651,2.86,684,1.484,687,2.628,690,1.031,751,1.549,764,1.484,767,3.985,768,1.141,832,1.072,844,0.85,858,1.484,898,1.378,900,2.517,906,1.334,941,1.628,954,2.196,957,1.549,972,1.628,1000,1.378,1026,1.549,1027,1.86,1029,1.628,1064,1.628,1069,1.427,1113,1.628,1131,1.117,1163,1.378,1167,1.259,1174,1.295,1180,1.628,1229,1.549,1234,1.727,1244,1.86,1270,2.762,1301,1.196,1379,1.628,1380,1.378,1387,3.155,1402,2.93,1405,5.419,1409,1.628,1415,2.421,1426,1.484,1427,1.628,1433,2.415,1434,2.628,1436,1.484,1441,1.549,1442,1.628,1513,1.86,1536,1.378,1551,1.259,1558,1.549,1598,3.714,1601,1.549,1604,2.762,1680,1.549,1685,1.727,1688,5.995,1692,1.628,1705,1.86,1709,1.727,1710,1.226,1731,1.86,1733,1.86,1734,1.727,1735,1.86,1736,2.628,1737,1.86,1739,1.86,1740,5.419,1741,1.727,1742,4.109,1743,3.422,1744,2.762,1745,1.86,1746,3.496,1747,2.061,1748,2.061,1749,2.061,1750,2.061,1751,2.061,1752,2.061,1753,3.496,1754,1.86,1755,1.549,1756,1.727,1757,2.061,1758,2.061,1759,1.549,1760,5.364,1761,7.318,1762,2.061,1763,1.86,1764,1.86,1765,2.061,1766,2.061,1767,2.061,1768,3.496,1769,3.496,1770,2.061,1771,3.496,1772,2.061,1773,2.061,1774,3.496,1775,2.061,1776,3.496,1777,3.496,1778,2.061,1779,2.061,1780,2.061,1781,2.061,1782,1.628,1783,2.061,1784,1.334]],["t/242",[16,4.059,58,2.647,336,3.593,1433,4.848,1434,7.659,1688,5.454,1693,7.659,1710,4.507,1785,7.577]],["t/244",[2,2.089,10,1.412,13,2.813,14,2.365,16,3.225,17,0.455,32,0.932,58,2.919,78,1.23,90,2.25,92,0.944,104,1.602,125,2.604,172,1.051,187,2.319,214,1.082,216,1.209,223,1.489,277,3.515,281,2.623,299,1.036,300,1.766,304,1.602,305,2.891,314,1.917,316,2.262,341,1.3,428,1.517,479,0.995,713,1.602,764,3.816,785,2.015,789,6.704,845,1.651,847,1.766,863,1.412,906,1.651,926,1.917,936,3.139,948,2.64,954,1.602,959,1.276,1075,3.005,1114,4.189,1120,1.558,1161,1.445,1171,1.766,1181,1.836,1185,2.015,1333,1.602,1334,4.784,1359,2.015,1365,1.836,1374,2.015,1376,2.137,1377,2.301,1380,1.705,1415,1.766,1423,1.558,1433,2.215,1548,4.607,1549,3.499,1551,3.743,1609,5.666,1688,1.836,1689,7.471,1693,2.137,1729,2.015,1786,2.55,1787,4.176,1788,2.015,1789,2.55,1790,2.55,1791,2.55,1792,5.302,1793,2.301,1794,4.176,1795,5.302,1796,2.55,1797,2.55,1798,2.55,1799,2.55,1800,5.302,1801,2.55,1802,2.55,1803,2.55,1804,2.55,1805,6.128,1806,2.55,1807,2.55,1808,2.55,1809,2.55,1810,2.55,1811,3.499,1812,4.176,1813,4.176,1814,4.176,1815,6.128,1816,6.128,1817,2.55,1818,6.128,1819,2.55,1820,2.55,1821,2.55,1822,5.302,1823,2.55,1824,2.55,1825,2.55]],["t/246",[91,3.431,104,5.153,123,3.2,198,3.288,299,3.334,336,3.89,769,5.485,770,6.167]],["t/248",[42,4.145,44,3.79,46,6.423,101,4.404,354,5.668,1022,4.501,1310,6.111,1608,7.336]],["t/250",[0,1.082,48,4.093,140,4.521,178,4.392,187,3.103,192,3.844,341,3.617,391,6.084,422,4.743,790,8.603,802,4.743,863,3.928,1310,5.333,1826,5.946,1827,5.107,1828,7.095]],["t/253",[0,1.224,14,3.491,15,2.974,19,2.781,24,1.733,25,1.593,56,2.311,71,3.764,79,5.779,92,2.281,129,2.972,172,2.541,192,3.339,219,3.666,523,3.764,684,5.779,801,3.204,802,4.12,829,4.268,976,3.871,1161,3.491,1194,4.268,1216,5.561,1238,3.575,1245,4.869,1320,5.561,1326,7.245,1365,4.436,1441,6.035,1442,4.869,1536,4.12,1598,5.559,1729,4.869,1829,6.163,1830,4.633]],["t/255",[0,1.314,32,2.093,36,1.756,40,3.598,48,3.566,58,1.545,93,2.978,137,3.598,160,3.966,176,3.103,221,3.966,229,3.407,342,3.407,431,3.691,443,3.039,488,3.598,513,3.691,577,3.707,690,2.865,758,3.966,785,4.525,793,6.632,801,3.977,880,3.829,936,4.306,976,4.805,988,3.966,1384,4.8,1510,6.805,1827,4.123,1831,5.728,1832,5.728,1833,5.728,1834,5.728,1835,5.728,1836,5.728,1837,5.728,1838,5.728,1839,5.728,1840,5.728,1841,5.728,1842,5.728]],["t/257",[3,2.502,5,2.346,10,2.198,17,1.053,25,0.787,92,1.469,118,1.038,122,2.677,123,2.302,143,2.184,162,1.986,165,2.198,178,1.986,184,1.949,187,1.736,198,1.591,204,2.198,225,1.591,274,2.361,331,2.302,344,5.399,346,5.866,347,4.562,348,2.748,350,1.82,351,3.326,388,4.088,449,1.66,456,3.424,463,2.569,511,2.15,531,2.983,536,3.136,715,2.748,760,3.136,801,2.063,807,3.946,811,2.361,824,2.653,852,2.983,853,3.605,862,2.248,1000,2.653,1022,2.198,1024,3.136,1110,2.857,1149,2.857,1161,2.248,1187,2.302,1198,2.248,1296,3.136,1323,2.983,1345,2.983,1617,3.136,1694,3.136,1755,2.983,1830,2.983,1843,3.969,1844,3.969,1845,3.581,1846,3.969,1847,3.581,1848,3.581,1849,3.969,1850,3.969,1851,3.969,1852,3.969,1853,3.581,1854,3.969,1855,3.136,1856,3.581,1857,3.969,1858,3.969,1859,3.581,1860,4.249,1861,3.581,1862,3.581,1863,3.326,1864,3.326,1865,3.326,1866,4.947,1867,3.969,1868,2.857,1869,3.969,1870,3.969,1871,3.969,1872,3.969,1873,3.969,1874,3.969,1875,3.969,1876,3.969,1877,3.326,1878,3.581,1879,3.969,1880,3.969]],["t/259",[0,1.287,22,5.64,140,4.001,755,5.299,1881,6.666]],["t/261",[4,2.523,5,2.653,10,3.389,11,1.836,17,1.092,23,1.405,24,1.721,25,1.214,56,2.997,92,2.266,102,3.845,123,2.387,137,3.845,198,2.453,223,2.182,247,2.636,296,2.636,340,4.092,344,5.76,352,3.182,388,3.551,487,3.845,559,3.121,755,3.845,847,4.238,891,4.406,945,4.601,948,3.443,1184,4.601,1238,3.551,1301,3.551,1855,4.836,1882,5.13,1883,6.121,1884,6.121,1885,6.121,1886,6.121,1887,6.121]],["t/263",[0,1.196,11,2.352,16,4.144,28,3.852,30,5.431,31,4.55,32,2.867,33,3.188,113,5.645,131,4.79,490,3.597,577,5.077]],["t/265",[0,1.136,5,2.095,32,2.723,58,2.628,130,3.309,143,2.309,299,3.028,344,4.822,433,4.822,530,4.822,559,3.798,1888,6.723,1889,6.723,1890,6.244,1891,6.244,1892,6.244,1893,7.45]],["t/267",[5,1.282,23,1.046,24,1.282,25,0.904,32,1.666,58,2.835,213,3.788,235,3.884,241,2.581,247,1.963,296,1.963,310,3.988,336,3.096,343,6.885,350,2.09,356,5.472,360,2.469,433,2.95,530,4.939,844,3.145,1015,6.984,1423,2.783,1736,3.426,1890,3.819,1891,5.472,1892,3.819,1894,4.557,1895,4.557,1896,4.557,1897,4.557,1898,4.557,1899,4.557,1900,4.557,1901,4.557,1902,4.557,1903,4.557,1904,4.557,1905,4.557,1906,4.557,1907,6.984,1908,4.557,1909,3.6,1910,4.557,1911,4.557,1912,4.557,1913,4.557,1914,4.557,1915,4.557,1916,4.557,1917,4.557,1918,4.557,1919,4.557,1920,6.529,1921,4.557,1922,6.529,1923,4.557,1924,4.557,1925,4.557,1926,4.557,1927,4.557]],["t/269",[6,2.386,11,1.263,13,4.261,17,1.433,19,3.624,20,3.167,22,2.816,32,1.54,48,1.964,52,1.964,58,2.647,78,2.976,93,2.19,130,1.871,140,3.46,173,3.032,177,2.282,183,3.53,223,1.502,277,2.19,285,2.506,309,2.646,316,2.282,341,2.148,385,2.618,388,3.578,431,2.033,505,2.727,511,2.282,530,4.723,599,4.637,616,3.328,633,3.342,697,3.032,754,4.44,801,2.19,814,3.167,829,2.917,836,2.727,846,3.53,862,2.386,890,3.328,891,4.44,923,2.917,948,3.143,970,2.917,1012,3.801,1065,3.53,1105,2.573,1376,3.53,1380,2.816,1429,4.44,1637,3.53,1907,5.169,1928,4.213,1929,4.213,1930,4.213,1931,4.213,1932,4.213,1933,4.213,1934,4.213,1935,4.213,1936,4.213,1937,4.213,1938,6.168,1939,4.213,1940,4.213,1941,4.213,1942,4.213,1943,4.213,1944,3.801,1945,4.213,1946,4.213,1947,3.53,1948,3.801,1949,3.53,1950,4.213]],["t/271",[40,5.201,41,5.359,47,6.224,48,3.86,50,5.057,101,4.486,107,6.542]],["t/273",[9,5.513,10,4.716,1951,7.686,1952,7.686]],["t/275",[0,0.816,1,2.727,2,2.676,3,2.865,4,2.205,5,1.505,6,3.03,7,4.227,9,3.463,44,3.406,101,2.898,110,3.182,125,2.628,134,3.851,141,3.576,143,1.658,170,4.461,223,1.907,342,3.182,346,5.491,378,2.581,453,3.103,686,3.36,688,3.267,758,3.704,771,3.267,807,3.576,844,2.205,1267,4.827,1319,4.227,1953,5.35,1954,5.35,1955,3.851,1956,4.021,1957,4.827,1958,4.227,1959,7.305,1960,5.35,1961,6.592,1962,7.305,1963,5.35,1964,5.35,1965,5.35,1966,4.827,1967,4.827,1968,5.35,1969,5.35,1970,5.35,1971,5.35,1972,5.35,1973,5.35,1974,5.35,1975,5.35,1976,5.35,1977,5.35,1978,5.35,1979,5.35]],["t/277",[3,1.397,10,2.412,88,2.808,92,1.613,116,3.581,118,2.439,123,1.699,125,2.14,128,3.105,130,1.935,143,1.35,162,2.18,235,2.591,321,3.136,352,2.265,360,2.36,379,2.311,425,3.442,448,4.377,449,3.78,452,2.468,531,4.752,545,3.017,549,3.017,651,2.737,686,5.443,702,3.861,723,2.737,746,2.82,759,1.935,822,3.136,824,2.912,834,3.442,852,3.275,946,3.136,1052,3.442,1124,3.275,1135,3.651,1301,3.667,1304,3.136,1311,5.298,1536,2.912,1637,3.651,1674,3.931,1691,3.931,1860,4.55,1980,5.282,1981,6.713,1982,3.651,1983,3.136,1984,3.931,1985,4.357,1986,4.357,1987,3.931,1988,5.298,1989,4.357,1990,4.357,1991,3.275,1992,4.357,1993,3.275,1994,4.357,1995,4.357,1996,3.442,1997,4.357,1998,3.275,1999,4.357,2000,4.357,2001,4.357,2002,4.357,2003,3.017,2004,4.357,2005,3.931,2006,4.357,2007,4.357]],["t/279",[0,0.988,1,3.302,2,3.24,4,3.417,5,2.331,6,3.669,11,1.942,24,1.821,25,1.285,44,3.019,109,4.484,128,4.072,184,3.181,217,3.852,282,3.019,288,5.428,926,4.868,959,3.24,1047,4.068,1054,5.428,1145,5.844,1182,5.117,1301,3.757,2008,5.844,2009,5.844,2010,6.476,2011,7.48,2012,6.476,2013,6.476,2014,5.844,2015,6.476,2016,6.476,2017,6.476]],["t/281",[0,0.631,3,1.686,4,2.977,5,2.58,7,1.992,8,1.584,10,2.291,11,0.756,25,1.044,44,1.176,48,1.929,56,1.551,88,1.12,92,0.933,101,1.366,109,1.746,115,0.888,117,2.241,118,1.082,122,0.958,123,0.983,128,2.032,134,1.815,143,2.364,162,2.07,163,2.266,176,1.366,178,1.261,182,1.12,186,1.311,238,1.632,241,2.98,243,1.815,247,1.086,251,2.678,252,0.958,270,1.463,274,1.5,298,1.54,299,1.681,303,1.261,319,1.584,331,3.051,347,1.632,350,1.156,354,1.5,378,1.217,381,1.5,386,1.746,425,1.992,452,1.428,473,1.584,477,1.809,479,0.983,488,1.584,490,1.156,505,2.678,554,1.176,651,1.584,688,1.54,697,1.815,703,2.113,715,3.642,724,1.992,754,2.978,802,1.686,807,1.686,820,1.815,822,1.815,844,1.039,862,1.428,879,1.815,926,1.895,931,2.113,993,2.113,997,1.992,1024,1.992,1028,2.275,1029,1.992,1046,1.992,1047,1.584,1069,1.746,1120,2.527,1121,2.275,1131,1.366,1151,1.632,1164,2.275,1182,1.992,1190,2.275,1230,1.992,1301,1.463,1304,4.837,1317,3.405,1324,2.275,1422,1.746,1460,2.275,1549,3.467,1582,2.275,1638,2.275,1640,4.215,1755,1.895,1759,1.895,1788,3.268,1827,1.815,1860,1.815,1863,2.113,1868,1.815,1878,2.275,1956,1.895,1998,3.11,2003,1.746,2005,3.733,2008,2.275,2009,5.492,2014,2.275,2018,3.467,2019,2.113,2020,2.521,2021,1.992,2022,2.521,2023,2.275,2024,2.521,2025,2.275,2026,4.137,2027,2.521,2028,2.521,2029,2.521,2030,2.113,2031,2.521,2032,2.521,2033,2.521,2034,2.521,2035,2.521,2036,2.521,2037,4.137,2038,4.137,2039,2.521,2040,2.521,2041,2.113,2042,2.521,2043,2.113,2044,4.137,2045,2.521,2046,2.521,2047,2.521,2048,2.275,2049,2.521,2050,2.521,2051,4.137,2052,2.521,2053,2.275,2054,2.521,2055,2.113,2056,2.521,2057,2.521,2058,2.521,2059,2.521,2060,2.521,2061,2.521,2062,2.521,2063,2.521,2064,5.26,2065,2.521,2066,2.521,2067,2.521,2068,2.521,2069,2.521,2070,2.521,2071,2.521,2072,2.521,2073,1.895,2074,2.275,2075,2.521,2076,2.275,2077,2.275,2078,2.521,2079,2.521,2080,2.521,2081,2.521]],["t/283",[3,3.176,4,2.879,56,2.618,104,4.387,241,3.956,1206,5.517,1690,6.302,1966,6.302,1967,6.302,2082,6.983,2083,6.983,2084,6.983,2085,6.983,2086,6.302,2087,6.983,2088,6.983,2089,6.983,2090,6.983,2091,6.983,2092,6.983,2093,6.983,2094,6.983,2095,6.983,2096,6.983]],["t/285",[23,1.994,530,5.62]],["t/287",[0,1.251,23,1.884,143,2.97,434,4.981,530,6.201]],["t/289",[0,0.495,3,1.041,4,1.338,17,0.579,24,0.913,25,0.644,26,2.633,32,1.187,36,0.995,49,1.983,66,2.039,92,1.875,115,1.143,119,2.039,129,1.875,143,1.93,145,4.782,157,2.039,163,1.398,164,1.931,195,1.759,199,2.531,213,2.938,214,2.985,216,1.539,228,1.883,239,1.839,252,1.233,258,2.248,266,2.17,267,2.337,268,5.597,296,1.398,313,2.039,322,3.175,327,4.312,350,1.489,367,1.655,385,4.085,428,3.013,429,1.566,430,5.726,431,1.566,432,2.44,433,2.101,434,1.688,435,2.44,436,2.337,437,2.44,438,2.44,439,2.779,440,2.17,441,2.17,442,2.44,443,1.722,444,2.337,445,2.17,446,2.44,447,2.248,448,4.312,449,3.19,450,2.44,451,4.419,452,2.869,453,1.883,455,1.931,466,1.983,503,4.573,508,3.646,509,2.337,510,5.063,511,2.744,512,3.807,513,2.444,514,2.582,515,3.013,516,2.44,517,2.44,518,2.44,519,2.44,520,2.44,521,3.807,522,2.248,523,1.983,524,2.17,530,3.278,550,2.337,948,1.398,1889,2.93,1892,2.721,2097,2.93]],["t/291",[5,1.904,24,1.904,25,1.343,35,4.974,51,3.668,101,3.668,104,4.253,118,1.771,119,4.253,121,3.326,147,4.383,344,4.383,360,3.668,477,2.961,490,3.105,534,5.09,815,5.35,923,4.689,1111,4.83,1167,4.136,1259,5.675,2048,6.11,2098,6.771,2099,6.771,2100,6.771]],["t/293",[0,1.186,5,2.187,22,5.198,129,2.878,140,3.687,225,3.116,316,4.212,367,3.964,368,4.884,369,4.212,548,5.198,755,4.884,1198,4.404,1881,6.143]],["t/295",[0,0.449,14,1.669,17,1.298,37,1.165,58,2.673,79,1.907,88,1.309,96,1.447,116,1.669,121,1.447,122,3.52,140,1.397,143,1.812,177,2.542,188,1.474,200,1.149,208,1.596,213,1.709,214,1.991,219,1.752,224,2.121,225,1.181,247,1.269,285,1.752,292,1.752,298,1.799,311,4.072,347,3.037,360,3.944,363,6.016,364,6.817,365,4.234,368,1.851,388,1.709,433,3.784,455,2.791,463,3.037,466,2.865,554,3.108,568,4.208,633,1.596,690,1.474,820,2.121,832,2.439,833,1.596,844,2.748,862,1.669,864,2.328,945,3.527,954,1.851,1015,7.475,1105,1.799,1115,3.932,1120,1.799,1161,1.669,1187,1.709,1198,1.669,1373,2.328,1374,2.328,1403,3.932,1714,1.851,1784,1.907,1830,4.395,1890,5.587,1891,4.9,1907,3.932,1909,3.707,2041,3.932,2101,4.234,2102,4.692,2103,6.667,2104,4.692,2105,5.846,2106,4.692,2107,4.692,2108,4.692,2109,4.692,2110,4.692,2111,4.692,2112,4.692,2113,4.692,2114,7.279,2115,2.215,2116,5.846,2117,2.946,2118,2.946,2119,2.946,2120,2.946,2121,2.946,2122,2.946]],["t/297",[17,0.937,22,3.513,37,2.853,51,2.847,90,2.23,94,2.977,122,4.006,128,4.048,184,2.581,188,2.629,200,2.05,214,2.23,282,2.45,303,4.123,354,3.126,364,4.404,368,3.301,369,2.847,385,4.252,617,3.783,633,2.847,679,4.824,843,3.639,948,3.108,1052,4.152,1061,3.783,1096,4.152,1131,2.847,1187,3.049,1202,4.404,1229,3.95,1358,3.783,1415,3.639,1571,4.742,1617,4.152,1988,4.404,2101,4.742,2115,3.95,2123,5.255,2124,5.255,2125,4.152,2126,4.742,2127,5.255]],["t/299",[35,1.657,37,1.358,58,2.96,122,2.009,129,1.271,162,1.718,188,1.718,204,1.901,329,2.866,341,1.751,369,1.86,449,1.436,505,2.223,523,2.097,548,3.537,723,2.157,781,4.85,850,2.581,859,2.581,1020,2.378,1860,2.472,2128,2.097,2129,3.434,2130,3.434,2131,3.434,2132,5.29,2133,3.434,2134,3.434,2135,9.127,2136,3.434,2137,3.434,2138,10.182,2139,3.434,2140,3.434,2141,3.434,2142,3.434,2143,3.434,2144,3.434,2145,7.829,2146,3.434,2147,3.434,2148,3.434,2149,3.434,2150,3.434,2151,3.434,2152,3.434,2153,3.434,2154,3.434,2155,3.434,2156,3.434,2157,3.434,2158,3.434,2159,3.434,2160,3.434,2161,3.434,2162,3.434,2163,3.434,2164,3.434,2165,3.434,2166,3.434,2167,3.434,2168,3.434,2169,3.434,2170,3.434,2171,3.434,2172,3.434,2173,3.434,2174,3.434,2175,3.099,2176,3.434,2177,3.434,2178,3.434,2179,3.434,2180,3.434,2181,3.434,2182,3.434,2183,3.434]],["t/301",[188,4.261,935,7.686,948,3.669,959,4.261]],["t/303",[3,2.45,17,1.638,122,2.903,246,4.433,329,4.14,697,5.5,945,5.744,948,3.957,959,3.823,1848,6.896,1944,6.896,2175,6.896,2184,6.037,2185,7.642]],["t/305",[355,6.794,774,4.302,782,6.464]],["t/307",[43,5.31,56,3.076,90,4.066,497,5.31,530,5.31,888,5.31,1129,5.905]],["t/309",[0,1.196,11,2.352,16,4.144,28,3.852,30,5.431,31,4.55,32,2.867,33,3.188,113,5.645,131,4.79,490,3.597,577,5.077]],["t/311",[39,6.542,40,5.201,47,6.224,48,3.86,50,5.057,101,4.486,107,6.542]],["t/313",[9,5.513,10,4.716,1951,7.686,1952,7.686]],["t/316",[23,1.956,24,2.395,25,1.69,163,3.669]],["t/318",[0,1.218,23,1.833,24,2.652,25,1.584,28,3.921,143,2.475,163,3.439,171,3.439,434,4.902]],["t/320",[0,0.258,3,0.292,4,0.376,5,1.217,11,0.274,17,0.772,24,0.664,25,0.687,26,1.228,28,0.448,32,0.863,33,0.687,36,0.28,37,0.361,44,0.425,45,0.361,49,0.557,56,0.634,57,0.686,58,1.436,59,0.433,66,0.573,87,1.76,88,0.751,89,2.175,91,0.381,92,0.338,94,0.517,115,0.832,118,0.906,119,0.573,122,0.897,126,0.456,127,0.61,129,1.86,141,0.61,142,0.61,143,0.732,144,0.721,145,2.451,147,1.094,153,0.686,154,1.271,155,0.686,156,0.721,157,0.573,161,0.557,162,2.348,163,0.728,164,1.405,166,2.714,167,0.657,168,3.097,171,1.27,172,0.376,173,0.657,174,1.338,175,1.971,176,1.28,178,2.514,181,1.309,185,0.517,188,0.456,195,1.28,197,1.636,199,1.198,203,0.505,206,0.657,208,3.033,210,0.764,213,1.37,214,3.718,216,3.678,223,0.325,225,0.947,228,0.529,234,1.801,235,1.405,239,0.517,241,1.67,246,0.981,247,0.393,252,0.346,258,1.171,266,0.61,267,0.657,268,4.05,295,0.573,296,2.794,303,0.456,310,0.557,313,0.573,319,1.062,322,1.503,327,2.041,335,0.61,336,0.433,344,0.59,350,1.588,352,0.474,367,0.465,368,1.484,369,1.28,384,0.632,385,4.172,388,0.529,410,1.204,428,1.005,429,0.44,430,4.981,431,0.44,432,0.686,433,0.59,434,0.474,435,0.686,436,0.657,437,0.686,438,0.686,439,1.614,440,0.61,441,0.61,442,0.686,443,0.484,444,0.657,445,0.61,446,0.686,447,0.632,448,1.636,449,1.81,450,0.686,451,1.852,452,1.962,453,0.529,454,0.823,455,2.06,456,0.529,457,2.132,458,0.657,459,2.25,460,1.005,461,2.947,462,2.537,463,0.59,464,1.336,465,0.721,466,2.115,467,0.823,468,0.823,469,1.171,470,0.823,471,0.721,472,0.632,473,1.062,474,0.557,475,0.543,476,1.062,477,0.399,478,0.721,479,0.659,480,0.632,481,4.844,482,0.823,483,0.657,484,1.171,485,0.657,486,0.657,487,0.573,488,0.573,489,0.657,490,0.418,491,0.573,492,0.764,493,1.271,494,0.764,495,1.171,496,1.529,497,0.59,498,1.094,499,2.511,500,2.723,501,2.122,502,0.823,503,2.543,504,1.005,505,1.094,506,2.06,507,0.823,508,2.122,509,0.657,510,2.122,511,0.916,512,1.776,513,0.816,514,0.862,515,1.005,516,0.686,517,0.686,518,0.686,519,0.686,520,0.686,521,1.271,522,0.632,523,0.557,524,0.61,525,0.764,526,3.446,527,0.823,528,0.721,529,1.525,530,0.59,531,0.686,532,0.823,533,0.823,534,0.686,535,0.764,536,0.721,537,0.823,538,0.764,539,0.823,540,0.823,541,0.764,542,0.823,543,0.823,544,0.686,545,1.171,546,0.657,547,0.543,548,1.971,549,0.632,550,1.217,551,0.721,552,0.721,553,0.657,554,1.615,555,0.764,556,0.764,557,0.764,558,0.764,563,0.764,564,0.823,565,0.823,566,0.823,567,0.916,568,2.122,569,0.823,570,0.764,571,0.823,572,0.823,573,0.823,574,0.721,575,1.98,576,0.573,577,0.59,578,0.823,579,0.823,580,0.823,581,0.823,582,1.525,583,2.216,584,1.525,585,0.823,586,2.132,587,0.823,588,0.721,589,1.062,590,0.764,591,0.823,592,0.632,593,0.721,594,0.686,595,0.721,596,1.866,597,1.005,598,0.412,599,0.686,600,0.823,601,1.217,602,1.171,603,1.336,604,0.721,605,0.573,606,0.823,607,0.823,608,0.823,612,0.764,613,0.823,614,0.823,615,0.823,616,0.721,617,0.657,618,1.417,619,0.823,620,1.525,621,0.823,622,0.823,623,0.823,624,1.484,625,0.721,626,3.379,627,2.603,629,0.721,630,0.721,631,1.271,632,1.13,633,0.494,634,0.686,635,0.721,636,0.632,637,0.721,638,0.721,639,0.721,640,3.528,641,0.764,642,1.525,643,1.094,644,1.417,645,0.721,646,2.329,647,1.866,648,1.417,649,0.764,650,0.823,651,0.573,652,0.823,653,0.764,654,0.632,655,0.823,656,0.823,657,0.764,658,0.823,659,1.525,660,0.764,661,0.721,662,0.764,663,0.721,664,0.657,862,0.517,970,0.632,2186,0.823,2187,0.912,2188,0.764]],["t/322",[5,1.523,23,1.243,87,2.762,118,1.416,123,2.112,126,3.685,137,4.626,163,2.332,169,4.538,217,3.221,223,2.626,259,3.505,260,5.596,296,2.332,320,3.749,331,3.141,341,2.761,396,3.749,449,2.264,499,4.273,549,5.1,561,3.307,567,2.933,599,4.07,700,5.536,760,4.278,959,2.709,1052,4.278,1093,3.897,1151,4.767,1163,3.62,1422,3.749,1610,4.278,1706,4.886,1860,5.301,1861,4.886,1956,4.07,1984,6.646,2189,3.62,2190,5.415,2191,5.415,2192,5.415,2193,5.415,2194,4.538,2195,4.278,2196,4.886,2197,5.415,2198,5.415,2199,5.415,2200,6.646,2201,5.415]],["t/324",[0,1.264,23,1.487,87,3.428,96,3.181,118,2.168,178,3.24,296,2.79,340,4.33,449,3.823,460,3.852,479,2.526,499,5.591,500,3.757,528,5.117,562,2.708,611,5.117,686,4.068,745,4.662,833,3.509,959,3.24,1151,4.192,1168,5.117,2202,5.428,2203,6.476,2204,6.476,2205,8.289,2206,6.476]],["t/326",[0,1.427,3,1.715,5,1.505,17,0.954,23,1.677,24,2.054,25,1.061,33,2.174,35,2.581,59,2.537,78,2.581,96,2.628,117,2.898,118,1.911,122,2.775,123,2.087,143,1.658,172,3.011,181,3.695,246,4.238,262,4.883,276,2.962,347,3.463,366,4.827,418,4.483,455,3.182,473,3.36,499,5.185,544,4.021,554,2.494,559,2.727,605,3.36,612,4.483,617,3.851,700,4.021,713,3.36,829,3.704,846,4.483,959,2.676,970,3.704,1151,3.463,1423,3.267,1610,4.227,1701,4.827,1782,4.227,2189,4.883,2207,5.35,2208,7.305]],["t/328",[0,0.981,43,4.162,110,3.824,123,2.508,125,3.158,130,2.856,143,1.993,171,2.769,172,2.65,174,3.642,186,3.343,234,4.737,270,3.73,322,3.278,352,4.29,354,3.824,405,3.927,406,4.298,477,2.812,497,4.162,664,4.628,771,3.927,833,3.483,880,4.298,1039,5.802,1105,3.927,1129,4.628,1163,4.298,1238,3.73,1680,4.833,1788,5.08,1909,5.08,2209,4.833,2210,5.08,2211,6.43]],["t/330",[0,1.1,142,4.819,143,2.235,147,4.666,153,5.419,155,5.419,174,4.084,181,3.202,208,3.906,422,4.819,638,5.696,644,6.042,645,5.696,647,5.696,648,6.042,653,6.042,657,6.042,660,6.042,661,5.696,662,6.042,663,5.696,664,5.189,844,2.972]],["t/332",[0,0.543,3,1.742,11,1.067,23,1.515,24,1,25,1.925,32,1.3,35,2.622,37,1.406,96,1.747,114,2.378,115,1.914,122,2.065,123,1.387,130,1.58,143,2.044,147,5.428,166,2.463,171,2.341,172,2.719,174,4.506,175,4.936,181,1.58,184,2.67,187,1.556,194,2.56,198,1.426,200,1.387,208,1.927,217,2.116,218,2.981,221,2.463,234,4.974,243,2.56,252,2.505,274,2.116,282,1.658,299,3.001,329,1.927,333,2.81,334,2.981,337,2.56,345,2.303,352,2.826,357,2.463,360,4,369,1.927,426,2.981,554,1.658,562,1.488,589,2.234,640,2.674,688,2.173,695,2.234,803,1.716,832,1.849,833,2.945,847,2.463,884,2.81,1014,2.173,1065,2.981,1110,2.56,1111,2.015,1132,2.981,1257,2.981,1296,2.81,1301,2.064,1345,2.674,1600,2.463,1654,3.21,1845,3.21,1859,3.21,1888,3.21,2003,2.463,2021,2.81,2194,2.981,2202,2.981,2209,4.086,2212,3.557,2213,3.557,2214,3.557,2215,5.435,2216,3.557,2217,3.557,2218,3.557,2219,3.557,2220,3.557,2221,2.981,2222,3.557,2223,2.674,2224,3.557,2225,3.557,2226,3.557]],["t/334",[0,0.664,3,2.026,8,2.737,11,1.307,17,0.777,24,1.225,25,1.85,29,2.661,32,1.592,37,1.722,52,2.031,56,1.634,114,2.912,122,1.655,126,2.18,129,1.613,143,2.306,147,2.82,166,6.741,167,3.136,171,2.723,172,1.796,174,2.468,175,4.226,187,1.905,192,2.36,194,3.136,195,2.36,198,2.534,199,1.771,200,1.699,201,3.136,202,3.931,208,2.36,229,2.591,234,2.265,246,2.527,296,1.877,320,3.017,352,2.265,357,3.017,361,3.275,381,2.591,477,1.905,490,1.998,495,3.017,503,2.36,554,2.031,562,1.822,617,3.136,626,3.136,778,2.912,932,2.82,948,1.877,973,3.136,988,3.017,1014,2.661,1033,3.931,1180,4.994,1199,3.931,1228,3.931,1248,3.017,1642,3.931,1692,3.442,1743,3.275,1784,2.82,1868,3.136,2003,3.017,2019,3.651,2184,3.442,2209,3.275,2227,5.704,2228,4.357,2229,4.357,2230,4.357,2231,3.651,2232,4.357,2233,3.651,2234,4.357,2235,4.357,2236,3.651,2237,4.357]],["t/336",[17,1.671,24,1.919,25,1.354,56,3.213,116,3.865,143,2.115,163,2.939,198,2.735,234,3.547,252,3.255,350,3.129,371,6.769,406,5.728,485,4.911,829,4.725,912,5.391,1120,4.167,1955,4.911,1998,5.129,2194,5.718,2238,6.157,2239,6.823,2240,6.823,2241,6.823]],["t/338",[3,1.223,25,1.137,49,2.331,56,2.149,62,2.47,96,1.874,110,2.27,143,2.372,178,1.909,182,1.695,184,2.815,197,3.969,204,2.113,225,1.53,229,2.27,234,3.979,252,2.615,342,3.41,352,2.98,386,2.642,406,4.602,453,3.325,485,4.126,498,2.47,547,2.27,595,3.015,605,2.397,654,3.969,725,3.832,726,2.642,777,5.77,780,2.869,810,3.71,833,3.73,834,3.015,840,5.469,853,2.331,859,2.869,897,3.198,923,3.969,1000,2.551,1003,2.47,1043,3.444,1072,3.198,1099,3.444,1109,3.015,1110,4.126,1248,2.642,1414,3.444,1449,3.444,1451,2.869,1663,3.015,1827,2.747,1847,3.444,1863,3.198,1882,3.198,1956,2.869,1982,5.77,1993,2.869,2195,3.015,2223,2.869,2238,5.173,2242,3.015,2243,3.198,2244,3.816,2245,7.653,2246,7.061,2247,6.884,2248,3.816,2249,3.816,2250,3.816,2251,3.816,2252,3.816,2253,3.816,2254,3.816,2255,5.732,2256,3.816,2257,5.732,2258,3.816,2259,3.816,2260,3.444,2261,3.816,2262,3.816]],["t/340",[56,2.868,160,3.966,172,2.361,188,4.309,252,2.906,303,2.865,309,3.598,329,4.666,352,4.779,371,4.525,385,2.431,405,4.672,495,5.297,496,4.951,513,2.764,589,3.598,618,4.8,726,3.966,746,5.575,751,4.306,763,4.951,840,5.123,1248,3.966,1257,4.8,1258,5.169,1400,5.169,1600,3.966,1621,5.169,1998,4.306,2003,3.966,2019,4.8,2115,4.306,2209,4.306,2263,5.728,2264,3.966,2265,5.728,2266,7.649]],["t/342",[31,4.055,96,3.951,110,2.985,121,2.465,122,1.906,126,2.511,143,2.935,171,3.011,182,2.229,225,2.011,234,3.634,252,2.655,262,3.355,270,4.055,290,3.772,345,4.524,352,4.522,371,3.965,378,2.421,405,4.912,406,3.355,414,3.965,418,4.206,511,3.787,554,2.34,627,3.772,640,3.772,834,3.965,889,3.965,948,2.162,1082,4.206,1151,3.248,1206,3.965,1317,4.524,1323,3.772,1600,3.475,1685,4.206,1877,4.206,1882,4.206,1909,6.355,1982,4.206,1983,3.612,2003,4.84,2209,3.772,2243,4.206,2267,8.043,2268,6.308,2269,5.019,2270,5.019,2271,5.019,2272,5.019]],["t/344",[0,0.74,1,3.482,5,1.921,24,2.411,25,1.792,87,3.214,90,2.898,110,5.374,118,1.786,175,3.245,197,5.936,208,5.681,225,1.946,295,3.049,296,2.942,367,2.475,368,3.049,388,2.816,391,2.965,487,3.049,500,2.816,506,4.062,562,2.03,639,3.835,646,3.835,741,4.729,803,2.342,1023,3.649,1309,3.835,1317,3.142,1639,4.381,1640,3.362,2189,3.245,2210,3.835,2273,4.855,2274,4.855,2275,4.855,2276,4.855,2277,4.855,2278,4.855,2279,4.855,2280,4.855,2281,4.855,2282,4.855,2283,4.855,2284,4.855]],["t/346",[0,1.218,90,3.388,94,4.522,208,4.325,282,3.722,664,5.746,781,6.001,948,3.439,1309,6.308,1729,6.308,2285,7.984]],["t/348",[0,0.826,3,1.736,24,2.071,25,1.661,32,1.979,56,2.03,59,2.568,87,2.03,90,2.298,96,2.66,130,2.405,136,4.278,143,1.678,162,3.685,163,3.172,172,2.232,191,3.307,225,2.17,234,2.815,252,2.057,285,3.221,299,2.201,329,3.99,337,3.897,346,4.07,350,4.445,360,2.933,361,4.07,379,2.873,410,2.761,458,3.897,465,4.278,466,3.307,480,3.749,598,2.443,807,3.62,851,4.538,884,4.278,885,4.886,924,4.538,959,2.709,1047,3.401,1217,4.07,1238,3.141,1317,3.505,1599,4.538,1868,3.897,2018,4.538,2073,4.07,2286,4.538,2287,4.886,2288,5.415,2289,3.505]],["t/350",[2,1.648,4,1.358,5,0.927,10,3.481,25,1.684,32,1.204,49,3.839,56,1.921,83,4.293,92,2.327,116,1.866,118,1.34,125,2.516,126,1.648,128,2.516,129,1.22,141,2.202,143,2.198,160,2.281,162,3.547,163,2.707,169,2.761,198,1.32,204,1.824,238,2.132,266,2.202,299,1.339,333,2.603,341,1.68,342,1.96,346,5.33,347,4.589,360,3.841,448,2.281,449,1.378,461,5.33,462,4.589,475,1.96,476,3.218,477,1.441,478,2.603,479,1.998,480,2.281,491,2.069,531,3.851,554,1.536,559,1.68,568,2.371,758,2.281,759,2.275,763,2.132,843,2.281,926,2.476,959,1.648,1000,2.202,1001,2.973,1003,2.132,1024,4.047,1058,2.973,1061,2.371,1120,2.012,1135,4.293,1301,2.972,1319,6.068,1342,2.761,1346,2.476,1429,2.371,1452,2.973,1640,3.547,1694,2.603,1759,3.851,1788,2.603,1826,2.761,1827,2.371,1830,2.476,1862,2.973,1866,2.761,1868,2.371,1955,2.371,1980,4.971,1981,5.672,1987,2.973,2043,2.761,2073,2.476,2077,2.973,2243,2.761,2268,2.973,2286,2.761,2289,2.132,2290,5.123,2291,5.123,2292,3.294,2293,3.294,2294,3.294,2295,3.294,2296,3.294,2297,3.294,2298,3.294,2299,3.294,2300,4.293,2301,3.294,2302,3.294,2303,3.294,2304,3.294,2305,3.294,2306,3.294,2307,3.294,2308,3.294]],["t/353",[4,2.558,24,1.745,25,1.95,49,3.79,56,2.327,113,4.467,130,2.756,143,1.924,162,4.035,204,3.436,225,3.232,241,3.515,252,2.357,299,2.522,350,4.35,360,3.362,453,3.6,466,5.472,480,4.297,946,4.467,1029,4.903,1046,4.903,1217,4.665,1296,4.903,1529,5.6,1563,5.201,1680,4.665,1755,4.665,1955,4.467,2264,4.297,2289,4.017,2309,6.206]],["t/355",[8,3.845,24,2.248,25,1.586,32,2.237,43,3.962,87,2.997,161,3.738,163,2.636,182,2.718,194,4.406,252,2.325,299,2.488,329,3.316,350,4.081,410,3.121,449,3.722,479,2.387,807,4.092,959,3.062,1155,5.13,1156,5.13,1217,4.601,1317,5.173,1319,6.314,1333,3.845,1599,5.13,1868,4.406,2003,4.238,2018,5.13,2128,4.881,2264,6.162,2289,3.962,2310,6.121]],["t/357",[24,1.835,25,1.82,90,2.768,113,4.696,130,2.897,133,4.696,143,2.022,160,4.517,162,3.264,182,2.897,188,3.264,299,2.651,336,3.093,350,3.819,410,3.326,449,3.483,475,4.954,480,4.517,491,6.071,497,4.223,959,3.264,1046,5.154,1217,4.904,1563,5.467,2195,5.154,2287,5.887,2311,6.524,2312,6.524]],["t/359",[25,1.285,91,2.708,172,2.67,225,2.596,252,3.149,341,3.302,350,3.801,401,5.428,449,3.467,451,4.068,456,3.757,460,3.852,466,5.584,686,4.068,724,5.117,916,5.844,957,4.868,1069,4.484,1161,3.669,1171,4.484,1198,5.179,1246,5.428,1526,5.428,1668,4.484,1866,5.428,2264,4.484,2289,4.192,2313,6.476,2314,6.476,2315,6.476]],["t/361",[0,1.209,17,1.413,24,1.373,25,0.968,32,3.309,101,2.644,115,1.719,116,2.765,128,2.398,143,2.125,160,3.38,161,2.981,181,2.168,188,3.43,205,2.538,223,1.74,234,2.538,241,2.765,298,2.981,299,1.984,303,2.442,305,3.38,350,4.587,385,2.071,406,3.263,411,3.066,449,2.867,452,2.765,458,3.513,464,3.856,465,3.856,466,2.981,471,3.856,489,3.513,490,2.238,491,4.306,626,3.513,843,3.38,862,2.765,946,4.935,948,2.102,1013,3.856,1047,3.066,1094,4.091,1142,4.091,1163,3.263,1301,2.832,1510,3.856,1603,3.856,1620,4.405,2264,3.38,2289,5.562,2316,4.881,2317,3.513,2318,4.881,2319,4.881,2320,4.881,2321,4.881]],["t/363",[0,0.455,3,0.957,5,1.334,24,2.061,25,1.547,36,1.454,43,1.933,58,2.941,87,2.747,89,1.875,90,2.012,96,1.467,97,1.691,116,1.691,118,1.543,125,1.467,129,1.105,136,2.359,157,4.219,162,2.951,163,1.286,165,1.653,166,2.067,194,2.149,198,1.9,214,3.6,215,3.069,234,1.552,252,2.24,277,1.552,299,1.213,310,1.824,328,5.629,381,1.776,391,1.824,410,4.566,439,2.519,449,1.983,474,4.475,479,1.165,497,1.933,597,1.776,690,1.494,731,1.494,746,3.069,802,1.996,832,1.552,844,1.231,853,1.824,948,1.286,1003,1.933,1042,2.359,1047,1.875,1109,2.359,1184,2.244,1311,3.974,1422,2.067,1600,2.067,1675,2.502,1860,2.149,1957,2.694,1958,2.359,2322,1.996,2323,2.986,2324,2.986,2325,4.742,2326,2.986,2327,2.986,2328,2.986,2329,4.279,2330,2.986,2331,2.986,2332,2.986,2333,2.986,2334,2.986,2335,4.279,2336,2.986,2337,2.986,2338,4.742,2339,4.742,2340,2.986,2341,3.746,2342,2.986,2343,2.986,2344,2.986]],["t/365",[0,0.688,5,1.269,11,1.353,24,1.269,25,1.286,42,2.3,51,2.444,58,1.217,76,3.78,87,2.43,90,1.914,91,1.886,101,2.444,115,1.589,118,1.18,123,1.759,157,2.833,163,1.943,165,2.498,181,2.879,198,1.808,203,2.498,223,1.608,252,3.337,277,2.345,391,5.066,474,4.634,477,1.973,490,2.069,503,4.11,561,5.366,562,3.173,590,3.78,731,3.243,823,3.391,845,2.92,854,4.873,900,3.247,1003,4.196,1093,3.247,1094,3.78,1120,2.755,1150,3.564,1179,3.564,1184,3.391,1306,4.071,1600,3.124,1663,3.564,1675,7.363,1694,3.564,1700,4.071,1991,3.391,2076,4.071,2115,3.391,2322,3.016,2329,4.071,2335,4.071,2345,4.511,2346,4.071,2347,4.511,2348,4.511,2349,4.511,2350,4.511,2351,6.482,2352,4.511,2353,5.849,2354,4.511,2355,4.511]],["t/367",[0,1.346,3,2.293,5,2.011,11,2.145,12,4.952,23,2.026,24,2.011,25,1.75,26,3.718,28,3.513,87,2.681,92,3.266,115,2.519,145,4.051,224,5.147,803,3.451,902,6.453,1111,4.051,1129,5.147,1423,4.368]],["t/369",[0,1.137,11,2.237,16,3.312,17,0.984,24,2.376,25,1.48,26,3.877,28,2.709,33,2.242,35,3.598,36,2.59,37,3.341,42,2.812,78,2.661,115,2.626,129,2.042,143,2.806,181,3.753,187,2.412,200,2.151,214,2.34,218,4.622,282,3.939,319,3.464,329,2.988,477,3.261,513,2.661,695,3.464,702,5.161,801,2.867,824,3.687,840,3.28,863,3.054,946,3.97,1022,3.054,1991,4.146,2128,3.368,2236,4.622]],["t/371",[3,2.537,5,2.225,53,5.696,87,2.967,92,2.929,171,3.408,208,4.287,296,3.408,500,4.59,602,5.479,1991,5.948,2356,7.14]],["t/373",[11,1.985,17,1.648,25,1.314,36,2.029,52,3.087,87,2.482,100,6.051,145,3.75,165,3.666,430,3.938,439,2.89,550,4.765,553,4.765,562,2.769,597,5.495,598,4.168,602,4.584,682,4.977,683,4.765,1073,3.841,2357,5.549,2358,6.621,2359,6.621,2360,5.974,2361,5.974,2362,6.621]],["t/375",[0,1.165,24,2.149,25,1.516,32,2.793,93,3.973,115,2.691,130,3.394,181,3.394,182,3.394,439,2.627,562,3.196,594,5.744,597,4.545,1073,4.433,2289,4.946,2363,6.896]],["t/377",[3,1.872,17,1.872,101,5.223,115,3.395,181,4.281,285,5.734,500,3.388,596,4.614,597,5.734,888,3.78,1196,4.044,2364,8.697,2365,9.263,2366,5.84,2367,4.39,2368,5.84,2369,4.39,2370,5.27]],["t/379",[0,0.867,1,1.647,3,0.602,4,0.774,5,1.419,17,0.335,23,0.742,24,1.746,25,0.843,28,0.923,32,2.429,36,0.99,41,1.216,48,0.876,50,1.147,51,1.018,62,2.091,78,1.559,87,2.131,89,2.029,97,1.064,102,1.18,115,1.138,117,1.018,118,0.491,122,1.227,128,0.923,143,1.564,162,1.616,163,0.809,164,1.117,165,1.04,170,1.147,171,0.809,173,2.325,174,1.064,181,0.834,182,0.834,187,0.822,199,3.826,200,0.733,208,1.75,214,1.803,222,1.18,233,2.552,234,3.647,235,4.362,238,4.018,239,1.064,241,3.516,244,1.352,252,0.714,276,1.04,295,1.18,296,1.391,350,3.047,357,3.493,358,1.352,361,1.412,405,1.973,410,0.958,449,2.596,459,1.679,474,1.973,477,0.822,487,1.18,490,0.862,499,1.09,501,1.352,503,1.75,506,1.117,513,0.906,514,0.958,526,1.216,538,1.575,575,2.707,594,2.428,602,1.301,654,2.237,726,2.237,763,2.091,776,1.695,781,1.412,863,1.04,907,1.575,1014,2.595,1036,1.695,1037,1.301,1041,1.695,1131,1.018,1150,1.484,1207,2.325,1276,1.575,1423,1.147,1453,1.256,1998,1.412,2073,1.412,2231,1.575,2233,1.575,2246,2.552,2264,1.301,2322,1.256,2363,2.915,2371,2.915,2372,1.879,2373,1.879,2374,1.879,2375,8.425,2376,8.425,2377,1.695,2378,1.695,2379,1.695,2380,1.695,2381,1.695,2382,1.484,2383,1.695,2384,1.695,2385,1.695,2386,1.695,2387,1.695,2388,1.695,2389,1.695,2390,1.695,2391,2.915,2392,1.695,2393,1.695,2394,1.695,2395,1.695,2396,1.695,2397,1.695,2398,1.695,2399,1.695,2400,1.695,2401,1.695,2402,1.695,2403,1.695,2404,1.695,2405,1.695,2406,1.695,2407,1.695,2408,1.695,2409,1.695,2410,1.695,2411,1.695,2412,1.695,2413,1.695,2414,1.695,2415,1.695,2416,5.202,2417,1.695,2418,1.695,2419,1.695,2420,1.695,2421,1.695,2422,1.695,2423,1.695,2424,1.695,2425,1.695,2426,2.707,2427,1.695,2428,1.695,2429,1.695,2430,1.695,2431,1.695,2432,1.695,2433,2.915,2434,1.695,2435,1.695,2436,1.695,2437,1.695,2438,1.695,2439,1.695,2440,1.695,2441,1.695,2442,1.695,2443,1.695,2444,1.695,2445,1.695,2446,1.695,2447,1.695,2448,1.695,2449,1.695,2450,3.834,2451,1.695,2452,1.695,2453,1.695,2454,1.695,2455,1.695,2456,1.695,2457,1.695,2458,1.695,2459,1.695,2460,1.695,2461,1.695,2462,1.695,2463,1.879,2464,1.879,2465,1.879,2466,1.879,2467,1.879,2468,1.879,2469,1.412,2470,1.879,2471,1.879]],["t/381",[2,2.165,3,1.387,5,0.749,8,2.718,11,0.799,17,0.475,24,2.084,25,1.789,26,1.385,27,2.25,32,2.299,36,0.817,37,1.053,40,1.674,51,1.444,58,0.719,59,1.263,78,2.088,88,1.183,110,3.25,117,1.444,118,0.697,122,2.628,123,1.039,128,1.309,129,0.986,137,1.674,141,3.653,162,4.207,163,2.709,172,1.098,181,1.922,184,1.309,195,1.444,206,3.115,219,1.585,222,2.718,223,0.95,225,1.068,237,1.585,241,1.509,246,2.51,251,1.725,259,1.725,276,1.475,282,1.242,347,4.797,350,4.135,369,1.444,389,2.233,398,2.233,410,1.358,425,2.105,428,2.574,449,1.114,455,3.742,458,4.528,459,1.385,461,4.729,462,4.072,464,4.317,466,5.136,471,2.105,472,1.845,473,1.674,475,2.574,476,2.718,479,1.688,480,1.845,488,1.674,489,3.115,491,1.674,500,1.546,514,1.358,559,2.206,633,2.344,754,1.918,785,2.105,793,1.845,811,1.585,842,2.233,862,2.451,890,2.105,987,2.997,988,1.845,992,2.404,1047,1.674,1073,1.546,1082,4.579,1124,2.003,1150,2.105,1181,1.918,1198,1.509,1238,1.546,1301,1.546,1429,1.918,1441,2.003,1453,1.781,1518,2.404,1640,2.997,1717,2.233,1759,3.253,1782,2.105,1826,2.233,1955,1.918,2030,3.627,2196,2.404,2286,2.233,2322,4.205,2353,2.404,2469,2.003,2472,2.665,2473,2.404,2474,2.665,2475,2.665,2476,2.665,2477,2.665,2478,2.665,2479,3.905,2480,2.404,2481,2.665,2482,2.665,2483,2.665,2484,2.665,2485,2.665,2486,2.665,2487,2.665,2488,2.665,2489,2.665,2490,2.665,2491,2.665]],["t/383",[0,0.577,11,0.85,17,0.288,24,1.065,25,1.131,33,1.152,42,0.824,58,1.021,62,1.835,66,1.015,69,1.355,72,3.15,87,1.706,88,0.718,91,0.676,103,0.962,118,0.423,122,1.077,123,1.106,124,1.459,127,1.081,128,1.392,133,1.164,146,2.378,161,0.987,162,0.809,163,1.221,170,0.987,181,0.718,192,0.876,195,1.536,198,1.136,199,3.759,200,1.106,203,2.096,216,1.344,222,1.015,233,2.991,234,4.527,235,5.456,238,5.56,239,1.606,241,4.717,244,1.164,247,1.221,256,1.459,266,1.081,299,0.657,350,4.088,378,0.78,410,0.824,428,0.962,449,3.593,451,1.781,452,1.606,456,0.938,466,2.312,479,0.631,490,0.741,493,1.215,503,2.051,506,1.686,552,6.459,561,0.987,624,1.015,654,1.963,726,1.963,771,0.987,778,1.081,803,0.78,844,0.666,862,0.916,878,2.131,879,1.164,889,1.277,892,0.987,959,2.851,973,3.725,987,1.963,1020,2.622,1156,1.355,1207,3.725,1309,2.24,1453,3.041,1542,2.376,1616,1.355,1738,1.459,1793,1.459,2021,1.277,2053,1.459,2246,2.24,2416,6.559,2426,4.338,2492,1.617,2493,1.617,2494,1.459,2495,8.176,2496,1.617,2497,1.617,2498,2.835,2499,2.835,2500,2.835,2501,2.835,2502,2.835,2503,1.617,2504,1.617,2505,2.835,2506,1.617,2507,2.835,2508,1.617,2509,1.617,2510,2.835,2511,2.835,2512,2.835,2513,2.835,2514,2.835,2515,1.617,2516,1.617,2517,1.617,2518,1.617,2519,1.617,2520,1.617,2521,1.617,2522,1.617,2523,1.617,2524,1.617,2525,1.617,2526,1.617,2527,1.617,2528,1.617,2529,1.617,2530,1.617,2531,1.617,2532,1.617,2533,1.617,2534,1.617,2535,1.617,2536,1.617,2537,1.617,2538,1.617,2539,1.617,2540,1.617,2541,1.617,2542,1.617,2543,1.617,2544,1.617,2545,1.617,2546,1.617,2547,1.617,2548,5.698,2549,2.376,2550,1.617,2551,1.617,2552,1.617,2553,1.617,2554,1.617,2555,1.617,2556,1.617,2557,2.835,2558,2.835,2559,2.835,2560,1.617,2561,1.617,2562,1.617,2563,1.617,2564,1.617,2565,1.617,2566,1.617,2567,1.617,2568,1.617,2569,1.617,2570,1.617,2571,1.617,2572,1.617,2573,2.835,2574,1.617,2575,1.617,2576,1.617,2577,1.617,2578,1.617,2579,1.617,2580,1.617,2581,1.617]],["t/385",[23,2.109,24,2.149,25,1.822,143,2.369,147,4.946,174,5.203,176,4.14,223,2.724,225,3.063,378,3.687,379,4.054,1668,5.291,2221,6.404]],["t/387",[0,0.353,3,0.741,4,0.953,17,0.412,26,2.002,33,0.94,36,0.709,49,1.412,56,0.867,58,1.335,66,1.452,88,1.027,115,1.356,119,1.452,129,1.426,143,1.534,145,4.158,147,3.203,153,1.738,154,1.738,155,1.738,156,1.827,157,1.452,163,0.996,164,2.291,166,4.439,167,1.664,168,4.56,171,1.659,174,3.269,175,2.574,178,1.157,185,1.31,195,1.253,199,2.011,208,3.127,213,1.341,214,3.588,216,3.282,225,0.927,228,1.341,234,1.202,239,1.31,252,0.878,258,1.601,262,2.574,266,1.546,267,1.664,268,5.703,313,1.452,319,1.452,322,2.523,327,3.427,367,1.179,385,4.237,428,1.375,429,1.116,430,5.549,431,1.116,432,1.738,433,1.497,434,1.202,435,1.738,436,1.664,437,1.738,438,1.738,439,2.523,440,1.546,441,1.546,442,1.738,443,1.227,444,1.664,445,1.546,446,1.738,447,1.601,448,3.427,449,2.681,450,1.738,451,3.625,452,2.181,453,1.341,459,2.573,481,3.427,492,1.938,493,1.738,494,1.938,495,1.601,503,3.977,506,3.433,508,2.772,509,1.664,510,4.154,511,2.086,512,2.895,513,1.858,514,1.963,515,2.291,516,1.738,517,1.738,518,1.738,519,1.738,520,1.738,521,2.895,522,1.601,523,1.412,524,1.546,526,3.203,554,2.691,624,3.109,625,1.827,626,4.982,627,1.738,629,1.827,638,1.827,639,1.827,640,4.338,641,1.938,645,1.827,646,3.91,647,1.827,649,1.938,661,1.827,663,1.827,664,1.664,2188,1.938,2582,2.312]],["t/390",[0,1.136,11,2.234,14,4.22,16,3.309,23,1.711,36,2.284,42,3.798,58,2.01,189,5.886,341,3.798,411,4.68,456,4.322,463,4.822,1111,4.22,1714,4.68,2583,7.45,2584,6.723,2585,7.45,2586,7.45]],["t/392",[0,1.353,8,3.301,12,3.639,13,2.788,15,4.906,16,2.334,17,1.287,18,2.91,19,2.371,23,1.892,35,2.536,36,1.611,48,2.45,59,2.492,103,3.126,127,3.513,182,2.334,199,2.933,289,5.707,294,2.298,319,3.301,341,2.679,381,3.126,453,3.049,477,2.298,513,2.536,695,3.301,764,3.783,803,2.536,808,3.783,810,4.671,814,5.424,816,3.639,840,3.126,906,3.401,929,4.152,1064,4.152,1194,5.707,1714,3.301,1741,4.404,2260,6.512,2587,5.255,2588,4.742,2589,3.95,2590,5.255,2591,7.216]],["t/395",[0,1.087,2,2.583,16,3.911,17,1.571,23,1.637,25,1.62,52,2.407,58,1.393,59,3.872,129,2.639,130,2.294,187,3.118,199,2.099,214,3.465,341,4.871,355,7.549,391,4.354,411,3.244,453,2.996,463,3.342,609,3.717,690,2.583,774,2.583,782,6.138,844,2.129,863,3.948,948,2.224,959,3.567,1022,3.948,1623,3.882,1668,3.576,1763,4.66,2592,8.806,2593,5.164,2594,5.164,2595,5.164,2596,5.164]],["t/397",[0,1.156,13,4.02,33,3.079,103,4.507,429,3.656,759,3.365,816,5.246,864,5.986,1075,5.454,1548,6.87,1551,4.627,1714,4.759,2589,6.87,2597,7.577,2598,7.577]],["t/399",[0,1.196,11,2.352,16,4.144,22,5.243,23,1.801,36,2.404,121,3.852,140,3.719,271,5.077,386,5.431,428,4.665,774,3.924]],["t/401",[13,5.166,23,1.937,140,4.001,774,4.221]],["t/403",[0,1.43,17,1.411,36,2.426,137,4.97,198,3.172,200,3.086,243,5.696,443,4.198,477,3.46,764,5.696,906,5.122]],["t/405",[11,2.062,13,3.648,16,3.824,23,1.579,25,1.364,36,2.108,48,3.206,92,2.545,140,4.082,304,4.319,316,3.725,431,3.318,472,4.761,774,3.44,778,4.597,787,6.205,1022,3.807,1174,4.319,1552,6.205,2300,5.762,2599,6.876,2600,8.609,2601,6.876,2602,6.876,2603,6.876,2604,6.876]],["t/407",[2,3.494,13,3.705,14,3.956,15,3.369,16,4.204,17,1.551,26,3.631,59,3.311,163,3.008,206,5.027,292,4.154,329,4.71,719,4.265,771,4.265,932,4.52,957,5.249,1373,5.517,1429,5.027,1640,4.836,2469,5.249,2605,6.983,2606,6.983,2607,6.983]],["t/409",[0,1.264,4,2.67,5,2.571,15,3.125,18,3.586,19,2.922,26,3.367,28,3.181,36,1.985,58,2.6,87,3.108,115,2.281,130,2.876,187,2.832,217,3.852,309,4.068,385,2.748,426,5.428,524,4.33,948,2.79,969,5.428,1022,3.586,1105,3.955,1151,4.192,1171,4.484,1692,5.117,1784,4.192,2025,5.844,2608,6.476,2609,6.476]],["t/411",[0,1.01,1,3.375,5,1.862,8,4.159,9,4.285,17,1.181,19,2.987,23,1.52,46,5.231,48,3.087,50,4.044,87,2.482,92,2.451,101,3.587,103,3.938,105,5.231,106,4.765,107,5.231,108,5.549,109,4.584,110,3.938,111,5.974,112,5.549,115,2.961,143,2.052,270,3.841,320,4.584,336,3.139,348,4.584,453,3.841,803,3.194,2610,6.621,2611,6.621]],["t/413",[15,3.784,17,1.399,18,5.166,19,3.539,25,1.556,131,4.79,243,5.645,679,5.243,803,4.502,1011,7.078,1323,5.896]],["t/415",[0,1.041,5,2.41,12,4.725,25,1.354,58,1.84,104,4.286,129,3.172,130,3.03,176,4.642,390,5.129,496,4.416,504,5.571,547,4.059,631,5.129,632,5.728,634,6.441,771,4.167,1343,6.157,2202,5.718,2612,6.823,2613,6.823,2614,6.823,2615,6.157]],["t/417",[0,1.218,5,2.245,24,2.245,25,1.584,35,3.852,37,3.156,96,3.921,115,2.812,118,2.088,122,3.033,504,4.749]],["t/419",[5,1.358,17,1.405,25,0.958,32,1.765,37,1.909,52,2.251,53,3.475,56,1.81,97,2.735,117,2.616,118,1.263,123,1.883,127,3.228,129,2.916,167,3.475,171,2.08,176,4.885,178,3.404,181,3.022,198,3.157,206,3.475,246,2.801,252,2.992,296,2.08,322,3.469,347,3.125,377,3.815,455,4.047,490,2.214,496,4.404,498,3.125,503,2.616,504,4.047,509,3.475,526,4.404,554,2.251,559,2.462,562,2.019,630,5.375,632,5.718,634,3.63,732,3.475,771,4.155,850,3.63,862,2.735,1023,3.63,1049,4.047,1069,3.343,1301,2.801,1397,4.897,1601,3.63,1743,3.63,1755,3.63,1827,3.475,2615,4.357,2616,4.828,2617,4.828,2618,4.828,2619,4.828]],["t/421",[5,1.687,17,1.07,23,1.377,25,1.19,66,3.767,117,3.249,129,2.919,176,3.249,181,2.664,186,3.118,192,3.249,214,2.545,221,5.461,222,3.767,247,2.583,252,3.347,259,3.882,496,3.882,504,3.567,513,2.894,522,4.153,523,3.663,559,3.058,583,4.508,589,3.767,631,4.508,632,4.009,635,6.231,636,6.101,637,4.738,1003,3.882,1312,5.412,1397,5.676,1453,5.272,1527,5.412,1663,4.738,2620,7.886,2621,5.412]],["t/423",[0,0.972,3,2.488,4,2.149,5,2.018,11,1.563,12,2.333,15,2.515,17,1.28,18,2.886,19,1.52,23,0.774,25,1.265,26,1.752,28,1.655,29,2.058,33,2.119,40,2.116,51,1.825,53,4.589,56,1.263,58,2.308,59,1.598,87,2.391,102,5.155,110,2.004,112,2.824,118,0.881,122,1.28,126,1.686,131,5.543,172,1.389,178,1.686,182,1.496,198,2.089,199,1.369,208,1.825,225,1.35,289,2.333,329,1.825,342,2.004,381,3.101,388,1.954,434,1.752,449,1.409,459,3.315,500,1.954,501,2.425,514,1.718,523,2.058,567,2.824,719,2.058,746,2.181,771,2.058,782,2.533,801,1.752,803,3.076,816,2.333,853,3.184,888,2.181,898,2.252,928,2.662,932,2.181,948,1.451,1111,1.908,1154,2.181,1196,2.333,1323,2.533,1327,3.024,1657,3.04,1707,3.04,1714,2.116,1877,2.824,1881,4.118,1980,3.374,2011,3.04,2210,2.662,2367,2.533,2369,2.533,2469,2.533,2589,2.533,2622,3.918,2623,3.369,2624,3.369,2625,4.118,2626,3.369,2627,3.369,2628,3.369,2629,3.04,2630,3.369,2631,3.04,2632,3.369,2633,3.369,2634,3.369,2635,2.824,2636,4.118,2637,3.04,2638,3.04,2639,3.04,2640,4.704,2641,2.824,2642,3.04,2643,4.704,2644,3.04,2645,3.04,2646,3.369,2647,3.04]],["t/425",[0,1.429,9,5.546,44,3.181,50,5.721,51,4.642,58,1.84,109,4.725,411,5.382,453,3.958,459,4.87,490,3.129,598,3.079,654,4.725,948,2.939,2073,5.129,2227,7.732,2648,6.823,2649,6.823,2650,7.732]],["t/427",[0,0.879,3,1.848,9,3.731,11,1.729,15,2.781,16,2.56,23,2.116,25,1.144,28,3.773,32,2.107,33,3.122,50,3.521,58,1.555,89,3.621,92,2.134,97,4.352,100,4.149,118,1.508,122,2.918,131,3.521,459,3.994,567,3.123,782,4.333,827,3.992,888,3.731,1113,6.07,1418,5.202,1423,3.521,1644,6.439,1853,5.202,1956,4.333,1980,3.731,1988,4.831,2055,4.831,2195,4.554,2622,4.333,2629,5.202,2635,6.439,2651,5.765,2652,5.765,2653,5.765,2654,5.765,2655,5.765]],["t/429",[16,3.88,17,1.255,26,3.659,28,4.291,32,2.573,45,2.783,59,3.338,131,4.299,459,3.659,803,4.215,962,6.351,1061,5.066,1131,4.733,1167,4.299,1830,5.291,2346,6.351,2641,5.899,2656,7.039,2657,7.039,2658,6.351,2659,5.899,2660,7.039]],["t/431",[57,4.046,58,1.452,59,2.552,60,4.511,61,6.619,62,4.748,63,4.857,64,6.619,65,6.619,66,3.381,67,4.857,68,4.857,69,4.511,70,4.857,71,3.287,72,3.727,73,7.51,74,6.147,75,4.511,76,4.511,77,4.857,78,4.026,79,5.401,80,6.592,81,4.857,82,4.511,83,6.147,84,6.619,85,6.619,86,6.619,91,2.251,106,3.874,199,2.187,222,3.381,279,3.727,473,3.381,855,4.252,862,3.049,892,3.287,1003,3.484,1037,3.727,1393,4.511,2622,4.046,2661,5.382,2662,5.382,2663,4.857,2664,4.511]],["t/434",[0,0.824,2,1.766,15,4.439,16,3.713,18,2.991,21,2.444,23,1.507,33,2.196,35,1.703,36,1.082,45,1.395,58,2.532,92,1.306,93,2.809,97,1.999,102,2.217,103,3.213,121,1.733,125,1.733,176,1.912,182,1.567,184,1.733,185,1.999,189,4.268,191,2.155,200,1.377,223,1.258,336,3.487,443,1.872,459,2.809,479,1.377,500,3.134,723,2.217,802,2.359,840,3.213,869,3.185,874,2.958,973,2.54,1075,2.54,1149,2.54,1167,2.155,1194,2.444,1206,2.788,1327,2.047,1362,4.527,1379,4.268,1433,4.981,1434,6.285,1532,3.185,1548,4.934,1551,2.155,1610,2.788,1710,2.099,1714,2.217,1734,2.958,1743,2.653,1764,3.185,2086,3.185,2128,2.155,2584,3.185,2589,2.653,2622,4.061,2665,3.529,2666,5.402,2667,3.529,2668,3.529,2669,3.529,2670,3.529,2671,3.529,2672,3.529,2673,3.529,2674,3.529,2675,3.529,2676,5.402,2677,3.529,2678,3.185,2679,3.529,2680,3.529,2681,3.529,2682,3.529,2683,3.529,2684,3.529,2685,3.529,2686,3.529,2687,3.529,2688,2.284,2689,5.402,2690,3.529,2691,3.529,2692,5.402,2693,3.529,2694,3.529,2695,3.529]],["t/437",[0,1.438,18,5.221,19,3.602,92,2.955,281,5.015,439,2.745,475,4.749,1014,4.876,1551,4.876]],["t/439",[0,0.868,5,1.601,21,3.941,53,4.096,58,2.473,87,2.134,92,2.107,100,4.096,145,3.224,171,2.451,191,4.652,208,4.127,217,3.385,244,4.096,296,2.451,325,4.77,500,3.301,514,2.902,550,4.096,594,5.726,595,6.018,596,6.018,597,5.453,598,2.568,601,5.482,602,3.941,605,3.575,683,4.096,741,3.941,759,2.528,874,4.77,1127,4.77,1327,3.301,1379,4.496,1430,4.496,1744,4.496,2356,6.873,2357,4.77,2360,5.136,2361,5.136,2469,4.278,2696,5.691,2697,5.691]],["t/441",[23,1.629,58,1.914,115,2.498,118,1.856,143,2.199,439,2.439,601,5.107,683,5.107,768,3.928,844,3.619,1059,5.605,1073,4.116,1168,5.605,1464,4.456,1710,4.22,1983,5.107,2097,6.402,2357,5.946,2688,4.592,2698,8.779,2699,5.333,2700,4.743,2701,4.592]],["t/443",[3,2.323,21,3.66,23,1.898,42,2.695,58,1.426,92,1.957,115,2.911,118,2.326,129,3.06,143,1.639,177,2.864,182,2.348,214,2.243,225,2.119,247,2.277,335,3.534,410,2.695,443,2.804,449,2.211,514,2.695,545,5.724,546,5.215,549,5.017,554,4.344,603,4.176,686,3.321,690,3.625,694,4.43,713,4.551,768,2.927,1073,3.067,1096,4.176,1168,5.724,1397,3.805,1464,3.321,1710,3.144,1993,3.974,2189,5.527,2688,3.422,2700,3.534,2701,3.422,2702,4.77,2703,4.77,2704,4.77,2705,5.286]],["t/445",[1,2.795,11,1.644,17,1.325,23,1.705,37,2.167,42,3.786,57,4.12,58,1.479,115,1.93,118,1.942,129,3.118,177,2.97,199,2.228,225,2.197,237,3.26,247,2.361,261,4.965,276,3.035,449,2.292,499,3.18,549,3.795,576,3.443,713,5.291,768,3.035,1073,3.18,1108,4.946,1464,3.443,1609,4.594,1710,3.26,1961,4.946,1980,3.548,2128,3.348,2189,5.631,2635,6.224,2688,3.548,2700,3.664,2701,3.548,2706,5.481,2707,5.481,2708,5.481,2709,5.481,2710,7.427,2711,7.427,2712,5.481,2713,5.481,2714,5.481,2715,5.481,2716,5.481]],["t/447",[5,2.044,17,1.589,19,3.279,34,5.742,36,2.228,78,3.507,92,2.69,115,2.56,143,2.762,160,5.033,184,3.57,261,4.859,410,3.706,439,3.063,948,3.131,1865,6.091,2717,7.468,2718,6.091]],["t/449",[1,3.83,17,1.622,27,3.906,28,3.69,56,2.817,143,2.329,171,3.236,177,4.07,184,3.69,434,3.906,439,2.583,803,3.625,976,4.719,2699,5.647,2719,7.513,2720,7.62]],["t/451",[17,1.492,37,2.598,42,3.351,117,3.56,118,1.719,171,2.831,177,4.533,187,2.874,199,2.671,223,2.343,237,3.909,282,3.064,285,3.909,439,2.259,443,3.486,455,3.909,498,4.254,576,4.128,713,4.128,863,3.639,976,4.128,1059,5.192,1623,4.94,2189,4.393,2223,6.92,2678,5.93,2721,5.93,2722,6.572,2723,6.572,2724,6.572,2725,6.572]],["t/453",[0,1.357,15,2.953,17,1.683,18,3.389,19,2.762,56,2.997,58,1.651,59,2.902,214,2.597,341,4.537,422,4.092,439,2.104,514,3.121,702,3.738,719,3.738,811,3.641,816,5.534,844,2.523,959,3.062,1021,4.238,1064,6.314,1166,4.836,1194,4.238,1714,5.59,1983,5.753,2588,5.523,2589,4.601,2726,6.121,2727,6.121,2728,6.121,2729,6.121,2730,6.121]],["t/455",[0,0.628,2,3.033,8,2.585,17,1.284,24,1.705,25,0.816,29,2.513,34,3.251,37,1.627,52,2.827,58,1.11,59,2.875,88,1.828,90,1.746,94,2.331,110,2.448,117,3.285,122,2.735,141,2.751,143,1.276,161,3.703,163,2.612,182,2.693,199,1.673,214,1.746,223,1.467,225,1.649,237,2.448,241,2.331,246,4.176,282,2.827,347,5.141,348,2.85,350,4.201,398,3.449,428,2.448,449,1.721,455,3.607,458,2.962,461,3.094,462,2.664,463,3.925,466,5.861,475,2.448,491,2.585,513,1.986,554,1.919,577,2.664,605,2.585,688,2.513,768,2.279,923,2.85,1021,4.198,1073,2.387,1187,2.387,1198,4.078,1327,2.387,1453,2.751,1464,2.585,1640,2.85,1668,2.85,1710,2.448,1736,3.094,1759,3.094,1881,3.251,1983,2.962,1991,3.094,1993,3.094,2030,5.082,2043,3.449,2128,2.513,2289,2.664,2473,3.714,2479,3.714,2688,2.664,2700,2.751,2701,2.664,2731,4.115]],["t/457",[0,0.788,3,1.655,5,2.477,11,2.138,17,0.921,35,4.725,36,3.002,37,2.042,42,3.635,52,2.407,58,1.393,93,2.685,101,2.798,115,1.819,129,1.911,186,2.685,199,2.099,214,2.191,224,3.717,237,3.072,261,5.459,411,4.478,439,1.775,443,2.74,576,3.244,605,3.244,643,4.615,679,4.766,702,3.154,768,2.859,793,3.576,803,2.492,849,4.937,888,3.342,892,3.154,923,3.576,1073,2.996,1196,3.576,1464,3.244,1710,3.072,2023,4.66,2128,3.154,2367,3.882,2369,3.882,2370,4.66,2688,3.342,2700,3.452,2701,3.342,2732,4.66]],["t/459",[23,1.884,37,3.243,42,4.183,118,2.146,199,3.334,237,4.88,1149,5.905,1623,6.167]],["t/461",[0,0.915,17,1.07,18,4.367,23,1.377,52,2.796,58,1.618,90,2.545,118,2.063,185,3.397,186,4.1,187,2.623,199,2.437,294,3.853,390,4.508,429,2.894,439,3.029,459,3.118,479,2.339,693,4.508,736,6.101,737,5.676,759,2.664,765,4.738,768,3.321,863,3.321,1073,3.479,1464,3.767,1551,3.663,1710,3.567,2128,3.663,2341,4.738,2688,5.104,2699,4.508,2700,4.009,2701,3.882,2733,6.609]],["t/463",[0,1.304,11,1.263,17,1.525,18,2.333,19,1.901,35,2.033,36,2.738,42,3.145,118,1.613,121,2.069,131,2.573,177,2.282,182,2.74,191,3.767,195,2.282,199,2.507,200,1.643,229,2.506,237,2.506,247,2.657,292,2.506,329,2.282,429,4.125,439,3.172,459,2.19,475,2.506,562,2.579,576,2.646,598,2.783,633,2.282,731,4.277,803,2.033,873,5.765,1021,2.917,1167,2.573,1174,2.646,1181,3.032,1327,2.444,1430,3.328,1433,3.272,1554,3.53,1784,2.727,1811,3.53,1980,2.727,2341,4.873,2636,3.328,2718,5.169,2734,3.801,2735,3.801,2736,8.549,2737,3.801,2738,3.032,2739,4.213,2740,4.213,2741,3.801,2742,5.566,2743,3.801,2744,3.801,2745,3.801,2746,3.801,2747,5.566,2748,3.801,2749,4.873,2750,3.801]],["t/465",[0,1.182,5,0.736,11,0.785,17,1.223,18,2.989,19,1.925,23,0.979,35,1.263,36,2.253,37,1.686,42,2.175,52,1.22,58,0.706,66,1.644,88,2.398,90,1.111,92,0.969,94,1.483,117,1.418,118,2.3,121,2.095,128,1.286,129,2.721,177,1.418,182,2.398,184,1.286,185,1.483,186,2.218,187,1.145,191,2.605,195,1.418,199,1.734,200,1.021,205,1.361,223,1.924,225,1.049,229,2.537,237,1.557,247,2.325,281,1.644,292,1.557,294,2.361,360,1.418,381,1.557,414,3.37,429,4.146,439,2.954,459,1.361,475,1.557,479,1.021,562,1.095,576,1.644,598,1.925,605,1.644,693,1.968,731,4.299,736,5.787,737,4.934,759,3.044,765,2.068,768,1.449,803,2.058,873,4.265,892,1.599,1073,1.519,1167,1.599,1174,1.644,1181,1.884,1327,3.131,1422,1.813,1430,2.068,1433,3.302,1464,1.644,1551,2.605,1554,2.194,1556,2.194,1668,1.813,1710,1.557,1784,2.761,1811,3.575,1980,1.694,2128,2.605,2341,4.265,2549,2.194,2636,2.068,2688,2.761,2699,1.968,2700,1.75,2701,1.694,2718,3.575,2733,3.575,2734,2.362,2735,2.362,2737,2.362,2738,1.884,2741,2.362,2742,3.849,2743,2.362,2744,2.362,2745,2.362,2746,2.362,2747,3.849,2748,2.362,2749,3.37,2750,2.362,2751,2.194,2752,5.398,2753,4.265,2754,4.265,2755,3.849,2756,6.854,2757,2.194,2758,2.618,2759,2.618,2760,2.362]],["t/467",[0,0.616,1,2.06,17,1.404,18,2.237,19,1.823,23,1.374,28,2.938,37,1.598,42,2.06,56,2.243,58,1.09,98,3.646,115,1.423,118,1.565,143,1.252,165,2.237,177,3.241,181,1.795,182,1.795,186,2.101,199,1.642,214,1.715,216,2.837,223,2.133,237,2.404,239,4.761,329,2.189,410,2.06,434,2.101,439,2.056,459,2.101,491,2.538,514,2.06,562,3.292,576,2.538,589,2.538,598,3.214,605,2.538,643,2.615,682,3.038,702,3.654,759,1.795,768,2.237,803,2.886,901,3.646,904,3.387,994,3.192,1014,3.654,1059,3.192,1073,2.344,1092,3.192,1173,2.538,1327,2.344,1464,2.538,1710,2.404,1784,2.615,1983,2.909,2128,2.468,2186,7.941,2636,3.192,2688,2.615,2699,4.497,2700,2.701,2701,2.615,2717,3.387,2720,5.013,2751,3.387,2755,3.646,2760,3.646,2761,7.029,2762,3.646,2763,4.041,2764,4.041,2765,3.646,2766,4.041,2767,4.041,2768,4.041,2769,7.873,2770,4.041,2771,4.041]],["t/469",[0,1.115,3,0.829,5,2.559,11,0.776,17,1.304,18,4.047,19,2.789,23,1.23,24,1.916,25,1.352,26,3.8,32,0.946,36,1.895,58,0.698,59,1.227,87,2.741,88,2.378,94,1.466,115,0.911,116,3.033,118,2.292,121,2.075,129,2.288,130,1.149,143,2.266,145,3.033,157,4.591,170,1.58,182,1.149,199,1.052,223,1.506,247,1.114,252,2.777,281,1.625,294,3.64,320,2.926,431,2.039,433,3.466,434,4.182,444,1.862,477,1.131,479,1.009,508,1.862,514,1.319,561,1.58,562,1.082,713,1.625,731,3.408,759,1.877,763,2.735,803,1.248,872,2.335,888,1.675,904,2.168,972,2.044,1131,2.289,1154,4.731,1196,2.926,1198,1.466,1259,2.168,1551,1.58,1623,1.945,1668,2.926,1754,3.813,1756,7.174,1784,4.992,2189,1.73,2367,3.176,2369,3.176,2549,2.168,2631,2.335,2761,1.945,2772,8.044,2773,6.596,2774,6.596,2775,2.335,2776,2.587,2777,2.587,2778,2.335,2779,4.832,2780,2.335,2781,2.587,2782,2.587,2783,2.335,2784,2.587]],["t/471",[0,0.812,5,1.729,15,2.568,17,1.43,19,1.893,23,1.764,24,1.18,25,0.832,33,1.042,36,1.632,37,3.644,40,1.611,52,1.196,58,2.162,87,0.962,88,1.139,90,1.088,92,1.97,115,1.875,116,2.376,117,2.273,118,1.608,122,2.576,129,1.553,130,1.139,141,1.715,143,2.102,145,3.483,157,1.611,164,2.495,171,1.105,177,2.884,205,1.333,214,1.78,219,1.526,223,1.496,237,2.495,247,1.105,252,0.974,274,1.526,281,3.344,283,2.026,294,1.122,299,2.499,319,1.611,336,1.216,429,2.024,434,2.181,439,1.83,453,1.488,455,2.495,460,1.526,499,2.434,528,2.026,548,2.805,561,1.567,589,1.611,593,2.026,605,2.635,609,1.846,633,2.273,643,1.66,695,1.611,702,1.567,713,1.611,731,1.283,793,2.905,797,3.02,803,2.024,836,1.66,862,1.453,936,3.154,955,2.15,970,1.776,976,1.611,991,2.026,1014,1.567,1022,2.947,1040,2.026,1061,3.02,1069,1.776,1115,2.15,1154,1.66,1180,2.026,1194,2.905,1196,1.776,1317,1.66,1391,1.846,1423,1.567,1433,1.361,1680,1.928,1721,2.315,1736,3.154,1756,2.15,2189,1.715,2200,2.315,2223,1.928,2367,1.928,2369,1.928,2659,2.15,2664,2.15,2701,1.66,2717,4.461,2720,3.516,2721,2.315,2732,2.315,2733,2.15,2761,1.928,2765,2.315,2773,2.315,2774,2.315,2775,2.315,2778,4.803,2779,3.786,2780,2.315,2783,4.803,2785,2.565,2786,2.565,2787,2.565,2788,2.565,2789,2.565,2790,2.565,2791,2.565,2792,8.297,2793,2.565,2794,2.565,2795,2.565,2796,2.565,2797,2.565,2798,2.565,2799,4.195,2800,2.565,2801,2.565,2802,2.565,2803,2.565]],["t/473",[15,4.409,17,1.351,36,2.323,91,3.169,185,5.177,294,3.997,431,3.656,687,6.87,1020,5.246,1346,5.695,1433,4.02,2804,7.577,2805,7.577]],["t/475",[11,2.265,15,4.401,17,1.347,36,1.723,91,3.158,181,3.354,216,3.581,228,3.26,294,4.286,431,4.116,443,4.007,460,3.343,463,3.637,489,4.045,490,2.577,503,5.514,523,3.432,875,5.967,1020,5.23,1092,4.44,1171,5.23,1173,3.53,1433,4.526,1717,4.709,1744,5.967,2806,5.619,2807,5.619,2808,6.815]],["t/477",[0,0.372,5,1.132,23,0.56,24,1.132,25,0.484,32,2.413,62,2.605,87,1.509,118,0.638,122,0.926,162,2.014,170,1.489,171,1.05,174,1.381,199,4.002,200,0.951,229,1.451,233,1.927,234,3.908,235,4.845,238,4.599,239,1.381,241,4.025,276,1.35,295,1.532,296,1.05,350,3.259,357,4.13,358,1.755,405,2.458,449,2.972,459,2.092,474,2.458,499,1.415,501,1.755,506,1.451,526,1.578,654,2.787,726,2.787,763,2.605,988,1.689,1131,1.321,1207,2.897,1276,2.044,1453,1.63,2231,2.044,2233,2.044,2246,3.18,2264,1.689,2322,1.63,2375,8.886,2376,8.886,2377,2.201,2378,2.201,2379,2.201,2380,2.201,2381,2.201,2382,1.927,2383,2.201,2384,2.201,2385,2.201,2386,2.201,2387,2.201,2388,2.201,2389,2.201,2390,2.201,2391,3.632,2392,2.201,2393,2.201,2394,2.201,2395,2.201,2396,2.201,2397,2.201,2398,2.201,2399,2.201,2400,2.201,2401,2.201,2402,2.201,2403,2.201,2404,2.201,2405,2.201,2406,2.201,2407,2.201,2408,2.201,2409,2.201,2410,2.201,2411,2.201,2412,2.201,2413,2.201,2414,2.201,2415,2.201,2416,5.955,2417,2.201,2418,2.201,2419,2.201,2420,2.201,2421,2.201,2422,2.201,2423,2.201,2424,2.201,2425,2.201,2426,3.373,2427,2.201,2428,2.201,2429,2.201,2430,2.201,2431,2.201,2432,2.201,2433,3.632,2434,2.201,2435,2.201,2436,2.201,2437,2.201,2438,2.201,2439,2.201,2440,2.201,2441,2.201,2442,2.201,2443,2.201,2444,2.201,2445,2.201,2446,2.201,2447,2.201,2448,2.201,2449,2.201,2450,4.637,2451,2.201,2452,2.201,2453,2.201,2454,2.201,2455,2.201,2456,2.201,2457,2.201,2458,2.201,2459,2.201,2460,2.201,2461,2.201,2462,2.201]],["t/479",[0,0.755,5,0.887,15,1.522,18,1.747,19,1.423,23,1.137,24,2.349,25,1.584,33,1.282,36,0.967,37,1.247,87,1.183,88,2.2,91,1.319,118,2.466,130,1.401,161,1.927,163,2.133,171,2.633,182,1.401,199,4.048,200,1.932,203,1.747,229,1.876,247,1.359,250,2.492,285,1.876,310,1.927,350,1.447,434,1.64,460,1.876,469,2.184,474,1.927,479,1.23,503,3.312,513,1.522,562,1.319,725,3.311,731,2.478,737,2.271,763,2.042,844,1.3,988,2.184,1061,2.271,1093,2.271,1198,2.805,1304,3.565,1305,4.15,1433,1.674,2126,2.847,2322,2.109,2382,2.492,2809,4.952,2810,8.913,2811,8.913,2812,2.847,2813,2.847,2814,2.847,2815,2.847,2816,2.847,2817,2.847,2818,2.847,2819,2.847,2820,4.469,2821,2.847,2822,5.517,2823,2.847,2824,2.847,2825,2.847,2826,2.847,2827,2.847,2828,2.847,2829,4.469,2830,2.847,2831,2.847,2832,2.847,2833,2.847,2834,2.847,2835,2.847,2836,5.517,2837,2.847,2838,2.847,2839,2.847,2840,2.847,2841,2.847,2842,2.847,2843,2.847,2844,2.847,2845,4.469,2846,2.847,2847,2.847,2848,3.155]],["t/481",[15,4.426,17,1.164,23,1.498,36,2,88,2.897,123,2.544,182,2.897,185,3.695,203,4.611,223,2.326,261,4.361,279,4.517,294,4.539,431,4.663,858,6.603,1107,5.887,1174,4.098,1238,3.784,1403,5.467,1433,4.418,2749,5.154]],["t/484",[0,0.717,3,1.507,9,3.043,11,1.41,23,1.079,25,0.933,48,2.192,50,2.871,51,2.547,58,2.094,78,2.268,79,5.47,80,5.274,90,1.995,91,3.247,176,2.547,229,2.796,251,3.043,314,3.534,350,2.156,411,2.953,484,3.255,488,2.953,490,2.156,501,3.384,513,2.268,554,2.192,598,2.121,768,2.603,840,2.796,855,3.714,862,2.663,948,2.025,1022,2.603,1207,3.384,1229,3.534,1297,4.242,1327,2.727,1393,5.595,1423,2.871,1433,4.118,1436,3.384,1536,3.143,1604,3.714,1856,4.242,2480,6.024,2622,3.534,2650,4.242,2663,4.242,2664,3.94,2849,4.701,2850,6.676,2851,4.701,2852,4.701,2853,6.676,2854,4.701,2855,6.676,2856,6.676,2857,6.676,2858,7.763,2859,7.763,2860,7.763,2861,4.701,2862,4.701,2863,4.701,2864,4.701]],["t/486",[0,0.841,5,1.551,15,4.367,17,1.507,18,4.129,19,3.365,23,1.266,36,2.59,90,2.34,91,2.306,146,4.684,185,4.224,203,4.129,294,4.582,336,2.615,360,2.988,431,4.808,858,6.515,880,3.687,1174,4.684,1194,5.164,1270,5.892,1433,3.956,1784,3.57,2749,5.892]],["t/488",[17,1.213,78,2.33,118,1.263,122,1.834,126,3.404,131,2.949,171,2.08,198,3.749,204,3.767,252,1.834,255,4.357,272,4.047,321,3.475,462,3.125,473,3.033,479,1.883,490,2.214,493,3.63,559,2.462,690,2.416,746,3.125,841,4.357,932,4.404,1049,4.047,1151,3.125,1178,4.357,1422,3.343,1958,3.815,2074,4.357,2128,4.155,2494,6.139,2637,4.357,2638,4.357,2639,4.357,2640,7.718,2641,4.047,2642,6.139,2643,8.136,2644,4.357,2645,6.139,2647,4.357,2865,4.828,2866,4.828,2867,4.828,2868,7.877,2869,4.828,2870,4.828,2871,4.828,2872,4.828,2873,4.828,2874,4.828,2875,4.828,2876,4.828,2877,4.828,2878,4.828,2879,4.828,2880,6.803,2881,4.357,2882,4.828,2883,4.828,2884,4.828]],["t/490",[1,3.676,2,3.607,10,3.992,25,1.43,59,3.418,187,3.153,273,5.419,379,3.825,479,2.812,504,4.288,624,4.528,778,4.819,802,4.819,863,3.992,878,5.419,1000,4.819,1110,5.189,1161,4.084,2322,4.819,2885,7.209,2886,7.209,2887,7.209,2888,7.209]],["t/492",[0,1.082,15,3.423,19,3.961,24,1.995,25,1.408,29,4.333,33,2.883,44,3.308,109,6.079,191,4.333,463,5.682,506,4.22,803,4.236,879,5.107,881,6.402,882,6.402,932,4.592,1014,4.333,1351,6.402,2889,7.095,2890,7.095]],["t/494",[0,1.506,16,2.795,23,1.869,24,1.77,25,1.249,32,2.3,103,3.743,115,2.216,199,2.558,208,3.41,214,2.671,219,3.743,410,3.209,439,2.798,456,4.721,504,3.743,624,5.99,891,4.53,1014,3.844,1198,3.565,1556,5.274,2188,5.274,2891,6.293,2892,6.293,2893,6.293,2894,8.138,2895,6.293,2896,6.293,2897,6.293,2898,6.293]],["t/496",[2,3.636,16,3.228,93,3.779,103,4.323,247,3.131,252,2.761,456,4.216,485,5.231,504,4.323,506,4.323,624,4.565,777,6.091,878,6.698,1365,5.231,2899,7.268,2900,7.268,2901,7.268,2902,7.268,2903,7.268,2904,7.268,2905,7.268]],["t/498",[0,0.897,5,2.189,24,1.653,27,3.056,33,2.389,56,2.204,82,4.927,118,2.282,142,3.93,165,3.255,171,2.532,172,2.423,173,4.231,176,3.185,204,3.255,225,2.356,276,4.31,295,3.693,296,3.352,303,2.941,388,4.515,449,2.458,459,3.056,562,2.458,632,3.93,633,3.185,723,5.481,749,4.419,829,4.071,833,3.185,840,3.497,948,2.532,975,4.927,1181,4.231,1245,4.644,1304,4.231,1600,4.071,2210,4.644,2906,5.879,2907,5.879,2908,5.879,2909,5.879,2910,5.879]],["t/500",[0,1.058,5,1.396,17,1.237,27,4.906,33,2.017,35,2.394,37,1.962,115,1.748,118,2.091,122,1.885,129,2.567,165,2.748,171,2.138,181,3.08,186,2.58,214,2.106,216,2.353,222,3.117,276,5.043,282,3.727,350,2.276,410,2.53,452,2.811,460,4.125,559,2.53,561,3.031,562,3.946,574,3.921,583,3.731,636,3.436,747,3.921,748,4.159,749,7.094,752,5.48,753,4.159,758,3.436,811,2.952,844,2.046,880,3.318,953,3.731,1141,4.478,1173,3.117,1174,3.117,1246,4.159,1453,3.318,2184,3.921,2221,4.159,2658,4.478,2911,4.963,2912,4.963]],["t/503",[5,1.862,17,1.181,56,3.152,115,2.332,118,2.199,129,3.112,184,3.252,195,3.587,225,2.654,439,2.89,447,4.584,462,4.285,499,3.841,514,3.375,545,4.584,546,4.765,561,4.044,562,3.516,678,5.231,686,4.159,688,5.134,689,5.549,690,3.312,941,5.231,1013,5.231,2625,5.231,2913,6.621,2914,6.621]],["t/505",[213,3.677,214,3.469,239,3.59,469,4.389,499,5.25,568,4.562,678,7.554,701,6.852,702,5.527,704,5.008,707,5.008,2703,8.166,2915,6.338,2916,6.338,2917,8.175,2918,6.338,2919,9.05,2920,9.05,2921,6.338,2922,6.338,2923,6.338,2924,6.338,2925,6.338,2926,6.338]],["t/507",[0,1.091,32,2.614,35,3.451,37,2.827,115,3.369,172,2.948,181,3.176,199,2.907,246,4.149,262,4.781,296,3.08,439,3.033,447,4.952,665,5.65,685,5.993,686,5.542,1248,4.952,2289,4.629,2927,7.151,2928,7.151]],["t/509",[5,2.373,23,1.937,117,4.571,118,2.207,223,3.008]],["t/511",[11,2.128,36,2.691,78,3.423,87,2.66,118,2.765,282,3.308,690,3.549,741,6.079,768,3.928,844,3.619,1380,4.743,1996,6.936,2929,7.095,2930,5.605,2931,4.913]],["t/514",[0,1.207,5,2.225,23,1.817,78,3.818,118,2.453,143,2.453,223,2.821,429,3.818,434,4.114,731,3.959,2932,7.913]],["t/516",[0,0.188,1,0.628,3,0.395,4,0.508,5,0.626,13,0.654,17,1.066,23,0.511,24,1.049,25,0.74,26,1.157,27,2.243,33,0.501,36,0.378,37,0.487,49,0.753,56,0.462,58,1.164,66,0.774,87,0.835,89,0.774,91,0.515,92,0.456,100,0.887,115,0.784,118,1.563,119,0.774,122,0.846,126,0.617,127,0.824,129,1.597,143,0.944,145,2.975,154,1.674,157,0.774,163,0.531,164,2.219,171,0.959,176,1.65,178,2.819,186,0.641,188,1.114,192,0.668,195,2.337,199,1.238,208,1.206,213,0.715,214,3.764,216,2.284,223,1.086,225,0.494,228,0.715,239,0.698,246,0.715,252,0.468,258,0.853,259,1.441,260,1.488,266,0.824,267,0.887,268,3.637,276,2.066,279,0.853,282,1.42,290,0.926,292,0.733,294,0.539,296,2.262,309,1.398,310,1.36,313,0.774,322,1.552,327,2.109,335,0.824,367,1.902,384,2.109,385,4.121,388,0.715,391,3.208,410,1.902,428,0.733,429,1.074,430,5.358,431,0.595,432,0.926,433,0.798,434,0.641,435,0.926,436,0.887,437,0.926,438,0.926,439,2.158,440,0.824,441,0.824,442,0.926,443,0.654,444,0.887,445,0.824,446,0.926,447,1.542,448,2.109,449,3.094,450,0.926,451,2.344,452,1.725,453,0.715,455,0.733,459,2.504,460,1.811,462,0.798,469,2.109,472,0.853,473,0.774,481,4.534,483,1.602,496,1.441,499,2.164,500,0.715,503,2.846,504,0.733,506,2.219,508,1.602,509,0.887,510,2.686,511,1.206,512,1.674,513,1.074,514,1.135,515,1.324,516,0.926,517,0.926,518,0.926,519,0.926,520,0.926,521,1.674,522,0.853,523,1.36,524,0.824,525,1.033,526,2.793,534,0.926,535,1.033,536,0.974,544,0.926,545,1.542,546,0.887,547,0.733,548,0.824,549,0.853,550,0.887,551,0.974,552,0.974,553,0.887,554,1.42,555,1.033,556,1.033,557,1.033,558,1.033,559,0.628,560,1.112,561,1.86,562,2.933,563,1.033,568,1.602,574,0.974,583,1.674,589,1.398,601,1.602,602,1.542,609,0.887,610,3.127,611,0.974,624,1.913,625,0.974,626,1.602,627,0.926,628,1.112,629,0.974,630,0.974,631,1.674,632,1.488,633,0.668,634,0.926,635,0.974,636,1.542,637,0.974,665,0.974,666,1.112,667,2.009,668,1.112,669,1.112,670,1.112,671,1.112,672,1.112,673,1.759,674,0.974,675,1.112,676,1.112,677,1.112,678,1.759,679,1.488,680,1.112,681,1.033,682,0.926,683,0.887,684,0.887,685,1.033,686,0.774,687,0.926,688,1.36,689,1.033,690,0.617,691,1.033,692,0.974,693,0.926,694,1.033,695,0.774,696,1.112,697,0.887,698,1.112,699,1.112,700,0.926,701,1.033,702,1.36,703,1.033,704,1.759,705,1.033,706,1.033,707,0.974,708,1.866,709,1.033,710,0.974,711,1.866,712,1.033,713,0.774,714,1.033,715,0.853,716,1.033,717,1.112,718,1.866,719,0.753,720,1.112,721,0.974,722,1.112,723,1.398,724,0.974,725,0.824,726,0.853,727,1.112,728,1.033,729,1.674,730,1.033,731,1.114,732,0.887,733,0.926,734,1.033,735,0.974,736,0.853,737,0.887,738,0.926,739,1.112,740,1.112,741,0.853,742,1.112,743,2.009,744,1.112,745,0.887,746,0.798,747,0.974,748,1.866,749,2.289,750,1.033,751,0.926,752,0.974,753,1.033,754,1.602,755,0.774,756,1.112]],["t/518",[439,2.956,844,3.545,2933,6.794]],["t/520",[11,1.928,17,1.147,24,1.808,25,1.276,36,1.971,37,2.542,58,2.226,92,2.38,171,2.769,213,3.73,214,2.728,367,3.278,385,3.867,430,4.908,439,2.836,451,4.039,460,3.824,472,4.452,481,4.452,524,4.298,554,2.998,673,6.519,674,5.08,741,4.452,844,2.65,948,2.769,1947,5.389,1996,5.08,2317,4.628,2933,5.08,2934,4.833,2935,5.802]],["t/522",[439,2.956,1380,5.749,2933,6.794]],["t/524",[11,1.787,17,1.063,24,1.675,25,1.182,27,3.097,36,1.826,37,2.355,58,2.118,92,2.205,171,2.566,213,3.456,214,2.528,252,2.263,367,3.037,385,3.962,430,5.224,439,2.699,451,3.742,460,3.543,472,4.125,481,4.125,524,3.982,554,2.777,562,2.491,673,6.203,674,4.707,741,5.437,948,2.566,1380,5.249,1947,4.993,1996,6.203,2125,4.707,2317,4.288,2933,4.707,2934,4.478,2935,5.376,2936,4.707,2937,5.957]],["t/526",[0,1.057,3,2.221,5,1.949,29,4.232,35,3.343,118,1.812,122,2.632,123,2.703,181,3.078,188,3.467,201,4.987,223,2.47,274,4.122,329,3.754,429,4.551,562,2.898,598,3.127,731,3.467,736,4.798,844,3.566,2236,5.807,2242,5.474,2738,4.987,2938,5.474,2939,6.929]],["t/528",[0,1.156,3,2.429,118,2.39,143,2.348,434,3.939,598,3.419,729,5.695,731,3.79,733,5.695,844,3.767,1980,4.904,2242,5.986,2738,5.454,2940,7.577,2941,7.577]],["t/530",[11,1.971,36,2.015,37,3.308,58,2.257,118,2.188,164,4.977,214,3.551,309,4.128,385,3.551,429,3.171,430,4.977,439,2.876,729,6.29,730,5.508,731,4.186,732,4.73,733,4.94,734,5.508,735,5.192,736,4.551,737,4.73,738,4.94,948,2.831,2317,4.73,2934,4.94]],["t/532",[27,4.428,118,2.228,282,3.971,562,3.562]],["t/534",[0,1.24,27,4.226,118,2.492,282,4.443,562,3.4,844,3.351,2659,6.813]],["t/536",[118,2.428,122,2.953,129,2.878,172,3.205,379,4.125,498,5.032,768,5.139,844,3.205,2125,6.143,2930,6.143,2936,7.333]],["t/538",[0,1.264,27,4.31,118,2.521,143,2.569,276,3.586,379,4.398,434,4.31,562,3.823,597,3.852,747,5.117,749,4.868,752,5.117,768,5.337,2930,7.615,2936,6.549,2942,8.698,2943,6.476]],["t/540",[11,2.031,27,3.52,36,2.076,37,2.677,47,5.09,122,2.572,192,3.668,214,2.873,216,3.211,237,4.028,244,4.874,385,3.961,430,4.028,452,4.83,481,4.689,562,2.832,768,4.722,948,2.917,959,3.388,1389,5.09,2300,5.675,2317,4.874,2930,5.35,2934,5.09,2936,5.35,2944,6.771,2945,6.771]],["t/542",[87,3.392,118,2.366,122,2.83,172,3.071,379,3.952,498,4.822,690,4.526,912,5.886,1021,5.159,1022,4.125,1389,5.6,2125,5.886,2931,6.264,2946,7.581]],["t/544",[0,1.136,27,3.873,58,2.44,87,3.392,118,2.366,379,3.952,562,3.116,690,4.526,2931,6.264,2942,8.163,2946,6.244,2947,6.723,2948,6.723]],["t/546",[11,1.887,27,3.272,36,1.929,37,2.488,92,3.339,118,1.646,129,3.012,142,4.207,178,3.149,213,5.232,385,3.827,430,5.365,554,3.794,562,3.403,693,4.731,723,3.953,840,3.743,948,2.711,2041,5.274,2317,4.53,2931,4.358,2934,4.731,2946,5.274,2947,5.679,2948,5.679,2949,9.019,2950,6.293,2951,6.293]],["t/549",[0,1.263,5,2.329,11,2.483,12,5.733,29,5.057,118,2.166,2952,8.28]],["t/551",[0,1.118,3,2.349,5,2.061,17,1.597,92,2.712,94,4.151,118,2.53,223,2.612,316,3.97,389,6.141,439,2.519,551,5.789,598,4.041,731,3.666,2761,5.508,2931,5.074,2953,7.328]],["t/553",[3,2.003,17,1.445,35,3.015,36,1.916,44,2.914,53,4.498,59,2.963,108,5.238,110,3.717,118,1.635,165,3.46,305,4.327,316,3.386,439,2.148,443,3.315,514,3.186,562,2.613,598,3.655,731,4.053,759,2.776,844,2.576,970,5.61,1022,4.486,1365,4.498,1980,5.244,2115,4.698,2184,4.937,2242,4.937,2738,4.498,2761,6.09,2954,6.249,2955,6.249,2956,6.249,2957,6.249,2958,6.249]],["t/555",[0,0.975,17,1.283,32,2.336,36,1.959,37,2.843,88,1.502,90,1.435,94,1.916,116,1.916,117,1.832,118,2.427,122,1.285,128,1.661,146,3.284,172,1.394,181,1.502,184,1.661,186,1.758,199,1.375,201,2.434,203,2.895,223,1.206,225,2.095,263,2.672,274,3.801,281,4.883,282,2.437,294,1.479,329,4.453,367,2.665,410,2.665,414,4.13,439,2.825,483,2.434,514,1.724,562,3.437,729,5.844,731,4.964,735,5.049,736,4.425,738,4.804,759,1.502,830,2.834,836,4.137,844,4.213,880,2.261,912,2.672,1014,2.066,1040,2.672,1110,2.434,1389,2.542,1415,2.342,2625,2.672,2762,5.767,2938,2.672,2959,3.382,2960,3.382,2961,3.382,2962,7.774,2963,7.774]],["t/557",[3,2.181,11,1.448,17,1.213,23,1.109,24,1.358,25,0.958,52,2.251,78,2.33,91,2.019,92,1.787,93,2.51,115,2.774,118,2.06,129,3.166,172,1.99,178,2.416,181,3.499,182,2.145,184,2.372,200,1.883,223,1.721,225,1.935,247,2.08,259,3.125,260,3.228,296,2.08,335,3.228,410,2.462,449,2.019,544,5.114,545,6.655,546,6.49,554,4.481,603,3.815,633,2.616,665,3.815,686,4.948,688,4.155,691,4.047,692,3.815,695,3.033,1013,3.815,1021,3.343,1096,5.375,1173,3.033,1397,3.475,1993,3.63,2702,4.357,2704,6.139,2964,4.828,2965,4.828]],["t/559",[0,0.358,3,0.753,5,1.097,11,0.704,17,1.039,23,0.539,24,1.962,25,1.283,33,3.366,37,1.978,52,1.095,58,0.634,78,1.882,87,3.32,88,1.043,90,0.997,115,1.374,118,1.825,121,1.154,123,1.952,129,2.865,146,2.451,171,1.012,172,0.968,178,1.175,188,1.952,192,3.503,198,0.941,200,0.916,203,1.301,204,1.301,214,2.124,216,1.114,219,1.397,223,0.837,247,2.785,277,1.221,279,2.702,292,1.397,296,1.681,300,1.626,318,2.119,331,1.363,380,4.516,445,2.608,449,4.141,469,2.702,473,2.451,477,1.027,479,0.916,483,1.691,484,4.478,499,5.223,500,1.363,513,1.882,588,1.856,589,1.475,598,1.06,609,3.602,610,4.194,679,1.57,690,1.175,700,1.766,702,4.261,704,3.954,705,1.968,706,1.968,707,1.856,708,1.968,709,4.194,710,3.082,711,3.27,712,6.94,713,3.661,714,1.968,715,2.702,716,1.968,718,3.27,719,1.435,721,1.856,745,2.808,746,2.525,754,1.691,778,1.57,831,1.766,850,4.381,880,1.57,952,3.27,994,3.082,1021,1.626,1092,1.856,1245,1.856,1270,1.856,1345,1.766,1358,1.691,1429,1.691,1782,1.856,2223,3.762,2625,1.856,2751,3.27,2808,2.119,2881,3.521,2966,2.349,2967,2.349,2968,2.349,2969,2.349,2970,3.902,2971,2.349,2972,3.902,2973,3.902,2974,2.349,2975,2.349,2976,2.349,2977,2.349,2978,2.349,2979,3.902,2980,2.349,2981,2.349,2982,2.349,2983,2.349,2984,2.349,2985,2.349,2986,2.349]],["t/561",[3,3.009,17,1.077,24,2.486,26,4.118,28,4.787,51,3.271,135,5.06,143,1.871,163,3.808,182,2.682,379,3.203,434,4.596,436,5.702,554,2.815,733,7.055,807,4.036,843,4.181,1365,4.346,1397,4.346,1958,6.258,2738,7.014,2987,6.038,2988,6.038,2989,6.038]],["t/563",[0,1.006,23,0.817,24,2.359,25,1.465,32,1.987,33,1.446,36,1.09,88,2.414,118,2.353,143,1.103,161,2.173,163,2.341,171,2.841,199,4.105,200,1.387,203,1.97,244,2.56,304,2.234,310,2.173,434,1.849,460,2.116,469,2.463,474,2.173,725,3.633,731,2.719,763,2.303,844,1.466,1198,3.079,1304,3.912,1305,4.555,2322,2.378,2371,3.21,2382,2.81,2810,9.115,2811,9.115,2812,3.21,2813,3.21,2814,3.21,2815,3.21,2816,3.21,2817,3.21,2818,3.21,2819,3.21,2820,4.905,2821,3.21,2822,5.952,2823,3.21,2824,3.21,2825,3.21,2826,3.21,2827,3.21,2828,3.21,2829,4.905,2830,3.21,2831,3.21,2832,3.21,2833,3.21,2834,3.21,2835,3.21,2836,5.952,2837,3.21,2838,3.21,2839,3.21,2840,3.21,2841,3.21,2842,3.21,2843,3.21,2844,3.21,2845,4.905,2846,3.21,2847,3.21]],["t/566",[0,1.108,17,1.296,48,3.388,58,2.404,341,3.706,567,3.938,725,4.859,909,6.091,931,6.091,959,3.636,1037,5.033,1538,6.091,1714,6.053,1865,6.091,1955,5.231,2055,6.091,2990,7.268,2991,7.268,2992,7.268]],["t/568",[16,3.151,17,1.265,27,3.688,51,4.756,58,2.368,143,2.199,439,2.439,496,4.592,567,3.844,759,3.151,849,4.913,1037,4.913,1232,5.946,1301,4.116,1714,4.456,2621,6.402,2993,9.533,2994,7.095,2995,7.095,2996,7.095,2997,7.095]],["t/573",[352,3.973,404,7.257,405,6.241,406,6.141,413,7.257,416,6.896,420,6.905,2998,6.896,2999,7.642]],["t/575",[174,5.577,352,4.471]],["t/577",[14,4.185,114,4.939,252,2.806,303,4.503,313,4.641,384,5.116,386,5.116,421,6.667,423,6.192,486,5.318,1864,7.543,1948,6.667,1949,7.543,2757,7.543,3000,7.388,3001,6.667]],["t/579",[3,2.431,4,3.126,11,1.696,25,1.122,29,3.454,56,2.12,58,2.572,165,3.131,201,6.864,301,5.992,367,2.883,378,3.659,392,5.103,393,5.103,511,3.064,562,3.579,597,4.511,598,2.552,723,4.764,731,3.794,1198,4.296,1248,3.916,1855,4.468,2931,6.332,2938,4.468,3002,9.144,3003,5.655,3004,5.103,3005,6.844,3006,6.844,3007,5.103]],["t/581",[0,1.118,3,2.871,4,3.021,6,5.073,13,3.887,17,1.307,22,4.899,35,3.536,44,3.416,140,4.246,892,4.475,1317,4.743,1451,5.508,2021,5.789,3008,7.328,3009,7.328,3010,7.328,3011,7.328]],["t/583",[0,0.836,3,3.119,4,3.89,5,2.539,6,3.105,17,1.502,20,4.12,23,1.259,24,1.542,44,2.555,115,1.93,129,2.029,143,1.699,163,2.361,225,2.197,271,3.548,295,3.443,296,3.199,310,3.348,311,3.348,316,4.023,322,2.795,331,3.18,344,4.807,362,4.946,367,2.795,368,3.443,369,2.97,384,3.795,385,3.574,431,2.645,479,2.138,548,3.664,755,3.443,932,3.548,945,4.12,970,3.795,979,4.946,1040,4.33,1047,3.443,1140,4.594,1198,3.105,3012,5.481]],["t/586",[3,1.976,4,2.541,11,1.848,29,3.764,58,2.409,165,3.413,201,7.061,301,4.869,367,3.142,378,3.874,511,3.339,562,3.734,597,4.775,598,2.781,723,3.871,731,4.016,1198,3.491,1248,4.268,1855,4.869,2931,7.092,2938,4.869,3004,5.561,3005,7.245,3006,7.245,3007,5.561]],["t/588",[14,4.22,114,4.981,252,2.83,303,4.526,313,5.682,384,6.264,386,5.159,423,6.244,486,5.362,1864,7.581,1949,7.581,2757,7.581,3001,6.723]],["t/590",[174,5.177,352,4.751,405,6.223,406,6.109,413,7.22,420,7.659,2998,6.837]]],"invertedIndex":[["",{"_index":58,"t":{"7":{"position":[[32,1]]},"16":{"position":[[372,1],[660,1],[684,1],[711,1],[736,1],[757,1],[774,1],[803,1],[1769,1],[1793,1],[1820,1],[1849,1],[1863,1],[1882,1],[1924,1],[1950,1],[2841,2],[3198,1],[3248,1],[3258,1],[3260,1],[3273,6],[3287,3],[3316,7],[3369,1],[3371,2],[3382,1],[3395,1],[3397,1]]},"83":{"position":[[2904,3],[3053,3],[3239,3],[4405,1],[4431,1],[4511,1],[4537,1],[7369,1],[7371,4],[7376,1],[8706,3],[8784,1],[8810,1],[10467,1],[10490,1]]},"93":{"position":[[0,1],[15,2]]},"97":{"position":[[0,1],[42,1],[78,1],[121,2],[181,2]]},"99":{"position":[[14,2],[52,2],[95,2],[133,2],[168,2],[219,2]]},"103":{"position":[[391,1]]},"107":{"position":[[442,1],[528,1]]},"109":{"position":[[69,2],[217,2],[333,2]]},"111":{"position":[[0,2]]},"119":{"position":[[617,1],[630,1],[1234,2],[1318,3],[1322,2]]},"121":{"position":[[832,1],[929,1]]},"176":{"position":[[238,99],[338,1],[345,1],[351,1],[358,1],[365,1],[374,1],[382,1],[393,1],[404,1],[413,1],[415,99],[515,1],[525,1],[531,1],[536,1],[547,1],[552,1],[556,1],[561,1],[568,1],[572,1],[574,1],[584,1],[590,1],[595,1],[606,1],[611,1],[615,1],[620,1],[627,1],[631,1],[633,1],[643,1],[649,1],[654,1],[665,1],[670,1],[674,1],[679,1],[686,1],[690,1],[692,1],[702,1],[708,1],[713,1],[724,1],[729,1],[733,1],[738,1],[745,1],[749,1],[751,1],[761,1],[767,1],[772,1],[783,1],[788,1],[792,1],[797,1],[804,1],[808,1],[810,1],[820,1],[826,1],[831,1],[842,1],[847,1],[857,1],[862,1],[869,1],[873,1],[875,1],[885,1],[891,1],[896,1],[907,1],[912,1],[922,1],[927,1],[934,1],[938,1],[940,1],[950,1],[956,1],[961,1],[973,1],[978,1],[988,1],[993,1],[1000,1],[1004,1],[1006,99],[1106,1],[1178,1],[1180,99]]},"190":{"position":[[502,1],[559,1],[579,1],[635,2],[647,1],[649,1],[712,1],[727,1],[786,1],[835,1],[859,1],[1008,1]]},"194":{"position":[[74,1],[176,1],[525,1]]},"199":{"position":[[343,1]]},"201":{"position":[[5,1],[25,1],[53,1],[99,1],[108,1],[2531,1]]},"203":{"position":[[1261,1]]},"211":{"position":[[329,3],[364,1],[491,2]]},"236":{"position":[[42,3],[58,1],[60,3],[67,1],[69,3],[78,1],[80,3],[102,1],[104,3],[122,3],[135,3],[144,1],[261,1],[281,1],[303,1],[339,1],[404,1],[455,1],[502,1],[512,1],[555,1],[578,1],[600,1],[665,1],[733,1],[780,1],[846,1],[916,1],[976,1],[999,1],[1041,1],[1124,1],[1154,1],[1171,1],[1216,1],[1229,2],[1246,1],[1273,1],[1288,1],[1358,1],[1428,1],[1492,1],[1564,1],[1616,1]]},"238":{"position":[[0,1],[37,1],[57,1],[97,1],[109,1],[111,1],[142,1],[144,1],[157,1],[159,1],[187,1],[189,1],[232,1],[234,1],[243,1],[245,1],[274,1],[276,1],[278,1],[295,1],[297,1],[363,1],[445,1],[523,1],[529,1],[605,1],[614,1],[630,1],[645,1],[664,1],[676,1]]},"240":{"position":[[788,1],[825,1],[845,1],[862,1],[875,1],[877,1],[905,1],[907,1],[950,1],[952,1],[961,1],[963,1],[992,1],[994,1],[996,1],[1013,1],[1015,1],[1071,1],[1132,1],[1164,1],[1186,1],[1216,1],[1282,1],[1335,1],[1344,1],[1390,1],[1428,1],[1459,1],[1475,1],[1490,1],[1509,1],[1522,1],[1566,1],[1828,1],[1891,1],[1953,1],[2544,1],[2571,1],[2581,2],[2594,1],[2621,1],[2631,2],[2648,1],[2674,1]]},"242":{"position":[[0,1],[58,1],[80,1]]},"244":{"position":[[531,1],[589,1],[609,1],[638,1],[711,1],[762,1],[816,1],[859,1],[861,1],[891,1],[893,1],[926,1],[928,1],[951,1],[953,1],[975,1],[977,1],[985,1],[987,1],[1002,1],[1004,1],[1012,1],[1014,1],[1021,1],[1023,1],[1033,1],[1113,1],[1177,1],[1231,1],[1249,1],[1264,1],[1313,1],[1357,2],[1360,1],[1368,1],[1389,1],[1394,5],[1400,1],[1481,1],[1556,1],[1643,1],[1725,1],[1811,1],[1886,1],[1939,1],[1954,1],[1968,1],[1979,1],[2068,2],[2071,1],[2106,2],[2109,1],[2130,1],[2150,1],[2225,1]]},"255":{"position":[[202,1]]},"265":{"position":[[90,1],[110,1],[165,1]]},"267":{"position":[[256,1],[366,1],[418,1],[475,1],[545,1],[632,1],[846,1],[909,2],[912,3],[916,2],[1105,2],[1108,1],[1187,3],[1285,2],[1288,1],[1371,3]]},"269":{"position":[[279,2],[945,2],[948,2],[951,1],[973,2],[976,1],[978,2],[1017,2],[1048,2],[1056,3]]},"295":{"position":[[241,1],[352,1],[400,1],[536,3],[551,1],[587,1],[649,1],[1660,1],[1771,1],[1819,1],[1978,3],[1993,1],[2029,1],[2091,1],[2263,1],[2283,1],[2344,1],[2397,1]]},"299":{"position":[[0,1],[14,1],[23,2],[257,2],[339,1],[365,1],[405,1],[447,1],[481,1],[517,1],[548,2],[563,1],[581,1],[599,2],[618,2],[648,1],[669,1],[695,1],[713,1],[743,1],[763,1],[790,1],[814,1],[851,1],[876,1],[902,1],[925,1],[942,1],[965,2],[981,2],[996,2],[1014,2],[1036,2],[1056,2],[1079,2],[1103,1],[1125,1],[1154,1],[1171,1],[1189,2],[1228,2],[1254,2],[1282,1],[1325,1],[1370,1],[1401,1],[1427,2],[1449,2]]},"320":{"position":[[2904,3],[3053,3],[3239,3],[4372,1],[4398,1],[4478,1],[4504,1],[7229,1],[7231,4],[7236,1]]},"363":{"position":[[698,1],[747,3],[773,1],[820,3],[847,3],[862,1],[891,3],[899,3],[916,3],[929,1],[964,1],[966,3],[981,3],[995,1],[1037,3],[1068,1],[1118,3],[1145,3],[1163,1],[1192,3],[1209,1],[1254,1],[1256,3],[1271,3],[1291,1],[1332,1],[1334,3],[1353,3],[1363,1],[1401,1],[1403,3],[1421,3],[1433,1],[1473,1],[1475,3],[1535,1],[1537,3],[1597,3],[1611,1],[1653,1],[1655,3],[1715,1],[1717,1],[1719,3],[1744,1],[1746,3],[1806,1],[1808,3],[1833,3],[1848,1],[1891,3]]},"365":{"position":[[274,1]]},"381":{"position":[[1125,1]]},"383":{"position":[[208,1],[220,1],[3262,1]]},"387":{"position":[[1040,1],[1042,4],[1047,1]]},"390":{"position":[[196,1]]},"395":{"position":[[392,2]]},"409":{"position":[[203,1],[224,1],[249,1],[293,1]]},"415":{"position":[[266,2]]},"423":{"position":[[748,1],[776,1],[802,1],[822,1],[836,1],[892,1],[1550,1]]},"425":{"position":[[134,3]]},"427":{"position":[[295,1]]},"431":{"position":[[459,1]]},"434":{"position":[[293,1],[471,1],[594,1],[596,3],[616,2],[653,1],[655,1],[702,1],[1296,1],[1298,2]]},"439":{"position":[[182,1],[195,1],[260,1],[437,2]]},"441":{"position":[[148,1]]},"443":{"position":[[732,1]]},"445":{"position":[[555,1]]},"453":{"position":[[424,2]]},"455":{"position":[[1149,1]]},"457":{"position":[[613,1]]},"461":{"position":[[443,1]]},"465":{"position":[[1221,1]]},"467":{"position":[[1205,1]]},"469":{"position":[[415,1]]},"471":{"position":[[99,1],[595,1],[1452,1],[1496,1],[2513,1],[2515,1],[2565,2],[2568,1]]},"484":{"position":[[454,1],[646,1],[796,3]]},"516":{"position":[[1775,3],[1853,1],[1879,1],[4029,1],[4052,1]]},"520":{"position":[[130,1],[156,1]]},"524":{"position":[[130,1],[156,1]]},"530":{"position":[[192,1],[215,1]]},"544":{"position":[[157,3],[182,3]]},"559":{"position":[[2696,1]]},"566":{"position":[[0,1],[112,2]]},"568":{"position":[[0,2],[64,2]]},"579":{"position":[[56,1],[65,1],[140,1],[149,1],[193,1]]},"586":{"position":[[34,1],[43,1],[76,1]]}}}],["0",{"_index":239,"t":{"16":{"position":[[2919,1]]},"18":{"position":[[209,1],[241,1],[280,1]]},"83":{"position":[[2726,1]]},"176":{"position":[[570,1],[629,1],[688,1],[747,1],[806,1],[871,1],[936,1]]},"240":{"position":[[1342,1]]},"289":{"position":[[1165,1]]},"320":{"position":[[2726,1]]},"379":{"position":[[2135,1]]},"383":{"position":[[406,1],[577,1]]},"387":{"position":[[2014,1]]},"467":{"position":[[776,1],[901,2],[1040,2],[1078,2],[1131,1]]},"477":{"position":[[1690,1]]},"505":{"position":[[308,3]]},"516":{"position":[[1165,1]]}}}],["0..0",{"_index":220,"t":{"16":{"position":[[2162,4]]}}}],["0..4",{"_index":2771,"t":{"467":{"position":[[1174,4]]}}}],["0..5",{"_index":2770,"t":{"467":{"position":[[818,4]]}}}],["0..7",{"_index":152,"t":{"16":{"position":[[731,4]]},"83":{"position":[[11950,6]]}}}],["0.0.0.0",{"_index":641,"t":{"83":{"position":[[6738,9]]},"320":{"position":[[6598,9]]},"387":{"position":[[747,9]]}}}],["0.03",{"_index":2715,"t":{"445":{"position":[[473,4]]}}}],["0.75",{"_index":1298,"t":{"176":{"position":[[1130,5],[1148,4]]}}}],["00:31",{"_index":1466,"t":{"201":{"position":[[1152,5]]}}}],["00:35",{"_index":1471,"t":{"201":{"position":[[1211,5],[1674,5]]}}}],["00:36",{"_index":1459,"t":{"201":{"position":[[1089,5],[1266,5],[1344,5],[1426,5],[1509,5],[1592,5],[1757,5],[1840,5],[1923,5],[2006,5],[2089,5],[2172,5],[2255,5],[2338,5],[2421,5]]}}}],["01",{"_index":2811,"t":{"479":{"position":[[329,2],[456,2],[555,2],[648,2],[694,2],[821,2],[948,2],[1015,2],[1080,2],[1174,2],[1282,2],[1522,2],[1711,2],[1900,2],[1965,2],[2038,2]]},"563":{"position":[[151,2],[278,2],[377,2],[470,2],[516,2],[643,2],[770,2],[837,2],[902,2],[996,2],[1104,2],[1344,2],[1533,2],[1722,2],[1787,2],[1860,2]]}}}],["03:06:35.048",{"_index":2812,"t":{"479":{"position":[[332,14]]},"563":{"position":[[154,14]]}}}],["03:06:35.050",{"_index":2816,"t":{"479":{"position":[[459,14]]},"563":{"position":[[281,14]]}}}],["03:06:35.697",{"_index":2818,"t":{"479":{"position":[[558,14]]},"563":{"position":[[380,14]]}}}],["03:06:35.698",{"_index":2822,"t":{"479":{"position":[[651,14],[697,14],[824,14]]},"563":{"position":[[473,14],[519,14],[646,14]]}}}],["03:06:35.732",{"_index":2825,"t":{"479":{"position":[[951,14]]},"563":{"position":[[773,14]]}}}],["03:09:23.813",{"_index":2827,"t":{"479":{"position":[[1018,14]]},"563":{"position":[[840,14]]}}}],["03:09:23.816",{"_index":2828,"t":{"479":{"position":[[1083,14]]},"563":{"position":[[905,14]]}}}],["03:09:23.818",{"_index":2829,"t":{"479":{"position":[[1177,14],[1285,14]]},"563":{"position":[[999,14],[1107,14]]}}}],["03:09:23.830",{"_index":2836,"t":{"479":{"position":[[1525,14],[1714,14],[1903,14]]},"563":{"position":[[1347,14],[1536,14],[1725,14]]}}}],["03:15:50.191",{"_index":2843,"t":{"479":{"position":[[1968,14]]},"563":{"position":[[1790,14]]}}}],["03:16:02.728",{"_index":2846,"t":{"479":{"position":[[2041,14]]},"563":{"position":[[1863,14]]}}}],["05",{"_index":1461,"t":{"201":{"position":[[1107,2]]}}}],["0755",{"_index":2671,"t":{"434":{"position":[[211,4]]}}}],["09",{"_index":1588,"t":{"220":{"position":[[122,2]]}}}],["0x",{"_index":2097,"t":{"289":{"position":[[1398,2]]},"441":{"position":[[82,2]]}}}],["0x0000000000000000000000000000000000000000",{"_index":563,"t":{"83":{"position":[[3808,44]]},"320":{"position":[[3761,44]]},"516":{"position":[[2588,44]]}}}],["0x00000000219ab540356cbb839cbe05303d7705fa",{"_index":2988,"t":{"561":{"position":[[232,42]]}}}],["0x0000…0000:0",{"_index":242,"t":{"16":{"position":[[2946,13]]}}}],["0x08b1",{"_index":2554,"t":{"383":{"position":[[2056,8]]}}}],["0x10ff",{"_index":2449,"t":{"379":{"position":[[2979,8]]},"477":{"position":[[2534,8]]}}}],["0x1234",{"_index":470,"t":{"83":{"position":[[1262,7]]},"320":{"position":[[1262,7]]}}}],["0x1234:100",{"_index":468,"t":{"83":{"position":[[1151,10]]},"320":{"position":[[1151,10]]}}}],["0x15fa",{"_index":1283,"t":{"176":{"position":[[774,8]]}}}],["0x17c6…71a7",{"_index":2557,"t":{"383":{"position":[[2177,11],[2339,11]]}}}],["0x1e00…6e6b:301062",{"_index":2441,"t":{"379":{"position":[[2721,18]]},"477":{"position":[[2276,18]]}}}],["0x2d6a",{"_index":2522,"t":{"383":{"position":[[1230,8]]}}}],["0x35de…1f0",{"_index":2447,"t":{"379":{"position":[[2938,11]]},"477":{"position":[[2493,11]]}}}],["0x3655…1658",{"_index":2529,"t":{"383":{"position":[[1388,11]]}}}],["0x4242424242424242424242424242424242424242",{"_index":2989,"t":{"561":{"position":[[365,42]]}}}],["0x44e4…20a4",{"_index":2537,"t":{"383":{"position":[[1584,11]]}}}],["0x4ceb",{"_index":2462,"t":{"379":{"position":[[3285,8]]},"477":{"position":[[2840,8]]}}}],["0x4f7e…0e3a",{"_index":2552,"t":{"383":{"position":[[2015,11]]}}}],["0x5516…ba12",{"_index":2460,"t":{"379":{"position":[[3244,11]]},"477":{"position":[[2799,11]]}}}],["0x58b1",{"_index":2431,"t":{"379":{"position":[[2501,8]]},"477":{"position":[[2056,8]]}}}],["0x5bc1",{"_index":2559,"t":{"383":{"position":[[2218,8],[2380,8]]}}}],["0x5cc0…3874:195764",{"_index":2513,"t":{"383":{"position":[[860,18],[1053,18]]}}}],["0x5cec…f5b8",{"_index":2510,"t":{"383":{"position":[[797,11],[990,11]]}}}],["0x6761520",{"_index":1473,"t":{"201":{"position":[[1280,9]]}}}],["0x67d1",{"_index":2456,"t":{"379":{"position":[[3132,8]]},"477":{"position":[[2687,8]]}}}],["0x6981…682f:195778",{"_index":2548,"t":{"383":{"position":[[1926,18],[2078,18],[2240,18],[2402,18],[2554,18],[2706,18]]}}}],["0x6f74",{"_index":2512,"t":{"383":{"position":[[838,8],[1031,8]]}}}],["0x7491…f63e",{"_index":2438,"t":{"379":{"position":[[2658,11]]},"477":{"position":[[2213,11]]}}}],["0x7844…3b3e",{"_index":2454,"t":{"379":{"position":[[3091,11]]},"477":{"position":[[2646,11]]}}}],["0x792f…f8aa",{"_index":2429,"t":{"379":{"position":[[2460,11]]},"477":{"position":[[2015,11]]}}}],["0x7fa2f0001060",{"_index":1477,"t":{"201":{"position":[[1358,14]]}}}],["0x7fcd80001060",{"_index":1479,"t":{"201":{"position":[[1440,14]]}}}],["0x7fcd84001060",{"_index":1481,"t":{"201":{"position":[[1523,14]]}}}],["0x7fcd88001060",{"_index":1483,"t":{"201":{"position":[[1606,14]]}}}],["0x7fcd8c001060",{"_index":1485,"t":{"201":{"position":[[1688,14]]}}}],["0x7fcd90000e60",{"_index":1487,"t":{"201":{"position":[[1771,14]]}}}],["0x7fcd94000e60",{"_index":1489,"t":{"201":{"position":[[1854,14]]}}}],["0x7fcd98000e60",{"_index":1491,"t":{"201":{"position":[[1937,14]]}}}],["0x7fcd9c000e60",{"_index":1493,"t":{"201":{"position":[[2020,14]]}}}],["0x7fcda0000e60",{"_index":1495,"t":{"201":{"position":[[2103,14]]}}}],["0x7fcda4000e60",{"_index":1497,"t":{"201":{"position":[[2186,14]]}}}],["0x7fcda8000e60",{"_index":1499,"t":{"201":{"position":[[2269,14]]}}}],["0x7fcdac000e60",{"_index":1501,"t":{"201":{"position":[[2352,14]]}}}],["0x7fcdb8000d60",{"_index":1503,"t":{"201":{"position":[[2435,14]]}}}],["0x7feb…c130:301045",{"_index":2419,"t":{"379":{"position":[[2238,18]]},"477":{"position":[[1793,18]]}}}],["0x8199",{"_index":1290,"t":{"176":{"position":[[898,8]]}}}],["0x88f8…5375:301063",{"_index":2450,"t":{"379":{"position":[[3001,18],[3154,18],[3307,18]]},"477":{"position":[[2556,18],[2709,18],[2862,18]]}}}],["0x8e41b969493454318c27ec6fac90645769331c07ebc8db5037",{"_index":2338,"t":{"363":{"position":[[1479,55],[1659,55]]}}}],["0x8f3f…2f81:195766",{"_index":2523,"t":{"383":{"position":[[1252,18]]}}}],["0x8f868e53bbe1451bcf6d42c9ab6d292cbd7fbfa09c59b6b99c1dd6a4977e2e7b4b752c328784ca2788dd6f63ffcbdb7",{"_index":2824,"t":{"479":{"position":[[845,98]]},"563":{"position":[[667,98]]}}}],["0x90ea…c655",{"_index":2545,"t":{"383":{"position":[[1863,11]]}}}],["0x9475…425a:195769",{"_index":2532,"t":{"383":{"position":[[1451,18]]}}}],["0x95c4",{"_index":1268,"t":{"176":{"position":[[538,8]]}}}],["0x9649",{"_index":2501,"t":{"383":{"position":[[483,8],[654,8]]}}}],["0x9cbd…ba83:195776",{"_index":2540,"t":{"383":{"position":[[1647,18]]}}}],["0x9d88…d02a",{"_index":2415,"t":{"379":{"position":[[2173,11]]},"477":{"position":[[1728,11]]}}}],["0x9d88…d02a:301047",{"_index":2432,"t":{"379":{"position":[[2523,18]]},"477":{"position":[[2078,18]]}}}],["0x9dfc",{"_index":1274,"t":{"176":{"position":[[597,8]]}}}],["0x[a",{"_index":555,"t":{"83":{"position":[[3647,5]]},"320":{"position":[[3633,5]]},"516":{"position":[[2427,5]]}}}],["0xa329f988c16993768299643d918a2694892c012765d896a16f",{"_index":2339,"t":{"363":{"position":[[1541,55],[1750,55]]}}}],["0xa329f988c16993768299643d918a2694892c012765d896a16f.json",{"_index":2344,"t":{"363":{"position":[[1895,57]]}}}],["0xa4855c83d868f772a579133d9f23818008417b743e8447e235d8eb78b1d8f8a9f63f98c551beb7de254400f89592314d",{"_index":2921,"t":{"505":{"position":[[312,101]]}}}],["0xa488",{"_index":2571,"t":{"383":{"position":[[2684,8]]}}}],["0xa6fcfca12e1db6c7341d82327010cd57224dc239d1c5e4fb18286cc32edb877d813c5af1c870d474aef7b3ff7ab927ea",{"_index":2823,"t":{"479":{"position":[[718,98]]},"563":{"position":[[540,98]]}}}],["0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c",{"_index":2916,"t":{"505":{"position":[[17,101]]}}}],["0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",{"_index":2918,"t":{"505":{"position":[[189,44]]}}}],["0xb5bf",{"_index":2566,"t":{"383":{"position":[[2532,8]]}}}],["0xb7576e9d314df41ec5506494293afb1bd5d3f65d",{"_index":2704,"t":{"443":{"position":[[456,43]]},"557":{"position":[[415,42],[535,43]]}}}],["0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",{"_index":2922,"t":{"505":{"position":[[429,44]]}}}],["0xbeae",{"_index":1280,"t":{"176":{"position":[[715,8]]}}}],["0xbf30…7e7c:195777",{"_index":2502,"t":{"383":{"position":[[505,18],[676,18]]}}}],["0xc9fd…28c5",{"_index":2564,"t":{"383":{"position":[[2491,11]]}}}],["0xca61",{"_index":2539,"t":{"383":{"position":[[1625,8]]}}}],["0xca9b",{"_index":2547,"t":{"383":{"position":[[1904,8]]}}}],["0xcc67…3345",{"_index":240,"t":{"16":{"position":[[2921,11]]}}}],["0xccaff4b99986a7b05e06738f1828a32e40799b277fd9f9ff069be55341fe0229",{"_index":1893,"t":{"265":{"position":[[184,68]]}}}],["0xcccccccccccccccccccccccccccccccccccccccc",{"_index":2925,"t":{"505":{"position":[[640,44]]}}}],["0xcec4",{"_index":2418,"t":{"379":{"position":[[2216,8]]},"477":{"position":[[1771,8]]}}}],["0xd4b2",{"_index":2440,"t":{"379":{"position":[[2699,8]]},"477":{"position":[[2254,8]]}}}],["0xd7ba…8386",{"_index":2579,"t":{"383":{"position":[[3677,11]]}}}],["0xd7ba…8386:189636",{"_index":2578,"t":{"383":{"position":[[3631,18]]}}}],["0xdafd",{"_index":2531,"t":{"383":{"position":[[1429,8]]}}}],["0xde91…d4cb",{"_index":2569,"t":{"383":{"position":[[2643,11]]}}}],["0xdf3f",{"_index":1277,"t":{"176":{"position":[[656,8]]}}}],["0xe0cf…9f3c",{"_index":2520,"t":{"383":{"position":[[1189,11]]}}}],["0xed93…7b0a",{"_index":2499,"t":{"383":{"position":[[440,11],[611,11]]}}}],["0xf00",{"_index":2942,"t":{"538":{"position":[[64,5],[134,5],[204,5],[381,5]]},"544":{"position":[[71,5],[134,5]]}}}],["0xf8ff",{"_index":1286,"t":{"176":{"position":[[833,8]]}}}],["0xf97e180c050e5ab072211ad2c213eb5aee4df134",{"_index":2111,"t":{"295":{"position":[[589,45],[2031,45]]}}}],["1",{"_index":146,"t":{"16":{"position":[[564,1],[1144,1],[2875,1],[3393,1]]},"105":{"position":[[294,1],[639,1]]},"178":{"position":[[256,1]]},"201":{"position":[[1060,1],[1128,1],[1237,1],[1316,1],[1399,1],[1481,1],[1564,1],[1647,1],[1729,1],[1812,1],[1895,1],[1978,1],[2061,1],[2144,1],[2227,1],[2310,1],[2393,1],[2476,1]]},"238":{"position":[[674,1]]},"240":{"position":[[1519,2],[2634,1],[2658,3]]},"383":{"position":[[888,1],[1081,1],[2174,2]]},"486":{"position":[[289,2],[415,2]]},"555":{"position":[[396,2],[1829,1]]},"559":{"position":[[1783,3],[2591,2]]}}}],["1.00",{"_index":1271,"t":{"176":{"position":[[563,4],[622,4],[681,4],[740,4],[799,4],[864,4],[1139,5],[1173,4]]}}}],["1.1",{"_index":2525,"t":{"383":{"position":[[1320,3]]}}}],["1.20",{"_index":1291,"t":{"176":{"position":[[929,4]]}}}],["1.20.0",{"_index":1931,"t":{"269":{"position":[[217,6]]}}}],["1.50",{"_index":1294,"t":{"176":{"position":[[995,4]]}}}],["1.6",{"_index":2517,"t":{"383":{"position":[[1121,3]]}}}],["10",{"_index":2808,"t":{"475":{"position":[[426,2],[456,2]]},"559":{"position":[[910,5]]}}}],["100",{"_index":469,"t":{"83":{"position":[[1242,3],[7488,3],[9759,6],[9776,6],[9953,5]]},"320":{"position":[[1242,3],[7348,3]]},"479":{"position":[[579,4]]},"505":{"position":[[541,5]]},"516":{"position":[[3321,6],[3338,6],[3515,5]]},"559":{"position":[[367,6],[384,6]]},"563":{"position":[[401,4]]}}}],["100%free",{"_index":2857,"t":{"484":{"position":[[510,9],[557,9]]}}}],["100*100/(100+percentag",{"_index":2981,"t":{"559":{"position":[[2474,25]]}}}],["100,000",{"_index":1665,"t":{"232":{"position":[[622,8]]}}}],["1000",{"_index":2574,"t":{"383":{"position":[[3264,5]]}}}],["10000/(100+25",{"_index":2984,"t":{"559":{"position":[[2681,14]]}}}],["1000hz",{"_index":1524,"t":{"203":{"position":[[693,7]]}}}],["100gb",{"_index":2661,"t":{"431":{"position":[[393,5]]}}}],["100hz",{"_index":1523,"t":{"203":{"position":[[684,5]]}}}],["10mbp",{"_index":85,"t":{"7":{"position":[[304,6],[342,7]]},"431":{"position":[[229,6],[267,7]]}}}],["11",{"_index":2433,"t":{"379":{"position":[[2551,2],[2592,2]]},"477":{"position":[[2106,2],[2147,2]]}}}],["12000",{"_index":584,"t":{"83":{"position":[[4643,5],[5771,5]]},"320":{"position":[[4610,5],[5646,5]]}}}],["123919",{"_index":1482,"t":{"201":{"position":[[1578,6]]}}}],["127.0.0.1",{"_index":154,"t":{"16":{"position":[[747,9]]},"83":{"position":[[3303,11],[6294,11],[8578,11]]},"320":{"position":[[3303,11],[6154,11]]},"387":{"position":[[2327,11]]},"516":{"position":[[1647,11],[5503,11]]}}}],["130",{"_index":77,"t":{"7":{"position":[[217,3]]},"431":{"position":[[142,3]]}}}],["13:35:27.967",{"_index":2377,"t":{"379":{"position":[[528,14]]},"477":{"position":[[83,14]]}}}],["13:35:28.344",{"_index":2381,"t":{"379":{"position":[[655,14]]},"477":{"position":[[210,14]]}}}],["13:35:49.828",{"_index":2384,"t":{"379":{"position":[[742,14]]},"477":{"position":[[297,14]]}}}],["13:35:51.955[chain",{"_index":2389,"t":{"379":{"position":[[954,19]]},"477":{"position":[[509,19]]}}}],["13:35:51.969[eth1",{"_index":2390,"t":{"379":{"position":[[1019,18]]},"477":{"position":[[574,18]]}}}],["13:35:51.975[execut",{"_index":2392,"t":{"379":{"position":[[1092,23]]},"477":{"position":[[647,23]]}}}],["13:35:51.977",{"_index":2393,"t":{"379":{"position":[[1173,14]]},"477":{"position":[[728,14]]}}}],["13:36:21.128[network",{"_index":2395,"t":{"379":{"position":[[1244,21]]},"477":{"position":[[799,21]]}}}],["13:36:21.727[network",{"_index":2396,"t":{"379":{"position":[[1320,21]]},"477":{"position":[[875,21]]}}}],["13:36:27.677[network",{"_index":2398,"t":{"379":{"position":[[1436,21]]},"477":{"position":[[991,21]]}}}],["13:36:28.134[network",{"_index":2403,"t":{"379":{"position":[[1782,21]]},"477":{"position":[[1337,21]]}}}],["13:36:28.137[metric",{"_index":2408,"t":{"379":{"position":[[1912,21]]},"477":{"position":[[1467,21]]}}}],["13:36:28.256[rest",{"_index":2410,"t":{"379":{"position":[[2005,18]]},"477":{"position":[[1560,18]]}}}],["13:36:28.257",{"_index":2412,"t":{"379":{"position":[[2089,14]]},"477":{"position":[[1644,14]]}}}],["13:36:36.461[execut",{"_index":2420,"t":{"379":{"position":[[2264,23]]},"477":{"position":[[1819,23]]}}}],["13:36:53.019",{"_index":2423,"t":{"379":{"position":[[2361,14]]},"477":{"position":[[1916,14]]}}}],["13:38:53.168",{"_index":2434,"t":{"379":{"position":[[2561,14]]},"477":{"position":[[2116,14]]}}}],["13:38:58.051[network",{"_index":2443,"t":{"379":{"position":[[2759,21]]},"477":{"position":[[2314,21]]}}}],["13:38:58.132[sync",{"_index":2444,"t":{"379":{"position":[[2824,18]]},"477":{"position":[[2379,18]]}}}],["13:39:05.001",{"_index":2445,"t":{"379":{"position":[[2886,14]]},"477":{"position":[[2441,14]]}}}],["13:39:17.000",{"_index":2452,"t":{"379":{"position":[[3039,14]]},"477":{"position":[[2594,14]]}}}],["13:39:29.000",{"_index":2458,"t":{"379":{"position":[[3192,14]]},"477":{"position":[[2747,14]]}}}],["14:17",{"_index":1506,"t":{"201":{"position":[[2500,5]]}}}],["15",{"_index":2488,"t":{"381":{"position":[[2148,4]]}}}],["152786",{"_index":1488,"t":{"201":{"position":[[1826,6]]}}}],["1552658472.json",{"_index":2750,"t":{"463":{"position":[[1183,15]]},"465":{"position":[[2293,15]]}}}],["15:13:41.298",{"_index":2505,"t":{"383":{"position":[[702,14],[897,14]]}}}],["15:13:53.151",{"_index":2516,"t":{"383":{"position":[[1090,14]]}}}],["15:14:05.425",{"_index":2524,"t":{"383":{"position":[[1289,14]]}}}],["15:14:53.001",{"_index":2533,"t":{"383":{"position":[[1488,14]]}}}],["15:15:01.443[network",{"_index":2541,"t":{"383":{"position":[[1684,21]]}}}],["15:15:01.446[sync",{"_index":2542,"t":{"383":{"position":[[1749,18]]}}}],["15:15:05.000",{"_index":2543,"t":{"383":{"position":[[1811,14]]}}}],["15:15:17.003",{"_index":2550,"t":{"383":{"position":[[1963,14]]}}}],["15:15:41.001",{"_index":2555,"t":{"383":{"position":[[2115,14]]}}}],["15:15:53.001",{"_index":2560,"t":{"383":{"position":[[2277,14]]}}}],["15:16:05.000",{"_index":2562,"t":{"383":{"position":[[2439,14]]}}}],["15:16:17.017",{"_index":2567,"t":{"383":{"position":[[2591,14]]}}}],["15:24:08.034",{"_index":2496,"t":{"383":{"position":[[360,14]]}}}],["15:24:17.000",{"_index":2503,"t":{"383":{"position":[[531,14]]}}}],["16",{"_index":75,"t":{"7":{"position":[[199,2]]},"176":{"position":[[558,2],[617,2],[676,2],[735,2],[794,2],[859,2],[924,2],[990,2]]},"431":{"position":[[124,2]]}}}],["1654128694.json",{"_index":2961,"t":{"555":{"position":[[162,17]]}}}],["1669713528",{"_index":150,"t":{"16":{"position":[[700,10],[1809,10]]}}}],["167991/6",{"_index":231,"t":{"16":{"position":[[2826,8]]}}}],["16uiu2hamaccmcexcgt3zctjl2rqjz2mvdjh6u6fe26hgd2fonrww",{"_index":2405,"t":{"379":{"position":[[1817,54]]},"477":{"position":[[1372,54]]}}}],["17/node",{"_index":1589,"t":{"220":{"position":[[125,7]]}}}],["180",{"_index":1535,"t":{"203":{"position":[[1424,3]]}}}],["183831",{"_index":1486,"t":{"201":{"position":[[1743,6]]}}}],["18550/tcp",{"_index":2279,"t":{"344":{"position":[[541,9]]}}}],["189636",{"_index":2580,"t":{"383":{"position":[[3698,6]]}}}],["1gb",{"_index":2348,"t":{"365":{"position":[[195,3]]}}}],["2",{"_index":203,"t":{"16":{"position":[[1633,1]]},"83":{"position":[[4744,1]]},"176":{"position":[[1002,1]]},"201":{"position":[[1183,1]]},"238":{"position":[[659,4]]},"240":{"position":[[1504,4],[2643,4],[2669,4]]},"320":{"position":[[4711,1]]},"365":{"position":[[161,1]]},"383":{"position":[[928,1],[1479,1],[2336,2]]},"479":{"position":[[672,1]]},"481":{"position":[[173,2],[313,2]]},"486":{"position":[[308,2],[434,2]]},"555":{"position":[[1425,2],[1774,2]]},"559":{"position":[[2746,2]]},"563":{"position":[[494,1]]}}}],["2**64",{"_index":2976,"t":{"559":{"position":[[1774,6]]}}}],["2,3,3,2",{"_index":1287,"t":{"176":{"position":[[849,7],[914,7],[980,7]]}}}],["2.0",{"_index":1952,"t":{"273":{"position":[[7,3]]},"313":{"position":[[7,3]]}}}],["2.32",{"_index":2425,"t":{"379":{"position":[[2411,4]]},"477":{"position":[[1966,4]]}}}],["2.5",{"_index":2506,"t":{"383":{"position":[[733,3]]}}}],["2.78",{"_index":2507,"t":{"383":{"position":[[752,4],[945,4]]}}}],["20",{"_index":552,"t":{"83":{"position":[[3629,2]]},"320":{"position":[[3615,2]]},"383":{"position":[[357,2],[528,2],[699,2],[894,2],[1087,2],[1286,2],[1485,2],[1681,2],[1746,2],[1808,2],[1960,2],[2112,2],[2274,2],[2436,2],[2588,2]]},"516":{"position":[[2409,2]]}}}],["200",{"_index":81,"t":{"7":{"position":[[244,3]]},"431":{"position":[[169,3]]}}}],["2000",{"_index":590,"t":{"83":{"position":[[4883,4]]},"320":{"position":[[4850,4]]},"365":{"position":[[263,5]]}}}],["200gb",{"_index":2850,"t":{"484":{"position":[[50,5],[366,6]]}}}],["2013",{"_index":1964,"t":{"275":{"position":[[334,4]]}}}],["2014",{"_index":1969,"t":{"275":{"position":[[401,5]]}}}],["2015",{"_index":1973,"t":{"275":{"position":[[444,5]]}}}],["2016",{"_index":2033,"t":{"281":{"position":[[500,5]]}}}],["2017",{"_index":1978,"t":{"275":{"position":[[531,4]]}}}],["2023",{"_index":1460,"t":{"201":{"position":[[1102,4]]},"281":{"position":[[1633,4]]}}}],["203172",{"_index":1476,"t":{"201":{"position":[[1330,6]]}}}],["2066257538",{"_index":1946,"t":{"269":{"position":[[1241,11]]}}}],["2085004",{"_index":1474,"t":{"201":{"position":[[1290,7],[1373,7],[1455,7],[1538,7],[1621,7],[1703,7],[1786,7],[1869,7],[1952,7],[2035,7],[2118,7],[2201,7],[2284,7],[2367,7],[2450,7]]}}}],["21",{"_index":1505,"t":{"201":{"position":[[2497,2]]}}}],["218473",{"_index":1492,"t":{"201":{"position":[[1992,6]]}}}],["22",{"_index":1458,"t":{"201":{"position":[[1086,2],[1149,2],[1208,2],[1263,2],[1341,2],[1423,2],[1506,2],[1589,2],[1671,2],[1754,2],[1837,2],[1920,2],[2003,2],[2086,2],[2169,2],[2252,2],[2335,2],[2418,2]]}}}],["22.log",{"_index":1462,"t":{"201":{"position":[[1110,6]]}}}],["2333",{"_index":3005,"t":{"579":{"position":[[337,4],[393,4]]},"586":{"position":[[209,4],[254,4]]}}}],["2334",{"_index":3006,"t":{"579":{"position":[[350,4],[406,4]]},"586":{"position":[[222,4],[267,4]]}}}],["2335",{"_index":2938,"t":{"526":{"position":[[24,4]]},"555":{"position":[[234,4]]},"579":{"position":[[233,4]]},"586":{"position":[[116,4]]}}}],["25",{"_index":2983,"t":{"559":{"position":[[2634,3]]}}}],["262333",{"_index":1490,"t":{"201":{"position":[[1909,6]]}}}],["2861242",{"_index":1472,"t":{"201":{"position":[[1251,7]]}}}],["297",{"_index":2528,"t":{"383":{"position":[[1383,4]]}}}],["2>&1",{"_index":1735,"t":{"238":{"position":[[290,4]]},"240":{"position":[[1008,4]]}}}],["2mb",{"_index":2350,"t":{"365":{"position":[[241,3]]}}}],["3",{"_index":1270,"t":{"176":{"position":[[554,1],[613,1],[672,1],[731,1],[790,1]]},"240":{"position":[[2577,3],[2627,3]]},"486":{"position":[[327,2],[453,2]]},"559":{"position":[[2917,2]]}}}],["3.12",{"_index":2602,"t":{"405":{"position":[[118,4]]}}}],["3.5mb",{"_index":1537,"t":{"203":{"position":[[1468,5]]}}}],["3.7",{"_index":2424,"t":{"379":{"position":[[2392,3]]},"477":{"position":[[1947,3]]}}}],["3.82",{"_index":2518,"t":{"383":{"position":[[1140,4]]}}}],["30",{"_index":1971,"t":{"275":{"position":[[436,2]]}}}],["300000",{"_index":2620,"t":{"421":{"position":[[272,6],[351,6]]}}}],["3000000",{"_index":2923,"t":{"505":{"position":[[494,9]]}}}],["30000000",{"_index":701,"t":{"83":{"position":[[9479,8]]},"505":{"position":[[254,10],[705,10]]},"516":{"position":[[2899,8]]}}}],["30303/tcp+udp",{"_index":2274,"t":{"344":{"position":[[267,13]]}}}],["304917",{"_index":1496,"t":{"201":{"position":[[2158,6]]}}}],["30gb",{"_index":2347,"t":{"365":{"position":[[163,4]]}}}],["31",{"_index":2376,"t":{"379":{"position":[[525,2],[652,2],[739,2],[951,2],[1016,2],[1089,2],[1170,2],[1241,2],[1317,2],[1433,2],[1779,2],[1909,2],[2002,2],[2086,2],[2261,2],[2358,2],[2558,2],[2756,2],[2821,2],[2883,2],[3036,2],[3189,2]]},"477":{"position":[[80,2],[207,2],[294,2],[506,2],[571,2],[644,2],[725,2],[796,2],[872,2],[988,2],[1334,2],[1464,2],[1557,2],[1641,2],[1816,2],[1913,2],[2113,2],[2311,2],[2376,2],[2438,2],[2591,2],[2744,2]]}}}],["32",{"_index":100,"t":{"9":{"position":[[238,2]]},"83":{"position":[[8980,2]]},"373":{"position":[[27,2],[227,3]]},"427":{"position":[[379,2]]},"439":{"position":[[179,2]]},"516":{"position":[[2049,2]]}}}],["32bit",{"_index":1630,"t":{"228":{"position":[[628,5],[676,7]]}}}],["3450",{"_index":67,"t":{"7":{"position":[[139,4]]},"431":{"position":[[64,4]]}}}],["360",{"_index":2519,"t":{"383":{"position":[[1184,4]]}}}],["366788",{"_index":1494,"t":{"201":{"position":[[2075,6]]}}}],["381",{"_index":400,"t":{"64":{"position":[[113,3]]}}}],["4",{"_index":98,"t":{"9":{"position":[[225,1]]},"467":{"position":[[1136,2]]}}}],["4.01",{"_index":2435,"t":{"379":{"position":[[2610,4]]},"477":{"position":[[2165,4]]}}}],["4.33",{"_index":2526,"t":{"383":{"position":[[1339,4]]}}}],["4.4mb",{"_index":1539,"t":{"203":{"position":[[1510,6]]}}}],["420809",{"_index":1480,"t":{"201":{"position":[[1495,6]]}}}],["421",{"_index":1465,"t":{"201":{"position":[[1141,3]]}}}],["44",{"_index":2437,"t":{"379":{"position":[[2654,3]]},"477":{"position":[[2209,3]]}}}],["45",{"_index":2536,"t":{"383":{"position":[[1580,3]]}}}],["450675",{"_index":1500,"t":{"201":{"position":[[2324,6]]}}}],["4700",{"_index":70,"t":{"7":{"position":[[178,4]]},"431":{"position":[[103,4]]}}}],["4gb",{"_index":2352,"t":{"365":{"position":[[276,3]]}}}],["5",{"_index":66,"t":{"7":{"position":[[137,1]]},"83":{"position":[[2777,1]]},"289":{"position":[[1216,1]]},"320":{"position":[[2777,1]]},"383":{"position":[[1280,1]]},"387":{"position":[[2065,1]]},"421":{"position":[[318,1]]},"431":{"position":[[62,1]]},"465":{"position":[[2605,3]]},"516":{"position":[[1216,1]]}}}],["5.00",{"_index":2534,"t":{"383":{"position":[[1536,4]]}}}],["50",{"_index":1943,"t":{"269":{"position":[[1051,4]]}}}],["5062",{"_index":670,"t":{"83":{"position":[[8500,4]]},"516":{"position":[[1569,4]]}}}],["5062/tcp",{"_index":2278,"t":{"344":{"position":[[499,8]]}}}],["5064",{"_index":628,"t":{"83":{"position":[[6194,4]]},"516":{"position":[[5403,4]]}}}],["5064/tcp",{"_index":2282,"t":{"344":{"position":[[612,8]]}}}],["515",{"_index":2428,"t":{"379":{"position":[[2455,4]]},"477":{"position":[[2010,4]]}}}],["5375718",{"_index":236,"t":{"16":{"position":[[2885,7],[2902,8]]}}}],["559",{"_index":1504,"t":{"201":{"position":[[2489,3]]}}}],["56",{"_index":1269,"t":{"176":{"position":[[549,2],[608,2],[667,2],[726,2],[785,2],[844,2],[909,2],[975,2]]}}}],["576",{"_index":2414,"t":{"379":{"position":[[2168,4]]},"477":{"position":[[1723,4]]}}}],["586238",{"_index":1498,"t":{"201":{"position":[[2241,6]]}}}],["59",{"_index":2442,"t":{"379":{"position":[[2749,2]]},"477":{"position":[[2304,2]]}}}],["6",{"_index":2549,"t":{"383":{"position":[[1954,1],[2106,1]]},"465":{"position":[[2613,4]]},"469":{"position":[[1715,4]]}}}],["6.007",{"_index":232,"t":{"16":{"position":[[2835,5]]}}}],["6.4",{"_index":2912,"t":{"500":{"position":[[499,4]]}}}],["60",{"_index":1508,"t":{"203":{"position":[[42,2],[1219,2],[1488,2]]}}}],["60000",{"_index":637,"t":{"83":{"position":[[6582,5]]},"320":{"position":[[6442,5]]},"421":{"position":[[190,5]]},"516":{"position":[[5791,5]]}}}],["6045",{"_index":1842,"t":{"255":{"position":[[628,5]]}}}],["6262966",{"_index":2509,"t":{"383":{"position":[[789,7]]}}}],["6263965",{"_index":2515,"t":{"383":{"position":[[982,7]]}}}],["6264018",{"_index":2498,"t":{"383":{"position":[[432,7],[603,7]]}}}],["6264966",{"_index":2508,"t":{"383":{"position":[[773,7]]}}}],["6264967",{"_index":2514,"t":{"383":{"position":[[966,7],[1161,7]]}}}],["6264968",{"_index":2527,"t":{"383":{"position":[[1360,7]]}}}],["6264972",{"_index":2535,"t":{"383":{"position":[[1557,7]]}}}],["6264973",{"_index":2544,"t":{"383":{"position":[[1847,7]]}}}],["6264974",{"_index":2551,"t":{"383":{"position":[[1999,7]]}}}],["6264976",{"_index":2556,"t":{"383":{"position":[[2151,7]]}}}],["6264977",{"_index":2561,"t":{"383":{"position":[[2313,7]]}}}],["6264978",{"_index":2563,"t":{"383":{"position":[[2475,7]]}}}],["6264979",{"_index":2568,"t":{"383":{"position":[[2627,7]]}}}],["6265018",{"_index":2497,"t":{"383":{"position":[[416,7]]}}}],["6265019",{"_index":2504,"t":{"383":{"position":[[587,7]]}}}],["64",{"_index":2357,"t":{"373":{"position":[[35,3]]},"439":{"position":[[370,2]]},"441":{"position":[[62,2]]}}}],["68044",{"_index":1478,"t":{"201":{"position":[[1413,5]]}}}],["69",{"_index":2457,"t":{"379":{"position":[[3182,2]]},"477":{"position":[[2737,2]]}}}],["7",{"_index":69,"t":{"7":{"position":[[176,1]]},"383":{"position":[[2734,1]]},"431":{"position":[[101,1]]}}}],["70",{"_index":2451,"t":{"379":{"position":[[3029,2]]},"477":{"position":[[2584,2]]}}}],["72",{"_index":1267,"t":{"176":{"position":[[533,2]]},"275":{"position":[[455,2]]}}}],["73",{"_index":1273,"t":{"176":{"position":[[592,2]]}}}],["74",{"_index":1276,"t":{"176":{"position":[[651,2]]},"379":{"position":[[3335,2]]},"477":{"position":[[2890,2]]}}}],["75",{"_index":1279,"t":{"176":{"position":[[710,2]]}}}],["76",{"_index":1282,"t":{"176":{"position":[[769,2]]}}}],["768470",{"_index":1502,"t":{"201":{"position":[[2407,6]]}}}],["77",{"_index":1285,"t":{"176":{"position":[[828,2]]}}}],["777",{"_index":1533,"t":{"203":{"position":[[1302,3]]}}}],["778",{"_index":202,"t":{"16":{"position":[[1619,4]]},"334":{"position":[[93,3]]}}}],["78",{"_index":1289,"t":{"176":{"position":[[893,2]]}}}],["79",{"_index":1293,"t":{"176":{"position":[[958,2]]}}}],["8",{"_index":72,"t":{"7":{"position":[[190,1]]},"16":{"position":[[604,1],[682,1],[1791,1]]},"81":{"position":[[32,1],[88,1]]},"83":{"position":[[11871,1]]},"176":{"position":[[1409,1]]},"383":{"position":[[1675,1],[2268,1],[2430,1],[2582,1]]},"431":{"position":[[115,1]]}}}],["80",{"_index":2985,"t":{"559":{"position":[[2698,2]]}}}],["8008",{"_index":2188,"t":{"320":{"position":[[6054,4]]},"387":{"position":[[2227,4]]},"494":{"position":[[271,4]]}}}],["8008/tcp",{"_index":2281,"t":{"344":{"position":[[576,8]]}}}],["8080",{"_index":2122,"t":{"295":{"position":[[2406,4]]}}}],["8545",{"_index":2471,"t":{"379":{"position":[[4069,4]]}}}],["8545/tcp",{"_index":2283,"t":{"344":{"position":[[646,8]]}}}],["8551",{"_index":2356,"t":{"371":{"position":[[117,5]]},"439":{"position":[[155,5],[513,5]]}}}],["8551/tcp",{"_index":2284,"t":{"344":{"position":[[688,8]]}}}],["8gb",{"_index":1829,"t":{"253":{"position":[[59,3]]}}}],["8hw2gbkazdzmww3lshjfp_kdhi",{"_index":2401,"t":{"379":{"position":[[1694,26]]},"477":{"position":[[1249,26]]}}}],["9",{"_index":1738,"t":{"238":{"position":[[531,2]]},"383":{"position":[[1519,1]]}}}],["9/0",{"_index":1266,"t":{"176":{"position":[[527,3]]}}}],["9/1",{"_index":1272,"t":{"176":{"position":[[586,3]]}}}],["9/2",{"_index":1275,"t":{"176":{"position":[[645,3]]}}}],["9/3",{"_index":1278,"t":{"176":{"position":[[704,3]]}}}],["9/4",{"_index":1281,"t":{"176":{"position":[[763,3]]}}}],["9/5",{"_index":1284,"t":{"176":{"position":[[822,3]]}}}],["9/6",{"_index":1288,"t":{"176":{"position":[[887,3]]}}}],["9/7",{"_index":1292,"t":{"176":{"position":[[952,3]]}}}],["90",{"_index":2926,"t":{"505":{"position":[[751,4]]}}}],["9000",{"_index":156,"t":{"16":{"position":[[769,4]]},"83":{"position":[[6867,4]]},"320":{"position":[[6727,4]]},"387":{"position":[[813,4]]}}}],["9000/tcp+udp",{"_index":2275,"t":{"344":{"position":[[322,12]]}}}],["9001",{"_index":209,"t":{"16":{"position":[[1858,4]]}}}],["9090",{"_index":649,"t":{"83":{"position":[[7188,4]]},"320":{"position":[[7048,4]]},"387":{"position":[[956,4]]}}}],["9090/tcp+udp",{"_index":2276,"t":{"344":{"position":[[377,12]]}}}],["917504",{"_index":1470,"t":{"201":{"position":[[1197,6]]}}}],["94391",{"_index":1484,"t":{"201":{"position":[[1661,5]]}}}],["9596",{"_index":538,"t":{"83":{"position":[[3372,4]]},"320":{"position":[[3372,4]]},"379":{"position":[[4077,4]]}}}],["9596/tcp",{"_index":2277,"t":{"344":{"position":[[462,8]]}}}],["9597",{"_index":211,"t":{"16":{"position":[[1877,4]]}}}],["9634080",{"_index":2413,"t":{"379":{"position":[[2145,7]]},"477":{"position":[[1700,7]]}}}],["9634082",{"_index":2427,"t":{"379":{"position":[[2432,7]]},"477":{"position":[[1987,7]]}}}],["9634092",{"_index":2436,"t":{"379":{"position":[[2631,7]]},"477":{"position":[[2186,7]]}}}],["9634093",{"_index":2446,"t":{"379":{"position":[[2922,7]]},"477":{"position":[[2477,7]]}}}],["9634094",{"_index":2453,"t":{"379":{"position":[[3075,7]]},"477":{"position":[[2630,7]]}}}],["9634095",{"_index":2459,"t":{"379":{"position":[[3228,7]]},"477":{"position":[[2783,7]]}}}],["9701529",{"_index":1457,"t":{"201":{"position":[[1074,7]]}}}],["99",{"_index":1516,"t":{"203":{"position":[[498,2],[1136,2]]}}}],["997hz",{"_index":1522,"t":{"203":{"position":[[667,5],[1478,5]]}}}],["99hz",{"_index":1521,"t":{"203":{"position":[[659,4],[1415,4]]}}}],["9]{40",{"_index":558,"t":{"83":{"position":[[3659,9]]},"320":{"position":[[3645,8]]},"516":{"position":[[2439,9]]}}}],["_",{"_index":984,"t":{"119":{"position":[[807,1]]}}}],["__libc_start",{"_index":1566,"t":{"211":{"position":[[333,13]]}}}],["_byte",{"_index":1006,"t":{"119":{"position":[[1753,6]]}}}],["_dirti",{"_index":986,"t":{"119":{"position":[[843,7]]}}}],["_second",{"_index":1005,"t":{"119":{"position":[[1741,8]]}}}],["a+r",{"_index":2677,"t":{"434":{"position":[[357,3]]}}}],["a57ca19d47bb",{"_index":1577,"t":{"216":{"position":[[150,12]]}}}],["ab",{"_index":2794,"t":{"471":{"position":[[1521,4]]}}}],["abbrevi",{"_index":1087,"t":{"132":{"position":[[453,14]]}}}],["abil",{"_index":2612,"t":{"415":{"position":[[17,7]]}}}],["abov",{"_index":94,"t":{"9":{"position":[[112,5]]},"18":{"position":[[145,6]]},"32":{"position":[[104,5]]},"83":{"position":[[7421,5]]},"103":{"position":[[167,5]]},"199":{"position":[[393,5]]},"297":{"position":[[407,5]]},"320":{"position":[[7281,5]]},"346":{"position":[[107,6]]},"455":{"position":[[1037,5]]},"465":{"position":[[2331,5]]},"469":{"position":[[2394,5]]},"551":{"position":[[95,5]]},"555":{"position":[[86,6]]}}}],["absolut",{"_index":2489,"t":{"381":{"position":[[2399,10]]}}}],["acceler",{"_index":2468,"t":{"379":{"position":[[3806,10]]}}}],["accept",{"_index":445,"t":{"83":{"position":[[346,8]]},"113":{"position":[[644,10]]},"228":{"position":[[1173,7]]},"289":{"position":[[346,8]]},"320":{"position":[[346,8]]},"387":{"position":[[346,8]]},"516":{"position":[[346,8]]},"559":{"position":[[2386,6],[2606,6]]}}}],["access",{"_index":388,"t":{"60":{"position":[[128,6]]},"83":{"position":[[3164,6],[8624,6]]},"132":{"position":[[305,10]]},"226":{"position":[[31,6]]},"257":{"position":[[705,6],[809,9],[1036,10]]},"261":{"position":[[0,6]]},"269":{"position":[[549,6],[994,6]]},"295":{"position":[[1371,10]]},"320":{"position":[[3164,6]]},"344":{"position":[[203,6]]},"423":{"position":[[1048,6]]},"498":{"position":[[347,8],[513,6]]},"516":{"position":[[1693,6]]}}}],["accommod",{"_index":930,"t":{"113":{"position":[[785,11]]}}}],["accordingli",{"_index":1104,"t":{"134":{"position":[[916,12]]}}}],["account",{"_index":2615,"t":{"415":{"position":[[297,7]]},"419":{"position":[[272,7]]}}}],["accur",{"_index":2069,"t":{"281":{"position":[[1904,8]]}}}],["accuraci",{"_index":2642,"t":{"423":{"position":[[1352,8]]},"488":{"position":[[150,9],[485,9]]}}}],["achiev",{"_index":1216,"t":{"168":{"position":[[294,7]]},"253":{"position":[[261,7]]}}}],["act",{"_index":2220,"t":{"332":{"position":[[751,3]]}}}],["action",{"_index":321,"t":{"38":{"position":[[74,7]]},"126":{"position":[[582,6]]},"154":{"position":[[861,10]]},"192":{"position":[[537,8]]},"277":{"position":[[639,7]]},"488":{"position":[[959,6]]}}}],["activ",{"_index":453,"t":{"83":{"position":[[628,10]]},"275":{"position":[[549,8]]},"289":{"position":[[628,10]]},"320":{"position":[[628,10]]},"338":{"position":[[1056,8],[1186,6]]},"353":{"position":[[332,11]]},"387":{"position":[[628,10]]},"392":{"position":[[59,9]]},"395":{"position":[[486,6]]},"411":{"position":[[3,8]]},"425":{"position":[[61,8]]},"471":{"position":[[2118,9]]},"516":{"position":[[628,10]]}}}],["active=2",{"_index":2842,"t":{"479":{"position":[[1943,9]]},"563":{"position":[[1765,9]]}}}],["actual",{"_index":298,"t":{"32":{"position":[[35,6]]},"54":{"position":[[159,6]]},"103":{"position":[[307,6]]},"105":{"position":[[135,6]]},"188":{"position":[[1789,8]]},"228":{"position":[[886,6]]},"232":{"position":[[1838,8]]},"240":{"position":[[2296,6]]},"281":{"position":[[1929,6]]},"295":{"position":[[751,6]]},"361":{"position":[[67,8]]}}}],["actuat",{"_index":1160,"t":{"154":{"position":[[135,7]]},"168":{"position":[[131,8]]}}}],["ad",{"_index":1173,"t":{"154":{"position":[[707,5]]},"172":{"position":[[123,5],[246,5],[312,5],[367,5],[771,5],[929,5]]},"178":{"position":[[449,5]]},"184":{"position":[[217,6]]},"186":{"position":[[77,6]]},"201":{"position":[[429,5]]},"467":{"position":[[914,5]]},"475":{"position":[[242,6]]},"500":{"position":[[308,6]]},"557":{"position":[[735,5]]}}}],["adapt",{"_index":1323,"t":{"184":{"position":[[192,5]]},"257":{"position":[[1119,9]]},"342":{"position":[[436,9]]},"413":{"position":[[16,5]]},"423":{"position":[[279,10]]}}}],["add",{"_index":93,"t":{"9":{"position":[[96,3]]},"18":{"position":[[75,3]]},"115":{"position":[[342,3]]},"119":{"position":[[1445,3],[1712,3]]},"121":{"position":[[492,3],[735,3]]},"172":{"position":[[199,3]]},"186":{"position":[[270,3]]},"194":{"position":[[1170,3]]},"199":{"position":[[485,3]]},"234":{"position":[[1206,4]]},"238":{"position":[[525,3]]},"255":{"position":[[406,4]]},"269":{"position":[[1305,3]]},"375":{"position":[[73,3]]},"434":{"position":[[71,3],[390,3]]},"457":{"position":[[335,3]]},"496":{"position":[[119,3]]},"557":{"position":[[464,3]]}}}],["addit",{"_index":262,"t":{"18":{"position":[[108,8]]},"115":{"position":[[809,10]]},"184":{"position":[[224,10]]},"201":{"position":[[580,8]]},"326":{"position":[[137,10],[246,10]]},"342":{"position":[[374,9]]},"387":{"position":[[974,10],[1066,10]]},"507":{"position":[[96,10]]}}}],["address",{"_index":554,"t":{"83":{"position":[[3638,8],[6225,7],[6666,7],[7004,7],[8125,9],[8725,9]]},"124":{"position":[[359,9]]},"188":{"position":[[733,10]]},"201":{"position":[[486,10]]},"228":{"position":[[800,7]]},"281":{"position":[[2226,7]]},"295":{"position":[[579,7],[719,10],[2021,7],[2161,10]]},"320":{"position":[[3624,8],[6085,7],[6526,7],[6864,7],[7985,9]]},"326":{"position":[[312,8]]},"332":{"position":[[285,10]]},"334":{"position":[[231,8]]},"342":{"position":[[801,11]]},"350":{"position":[[73,10]]},"387":{"position":[[684,7],[845,7],[1483,9],[2258,7]]},"419":{"position":[[592,7]]},"443":{"position":[[195,8],[242,7],[309,7],[384,7],[448,7]]},"455":{"position":[[946,7]]},"484":{"position":[[302,7]]},"516":{"position":[[1794,9],[2418,8],[5434,7]]},"520":{"position":[[71,9]]},"524":{"position":[[71,9]]},"546":{"position":[[118,7],[297,7]]},"557":{"position":[[151,8],[204,8],[261,7],[343,7],[407,7],[682,7],[829,8]]},"561":{"position":[[134,7]]}}}],["address=http://0.0.0.0:9596",{"_index":2411,"t":{"379":{"position":[[2054,27]]},"477":{"position":[[1609,27]]}}}],["address=http://127.0.0.1:8008",{"_index":2409,"t":{"379":{"position":[[1968,29]]},"477":{"position":[[1523,29]]}}}],["adher",{"_index":375,"t":{"52":{"position":[[67,8]]},"115":{"position":[[193,8]]}}}],["adjust",{"_index":1527,"t":{"203":{"position":[[839,6],[1030,6]]},"421":{"position":[[18,6]]}}}],["admin",{"_index":1456,"t":{"201":{"position":[[1062,5],[1068,5],[1130,5],[1185,5],[1191,5],[1239,5],[1245,5],[1318,5],[1324,5],[1401,5],[1407,5],[1483,5],[1489,5],[1566,5],[1572,5],[1649,5],[1655,5],[1731,5],[1737,5],[1814,5],[1820,5],[1897,5],[1903,5],[1980,5],[1986,5],[2063,5],[2069,5],[2146,5],[2152,5],[2229,5],[2235,5],[2312,5],[2318,5],[2395,5],[2401,5],[2478,5]]}}}],["admin@12.34.56.78",{"_index":1445,"t":{"201":{"position":[[362,18]]},"203":{"position":[[1097,18],[1222,18],[1272,18]]}}}],["admin@12.34.56.78:/home/devops/beacon/out.perf",{"_index":1540,"t":{"203":{"position":[[1521,46]]}}}],["adopt",{"_index":2056,"t":{"281":{"position":[[1299,8]]}}}],["advanc",{"_index":2795,"t":{"471":{"position":[[1579,7]]}}}],["advantag",{"_index":1746,"t":{"240":{"position":[[77,10],[133,9]]}}}],["advers",{"_index":2059,"t":{"281":{"position":[[1544,11]]}}}],["advertis",{"_index":2218,"t":{"332":{"position":[[697,13]]}}}],["advic",{"_index":2639,"t":{"423":{"position":[[1314,7]]},"488":{"position":[[97,7]]}}}],["affect",{"_index":1525,"t":{"203":{"position":[[750,6]]}}}],["afford",{"_index":2039,"t":{"281":{"position":[[613,8]]}}}],["afterward",{"_index":1977,"t":{"275":{"position":[[517,10]]}}}],["again",{"_index":1757,"t":{"240":{"position":[[733,6]]}}}],["against",{"_index":715,"t":{"83":{"position":[[9817,7]]},"105":{"position":[[375,7]]},"203":{"position":[[948,8]]},"257":{"position":[[308,7]]},"281":{"position":[[338,7],[1536,7],[2583,7]]},"516":{"position":[[3379,7]]},"559":{"position":[[425,7],[2413,7]]}}}],["aggreg",{"_index":301,"t":{"32":{"position":[[83,9]]},"113":{"position":[[980,9]]},"579":{"position":[[67,9],[151,9]]},"586":{"position":[[45,9]]}}}],["agreement",{"_index":914,"t":{"113":{"position":[[454,9]]}}}],["aid",{"_index":1349,"t":{"188":{"position":[[522,3]]}}}],["aim",{"_index":1156,"t":{"152":{"position":[[54,3]]},"355":{"position":[[277,3]]},"383":{"position":[[29,4]]}}}],["alchemi",{"_index":2185,"t":{"303":{"position":[[179,8]]}}}],["alert",{"_index":2887,"t":{"490":{"position":[[96,8]]}}}],["alia",{"_index":609,"t":{"83":{"position":[[5461,5]]},"124":{"position":[[915,5]]},"395":{"position":[[368,5]]},"471":{"position":[[928,5]]},"516":{"position":[[2922,5]]},"559":{"position":[[1086,5],[1311,5],[1722,5]]}}}],["alloc",{"_index":1604,"t":{"224":{"position":[[737,9],[905,9]]},"234":{"position":[[523,11],[1191,10],[1424,11],[1615,12]]},"240":{"position":[[270,11],[3051,12]]},"484":{"position":[[390,10]]}}}],["allocations/d",{"_index":1749,"t":{"240":{"position":[[255,14]]}}}],["allow",{"_index":225,"t":{"16":{"position":[[2589,5]]},"83":{"position":[[3179,5],[5949,7],[8092,5],[8639,5]]},"134":{"position":[[306,5]]},"154":{"position":[[736,5]]},"186":{"position":[[158,6]]},"199":{"position":[[527,5],[653,5]]},"203":{"position":[[296,5]]},"205":{"position":[[74,6]]},"234":{"position":[[1523,6]]},"236":{"position":[[947,5]]},"257":{"position":[[1227,5]]},"293":{"position":[[68,8]]},"295":{"position":[[1332,5]]},"320":{"position":[[3179,5],[5824,7],[7952,5]]},"338":{"position":[[1170,6]]},"342":{"position":[[354,6]]},"344":{"position":[[88,5]]},"348":{"position":[[408,6]]},"353":{"position":[[43,6],[257,8]]},"359":{"position":[[48,6]]},"381":{"position":[[664,5]]},"385":{"position":[[114,6]]},"387":{"position":[[1446,5]]},"423":{"position":[[612,6]]},"443":{"position":[[97,6]]},"445":{"position":[[259,6]]},"455":{"position":[[300,6]]},"465":{"position":[[189,5]]},"498":{"position":[[152,6]]},"503":{"position":[[248,5]]},"516":{"position":[[1708,5]]},"555":{"position":[[993,5],[1107,5]]},"557":{"position":[[69,6]]},"583":{"position":[[478,8]]}}}],["allowforcedupd",{"_index":1915,"t":{"267":{"position":[[848,19]]}}}],["alon",{"_index":1214,"t":{"168":{"position":[[230,5]]}}}],["along",{"_index":1171,"t":{"154":{"position":[[623,5]]},"164":{"position":[[377,5]]},"226":{"position":[[518,5]]},"244":{"position":[[195,5]]},"359":{"position":[[410,5]]},"409":{"position":[[274,5]]},"475":{"position":[[91,5],[224,5]]}}}],["alongsid",{"_index":2890,"t":{"492":{"position":[[248,9]]}}}],["alpha",{"_index":689,"t":{"83":{"position":[[9172,5]]},"503":{"position":[[19,5]]},"516":{"position":[[2241,5]]}}}],["alphabet",{"_index":288,"t":{"26":{"position":[[131,12]]},"62":{"position":[[33,15]]},"279":{"position":[[239,12]]}}}],["alreadi",{"_index":224,"t":{"16":{"position":[[2462,7]]},"103":{"position":[[79,7]]},"236":{"position":[[701,7]]},"295":{"position":[[927,7]]},"367":{"position":[[213,7]]},"457":{"position":[[25,7]]}}}],["altair",{"_index":1879,"t":{"257":{"position":[[1180,6]]}}}],["alter",{"_index":2294,"t":{"350":{"position":[[399,8]]}}}],["altern",{"_index":2184,"t":{"303":{"position":[[149,12]]},"334":{"position":[[898,14]]},"500":{"position":[[631,14]]},"553":{"position":[[155,14]]}}}],["although",{"_index":924,"t":{"113":{"position":[[670,8]]},"238":{"position":[[567,8]]},"348":{"position":[[336,8]]}}}],["alway",{"_index":850,"t":{"105":{"position":[[14,6]]},"188":{"position":[[861,6]]},"299":{"position":[[262,6]]},"419":{"position":[[632,6]]},"559":{"position":[[1133,6],[1621,6],[2788,6],[3036,6]]}}}],["amd",{"_index":64,"t":{"7":{"position":[[127,3],[166,3]]},"431":{"position":[[52,3],[91,3]]}}}],["amd64",{"_index":2652,"t":{"427":{"position":[[152,5]]}}}],["amongst",{"_index":179,"t":{"16":{"position":[[1172,7]]}}}],["amount",{"_index":1663,"t":{"232":{"position":[[470,6]]},"338":{"position":[[410,7]]},"365":{"position":[[130,8]]},"421":{"position":[[468,7]]}}}],["analysi",{"_index":1333,"t":{"188":{"position":[[10,8],[241,8],[1033,9],[1158,9],[1356,8],[1768,9]]},"190":{"position":[[131,8]]},"205":{"position":[[90,8]]},"216":{"position":[[205,9]]},"226":{"position":[[201,8]]},"228":{"position":[[950,8]]},"232":{"position":[[0,8]]},"234":{"position":[[64,8],[167,9],[479,9],[692,8],[1730,9],[1821,8]]},"244":{"position":[[1870,8]]},"355":{"position":[[373,8]]}}}],["analyz",{"_index":1558,"t":{"209":{"position":[[127,9]]},"224":{"position":[[415,9],[1217,7]]},"226":{"position":[[71,9]]},"230":{"position":[[14,7]]},"240":{"position":[[2156,7]]}}}],["andrea",{"_index":2085,"t":{"283":{"position":[[67,7]]}}}],["annot",{"_index":339,"t":{"40":{"position":[[305,9],[344,9]]}}}],["announc",{"_index":2227,"t":{"334":{"position":[[507,8],[665,9]]},"425":{"position":[[203,13],[265,13]]}}}],["anomali",{"_index":2467,"t":{"379":{"position":[[3776,10]]}}}],["anoth",{"_index":1668,"t":{"232":{"position":[[879,7]]},"359":{"position":[[8,7]]},"385":{"position":[[158,8]]},"395":{"position":[[549,7]]},"455":{"position":[[120,7]]},"465":{"position":[[403,7]]},"469":{"position":[[1731,7],[1760,7]]}}}],["antonopoulo",{"_index":2087,"t":{"283":{"position":[[78,12]]}}}],["anyth",{"_index":716,"t":{"83":{"position":[[9901,8]]},"516":{"position":[[3463,8]]},"559":{"position":[[509,8]]}}}],["apach",{"_index":1951,"t":{"273":{"position":[[0,6]]},"313":{"position":[[0,6]]}}}],["api",{"_index":296,"t":{"30":{"position":[[75,4]]},"60":{"position":[[231,3],[299,3]]},"83":{"position":[[810,4],[2807,3],[2892,4],[3213,3],[3277,3],[3346,3],[3417,3],[3759,4],[4483,3],[4605,3],[4718,3],[4857,3],[5174,5],[5429,4],[5628,3],[5733,3],[8182,3],[8277,3],[8398,3],[8474,3],[8552,3],[8680,3]]},"99":{"position":[[684,4]]},"115":{"position":[[376,3]]},"121":{"position":[[140,4]]},"124":{"position":[[846,4]]},"150":{"position":[[152,3],[332,3]]},"172":{"position":[[585,3],[636,3],[755,3]]},"228":{"position":[[1024,3]]},"261":{"position":[[147,3]]},"267":{"position":[[541,3]]},"289":{"position":[[1280,3]]},"320":{"position":[[810,4],[2807,3],[2892,4],[3213,3],[3277,3],[3346,3],[3417,3],[4450,3],[4572,3],[4685,3],[4824,3],[5141,5],[5396,4],[5503,3],[5608,3]]},"322":{"position":[[703,4]]},"324":{"position":[[64,4]]},"334":{"position":[[964,3]]},"344":{"position":[[490,3],[532,3]]},"371":{"position":[[58,3]]},"379":{"position":[[2043,3],[3946,4]]},"419":{"position":[[243,3]]},"439":{"position":[[143,3]]},"477":{"position":[[1598,3]]},"498":{"position":[[371,3],[393,3]]},"507":{"position":[[272,3]]},"516":{"position":[[1251,3],[1346,3],[1467,3],[1543,3],[1621,3],[1749,3],[2539,4]]},"557":{"position":[[964,4]]},"559":{"position":[[709,4],[2204,3]]},"583":{"position":[[322,3],[352,3]]}}}],["api'",{"_index":1212,"t":{"168":{"position":[[103,6]]}}}],["app",{"_index":2614,"t":{"415":{"position":[[262,3]]}}}],["appar",{"_index":1667,"t":{"232":{"position":[[835,8]]}}}],["appear",{"_index":2693,"t":{"434":{"position":[[1121,7]]}}}],["append",{"_index":1635,"t":{"228":{"position":[[911,7]]}}}],["appendix",{"_index":2662,"t":{"431":{"position":[[448,8]]}}}],["appli",{"_index":279,"t":{"24":{"position":[[169,7]]},"83":{"position":[[9744,5]]},"134":{"position":[[447,5],[634,7],[764,7]]},"431":{"position":[[413,7]]},"481":{"position":[[73,5]]},"516":{"position":[[3306,5]]},"559":{"position":[[352,5],[622,7]]}}}],["applic",{"_index":954,"t":{"115":{"position":[[701,10]]},"124":{"position":[[147,11],[392,11]]},"146":{"position":[[92,13]]},"224":{"position":[[801,12]]},"228":{"position":[[513,11]]},"232":{"position":[[1325,11]]},"234":{"position":[[885,11]]},"240":{"position":[[682,12],[1759,11]]},"244":{"position":[[2197,13]]},"295":{"position":[[943,11]]}}}],["applications/kde/heaptrack_gui.app",{"_index":1825,"t":{"244":{"position":[[2237,35]]}}}],["appreci",{"_index":925,"t":{"113":{"position":[[682,10],[916,11]]},"203":{"position":[[738,11]]}}}],["approach",{"_index":1000,"t":{"119":{"position":[[1508,10]]},"164":{"position":[[407,9]]},"182":{"position":[[30,10]]},"240":{"position":[[114,9]]},"257":{"position":[[797,8]]},"338":{"position":[[1161,8]]},"350":{"position":[[1044,8]]},"490":{"position":[[105,9]]}}}],["appropri",{"_index":1245,"t":{"172":{"position":[[507,11]]},"253":{"position":[[153,11]]},"498":{"position":[[455,11]]},"559":{"position":[[1003,11]]}}}],["apr",{"_index":2495,"t":{"383":{"position":[[353,3],[524,3],[695,3],[890,3],[1083,3],[1282,3],[1481,3],[1677,3],[1742,3],[1804,3],[1956,3],[2108,3],[2270,3],[2432,3],[2584,3]]}}}],["apt",{"_index":1434,"t":{"199":{"position":[[244,3],[304,3]]},"236":{"position":[[288,3],[310,3]]},"240":{"position":[[1171,3],[1193,3]]},"242":{"position":[[14,4],[19,3],[65,3],[87,3]]},"434":{"position":[[132,3],[152,3],[412,3],[789,3],[809,3],[899,3]]}}}],["aptitud",{"_index":1785,"t":{"242":{"position":[[30,8]]}}}],["arbitrag",{"_index":2192,"t":{"322":{"position":[[102,9]]}}}],["arbitrari",{"_index":1050,"t":{"126":{"position":[[252,9]]}}}],["arch=$(dpkg",{"_index":2680,"t":{"434":{"position":[[478,12]]}}}],["architectur",{"_index":2681,"t":{"434":{"position":[[499,13]]}}}],["arg",{"_index":444,"t":{"83":{"position":[[340,5]]},"289":{"position":[[340,5]]},"320":{"position":[[340,5]]},"387":{"position":[[340,5]]},"469":{"position":[[2304,6]]},"516":{"position":[[340,5]]}}}],["args.sh",{"_index":2698,"t":{"441":{"position":[[16,7],[42,7]]}}}],["argument",{"_index":793,"t":{"97":{"position":[[246,10]]},"184":{"position":[[235,9]]},"228":{"position":[[371,9]]},"255":{"position":[[9,9],[141,10],[172,8],[212,10],[351,9]]},"381":{"position":[[1048,9]]},"457":{"position":[[350,9]]},"471":{"position":[[748,8],[2140,9]]}}}],["aris",{"_index":2875,"t":{"488":{"position":[[698,7]]}}}],["aros",{"_index":2062,"t":{"281":{"position":[[1703,5]]}}}],["around",{"_index":1451,"t":{"201":{"position":[[877,6]]},"224":{"position":[[1144,6]]},"236":{"position":[[1485,6]]},"338":{"position":[[698,6]]},"581":{"position":[[224,6]]}}}],["array",{"_index":1617,"t":{"226":{"position":[[795,7],[899,6]]},"232":{"position":[[663,5],[678,5],[742,5]]},"257":{"position":[[1139,5]]},"297":{"position":[[562,5]]}}}],["arriv",{"_index":1308,"t":{"176":{"position":[[2194,6]]}}}],["arsen",{"_index":1669,"t":{"232":{"position":[[900,7]]}}}],["art",{"_index":1658,"t":{"232":{"position":[[23,3],[2028,3]]}}}],["articl",{"_index":2643,"t":{"423":{"position":[[1388,7],[1483,8]]},"488":{"position":[[5,7],[243,8],[559,7],[751,7],[811,8]]}}}],["artifact",{"_index":1722,"t":{"236":{"position":[[1189,9]]}}}],["ascii",{"_index":1051,"t":{"126":{"position":[[287,5]]}}}],["ask",{"_index":912,"t":{"113":{"position":[[418,5]]},"336":{"position":[[217,3]]},"542":{"position":[[128,3]]},"555":{"position":[[925,3]]}}}],["aspect",{"_index":1070,"t":{"128":{"position":[[304,6]]}}}],["ass",{"_index":1172,"t":{"154":{"position":[[640,5]]}}}],["assault",{"_index":2036,"t":{"281":{"position":[[576,8]]}}}],["assemblyscript",{"_index":3001,"t":{"577":{"position":[[167,14]]},"588":{"position":[[134,14]]}}}],["assert",{"_index":1010,"t":{"121":{"position":[[496,9],[571,9],[666,9],[704,9]]},"154":{"position":[[687,12],[1479,11]]},"170":{"position":[[321,10],[435,10]]},"172":{"position":[[100,10],[184,10],[228,10],[352,10],[481,10],[554,10],[668,6],[784,9],[840,8],[909,10],[1277,10],[1306,10]]},"174":{"position":[[61,11]]}}}],["asset",{"_index":2583,"t":{"390":{"position":[[68,6]]}}}],["assign",{"_index":2913,"t":{"503":{"position":[[126,6]]}}}],["assist",{"_index":112,"t":{"13":{"position":[[173,6]]},"411":{"position":[[416,6]]},"423":{"position":[[942,6]]}}}],["associ",{"_index":1827,"t":{"250":{"position":[[57,10]]},"255":{"position":[[493,10]]},"281":{"position":[[888,10]]},"338":{"position":[[291,10]]},"350":{"position":[[1091,10]]},"419":{"position":[[562,9]]}}}],["assum",{"_index":1423,"t":{"197":{"position":[[11,7]]},"232":{"position":[[1458,7]]},"236":{"position":[[0,6],[657,7]]},"244":{"position":[[471,7]]},"267":{"position":[[25,6]]},"326":{"position":[[730,7]]},"367":{"position":[[196,7]]},"379":{"position":[[128,6]]},"427":{"position":[[11,7]]},"471":{"position":[[240,8]]},"484":{"position":[[322,8]]}}}],["async",{"_index":1920,"t":{"267":{"position":[[1082,5],[1260,5]]}}}],["async_hook",{"_index":848,"t":{"103":{"position":[[420,13]]}}}],["att",{"_index":1295,"t":{"176":{"position":[[1108,3]]}}}],["attach",{"_index":1754,"t":{"240":{"position":[[618,9]]},"469":{"position":[[269,9],[608,10]]}}}],["attack",{"_index":1640,"t":{"228":{"position":[[1152,7]]},"281":{"position":[[398,7],[490,6],[922,7],[2618,8]]},"344":{"position":[[218,7]]},"350":{"position":[[562,9],[1118,8]]},"381":{"position":[[193,9],[231,6]]},"407":{"position":[[144,8]]},"455":{"position":[[550,8]]}}}],["attcount",{"_index":1263,"t":{"176":{"position":[[384,8],[2001,9]]}}}],["attempt",{"_index":2077,"t":{"281":{"position":[[2213,9]]},"350":{"position":[[1603,7]]}}}],["attent",{"_index":2759,"t":{"465":{"position":[[2564,9]]}}}],["attest",{"_index":1304,"t":{"176":{"position":[[2025,12],[2140,13],[2160,12]]},"277":{"position":[[734,12]]},"281":{"position":[[1714,12],[1788,13],[2002,12],[2136,12],[2277,13]]},"479":{"position":[[1999,12],[2072,12]]},"498":{"position":[[286,13]]},"563":{"position":[[1821,12],[1894,12]]}}}],["attestationparticipationassert",{"_index":1251,"t":{"172":{"position":[[1023,33]]}}}],["attestationscountassert",{"_index":1250,"t":{"172":{"position":[[996,26]]}}}],["attester_slash",{"_index":868,"t":{"105":{"position":[[708,17]]}}}],["authent",{"_index":602,"t":{"83":{"position":[[5112,14],[5371,14],[8246,14],[8402,14]]},"320":{"position":[[5079,14],[5338,14]]},"371":{"position":[[27,14]]},"373":{"position":[[91,12]]},"379":{"position":[[3983,14]]},"439":{"position":[[494,13]]},"516":{"position":[[1315,14],[1471,14]]}}}],["author",{"_index":2640,"t":{"423":{"position":[[1326,6],[1404,6]]},"488":{"position":[[109,6],[381,6],[599,6],[1020,6]]}}}],["authrpc.jwtsecret",{"_index":2364,"t":{"377":{"position":[[27,17],[402,17],[523,17]]}}}],["auto",{"_index":720,"t":{"83":{"position":[[10044,4]]},"516":{"position":[[3606,4]]}}}],["automat",{"_index":880,"t":{"107":{"position":[[574,13]]},"194":{"position":[[1028,13]]},"255":{"position":[[392,13]]},"328":{"position":[[14,13]]},"486":{"position":[[125,13]]},"500":{"position":[[235,13]]},"555":{"position":[[1303,13]]},"559":{"position":[[220,13]]}}}],["aux",{"_index":1739,"t":{"238":{"position":[[610,3]]},"240":{"position":[[1455,3]]}}}],["avail",{"_index":78,"t":{"7":{"position":[[224,9],[251,9]]},"97":{"position":[[223,9]]},"107":{"position":[[280,9]]},"156":{"position":[[41,9]]},"168":{"position":[[607,9]]},"184":{"position":[[141,9]]},"224":{"position":[[199,9]]},"234":{"position":[[1770,9]]},"244":{"position":[[1442,9]]},"269":{"position":[[631,9],[793,9]]},"326":{"position":[[355,9]]},"369":{"position":[[392,9]]},"379":{"position":[[158,9],[248,9]]},"381":{"position":[[378,9],[548,9]]},"431":{"position":[[149,9],[176,9],[298,9]]},"447":{"position":[[170,9]]},"484":{"position":[[708,9]]},"488":{"position":[[793,9]]},"511":{"position":[[31,9]]},"514":{"position":[[48,9]]},"557":{"position":[[935,9]]},"559":{"position":[[1917,10],[2849,9]]}}}],["averag",{"_index":1306,"t":{"176":{"position":[[2076,7]]},"365":{"position":[[68,7]]}}}],["avoid",{"_index":478,"t":{"83":{"position":[[1409,5]]},"126":{"position":[[0,5]]},"320":{"position":[[1409,5]]},"350":{"position":[[1557,5]]}}}],["await",{"_index":1907,"t":{"267":{"position":[[634,5],[758,5],[801,5],[953,5]]},"269":{"position":[[729,5],[865,5]]},"295":{"position":[[651,5],[2093,5]]}}}],["awar",{"_index":2483,"t":{"381":{"position":[[1428,5]]}}}],["away",{"_index":1518,"t":{"203":{"position":[[536,4]]},"381":{"position":[[2452,4]]}}}],["awk",{"_index":1742,"t":{"238":{"position":[[647,3]]},"240":{"position":[[1492,3],[2573,3],[2623,3]]}}}],["b",{"_index":2597,"t":{"397":{"position":[[82,1]]}}}],["back",{"_index":769,"t":{"87":{"position":[[6,4]]},"138":{"position":[[6,4]]},"174":{"position":[[6,4]]},"180":{"position":[[6,4]]},"194":{"position":[[858,4],[1226,4]]},"197":{"position":[[419,4]]},"234":{"position":[[1317,4]]},"246":{"position":[[6,4]]}}}],["backward",{"_index":2313,"t":{"359":{"position":[[208,9]]}}}],["bad",{"_index":1851,"t":{"257":{"position":[[260,4]]}}}],["bail",{"_index":857,"t":{"105":{"position":[[289,4],[634,4]]}}}],["balanc",{"_index":2041,"t":{"281":{"position":[[817,8]]},"295":{"position":[[641,7],[2083,7]]},"546":{"position":[[330,8]]}}}],["bandwidth",{"_index":2248,"t":{"338":{"position":[[476,10]]}}}],["bar",{"_index":1648,"t":{"230":{"position":[[242,3]]}}}],["bare",{"_index":1224,"t":{"170":{"position":[[174,4]]}}}],["base",{"_index":342,"t":{"40":{"position":[[436,5]]},"68":{"position":[[62,5]]},"101":{"position":[[64,5]]},"115":{"position":[[467,5]]},"119":{"position":[[1863,5]]},"142":{"position":[[55,6]]},"230":{"position":[[172,5]]},"255":{"position":[[444,5]]},"275":{"position":[[658,5]]},"338":{"position":[[375,5],[654,5]]},"350":{"position":[[450,5]]},"423":{"position":[[89,5]]}}}],["bash",{"_index":2586,"t":{"390":{"position":[[198,4]]}}}],["basi",{"_index":910,"t":{"113":{"position":[[351,6]]},"168":{"position":[[401,5]]}}}],["basic",{"_index":1129,"t":{"140":{"position":[[667,5]]},"199":{"position":[[513,5]]},"201":{"position":[[14,5]]},"307":{"position":[[73,5]]},"328":{"position":[[215,5]]},"367":{"position":[[62,5]]}}}],["batch",{"_index":935,"t":{"113":{"position":[[1026,5]]},"301":{"position":[[27,5]]}}}],["be",{"_index":1301,"t":{"176":{"position":[[1333,5],[1555,5]]},"232":{"position":[[325,5],[861,5],[1933,5],[1994,5]]},"240":{"position":[[455,5]]},"261":{"position":[[544,5]]},"277":{"position":[[275,5],[377,5]]},"279":{"position":[[82,5]]},"281":{"position":[[1439,5]]},"332":{"position":[[1192,5]]},"350":{"position":[[850,5],[1563,5]]},"361":{"position":[[632,5]]},"381":{"position":[[978,5]]},"419":{"position":[[727,5]]},"568":{"position":[[195,5]]}}}],["beacon",{"_index":24,"t":{"5":{"position":[[199,6],[314,6]]},"16":{"position":[[115,6],[572,6],[883,6],[954,6],[2377,6]]},"28":{"position":[[88,6]]},"32":{"position":[[42,6],[151,6]]},"36":{"position":[[52,6],[126,6]]},"40":{"position":[[164,6]]},"54":{"position":[[71,6],[166,6],[269,6]]},"79":{"position":[[20,6]]},"81":{"position":[[15,6]]},"83":{"position":[[798,6],[1022,6],[2957,9],[9727,6],[10136,6],[10777,6],[10918,6]]},"107":{"position":[[165,6],[204,6],[450,6],[475,6]]},"162":{"position":[[41,6]]},"184":{"position":[[252,6]]},"186":{"position":[[150,7]]},"201":{"position":[[101,6],[224,6],[276,6],[404,6],[1095,6]]},"203":{"position":[[1198,8]]},"236":{"position":[[46,6],[242,6]]},"238":{"position":[[13,7],[42,9],[236,6]]},"240":{"position":[[801,7],[830,9],[954,6]]},"253":{"position":[[29,6]]},"261":{"position":[[12,6]]},"267":{"position":[[51,6]]},"279":{"position":[[69,6]]},"289":{"position":[[1243,6]]},"291":{"position":[[193,6]]},"316":{"position":[[6,6]]},"318":{"position":[[6,6],[70,6]]},"320":{"position":[[798,6],[1022,6],[2957,9]]},"326":{"position":[[40,6],[391,6]]},"332":{"position":[[1332,6]]},"334":{"position":[[952,6]]},"336":{"position":[[51,6]]},"344":{"position":[[337,6],[392,6],[473,6],[587,6]]},"348":{"position":[[322,6],[385,6]]},"353":{"position":[[188,6]]},"355":{"position":[[221,6],[319,6]]},"357":{"position":[[161,6]]},"361":{"position":[[584,6]]},"363":{"position":[[85,6],[321,6],[360,6],[394,6],[805,6]]},"365":{"position":[[700,6]]},"367":{"position":[[173,6]]},"369":{"position":[[199,6],[245,6],[502,6]]},"375":{"position":[[28,6]]},"379":{"position":[[22,7],[58,6],[366,6],[776,6],[3926,6],[4030,6]]},"381":{"position":[[366,6],[526,6],[675,6],[790,6],[1066,6],[1322,6]]},"383":{"position":[[13,6],[3068,6],[3804,6]]},"385":{"position":[[49,6]]},"417":{"position":[[66,6]]},"455":{"position":[[312,6],[732,6]]},"469":{"position":[[183,6],[433,6],[737,6],[1017,6],[1322,6]]},"471":{"position":[[1771,6],[2342,6]]},"477":{"position":[[5,6],[331,6]]},"479":{"position":[[972,6],[1064,6],[1123,6],[1217,6],[1564,6],[1753,6],[2190,6]]},"492":{"position":[[269,6]]},"494":{"position":[[382,6]]},"498":{"position":[[300,6]]},"516":{"position":[[3289,6],[3698,6],[4339,6],[4480,6]]},"520":{"position":[[218,6]]},"524":{"position":[[218,6]]},"557":{"position":[[719,6]]},"559":{"position":[[21,6],[163,6],[335,6],[637,6],[702,6],[1502,6]]},"561":{"position":[[113,6],[202,6],[335,6]]},"563":{"position":[[794,6],[886,6],[945,6],[1039,6],[1386,6],[1575,6]]},"583":{"position":[[371,6]]}}}],["beacon\",\"config\",\"debug\",\"events\",\"node\",\"validator\",\"lightcli",{"_index":532,"t":{"83":{"position":[[3066,69]]},"320":{"position":[[3066,69]]}}}],["beacon.log",{"_index":2326,"t":{"363":{"position":[[851,10]]}}}],["beacon/perf.out",{"_index":1534,"t":{"203":{"position":[[1306,17]]}}}],["beacon/valid",{"_index":2800,"t":{"471":{"position":[[2157,16]]}}}],["beacon_lodestar.log",{"_index":1316,"t":{"178":{"position":[[258,20]]}}}],["beacon_run.sh",{"_index":1467,"t":{"201":{"position":[[1158,13]]}}}],["beaconapiurl",{"_index":1889,"t":{"265":{"position":[[114,12]]},"289":{"position":[[1220,13]]}}}],["beaconcha.in",{"_index":634,"t":{"83":{"position":[[6434,13]]},"320":{"position":[[6294,13]]},"415":{"position":[[144,13],[209,12]]},"419":{"position":[[225,13]]},"516":{"position":[[5643,13]]}}}],["beaconchain_current_finalized_epoch",{"_index":2905,"t":{"496":{"position":[[388,35]]}}}],["beaconchain_current_slot",{"_index":2904,"t":{"496":{"position":[[363,24]]}}}],["beaconchain_p",{"_index":2903,"t":{"496":{"position":[[345,17]]}}}],["beaconnod",{"_index":673,"t":{"83":{"position":[[8712,12],[8749,10]]},"516":{"position":[[1781,12],[1818,10]]},"520":{"position":[[58,12],[95,10]]},"524":{"position":[[58,12],[95,10]]}}}],["beaconurl",{"_index":2121,"t":{"295":{"position":[[2348,10]]}}}],["bearer",{"_index":667,"t":{"83":{"position":[[8239,6],[8364,6]]},"516":{"position":[[1308,6],[1433,6]]}}}],["becom",{"_index":1694,"t":{"234":{"position":[[612,6]]},"257":{"position":[[1022,8]]},"350":{"position":[[707,7]]},"365":{"position":[[430,6]]}}}],["befor",{"_index":567,"t":{"83":{"position":[[3923,6]]},"99":{"position":[[490,6]]},"103":{"position":[[365,6]]},"105":{"position":[[464,6]]},"128":{"position":[[314,7]]},"132":{"position":[[111,6]]},"164":{"position":[[171,6]]},"188":{"position":[[222,7]]},"190":{"position":[[665,6]]},"192":{"position":[[0,6]]},"320":{"position":[[3710,6],[3876,6]]},"322":{"position":[[234,6]]},"423":{"position":[[1188,6],[1564,6]]},"427":{"position":[[101,6]]},"566":{"position":[[169,6]]},"568":{"position":[[206,6]]}}}],["begin",{"_index":884,"t":{"109":{"position":[[16,5]]},"209":{"position":[[121,5]]},"332":{"position":[[177,6]]},"348":{"position":[[715,7]]}}}],["behavior",{"_index":1115,"t":{"140":{"position":[[315,8]]},"295":{"position":[[899,8],[1518,8]]},"471":{"position":[[1274,8]]}}}],["behind",{"_index":1309,"t":{"176":{"position":[[2220,6]]},"344":{"position":[[17,6]]},"346":{"position":[[43,6]]},"383":{"position":[[3112,6],[3207,6]]}}}],["below",{"_index":121,"t":{"16":{"position":[[198,5]]},"26":{"position":[[87,5]]},"62":{"position":[[0,5]]},"128":{"position":[[415,5]]},"134":{"position":[[385,6]]},"170":{"position":[[446,5]]},"172":{"position":[[1288,6]]},"201":{"position":[[260,6]]},"203":{"position":[[18,5]]},"230":{"position":[[477,6]]},"236":{"position":[[151,5]]},"240":{"position":[[1885,5]]},"291":{"position":[[99,5]]},"295":{"position":[[103,5]]},"342":{"position":[[89,5]]},"399":{"position":[[84,5]]},"434":{"position":[[459,6]]},"463":{"position":[[577,6]]},"465":{"position":[[1645,6],[2485,6]]},"469":{"position":[[1701,5],[2476,6]]},"559":{"position":[[1284,6]]}}}],["belt",{"_index":1341,"t":{"188":{"position":[[295,5]]}}}],["ben",{"_index":2082,"t":{"283":{"position":[[36,3]]}}}],["benchmark",{"_index":1144,"t":{"146":{"position":[[263,9]]}}}],["benefici",{"_index":1563,"t":{"211":{"position":[[236,11]]},"353":{"position":[[363,10]]},"357":{"position":[[61,10]]}}}],["benefit",{"_index":1781,"t":{"240":{"position":[[2930,8]]}}}],["best",{"_index":898,"t":{"111":{"position":[[53,4]]},"119":{"position":[[1666,4]]},"197":{"position":[[288,4]]},"205":{"position":[[11,4]]},"230":{"position":[[6,4]]},"232":{"position":[[54,4]]},"240":{"position":[[2806,4]]},"423":{"position":[[1137,4]]}}}],["besu",{"_index":2367,"t":{"377":{"position":[[263,5]]},"423":{"position":[[797,4]]},"457":{"position":[[506,4]]},"469":{"position":[[1100,4],[1193,4]]},"471":{"position":[[444,5]]}}}],["better",{"_index":1695,"t":{"234":{"position":[[783,7]]}}}],["between",{"_index":589,"t":{"83":{"position":[[4797,7],[6509,7],[11450,7]]},"226":{"position":[[578,7],[709,7]]},"320":{"position":[[4764,7],[6369,7]]},"332":{"position":[[204,7]]},"340":{"position":[[212,7]]},"421":{"position":[[38,7]]},"467":{"position":[[638,7]]},"471":{"position":[[327,7]]},"516":{"position":[[5012,7],[5718,7]]},"559":{"position":[[3076,7]]}}}],["beyond",{"_index":2307,"t":{"350":{"position":[[1630,6]]}}}],["bid",{"_index":2710,"t":{"445":{"position":[[287,3],[386,3]]}}}],["binari",{"_index":14,"t":{"5":{"position":[[47,9]]},"44":{"position":[[56,9]]},"97":{"position":[[135,6]]},"188":{"position":[[1082,6],[1234,6],[1312,6],[1581,6],[1742,6]]},"194":{"position":[[99,6]]},"234":{"position":[[863,7]]},"236":{"position":[[924,6]]},"244":{"position":[[59,6],[1857,8]]},"253":{"position":[[375,6]]},"295":{"position":[[2207,7]]},"390":{"position":[[0,8]]},"407":{"position":[[87,8]]},"577":{"position":[[76,6]]},"588":{"position":[[54,6]]}}}],["bind",{"_index":397,"t":{"64":{"position":[[77,9]]}}}],["bindaddr4=/ip4/0.0.0.0/udp/9000",{"_index":2233,"t":{"334":{"position":[[866,31]]},"379":{"position":[[1743,31]]},"477":{"position":[[1298,31]]}}}],["bit",{"_index":1185,"t":{"154":{"position":[[1394,3],[1531,4]]},"201":{"position":[[740,3]]},"226":{"position":[[947,3]]},"244":{"position":[[86,3]]}}}],["bitcoin",{"_index":1963,"t":{"275":{"position":[[237,8]]}}}],["bl",{"_index":2931,"t":{"511":{"position":[[210,3]]},"542":{"position":[[9,3],[187,3]]},"544":{"position":[[8,3],[98,3]]},"546":{"position":[[199,3]]},"551":{"position":[[32,3]]},"579":{"position":[[47,3],[131,3],[206,3],[306,3]]},"586":{"position":[[0,3],[25,3],[55,3],[89,3],[135,3],[178,3],[227,3]]}}}],["blank",{"_index":2472,"t":{"381":{"position":[[37,5]]}}}],["blend",{"_index":2253,"t":{"338":{"position":[[943,5]]}}}],["blind",{"_index":728,"t":{"83":{"position":[[10268,7]]},"115":{"position":[[415,7]]},"516":{"position":[[3830,7]]}}}],["blindedloc",{"_index":727,"t":{"83":{"position":[[10222,13]]},"516":{"position":[[3784,13]]}}}],["blob",{"_index":571,"t":{"83":{"position":[[4034,5]]},"320":{"position":[[3987,5]]}}}],["block",{"_index":449,"t":{"83":{"position":[[447,5],[490,5],[524,5],[568,5],[608,5],[1251,5],[3579,5],[8955,6],[9517,5],[9711,5],[9791,5],[9835,6],[10023,5],[10067,6],[10163,5],[10259,5]]},"115":{"position":[[398,5],[423,5]]},"121":{"position":[[888,5]]},"134":{"position":[[164,7]]},"176":{"position":[[2413,5],[2494,5],[2575,5]]},"257":{"position":[[592,5]]},"277":{"position":[[253,7],[407,6],[453,5],[544,6],[674,5],[1012,5]]},"289":{"position":[[447,5],[490,5],[524,5],[568,5],[608,5]]},"299":{"position":[[314,5]]},"320":{"position":[[447,5],[490,5],[524,5],[568,5],[608,5],[1251,5],[3565,5]]},"322":{"position":[[318,5]]},"324":{"position":[[267,5],[313,5],[369,7]]},"350":{"position":[[997,6]]},"355":{"position":[[40,6],[64,5],[120,6]]},"357":{"position":[[28,6],[221,6]]},"359":{"position":[[201,6],[360,5]]},"361":{"position":[[625,6],[754,6]]},"363":{"position":[[281,6],[372,6]]},"379":{"position":[[2192,6],[2479,6],[2677,6],[2957,6],[3110,6],[3263,6]]},"381":{"position":[[913,5]]},"383":{"position":[[249,5],[459,6],[630,6],[816,6],[1009,6],[1208,6],[1407,6],[1603,6],[1882,6],[2034,6],[2196,6],[2358,6],[2510,6],[2662,6],[2955,6],[3280,5],[3337,5],[3448,5]]},"387":{"position":[[447,5],[490,5],[524,5],[568,5],[608,5]]},"423":{"position":[[1074,7]]},"443":{"position":[[164,7]]},"445":{"position":[[333,5]]},"455":{"position":[[855,5]]},"477":{"position":[[1747,6],[2034,6],[2232,6],[2512,6],[2665,6],[2818,6]]},"498":{"position":[[307,7]]},"516":{"position":[[447,5],[490,5],[524,5],[568,5],[608,5],[2024,6],[2359,5],[3079,5],[3273,5],[3353,5],[3397,6],[3585,5],[3629,6],[3725,5],[3821,5]]},"557":{"position":[[120,7]]},"559":{"position":[[123,5],[319,5],[399,5],[443,6],[895,5],[1167,6],[1383,6],[1559,5],[1655,5],[1817,6],[1843,5],[1879,5],[2117,5],[2177,5],[2225,5],[2403,5],[2439,5],[2623,5],[2674,6],[2822,6],[2867,5],[2896,5],[3070,5],[3127,5]]}}}],["blockchain",{"_index":346,"t":{"42":{"position":[[82,10]]},"257":{"position":[[81,10],[329,11],[532,11],[1078,10]]},"275":{"position":[[114,10],[272,10]]},"348":{"position":[[58,10]]},"350":{"position":[[159,10],[408,10],[654,10],[1356,10]]}}}],["blockresult",{"_index":1016,"t":{"121":{"position":[[803,11]]}}}],["blockresult.id",{"_index":1019,"t":{"121":{"position":[[894,17]]}}}],["blockroot>:_.log",{"_index":1315,"t":{"178":{"position":[[212,19]]}}}],["typescript",{"_index":6,"t":{"3":{"position":[[57,10]]},"5":{"position":[[173,10]]},"30":{"position":[[25,10]]},"50":{"position":[[31,10]]},"64":{"position":[[27,10]]},"66":{"position":[[49,10]]},"70":{"position":[[40,10]]},"99":{"position":[[201,10]]},"119":{"position":[[732,10]]},"269":{"position":[[1070,12]]},"275":{"position":[[647,10]]},"279":{"position":[[302,12]]},"581":{"position":[[37,10],[185,10]]},"583":{"position":[[220,10]]}}}],["typic",{"_index":1191,"t":{"158":{"position":[[12,7]]}}}],["typo",{"_index":886,"t":{"109":{"position":[[80,6]]},"113":{"position":[[592,6]]}}}],["ubuntu",{"_index":2622,"t":{"423":{"position":[[82,6],[675,6]]},"427":{"position":[[125,6]]},"431":{"position":[[368,6]]},"434":{"position":[[721,7],[756,6]]},"484":{"position":[[22,6]]}}}],["udp",{"_index":640,"t":{"83":{"position":[[6692,3],[6791,3],[6893,3],[7030,3],[7111,3],[7215,3],[7886,3],[8062,3]]},"320":{"position":[[6552,3],[6651,3],[6753,3],[6890,3],[6971,3],[7075,3],[7746,3],[7922,3]]},"332":{"position":[[1014,3]]},"342":{"position":[[610,3]]},"387":{"position":[[769,3],[912,3],[1304,3],[1416,3]]}}}],["ui",{"_index":541,"t":{"83":{"position":[[3410,2]]},"128":{"position":[[158,2]]},"320":{"position":[[3410,2]]}}}],["uid",{"_index":1067,"t":{"128":{"position":[[204,3]]}}}],["ulimit",{"_index":1390,"t":{"192":{"position":[[62,6]]}}}],["unam",{"_index":1435,"t":{"199":{"position":[[332,6]]}}}],["unassign",{"_index":894,"t":{"109":{"position":[[249,10]]}}}],["under",{"_index":411,"t":{"68":{"position":[[104,5]]},"154":{"position":[[550,5]]},"192":{"position":[[463,5]]},"228":{"position":[[86,5]]},"361":{"position":[[93,5]]},"390":{"position":[[58,5]]},"395":{"position":[[543,5]]},"425":{"position":[[128,5],[249,5]]},"457":{"position":[[257,5],[298,5]]},"484":{"position":[[786,5]]}}}],["undergo",{"_index":2990,"t":{"566":{"position":[[21,9]]}}}],["underscor",{"_index":2037,"t":{"281":{"position":[[585,12],[2513,11]]}}}],["understand",{"_index":43,"t":{"5":{"position":[[408,10]]},"126":{"position":[[99,10]]},"224":{"position":[[1199,10]]},"226":{"position":[[95,13],[151,10]]},"232":{"position":[[2056,13]]},"307":{"position":[[79,13]]},"328":{"position":[[221,13]]},"355":{"position":[[355,13]]},"363":{"position":[[598,10]]}}}],["understood",{"_index":1615,"t":{"226":{"position":[[737,11]]}}}],["undesir",{"_index":1871,"t":{"257":{"position":[[920,10]]}}}],["unfilt",{"_index":1562,"t":{"211":{"position":[[218,10]]}}}],["unforgiv",{"_index":1138,"t":{"146":{"position":[[14,11]]}}}],["unfortun",{"_index":1944,"t":{"269":{"position":[[1138,13]]},"303":{"position":[[79,14]]}}}],["uniqu",{"_index":2965,"t":{"557":{"position":[[784,6]]}}}],["unit",{"_index":795,"t":{"99":{"position":[[40,4]]},"119":{"position":[[1459,4],[1720,4],[1901,4]]},"142":{"position":[[160,4],[180,4]]}}}],["unknown",{"_index":1510,"t":{"203":{"position":[[145,8]]},"211":{"position":[[427,14]]},"255":{"position":[[0,8],[164,7],[204,7]]},"361":{"position":[[124,7]]}}}],["unless",{"_index":994,"t":{"119":{"position":[[1255,6]]},"190":{"position":[[213,6]]},"467":{"position":[[49,6]]},"559":{"position":[[1390,6],[1824,6]]}}}],["unlik",{"_index":1862,"t":{"257":{"position":[[462,6]]},"350":{"position":[[179,6]]}}}],["unlimit",{"_index":1392,"t":{"192":{"position":[[72,9]]}}}],["unpin",{"_index":812,"t":{"99":{"position":[[753,8]]},"121":{"position":[[209,8]]}}}],["unpkg",{"_index":1933,"t":{"269":{"position":[[302,5]]}}}],["unrealist",{"_index":2308,"t":{"350":{"position":[[1665,15]]}}}],["unrecogn",{"_index":1086,"t":{"132":{"position":[[431,12]]}}}],["unsaf",{"_index":2763,"t":{"467":{"position":[[155,7]]}}}],["unstabl",{"_index":1064,"t":{"128":{"position":[[110,8]]},"240":{"position":[[641,8]]},"392":{"position":[[205,8]]},"453":{"position":[[106,8],[457,8]]}}}],["unsur",{"_index":883,"t":{"109":{"position":[[0,6]]}}}],["until",{"_index":957,"t":{"115":{"position":[[908,5]]},"238":{"position":[[396,5]]},"240":{"position":[[1313,5]]},"359":{"position":[[234,5]]},"407":{"position":[[153,5]]}}}],["untim",{"_index":2078,"t":{"281":{"position":[[2268,8]]}}}],["unus",{"_index":2633,"t":{"423":{"position":[[1082,6]]}}}],["unverifiedwhitelist",{"_index":2132,"t":{"299":{"position":[[131,19],[176,19]]}}}],["unwant",{"_index":2273,"t":{"344":{"position":[[194,8]]}}}],["unzip",{"_index":2892,"t":{"494":{"position":[[68,5]]}}}],["up",{"_index":130,"t":{"16":{"position":[[328,2],[512,2]]},"18":{"position":[[7,2]]},"101":{"position":[[55,2]]},"105":{"position":[[572,2]]},"107":{"position":[[198,2],[417,2]]},"113":{"position":[[944,2]]},"146":{"position":[[157,2]]},"154":{"position":[[1443,2]]},"168":{"position":[[13,2]]},"188":{"position":[[124,2]]},"190":{"position":[[814,2]]},"230":{"position":[[278,2]]},"265":{"position":[[24,2]]},"269":{"position":[[857,2]]},"277":{"position":[[151,2]]},"328":{"position":[[372,2]]},"332":{"position":[[245,3]]},"348":{"position":[[223,2]]},"353":{"position":[[150,2]]},"357":{"position":[[131,2]]},"375":{"position":[[14,2]]},"395":{"position":[[524,2]]},"409":{"position":[[159,2]]},"415":{"position":[[183,2]]},"469":{"position":[[1617,2]]},"471":{"position":[[1676,2]]},"479":{"position":[[2226,3]]}}}],["updat",{"_index":336,"t":{"40":{"position":[[228,8]]},"87":{"position":[[64,8]]},"109":{"position":[[130,8]]},"124":{"position":[[646,8]]},"128":{"position":[[456,7]]},"132":{"position":[[38,8]]},"138":{"position":[[64,8]]},"180":{"position":[[64,8]]},"190":{"position":[[445,8]]},"199":{"position":[[148,8],[415,6]]},"201":{"position":[[160,8]]},"203":{"position":[[363,6]]},"236":{"position":[[296,6]]},"240":{"position":[[1179,6]]},"242":{"position":[[73,6]]},"246":{"position":[[64,8]]},"267":{"position":[[1141,8],[1323,8]]},"320":{"position":[[3681,6]]},"357":{"position":[[283,7]]},"411":{"position":[[25,6]]},"434":{"position":[[140,6],[714,6],[740,7],[797,6]]},"471":{"position":[[2483,6]]},"486":{"position":[[3,6]]}}}],["updateheadersonforcedupd",{"_index":1916,"t":{"267":{"position":[[874,28]]}}}],["upgrad",{"_index":1206,"t":{"164":{"position":[[187,8]]},"283":{"position":[[14,9]]},"342":{"position":[[400,9]]},"434":{"position":[[817,7]]}}}],["upload",{"_index":86,"t":{"7":{"position":[[311,6],[350,6]]},"431":{"position":[[236,6],[275,6]]}}}],["upnp",{"_index":2285,"t":{"346":{"position":[[26,5]]}}}],["upon",{"_index":2300,"t":{"350":{"position":[[960,4],[1390,4]]},"405":{"position":[[62,4]]},"540":{"position":[[79,4]]}}}],["uppercase_with_underscor",{"_index":980,"t":{"119":{"position":[[585,27]]}}}],["upsid",{"_index":1752,"t":{"240":{"position":[[474,7]]}}}],["url",{"_index":455,"t":{"83":{"position":[[686,3],[786,3],[4180,4],[4451,4],[5604,3],[11007,3]]},"230":{"position":[[238,3],[313,3]]},"289":{"position":[[1234,3]]},"295":{"position":[[431,5],[1850,5]]},"320":{"position":[[686,3],[786,3],[4147,4],[4418,4],[5479,3]]},"326":{"position":[[200,4]]},"381":{"position":[[622,3],[1120,4],[1405,4],[1474,3]]},"419":{"position":[[104,4],[671,3]]},"451":{"position":[[211,3]]},"455":{"position":[[909,4],[1018,4]]},"471":{"position":[[613,4],[2194,3]]},"516":{"position":[[4569,3]]}}}],["url=http://localhost:8661",{"_index":2394,"t":{"379":{"position":[[1211,25]]},"477":{"position":[[766,25]]}}}],["urls=http://127.0.0.1:9596",{"_index":2826,"t":{"479":{"position":[[984,26]]},"563":{"position":[[806,26]]}}}],["urls=http://localhost:8551",{"_index":2391,"t":{"379":{"position":[[1058,26],[1139,26]]},"477":{"position":[[613,26],[694,26]]}}}],["us",{"_index":17,"t":{"5":{"position":[[91,3],[128,3]]},"16":{"position":[[174,4],[408,4],[1280,6],[1440,4],[2476,3]]},"24":{"position":[[205,4]]},"34":{"position":[[78,4]]},"38":{"position":[[34,4],[137,3]]},"48":{"position":[[113,5]]},"52":{"position":[[58,4]]},"54":{"position":[[114,4],[236,4],[321,4]]},"70":{"position":[[112,4]]},"76":{"position":[[82,4]]},"79":{"position":[[57,3]]},"83":{"position":[[1788,4],[2437,3],[3731,5],[3769,4],[4303,3],[5055,4],[5217,4],[5362,4],[7643,4],[8377,4],[8865,3],[9440,4],[10753,3],[11121,4],[11329,4]]},"95":{"position":[[5,5]]},"99":{"position":[[786,4]]},"101":{"position":[[112,4]]},"105":{"position":[[267,3],[402,3]]},"117":{"position":[[138,5]]},"119":{"position":[[25,5],[391,3],[613,3],[726,5],[902,3],[1230,3],[1314,3],[1882,3]]},"121":{"position":[[242,4]]},"126":{"position":[[336,3]]},"128":{"position":[[431,3]]},"132":{"position":[[360,3],[425,5]]},"140":{"position":[[474,6],[656,3]]},"142":{"position":[[125,4]]},"150":{"position":[[292,5]]},"158":{"position":[[147,4],[211,4],[275,4]]},"160":{"position":[[161,5]]},"164":{"position":[[292,4]]},"166":{"position":[[93,3]]},"172":{"position":[[660,4]]},"176":{"position":[[23,5],[1405,3]]},"184":{"position":[[32,3],[349,5]]},"186":{"position":[[390,3]]},"188":{"position":[[1020,3],[1377,6],[1471,5]]},"192":{"position":[[602,3],[736,3]]},"194":{"position":[[939,3]]},"197":{"position":[[250,3]]},"199":{"position":[[0,3],[556,7]]},"203":{"position":[[655,3],[909,4]]},"211":{"position":[[134,7]]},"224":{"position":[[403,6],[790,3]]},"226":{"position":[[193,3]]},"228":{"position":[[198,3],[1454,3]]},"230":{"position":[[217,5]]},"234":{"position":[[139,4],[624,7],[813,5],[1855,3]]},"236":{"position":[[341,5],[514,3]]},"240":{"position":[[461,5],[763,3],[2266,4]]},"244":{"position":[[215,6]]},"257":{"position":[[743,5],[1148,3]]},"261":{"position":[[515,3]]},"269":{"position":[[15,3],[129,5],[735,4],[837,3]]},"289":{"position":[[876,3]]},"295":{"position":[[8,3],[90,3],[838,3],[911,6],[1290,6]]},"297":{"position":[[363,5]]},"303":{"position":[[3,3],[173,5]]},"320":{"position":[[1788,4],[2437,3],[4270,3],[5022,4],[5184,4],[5329,4],[7503,4]]},"326":{"position":[[439,4]]},"334":{"position":[[495,3]]},"336":{"position":[[64,3],[105,4],[200,4]]},"361":{"position":[[159,4],[713,3],[815,4]]},"369":{"position":[[311,3]]},"373":{"position":[[83,4],[136,3],[242,3]]},"377":{"position":[[17,3],[98,3],[144,3],[229,3],[269,3],[350,3],[392,3],[473,3],[513,3],[594,3]]},"379":{"position":[[282,3]]},"381":{"position":[[1853,4]]},"383":{"position":[[3891,3]]},"387":{"position":[[1725,3]]},"392":{"position":[[494,3],[617,3]]},"395":{"position":[[99,3],[399,3],[473,3],[576,5]]},"403":{"position":[[33,4]]},"407":{"position":[[81,5],[210,3]]},"411":{"position":[[94,4]]},"413":{"position":[[83,3]]},"419":{"position":[[343,6],[476,3],[639,3]]},"421":{"position":[[400,6]]},"423":{"position":[[114,5],[225,3],[443,4],[570,5]]},"429":{"position":[[235,5]]},"445":{"position":[[65,3],[309,3]]},"447":{"position":[[5,5],[187,3]]},"449":{"position":[[68,4],[81,3]]},"451":{"position":[[54,3],[367,3]]},"453":{"position":[[54,5],[90,3],[278,3],[447,5]]},"455":{"position":[[20,3],[426,5],[1003,3]]},"457":{"position":[[154,6]]},"461":{"position":[[130,4]]},"463":{"position":[[343,5],[444,3],[570,3],[832,5],[1119,5]]},"465":{"position":[[933,4],[1521,5],[1638,3],[1928,5],[2229,5]]},"467":{"position":[[16,3],[33,3],[1056,3],[1152,3]]},"469":{"position":[[771,6],[1051,6],[1364,6],[1693,3],[1851,6],[2437,5]]},"471":{"position":[[691,5],[921,3],[1181,3],[1413,5],[1481,5],[1699,5],[1845,5],[2178,3]]},"473":{"position":[[64,5]]},"475":{"position":[[152,5],[385,5]]},"481":{"position":[[39,5]]},"486":{"position":[[200,5],[355,5],[480,5]]},"488":{"position":[[739,3],[886,4]]},"500":{"position":[[670,3],[790,3]]},"503":{"position":[[180,5]]},"516":{"position":[[876,3],[1446,4],[1934,3],[2511,5],[2549,4],[2860,4],[4315,3],[4683,4],[4891,4]]},"520":{"position":[[231,3]]},"524":{"position":[[231,3]]},"551":{"position":[[45,3],[174,5]]},"553":{"position":[[35,5],[210,3]]},"555":{"position":[[288,4],[490,5],[1386,3],[1731,5]]},"557":{"position":[[272,5],[597,3]]},"559":{"position":[[72,3],[1174,5],[2065,4],[2445,5]]},"561":{"position":[[7,3]]},"566":{"position":[[128,5]]},"568":{"position":[[201,4]]},"581":{"position":[[69,4]]},"583":{"position":[[8,6],[102,6],[114,4]]}}}],["usabl",{"_index":1696,"t":{"234":{"position":[[932,7]]}}}],["usag",{"_index":292,"t":{"28":{"position":[[57,5]]},"72":{"position":[[119,5]]},"83":{"position":[[9995,5]]},"203":{"position":[[764,5]]},"224":{"position":[[1246,6]]},"226":{"position":[[88,6]]},"295":{"position":[[959,5]]},"407":{"position":[[32,6]]},"463":{"position":[[646,5]]},"465":{"position":[[1714,5]]},"516":{"position":[[3557,5]]},"559":{"position":[[1274,5]]}}}],["useless",{"_index":1697,"t":{"234":{"position":[[969,7]]}}}],["useproduceblockv3",{"_index":717,"t":{"83":{"position":[[9961,18]]},"516":{"position":[[3523,18]]}}}],["useproduceblockv3=deneb",{"_index":2831,"t":{"479":{"position":[[1329,25]]},"563":{"position":[[1151,25]]}}}],["user",{"_index":1022,"t":{"124":{"position":[[101,5],[221,6],[754,5]]},"126":{"position":[[198,4]]},"148":{"position":[[78,4]]},"154":{"position":[[1021,4]]},"234":{"position":[[309,4]]},"248":{"position":[[87,5]]},"257":{"position":[[45,5]]},"369":{"position":[[550,6]]},"395":{"position":[[493,5],[557,5]]},"405":{"position":[[287,4]]},"409":{"position":[[60,5]]},"471":{"position":[[1185,4],[1587,5],[1661,5]]},"484":{"position":[[80,5]]},"542":{"position":[[136,4]]},"553":{"position":[[107,5],[186,4]]}}}],["usernam",{"_index":937,"t":{"115":{"position":[[99,8]]}}}],["users/ninja_user/.nvm/versions/node/v22.1.0/lib/node_modules/llnode/llnode.dylib",{"_index":1388,"t":{"190":{"position":[[887,83]]},"194":{"position":[[404,83]]}}}],["users/ninja_user/coredumps/node.coredump",{"_index":1408,"t":{"194":{"position":[[211,41],[320,43]]}}}],["usr/lib/heaptrack/libheaptrack_preload.so",{"_index":1770,"t":{"240":{"position":[[1691,42]]}}}],["usr/src/lodestar/packages/cli/bin/lodestar",{"_index":1443,"t":{"201":{"position":[[55,43]]},"203":{"position":[[1153,44]]}}}],["usual",{"_index":1179,"t":{"154":{"position":[[1056,7]]},"188":{"position":[[432,7]]},"228":{"position":[[581,7]]},"365":{"position":[[338,7]]}}}],["utf8",{"_index":681,"t":{"83":{"position":[[8969,4]]},"126":{"position":[[296,4]]},"516":{"position":[[2038,4]]}}}],["util",{"_index":29,"t":{"5":{"position":[[243,7]]},"52":{"position":[[20,4],[42,7]]},"58":{"position":[[33,9]]},"334":{"position":[[55,8]]},"423":{"position":[[32,7]]},"455":{"position":[[350,9]]},"492":{"position":[[125,9]]},"526":{"position":[[255,8]]},"549":{"position":[[43,9]]},"579":{"position":[[276,7]]},"586":{"position":[[148,7]]}}}],["utmost",{"_index":2492,"t":{"383":{"position":[[60,6]]}}}],["uv_",{"_index":1567,"t":{"211":{"position":[[347,4]]}}}],["v",{"_index":1741,"t":{"238":{"position":[[638,1]]},"240":{"position":[[1483,1]]},"392":{"position":[[358,1]]}}}],["v0",{"_index":2135,"t":{"299":{"position":[[341,2],[367,2],[650,2],[671,2],[1105,2],[1173,2],[1192,2],[1430,2],[1452,2]]}}}],["v1",{"_index":2145,"t":{"299":{"position":[[565,2],[715,2],[745,2],[944,2],[1127,2]]}}}],["v1.4",{"_index":2709,"t":{"445":{"position":[[253,5]]}}}],["v2",{"_index":2138,"t":{"299":{"position":[[407,2],[449,2],[483,2],[519,2],[583,2],[697,2],[765,2],[792,2],[816,2],[853,2],[878,2],[904,2],[927,2],[1156,2],[1284,2],[1327,2],[1372,2],[1403,2]]}}}],["v22",{"_index":2593,"t":{"395":{"position":[[130,4]]}}}],["v22.04",{"_index":2629,"t":{"423":{"position":[[682,6]]},"427":{"position":[[139,6]]}}}],["v22.1.0",{"_index":1713,"t":{"236":{"position":[[570,7]]}}}],["v5",{"_index":403,"t":{"66":{"position":[[113,3]]}}}],["v8",{"_index":1417,"t":{"194":{"position":[[920,2],[1331,2],[1411,2]]},"199":{"position":[[713,2]]},"201":{"position":[[444,2],[2564,2]]},"211":{"position":[[61,2]]},"224":{"position":[[922,2]]},"226":{"position":[[18,2],[232,2],[966,4]]},"228":{"position":[[603,2]]}}}],["v8.log",{"_index":1475,"t":{"201":{"position":[[1298,6],[1381,6],[1463,6],[1546,6],[1629,6],[1711,6],[1794,6],[1877,6],[1960,6],[2043,6],[2126,6],[2209,6],[2292,6],[2375,6],[2458,6],[2533,6]]}}}],["v8::intern",{"_index":1569,"t":{"211":{"position":[[366,15]]}}}],["valgrind",{"_index":1684,"t":{"234":{"position":[[213,8],[398,9],[588,8]]}}}],["valid",{"_index":118,"t":{"16":{"position":[[142,11],[606,10],[1678,10],[1996,10],[2080,10],[2176,10]]},"28":{"position":[[104,10]]},"60":{"position":[[33,9],[160,9],[191,9],[326,9]]},"79":{"position":[[45,11]]},"81":{"position":[[42,10]]},"83":{"position":[[2063,9],[3040,12],[3717,9],[7554,9],[8826,10],[9084,9],[10111,11],[10396,9],[10432,10],[11099,9],[11285,8],[11634,9],[11821,10],[11906,10],[12089,9]]},"107":{"position":[[220,10]]},"113":{"position":[[717,5]]},"115":{"position":[[715,9]]},"156":{"position":[[141,5]]},"162":{"position":[[57,9]]},"166":{"position":[[56,10]]},"172":{"position":[[805,11],[821,11]]},"178":{"position":[[374,9]]},"257":{"position":[[419,10]]},"277":{"position":[[42,10],[105,10],[227,10],[482,10],[532,8],[569,11],[996,11]]},"281":{"position":[[804,10],[1775,8]]},"291":{"position":[[209,9]]},"320":{"position":[[2063,9],[3040,12],[3662,9],[3694,9],[7414,9]]},"322":{"position":[[252,10]]},"324":{"position":[[143,9],[211,9]]},"326":{"position":[[218,9],[402,10]]},"344":{"position":[[510,9],[623,9]]},"350":{"position":[[503,11],[1479,10]]},"363":{"position":[[440,9],[1100,9],[1196,9]]},"365":{"position":[[209,9]]},"379":{"position":[[790,5]]},"381":{"position":[[1584,8]]},"383":{"position":[[3371,5]]},"417":{"position":[[82,9]]},"419":{"position":[[577,11]]},"423":{"position":[[1173,9]]},"427":{"position":[[400,9]]},"441":{"position":[[125,11]]},"443":{"position":[[27,11],[57,10],[277,9],[643,11]]},"445":{"position":[[36,10],[131,10]]},"451":{"position":[[29,10]]},"459":{"position":[[68,11]]},"461":{"position":[[202,11],[228,9]]},"463":{"position":[[21,10],[266,9]]},"465":{"position":[[31,10],[215,9],[255,9],[480,9],[548,9],[669,9],[827,9],[980,11],[1006,9],[1430,9],[2382,10]]},"467":{"position":[[63,10],[194,10]]},"469":{"position":[[203,10],[453,10],[754,9],[1034,9],[1339,9],[1631,9],[1655,9],[1739,9],[1775,9],[1799,9],[1826,9]]},"471":{"position":[[1396,9],[1688,10],[1828,9],[2398,10]]},"477":{"position":[[345,5]]},"479":{"position":[[29,11],[59,9],[95,9],[196,10],[278,9],[1139,9],[1233,9],[1319,9],[1546,9],[1735,9],[1924,9],[2167,9]]},"488":{"position":[[207,8]]},"498":{"position":[[163,9],[211,9],[534,9]]},"500":{"position":[[72,9],[154,9],[289,9]]},"503":{"position":[[100,9],[324,9]]},"509":{"position":[[20,9]]},"511":{"position":[[50,9],[69,9],[106,9],[143,9],[160,9],[175,9],[200,9]]},"514":{"position":[[8,9],[105,9]]},"516":{"position":[[1895,10],[2153,9],[2497,9],[3673,11],[3958,9],[3994,10],[4661,9],[4847,8],[5196,9]]},"526":{"position":[[55,9]]},"528":{"position":[[7,9],[95,9]]},"530":{"position":[[121,9],[157,10]]},"532":{"position":[[29,10]]},"534":{"position":[[9,9],[62,9]]},"536":{"position":[[45,10],[128,10]]},"538":{"position":[[33,9],[81,9],[173,9],[265,9]]},"542":{"position":[[45,9],[147,9]]},"544":{"position":[[40,9],[88,9]]},"546":{"position":[[69,9]]},"549":{"position":[[66,9]]},"551":{"position":[[0,10],[145,9],[193,9]]},"553":{"position":[[359,10]]},"555":{"position":[[12,9],[500,9],[614,9],[710,9],[1343,10],[1394,9],[1458,10],[1503,9],[1588,9],[1618,9]]},"557":{"position":[[29,10],[228,9],[847,9]]},"559":{"position":[[82,9],[571,9],[750,9],[2086,10],[2552,5],[3021,9]]},"563":{"position":[[20,9],[58,9],[961,9],[1055,9],[1141,9],[1368,9],[1557,9],[1746,9]]}}}],["valid(17088105",{"_index":2511,"t":{"383":{"position":[[823,14],[1016,14]]}}}],["valid(17088167",{"_index":2521,"t":{"383":{"position":[[1215,14]]}}}],["valid(17088231",{"_index":2530,"t":{"383":{"position":[[1414,14]]}}}],["valid(17088475",{"_index":2538,"t":{"383":{"position":[[1610,14]]}}}],["valid(17088521",{"_index":2546,"t":{"383":{"position":[[1889,14]]}}}],["valid(17088522",{"_index":2553,"t":{"383":{"position":[[2041,14]]}}}],["valid(17088524",{"_index":2558,"t":{"383":{"position":[[2203,14],[2365,14]]}}}],["valid(17088526",{"_index":2565,"t":{"383":{"position":[[2517,14]]}}}],["valid(17088527",{"_index":2570,"t":{"383":{"position":[[2669,14]]}}}],["valid(20426365",{"_index":2430,"t":{"379":{"position":[[2486,14]]},"477":{"position":[[2041,14]]}}}],["valid(20426841",{"_index":2439,"t":{"379":{"position":[[2684,14]]},"477":{"position":[[2239,14]]}}}],["valid(20426886",{"_index":2448,"t":{"379":{"position":[[2964,14]]},"477":{"position":[[2519,14]]}}}],["valid(20426887",{"_index":2455,"t":{"379":{"position":[[3117,14]]},"477":{"position":[[2672,14]]}}}],["valid(20426888",{"_index":2461,"t":{"379":{"position":[[3270,14]]},"477":{"position":[[2825,14]]}}}],["validator'",{"_index":693,"t":{"83":{"position":[[9270,11]]},"461":{"position":[[94,11]]},"465":{"position":[[897,11]]},"516":{"position":[[2690,11]]},"546":{"position":[[318,11]]}}}],["validator(",{"_index":2888,"t":{"490":{"position":[[194,12]]}}}],["validator.log",{"_index":2331,"t":{"363":{"position":[[1149,13]]}}}],["validator_key",{"_index":2963,"t":{"555":{"position":[[649,16],[745,16],[883,14],[1148,14],[1646,16]]}}}],["validatorindex=1234567",{"_index":2837,"t":{"479":{"position":[[1577,23]]},"563":{"position":[[1399,23]]}}}],["validatorindex=1234568",{"_index":2839,"t":{"479":{"position":[[1766,23]]},"563":{"position":[[1588,23]]}}}],["validatormonitorlog",{"_index":502,"t":{"83":{"position":[[2037,21]]},"320":{"position":[[2037,21]]}}}],["validatorsdbdir",{"_index":2332,"t":{"363":{"position":[[1224,15]]}}}],["validatorset1",{"_index":2752,"t":{"465":{"position":[[337,13],[760,13],[806,13]]}}}],["validatorset2",{"_index":2753,"t":{"465":{"position":[[384,13],[2341,13]]}}}],["valu",{"_index":192,"t":{"16":{"position":[[1419,6],[1747,6],[1943,6],[2153,5],[2231,6],[2450,6]]},"83":{"position":[[9797,5]]},"113":{"position":[[849,5]]},"119":{"position":[[703,5]]},"158":{"position":[[20,6]]},"176":{"position":[[1882,5],[2236,5]]},"226":{"position":[[652,6],[839,6]]},"228":{"position":[[734,5],[766,5],[815,5],[901,5]]},"250":{"position":[[83,5]]},"253":{"position":[[165,6]]},"334":{"position":[[152,5]]},"383":{"position":[[2773,7]]},"421":{"position":[[152,5]]},"516":{"position":[[3359,5]]},"540":{"position":[[126,5]]},"559":{"position":[[405,5],[931,5],[1015,5],[2504,5],[2643,5]]}}}],["var",{"_index":2717,"t":{"447":{"position":[[59,5],[207,6]]},"467":{"position":[[279,5]]},"471":{"position":[[543,5],[1924,4],[2059,4]]}}}],["var/lib/goethereum/geth/chaindata/383234.ldb",{"_index":2852,"t":{"484":{"position":[[228,46]]}}}],["vari",{"_index":1791,"t":{"244":{"position":[[252,5]]}}}],["variabl",{"_index":976,"t":{"119":{"position":[[504,9],[1772,9]]},"126":{"position":[[382,9]]},"140":{"position":[[293,9],[355,8]]},"156":{"position":[[203,9]]},"234":{"position":[[1480,9]]},"253":{"position":[[310,8]]},"255":{"position":[[57,9],[423,9]]},"449":{"position":[[27,9]]},"451":{"position":[[220,8]]},"471":{"position":[[2218,8]]}}}],["varieti",{"_index":2025,"t":{"281":{"position":[[269,7]]},"409":{"position":[[116,7]]}}}],["variou",{"_index":270,"t":{"24":{"position":[[25,7]]},"54":{"position":[[218,7]]},"58":{"position":[[25,7],[69,7]]},"144":{"position":[[63,7]]},"154":{"position":[[358,7]]},"160":{"position":[[167,7]]},"162":{"position":[[16,7]]},"170":{"position":[[237,7],[629,7],[764,7],[850,7],[904,7]]},"172":{"position":[[602,7]]},"281":{"position":[[849,7]]},"328":{"position":[[246,7]]},"342":{"position":[[221,7],[736,7]]},"411":{"position":[[121,7]]}}}],["verb",{"_index":1419,"t":{"194":{"position":[[1182,4]]}}}],["verbiag",{"_index":887,"t":{"109":{"position":[[95,8]]}}}],["verbos",{"_index":510,"t":{"83":{"position":[[2239,9],[2332,10],[2496,9],[2585,10]]},"124":{"position":[[924,8]]},"289":{"position":[[678,9],[771,10],[935,9],[1024,10]]},"320":{"position":[[2239,9],[2332,10],[2496,9],[2585,10]]},"387":{"position":[[1527,9],[1620,10],[1784,9],[1873,10]]},"516":{"position":[[678,9],[771,10],[935,9],[1024,10]]}}}],["veri",{"_index":845,"t":{"103":{"position":[[356,4]]},"140":{"position":[[469,4]]},"154":{"position":[[246,4],[410,4]]},"188":{"position":[[255,4]]},"201":{"position":[[638,4]]},"226":{"position":[[48,4]]},"232":{"position":[[423,4],[696,4]]},"244":{"position":[[156,4]]},"365":{"position":[[346,4]]}}}],["verif",{"_index":366,"t":{"48":{"position":[[58,12]]},"326":{"position":[[687,12]]}}}],["verifi",{"_index":1198,"t":{"160":{"position":[[79,8]]},"257":{"position":[[626,6]]},"293":{"position":[[80,6]]},"295":{"position":[[809,6]]},"359":{"position":[[109,6],[264,9],[377,8]]},"381":{"position":[[955,6]]},"455":{"position":[[138,6],[638,9],[771,6]]},"469":{"position":[[551,8]]},"479":{"position":[[1104,8],[1198,8]]},"494":{"position":[[497,6]]},"563":{"position":[[926,8],[1020,8]]},"579":{"position":[[58,6],[142,6]]},"583":{"position":[[490,6]]},"586":{"position":[[36,6]]}}}],["versa",{"_index":1210,"t":{"166":{"position":[[76,6]]}}}],["version",{"_index":341,"t":{"40":{"position":[[354,7]]},"99":{"position":[[762,8]]},"121":{"position":[[218,8]]},"134":{"position":[[814,7],[860,7]]},"188":{"position":[[908,7],[1494,7],[1662,7]]},"194":{"position":[[1004,8]]},"236":{"position":[[528,7],[637,7],[682,7],[797,7],[848,7]]},"244":{"position":[[1065,7]]},"250":{"position":[[119,8]]},"269":{"position":[[224,8]]},"299":{"position":[[306,7]]},"322":{"position":[[488,8]]},"350":{"position":[[639,7]]},"359":{"position":[[16,7]]},"390":{"position":[[132,7]]},"392":{"position":[[412,7]]},"395":{"position":[[78,7],[111,7],[158,8],[307,7],[382,9],[422,7]]},"453":{"position":[[293,7],[343,8],[508,8]]},"566":{"position":[[161,7]]}}}],["version=v1.16.0/6ad9740",{"_index":2814,"t":{"479":{"position":[[379,24]]},"563":{"position":[[201,24]]}}}],["version=v1.21.0/ff35faa",{"_index":2379,"t":{"379":{"position":[[575,24]]},"477":{"position":[[130,24]]}}}],["version_codenam",{"_index":2685,"t":{"434":{"position":[[624,20]]}}}],["versu",{"_index":1704,"t":{"234":{"position":[[1413,6]]}}}],["vg/ubuntu",{"_index":2859,"t":{"484":{"position":[[532,9],[582,9],[627,9]]}}}],["via",{"_index":172,"t":{"16":{"position":[[1050,3],[1185,3],[2689,3],[3126,3]]},"42":{"position":[[121,3]]},"83":{"position":[[4275,3]]},"95":{"position":[[102,3]]},"101":{"position":[[165,3]]},"128":{"position":[[146,3]]},"168":{"position":[[140,3]]},"170":{"position":[[200,3]]},"172":{"position":[[581,3],[751,3]]},"190":{"position":[[488,3]]},"203":{"position":[[434,3]]},"224":{"position":[[1083,3]]},"240":{"position":[[1771,3],[2039,3]]},"244":{"position":[[332,3]]},"253":{"position":[[277,3]]},"320":{"position":[[4242,3]]},"326":{"position":[[127,3],[578,3]]},"328":{"position":[[158,3]]},"332":{"position":[[317,3],[1010,3],[1088,3]]},"334":{"position":[[675,3]]},"340":{"position":[[276,3]]},"348":{"position":[[583,3]]},"359":{"position":[[157,3]]},"381":{"position":[[241,3]]},"423":{"position":[[187,3]]},"498":{"position":[[375,3]]},"507":{"position":[[253,3]]},"536":{"position":[[70,3]]},"542":{"position":[[70,3]]},"555":{"position":[[53,3]]},"557":{"position":[[945,3]]},"559":{"position":[[1979,3]]}}}],["viabl",{"_index":2572,"t":{"383":{"position":[[2915,6]]}}}],["vice",{"_index":1209,"t":{"166":{"position":[[71,4]]}}}],["view",{"_index":34,"t":{"5":{"position":[[296,4]]},"205":{"position":[[163,4]]},"447":{"position":[[161,4]]},"455":{"position":[[694,4]]}}}],["viewer",{"_index":2235,"t":{"334":{"position":[[1017,6]]}}}],["virgil",{"_index":2092,"t":{"283":{"position":[[198,6]]}}}],["virtual",{"_index":1139,"t":{"146":{"position":[[26,7]]},"194":{"position":[[833,7]]},"199":{"position":[[574,7]]},"201":{"position":[[561,7]]}}}],["visual",{"_index":1068,"t":{"128":{"position":[[225,8],[297,6]]}}}],["vital",{"_index":2304,"t":{"350":{"position":[[1436,5]]}}}],["vitalik",{"_index":1966,"t":{"275":{"position":[[353,7]]},"283":{"position":[[178,7]]}}}],["vitalik'",{"_index":2475,"t":{"381":{"position":[[286,9]]}}}],["vite",{"_index":1930,"t":{"269":{"position":[[112,5]]}}}],["vitest",{"_index":373,"t":{"52":{"position":[[30,6]]},"103":{"position":[[7,8],[595,7],[642,6],[682,6]]},"105":{"position":[[619,6]]},"140":{"position":[[660,6]]}}}],["vitest'",{"_index":856,"t":{"105":{"position":[[271,8],[406,8]]}}}],["vitest.spec.config.t",{"_index":866,"t":{"105":{"position":[[650,21]]}}}],["vm",{"_index":1428,"t":{"199":{"position":[[131,2]]},"201":{"position":[[845,2]]},"226":{"position":[[402,2]]}}}],["volum",{"_index":2664,"t":{"431":{"position":[[483,7]]},"471":{"position":[[69,8]]},"484":{"position":[[477,6]]}}}],["voluntari",{"_index":2930,"t":{"511":{"position":[[185,9]]},"536":{"position":[[11,9]]},"538":{"position":[[10,9],[91,9],[150,9],[275,9]]},"540":{"position":[[104,9]]}}}],["vote",{"_index":1311,"t":{"176":{"position":[[2394,5],[2473,5],[2554,5]]},"277":{"position":[[518,6],[710,6]]},"363":{"position":[[1723,6],[1812,6]]}}}],["vs",{"_index":831,"t":{"101":{"position":[[157,2]]},"105":{"position":[[132,2]]},"184":{"position":[[183,2],[294,2]]},"186":{"position":[[394,2]]},"559":{"position":[[138,3]]}}}],["vscode/launch.json",{"_index":1322,"t":{"184":{"position":[[99,19]]}}}],["vulner",{"_index":2993,"t":{"568":{"position":[[16,13],[117,14],[181,13]]}}}],["wagyu",{"_index":2957,"t":{"553":{"position":[[229,5]]}}}],["wait",{"_index":1736,"t":{"238":{"position":[[299,4]]},"240":{"position":[[1017,4],[1830,4]]},"267":{"position":[[919,4]]},"455":{"position":[[467,4]]},"471":{"position":[[979,5],[1158,4]]}}}],["walk",{"_index":1424,"t":{"197":{"position":[[59,4]]},"226":{"position":[[281,7],[442,5],[627,6]]}}}],["wallet",{"_index":2323,"t":{"363":{"position":[[209,6]]}}}],["want",{"_index":177,"t":{"16":{"position":[[1118,4]]},"109":{"position":[[324,8]]},"119":{"position":[[1281,4]]},"192":{"position":[[562,4]]},"224":{"position":[[43,4]]},"238":{"position":[[502,4]]},"269":{"position":[[7,4]]},"295":{"position":[[1013,4],[1115,4]]},"443":{"position":[[698,4]]},"445":{"position":[[443,4]]},"449":{"position":[[50,4]]},"451":{"position":[[102,4],[359,4]]},"463":{"position":[[7,4]]},"465":{"position":[[17,4]]},"467":{"position":[[180,4],[323,4]]},"471":{"position":[[393,4],[505,4],[1326,4]]}}}],["warn",{"_index":514,"t":{"83":{"position":[[2316,7],[2569,7]]},"124":{"position":[[302,5]]},"199":{"position":[[94,7]]},"240":{"position":[[555,7],[601,8],[755,7]]},"289":{"position":[[755,7],[1008,7]]},"320":{"position":[[2316,7],[2569,7]]},"379":{"position":[[3887,7]]},"381":{"position":[[1410,7]]},"387":{"position":[[1604,7],[1857,7]]},"423":{"position":[[1223,7]]},"439":{"position":[[440,8]]},"443":{"position":[[0,7]]},"453":{"position":[[416,7]]},"467":{"position":[[0,7]]},"469":{"position":[[1590,7]]},"503":{"position":[[0,7]]},"516":{"position":[[755,7],[1008,7]]},"553":{"position":[[298,7]]},"555":{"position":[[1704,7]]}}}],["warrant",{"_index":2865,"t":{"488":{"position":[[125,7]]}}}],["warranti",{"_index":2868,"t":{"488":{"position":[[303,8],[434,10],[468,10]]}}}],["way",{"_index":1161,"t":{"154":{"position":[[157,3],[633,3]]},"168":{"position":[[183,3]]},"184":{"position":[[13,3]]},"190":{"position":[[110,3]]},"197":{"position":[[193,5]]},"226":{"position":[[528,4]]},"232":{"position":[[59,3]]},"234":{"position":[[1259,3],[1304,3]]},"244":{"position":[[205,3]]},"253":{"position":[[254,3]]},"257":{"position":[[361,3]]},"295":{"position":[[40,5]]},"359":{"position":[[420,4]]},"490":{"position":[[158,3]]}}}],["we'r",{"_index":958,"t":{"117":{"position":[[0,5],[132,5]]}}}],["weak",{"_index":461,"t":{"83":{"position":[[824,4],[1062,4],[1195,4],[1369,4],[1562,4],[1626,4]]},"320":{"position":[[824,4],[1062,4],[1195,4],[1369,4],[1562,4],[1626,4]]},"350":{"position":[[0,4],[689,4],[889,5],[1278,4]]},"381":{"position":[[121,4],[262,4],[325,4],[2123,4]]},"455":{"position":[[264,4]]}}}],["web",{"_index":1065,"t":{"128":{"position":[[154,3]]},"269":{"position":[[1097,3]]},"332":{"position":[[650,3]]}}}],["web3",{"_index":364,"t":{"48":{"position":[[22,4]]},"295":{"position":[[51,4],[125,4],[135,7],[546,4],[1544,4],[1554,7],[1988,4]]},"297":{"position":[[46,4]]}}}],["web3(provid",{"_index":2110,"t":{"295":{"position":[[557,15],[1999,15]]}}}],["web3.eth.getbalance(address",{"_index":2112,"t":{"295":{"position":[[657,28],[2099,28]]}}}],["web3.j",{"_index":2123,"t":{"297":{"position":[[208,8]]}}}],["web3.providers.httpprovider(\"https://lodestar",{"_index":2104,"t":{"295":{"position":[[247,45],[1666,45]]}}}],["web3sign",{"_index":2906,"t":{"498":{"position":[[61,11]]}}}],["webpack",{"_index":1929,"t":{"269":{"position":[[103,8]]}}}],["websit",{"_index":1887,"t":{"261":{"position":[[450,8]]}}}],["week",{"_index":2076,"t":{"281":{"position":[[2157,5]]},"365":{"position":[[172,4]]}}}],["weekli",{"_index":1106,"t":{"136":{"position":[[49,6]]}}}],["welcom",{"_index":2098,"t":{"291":{"position":[[0,8]]}}}],["well",{"_index":305,"t":{"32":{"position":[[228,5]]},"119":{"position":[[261,6]]},"188":{"position":[[349,4]]},"226":{"position":[[732,4]]},"244":{"position":[[116,4],[161,5]]},"361":{"position":[[276,4]]},"553":{"position":[[373,4]]}}}],["went",{"_index":1970,"t":{"275":{"position":[[423,4]]}}}],["wherebi",{"_index":2020,"t":{"281":{"position":[[85,7]]}}}],["whether",{"_index":493,"t":{"83":{"position":[[1833,7],[4112,7]]},"320":{"position":[[1833,7],[4065,7]]},"383":{"position":[[3349,7]]},"387":{"position":[[1157,7]]},"488":{"position":[[945,7]]}}}],["whichev",{"_index":1712,"t":{"236":{"position":[[518,9]]}}}],["white",{"_index":996,"t":{"119":{"position":[[1385,5]]}}}],["whole",{"_index":30,"t":{"5":{"position":[[255,5]]},"148":{"position":[[119,5]]},"188":{"position":[[142,5]]},"203":{"position":[[546,5]]},"226":{"position":[[613,5]]},"263":{"position":[[71,5]]},"309":{"position":[[71,5]]}}}],["wide",{"_index":1878,"t":{"257":{"position":[[1134,4]]},"281":{"position":[[354,4]]}}}],["wild",{"_index":1165,"t":{"154":{"position":[[230,5]]}}}],["window",{"_index":616,"t":{"83":{"position":[[5810,6]]},"230":{"position":[[433,6]]},"269":{"position":[[533,7]]},"320":{"position":[[5685,6]]}}}],["window.addeventlistener(\"domcontentload",{"_index":1941,"t":{"269":{"position":[[901,43]]}}}],["window.ethereum",{"_index":2118,"t":{"295":{"position":[[1390,16]]}}}],["window.lodestar.lightcli",{"_index":1938,"t":{"269":{"position":[[571,28],[1020,27]]}}}],["window.lodestar.lightclient.transport",{"_index":1939,"t":{"269":{"position":[[667,38]]}}}],["wip",{"_index":560,"t":{"83":{"position":[[3690,5]]},"516":{"position":[[2470,5]]}}}],["wire",{"_index":743,"t":{"83":{"position":[[10738,4],[10882,4]]},"516":{"position":[[4300,4],[4444,4]]}}}],["wish",{"_index":2768,"t":{"467":{"position":[[704,4]]}}}],["withdraw",{"_index":2949,"t":{"546":{"position":[[107,10],[141,11],[203,11]]}}}],["withdrawn",{"_index":2951,"t":{"546":{"position":[[357,10]]}}}],["within",{"_index":475,"t":{"83":{"position":[[1362,6]]},"115":{"position":[[839,6]]},"176":{"position":[[1483,6]]},"224":{"position":[[962,6]]},"320":{"position":[[1362,6]]},"350":{"position":[[937,6]]},"357":{"position":[[35,6],[228,6]]},"381":{"position":[[695,6],[2112,6]]},"437":{"position":[[42,6]]},"455":{"position":[[332,6]]},"463":{"position":[[926,6]]},"465":{"position":[[2036,6]]}}}],["withmevboost",{"_index":2780,"t":{"469":{"position":[[1293,12]]},"471":{"position":[[1937,12]]}}}],["without",{"_index":204,"t":{"16":{"position":[[1657,7]]},"105":{"position":[[62,7]]},"128":{"position":[[182,7]]},"192":{"position":[[673,7]]},"216":{"position":[[357,7]]},"234":{"position":[[977,7],[1048,7]]},"240":{"position":[[179,7],[2378,7],[2873,7]]},"257":{"position":[[735,7]]},"299":{"position":[[58,7]]},"338":{"position":[[458,7]]},"350":{"position":[[1199,7]]},"353":{"position":[[96,7]]},"488":{"position":[[295,7],[361,7]]},"498":{"position":[[191,7]]},"559":{"position":[[2565,7]]}}}],["withstand",{"_index":2035,"t":{"281":{"position":[[562,9]]}}}],["withtermin",{"_index":2775,"t":{"469":{"position":[[366,12]]},"471":{"position":[[795,12]]}}}],["withvalidatorkeystor",{"_index":2779,"t":{"469":{"position":[[1246,21],[1532,21],[2019,21]]},"471":{"position":[[1354,21],[1499,21]]}}}],["withvalidatormnemon",{"_index":2778,"t":{"469":{"position":[[956,21]]},"471":{"position":[[1455,22],[1707,21],[1786,21]]}}}],["wood",{"_index":2089,"t":{"283":{"position":[[101,4]]}}}],["word",{"_index":1085,"t":{"132":{"position":[[375,4],[444,5],[486,4]]}}}],["work",{"_index":125,"t":{"16":{"position":[[249,5]]},"40":{"position":[[290,6]]},"144":{"position":[[138,4]]},"148":{"position":[[125,5]]},"150":{"position":[[175,4]]},"154":{"position":[[302,4],[390,4],[672,8],[1290,5]]},"162":{"position":[[78,7]]},"188":{"position":[[1693,4]]},"190":{"position":[[376,4]]},"192":{"position":[[422,5]]},"194":{"position":[[666,7]]},"228":{"position":[[1396,7]]},"232":{"position":[[1485,7]]},"240":{"position":[[2696,7],[2782,4]]},"244":{"position":[[150,5],[275,6],[481,7]]},"275":{"position":[[558,7]]},"277":{"position":[[86,4]]},"328":{"position":[[279,4]]},"350":{"position":[[198,4],[473,4]]},"363":{"position":[[140,4]]},"434":{"position":[[1135,7]]}}}],["workaround",{"_index":1376,"t":{"190":{"position":[[458,10]]},"244":{"position":[[1149,10]]},"269":{"position":[[1282,10]]}}}],["worker",{"_index":357,"t":{"44":{"position":[[88,6]]},"184":{"position":[[321,7]]},"186":{"position":[[211,7],[296,6]]},"332":{"position":[[1239,8]]},"334":{"position":[[795,6]]},"379":{"position":[[997,6],[1299,6],[1355,6],[1471,6]]},"477":{"position":[[552,6],[854,6],[910,6],[1026,6]]}}}],["workspac",{"_index":1203,"t":{"160":{"position":[[363,9]]},"162":{"position":[[104,9]]},"166":{"position":[[118,9]]}}}],["world",{"_index":1610,"t":{"226":{"position":[[259,5]]},"322":{"position":[[589,5]]},"326":{"position":[[572,5]]},"434":{"position":[[1031,5]]}}}],["worth",{"_index":1789,"t":{"244":{"position":[[121,5]]}}}],["wrapper",{"_index":394,"t":{"64":{"position":[[38,7]]},"224":{"position":[[1135,8]]}}}],["write",{"_index":314,"t":{"36":{"position":[[109,5]]},"190":{"position":[[551,7]]},"228":{"position":[[265,6]]},"244":{"position":[[15,7]]},"484":{"position":[[222,5]]}}}],["written",{"_index":941,"t":{"115":{"position":[[265,7]]},"228":{"position":[[1305,8],[1373,7]]},"240":{"position":[[1623,7]]},"503":{"position":[[216,7]]}}}],["wrong",{"_index":842,"t":{"103":{"position":[[234,5]]},"121":{"position":[[881,6]]},"381":{"position":[[1497,5]]}}}],["wscheckpoint",{"_index":2109,"t":{"295":{"position":[[500,13],[1919,13]]}}}],["wsscheckpoint",{"_index":464,"t":{"83":{"position":[[895,13],[1001,14]]},"320":{"position":[[895,13],[1001,14]]},"361":{"position":[[891,13]]},"381":{"position":[[1128,13],[1274,14],[1598,13]]}}}],["x",{"_index":1464,"t":{"201":{"position":[[1126,1],[1181,1]]},"228":{"position":[[1487,1]]},"441":{"position":[[150,1]]},"443":{"position":[[734,1]]},"445":{"position":[[557,1]]},"455":{"position":[[1151,1]]},"457":{"position":[[615,1]]},"461":{"position":[[445,1]]},"465":{"position":[[1223,1]]},"467":{"position":[[1207,1]]}}}],["x.json",{"_index":2742,"t":{"463":{"position":[[612,7],[710,6]]},"465":{"position":[[1680,7],[1778,6]]}}}],["x64",{"_index":2630,"t":{"423":{"position":[[695,3]]}}}],["x86_64",{"_index":1411,"t":{"194":{"position":[[364,8]]}}}],["xarg",{"_index":1745,"t":{"238":{"position":[[678,5]]},"240":{"position":[[2676,5]]}}}],["xcode",{"_index":1371,"t":{"190":{"position":[[240,5]]}}}],["xdg_data_home/lodestar/$network_nam",{"_index":2464,"t":{"379":{"position":[[3563,38]]}}}],["xr",{"_index":1469,"t":{"201":{"position":[[1178,2]]}}}],["xxxx",{"_index":2591,"t":{"392":{"position":[[420,5],[432,5]]}}}],["xxxxx.json",{"_index":2748,"t":{"463":{"position":[[1078,10]]},"465":{"position":[[2188,10]]}}}],["y",{"_index":1710,"t":{"236":{"position":[[319,1]]},"240":{"position":[[1210,1]]},"242":{"position":[[104,1]]},"434":{"position":[[826,1]]},"441":{"position":[[157,1]]},"443":{"position":[[741,1]]},"445":{"position":[[564,1]]},"455":{"position":[[1158,1]]},"457":{"position":[[622,1]]},"461":{"position":[[452,1]]},"465":{"position":[[1230,1]]},"467":{"position":[[1214,1]]}}}],["yaml",{"_index":447,"t":{"83":{"position":[[370,6],[9038,4]]},"289":{"position":[[370,6]]},"320":{"position":[[370,6]]},"387":{"position":[[370,6]]},"503":{"position":[[227,4]]},"507":{"position":[[54,4]]},"516":{"position":[[370,6],[2107,4]]}}}],["yamux",{"_index":416,"t":{"72":{"position":[[21,5],[73,5]]},"573":{"position":[[143,5]]}}}],["yarn",{"_index":774,"t":{"89":{"position":[[74,4]]},"93":{"position":[[18,4]]},"97":{"position":[[48,4],[84,4]]},"99":{"position":[[21,4],[59,4],[102,4],[140,4],[175,4],[226,4],[465,4],[505,4]]},"103":{"position":[[677,4]]},"105":{"position":[[614,4]]},"113":{"position":[[225,5],[240,4]]},"119":{"position":[[444,4],[944,4],[1031,4]]},"132":{"position":[[172,4],[241,4]]},"160":{"position":[[358,4]]},"162":{"position":[[99,4]]},"166":{"position":[[113,4]]},"207":{"position":[[274,4]]},"209":{"position":[[56,4]]},"236":{"position":[[1218,4],[1232,4],[1275,4]]},"305":{"position":[[13,4]]},"395":{"position":[[18,4]]},"399":{"position":[[123,4]]},"401":{"position":[[27,4]]},"405":{"position":[[92,5]]}}}],["ye",{"_index":2945,"t":{"540":{"position":[[244,4]]}}}],["year",{"_index":2351,"t":{"365":{"position":[[249,5],[284,5]]}}}],["yml",{"_index":446,"t":{"83":{"position":[[364,5]]},"289":{"position":[[364,5]]},"320":{"position":[[364,5]]},"387":{"position":[[364,5]]},"516":{"position":[[364,5]]}}}],["you'r",{"_index":901,"t":{"113":{"position":[[10,6],[288,6]]},"467":{"position":[[56,6]]}}}],["you'v",{"_index":904,"t":{"113":{"position":[[158,6]]},"467":{"position":[[907,6]]},"469":{"position":[[544,6]]}}}],["young",{"_index":2465,"t":{"379":{"position":[[3604,5]]}}}],["your/home/directory/.nvm/versions/node/v20.10.0/bin/node_debug",{"_index":1720,"t":{"236":{"position":[[1060,63]]}}}],["yourself",{"_index":1056,"t":{"126":{"position":[[466,8]]}}}],["zero",{"_index":524,"t":{"83":{"position":[[2728,6]]},"289":{"position":[[1167,6]]},"320":{"position":[[2728,6]]},"387":{"position":[[2016,6]]},"409":{"position":[[205,4]]},"516":{"position":[[1167,6]]},"520":{"position":[[237,4]]},"524":{"position":[[237,4]]}}}],["zip",{"_index":2893,"t":{"494":{"position":[[89,4]]}}}],["zoom",{"_index":1545,"t":{"205":{"position":[[103,7]]}}}],["zsh",{"_index":1385,"t":{"190":{"position":[[714,3]]}}}],["zshrc",{"_index":1382,"t":{"190":{"position":[[638,8],[718,8]]}}}],["zstd",{"_index":1808,"t":{"244":{"position":[[1016,4]]}}}]],"pipeline":["stemmer"]}}] \ No newline at end of file diff --git a/search/index.html b/search/index.html index 13a4c128e8cc..be970d2fcdd3 100644 --- a/search/index.html +++ b/search/index.html @@ -4,10 +4,10 @@ Lodestar Documentation - - + + -

    Search the documentation

    +

    Search the documentation

    \ No newline at end of file diff --git a/security/index.html b/security/index.html index 94598e51f6b0..d0ffcc065348 100644 --- a/security/index.html +++ b/security/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Security Policy

    +

    Security Policy

    Supported Versions

    • Lodestar currently undergoes a quick release cycle with regular minor releases published roughly fortnightly.
    • @@ -18,6 +18,6 @@

      Re
      • 🚨 Please, send vulnerability reports to security@chainsafe.io.
      • ⚠️ Please do not file a public ticket mentioning the vulnerability, as doing so could increase the likelihood of the vulnerability being used before a fix has been created, released and installed on the network.
      • -

    +
    \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 7fc58a9c2aa7..be14b3faf4c2 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://chainsafe.github.io/lodestar/searchweekly0.5https://chainsafe.github.io/lodestar/weekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/block-explorationweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/doppelganger-detectionweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/migrating-from-other-clientsweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnetweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/slashing-protectionweekly0.5https://chainsafe.github.io/lodestar/contribution/bug-reportsweekly0.5https://chainsafe.github.io/lodestar/contribution/depgraphweekly0.5https://chainsafe.github.io/lodestar/contribution/dev-cliweekly0.5https://chainsafe.github.io/lodestar/contribution/getting-startedweekly0.5https://chainsafe.github.io/lodestar/contribution/pr-submissionweekly0.5https://chainsafe.github.io/lodestar/contribution/repoweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/weekly0.5https://chainsafe.github.io/lodestar/contribution/testing/end-to-end-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/integration-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/performance-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/simulation-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/spec-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/unit-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/core-dumpsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/debuggingweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/flamegraphsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/heap-dumpsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/perfweekly0.5https://chainsafe.github.io/lodestar/faqsweekly0.5https://chainsafe.github.io/lodestar/introductionweekly0.5https://chainsafe.github.io/lodestar/libraries/api/using-the-apiweekly0.5https://chainsafe.github.io/lodestar/libraries/lightclient-prover/lightclientweekly0.5https://chainsafe.github.io/lodestar/libraries/lightclient-prover/lightclient-cliweekly0.5https://chainsafe.github.io/lodestar/libraries/lightclient-prover/proverweekly0.5https://chainsafe.github.io/lodestar/reference/cliweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/beacon-cliweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/data-retentionweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/mev-and-builder-integrationweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/networkingweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/starting-a-nodeweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/syncingweekly0.5https://chainsafe.github.io/lodestar/run/bootnode/bootnode-cliweekly0.5https://chainsafe.github.io/lodestar/run/getting-started/installationweekly0.5https://chainsafe.github.io/lodestar/run/getting-started/quick-startweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/client-monitoringweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/dashboardsweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/log-managementweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/metrics-managementweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/prometheus-grafanaweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/external-signerweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/key-managementweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/multiple-and-fallback-validationweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/validator-cliweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/vc-configurationweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/withdrawalsweekly0.5https://chainsafe.github.io/lodestar/securityweekly0.5https://chainsafe.github.io/lodestar/supporting-libraries/weekly0.5https://chainsafe.github.io/lodestar/supporting-libraries/librariesweekly0.5https://chainsafe.github.io/lodestar/trouble-shootingweekly0.5 \ No newline at end of file +https://chainsafe.github.io/lodestar/searchweekly0.5https://chainsafe.github.io/lodestar/weekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/block-explorationweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/doppelganger-detectionweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/migrating-from-other-clientsweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnetweekly0.5https://chainsafe.github.io/lodestar/contribution/advanced-topics/slashing-protectionweekly0.5https://chainsafe.github.io/lodestar/contribution/bug-reportsweekly0.5https://chainsafe.github.io/lodestar/contribution/depgraphweekly0.5https://chainsafe.github.io/lodestar/contribution/dev-cliweekly0.5https://chainsafe.github.io/lodestar/contribution/getting-startedweekly0.5https://chainsafe.github.io/lodestar/contribution/pr-submissionweekly0.5https://chainsafe.github.io/lodestar/contribution/repoweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/weekly0.5https://chainsafe.github.io/lodestar/contribution/testing/end-to-end-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/integration-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/performance-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/simulation-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/spec-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/testing/unit-testsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/core-dumpsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/debuggingweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/flamegraphsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/heap-dumpsweekly0.5https://chainsafe.github.io/lodestar/contribution/tools/perfweekly0.5https://chainsafe.github.io/lodestar/faqsweekly0.5https://chainsafe.github.io/lodestar/introductionweekly0.5https://chainsafe.github.io/lodestar/libraries/api/using-the-apiweekly0.5https://chainsafe.github.io/lodestar/libraries/lightclient-prover/lightclientweekly0.5https://chainsafe.github.io/lodestar/libraries/lightclient-prover/lightclient-cliweekly0.5https://chainsafe.github.io/lodestar/libraries/lightclient-prover/proverweekly0.5https://chainsafe.github.io/lodestar/reference/cliweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/beacon-cliweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/data-retentionweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/mev-and-builder-integrationweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/networkingweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/starting-a-nodeweekly0.5https://chainsafe.github.io/lodestar/run/beacon-management/syncingweekly0.5https://chainsafe.github.io/lodestar/run/bootnode/bootnode-cliweekly0.5https://chainsafe.github.io/lodestar/run/getting-started/installationweekly0.5https://chainsafe.github.io/lodestar/run/getting-started/quick-startweekly0.5https://chainsafe.github.io/lodestar/run/getting-started/quick-start-custom-guideweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/client-monitoringweekly0.5https://chainsafe.github.io/lodestar/run/logging-and-metrics/prometheus-grafanaweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/external-signerweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/key-managementweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/multiple-and-fallback-validationweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/proposer-configweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/validator-cliweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/vc-configurationweekly0.5https://chainsafe.github.io/lodestar/run/validator-management/withdrawalsweekly0.5https://chainsafe.github.io/lodestar/securityweekly0.5https://chainsafe.github.io/lodestar/supporting-libraries/weekly0.5https://chainsafe.github.io/lodestar/supporting-libraries/librariesweekly0.5 \ No newline at end of file diff --git a/supporting-libraries/index.html b/supporting-libraries/index.html index f12852dd6348..bd2c9e12a758 100644 --- a/supporting-libraries/index.html +++ b/supporting-libraries/index.html @@ -4,11 +4,11 @@ Lodestar Documentation - - + + -

    Supporting Libraries

    + +
    \ No newline at end of file diff --git a/supporting-libraries/libraries/index.html b/supporting-libraries/libraries/index.html index 680aefab385f..88773b4887e7 100644 --- a/supporting-libraries/libraries/index.html +++ b/supporting-libraries/libraries/index.html @@ -3,18 +3,18 @@ -Lodestar Documentation - - +Lodestar Documentation + +

    Lodestar libraries

    -

    The Lodestar project is divided into Typescript packages that can be used independently of the CLI. These packages span the breadth of the Ethereum Consensus layer, and are perfect for Typescript developers looking to build around Ethereum.

    +

    The Lodestar project is divided into TypeScript packages that can be used independently of the CLI. These packages span the breadth of the Ethereum Consensus layer, and are perfect for TypeScript developers looking to build around Ethereum.

    Monorepo libraries

    Several useful Ethereum consensus libraries are developed as part of the Lodestar monorepo and may be useful when used individually.

    • params - Ethereum consensus constants and fork names
    • -
    • types - Ethereum consensus types, Typescript interfaces and SSZ type objects
    • +
    • types - Ethereum consensus types, TypeScript interfaces and SSZ type objects
    • config - Ethereum consensus run-time network configuration
    • api - Ethereum consensus REST API client
    • flare - Beacon chain multi-purpose and debugging tool
    • @@ -40,6 +40,6 @@

      Networkingdiscv5 - Discv5 protocol
    • js-libp2p-gossipsub - Gossipsub protocol for js-libp2p
    • js-libp2p-noise - Noise handshake for js-libp2p
    • -

    + \ No newline at end of file diff --git a/trouble-shooting/index.html b/trouble-shooting/index.html deleted file mode 100644 index 96d27ebaf40f..000000000000 --- a/trouble-shooting/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -Lodestar Documentation - - - - -
    - - \ No newline at end of file