PageSourceSearch

https://docs.venom.foundation/assets/js/7ae0ed82.135658dd.js

js venom.foundation collected 2026-09-24 09:12:33 UTC 14,564 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkve_ps=self.webpackChunkve_ps||[]).push([[4379],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),d=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=d(e.components);return a.createElement(s.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=d(n),m=o,k=p["".concat(s,".").concat(m)]||p[m]||c[m]||r;return n?a.createElement(k,i(i({ref:t},u),{},{components:n})):a.createElement(k,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var d=2;d<r;d++)i[d]=n[d];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},8145:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var a=n(7462),o=(n(7294),n(4137));const r={},i="How to run a Venom validator node",l={unversionedId:"start/maintain/how-to-become-a-validator",id:"start/maintain/how-to-become-a-validator",title:"How to run a Venom validator node",description:"Precautions",source:"@site/docs/start/maintain/how-to-become-a-validator.md",sourceDirName:"start/maintain",slug:"/start/maintain/how-to-become-a-validator",permalink:"/start/maintain/how-to-become-a-validator",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Network Maintainers",permalink:"/maintain/network-maintainers"}},s={},d=[{value:"Precautions",id:"precautions",level:2},{value:"Caution",id:"caution",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Stake",id:"stake",level:3},{value:"Node hardware minimums",id:"node-hardware-minimums",level:3},{value:"Cloud providers",id:"cloud-providers",level:3},{value:"Node setup",id:"node-setup",level:3}],u={toc:d};function c(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"how-to-run-a-venom-validator-node"},"How to run a Venom validator node"),(0,o.kt)("h2",{id:"precautions"},"Precautions"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},'The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",\n"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be\ninterpreted as described in RFC 2119.')),(0,o.kt)("h2",{id:"caution"},"Caution"),(0,o.kt)("p",null,"Running a Validator node makes you responsible for your entire stake. If something goes wrong, the node could be slashed, and you can lose your stake."),(0,o.kt)("p",null,"You SHOULD have enough Linux engineering skills to manage, secure, and maintain nodes. Running a Validator node is considerably more advanced than executing a validator binary."),(0,o.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,o.kt)("h3",{id:"stake"},"Stake"),(0,o.kt)("p",null,"To operate a Validator node, a sufficient quantity of Venom tokens is required. The node can be deployed in either validator or DePool mode."),(0,o.kt)("h3",{id:"node-hardware-minimums"},"Node hardware minimums"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"CPU"),": 12x cores Intel Skylake or a newer CPU. The higher base CPU frequency is preferred over a core count;"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"RAM"),": 64GB;\nNetwork: 300Mbps with a reliable internet connection. Connection issues can\npotentially cause slashing of your Validator;"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Storage"),":"),(0,o.kt)("p",null,"50GB SSD storage for the operating system; 500GB of NVMe for Validator internal database, with the ability to add additional space to allow for the the growth of the blockchain;"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Operating system"),": Ubuntu 22.04"),(0,o.kt)("p",null,"These specs are not a hard requirement, but rather a best practice. Because running a validator node is a consequential task, you should consider using enterprise-grade hardware, to ensure the stability of your node."),(0,o.kt)("h3",{id:"cloud-providers"},"Cloud providers"),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},'Beware of the Terms and conditions of the cloud provider of your choice. DigitalOcean\u2019s Acceptable User Policy requires implicit permission to undertake "mining of cryptocurrencies" and this may be extended to other cryptocurrency activities.')),(0,o.kt)("p",null,"Successfully tested Cloud Providers:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Google Cloud"),(0,o.kt)("li",{parentName:"ul"},"Amazon AWS"),(0,o.kt)("li",{parentName:"ul"},"Microsoft Azure"),(0,o.kt)("li",{parentName:"ul"},"OVH")),(0,o.kt)("p",null,"To make your node work properly, configure the cloud firewall to accept\nincoming traffic on UDP/30000 port"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"}
1,"The node will consume approximately 6TB of incoming traffic each month. You should consider this when estimating the costs of your setup.")),(0,o.kt)("h3",{id:"node-setup"},"Node setup"),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Always check any scripts you are running")),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Prepare the server for node setup")),(0,o.kt)("p",null,"1.1. Create a user and group for running the Validator node, and create all necessary folder structures"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'VALIDATOR_USER="validator"\nVALIDATOR_GROUP="validator"\nsudo groupadd $VALIDATOR_GROUP\nsudo useradd $VALIDATOR_USER -m -s /bin/bash -g $VALIDATOR_GROUP -G sudo\n# Mount \nsudo mkdir -p /var/venom/rnode/\nsudo chown $VALIDATOR_USER:$VALIDATOR_GROUP /var/venom/rnode/\n')),(0,o.kt)("p",null,"1.2. Check if the NTP service is UP and running"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"systemctl status systemd-timesyncd\n")),(0,o.kt)("p",null,"Your system should show that the service is up and running. If not - please refer to the documentation"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"\u25cf systemd-timesyncd.service - Network Time Synchronization\n     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; \n     preset: enabled)\n     Active: active (running) \n")),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"If the system clock is out of sync (even by a small amount), the blocks which the Validator produces, may not be accepted by the network.")),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},"Create firewall rules to allow ADNL communications")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo ufw allow 30000/UDP\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Install dependencies")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt update \nsudo apt install -y git libssl-dev pkg-config build-essential libzstd-dev \nlibclang-dev libgoogle-perftools-dev\n")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Switch to the validator user")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo su validator\n")),(0,o.kt)("p",null,"4.1 Install rust"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},'\ncurl https://sh.rustup.rs -sSf | sh\nsource "$HOME/.cargo/env"\n')),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Build a Validator node")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"\ncargo install --locked --git https://github.com/venom-blockchain/stvenom-node-tools\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"# Enable validator services\nsudo $PWD/.cargo/bin/stvenom init systemd\n")),(0,o.kt)("p",null,"Here choose the user for the validator. DON'T RUN Validator service as a root user!"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"[0/2] Preparing services\n? Select the user from which the service will work \u203a\n\u276f validator\n  root\n")),(0,o.kt)("ol",{start:6},(0,o.kt)("li",{parentName:"ol"},"Setup Validator and create wallets\nCompile and init node")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"stvenom init\n")),(0,o.kt)("p",null,'Choose "other" network'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"[0/2] Preparing configs\n\u2714 Create root directory? (/home/validator/.stvenom) \xb7 yes\n? Select network \u203a\n  Venom mainnet\n  Venom testnet\n\u276f other\n")),(0,o.kt)("p",null,"Provide global config URL (Contact Venom core team)"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"\u2714 Select network \xb7 other\n? Config URL \u203a\n")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"[0/2] Preparing configs\n\u2714 Create root directory? (/home/validator/.stvenom) \xb7 yes\n\u2714 Select network \xb7 other\n\u2714 Config URL \xb7<hidden>\n\u2714 Node config doesn't have control server entry. Create? \xb7 yes\n\u2714 Control server listen address \xb7 localhost\n\u2714 Specify control port \xb7 31000\n\u2714 Enter public ip \xb7 164.92.106.127\n\u2714 Specify server ADNL port \xb7 30000\n\u2714 Specify node DB path \xb7 /var/venom/rnode\n[1/2] Preparing binary\n")),(0,o.kt)("p",null,"The node would be compiled, Select the mode of your node:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"? Select validator type \u203a\n\u276f Single\n  DePool\n")),(0,o.kt)("p",null,"Create a new seed phrase or import existing"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"[0/2] Creating validator wallet\n\u276f Generate new keys\n  Import seed\n")),(0,o.kt)("p",null,"6.1 Define the desired stake per round. Notice you will need an amount of\ntokens 2*(stake per round)+10"),(0,o.kt)("p",null,'Leave "stake factor (ratio between maximum available stake on the network and\nyour stake) to 3 as it is standard in the Venom network'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"\u2714 Stake per round (VENOM) \xb7 10000\n\u2714 Stake factor \xb7 3\n[2/2] Validator configured successfully. Great!\n\nValidator wallet address:\n\n\nRequired validator wallet balance: 20010 VENOM\n  \u2022 10 VENOM, maintenance balance\n  \u2022 2 x 20010 VENOM, stakes for each round\n\nMake sure you back up your keys:\n/home/validator/.stvenom/keys/vld.keys.json\n")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Make sure you back up your keys after the initial configuration!\nAll keys are stored at $HOME/.stvenom/keys/")),(0,o.kt)("p",null,"Init validator services"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo ~/.cargo/bin/stvenom init systemd\n")),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Service MUST NOT run as the root user")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"[0/2] Preparing services\n? Select the user from which the service will work \u203a\n\u276f validator\n  root\n")),(0,o.kt)("p",null,"It will create two services:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"venom-validator-manager - control service that takes part in elections,\nrecovers stake and performs other tasks with the Elector contract"),(0,o.kt)("li",{parentName:"ul"},"venom-validator - node itself, managing validation process")),(0,o.kt)("p",null,"You can check the status of both services with the following commands:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"service venom-validator status\nservice venom-validator-manager status\n")),(0,o.kt)("ol",{start:7},(0,o.kt)("li",{parentName:"ol"},"Transfer tokens to the Validator contract")),(0,o.kt)("p",null,"Transfer the required amount of tokens to the address generated in the previous\nstep. The Wallet will become active after the first stake"),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Wait until the elections start")),(0,o.kt)("p",null,"When elections start, the venom-validator-manager process will automatically stake the desired amount of tokens. You can check the current state of elections using ",(0,o.kt)("a",{parentName:"p",href:"https://venomscan.com/validators"},"Venomscan.com"),"."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},'venom-validator-manager adds 1 VENOM token for the stake to pay for the transaction fees, and you will be required to add 1 VENOM token to the "stake and bonuses recovery" transaction. Due to this, it is adviseable to always keep some additional tokens in the Validator')),(0,o.kt)("p",null,"If everything has been setup correctly - you should see your address in the validators list for the next round."))}c.isMDXComponent=!0}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.